@flint.fyi/ts 0.14.2 → 0.14.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -0
- package/lib/createTypeScriptFileFromProgram.js +1 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.js +1 -0
- package/lib/language.d.ts +1 -0
- package/lib/nodes.d.ts +1 -0
- package/lib/plugin.d.ts +165 -1
- package/lib/plugin.js +82 -0
- package/lib/rules/anyReturns.d.ts +6 -0
- package/lib/rules/anyReturns.js +187 -0
- package/lib/rules/anyReturns.test.d.ts +1 -0
- package/lib/rules/anyReturns.test.js +647 -0
- package/lib/rules/asyncPromiseExecutors.d.ts +6 -0
- package/lib/rules/asyncPromiseExecutors.js +51 -0
- package/lib/rules/asyncPromiseExecutors.test.d.ts +1 -0
- package/lib/rules/asyncPromiseExecutors.test.js +71 -0
- package/lib/rules/caseDeclarations.d.ts +6 -0
- package/lib/rules/caseDeclarations.js +53 -0
- package/lib/rules/caseDeclarations.test.d.ts +1 -0
- package/lib/rules/caseDeclarations.test.js +227 -0
- package/lib/rules/caseDuplicates.d.ts +6 -0
- package/lib/rules/caseDuplicates.js +49 -0
- package/lib/rules/caseDuplicates.test.d.ts +1 -0
- package/lib/rules/caseDuplicates.test.js +307 -0
- package/lib/rules/chainedAssignments.d.ts +6 -0
- package/lib/rules/chainedAssignments.js +48 -0
- package/lib/rules/chainedAssignments.test.d.ts +1 -0
- package/lib/rules/chainedAssignments.test.js +238 -0
- package/lib/rules/classAssignments.d.ts +6 -0
- package/lib/rules/classAssignments.js +42 -0
- package/lib/rules/classAssignments.test.d.ts +1 -0
- package/lib/rules/classAssignments.test.js +156 -0
- package/lib/rules/constantAssignments.d.ts +6 -0
- package/lib/rules/constantAssignments.js +61 -0
- package/lib/rules/constantAssignments.test.d.ts +1 -0
- package/lib/rules/constantAssignments.test.js +221 -0
- package/lib/rules/constructorReturns.d.ts +6 -0
- package/lib/rules/constructorReturns.js +52 -0
- package/lib/rules/constructorReturns.test.d.ts +1 -0
- package/lib/rules/constructorReturns.test.js +96 -0
- package/lib/rules/defaultCaseLast.d.ts +6 -0
- package/lib/rules/defaultCaseLast.js +43 -0
- package/lib/rules/defaultCaseLast.test.d.ts +1 -0
- package/lib/rules/defaultCaseLast.test.js +195 -0
- package/lib/rules/duplicateArguments.d.ts +6 -0
- package/lib/rules/duplicateArguments.js +51 -0
- package/lib/rules/duplicateArguments.test.d.ts +1 -0
- package/lib/rules/duplicateArguments.test.js +139 -0
- package/lib/rules/elseIfDuplicates.d.ts +6 -0
- package/lib/rules/elseIfDuplicates.js +53 -0
- package/lib/rules/elseIfDuplicates.test.d.ts +1 -0
- package/lib/rules/elseIfDuplicates.test.js +176 -0
- package/lib/rules/emptyDestructures.d.ts +6 -0
- package/lib/rules/emptyDestructures.js +40 -0
- package/lib/rules/emptyDestructures.test.d.ts +1 -0
- package/lib/rules/emptyDestructures.test.js +186 -0
- package/lib/rules/emptyStaticBlocks.d.ts +6 -0
- package/lib/rules/emptyStaticBlocks.js +54 -0
- package/lib/rules/emptyStaticBlocks.test.d.ts +1 -0
- package/lib/rules/emptyStaticBlocks.test.js +167 -0
- package/lib/rules/exceptionAssignments.d.ts +6 -0
- package/lib/rules/exceptionAssignments.js +61 -0
- package/lib/rules/exceptionAssignments.test.d.ts +1 -0
- package/lib/rules/exceptionAssignments.test.js +264 -0
- package/lib/rules/forDirections.d.ts +6 -0
- package/lib/rules/forDirections.js +124 -0
- package/lib/rules/forDirections.test.d.ts +1 -0
- package/lib/rules/forDirections.test.js +99 -0
- package/lib/rules/functionAssignments.d.ts +6 -0
- package/lib/rules/functionAssignments.js +42 -0
- package/lib/rules/functionAssignments.test.d.ts +1 -0
- package/lib/rules/functionAssignments.test.js +209 -0
- package/lib/rules/functionNewCalls.d.ts +6 -0
- package/lib/rules/functionNewCalls.js +60 -0
- package/lib/rules/functionNewCalls.test.d.ts +1 -0
- package/lib/rules/functionNewCalls.test.js +115 -0
- package/lib/rules/generatorFunctionYields.d.ts +6 -0
- package/lib/rules/generatorFunctionYields.js +57 -0
- package/lib/rules/generatorFunctionYields.test.d.ts +1 -0
- package/lib/rules/generatorFunctionYields.test.js +151 -0
- package/lib/rules/globalAssignments.d.ts +6 -0
- package/lib/rules/globalAssignments.js +59 -0
- package/lib/rules/globalAssignments.test.d.ts +1 -0
- package/lib/rules/globalAssignments.test.js +215 -0
- package/lib/rules/globalObjectCalls.d.ts +6 -0
- package/lib/rules/globalObjectCalls.js +43 -0
- package/lib/rules/globalObjectCalls.test.d.ts +1 -0
- package/lib/rules/globalObjectCalls.test.js +93 -0
- package/lib/rules/negativeZeroComparisons.d.ts +6 -0
- package/lib/rules/negativeZeroComparisons.js +65 -0
- package/lib/rules/negativeZeroComparisons.test.d.ts +1 -0
- package/lib/rules/negativeZeroComparisons.test.js +209 -0
- package/lib/rules/newExpressions.d.ts +6 -0
- package/lib/rules/newExpressions.js +54 -0
- package/lib/rules/newExpressions.test.d.ts +1 -0
- package/lib/rules/newExpressions.test.js +79 -0
- package/lib/rules/newNativeNonConstructors.d.ts +6 -0
- package/lib/rules/newNativeNonConstructors.js +49 -0
- package/lib/rules/newNativeNonConstructors.test.d.ts +1 -0
- package/lib/rules/newNativeNonConstructors.test.js +94 -0
- package/lib/rules/nonOctalDecimalEscapes.d.ts +6 -0
- package/lib/rules/nonOctalDecimalEscapes.js +57 -0
- package/lib/rules/nonOctalDecimalEscapes.test.d.ts +1 -0
- package/lib/rules/nonOctalDecimalEscapes.test.js +69 -0
- package/lib/rules/numericLiteralParsing.d.ts +6 -0
- package/lib/rules/numericLiteralParsing.js +97 -0
- package/lib/rules/numericLiteralParsing.test.d.ts +1 -0
- package/lib/rules/numericLiteralParsing.test.js +99 -0
- package/lib/rules/objectProto.d.ts +6 -0
- package/lib/rules/objectProto.js +54 -0
- package/lib/rules/objectProto.test.d.ts +1 -0
- package/lib/rules/objectProto.test.js +96 -0
- package/lib/rules/octalNumbers.d.ts +6 -0
- package/lib/rules/octalNumbers.js +68 -0
- package/lib/rules/octalNumbers.test.d.ts +1 -0
- package/lib/rules/octalNumbers.test.js +245 -0
- package/lib/rules/returnAssignments.d.ts +6 -0
- package/lib/rules/returnAssignments.js +50 -0
- package/lib/rules/returnAssignments.test.d.ts +1 -0
- package/lib/rules/returnAssignments.test.js +185 -0
- package/lib/rules/selfAssignments.d.ts +6 -0
- package/lib/rules/selfAssignments.js +44 -0
- package/lib/rules/selfAssignments.test.d.ts +1 -0
- package/lib/rules/selfAssignments.test.js +66 -0
- package/lib/rules/selfComparisons.d.ts +6 -0
- package/lib/rules/selfComparisons.js +41 -0
- package/lib/rules/selfComparisons.test.d.ts +1 -0
- package/lib/rules/selfComparisons.test.js +297 -0
- package/lib/rules/sequences.d.ts +6 -0
- package/lib/rules/sequences.js +34 -0
- package/lib/rules/sequences.test.d.ts +1 -0
- package/lib/rules/sequences.test.js +48 -0
- package/lib/rules/sparseArrays.d.ts +6 -0
- package/lib/rules/sparseArrays.js +54 -0
- package/lib/rules/sparseArrays.test.d.ts +1 -0
- package/lib/rules/sparseArrays.test.js +110 -0
- package/lib/rules/symbolDescriptions.d.ts +6 -0
- package/lib/rules/symbolDescriptions.js +41 -0
- package/lib/rules/symbolDescriptions.test.d.ts +1 -0
- package/lib/rules/symbolDescriptions.test.js +89 -0
- package/lib/rules/typeofComparisons.d.ts +6 -0
- package/lib/rules/typeofComparisons.js +78 -0
- package/lib/rules/typeofComparisons.test.d.ts +1 -0
- package/lib/rules/typeofComparisons.test.js +85 -0
- package/lib/rules/unassignedVariables.d.ts +6 -0
- package/lib/rules/unassignedVariables.js +55 -0
- package/lib/rules/unassignedVariables.test.d.ts +1 -0
- package/lib/rules/unassignedVariables.test.js +72 -0
- package/lib/rules/undefinedVariables.d.ts +6 -0
- package/lib/rules/undefinedVariables.js +76 -0
- package/lib/rules/undefinedVariables.test.d.ts +1 -0
- package/lib/rules/undefinedVariables.test.js +80 -0
- package/lib/rules/unicodeBOMs.d.ts +6 -0
- package/lib/rules/unicodeBOMs.js +41 -0
- package/lib/rules/unicodeBOMs.test.d.ts +1 -0
- package/lib/rules/unicodeBOMs.test.js +65 -0
- package/lib/rules/unnecessaryCatches.d.ts +6 -0
- package/lib/rules/unnecessaryCatches.js +68 -0
- package/lib/rules/unnecessaryCatches.test.d.ts +1 -0
- package/lib/rules/unnecessaryCatches.test.js +210 -0
- package/lib/rules/unsafeNegations.d.ts +6 -0
- package/lib/rules/unsafeNegations.js +50 -0
- package/lib/rules/unsafeNegations.test.d.ts +1 -0
- package/lib/rules/unsafeNegations.test.js +63 -0
- package/lib/rules/utils/discriminateAnyType.d.ts +12 -0
- package/lib/rules/utils/discriminateAnyType.js +41 -0
- package/lib/rules/utils/getThisExpression.d.ts +2 -0
- package/lib/rules/utils/getThisExpression.js +23 -0
- package/lib/rules/utils/isUnsafeAssignment.d.ts +13 -0
- package/lib/rules/utils/isUnsafeAssignment.js +76 -0
- package/lib/rules/utils/operators.d.ts +4 -0
- package/lib/rules/utils/operators.js +36 -0
- package/lib/rules/variableDeletions.d.ts +6 -0
- package/lib/rules/variableDeletions.js +39 -0
- package/lib/rules/variableDeletions.test.d.ts +1 -0
- package/lib/rules/variableDeletions.test.js +75 -0
- package/lib/rules/voidOperator.d.ts +6 -0
- package/lib/rules/voidOperator.js +36 -0
- package/lib/rules/voidOperator.test.d.ts +1 -0
- package/lib/rules/voidOperator.test.js +98 -0
- package/lib/utils/declarationIncludesGlobal.d.ts +2 -0
- package/lib/utils/declarationIncludesGlobal.js +5 -0
- package/lib/utils/declarationsIncludeGlobal.d.ts +2 -0
- package/lib/utils/declarationsIncludeGlobal.js +4 -0
- package/lib/utils/getModifyingReferences.d.ts +8 -0
- package/lib/utils/getModifyingReferences.js +42 -0
- package/lib/utils/hasSameTokens.d.ts +2 -0
- package/lib/utils/hasSameTokens.js +30 -0
- package/lib/utils/isGlobalDeclaration.d.ts +2 -0
- package/lib/utils/isGlobalDeclaration.js +5 -0
- package/lib/utils/isGlobalDeclarationOfName.d.ts +5 -0
- package/lib/utils/isGlobalDeclarationOfName.js +31 -0
- package/lib/utils/isGlobalVariable.d.ts +8 -0
- package/lib/utils/isGlobalVariable.js +21 -0
- package/lib/utils/unwrapParentParenthesizedExpressions.d.ts +2 -0
- package/lib/utils/unwrapParentParenthesizedExpressions.js +6 -0
- package/lib/utils/unwrapParenthesizedExpression.d.ts +2 -0
- package/lib/utils/unwrapParenthesizedExpression.js +6 -0
- package/package.json +1 -1
- package/src/createTypeScriptFileFromProgram.ts +1 -0
- package/src/index.ts +1 -0
- package/src/language.ts +1 -0
- package/src/nodes.ts +1 -0
- package/src/plugin.ts +82 -0
- package/src/rules/anyReturns.test.ts +649 -0
- package/src/rules/anyReturns.ts +263 -0
- package/src/rules/asyncPromiseExecutors.test.ts +72 -0
- package/src/rules/asyncPromiseExecutors.ts +61 -0
- package/src/rules/caseDeclarations.test.ts +228 -0
- package/src/rules/caseDeclarations.ts +70 -0
- package/src/rules/caseDuplicates.test.ts +308 -0
- package/src/rules/caseDuplicates.ts +57 -0
- package/src/rules/chainedAssignments.test.ts +239 -0
- package/src/rules/chainedAssignments.ts +55 -0
- package/src/rules/classAssignments.test.ts +157 -0
- package/src/rules/classAssignments.ts +50 -0
- package/src/rules/constantAssignments.test.ts +222 -0
- package/src/rules/constantAssignments.ts +78 -0
- package/src/rules/constructorReturns.test.ts +97 -0
- package/src/rules/constructorReturns.ts +59 -0
- package/src/rules/defaultCaseLast.test.ts +196 -0
- package/src/rules/defaultCaseLast.ts +54 -0
- package/src/rules/duplicateArguments.test.ts +140 -0
- package/src/rules/duplicateArguments.ts +58 -0
- package/src/rules/elseIfDuplicates.test.ts +177 -0
- package/src/rules/elseIfDuplicates.ts +69 -0
- package/src/rules/emptyDestructures.test.ts +187 -0
- package/src/rules/emptyDestructures.ts +48 -0
- package/src/rules/emptyStaticBlocks.test.ts +168 -0
- package/src/rules/emptyStaticBlocks.ts +60 -0
- package/src/rules/exceptionAssignments.test.ts +265 -0
- package/src/rules/exceptionAssignments.ts +77 -0
- package/src/rules/forDirections.test.ts +100 -0
- package/src/rules/forDirections.ts +163 -0
- package/src/rules/functionAssignments.test.ts +210 -0
- package/src/rules/functionAssignments.ts +51 -0
- package/src/rules/functionNewCalls.test.ts +116 -0
- package/src/rules/functionNewCalls.ts +75 -0
- package/src/rules/generatorFunctionYields.test.ts +152 -0
- package/src/rules/generatorFunctionYields.ts +71 -0
- package/src/rules/globalAssignments.test.ts +216 -0
- package/src/rules/globalAssignments.ts +67 -0
- package/src/rules/globalObjectCalls.test.ts +94 -0
- package/src/rules/globalObjectCalls.ts +52 -0
- package/src/rules/negativeZeroComparisons.test.ts +210 -0
- package/src/rules/negativeZeroComparisons.ts +87 -0
- package/src/rules/newExpressions.test.ts +80 -0
- package/src/rules/newExpressions.ts +67 -0
- package/src/rules/newNativeNonConstructors.test.ts +95 -0
- package/src/rules/newNativeNonConstructors.ts +59 -0
- package/src/rules/nonOctalDecimalEscapes.test.ts +70 -0
- package/src/rules/nonOctalDecimalEscapes.ts +70 -0
- package/src/rules/numericLiteralParsing.test.ts +100 -0
- package/src/rules/numericLiteralParsing.ts +116 -0
- package/src/rules/objectProto.test.ts +97 -0
- package/src/rules/objectProto.ts +62 -0
- package/src/rules/octalNumbers.test.ts +246 -0
- package/src/rules/octalNumbers.ts +75 -0
- package/src/rules/returnAssignments.test.ts +186 -0
- package/src/rules/returnAssignments.ts +57 -0
- package/src/rules/selfAssignments.test.ts +67 -0
- package/src/rules/selfAssignments.ts +50 -0
- package/src/rules/selfComparisons.test.ts +298 -0
- package/src/rules/selfComparisons.ts +45 -0
- package/src/rules/sequences.test.ts +49 -0
- package/src/rules/sequences.ts +37 -0
- package/src/rules/sparseArrays.test.ts +111 -0
- package/src/rules/sparseArrays.ts +61 -0
- package/src/rules/symbolDescriptions.test.ts +90 -0
- package/src/rules/symbolDescriptions.ts +47 -0
- package/src/rules/typeofComparisons.test.ts +86 -0
- package/src/rules/typeofComparisons.ts +88 -0
- package/src/rules/unassignedVariables.test.ts +73 -0
- package/src/rules/unassignedVariables.ts +69 -0
- package/src/rules/undefinedVariables.test.ts +81 -0
- package/src/rules/undefinedVariables.ts +97 -0
- package/src/rules/unicodeBOMs.test.ts +66 -0
- package/src/rules/unicodeBOMs.ts +44 -0
- package/src/rules/unnecessaryCatches.test.ts +211 -0
- package/src/rules/unnecessaryCatches.ts +84 -0
- package/src/rules/unsafeNegations.test.ts +64 -0
- package/src/rules/unsafeNegations.ts +59 -0
- package/src/rules/utils/discriminateAnyType.ts +66 -0
- package/src/rules/utils/getThisExpression.ts +24 -0
- package/src/rules/utils/isUnsafeAssignment.ts +113 -0
- package/src/rules/utils/operators.ts +39 -0
- package/src/rules/variableDeletions.test.ts +76 -0
- package/src/rules/variableDeletions.ts +43 -0
- package/src/rules/voidOperator.test.ts +99 -0
- package/src/rules/voidOperator.ts +38 -0
- package/src/utils/declarationIncludesGlobal.ts +9 -0
- package/src/utils/declarationsIncludeGlobal.ts +7 -0
- package/src/utils/getModifyingReferences.ts +58 -0
- package/src/utils/hasSameTokens.ts +45 -0
- package/src/utils/isGlobalDeclaration.ts +12 -0
- package/src/utils/isGlobalDeclarationOfName.ts +51 -0
- package/src/utils/isGlobalVariable.ts +30 -0
- package/src/utils/unwrapParentParenthesizedExpressions.ts +7 -0
- package/src/utils/unwrapParenthesizedExpression.ts +9 -0
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import rule from "./classAssignments.js";
|
|
2
|
+
import { ruleTester } from "./ruleTester.js";
|
|
3
|
+
|
|
4
|
+
ruleTester.describe(rule, {
|
|
5
|
+
invalid: [
|
|
6
|
+
{
|
|
7
|
+
code: `
|
|
8
|
+
class A {}
|
|
9
|
+
A = 0;
|
|
10
|
+
`,
|
|
11
|
+
snapshot: `
|
|
12
|
+
class A {}
|
|
13
|
+
A = 0;
|
|
14
|
+
~
|
|
15
|
+
Reassigning a class declaration is misleading and makes the class harder to use.
|
|
16
|
+
`,
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
code: `
|
|
20
|
+
class MyClass {}
|
|
21
|
+
MyClass = "string";
|
|
22
|
+
`,
|
|
23
|
+
snapshot: `
|
|
24
|
+
class MyClass {}
|
|
25
|
+
MyClass = "string";
|
|
26
|
+
~~~~~~~
|
|
27
|
+
Reassigning a class declaration is misleading and makes the class harder to use.
|
|
28
|
+
`,
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
code: `
|
|
32
|
+
class Counter {}
|
|
33
|
+
Counter++;
|
|
34
|
+
`,
|
|
35
|
+
snapshot: `
|
|
36
|
+
class Counter {}
|
|
37
|
+
Counter++;
|
|
38
|
+
~~~~~~~
|
|
39
|
+
Reassigning a class declaration is misleading and makes the class harder to use.
|
|
40
|
+
`,
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
code: `
|
|
44
|
+
class Value {}
|
|
45
|
+
++Value;
|
|
46
|
+
`,
|
|
47
|
+
snapshot: `
|
|
48
|
+
class Value {}
|
|
49
|
+
++Value;
|
|
50
|
+
~~~~~
|
|
51
|
+
Reassigning a class declaration is misleading and makes the class harder to use.
|
|
52
|
+
`,
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
code: `
|
|
56
|
+
class MyClass {}
|
|
57
|
+
MyClass += "suffix";
|
|
58
|
+
`,
|
|
59
|
+
snapshot: `
|
|
60
|
+
class MyClass {}
|
|
61
|
+
MyClass += "suffix";
|
|
62
|
+
~~~~~~~
|
|
63
|
+
Reassigning a class declaration is misleading and makes the class harder to use.
|
|
64
|
+
`,
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
code: `
|
|
68
|
+
class Example {}
|
|
69
|
+
Example ??= null;
|
|
70
|
+
`,
|
|
71
|
+
snapshot: `
|
|
72
|
+
class Example {}
|
|
73
|
+
Example ??= null;
|
|
74
|
+
~~~~~~~
|
|
75
|
+
Reassigning a class declaration is misleading and makes the class harder to use.
|
|
76
|
+
`,
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
code: `
|
|
80
|
+
class Test {}
|
|
81
|
+
Test &&= false;
|
|
82
|
+
`,
|
|
83
|
+
snapshot: `
|
|
84
|
+
class Test {}
|
|
85
|
+
Test &&= false;
|
|
86
|
+
~~~~
|
|
87
|
+
Reassigning a class declaration is misleading and makes the class harder to use.
|
|
88
|
+
`,
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
code: `
|
|
92
|
+
class Data {}
|
|
93
|
+
Data ||= null;
|
|
94
|
+
`,
|
|
95
|
+
snapshot: `
|
|
96
|
+
class Data {}
|
|
97
|
+
Data ||= null;
|
|
98
|
+
~~~~
|
|
99
|
+
Reassigning a class declaration is misleading and makes the class harder to use.
|
|
100
|
+
`,
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
code: `
|
|
104
|
+
class Outer {}
|
|
105
|
+
function inner() {
|
|
106
|
+
Outer = null;
|
|
107
|
+
}
|
|
108
|
+
`,
|
|
109
|
+
snapshot: `
|
|
110
|
+
class Outer {}
|
|
111
|
+
function inner() {
|
|
112
|
+
Outer = null;
|
|
113
|
+
~~~~~
|
|
114
|
+
Reassigning a class declaration is misleading and makes the class harder to use.
|
|
115
|
+
}
|
|
116
|
+
`,
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
code: `
|
|
120
|
+
class MyClass {}
|
|
121
|
+
if (true) {
|
|
122
|
+
MyClass = null;
|
|
123
|
+
}
|
|
124
|
+
`,
|
|
125
|
+
snapshot: `
|
|
126
|
+
class MyClass {}
|
|
127
|
+
if (true) {
|
|
128
|
+
MyClass = null;
|
|
129
|
+
~~~~~~~
|
|
130
|
+
Reassigning a class declaration is misleading and makes the class harder to use.
|
|
131
|
+
}
|
|
132
|
+
`,
|
|
133
|
+
},
|
|
134
|
+
],
|
|
135
|
+
valid: [
|
|
136
|
+
`class A {}`,
|
|
137
|
+
`class MyClass {} const instance = new MyClass();`,
|
|
138
|
+
`class Counter {} const value = Counter;`,
|
|
139
|
+
`class Example {} if (Example) { console.log(Example); }`,
|
|
140
|
+
`const A = 0;`,
|
|
141
|
+
`class A {} function inner() { const A = "shadowed"; A = "reassigning shadowed is ok"; }`,
|
|
142
|
+
`let A = "outer"; class A {} A = "reassigning outer is ok";`,
|
|
143
|
+
`
|
|
144
|
+
class MyClass {}
|
|
145
|
+
const derived = class extends MyClass {};
|
|
146
|
+
`,
|
|
147
|
+
`
|
|
148
|
+
class Base {}
|
|
149
|
+
class Derived extends Base {}
|
|
150
|
+
`,
|
|
151
|
+
`
|
|
152
|
+
class MyClass {}
|
|
153
|
+
const instance = new MyClass();
|
|
154
|
+
instance.property = "value";
|
|
155
|
+
`,
|
|
156
|
+
],
|
|
157
|
+
});
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { typescriptLanguage } from "../language.js";
|
|
2
|
+
import { getModifyingReferences } from "../utils/getModifyingReferences.js";
|
|
3
|
+
|
|
4
|
+
export default typescriptLanguage.createRule({
|
|
5
|
+
about: {
|
|
6
|
+
description: "Reports reassigning class declarations.",
|
|
7
|
+
id: "classAssignments",
|
|
8
|
+
preset: "untyped",
|
|
9
|
+
},
|
|
10
|
+
messages: {
|
|
11
|
+
noClassAssign: {
|
|
12
|
+
primary:
|
|
13
|
+
"Reassigning a class declaration is misleading and makes the class harder to use.",
|
|
14
|
+
secondary: [
|
|
15
|
+
"Reassigning a class declaration can lead to unexpected behavior and makes code harder to understand.",
|
|
16
|
+
"Class declarations are typically intended to be immutable references, and reassigning them can cause confusion about which class is being used.",
|
|
17
|
+
],
|
|
18
|
+
suggestions: [
|
|
19
|
+
"Use a different variable name if you need to store a modified reference to a class.",
|
|
20
|
+
],
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
setup(context) {
|
|
24
|
+
return {
|
|
25
|
+
visitors: {
|
|
26
|
+
ClassDeclaration: (node) => {
|
|
27
|
+
if (!node.name) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const modifyingReferences = getModifyingReferences(
|
|
32
|
+
node.name,
|
|
33
|
+
context.sourceFile,
|
|
34
|
+
context.typeChecker,
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
for (const reference of modifyingReferences) {
|
|
38
|
+
context.report({
|
|
39
|
+
message: "noClassAssign",
|
|
40
|
+
range: {
|
|
41
|
+
begin: reference.getStart(context.sourceFile),
|
|
42
|
+
end: reference.getEnd(),
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
},
|
|
50
|
+
});
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import rule from "./constantAssignments.js";
|
|
2
|
+
import { ruleTester } from "./ruleTester.js";
|
|
3
|
+
|
|
4
|
+
ruleTester.describe(rule, {
|
|
5
|
+
invalid: [
|
|
6
|
+
{
|
|
7
|
+
code: `
|
|
8
|
+
const value = 1;
|
|
9
|
+
value = 2;
|
|
10
|
+
`,
|
|
11
|
+
snapshot: `
|
|
12
|
+
const value = 1;
|
|
13
|
+
value = 2;
|
|
14
|
+
~~~~~
|
|
15
|
+
Variables declared with const cannot be reassigned; use let or var instead if reassignment is needed.
|
|
16
|
+
`,
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
code: `
|
|
20
|
+
const result = getValue();
|
|
21
|
+
result = getOtherValue();
|
|
22
|
+
`,
|
|
23
|
+
snapshot: `
|
|
24
|
+
const result = getValue();
|
|
25
|
+
result = getOtherValue();
|
|
26
|
+
~~~~~~
|
|
27
|
+
Variables declared with const cannot be reassigned; use let or var instead if reassignment is needed.
|
|
28
|
+
`,
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
code: `
|
|
32
|
+
const counter = 0;
|
|
33
|
+
counter++;
|
|
34
|
+
`,
|
|
35
|
+
snapshot: `
|
|
36
|
+
const counter = 0;
|
|
37
|
+
counter++;
|
|
38
|
+
~~~~~~~
|
|
39
|
+
Variables declared with const cannot be reassigned; use let or var instead if reassignment is needed.
|
|
40
|
+
`,
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
code: `
|
|
44
|
+
const counter = 0;
|
|
45
|
+
++counter;
|
|
46
|
+
`,
|
|
47
|
+
snapshot: `
|
|
48
|
+
const counter = 0;
|
|
49
|
+
++counter;
|
|
50
|
+
~~~~~~~
|
|
51
|
+
Variables declared with const cannot be reassigned; use let or var instead if reassignment is needed.
|
|
52
|
+
`,
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
code: `
|
|
56
|
+
const total = 0;
|
|
57
|
+
total += 5;
|
|
58
|
+
`,
|
|
59
|
+
snapshot: `
|
|
60
|
+
const total = 0;
|
|
61
|
+
total += 5;
|
|
62
|
+
~~~~~
|
|
63
|
+
Variables declared with const cannot be reassigned; use let or var instead if reassignment is needed.
|
|
64
|
+
`,
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
code: `
|
|
68
|
+
const value = 10;
|
|
69
|
+
value -= 3;
|
|
70
|
+
`,
|
|
71
|
+
snapshot: `
|
|
72
|
+
const value = 10;
|
|
73
|
+
value -= 3;
|
|
74
|
+
~~~~~
|
|
75
|
+
Variables declared with const cannot be reassigned; use let or var instead if reassignment is needed.
|
|
76
|
+
`,
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
code: `
|
|
80
|
+
const { property } = object;
|
|
81
|
+
property = "new value";
|
|
82
|
+
`,
|
|
83
|
+
snapshot: `
|
|
84
|
+
const { property } = object;
|
|
85
|
+
property = "new value";
|
|
86
|
+
~~~~~~~~
|
|
87
|
+
Variables declared with const cannot be reassigned; use let or var instead if reassignment is needed.
|
|
88
|
+
`,
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
code: `
|
|
92
|
+
const [first, second] = array;
|
|
93
|
+
first = 100;
|
|
94
|
+
`,
|
|
95
|
+
snapshot: `
|
|
96
|
+
const [first, second] = array;
|
|
97
|
+
first = 100;
|
|
98
|
+
~~~~~
|
|
99
|
+
Variables declared with const cannot be reassigned; use let or var instead if reassignment is needed.
|
|
100
|
+
`,
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
code: `
|
|
104
|
+
const { nested: { deep } } = object;
|
|
105
|
+
deep = "modified";
|
|
106
|
+
`,
|
|
107
|
+
snapshot: `
|
|
108
|
+
const { nested: { deep } } = object;
|
|
109
|
+
deep = "modified";
|
|
110
|
+
~~~~
|
|
111
|
+
Variables declared with const cannot be reassigned; use let or var instead if reassignment is needed.
|
|
112
|
+
`,
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
code: `
|
|
116
|
+
const [first, ...rest] = array;
|
|
117
|
+
rest = [];
|
|
118
|
+
`,
|
|
119
|
+
snapshot: `
|
|
120
|
+
const [first, ...rest] = array;
|
|
121
|
+
rest = [];
|
|
122
|
+
~~~~
|
|
123
|
+
Variables declared with const cannot be reassigned; use let or var instead if reassignment is needed.
|
|
124
|
+
`,
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
code: `
|
|
128
|
+
for (const item of items) {
|
|
129
|
+
item = processItem(item);
|
|
130
|
+
}
|
|
131
|
+
`,
|
|
132
|
+
snapshot: `
|
|
133
|
+
for (const item of items) {
|
|
134
|
+
item = processItem(item);
|
|
135
|
+
~~~~
|
|
136
|
+
Variables declared with const cannot be reassigned; use let or var instead if reassignment is needed.
|
|
137
|
+
}
|
|
138
|
+
`,
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
code: `
|
|
142
|
+
function process() {
|
|
143
|
+
const value = 1;
|
|
144
|
+
value = 2;
|
|
145
|
+
}
|
|
146
|
+
`,
|
|
147
|
+
snapshot: `
|
|
148
|
+
function process() {
|
|
149
|
+
const value = 1;
|
|
150
|
+
value = 2;
|
|
151
|
+
~~~~~
|
|
152
|
+
Variables declared with const cannot be reassigned; use let or var instead if reassignment is needed.
|
|
153
|
+
}
|
|
154
|
+
`,
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
code: `
|
|
158
|
+
const data = getData();
|
|
159
|
+
if (condition) {
|
|
160
|
+
data = getOtherData();
|
|
161
|
+
}
|
|
162
|
+
`,
|
|
163
|
+
snapshot: `
|
|
164
|
+
const data = getData();
|
|
165
|
+
if (condition) {
|
|
166
|
+
data = getOtherData();
|
|
167
|
+
~~~~
|
|
168
|
+
Variables declared with const cannot be reassigned; use let or var instead if reassignment is needed.
|
|
169
|
+
}
|
|
170
|
+
`,
|
|
171
|
+
},
|
|
172
|
+
],
|
|
173
|
+
valid: [
|
|
174
|
+
`const value = 1;`,
|
|
175
|
+
`const result = getValue();`,
|
|
176
|
+
`let value = 1; value = 2;`,
|
|
177
|
+
`var value = 1; value = 2;`,
|
|
178
|
+
`const object = {}; object.property = "value";`,
|
|
179
|
+
`const array = []; array.push(1);`,
|
|
180
|
+
`const object = { value: 1 }; object.value = 2;`,
|
|
181
|
+
`const array = [1, 2, 3]; array[0] = 4;`,
|
|
182
|
+
`const value = 1; console.log(value);`,
|
|
183
|
+
`const { property } = object; console.log(property);`,
|
|
184
|
+
`const [first, second] = array; console.log(first);`,
|
|
185
|
+
`for (let item of items) { item = processItem(item); }`,
|
|
186
|
+
`for (const item of items) { console.log(item); }`,
|
|
187
|
+
`
|
|
188
|
+
const outer = 1;
|
|
189
|
+
function inner() {
|
|
190
|
+
const outer = 2;
|
|
191
|
+
return outer;
|
|
192
|
+
}
|
|
193
|
+
`,
|
|
194
|
+
`
|
|
195
|
+
const value = 1;
|
|
196
|
+
{
|
|
197
|
+
const value = 2;
|
|
198
|
+
console.log(value);
|
|
199
|
+
}
|
|
200
|
+
`,
|
|
201
|
+
`
|
|
202
|
+
function process(value: number) {
|
|
203
|
+
const result = value * 2;
|
|
204
|
+
return result;
|
|
205
|
+
}
|
|
206
|
+
`,
|
|
207
|
+
`
|
|
208
|
+
const calculate = (input: number) => {
|
|
209
|
+
const result = input + 10;
|
|
210
|
+
return result;
|
|
211
|
+
};
|
|
212
|
+
`,
|
|
213
|
+
`
|
|
214
|
+
class MyClass {
|
|
215
|
+
method() {
|
|
216
|
+
const value = 0;
|
|
217
|
+
return value;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
`,
|
|
221
|
+
],
|
|
222
|
+
});
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import * as ts from "typescript";
|
|
2
|
+
|
|
3
|
+
import { typescriptLanguage } from "../language.js";
|
|
4
|
+
import { getModifyingReferences } from "../utils/getModifyingReferences.js";
|
|
5
|
+
|
|
6
|
+
export default typescriptLanguage.createRule({
|
|
7
|
+
about: {
|
|
8
|
+
description:
|
|
9
|
+
"Reports attempting to reassign variables declared with const.",
|
|
10
|
+
id: "constantAssignments",
|
|
11
|
+
preset: "untyped",
|
|
12
|
+
},
|
|
13
|
+
messages: {
|
|
14
|
+
noConstAssign: {
|
|
15
|
+
primary:
|
|
16
|
+
"Variables declared with const cannot be reassigned; use let or var instead if reassignment is needed.",
|
|
17
|
+
secondary: [
|
|
18
|
+
"The const keyword creates a read-only reference to a value, preventing reassignment.",
|
|
19
|
+
"While properties of const objects and elements of const arrays can be mutated, the binding itself cannot be reassigned.",
|
|
20
|
+
],
|
|
21
|
+
suggestions: [
|
|
22
|
+
"Use let instead of const if you need to reassign the variable.",
|
|
23
|
+
],
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
setup(context) {
|
|
27
|
+
function collectBindingElements(name: ts.BindingName): ts.Identifier[] {
|
|
28
|
+
if (ts.isIdentifier(name)) {
|
|
29
|
+
return [name];
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const identifiers: ts.Identifier[] = [];
|
|
33
|
+
|
|
34
|
+
for (const element of name.elements) {
|
|
35
|
+
if (ts.isBindingElement(element)) {
|
|
36
|
+
identifiers.push(...collectBindingElements(element.name));
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return identifiers;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return {
|
|
44
|
+
visitors: {
|
|
45
|
+
VariableDeclarationList: (node) => {
|
|
46
|
+
if (
|
|
47
|
+
!(node.flags & ts.NodeFlags.Const) ||
|
|
48
|
+
node.declarations.length === 0
|
|
49
|
+
) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
for (const declaration of node.declarations) {
|
|
54
|
+
const identifiers = collectBindingElements(declaration.name);
|
|
55
|
+
|
|
56
|
+
for (const identifier of identifiers) {
|
|
57
|
+
const modifyingReferences = getModifyingReferences(
|
|
58
|
+
identifier,
|
|
59
|
+
context.sourceFile,
|
|
60
|
+
context.typeChecker,
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
for (const reference of modifyingReferences) {
|
|
64
|
+
context.report({
|
|
65
|
+
message: "noConstAssign",
|
|
66
|
+
range: {
|
|
67
|
+
begin: reference.getStart(context.sourceFile),
|
|
68
|
+
end: reference.getEnd(),
|
|
69
|
+
},
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
},
|
|
78
|
+
});
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import rule from "./constructorReturns.js";
|
|
2
|
+
import { ruleTester } from "./ruleTester.js";
|
|
3
|
+
|
|
4
|
+
ruleTester.describe(rule, {
|
|
5
|
+
invalid: [
|
|
6
|
+
{
|
|
7
|
+
code: `
|
|
8
|
+
class Example {
|
|
9
|
+
constructor() {
|
|
10
|
+
return {};
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
`,
|
|
14
|
+
snapshot: `
|
|
15
|
+
class Example {
|
|
16
|
+
constructor() {
|
|
17
|
+
return {};
|
|
18
|
+
~~~~~~~~~~
|
|
19
|
+
Returning a value from a constructor function overrides the newly created instance.
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
`,
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
code: `
|
|
26
|
+
class Example {
|
|
27
|
+
constructor() {
|
|
28
|
+
return { value: 1 };
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
`,
|
|
32
|
+
snapshot: `
|
|
33
|
+
class Example {
|
|
34
|
+
constructor() {
|
|
35
|
+
return { value: 1 };
|
|
36
|
+
~~~~~~~~~~~~~~~~~~~~
|
|
37
|
+
Returning a value from a constructor function overrides the newly created instance.
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
`,
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
code: `
|
|
44
|
+
class Example {
|
|
45
|
+
constructor() {
|
|
46
|
+
if (condition) {
|
|
47
|
+
return new OtherClass();
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
`,
|
|
52
|
+
snapshot: `
|
|
53
|
+
class Example {
|
|
54
|
+
constructor() {
|
|
55
|
+
if (condition) {
|
|
56
|
+
return new OtherClass();
|
|
57
|
+
~~~~~~~~~~~~~~~~~~~~~~~~
|
|
58
|
+
Returning a value from a constructor function overrides the newly created instance.
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
`,
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
code: `
|
|
66
|
+
class Example {
|
|
67
|
+
constructor(value: number) {
|
|
68
|
+
if (value < 0) {
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
this.value = value;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
`,
|
|
75
|
+
snapshot: `
|
|
76
|
+
class Example {
|
|
77
|
+
constructor(value: number) {
|
|
78
|
+
if (value < 0) {
|
|
79
|
+
return null;
|
|
80
|
+
~~~~~~~~~~~~
|
|
81
|
+
Returning a value from a constructor function overrides the newly created instance.
|
|
82
|
+
}
|
|
83
|
+
this.value = value;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
`,
|
|
87
|
+
},
|
|
88
|
+
],
|
|
89
|
+
valid: [
|
|
90
|
+
`class Example { constructor() {} }`,
|
|
91
|
+
`class Example { constructor() { this.value = 1; } }`,
|
|
92
|
+
`class Example { constructor() { return; } }`,
|
|
93
|
+
`class Example { constructor() { if (condition) { return; } this.value = 1; } }`,
|
|
94
|
+
`class Example { constructor() { const factory = () => { return {}; }; } }`,
|
|
95
|
+
`class Example { constructor() { function helper() { return 1; } } }`,
|
|
96
|
+
],
|
|
97
|
+
});
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import * as tsutils from "ts-api-utils";
|
|
2
|
+
import * as ts from "typescript";
|
|
3
|
+
|
|
4
|
+
import { typescriptLanguage } from "../language.js";
|
|
5
|
+
|
|
6
|
+
export default typescriptLanguage.createRule({
|
|
7
|
+
about: {
|
|
8
|
+
description: "Reports returning values from constructor functions.",
|
|
9
|
+
id: "constructorReturns",
|
|
10
|
+
preset: "untyped",
|
|
11
|
+
},
|
|
12
|
+
messages: {
|
|
13
|
+
noConstructorReturn: {
|
|
14
|
+
primary:
|
|
15
|
+
"Returning a value from a constructor function overrides the newly created instance.",
|
|
16
|
+
secondary: [
|
|
17
|
+
"This behavior is often unintentional and can lead to unexpected results.",
|
|
18
|
+
"If you need to return a different object, consider using a factory function instead.",
|
|
19
|
+
],
|
|
20
|
+
suggestions: [
|
|
21
|
+
"Remove the return statement, or return without a value to exit early.",
|
|
22
|
+
],
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
setup(context) {
|
|
26
|
+
return {
|
|
27
|
+
visitors: {
|
|
28
|
+
Constructor: (node) => {
|
|
29
|
+
if (!node.body) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function checkForReturnStatements(node: ts.Node): void {
|
|
34
|
+
if (ts.isReturnStatement(node)) {
|
|
35
|
+
if (node.expression) {
|
|
36
|
+
context.report({
|
|
37
|
+
message: "noConstructorReturn",
|
|
38
|
+
range: {
|
|
39
|
+
begin: node.getStart(context.sourceFile),
|
|
40
|
+
end: node.getEnd(),
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if (tsutils.isFunctionScopeBoundary(node)) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
ts.forEachChild(node, checkForReturnStatements);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
ts.forEachChild(node.body, checkForReturnStatements);
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
},
|
|
59
|
+
});
|