Skip to content

Commit fe82fb5

Browse files
authored
Add support for ts4.5 to vue/script-indent rule (#1719)
* Add support for ts4.5 to `vue/script-indent` rule * update deps
1 parent 622ac26 commit fe82fb5

11 files changed

+231
-33
lines changed

.vscode/settings.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
"json",
1111
"jsonc"
1212
],
13-
"typescript.tsdk": "node_modules/typescript/lib",
13+
"typescript.tsdk": "./node_modules/typescript/lib",
1414
"vetur.validation.script": false,
1515
"[typescript]": {
1616
"editor.formatOnSave": true,

lib/utils/indent-common.js

+97-30
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ const {
1919
isNotOpeningBraceToken,
2020
isOpeningBracketToken,
2121
isClosingBracketToken,
22-
isSemicolonToken
22+
isSemicolonToken,
23+
isNotSemicolonToken
2324
} = require('eslint-utils')
2425
const {
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 */

lib/utils/indent-ts.js

+21
Original file line numberDiff line numberDiff line change
@@ -1302,6 +1302,27 @@ function defineVisitor({
13021302
setOffset(atToken, 0, tokenStore.getFirstToken(decorators[0]))
13031303
}
13041304
},
1305+
ImportAttribute(node) {
1306+
const firstToken = tokenStore.getFirstToken(node)
1307+
const keyTokens = getFirstAndLastTokens(node.key)
1308+
const prefixTokens = tokenStore.getTokensBetween(
1309+
firstToken,
1310+
keyTokens.firstToken
1311+
)
1312+
setOffset(prefixTokens, 0, firstToken)
1313+
1314+
setOffset(keyTokens.firstToken, 0, firstToken)
1315+
1316+
const initToken = tokenStore.getFirstToken(node.value)
1317+
setOffset(
1318+
[
1319+
...tokenStore.getTokensBetween(keyTokens.lastToken, initToken),
1320+
initToken
1321+
],
1322+
1,
1323+
keyTokens.lastToken
1324+
)
1325+
},
13051326

13061327
// ----------------------------------------------------------------------
13071328
// DEPRECATED NODES

package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@
6565
"@types/natural-compare": "^1.4.0",
6666
"@types/node": "^13.13.5",
6767
"@types/semver": "^7.2.0",
68-
"@typescript-eslint/parser": "^5.4.0",
68+
"@typescript-eslint/parser": "^5.5.0",
6969
"@vuepress/plugin-pwa": "^1.4.1",
7070
"acorn": "^8.5.0",
7171
"env-cmd": "^10.1.0",
@@ -82,7 +82,7 @@
8282
"mocha": "^7.1.2",
8383
"nyc": "^15.1.0",
8484
"prettier": "^2.4.1",
85-
"typescript": "^4.5.0-0",
85+
"typescript": "^4.5.0",
8686
"vue-eslint-editor": "^1.1.0",
8787
"vuepress": "^1.8.2"
8888
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<!--{"parserOptions": {"parser":"@typescript-eslint/parser"}, "requirements": { "@typescript-eslint/parser": ">=5.4.1 || ^5.4.1-0" } }-->
2+
<script lang="ts">
3+
import foo from "./foo.json" assert
4+
{
5+
type
6+
:
7+
"json"
8+
}
9+
</script>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<!--{"parserOptions": {"parser":"@typescript-eslint/parser"}, "requirements": { "@typescript-eslint/parser": ">=5.4.1 || ^5.4.1-0" } }-->
2+
<script lang="ts">
3+
import(
4+
"./foo.json",
5+
{
6+
assert
7+
:
8+
{
9+
type
10+
:
11+
"json"
12+
}
13+
}
14+
)
15+
</script>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<!--{"parserOptions": {"parser":"@typescript-eslint/parser"}, "requirements": { "@typescript-eslint/parser": ">=5.4.1 || ^5.4.1-0" } }-->
2+
<script lang="ts">
3+
export * from "mod" assert
4+
{
5+
type
6+
:
7+
"json"
8+
}
9+
;
10+
</script>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<!--{"parserOptions": {"parser":"@typescript-eslint/parser"}, "requirements": { "@typescript-eslint/parser": ">=5.4.1 || ^5.4.1-0" } }-->
2+
<script lang="ts">
3+
export { foo } from "mod" assert
4+
{
5+
type
6+
:
7+
"json"
8+
}
9+
;
10+
</script>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<!--{"parserOptions": {"parser":"@typescript-eslint/parser"}, "requirements": { "@typescript-eslint/parser": ">=5.4.0 || ^5.4.1-0" } }-->
2+
<script lang="ts">
3+
import
4+
type
5+
Foo
6+
from
7+
'foo'
8+
import
9+
type
10+
{
11+
Foo
12+
}
13+
from
14+
'foo';
15+
export
16+
type Foo = {}
17+
</script>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<!--{"parserOptions": {"parser":"@typescript-eslint/parser"}, "requirements": { "@typescript-eslint/parser": ">=5.4.0 || ^5.4.1-0" } }-->
2+
<script lang="ts">
3+
import
4+
{
5+
type
6+
Foo
7+
}
8+
from
9+
'foo';
10+
export
11+
{
12+
type
13+
Bar
14+
}
15+
from
16+
'bar';
17+
export
18+
{
19+
type
20+
Baz
21+
}
22+
;
23+
</script>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<!--{"parserOptions": {"parser":"@typescript-eslint/parser"}, "requirements": { "@typescript-eslint/parser": ">=5.4.0 || ^5.4.1-0" } }-->
2+
<script lang="ts">
3+
import
4+
{
5+
type
6+
Foo
7+
as Foo2
8+
}
9+
from
10+
'foo';
11+
export
12+
{
13+
type
14+
Bar
15+
as Bar2
16+
}
17+
from
18+
'bar';
19+
export
20+
{
21+
type
22+
Baz
23+
as Baz2
24+
}
25+
;
26+
</script>

0 commit comments

Comments
 (0)