@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,187 @@
|
|
|
1
|
+
import rule from "./emptyDestructures.js";
|
|
2
|
+
import { ruleTester } from "./ruleTester.js";
|
|
3
|
+
|
|
4
|
+
ruleTester.describe(rule, {
|
|
5
|
+
invalid: [
|
|
6
|
+
{
|
|
7
|
+
code: `
|
|
8
|
+
const {} = object;
|
|
9
|
+
`,
|
|
10
|
+
snapshot: `
|
|
11
|
+
const {} = object;
|
|
12
|
+
~~
|
|
13
|
+
Destructuring patterns that don't extract at least one value are unnecessary.
|
|
14
|
+
`,
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
code: `
|
|
18
|
+
const [] = array;
|
|
19
|
+
`,
|
|
20
|
+
snapshot: `
|
|
21
|
+
const [] = array;
|
|
22
|
+
~~
|
|
23
|
+
Destructuring patterns that don't extract at least one value are unnecessary.
|
|
24
|
+
`,
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
code: `
|
|
28
|
+
function process({}) {
|
|
29
|
+
console.log("processed");
|
|
30
|
+
}
|
|
31
|
+
`,
|
|
32
|
+
snapshot: `
|
|
33
|
+
function process({}) {
|
|
34
|
+
~~
|
|
35
|
+
Destructuring patterns that don't extract at least one value are unnecessary.
|
|
36
|
+
console.log("processed");
|
|
37
|
+
}
|
|
38
|
+
`,
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
code: `
|
|
42
|
+
function process([]) {
|
|
43
|
+
console.log("processed");
|
|
44
|
+
}
|
|
45
|
+
`,
|
|
46
|
+
snapshot: `
|
|
47
|
+
function process([]) {
|
|
48
|
+
~~
|
|
49
|
+
Destructuring patterns that don't extract at least one value are unnecessary.
|
|
50
|
+
console.log("processed");
|
|
51
|
+
}
|
|
52
|
+
`,
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
code: `
|
|
56
|
+
const process = ({}) => {
|
|
57
|
+
console.log("processed");
|
|
58
|
+
};
|
|
59
|
+
`,
|
|
60
|
+
snapshot: `
|
|
61
|
+
const process = ({}) => {
|
|
62
|
+
~~
|
|
63
|
+
Destructuring patterns that don't extract at least one value are unnecessary.
|
|
64
|
+
console.log("processed");
|
|
65
|
+
};
|
|
66
|
+
`,
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
code: `
|
|
70
|
+
const process = ([]) => {
|
|
71
|
+
console.log("processed");
|
|
72
|
+
};
|
|
73
|
+
`,
|
|
74
|
+
snapshot: `
|
|
75
|
+
const process = ([]) => {
|
|
76
|
+
~~
|
|
77
|
+
Destructuring patterns that don't extract at least one value are unnecessary.
|
|
78
|
+
console.log("processed");
|
|
79
|
+
};
|
|
80
|
+
`,
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
code: `
|
|
84
|
+
const { prop: {} } = object;
|
|
85
|
+
`,
|
|
86
|
+
snapshot: `
|
|
87
|
+
const { prop: {} } = object;
|
|
88
|
+
~~
|
|
89
|
+
Destructuring patterns that don't extract at least one value are unnecessary.
|
|
90
|
+
`,
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
code: `
|
|
94
|
+
const { prop: [] } = object;
|
|
95
|
+
`,
|
|
96
|
+
snapshot: `
|
|
97
|
+
const { prop: [] } = object;
|
|
98
|
+
~~
|
|
99
|
+
Destructuring patterns that don't extract at least one value are unnecessary.
|
|
100
|
+
`,
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
code: `
|
|
104
|
+
for (const {} of objects) {
|
|
105
|
+
console.log("iterating");
|
|
106
|
+
}
|
|
107
|
+
`,
|
|
108
|
+
snapshot: `
|
|
109
|
+
for (const {} of objects) {
|
|
110
|
+
~~
|
|
111
|
+
Destructuring patterns that don't extract at least one value are unnecessary.
|
|
112
|
+
console.log("iterating");
|
|
113
|
+
}
|
|
114
|
+
`,
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
code: `
|
|
118
|
+
for (const [] of arrays) {
|
|
119
|
+
console.log("iterating");
|
|
120
|
+
}
|
|
121
|
+
`,
|
|
122
|
+
snapshot: `
|
|
123
|
+
for (const [] of arrays) {
|
|
124
|
+
~~
|
|
125
|
+
Destructuring patterns that don't extract at least one value are unnecessary.
|
|
126
|
+
console.log("iterating");
|
|
127
|
+
}
|
|
128
|
+
`,
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
code: `
|
|
132
|
+
try {
|
|
133
|
+
doSomething();
|
|
134
|
+
} catch ({}) {
|
|
135
|
+
console.log("error");
|
|
136
|
+
}
|
|
137
|
+
`,
|
|
138
|
+
snapshot: `
|
|
139
|
+
try {
|
|
140
|
+
doSomething();
|
|
141
|
+
} catch ({}) {
|
|
142
|
+
~~
|
|
143
|
+
Destructuring patterns that don't extract at least one value are unnecessary.
|
|
144
|
+
console.log("error");
|
|
145
|
+
}
|
|
146
|
+
`,
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
code: `
|
|
150
|
+
try {
|
|
151
|
+
doSomething();
|
|
152
|
+
} catch ([]) {
|
|
153
|
+
console.log("error");
|
|
154
|
+
}
|
|
155
|
+
`,
|
|
156
|
+
snapshot: `
|
|
157
|
+
try {
|
|
158
|
+
doSomething();
|
|
159
|
+
} catch ([]) {
|
|
160
|
+
~~
|
|
161
|
+
Destructuring patterns that don't extract at least one value are unnecessary.
|
|
162
|
+
console.log("error");
|
|
163
|
+
}
|
|
164
|
+
`,
|
|
165
|
+
},
|
|
166
|
+
],
|
|
167
|
+
valid: [
|
|
168
|
+
`const { a } = object;`,
|
|
169
|
+
`const { a, b } = object;`,
|
|
170
|
+
`const [ a ] = array;`,
|
|
171
|
+
`const [ a, b ] = array;`,
|
|
172
|
+
`function process({ a }) { console.log(a); }`,
|
|
173
|
+
`function process([ a ]) { console.log(a); }`,
|
|
174
|
+
`const process = ({ a }) => console.log(a);`,
|
|
175
|
+
`const process = ([ a ]) => console.log(a);`,
|
|
176
|
+
`const { prop: { nested } } = object;`,
|
|
177
|
+
`const { prop: [ element ] } = object;`,
|
|
178
|
+
`for (const { value } of objects) { console.log(value); }`,
|
|
179
|
+
`for (const [ value ] of arrays) { console.log(value); }`,
|
|
180
|
+
`try { doSomething(); } catch ({ message }) { console.log(message); }`,
|
|
181
|
+
`try { doSomething(); } catch ([ first ]) { console.log(first); }`,
|
|
182
|
+
`const object = {};`,
|
|
183
|
+
`const array = [];`,
|
|
184
|
+
`function returnEmpty() { return {}; }`,
|
|
185
|
+
`function returnEmptyArray() { return []; }`,
|
|
186
|
+
],
|
|
187
|
+
});
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import * as ts from "typescript";
|
|
2
|
+
|
|
3
|
+
import { typescriptLanguage } from "../language.js";
|
|
4
|
+
|
|
5
|
+
export default typescriptLanguage.createRule({
|
|
6
|
+
about: {
|
|
7
|
+
description:
|
|
8
|
+
"Reports using empty destructuring patterns that destructure no values.",
|
|
9
|
+
id: "emptyDestructures",
|
|
10
|
+
preset: "logical",
|
|
11
|
+
},
|
|
12
|
+
messages: {
|
|
13
|
+
emptyPattern: {
|
|
14
|
+
primary:
|
|
15
|
+
"Destructuring patterns that don't extract at least one value are unnecessary.",
|
|
16
|
+
secondary: [
|
|
17
|
+
"Empty destructuring patterns like `{}` or `[]` don't extract any values and serve no practical purpose.",
|
|
18
|
+
"These patterns are likely mistakes or leftover code from refactoring.",
|
|
19
|
+
],
|
|
20
|
+
suggestions: [
|
|
21
|
+
"Remove the empty destructuring pattern if it's not needed.",
|
|
22
|
+
"Add bindings to extract values if you intended to destructure specific properties.",
|
|
23
|
+
],
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
setup(context) {
|
|
27
|
+
function checkBindingPattern(
|
|
28
|
+
node: ts.ArrayBindingPattern | ts.ObjectBindingPattern,
|
|
29
|
+
) {
|
|
30
|
+
if (node.elements.length === 0) {
|
|
31
|
+
context.report({
|
|
32
|
+
message: "emptyPattern",
|
|
33
|
+
range: {
|
|
34
|
+
begin: node.getStart(context.sourceFile),
|
|
35
|
+
end: node.getEnd(),
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return {
|
|
42
|
+
visitors: {
|
|
43
|
+
ArrayBindingPattern: checkBindingPattern,
|
|
44
|
+
ObjectBindingPattern: checkBindingPattern,
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
},
|
|
48
|
+
});
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import rule from "./emptyStaticBlocks.js";
|
|
2
|
+
import { ruleTester } from "./ruleTester.js";
|
|
3
|
+
|
|
4
|
+
ruleTester.describe(rule, {
|
|
5
|
+
invalid: [
|
|
6
|
+
{
|
|
7
|
+
code: `
|
|
8
|
+
class Example {
|
|
9
|
+
static {
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
`,
|
|
13
|
+
snapshot: `
|
|
14
|
+
class Example {
|
|
15
|
+
static {
|
|
16
|
+
~~~~~~~~
|
|
17
|
+
Empty static blocks serve no purpose and should be removed for cleaner code.
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
`,
|
|
21
|
+
suggestions: [
|
|
22
|
+
{
|
|
23
|
+
id: "removeEmptyStaticBlock",
|
|
24
|
+
updated: `
|
|
25
|
+
class Example {
|
|
26
|
+
|
|
27
|
+
}
|
|
28
|
+
`,
|
|
29
|
+
},
|
|
30
|
+
],
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
code: `
|
|
34
|
+
class Example {
|
|
35
|
+
static {
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
`,
|
|
41
|
+
snapshot: `
|
|
42
|
+
class Example {
|
|
43
|
+
static {
|
|
44
|
+
~~~~~~~~
|
|
45
|
+
Empty static blocks serve no purpose and should be removed for cleaner code.
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
`,
|
|
51
|
+
suggestions: [
|
|
52
|
+
{
|
|
53
|
+
id: "removeEmptyStaticBlock",
|
|
54
|
+
updated: `
|
|
55
|
+
class Example {
|
|
56
|
+
|
|
57
|
+
}
|
|
58
|
+
`,
|
|
59
|
+
},
|
|
60
|
+
],
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
code: `
|
|
64
|
+
class Multiple {
|
|
65
|
+
static property = 1;
|
|
66
|
+
|
|
67
|
+
static {
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
method() {}
|
|
71
|
+
}
|
|
72
|
+
`,
|
|
73
|
+
snapshot: `
|
|
74
|
+
class Multiple {
|
|
75
|
+
static property = 1;
|
|
76
|
+
|
|
77
|
+
static {
|
|
78
|
+
~~~~~~~~
|
|
79
|
+
Empty static blocks serve no purpose and should be removed for cleaner code.
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
method() {}
|
|
83
|
+
}
|
|
84
|
+
`,
|
|
85
|
+
suggestions: [
|
|
86
|
+
{
|
|
87
|
+
id: "removeEmptyStaticBlock",
|
|
88
|
+
updated: `
|
|
89
|
+
class Multiple {
|
|
90
|
+
static property = 1;
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
method() {}
|
|
95
|
+
}
|
|
96
|
+
`,
|
|
97
|
+
},
|
|
98
|
+
],
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
code: `
|
|
102
|
+
class MultipleBlocks {
|
|
103
|
+
static {
|
|
104
|
+
console.log("first");
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
static {
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
`,
|
|
111
|
+
snapshot: `
|
|
112
|
+
class MultipleBlocks {
|
|
113
|
+
static {
|
|
114
|
+
console.log("first");
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
static {
|
|
118
|
+
~~~~~~~~
|
|
119
|
+
Empty static blocks serve no purpose and should be removed for cleaner code.
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
`,
|
|
123
|
+
suggestions: [
|
|
124
|
+
{
|
|
125
|
+
id: "removeEmptyStaticBlock",
|
|
126
|
+
updated: `
|
|
127
|
+
class MultipleBlocks {
|
|
128
|
+
static {
|
|
129
|
+
console.log("first");
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
}
|
|
134
|
+
`,
|
|
135
|
+
},
|
|
136
|
+
],
|
|
137
|
+
},
|
|
138
|
+
],
|
|
139
|
+
valid: [
|
|
140
|
+
`class Example { static property = 1; }`,
|
|
141
|
+
`class Example { static method() {} }`,
|
|
142
|
+
`
|
|
143
|
+
class Example {
|
|
144
|
+
static {
|
|
145
|
+
console.log("initialization");
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
`,
|
|
149
|
+
`
|
|
150
|
+
class Example {
|
|
151
|
+
static {
|
|
152
|
+
this.property = 1;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
`,
|
|
156
|
+
`
|
|
157
|
+
class Multiple {
|
|
158
|
+
static {
|
|
159
|
+
console.log("first");
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
static {
|
|
163
|
+
console.log("second");
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
`,
|
|
167
|
+
],
|
|
168
|
+
});
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { typescriptLanguage } from "../language.js";
|
|
2
|
+
|
|
3
|
+
export default typescriptLanguage.createRule({
|
|
4
|
+
about: {
|
|
5
|
+
description:
|
|
6
|
+
"Reports empty static initialization blocks within class declarations.",
|
|
7
|
+
id: "emptyStaticBlocks",
|
|
8
|
+
preset: "stylistic",
|
|
9
|
+
},
|
|
10
|
+
messages: {
|
|
11
|
+
emptyStaticBlock: {
|
|
12
|
+
primary:
|
|
13
|
+
"Empty static blocks serve no purpose and should be removed for cleaner code.",
|
|
14
|
+
secondary: [
|
|
15
|
+
"Static blocks are used to initialize static class properties or perform other one-time setup when a class is loaded.",
|
|
16
|
+
"An empty static block has no statements and therefore serves no purpose.",
|
|
17
|
+
],
|
|
18
|
+
suggestions: [
|
|
19
|
+
"Remove the empty static block, or add initialization logic if needed.",
|
|
20
|
+
],
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
setup(context) {
|
|
24
|
+
return {
|
|
25
|
+
visitors: {
|
|
26
|
+
ClassStaticBlockDeclaration: (node) => {
|
|
27
|
+
const statements = node.body.statements;
|
|
28
|
+
if (statements.length) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const openBrace = node.body.getFirstToken(context.sourceFile);
|
|
33
|
+
if (!openBrace) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const range = {
|
|
38
|
+
begin: node.getStart(context.sourceFile),
|
|
39
|
+
end: openBrace.getEnd(),
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
context.report({
|
|
43
|
+
message: "emptyStaticBlock",
|
|
44
|
+
range,
|
|
45
|
+
suggestions: [
|
|
46
|
+
{
|
|
47
|
+
id: "removeEmptyStaticBlock",
|
|
48
|
+
range: {
|
|
49
|
+
begin: node.getStart(context.sourceFile),
|
|
50
|
+
end: node.getEnd(),
|
|
51
|
+
},
|
|
52
|
+
text: "",
|
|
53
|
+
},
|
|
54
|
+
],
|
|
55
|
+
});
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
},
|
|
60
|
+
});
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
import rule from "./exceptionAssignments.js";
|
|
2
|
+
import { ruleTester } from "./ruleTester.js";
|
|
3
|
+
|
|
4
|
+
ruleTester.describe(rule, {
|
|
5
|
+
invalid: [
|
|
6
|
+
{
|
|
7
|
+
code: `
|
|
8
|
+
try {
|
|
9
|
+
doSomething();
|
|
10
|
+
} catch (error) {
|
|
11
|
+
error = new Error("Different error");
|
|
12
|
+
}
|
|
13
|
+
`,
|
|
14
|
+
snapshot: `
|
|
15
|
+
try {
|
|
16
|
+
doSomething();
|
|
17
|
+
} catch (error) {
|
|
18
|
+
error = new Error("Different error");
|
|
19
|
+
~~~~~
|
|
20
|
+
Exception parameters in catch clauses should not be reassigned.
|
|
21
|
+
}
|
|
22
|
+
`,
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
code: `
|
|
26
|
+
try {
|
|
27
|
+
doSomething();
|
|
28
|
+
} catch (exception) {
|
|
29
|
+
exception = null;
|
|
30
|
+
}
|
|
31
|
+
`,
|
|
32
|
+
snapshot: `
|
|
33
|
+
try {
|
|
34
|
+
doSomething();
|
|
35
|
+
} catch (exception) {
|
|
36
|
+
exception = null;
|
|
37
|
+
~~~~~~~~~
|
|
38
|
+
Exception parameters in catch clauses should not be reassigned.
|
|
39
|
+
}
|
|
40
|
+
`,
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
code: `
|
|
44
|
+
try {
|
|
45
|
+
doSomething();
|
|
46
|
+
} catch (error) {
|
|
47
|
+
error++;
|
|
48
|
+
}
|
|
49
|
+
`,
|
|
50
|
+
snapshot: `
|
|
51
|
+
try {
|
|
52
|
+
doSomething();
|
|
53
|
+
} catch (error) {
|
|
54
|
+
error++;
|
|
55
|
+
~~~~~
|
|
56
|
+
Exception parameters in catch clauses should not be reassigned.
|
|
57
|
+
}
|
|
58
|
+
`,
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
code: `
|
|
62
|
+
try {
|
|
63
|
+
doSomething();
|
|
64
|
+
} catch (error) {
|
|
65
|
+
++error;
|
|
66
|
+
}
|
|
67
|
+
`,
|
|
68
|
+
snapshot: `
|
|
69
|
+
try {
|
|
70
|
+
doSomething();
|
|
71
|
+
} catch (error) {
|
|
72
|
+
++error;
|
|
73
|
+
~~~~~
|
|
74
|
+
Exception parameters in catch clauses should not be reassigned.
|
|
75
|
+
}
|
|
76
|
+
`,
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
code: `
|
|
80
|
+
try {
|
|
81
|
+
doSomething();
|
|
82
|
+
} catch (error) {
|
|
83
|
+
error += "additional info";
|
|
84
|
+
}
|
|
85
|
+
`,
|
|
86
|
+
snapshot: `
|
|
87
|
+
try {
|
|
88
|
+
doSomething();
|
|
89
|
+
} catch (error) {
|
|
90
|
+
error += "additional info";
|
|
91
|
+
~~~~~
|
|
92
|
+
Exception parameters in catch clauses should not be reassigned.
|
|
93
|
+
}
|
|
94
|
+
`,
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
code: `
|
|
98
|
+
try {
|
|
99
|
+
doSomething();
|
|
100
|
+
} catch (error) {
|
|
101
|
+
error ??= new Error("default error");
|
|
102
|
+
}
|
|
103
|
+
`,
|
|
104
|
+
snapshot: `
|
|
105
|
+
try {
|
|
106
|
+
doSomething();
|
|
107
|
+
} catch (error) {
|
|
108
|
+
error ??= new Error("default error");
|
|
109
|
+
~~~~~
|
|
110
|
+
Exception parameters in catch clauses should not be reassigned.
|
|
111
|
+
}
|
|
112
|
+
`,
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
code: `
|
|
116
|
+
try {
|
|
117
|
+
doSomething();
|
|
118
|
+
} catch (error) {
|
|
119
|
+
error &&= false;
|
|
120
|
+
}
|
|
121
|
+
`,
|
|
122
|
+
snapshot: `
|
|
123
|
+
try {
|
|
124
|
+
doSomething();
|
|
125
|
+
} catch (error) {
|
|
126
|
+
error &&= false;
|
|
127
|
+
~~~~~
|
|
128
|
+
Exception parameters in catch clauses should not be reassigned.
|
|
129
|
+
}
|
|
130
|
+
`,
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
code: `
|
|
134
|
+
try {
|
|
135
|
+
doSomething();
|
|
136
|
+
} catch (error) {
|
|
137
|
+
error ||= new Error("fallback");
|
|
138
|
+
}
|
|
139
|
+
`,
|
|
140
|
+
snapshot: `
|
|
141
|
+
try {
|
|
142
|
+
doSomething();
|
|
143
|
+
} catch (error) {
|
|
144
|
+
error ||= new Error("fallback");
|
|
145
|
+
~~~~~
|
|
146
|
+
Exception parameters in catch clauses should not be reassigned.
|
|
147
|
+
}
|
|
148
|
+
`,
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
code: `
|
|
152
|
+
try {
|
|
153
|
+
doSomething();
|
|
154
|
+
} catch (error) {
|
|
155
|
+
function inner() {
|
|
156
|
+
error = "reassigned in nested function";
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
`,
|
|
160
|
+
snapshot: `
|
|
161
|
+
try {
|
|
162
|
+
doSomething();
|
|
163
|
+
} catch (error) {
|
|
164
|
+
function inner() {
|
|
165
|
+
error = "reassigned in nested function";
|
|
166
|
+
~~~~~
|
|
167
|
+
Exception parameters in catch clauses should not be reassigned.
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
`,
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
code: `
|
|
174
|
+
try {
|
|
175
|
+
doSomething();
|
|
176
|
+
} catch ({ message }) {
|
|
177
|
+
message = "reassigned destructured parameter";
|
|
178
|
+
}
|
|
179
|
+
`,
|
|
180
|
+
snapshot: `
|
|
181
|
+
try {
|
|
182
|
+
doSomething();
|
|
183
|
+
} catch ({ message }) {
|
|
184
|
+
message = "reassigned destructured parameter";
|
|
185
|
+
~~~~~~~
|
|
186
|
+
Exception parameters in catch clauses should not be reassigned.
|
|
187
|
+
}
|
|
188
|
+
`,
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
code: `
|
|
192
|
+
try {
|
|
193
|
+
doSomething();
|
|
194
|
+
} catch ({ message, code }) {
|
|
195
|
+
code = 500;
|
|
196
|
+
}
|
|
197
|
+
`,
|
|
198
|
+
snapshot: `
|
|
199
|
+
try {
|
|
200
|
+
doSomething();
|
|
201
|
+
} catch ({ message, code }) {
|
|
202
|
+
code = 500;
|
|
203
|
+
~~~~
|
|
204
|
+
Exception parameters in catch clauses should not be reassigned.
|
|
205
|
+
}
|
|
206
|
+
`,
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
code: `
|
|
210
|
+
try {
|
|
211
|
+
doSomething();
|
|
212
|
+
} catch ([first, second]) {
|
|
213
|
+
first = "reassigned array destructured parameter";
|
|
214
|
+
}
|
|
215
|
+
`,
|
|
216
|
+
snapshot: `
|
|
217
|
+
try {
|
|
218
|
+
doSomething();
|
|
219
|
+
} catch ([first, second]) {
|
|
220
|
+
first = "reassigned array destructured parameter";
|
|
221
|
+
~~~~~
|
|
222
|
+
Exception parameters in catch clauses should not be reassigned.
|
|
223
|
+
}
|
|
224
|
+
`,
|
|
225
|
+
},
|
|
226
|
+
],
|
|
227
|
+
valid: [
|
|
228
|
+
`try { doSomething(); } catch (error) { console.log(error); }`,
|
|
229
|
+
`try { doSomething(); } catch (error) { throw error; }`,
|
|
230
|
+
`try { doSomething(); } catch (error) { const message = error.message; }`,
|
|
231
|
+
`try { doSomething(); } catch (error) { if (error instanceof TypeError) { handle(); } }`,
|
|
232
|
+
`try { doSomething(); } catch { handleError(); }`,
|
|
233
|
+
`const error = new Error("test");`,
|
|
234
|
+
`
|
|
235
|
+
try {
|
|
236
|
+
doSomething();
|
|
237
|
+
} catch (error) {
|
|
238
|
+
const error = "shadowed variable";
|
|
239
|
+
console.log(error);
|
|
240
|
+
}
|
|
241
|
+
`,
|
|
242
|
+
`
|
|
243
|
+
try {
|
|
244
|
+
doSomething();
|
|
245
|
+
} catch (error) {
|
|
246
|
+
function inner() {
|
|
247
|
+
const error = "shadowed in function";
|
|
248
|
+
error = "reassigning shadowed variable is ok";
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
`,
|
|
252
|
+
`
|
|
253
|
+
let error = "outer";
|
|
254
|
+
try {
|
|
255
|
+
doSomething();
|
|
256
|
+
} catch (error) {
|
|
257
|
+
console.log(error);
|
|
258
|
+
}
|
|
259
|
+
error = "reassigning outer is ok";
|
|
260
|
+
`,
|
|
261
|
+
`try { doSomething(); } catch ({ message }) { console.log(message); }`,
|
|
262
|
+
`try { doSomething(); } catch ({ message, code }) { if (code === 404) { handle(); } }`,
|
|
263
|
+
`try { doSomething(); } catch ([first]) { console.log(first); }`,
|
|
264
|
+
],
|
|
265
|
+
});
|