@flint.fyi/ts 0.14.1 → 0.14.3
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 +15 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.js +1 -0
- package/lib/nodes.d.ts +1 -0
- package/lib/plugin.d.ts +132 -4
- package/lib/plugin.js +69 -1
- 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/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/debuggerStatements.d.ts +6 -0
- package/lib/rules/debuggerStatements.js +43 -0
- package/lib/rules/debuggerStatements.test.d.ts +1 -0
- package/lib/rules/debuggerStatements.test.js +80 -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/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/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/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 +83 -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/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/octalEscapes.d.ts +6 -0
- package/lib/rules/octalEscapes.js +71 -0
- package/lib/rules/octalEscapes.test.d.ts +1 -0
- package/lib/rules/octalEscapes.test.js +213 -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/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/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/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/declarationsIncludeGlobal.d.ts +2 -0
- package/lib/utils/declarationsIncludeGlobal.js +7 -0
- package/lib/utils/getModifyingReferences.d.ts +8 -0
- package/lib/utils/getModifyingReferences.js +42 -0
- package/lib/utils/isGlobalDeclaration.d.ts +2 -0
- package/lib/utils/isGlobalDeclaration.js +5 -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/index.ts +1 -0
- package/src/nodes.ts +1 -0
- package/src/plugin.ts +69 -1
- 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/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/debuggerStatements.test.ts +81 -0
- package/src/rules/debuggerStatements.ts +45 -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/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/functionAssignments.test.ts +210 -0
- package/src/rules/functionAssignments.ts +51 -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 +106 -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/objectProto.test.ts +97 -0
- package/src/rules/objectProto.ts +62 -0
- package/src/rules/octalEscapes.test.ts +214 -0
- package/src/rules/octalEscapes.ts +85 -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/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/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/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/declarationsIncludeGlobal.ts +11 -0
- package/src/utils/getModifyingReferences.ts +58 -0
- package/src/utils/isGlobalDeclaration.ts +12 -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,264 @@
|
|
|
1
|
+
import rule from "./exceptionAssignments.js";
|
|
2
|
+
import { ruleTester } from "./ruleTester.js";
|
|
3
|
+
ruleTester.describe(rule, {
|
|
4
|
+
invalid: [
|
|
5
|
+
{
|
|
6
|
+
code: `
|
|
7
|
+
try {
|
|
8
|
+
doSomething();
|
|
9
|
+
} catch (error) {
|
|
10
|
+
error = new Error("Different error");
|
|
11
|
+
}
|
|
12
|
+
`,
|
|
13
|
+
snapshot: `
|
|
14
|
+
try {
|
|
15
|
+
doSomething();
|
|
16
|
+
} catch (error) {
|
|
17
|
+
error = new Error("Different error");
|
|
18
|
+
~~~~~
|
|
19
|
+
Exception parameters in catch clauses should not be reassigned.
|
|
20
|
+
}
|
|
21
|
+
`,
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
code: `
|
|
25
|
+
try {
|
|
26
|
+
doSomething();
|
|
27
|
+
} catch (exception) {
|
|
28
|
+
exception = null;
|
|
29
|
+
}
|
|
30
|
+
`,
|
|
31
|
+
snapshot: `
|
|
32
|
+
try {
|
|
33
|
+
doSomething();
|
|
34
|
+
} catch (exception) {
|
|
35
|
+
exception = null;
|
|
36
|
+
~~~~~~~~~
|
|
37
|
+
Exception parameters in catch clauses should not be reassigned.
|
|
38
|
+
}
|
|
39
|
+
`,
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
code: `
|
|
43
|
+
try {
|
|
44
|
+
doSomething();
|
|
45
|
+
} catch (error) {
|
|
46
|
+
error++;
|
|
47
|
+
}
|
|
48
|
+
`,
|
|
49
|
+
snapshot: `
|
|
50
|
+
try {
|
|
51
|
+
doSomething();
|
|
52
|
+
} catch (error) {
|
|
53
|
+
error++;
|
|
54
|
+
~~~~~
|
|
55
|
+
Exception parameters in catch clauses should not be reassigned.
|
|
56
|
+
}
|
|
57
|
+
`,
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
code: `
|
|
61
|
+
try {
|
|
62
|
+
doSomething();
|
|
63
|
+
} catch (error) {
|
|
64
|
+
++error;
|
|
65
|
+
}
|
|
66
|
+
`,
|
|
67
|
+
snapshot: `
|
|
68
|
+
try {
|
|
69
|
+
doSomething();
|
|
70
|
+
} catch (error) {
|
|
71
|
+
++error;
|
|
72
|
+
~~~~~
|
|
73
|
+
Exception parameters in catch clauses should not be reassigned.
|
|
74
|
+
}
|
|
75
|
+
`,
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
code: `
|
|
79
|
+
try {
|
|
80
|
+
doSomething();
|
|
81
|
+
} catch (error) {
|
|
82
|
+
error += "additional info";
|
|
83
|
+
}
|
|
84
|
+
`,
|
|
85
|
+
snapshot: `
|
|
86
|
+
try {
|
|
87
|
+
doSomething();
|
|
88
|
+
} catch (error) {
|
|
89
|
+
error += "additional info";
|
|
90
|
+
~~~~~
|
|
91
|
+
Exception parameters in catch clauses should not be reassigned.
|
|
92
|
+
}
|
|
93
|
+
`,
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
code: `
|
|
97
|
+
try {
|
|
98
|
+
doSomething();
|
|
99
|
+
} catch (error) {
|
|
100
|
+
error ??= new Error("default error");
|
|
101
|
+
}
|
|
102
|
+
`,
|
|
103
|
+
snapshot: `
|
|
104
|
+
try {
|
|
105
|
+
doSomething();
|
|
106
|
+
} catch (error) {
|
|
107
|
+
error ??= new Error("default error");
|
|
108
|
+
~~~~~
|
|
109
|
+
Exception parameters in catch clauses should not be reassigned.
|
|
110
|
+
}
|
|
111
|
+
`,
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
code: `
|
|
115
|
+
try {
|
|
116
|
+
doSomething();
|
|
117
|
+
} catch (error) {
|
|
118
|
+
error &&= false;
|
|
119
|
+
}
|
|
120
|
+
`,
|
|
121
|
+
snapshot: `
|
|
122
|
+
try {
|
|
123
|
+
doSomething();
|
|
124
|
+
} catch (error) {
|
|
125
|
+
error &&= false;
|
|
126
|
+
~~~~~
|
|
127
|
+
Exception parameters in catch clauses should not be reassigned.
|
|
128
|
+
}
|
|
129
|
+
`,
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
code: `
|
|
133
|
+
try {
|
|
134
|
+
doSomething();
|
|
135
|
+
} catch (error) {
|
|
136
|
+
error ||= new Error("fallback");
|
|
137
|
+
}
|
|
138
|
+
`,
|
|
139
|
+
snapshot: `
|
|
140
|
+
try {
|
|
141
|
+
doSomething();
|
|
142
|
+
} catch (error) {
|
|
143
|
+
error ||= new Error("fallback");
|
|
144
|
+
~~~~~
|
|
145
|
+
Exception parameters in catch clauses should not be reassigned.
|
|
146
|
+
}
|
|
147
|
+
`,
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
code: `
|
|
151
|
+
try {
|
|
152
|
+
doSomething();
|
|
153
|
+
} catch (error) {
|
|
154
|
+
function inner() {
|
|
155
|
+
error = "reassigned in nested function";
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
`,
|
|
159
|
+
snapshot: `
|
|
160
|
+
try {
|
|
161
|
+
doSomething();
|
|
162
|
+
} catch (error) {
|
|
163
|
+
function inner() {
|
|
164
|
+
error = "reassigned in nested function";
|
|
165
|
+
~~~~~
|
|
166
|
+
Exception parameters in catch clauses should not be reassigned.
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
`,
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
code: `
|
|
173
|
+
try {
|
|
174
|
+
doSomething();
|
|
175
|
+
} catch ({ message }) {
|
|
176
|
+
message = "reassigned destructured parameter";
|
|
177
|
+
}
|
|
178
|
+
`,
|
|
179
|
+
snapshot: `
|
|
180
|
+
try {
|
|
181
|
+
doSomething();
|
|
182
|
+
} catch ({ message }) {
|
|
183
|
+
message = "reassigned destructured parameter";
|
|
184
|
+
~~~~~~~
|
|
185
|
+
Exception parameters in catch clauses should not be reassigned.
|
|
186
|
+
}
|
|
187
|
+
`,
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
code: `
|
|
191
|
+
try {
|
|
192
|
+
doSomething();
|
|
193
|
+
} catch ({ message, code }) {
|
|
194
|
+
code = 500;
|
|
195
|
+
}
|
|
196
|
+
`,
|
|
197
|
+
snapshot: `
|
|
198
|
+
try {
|
|
199
|
+
doSomething();
|
|
200
|
+
} catch ({ message, code }) {
|
|
201
|
+
code = 500;
|
|
202
|
+
~~~~
|
|
203
|
+
Exception parameters in catch clauses should not be reassigned.
|
|
204
|
+
}
|
|
205
|
+
`,
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
code: `
|
|
209
|
+
try {
|
|
210
|
+
doSomething();
|
|
211
|
+
} catch ([first, second]) {
|
|
212
|
+
first = "reassigned array destructured parameter";
|
|
213
|
+
}
|
|
214
|
+
`,
|
|
215
|
+
snapshot: `
|
|
216
|
+
try {
|
|
217
|
+
doSomething();
|
|
218
|
+
} catch ([first, second]) {
|
|
219
|
+
first = "reassigned array destructured parameter";
|
|
220
|
+
~~~~~
|
|
221
|
+
Exception parameters in catch clauses should not be reassigned.
|
|
222
|
+
}
|
|
223
|
+
`,
|
|
224
|
+
},
|
|
225
|
+
],
|
|
226
|
+
valid: [
|
|
227
|
+
`try { doSomething(); } catch (error) { console.log(error); }`,
|
|
228
|
+
`try { doSomething(); } catch (error) { throw error; }`,
|
|
229
|
+
`try { doSomething(); } catch (error) { const message = error.message; }`,
|
|
230
|
+
`try { doSomething(); } catch (error) { if (error instanceof TypeError) { handle(); } }`,
|
|
231
|
+
`try { doSomething(); } catch { handleError(); }`,
|
|
232
|
+
`const error = new Error("test");`,
|
|
233
|
+
`
|
|
234
|
+
try {
|
|
235
|
+
doSomething();
|
|
236
|
+
} catch (error) {
|
|
237
|
+
const error = "shadowed variable";
|
|
238
|
+
console.log(error);
|
|
239
|
+
}
|
|
240
|
+
`,
|
|
241
|
+
`
|
|
242
|
+
try {
|
|
243
|
+
doSomething();
|
|
244
|
+
} catch (error) {
|
|
245
|
+
function inner() {
|
|
246
|
+
const error = "shadowed in function";
|
|
247
|
+
error = "reassigning shadowed variable is ok";
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
`,
|
|
251
|
+
`
|
|
252
|
+
let error = "outer";
|
|
253
|
+
try {
|
|
254
|
+
doSomething();
|
|
255
|
+
} catch (error) {
|
|
256
|
+
console.log(error);
|
|
257
|
+
}
|
|
258
|
+
error = "reassigning outer is ok";
|
|
259
|
+
`,
|
|
260
|
+
`try { doSomething(); } catch ({ message }) { console.log(message); }`,
|
|
261
|
+
`try { doSomething(); } catch ({ message, code }) { if (code === 404) { handle(); } }`,
|
|
262
|
+
`try { doSomething(); } catch ([first]) { console.log(first); }`,
|
|
263
|
+
],
|
|
264
|
+
});
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
declare const _default: import("@flint.fyi/core").Rule<{
|
|
2
|
+
readonly description: "Reports reassigning variables declared with function declarations.";
|
|
3
|
+
readonly id: "functionAssignments";
|
|
4
|
+
readonly preset: "untyped";
|
|
5
|
+
}, import("../nodes.js").TSNodesByName, import("../language.js").TypeScriptServices, "noFunctionAssignment", undefined>;
|
|
6
|
+
export default _default;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { typescriptLanguage } from "../language.js";
|
|
2
|
+
import { getModifyingReferences } from "../utils/getModifyingReferences.js";
|
|
3
|
+
export default typescriptLanguage.createRule({
|
|
4
|
+
about: {
|
|
5
|
+
description: "Reports reassigning variables declared with function declarations.",
|
|
6
|
+
id: "functionAssignments",
|
|
7
|
+
preset: "untyped",
|
|
8
|
+
},
|
|
9
|
+
messages: {
|
|
10
|
+
noFunctionAssignment: {
|
|
11
|
+
primary: "Variables declared with function declarations should not be reassigned.",
|
|
12
|
+
secondary: [
|
|
13
|
+
"Reassigning a function declaration can make code harder to understand and maintain.",
|
|
14
|
+
"Function declarations are hoisted to the top of their scope, and reassigning them can lead to unexpected behavior.",
|
|
15
|
+
],
|
|
16
|
+
suggestions: [
|
|
17
|
+
"Use a function expression or const variable instead if you need to reassign the function.",
|
|
18
|
+
],
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
setup(context) {
|
|
22
|
+
return {
|
|
23
|
+
visitors: {
|
|
24
|
+
FunctionDeclaration: (node) => {
|
|
25
|
+
if (!node.name) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const modifyingReferences = getModifyingReferences(node.name, context.sourceFile, context.typeChecker);
|
|
29
|
+
for (const reference of modifyingReferences) {
|
|
30
|
+
context.report({
|
|
31
|
+
message: "noFunctionAssignment",
|
|
32
|
+
range: {
|
|
33
|
+
begin: reference.getStart(context.sourceFile),
|
|
34
|
+
end: reference.getEnd(),
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
},
|
|
42
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import rule from "./functionAssignments.js";
|
|
2
|
+
import { ruleTester } from "./ruleTester.js";
|
|
3
|
+
ruleTester.describe(rule, {
|
|
4
|
+
invalid: [
|
|
5
|
+
{
|
|
6
|
+
code: `
|
|
7
|
+
function myFunction() {}
|
|
8
|
+
myFunction = function() {};
|
|
9
|
+
`,
|
|
10
|
+
snapshot: `
|
|
11
|
+
function myFunction() {}
|
|
12
|
+
myFunction = function() {};
|
|
13
|
+
~~~~~~~~~~
|
|
14
|
+
Variables declared with function declarations should not be reassigned.
|
|
15
|
+
`,
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
code: `
|
|
19
|
+
function myFunction() {}
|
|
20
|
+
myFunction = 123;
|
|
21
|
+
`,
|
|
22
|
+
snapshot: `
|
|
23
|
+
function myFunction() {}
|
|
24
|
+
myFunction = 123;
|
|
25
|
+
~~~~~~~~~~
|
|
26
|
+
Variables declared with function declarations should not be reassigned.
|
|
27
|
+
`,
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
code: `
|
|
31
|
+
function myFunction() {}
|
|
32
|
+
myFunction += 1;
|
|
33
|
+
`,
|
|
34
|
+
snapshot: `
|
|
35
|
+
function myFunction() {}
|
|
36
|
+
myFunction += 1;
|
|
37
|
+
~~~~~~~~~~
|
|
38
|
+
Variables declared with function declarations should not be reassigned.
|
|
39
|
+
`,
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
code: `
|
|
43
|
+
function myFunction() {}
|
|
44
|
+
myFunction++;
|
|
45
|
+
`,
|
|
46
|
+
snapshot: `
|
|
47
|
+
function myFunction() {}
|
|
48
|
+
myFunction++;
|
|
49
|
+
~~~~~~~~~~
|
|
50
|
+
Variables declared with function declarations should not be reassigned.
|
|
51
|
+
`,
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
code: `
|
|
55
|
+
function myFunction() {}
|
|
56
|
+
++myFunction;
|
|
57
|
+
`,
|
|
58
|
+
snapshot: `
|
|
59
|
+
function myFunction() {}
|
|
60
|
+
++myFunction;
|
|
61
|
+
~~~~~~~~~~
|
|
62
|
+
Variables declared with function declarations should not be reassigned.
|
|
63
|
+
`,
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
code: `
|
|
67
|
+
function myFunction() {
|
|
68
|
+
return 42;
|
|
69
|
+
}
|
|
70
|
+
myFunction = () => 100;
|
|
71
|
+
`,
|
|
72
|
+
snapshot: `
|
|
73
|
+
function myFunction() {
|
|
74
|
+
return 42;
|
|
75
|
+
}
|
|
76
|
+
myFunction = () => 100;
|
|
77
|
+
~~~~~~~~~~
|
|
78
|
+
Variables declared with function declarations should not be reassigned.
|
|
79
|
+
`,
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
code: `
|
|
83
|
+
function outer() {
|
|
84
|
+
function inner() {}
|
|
85
|
+
inner = function() {};
|
|
86
|
+
}
|
|
87
|
+
`,
|
|
88
|
+
snapshot: `
|
|
89
|
+
function outer() {
|
|
90
|
+
function inner() {}
|
|
91
|
+
inner = function() {};
|
|
92
|
+
~~~~~
|
|
93
|
+
Variables declared with function declarations should not be reassigned.
|
|
94
|
+
}
|
|
95
|
+
`,
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
code: `
|
|
99
|
+
function myFunction() {}
|
|
100
|
+
if (condition) {
|
|
101
|
+
myFunction = null;
|
|
102
|
+
}
|
|
103
|
+
`,
|
|
104
|
+
snapshot: `
|
|
105
|
+
function myFunction() {}
|
|
106
|
+
if (condition) {
|
|
107
|
+
myFunction = null;
|
|
108
|
+
~~~~~~~~~~
|
|
109
|
+
Variables declared with function declarations should not be reassigned.
|
|
110
|
+
}
|
|
111
|
+
`,
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
code: `
|
|
115
|
+
function getValue() {
|
|
116
|
+
return 1;
|
|
117
|
+
}
|
|
118
|
+
getValue ??= function() { return 0; };
|
|
119
|
+
`,
|
|
120
|
+
snapshot: `
|
|
121
|
+
function getValue() {
|
|
122
|
+
return 1;
|
|
123
|
+
}
|
|
124
|
+
getValue ??= function() { return 0; };
|
|
125
|
+
~~~~~~~~
|
|
126
|
+
Variables declared with function declarations should not be reassigned.
|
|
127
|
+
`,
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
code: `
|
|
131
|
+
function getValue() {
|
|
132
|
+
return true;
|
|
133
|
+
}
|
|
134
|
+
getValue &&= false;
|
|
135
|
+
`,
|
|
136
|
+
snapshot: `
|
|
137
|
+
function getValue() {
|
|
138
|
+
return true;
|
|
139
|
+
}
|
|
140
|
+
getValue &&= false;
|
|
141
|
+
~~~~~~~~
|
|
142
|
+
Variables declared with function declarations should not be reassigned.
|
|
143
|
+
`,
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
code: `
|
|
147
|
+
function getValue() {
|
|
148
|
+
return false;
|
|
149
|
+
}
|
|
150
|
+
getValue ||= () => true;
|
|
151
|
+
`,
|
|
152
|
+
snapshot: `
|
|
153
|
+
function getValue() {
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
156
|
+
getValue ||= () => true;
|
|
157
|
+
~~~~~~~~
|
|
158
|
+
Variables declared with function declarations should not be reassigned.
|
|
159
|
+
`,
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
code: `
|
|
163
|
+
function calculate(value: number): number {
|
|
164
|
+
return value * 2;
|
|
165
|
+
}
|
|
166
|
+
calculate = (value: number) => value * 3;
|
|
167
|
+
`,
|
|
168
|
+
snapshot: `
|
|
169
|
+
function calculate(value: number): number {
|
|
170
|
+
return value * 2;
|
|
171
|
+
}
|
|
172
|
+
calculate = (value: number) => value * 3;
|
|
173
|
+
~~~~~~~~~
|
|
174
|
+
Variables declared with function declarations should not be reassigned.
|
|
175
|
+
`,
|
|
176
|
+
},
|
|
177
|
+
],
|
|
178
|
+
valid: [
|
|
179
|
+
`function myFunction() { return 42; }`,
|
|
180
|
+
`function myFunction() {} const result = myFunction();`,
|
|
181
|
+
`const myFunction = function() {}; myFunction = () => {};`,
|
|
182
|
+
`const myFunction = () => {}; myFunction = function() {};`,
|
|
183
|
+
`let myFunction = function() {}; myFunction = () => {};`,
|
|
184
|
+
`function outer() { const inner = function() {}; inner = () => {}; }`,
|
|
185
|
+
`
|
|
186
|
+
function outer() {
|
|
187
|
+
const myFunction = "shadowed variable";
|
|
188
|
+
myFunction = "reassigning shadowed variable is ok";
|
|
189
|
+
}
|
|
190
|
+
`,
|
|
191
|
+
`
|
|
192
|
+
let myFunction = "outer variable";
|
|
193
|
+
function scope() {
|
|
194
|
+
function myFunction() {}
|
|
195
|
+
console.log(myFunction);
|
|
196
|
+
}
|
|
197
|
+
myFunction = "reassigning outer is ok";
|
|
198
|
+
`,
|
|
199
|
+
`function myFunction() {} const copy = myFunction;`,
|
|
200
|
+
`function myFunction() {} if (condition) { callWith(myFunction); }`,
|
|
201
|
+
`
|
|
202
|
+
function myFunction() {
|
|
203
|
+
return function nested() {
|
|
204
|
+
return 42;
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
`,
|
|
208
|
+
],
|
|
209
|
+
});
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
declare const _default: import("@flint.fyi/core").Rule<{
|
|
2
|
+
readonly description: "Reports generator functions that do not yield values.";
|
|
3
|
+
readonly id: "generatorFunctionYields";
|
|
4
|
+
readonly preset: "logical";
|
|
5
|
+
}, import("../nodes.js").TSNodesByName, import("../language.js").TypeScriptServices, "missingYield", undefined>;
|
|
6
|
+
export default _default;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import * as tsutils from "ts-api-utils";
|
|
2
|
+
import * as ts from "typescript";
|
|
3
|
+
import { typescriptLanguage } from "../language.js";
|
|
4
|
+
export default typescriptLanguage.createRule({
|
|
5
|
+
about: {
|
|
6
|
+
description: "Reports generator functions that do not yield values.",
|
|
7
|
+
id: "generatorFunctionYields",
|
|
8
|
+
preset: "logical",
|
|
9
|
+
},
|
|
10
|
+
messages: {
|
|
11
|
+
missingYield: {
|
|
12
|
+
primary: "Generator functions must contain at least one yield expression to produce values.",
|
|
13
|
+
secondary: [
|
|
14
|
+
"Generator functions use the `function*` syntax to create iterators that can produce multiple values over time.",
|
|
15
|
+
"Without a yield expression, the generator will not produce any values and behaves like an empty iterator.",
|
|
16
|
+
"This is likely unintentional and indicates incomplete implementation or a misunderstanding of generator functions.",
|
|
17
|
+
],
|
|
18
|
+
suggestions: [
|
|
19
|
+
"Add a `yield` expression to produce values from the generator.",
|
|
20
|
+
"If the function should not be a generator, remove the asterisk (`*`) from the function declaration.",
|
|
21
|
+
],
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
setup(context) {
|
|
25
|
+
return {
|
|
26
|
+
visitors: {
|
|
27
|
+
FunctionDeclaration: checkFunction,
|
|
28
|
+
FunctionExpression: checkFunction,
|
|
29
|
+
MethodDeclaration: checkFunction,
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
function checkFunction(node) {
|
|
33
|
+
if (!node.asteriskToken || !node.body || blockContainsYield(node.body)) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
context.report({
|
|
37
|
+
message: "missingYield",
|
|
38
|
+
range: {
|
|
39
|
+
begin: node.asteriskToken.getStart(context.sourceFile),
|
|
40
|
+
end: node.asteriskToken.getEnd(),
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
function blockContainsYield(block) {
|
|
47
|
+
function checkForYield(node) {
|
|
48
|
+
if (ts.isYieldExpression(node)) {
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
if (tsutils.isFunctionScopeBoundary(node)) {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
return ts.forEachChild(node, checkForYield);
|
|
55
|
+
}
|
|
56
|
+
return ts.forEachChild(block, checkForYield);
|
|
57
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|