@@ -19,7 +19,8 @@ const {
1919 isNotOpeningBraceToken,
2020 isOpeningBracketToken,
2121 isClosingBracketToken,
22- isSemicolonToken
22+ isSemicolonToken,
23+ isNotSemicolonToken
2324} = require ( 'eslint-utils' )
2425const {
2526 isComment,
@@ -1288,24 +1289,42 @@ module.exports.defineVisitor = function create(
12881289 } ,
12891290 /** @param {ExportAllDeclaration } node */
12901291 ExportAllDeclaration ( node ) {
1291- const tokens = tokenStore . getTokens ( node )
1292- const firstToken = /** @type { Token } */ ( tokens . shift ( ) )
1293- if ( isSemicolonToken ( tokens [ tokens . length - 1 ] ) ) {
1294- tokens . pop ( )
1295- }
1292+ const exportToken = tokenStore . getFirstToken ( node )
1293+ const tokens = [
1294+ ... tokenStore . getTokensBetween ( exportToken , node . source ) ,
1295+ tokenStore . getFirstToken ( node . source )
1296+ ]
12961297 if ( ! node . exported ) {
1297- setOffset ( tokens , 1 , firstToken )
1298+ setOffset ( tokens , 1 , exportToken )
12981299 } else {
12991300 // export * as foo from "mod"
13001301 const starToken = /** @type {Token } */ ( tokens . find ( isWildcard ) )
13011302 const asToken = tokenStore . getTokenAfter ( starToken )
13021303 const exportedToken = tokenStore . getTokenAfter ( asToken )
13031304 const afterTokens = tokens . slice ( tokens . indexOf ( exportedToken ) + 1 )
13041305
1305- setOffset ( starToken , 1 , firstToken )
1306+ setOffset ( starToken , 1 , exportToken )
13061307 setOffset ( asToken , 1 , starToken )
13071308 setOffset ( exportedToken , 1 , starToken )
1308- setOffset ( afterTokens , 1 , firstToken )
1309+ setOffset ( afterTokens , 1 , exportToken )
1310+ }
1311+
1312+ // assertions
1313+ const lastToken = /** @type {Token } */ (
1314+ tokenStore . getLastToken ( node , isNotSemicolonToken )
1315+ )
1316+ const assertionTokens = tokenStore . getTokensBetween (
1317+ node . source ,
1318+ lastToken
1319+ )
1320+ if ( assertionTokens . length ) {
1321+ const assertToken = /** @type {Token } */ ( assertionTokens . shift ( ) )
1322+ setOffset ( assertToken , 0 , exportToken )
1323+ const assertionOpen = assertionTokens . shift ( )
1324+ if ( assertionOpen ) {
1325+ setOffset ( assertionOpen , 1 , assertToken )
1326+ processNodeList ( assertionTokens , assertionOpen , lastToken , 1 )
1327+ }
13091328 }
13101329 } ,
13111330 /** @param {ExportDefaultDeclaration } node */
@@ -1328,28 +1347,66 @@ module.exports.defineVisitor = function create(
13281347 const firstSpecifier = node . specifiers [ 0 ]
13291348 if ( ! firstSpecifier || firstSpecifier . type === 'ExportSpecifier' ) {
13301349 // export {foo, bar}; or export {foo, bar} from "mod";
1331- const leftParenToken = tokenStore . getFirstToken ( node , 1 )
1332- const rightParenToken = /** @type {Token } */ (
1333- tokenStore . getLastToken ( node , isClosingBraceToken )
1350+ const leftBraceTokens = firstSpecifier
1351+ ? tokenStore . getTokensBetween ( exportToken , firstSpecifier )
1352+ : [ tokenStore . getTokenAfter ( exportToken ) ]
1353+ const rightBraceToken = /** @type {Token } */ (
1354+ node . source
1355+ ? tokenStore . getTokenBefore ( node . source , isClosingBraceToken )
1356+ : tokenStore . getLastToken ( node , isClosingBraceToken )
1357+ )
1358+ setOffset ( leftBraceTokens , 0 , exportToken )
1359+ processNodeList (
1360+ node . specifiers ,
1361+ /** @type {Token } */ ( last ( leftBraceTokens ) ) ,
1362+ rightBraceToken ,
1363+ 1
13341364 )
1335- setOffset ( leftParenToken , 0 , exportToken )
1336- processNodeList ( node . specifiers , leftParenToken , rightParenToken , 1 )
1337-
1338- const maybeFromToken = tokenStore . getTokenAfter ( rightParenToken )
1339- if ( maybeFromToken != null && maybeFromToken . value === 'from' ) {
1340- const fromToken = maybeFromToken
1341- const nameToken = tokenStore . getTokenAfter ( fromToken )
1342- setOffset ( [ fromToken , nameToken ] , 1 , exportToken )
1365+
1366+ if ( node . source ) {
1367+ const tokens = tokenStore . getTokensBetween (
1368+ rightBraceToken ,
1369+ node . source
1370+ )
1371+ setOffset (
1372+ [ ...tokens , sourceCode . getFirstToken ( node . source ) ] ,
1373+ 1 ,
1374+ exportToken
1375+ )
1376+
1377+ // assertions
1378+ const lastToken = /** @type {Token } */ (
1379+ tokenStore . getLastToken ( node , isNotSemicolonToken )
1380+ )
1381+ const assertionTokens = tokenStore . getTokensBetween (
1382+ node . source ,
1383+ lastToken
1384+ )
1385+ if ( assertionTokens . length ) {
1386+ const assertToken = /** @type {Token } */ ( assertionTokens . shift ( ) )
1387+ setOffset ( assertToken , 0 , exportToken )
1388+ const assertionOpen = assertionTokens . shift ( )
1389+ if ( assertionOpen ) {
1390+ setOffset ( assertionOpen , 1 , assertToken )
1391+ processNodeList ( assertionTokens , assertionOpen , lastToken , 1 )
1392+ }
1393+ }
13431394 }
13441395 } else {
13451396 // maybe babel parser
13461397 }
13471398 }
13481399 } ,
1349- /** @param {ExportSpecifier } node */
1350- ExportSpecifier ( node ) {
1400+ /** @param {ExportSpecifier | ImportSpecifier } node */
1401+ ' ExportSpecifier, ImportSpecifier' ( node ) {
13511402 const tokens = tokenStore . getTokens ( node )
1352- const firstToken = /** @type {Token } */ ( tokens . shift ( ) )
1403+ let firstToken = /** @type {Token } */ ( tokens . shift ( ) )
1404+ if ( firstToken . value === 'type' ) {
1405+ const typeToken = firstToken
1406+ firstToken = /** @type {Token } */ ( tokens . shift ( ) )
1407+ setOffset ( firstToken , 0 , typeToken )
1408+ }
1409+
13531410 setOffset ( tokens , 1 , firstToken )
13541411 } ,
13551412 /** @param {ForInStatement | ForOfStatement } node */
@@ -1540,13 +1597,23 @@ module.exports.defineVisitor = function create(
15401597 setOffset ( fromToken , 1 , importToken )
15411598 setOffset ( afterTokens , 0 , fromToken )
15421599 }
1543- } ,
1544- /** @param {ImportSpecifier } node */
1545- ImportSpecifier ( node ) {
1546- if ( node . local . range [ 0 ] !== node . imported . range [ 0 ] ) {
1547- const tokens = tokenStore . getTokens ( node )
1548- const firstToken = /** @type {Token } */ ( tokens . shift ( ) )
1549- setOffset ( tokens , 1 , firstToken )
1600+
1601+ // assertions
1602+ const lastToken = /** @type {Token } */ (
1603+ tokenStore . getLastToken ( node , isNotSemicolonToken )
1604+ )
1605+ const assertionTokens = tokenStore . getTokensBetween (
1606+ node . source ,
1607+ lastToken
1608+ )
1609+ if ( assertionTokens . length ) {
1610+ const assertToken = /** @type {Token } */ ( assertionTokens . shift ( ) )
1611+ setOffset ( assertToken , 0 , importToken )
1612+ const assertionOpen = assertionTokens . shift ( )
1613+ if ( assertionOpen ) {
1614+ setOffset ( assertionOpen , 1 , assertToken )
1615+ processNodeList ( assertionTokens , assertionOpen , lastToken , 1 )
1616+ }
15501617 }
15511618 } ,
15521619 /** @param {ImportNamespaceSpecifier } node */
0 commit comments