@@ -19,7 +19,8 @@ const {
19
19
isNotOpeningBraceToken,
20
20
isOpeningBracketToken,
21
21
isClosingBracketToken,
22
- isSemicolonToken
22
+ isSemicolonToken,
23
+ isNotSemicolonToken
23
24
} = require ( 'eslint-utils' )
24
25
const {
25
26
isComment,
@@ -1288,24 +1289,42 @@ module.exports.defineVisitor = function create(
1288
1289
} ,
1289
1290
/** @param {ExportAllDeclaration } node */
1290
1291
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
+ ]
1296
1297
if ( ! node . exported ) {
1297
- setOffset ( tokens , 1 , firstToken )
1298
+ setOffset ( tokens , 1 , exportToken )
1298
1299
} else {
1299
1300
// export * as foo from "mod"
1300
1301
const starToken = /** @type {Token } */ ( tokens . find ( isWildcard ) )
1301
1302
const asToken = tokenStore . getTokenAfter ( starToken )
1302
1303
const exportedToken = tokenStore . getTokenAfter ( asToken )
1303
1304
const afterTokens = tokens . slice ( tokens . indexOf ( exportedToken ) + 1 )
1304
1305
1305
- setOffset ( starToken , 1 , firstToken )
1306
+ setOffset ( starToken , 1 , exportToken )
1306
1307
setOffset ( asToken , 1 , starToken )
1307
1308
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
+ }
1309
1328
}
1310
1329
} ,
1311
1330
/** @param {ExportDefaultDeclaration } node */
@@ -1328,28 +1347,66 @@ module.exports.defineVisitor = function create(
1328
1347
const firstSpecifier = node . specifiers [ 0 ]
1329
1348
if ( ! firstSpecifier || firstSpecifier . type === 'ExportSpecifier' ) {
1330
1349
// 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
1334
1364
)
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
+ }
1343
1394
}
1344
1395
} else {
1345
1396
// maybe babel parser
1346
1397
}
1347
1398
}
1348
1399
} ,
1349
- /** @param {ExportSpecifier } node */
1350
- ExportSpecifier ( node ) {
1400
+ /** @param {ExportSpecifier | ImportSpecifier } node */
1401
+ ' ExportSpecifier, ImportSpecifier' ( node ) {
1351
1402
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
+
1353
1410
setOffset ( tokens , 1 , firstToken )
1354
1411
} ,
1355
1412
/** @param {ForInStatement | ForOfStatement } node */
@@ -1540,13 +1597,23 @@ module.exports.defineVisitor = function create(
1540
1597
setOffset ( fromToken , 1 , importToken )
1541
1598
setOffset ( afterTokens , 0 , fromToken )
1542
1599
}
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
+ }
1550
1617
}
1551
1618
} ,
1552
1619
/** @param {ImportNamespaceSpecifier } node */
0 commit comments