Skip to content

Commit 84cddf7

Browse files
authoredNov 19, 2024··
fix: fix runtime errors in non-typescript eslint projects
1 parent 589dc8a commit 84cddf7

18 files changed

+450
-88
lines changed
 

‎rules/sort-decorators.ts

+18-5
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import { isNodeEslintDisabled } from '../utils/is-node-eslint-disabled'
1919
import { hasPartitionComment } from '../utils/is-partition-comment'
2020
import { sortNodesByGroups } from '../utils/sort-nodes-by-groups'
2121
import { getCommentsBefore } from '../utils/get-comments-before'
22+
import { getNodeDecorators } from '../utils/get-node-decorators'
2223
import { createEslintRule } from '../utils/create-eslint-rule'
2324
import { getDecoratorName } from '../utils/get-decorator-name'
2425
import { getGroupNumber } from '../utils/get-group-number'
@@ -163,19 +164,31 @@ export default createEslintRule<Options<string[]>, MESSAGE_ID>({
163164
},
164165
PropertyDefinition: propertyDefinition =>
165166
options.sortOnProperties
166-
? sortDecorators(context, options, propertyDefinition.decorators)
167+
? sortDecorators(
168+
context,
169+
options,
170+
getNodeDecorators(propertyDefinition),
171+
)
167172
: null,
168173
AccessorProperty: accessorDefinition =>
169174
options.sortOnAccessors
170-
? sortDecorators(context, options, accessorDefinition.decorators)
175+
? sortDecorators(
176+
context,
177+
options,
178+
getNodeDecorators(accessorDefinition),
179+
)
171180
: null,
172181
MethodDefinition: methodDefinition =>
173182
options.sortOnMethods
174-
? sortDecorators(context, options, methodDefinition.decorators)
183+
? sortDecorators(
184+
context,
185+
options,
186+
getNodeDecorators(methodDefinition),
187+
)
175188
: null,
176-
ClassDeclaration: Declaration =>
189+
ClassDeclaration: declaration =>
177190
options.sortOnClasses
178-
? sortDecorators(context, options, Declaration.decorators)
191+
? sortDecorators(context, options, getNodeDecorators(declaration))
179192
: null,
180193
}
181194
},

‎rules/sort-heritage-clauses.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -114,9 +114,10 @@ let sortHeritageClauses = (
114114
options: Required<Options<string[]>[0]>,
115115
heritageClauses:
116116
| TSESTree.TSInterfaceHeritage[]
117-
| TSESTree.TSClassImplements[],
117+
| TSESTree.TSClassImplements[]
118+
| undefined,
118119
): void => {
119-
if (!isSortable(heritageClauses)) {
120+
if (!heritageClauses || !isSortable(heritageClauses)) {
120121
return
121122
}
122123
let sourceCode = getSourceCode(context)

‎rules/sort-modules.ts

+5-2
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ import { sortNodesByGroups } from '../utils/sort-nodes-by-groups'
4343
import { getNewlinesErrors } from '../utils/get-newlines-errors'
4444
import { makeNewlinesFixes } from '../utils/make-newlines-fixes'
4545
import { getCommentsBefore } from '../utils/get-comments-before'
46+
import { getNodeDecorators } from '../utils/get-node-decorators'
4647
import { createEslintRule } from '../utils/create-eslint-rule'
4748
import { getLinesBetween } from '../utils/get-lines-between'
4849
import { getGroupNumber } from '../utils/get-group-number'
@@ -295,10 +296,12 @@ let analyzeModule = ({
295296
case AST_NODE_TYPES.ClassDeclaration:
296297
selector = 'class'
297298
name = nodeToParse.id?.name
298-
if (nodeToParse.decorators.length > 0) {
299+
// eslint-disable-next-line no-case-declarations -- Easier to handle
300+
let nodeDecorators = getNodeDecorators(nodeToParse)
301+
if (nodeDecorators.length > 0) {
299302
modifiers.push('decorated')
300303
}
301-
for (let decorator of nodeToParse.decorators) {
304+
for (let decorator of nodeDecorators) {
302305
if (decorator.expression.type === 'Identifier') {
303306
decorators.push(decorator.expression.name)
304307
} else if (

‎test/sort-array-includes.test.ts

+24
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1+
import type { Rule } from 'eslint'
2+
13
import { RuleTester } from '@typescript-eslint/rule-tester'
4+
import { RuleTester as EslintRuleTester } from 'eslint'
25
import { afterAll, describe, it } from 'vitest'
36
import { dedent } from 'ts-dedent'
47

@@ -15,6 +18,7 @@ describe(ruleName, () => {
1518
RuleTester.it = it
1619

1720
let ruleTester = new RuleTester()
21+
let eslintRuleTester = new EslintRuleTester()
1822

1923
describe(`${ruleName}: sorting by alphabetical order`, () => {
2024
let type = 'alphabetical-order'
@@ -1788,5 +1792,25 @@ describe(ruleName, () => {
17881792
],
17891793
valid: [],
17901794
})
1795+
1796+
eslintRuleTester.run(
1797+
`${ruleName}: handles non typescript-eslint parser`,
1798+
rule as unknown as Rule.RuleModule,
1799+
{
1800+
valid: [
1801+
{
1802+
code: dedent`
1803+
[
1804+
'a',
1805+
'b',
1806+
'c',
1807+
].includes(value)
1808+
`,
1809+
options: [{}],
1810+
},
1811+
],
1812+
invalid: [],
1813+
},
1814+
)
17911815
})
17921816
})

‎test/sort-classes.test.ts

+30
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1+
import type { Rule } from 'eslint'
2+
13
import { RuleTester } from '@typescript-eslint/rule-tester'
4+
import { RuleTester as EslintRuleTester } from 'eslint'
25
import { afterAll, describe, it } from 'vitest'
36
import { dedent } from 'ts-dedent'
47

@@ -15,6 +18,7 @@ describe(ruleName, () => {
1518
RuleTester.it = it
1619

1720
let ruleTester = new RuleTester()
21+
let eslintRuleTester = new EslintRuleTester()
1822

1923
describe(`${ruleName}: sorting by alphabetical order`, () => {
2024
let type = 'alphabetical-order'
@@ -8549,5 +8553,31 @@ describe(ruleName, () => {
85498553
],
85508554
valid: [],
85518555
})
8556+
8557+
eslintRuleTester.run(
8558+
`${ruleName}: handles non typescript-eslint parser`,
8559+
rule as unknown as Rule.RuleModule,
8560+
{
8561+
valid: [
8562+
{
8563+
code: dedent`
8564+
class A {
8565+
8566+
static {}
8567+
8568+
b
8569+
a = this.b
8570+
8571+
constructor() {}
8572+
8573+
method() {}
8574+
}
8575+
`,
8576+
options: [{}],
8577+
},
8578+
],
8579+
invalid: [],
8580+
},
8581+
)
85528582
})
85538583
})

‎test/sort-decorators.test.ts

+24
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import type { TestCaseError } from '@typescript-eslint/rule-tester'
2+
import type { Rule } from 'eslint'
23

34
import { RuleTester } from '@typescript-eslint/rule-tester'
5+
import { RuleTester as EslintRuleTester } from 'eslint'
46
import { afterAll, describe, it } from 'vitest'
57
import { dedent } from 'ts-dedent'
68

@@ -17,6 +19,7 @@ describe(ruleName, () => {
1719
RuleTester.it = it
1820

1921
let ruleTester = new RuleTester()
22+
let eslintRuleTester = new EslintRuleTester()
2023

2124
describe(`${ruleName}: sorting by alphabetical order`, () => {
2225
let type = 'alphabetical-order'
@@ -4010,6 +4013,27 @@ describe(ruleName, () => {
40104013
],
40114014
valid: [],
40124015
})
4016+
4017+
eslintRuleTester.run(
4018+
`${ruleName}: handles non typescript-eslint parser`,
4019+
rule as unknown as Rule.RuleModule,
4020+
{
4021+
valid: [
4022+
{
4023+
code: dedent`
4024+
class A {
4025+
4026+
property
4027+
4028+
method() {}
4029+
}
4030+
`,
4031+
options: [{}],
4032+
},
4033+
],
4034+
invalid: [],
4035+
},
4036+
)
40134037
})
40144038
})
40154039

‎test/sort-exports.test.ts

+22
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1+
import type { Rule } from 'eslint'
2+
13
import { RuleTester } from '@typescript-eslint/rule-tester'
4+
import { RuleTester as EslintRuleTester } from 'eslint'
25
import { afterAll, describe, it } from 'vitest'
36
import { dedent } from 'ts-dedent'
47

@@ -15,6 +18,7 @@ describe(ruleName, () => {
1518
RuleTester.it = it
1619

1720
let ruleTester = new RuleTester()
21+
let eslintRuleTester = new EslintRuleTester()
1822

1923
describe(`${ruleName}: sorting by alphabetical order`, () => {
2024
let type = 'alphabetical-order'
@@ -1379,5 +1383,23 @@ describe(ruleName, () => {
13791383
],
13801384
valid: [],
13811385
})
1386+
1387+
eslintRuleTester.run(
1388+
`${ruleName}: handles non typescript-eslint parser`,
1389+
rule as unknown as Rule.RuleModule,
1390+
{
1391+
valid: [
1392+
{
1393+
code: dedent`
1394+
export { a } from 'a'
1395+
export * from 'b'
1396+
export { c } from 'c'
1397+
`,
1398+
options: [{}],
1399+
},
1400+
],
1401+
invalid: [],
1402+
},
1403+
)
13821404
})
13831405
})

‎test/sort-heritage-clauses.test.ts

+20
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1+
import type { Rule } from 'eslint'
2+
13
import { RuleTester } from '@typescript-eslint/rule-tester'
4+
import { RuleTester as EslintRuleTester } from 'eslint'
25
import { afterAll, describe, it } from 'vitest'
36
import { dedent } from 'ts-dedent'
47

@@ -15,6 +18,7 @@ describe(ruleName, () => {
1518
RuleTester.it = it
1619

1720
let ruleTester = new RuleTester()
21+
let eslintRuleTester = new EslintRuleTester()
1822

1923
describe(`${ruleName}: sorting by alphabetical order`, () => {
2024
let type = 'alphabetical-order'
@@ -1677,5 +1681,21 @@ describe(ruleName, () => {
16771681
],
16781682
valid: [],
16791683
})
1684+
1685+
eslintRuleTester.run(
1686+
`${ruleName}: handles non typescript-eslint parser`,
1687+
rule as unknown as Rule.RuleModule,
1688+
{
1689+
valid: [
1690+
{
1691+
code: dedent`
1692+
class Class extends A {}
1693+
`,
1694+
options: [{}],
1695+
},
1696+
],
1697+
invalid: [],
1698+
},
1699+
)
16801700
})
16811701
})

‎test/sort-imports.test.ts

+22
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@ import type {
33
RuleContext,
44
} from '@typescript-eslint/utils/ts-eslint'
55
import type { CompilerOptions } from 'typescript'
6+
import type { Rule } from 'eslint'
67

78
import { afterAll, describe, expect, it, vi } from 'vitest'
89
import { RuleTester } from '@typescript-eslint/rule-tester'
910
import { createModuleResolutionCache } from 'typescript'
11+
import { RuleTester as EslintRuleTester } from 'eslint'
1012
import { dedent } from 'ts-dedent'
1113

1214
import type { MESSAGE_ID, Options } from '../rules/sort-imports'
@@ -26,6 +28,7 @@ describe(ruleName, () => {
2628
RuleTester.it = it
2729

2830
let ruleTester = new RuleTester()
31+
let eslintRuleTester = new EslintRuleTester()
2932

3033
describe(`${ruleName}: sorting by alphabetical order`, () => {
3134
let type = 'alphabetical-order'
@@ -6511,5 +6514,24 @@ describe(ruleName, () => {
65116514
],
65126515
valid: [],
65136516
})
6517+
6518+
eslintRuleTester.run(
6519+
`${ruleName}: handles non typescript-eslint parser`,
6520+
rule as unknown as Rule.RuleModule,
6521+
{
6522+
valid: [
6523+
{
6524+
code: dedent`
6525+
import { d } from '~./d.scss'
6526+
import { a } from 'a'
6527+
import * as b from 'b'
6528+
import { c } from 'c'
6529+
`,
6530+
options: [{}],
6531+
},
6532+
],
6533+
invalid: [],
6534+
},
6535+
)
65146536
})
65156537
})

‎test/sort-maps.test.ts

+24
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1+
import type { Rule } from 'eslint'
2+
13
import { RuleTester } from '@typescript-eslint/rule-tester'
4+
import { RuleTester as EslintRuleTester } from 'eslint'
25
import { afterAll, describe, it } from 'vitest'
36
import { dedent } from 'ts-dedent'
47

@@ -15,6 +18,7 @@ describe(ruleName, () => {
1518
RuleTester.it = it
1619

1720
let ruleTester = new RuleTester()
21+
let eslintRuleTester = new EslintRuleTester()
1822

1923
describe(`${ruleName}: sorting by alphabetical order`, () => {
2024
let type = 'alphabetical-order'
@@ -1524,5 +1528,25 @@ describe(ruleName, () => {
15241528
],
15251529
valid: [],
15261530
})
1531+
1532+
eslintRuleTester.run(
1533+
`${ruleName}: handles non typescript-eslint parser`,
1534+
rule as unknown as Rule.RuleModule,
1535+
{
1536+
valid: [
1537+
{
1538+
code: dedent`
1539+
new Map([
1540+
['a', 'a'],
1541+
['b', 'b'],
1542+
['c', 'c'],
1543+
])
1544+
`,
1545+
options: [{}],
1546+
},
1547+
],
1548+
invalid: [],
1549+
},
1550+
)
15271551
})
15281552
})

0 commit comments

Comments
 (0)
Please sign in to comment.