Skip to content

Commit eec86d7

Browse files
committed
Update indent rule to support typescript-eslint v5
1 parent f8aa689 commit eec86d7

File tree

6 files changed

+152
-33
lines changed

6 files changed

+152
-33
lines changed

.circleci/config.yml

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ workflows:
66
- node-v10
77
- eslint-v7
88
- eslint-v8
9+
- ts-eslint-v4
910
- node-v12
1011
- node-v14
1112
- lint
@@ -67,7 +68,7 @@ jobs:
6768
- run:
6869
name: Install eslint@7
6970
command: |
70-
npm install --save-exact eslint@7
71+
npm install eslint@7
7172
- run:
7273
name: Install dependencies
7374
command: npm install
@@ -85,7 +86,25 @@ jobs:
8586
- run:
8687
name: Install eslint@8
8788
command: |
88-
npm install --save-exact eslint@^8.0.0-0
89+
npm install eslint@^8.0.0-0
90+
- run:
91+
name: Install dependencies
92+
command: npm install
93+
- run:
94+
name: Test
95+
command: npm test
96+
ts-eslint-v4:
97+
docker:
98+
- image: node:14
99+
steps:
100+
- run:
101+
name: Versions
102+
command: npm version
103+
- checkout
104+
- run:
105+
name: Install @typescript-eslint/parser@4
106+
command: |
107+
npm install @typescript-eslint/parser@^4
89108
- run:
90109
name: Install dependencies
91110
command: npm install

lib/utils/indent-ts.js

Lines changed: 109 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ const {
1010
isOpeningBraceToken,
1111
isNotClosingParenToken,
1212
isClosingBracketToken,
13-
isOpeningBracketToken
13+
isOpeningBracketToken,
14+
isNotOpeningBraceToken
1415
} = require('eslint-utils')
1516

1617
/**
@@ -27,7 +28,7 @@ const {
2728
* @typedef {import('@typescript-eslint/types').TSESTree.TSConstructSignatureDeclaration} TSConstructSignatureDeclaration
2829
* @typedef {import('@typescript-eslint/types').TSESTree.TSImportEqualsDeclaration} TSImportEqualsDeclaration
2930
* @typedef {import('@typescript-eslint/types').TSESTree.TSAbstractMethodDefinition} TSAbstractMethodDefinition
30-
* @typedef {import('@typescript-eslint/types').TSESTree.TSAbstractClassProperty} TSAbstractClassProperty
31+
* @typedef {import('@typescript-eslint/types').TSESTree.TSAbstractPropertyDefinition} TSAbstractPropertyDefinition
3132
* @typedef {import('@typescript-eslint/types').TSESTree.TSEnumMember} TSEnumMember
3233
* @typedef {import('@typescript-eslint/types').TSESTree.TSPropertySignature} TSPropertySignature
3334
* @typedef {import('@typescript-eslint/types').TSESTree.TSIndexSignature} TSIndexSignature
@@ -50,12 +51,13 @@ const {
5051
* @typedef {import('@typescript-eslint/types').TSESTree.TSOptionalType} TSOptionalType
5152
* @typedef {import('@typescript-eslint/types').TSESTree.TSNonNullExpression} TSNonNullExpression
5253
* @typedef {import('@typescript-eslint/types').TSESTree.JSXChild} JSXChild
54+
* @typedef {import('@typescript-eslint/types').TSESTree.TypeNode} TypeNode
5355
*
5456
*/
5557
/**
56-
* Perhaps this node will be deprecated in the future.
57-
* It was present in @typescript-eslint/[email protected].
58-
* @typedef {import('@typescript-eslint/types').TSESTree.ClassProperty} ClassProperty
58+
* Deprecated in @typescript-eslint/parser v5
59+
* @typedef {import('@typescript-eslint/types').TSESTree.PropertyDefinition} ClassProperty
60+
* @typedef {import('@typescript-eslint/types').TSESTree.TSAbstractPropertyDefinition} TSAbstractClassProperty
5961
*/
6062

6163
module.exports = {
@@ -203,6 +205,7 @@ function defineVisitor({
203205
* | TSConstructSignatureDeclaration
204206
* | TSImportEqualsDeclaration
205207
* | TSAbstractMethodDefinition
208+
* | TSAbstractPropertyDefinition
206209
* | TSAbstractClassProperty
207210
* | TSEnumMember
208211
* | ClassProperty
@@ -211,10 +214,80 @@ function defineVisitor({
211214
* | TSMethodSignature} node
212215
*/
213216
['TSTypeAliasDeclaration, TSCallSignatureDeclaration, TSConstructSignatureDeclaration, TSImportEqualsDeclaration,' +
214-
'TSAbstractMethodDefinition, TSAbstractClassProperty, TSEnumMember, ClassProperty,' +
215-
'TSPropertySignature, TSIndexSignature, TSMethodSignature'](node) {
217+
'TSAbstractMethodDefinition, TSAbstractPropertyDefinition, TSEnumMember,' +
218+
'TSPropertySignature, TSIndexSignature, TSMethodSignature,' +
219+
// Deprecated in @typescript-eslint/parser v5
220+
'ClassProperty, TSAbstractClassProperty'](node) {
216221
processSemicolons(node)
217222
},
223+
/**
224+
* @param {TSESTreeNode} node
225+
*/
226+
// eslint-disable-next-line complexity -- ignore
227+
'*[type=/^TS/]'(node) {
228+
if (
229+
node.type !== 'TSAnyKeyword' &&
230+
node.type !== 'TSArrayType' &&
231+
node.type !== 'TSBigIntKeyword' &&
232+
node.type !== 'TSBooleanKeyword' &&
233+
node.type !== 'TSConditionalType' &&
234+
node.type !== 'TSConstructorType' &&
235+
node.type !== 'TSFunctionType' &&
236+
node.type !== 'TSImportType' &&
237+
node.type !== 'TSIndexedAccessType' &&
238+
node.type !== 'TSInferType' &&
239+
node.type !== 'TSIntersectionType' &&
240+
node.type !== 'TSIntrinsicKeyword' &&
241+
node.type !== 'TSLiteralType' &&
242+
node.type !== 'TSMappedType' &&
243+
node.type !== 'TSNamedTupleMember' &&
244+
node.type !== 'TSNeverKeyword' &&
245+
node.type !== 'TSNullKeyword' &&
246+
node.type !== 'TSNumberKeyword' &&
247+
node.type !== 'TSObjectKeyword' &&
248+
node.type !== 'TSOptionalType' &&
249+
node.type !== 'TSRestType' &&
250+
node.type !== 'TSStringKeyword' &&
251+
node.type !== 'TSSymbolKeyword' &&
252+
node.type !== 'TSTemplateLiteralType' &&
253+
node.type !== 'TSThisType' &&
254+
node.type !== 'TSTupleType' &&
255+
node.type !== 'TSTypeLiteral' &&
256+
node.type !== 'TSTypeOperator' &&
257+
node.type !== 'TSTypePredicate' &&
258+
node.type !== 'TSTypeQuery' &&
259+
node.type !== 'TSTypeReference' &&
260+
node.type !== 'TSUndefinedKeyword' &&
261+
node.type !== 'TSUnionType' &&
262+
node.type !== 'TSUnknownKeyword' &&
263+
node.type !== 'TSVoidKeyword'
264+
) {
265+
return
266+
}
267+
/** @type {TypeNode} */
268+
const typeNode = node
269+
if (/** @type {any} */ (typeNode.parent).type === 'TSParenthesizedType') {
270+
return
271+
}
272+
// Process parentheses.
273+
let leftToken = tokenStore.getTokenBefore(node)
274+
let rightToken = tokenStore.getTokenAfter(node)
275+
let firstToken = tokenStore.getFirstToken(node)
276+
277+
while (
278+
leftToken &&
279+
rightToken &&
280+
isOpeningParenToken(leftToken) &&
281+
isClosingParenToken(rightToken)
282+
) {
283+
setOffset(firstToken, 1, leftToken)
284+
setOffset(rightToken, 0, leftToken)
285+
286+
firstToken = leftToken
287+
leftToken = tokenStore.getTokenBefore(leftToken)
288+
rightToken = tokenStore.getTokenAfter(rightToken)
289+
}
290+
},
218291
/**
219292
* Process type annotation
220293
*
@@ -535,15 +608,6 @@ function defineVisitor({
535608
setOffset(typeTokens.firstToken, offset, firstToken)
536609
}
537610
},
538-
TSParenthesizedType(node) {
539-
// (T)
540-
processNodeList(
541-
[node.typeAnnotation],
542-
tokenStore.getFirstToken(node),
543-
tokenStore.getLastToken(node),
544-
1
545-
)
546-
},
547611
TSMappedType(node) {
548612
// {[key in foo]: bar}
549613
const leftBraceToken = tokenStore.getFirstToken(node)
@@ -1026,12 +1090,12 @@ function defineVisitor({
10261090
* // ^^^^^^^
10271091
* ```
10281092
*
1029-
* @param {TSAbstractMethodDefinition | TSAbstractClassProperty | TSEnumMember | ClassProperty} node
1093+
* @param {TSAbstractMethodDefinition | TSAbstractPropertyDefinition | TSEnumMember | TSAbstractClassProperty | ClassProperty} node
10301094
*
10311095
*/
1032-
'TSAbstractMethodDefinition, TSAbstractClassProperty, TSEnumMember, ClassProperty'(
1033-
node
1034-
) {
1096+
['TSAbstractMethodDefinition, TSAbstractPropertyDefinition, TSEnumMember,' +
1097+
// Deprecated in @typescript-eslint/parser v5
1098+
'ClassProperty, TSAbstractClassProperty'](node) {
10351099
const { keyNode, valueNode } =
10361100
node.type === 'TSEnumMember'
10371101
? { keyNode: node.id, valueNode: node.initializer }
@@ -1275,6 +1339,31 @@ function defineVisitor({
12751339
setOffset(atToken, 0, tokenStore.getFirstToken(decorators[0]))
12761340
}
12771341
},
1342+
StaticBlock(node) {
1343+
const firstToken = tokenStore.getFirstToken(node)
1344+
let next = tokenStore.getTokenAfter(firstToken)
1345+
while (next && isNotOpeningBraceToken(next)) {
1346+
setOffset(next, 0, firstToken)
1347+
next = tokenStore.getTokenAfter(next)
1348+
}
1349+
setOffset(next, 0, firstToken)
1350+
processNodeList(node.body, next, tokenStore.getLastToken(node), 1)
1351+
},
1352+
1353+
// ----------------------------------------------------------------------
1354+
// DEPRECATED NODES
1355+
// ----------------------------------------------------------------------
1356+
/** @param {any} node */
1357+
TSParenthesizedType(node) {
1358+
// Deprecated in @typescript-eslint/parser v5
1359+
// (T)
1360+
processNodeList(
1361+
[node.typeAnnotation],
1362+
tokenStore.getFirstToken(node),
1363+
tokenStore.getLastToken(node),
1364+
1
1365+
)
1366+
},
12781367
// ----------------------------------------------------------------------
12791368
// SINGLE TOKEN NODES
12801369
// ----------------------------------------------------------------------

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@
6464
"@types/natural-compare": "^1.4.0",
6565
"@types/node": "^13.13.5",
6666
"@types/semver": "^7.2.0",
67-
"@typescript-eslint/parser": "^4.28.0",
67+
"@typescript-eslint/parser": "^5.0.0-0",
6868
"@vuepress/plugin-pwa": "^1.4.1",
6969
"env-cmd": "^10.1.0",
7070
"eslint": "^7.0.0",

tests/fixtures/script-indent/ts-abstract-class-property-02.vue

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,14 @@ abstract class A {
66
1
77
;
88
abstract public b
9-
=
10-
's'
9+
// parser v5 does not parse value.
10+
// =
11+
// 's'
1112
;
1213
protected abstract c
13-
=
14-
i
14+
// parser v5 does not parse value.
15+
// =
16+
// i
1517
;
1618
}
1719
</script>
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<!--{"parserOptions": {"parser":"@typescript-eslint/parser"}, "requirements": { "@typescript-eslint/parser": ">=4.30.0" } }-->
2+
<script lang="ts">
3+
class Foo {
4+
static {
5+
processFn()
6+
}
7+
}
8+
</script>

tests/fixtures/script-indent/ts-type-annotation-03.vue

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,12 @@ class Foo {
1818
?
1919
:
2020
number;
21-
abstract absopt2
22-
?
23-
:
24-
number
25-
=
26-
42;
21+
// parser v5 does not parse value.
22+
// abstract absopt2
23+
// ?
24+
// :
25+
// number
26+
// =
27+
// 42;
2728
}
2829
</script>

0 commit comments

Comments
 (0)