@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,195 @@
|
|
|
1
|
+
import rule from "./defaultCaseLast.js";
|
|
2
|
+
import { ruleTester } from "./ruleTester.js";
|
|
3
|
+
ruleTester.describe(rule, {
|
|
4
|
+
invalid: [
|
|
5
|
+
{
|
|
6
|
+
code: `
|
|
7
|
+
switch (value) {
|
|
8
|
+
default:
|
|
9
|
+
break;
|
|
10
|
+
case 1:
|
|
11
|
+
break;
|
|
12
|
+
}
|
|
13
|
+
`,
|
|
14
|
+
snapshot: `
|
|
15
|
+
switch (value) {
|
|
16
|
+
default:
|
|
17
|
+
~~~~~~~
|
|
18
|
+
Default clauses in switch statements should be last.
|
|
19
|
+
break;
|
|
20
|
+
case 1:
|
|
21
|
+
break;
|
|
22
|
+
}
|
|
23
|
+
`,
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
code: `
|
|
27
|
+
switch (value) {
|
|
28
|
+
case 1:
|
|
29
|
+
break;
|
|
30
|
+
default:
|
|
31
|
+
break;
|
|
32
|
+
case 2:
|
|
33
|
+
break;
|
|
34
|
+
}
|
|
35
|
+
`,
|
|
36
|
+
snapshot: `
|
|
37
|
+
switch (value) {
|
|
38
|
+
case 1:
|
|
39
|
+
break;
|
|
40
|
+
default:
|
|
41
|
+
~~~~~~~
|
|
42
|
+
Default clauses in switch statements should be last.
|
|
43
|
+
break;
|
|
44
|
+
case 2:
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
`,
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
code: `
|
|
51
|
+
switch (value) {
|
|
52
|
+
case 1:
|
|
53
|
+
case 2:
|
|
54
|
+
break;
|
|
55
|
+
default:
|
|
56
|
+
break;
|
|
57
|
+
case 3:
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
`,
|
|
61
|
+
snapshot: `
|
|
62
|
+
switch (value) {
|
|
63
|
+
case 1:
|
|
64
|
+
case 2:
|
|
65
|
+
break;
|
|
66
|
+
default:
|
|
67
|
+
~~~~~~~
|
|
68
|
+
Default clauses in switch statements should be last.
|
|
69
|
+
break;
|
|
70
|
+
case 3:
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
`,
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
code: `
|
|
77
|
+
switch (value) {
|
|
78
|
+
default:
|
|
79
|
+
console.log("default");
|
|
80
|
+
break;
|
|
81
|
+
case 1:
|
|
82
|
+
console.log("one");
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
`,
|
|
86
|
+
snapshot: `
|
|
87
|
+
switch (value) {
|
|
88
|
+
default:
|
|
89
|
+
~~~~~~~
|
|
90
|
+
Default clauses in switch statements should be last.
|
|
91
|
+
console.log("default");
|
|
92
|
+
break;
|
|
93
|
+
case 1:
|
|
94
|
+
console.log("one");
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
`,
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
code: `
|
|
101
|
+
const result = (value: number) => {
|
|
102
|
+
switch (value) {
|
|
103
|
+
case 1:
|
|
104
|
+
return "one";
|
|
105
|
+
default:
|
|
106
|
+
return "default";
|
|
107
|
+
case 2:
|
|
108
|
+
return "two";
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
`,
|
|
112
|
+
snapshot: `
|
|
113
|
+
const result = (value: number) => {
|
|
114
|
+
switch (value) {
|
|
115
|
+
case 1:
|
|
116
|
+
return "one";
|
|
117
|
+
default:
|
|
118
|
+
~~~~~~~
|
|
119
|
+
Default clauses in switch statements should be last.
|
|
120
|
+
return "default";
|
|
121
|
+
case 2:
|
|
122
|
+
return "two";
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
`,
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
code: `
|
|
129
|
+
switch (value) {
|
|
130
|
+
default:
|
|
131
|
+
case 1:
|
|
132
|
+
break;
|
|
133
|
+
}
|
|
134
|
+
`,
|
|
135
|
+
snapshot: `
|
|
136
|
+
switch (value) {
|
|
137
|
+
default:
|
|
138
|
+
~~~~~~~
|
|
139
|
+
Default clauses in switch statements should be last.
|
|
140
|
+
case 1:
|
|
141
|
+
break;
|
|
142
|
+
}
|
|
143
|
+
`,
|
|
144
|
+
},
|
|
145
|
+
],
|
|
146
|
+
valid: [
|
|
147
|
+
`switch (value) { case 1: break; default: break; }`,
|
|
148
|
+
`switch (value) { case 1: break; case 2: break; default: break; }`,
|
|
149
|
+
`switch (value) { case 1: break; case 2: break; }`,
|
|
150
|
+
`switch (value) { default: break; }`,
|
|
151
|
+
`switch (value) { case 1: case 2: break; default: break; }`,
|
|
152
|
+
`
|
|
153
|
+
switch (value) {
|
|
154
|
+
case 1:
|
|
155
|
+
break;
|
|
156
|
+
default:
|
|
157
|
+
break;
|
|
158
|
+
}
|
|
159
|
+
`,
|
|
160
|
+
`
|
|
161
|
+
switch (value) {
|
|
162
|
+
case 1:
|
|
163
|
+
console.log("one");
|
|
164
|
+
break;
|
|
165
|
+
case 2:
|
|
166
|
+
console.log("two");
|
|
167
|
+
break;
|
|
168
|
+
default:
|
|
169
|
+
console.log("default");
|
|
170
|
+
break;
|
|
171
|
+
}
|
|
172
|
+
`,
|
|
173
|
+
`
|
|
174
|
+
const result = (value: number) => {
|
|
175
|
+
switch (value) {
|
|
176
|
+
case 1:
|
|
177
|
+
return "one";
|
|
178
|
+
case 2:
|
|
179
|
+
return "two";
|
|
180
|
+
default:
|
|
181
|
+
return "default";
|
|
182
|
+
}
|
|
183
|
+
};
|
|
184
|
+
`,
|
|
185
|
+
`
|
|
186
|
+
switch (value) {
|
|
187
|
+
case 1:
|
|
188
|
+
case 2:
|
|
189
|
+
break;
|
|
190
|
+
default:
|
|
191
|
+
break;
|
|
192
|
+
}
|
|
193
|
+
`,
|
|
194
|
+
],
|
|
195
|
+
});
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
declare const _default: import("@flint.fyi/core").Rule<{
|
|
2
|
+
readonly description: "Reports functions with duplicate parameter names in their signatures.";
|
|
3
|
+
readonly id: "duplicateArguments";
|
|
4
|
+
readonly preset: "untyped";
|
|
5
|
+
}, import("../nodes.js").TSNodesByName, import("../language.js").TypeScriptServices, "duplicateParam", undefined>;
|
|
6
|
+
export default _default;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import * as ts from "typescript";
|
|
2
|
+
import { getTSNodeRange } from "../getTSNodeRange.js";
|
|
3
|
+
import { typescriptLanguage } from "../language.js";
|
|
4
|
+
export default typescriptLanguage.createRule({
|
|
5
|
+
about: {
|
|
6
|
+
description: "Reports functions with duplicate parameter names in their signatures.",
|
|
7
|
+
id: "duplicateArguments",
|
|
8
|
+
preset: "untyped",
|
|
9
|
+
},
|
|
10
|
+
messages: {
|
|
11
|
+
duplicateParam: {
|
|
12
|
+
primary: "This parameter overrides the previous parameter of the same name.",
|
|
13
|
+
secondary: [
|
|
14
|
+
"Duplicate parameter names in functions can lead to unexpected behavior and make code harder to understand.",
|
|
15
|
+
"In strict mode, duplicate parameter names are a syntax error.",
|
|
16
|
+
"Even in non-strict mode, only the last parameter with a given name is accessible.",
|
|
17
|
+
],
|
|
18
|
+
suggestions: ["Rename one of the duplicate parameters to a unique name."],
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
setup(context) {
|
|
22
|
+
function checkNode({ parameters }) {
|
|
23
|
+
const seenNames = new Set();
|
|
24
|
+
for (const parameter of parameters) {
|
|
25
|
+
if (!ts.isIdentifier(parameter.name)) {
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
const parameterName = parameter.name.text;
|
|
29
|
+
const existingParameter = seenNames.has(parameterName);
|
|
30
|
+
if (existingParameter) {
|
|
31
|
+
context.report({
|
|
32
|
+
message: "duplicateParam",
|
|
33
|
+
range: getTSNodeRange(parameter.name, context.sourceFile),
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
seenNames.add(parameterName);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
visitors: {
|
|
43
|
+
ArrowFunction: checkNode,
|
|
44
|
+
Constructor: checkNode,
|
|
45
|
+
FunctionDeclaration: checkNode,
|
|
46
|
+
FunctionExpression: checkNode,
|
|
47
|
+
MethodDeclaration: checkNode,
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
},
|
|
51
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import rule from "./duplicateArguments.js";
|
|
2
|
+
import { ruleTester } from "./ruleTester.js";
|
|
3
|
+
ruleTester.describe(rule, {
|
|
4
|
+
invalid: [
|
|
5
|
+
{
|
|
6
|
+
code: `
|
|
7
|
+
function test(value, value) {
|
|
8
|
+
return value;
|
|
9
|
+
}
|
|
10
|
+
`,
|
|
11
|
+
snapshot: `
|
|
12
|
+
function test(value, value) {
|
|
13
|
+
~~~~~
|
|
14
|
+
This parameter overrides the previous parameter of the same name.
|
|
15
|
+
return value;
|
|
16
|
+
}
|
|
17
|
+
`,
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
code: `
|
|
21
|
+
function test(first, second, first) {
|
|
22
|
+
return first + second;
|
|
23
|
+
}
|
|
24
|
+
`,
|
|
25
|
+
snapshot: `
|
|
26
|
+
function test(first, second, first) {
|
|
27
|
+
~~~~~
|
|
28
|
+
This parameter overrides the previous parameter of the same name.
|
|
29
|
+
return first + second;
|
|
30
|
+
}
|
|
31
|
+
`,
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
code: `
|
|
35
|
+
const arrow = (value, value) => value;
|
|
36
|
+
`,
|
|
37
|
+
snapshot: `
|
|
38
|
+
const arrow = (value, value) => value;
|
|
39
|
+
~~~~~
|
|
40
|
+
This parameter overrides the previous parameter of the same name.
|
|
41
|
+
`,
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
code: `
|
|
45
|
+
const func = function (value, value) {
|
|
46
|
+
return value;
|
|
47
|
+
};
|
|
48
|
+
`,
|
|
49
|
+
snapshot: `
|
|
50
|
+
const func = function (value, value) {
|
|
51
|
+
~~~~~
|
|
52
|
+
This parameter overrides the previous parameter of the same name.
|
|
53
|
+
return value;
|
|
54
|
+
};
|
|
55
|
+
`,
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
code: `
|
|
59
|
+
class Example {
|
|
60
|
+
method(value, value) {
|
|
61
|
+
return value;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
`,
|
|
65
|
+
snapshot: `
|
|
66
|
+
class Example {
|
|
67
|
+
method(value, value) {
|
|
68
|
+
~~~~~
|
|
69
|
+
This parameter overrides the previous parameter of the same name.
|
|
70
|
+
return value;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
`,
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
code: `
|
|
77
|
+
class Example {
|
|
78
|
+
constructor(value, value) {
|
|
79
|
+
this.value = value;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
`,
|
|
83
|
+
snapshot: `
|
|
84
|
+
class Example {
|
|
85
|
+
constructor(value, value) {
|
|
86
|
+
~~~~~
|
|
87
|
+
This parameter overrides the previous parameter of the same name.
|
|
88
|
+
this.value = value;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
`,
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
code: `
|
|
95
|
+
function test(first, second, third, second) {
|
|
96
|
+
return first + second + third;
|
|
97
|
+
}
|
|
98
|
+
`,
|
|
99
|
+
snapshot: `
|
|
100
|
+
function test(first, second, third, second) {
|
|
101
|
+
~~~~~~
|
|
102
|
+
This parameter overrides the previous parameter of the same name.
|
|
103
|
+
return first + second + third;
|
|
104
|
+
}
|
|
105
|
+
`,
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
code: `
|
|
109
|
+
function test(value, value, value) {
|
|
110
|
+
return value;
|
|
111
|
+
}
|
|
112
|
+
`,
|
|
113
|
+
snapshot: `
|
|
114
|
+
function test(value, value, value) {
|
|
115
|
+
~~~~~
|
|
116
|
+
This parameter overrides the previous parameter of the same name.
|
|
117
|
+
~~~~~
|
|
118
|
+
This parameter overrides the previous parameter of the same name.
|
|
119
|
+
return value;
|
|
120
|
+
}
|
|
121
|
+
`,
|
|
122
|
+
},
|
|
123
|
+
],
|
|
124
|
+
valid: [
|
|
125
|
+
`function test(value) { return value; }`,
|
|
126
|
+
`function test(first, second) { return first + second; }`,
|
|
127
|
+
`const arrow = (value) => value;`,
|
|
128
|
+
`const arrow = (first, second) => first + second;`,
|
|
129
|
+
`const func = function (value) { return value; };`,
|
|
130
|
+
`const func = function (first, second) { return first + second; };`,
|
|
131
|
+
`class Example { method(value) { return value; } }`,
|
|
132
|
+
`class Example { method(first, second) { return first + second; } }`,
|
|
133
|
+
`class Example { constructor(value) { this.value = value; } }`,
|
|
134
|
+
`class Example { constructor(first, second) { this.first = first; this.second = second; } }`,
|
|
135
|
+
`function test({ value }) { return value; }`,
|
|
136
|
+
`function test({ first, second }) { return first + second; }`,
|
|
137
|
+
`function test([first, second]) { return first + second; }`,
|
|
138
|
+
],
|
|
139
|
+
});
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
declare const _default: import("@flint.fyi/core").Rule<{
|
|
2
|
+
readonly description: "Reports duplicate conditions in if-else-if chains that make code unreachable.";
|
|
3
|
+
readonly id: "elseIfDuplicates";
|
|
4
|
+
readonly preset: "logical";
|
|
5
|
+
}, import("../nodes.js").TSNodesByName, import("../language.js").TypeScriptServices, "duplicateCondition", undefined>;
|
|
6
|
+
export default _default;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import * as ts from "typescript";
|
|
2
|
+
import { getTSNodeRange } from "../getTSNodeRange.js";
|
|
3
|
+
import { typescriptLanguage } from "../language.js";
|
|
4
|
+
import { hasSameTokens } from "../utils/hasSameTokens.js";
|
|
5
|
+
export default typescriptLanguage.createRule({
|
|
6
|
+
about: {
|
|
7
|
+
description: "Reports duplicate conditions in if-else-if chains that make code unreachable.",
|
|
8
|
+
id: "elseIfDuplicates",
|
|
9
|
+
preset: "logical",
|
|
10
|
+
},
|
|
11
|
+
messages: {
|
|
12
|
+
duplicateCondition: {
|
|
13
|
+
primary: "This condition is identical to a previous condition in the if-else-if chain.",
|
|
14
|
+
secondary: [
|
|
15
|
+
"When an if-else-if chain has duplicate conditions, the duplicate branch will never execute because the earlier identical condition will always be evaluated first.",
|
|
16
|
+
"This typically indicates a copy-paste error or logic mistake.",
|
|
17
|
+
],
|
|
18
|
+
suggestions: [
|
|
19
|
+
"Verify the condition logic is correct and update to check for the intended condition.",
|
|
20
|
+
],
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
setup(context) {
|
|
24
|
+
function checkIfStatement(node) {
|
|
25
|
+
const seen = [];
|
|
26
|
+
let current = node;
|
|
27
|
+
while (true) {
|
|
28
|
+
if (seen.some((previous) => hasSameTokens(previous, current.expression, context.sourceFile))) {
|
|
29
|
+
context.report({
|
|
30
|
+
message: "duplicateCondition",
|
|
31
|
+
range: getTSNodeRange(current.expression, context.sourceFile),
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
if (!current.elseStatement ||
|
|
35
|
+
!ts.isIfStatement(current.elseStatement)) {
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
seen.push(current.expression);
|
|
39
|
+
current = current.elseStatement;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
visitors: {
|
|
44
|
+
IfStatement: (node) => {
|
|
45
|
+
if (!ts.isIfStatement(node.parent) ||
|
|
46
|
+
node.parent.elseStatement !== node) {
|
|
47
|
+
checkIfStatement(node);
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
},
|
|
53
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import rule from "./elseIfDuplicates.js";
|
|
2
|
+
import { ruleTester } from "./ruleTester.js";
|
|
3
|
+
ruleTester.describe(rule, {
|
|
4
|
+
invalid: [
|
|
5
|
+
{
|
|
6
|
+
code: `
|
|
7
|
+
if (isSomething(value)) {
|
|
8
|
+
doFirst();
|
|
9
|
+
} else if (isSomething(value)) {
|
|
10
|
+
doSecond();
|
|
11
|
+
}
|
|
12
|
+
`,
|
|
13
|
+
snapshot: `
|
|
14
|
+
if (isSomething(value)) {
|
|
15
|
+
doFirst();
|
|
16
|
+
} else if (isSomething(value)) {
|
|
17
|
+
~~~~~~~~~~~~~~~~~~
|
|
18
|
+
This condition is identical to a previous condition in the if-else-if chain.
|
|
19
|
+
doSecond();
|
|
20
|
+
}
|
|
21
|
+
`,
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
code: `
|
|
25
|
+
if (isSomething /* ... */ (value)) {
|
|
26
|
+
doFirst();
|
|
27
|
+
} else if (isSomething(value /* ... */)) {
|
|
28
|
+
doSecond();
|
|
29
|
+
}
|
|
30
|
+
`,
|
|
31
|
+
snapshot: `
|
|
32
|
+
if (isSomething /* ... */ (value)) {
|
|
33
|
+
doFirst();
|
|
34
|
+
} else if (isSomething(value /* ... */)) {
|
|
35
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
36
|
+
This condition is identical to a previous condition in the if-else-if chain.
|
|
37
|
+
doSecond();
|
|
38
|
+
}
|
|
39
|
+
`,
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
code: `
|
|
43
|
+
if (first) {
|
|
44
|
+
handleFirst();
|
|
45
|
+
} else if (second) {
|
|
46
|
+
handleSecond();
|
|
47
|
+
} else if (third && fourth) {
|
|
48
|
+
handleThird();
|
|
49
|
+
} else if (third && fourth) {
|
|
50
|
+
handleFourth();
|
|
51
|
+
}
|
|
52
|
+
`,
|
|
53
|
+
snapshot: `
|
|
54
|
+
if (first) {
|
|
55
|
+
handleFirst();
|
|
56
|
+
} else if (second) {
|
|
57
|
+
handleSecond();
|
|
58
|
+
} else if (third && fourth) {
|
|
59
|
+
handleThird();
|
|
60
|
+
} else if (third && fourth) {
|
|
61
|
+
~~~~~~~~~~~~~~~
|
|
62
|
+
This condition is identical to a previous condition in the if-else-if chain.
|
|
63
|
+
handleFourth();
|
|
64
|
+
}
|
|
65
|
+
`,
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
code: `
|
|
69
|
+
if (count === 1) {
|
|
70
|
+
handleOne();
|
|
71
|
+
} else if (count === 2) {
|
|
72
|
+
handleTwo();
|
|
73
|
+
} else if (count === 3) {
|
|
74
|
+
handleThree();
|
|
75
|
+
} else if (count === 2) {
|
|
76
|
+
handleFour();
|
|
77
|
+
} else if (count === 5) {
|
|
78
|
+
handleFive();
|
|
79
|
+
}
|
|
80
|
+
`,
|
|
81
|
+
snapshot: `
|
|
82
|
+
if (count === 1) {
|
|
83
|
+
handleOne();
|
|
84
|
+
} else if (count === 2) {
|
|
85
|
+
handleTwo();
|
|
86
|
+
} else if (count === 3) {
|
|
87
|
+
handleThree();
|
|
88
|
+
} else if (count === 2) {
|
|
89
|
+
~~~~~~~~~~~
|
|
90
|
+
This condition is identical to a previous condition in the if-else-if chain.
|
|
91
|
+
handleFour();
|
|
92
|
+
} else if (count === 5) {
|
|
93
|
+
handleFive();
|
|
94
|
+
}
|
|
95
|
+
`,
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
code: `
|
|
99
|
+
if (value === "first") {
|
|
100
|
+
process();
|
|
101
|
+
} else if (value === "second") {
|
|
102
|
+
process();
|
|
103
|
+
} else if (value === "first") {
|
|
104
|
+
process();
|
|
105
|
+
}
|
|
106
|
+
`,
|
|
107
|
+
snapshot: `
|
|
108
|
+
if (value === "first") {
|
|
109
|
+
process();
|
|
110
|
+
} else if (value === "second") {
|
|
111
|
+
process();
|
|
112
|
+
} else if (value === "first") {
|
|
113
|
+
~~~~~~~~~~~~~~~~~
|
|
114
|
+
This condition is identical to a previous condition in the if-else-if chain.
|
|
115
|
+
process();
|
|
116
|
+
}
|
|
117
|
+
`,
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
code: `
|
|
121
|
+
if (isValid && isActive) {
|
|
122
|
+
execute();
|
|
123
|
+
} else if (isPending) {
|
|
124
|
+
wait();
|
|
125
|
+
} else if (isValid && isActive) {
|
|
126
|
+
execute();
|
|
127
|
+
}
|
|
128
|
+
`,
|
|
129
|
+
snapshot: `
|
|
130
|
+
if (isValid && isActive) {
|
|
131
|
+
execute();
|
|
132
|
+
} else if (isPending) {
|
|
133
|
+
wait();
|
|
134
|
+
} else if (isValid && isActive) {
|
|
135
|
+
~~~~~~~~~~~~~~~~~~~
|
|
136
|
+
This condition is identical to a previous condition in the if-else-if chain.
|
|
137
|
+
execute();
|
|
138
|
+
}
|
|
139
|
+
`,
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
code: `
|
|
143
|
+
if (value) {
|
|
144
|
+
first();
|
|
145
|
+
} else if (value) {
|
|
146
|
+
second();
|
|
147
|
+
} else if (value) {
|
|
148
|
+
third();
|
|
149
|
+
}
|
|
150
|
+
`,
|
|
151
|
+
snapshot: `
|
|
152
|
+
if (value) {
|
|
153
|
+
first();
|
|
154
|
+
} else if (value) {
|
|
155
|
+
~~~~~
|
|
156
|
+
This condition is identical to a previous condition in the if-else-if chain.
|
|
157
|
+
second();
|
|
158
|
+
} else if (value) {
|
|
159
|
+
~~~~~
|
|
160
|
+
This condition is identical to a previous condition in the if-else-if chain.
|
|
161
|
+
third();
|
|
162
|
+
}
|
|
163
|
+
`,
|
|
164
|
+
},
|
|
165
|
+
],
|
|
166
|
+
valid: [
|
|
167
|
+
`if (isSomething(value)) { doFirst(); } else if (isSomethingElse(value)) { doSecond(); }`,
|
|
168
|
+
`if (first) { handleFirst(); } else if (second) { handleSecond(); } else if (third && fourth) { handleThird(); } else if (third && fifth) { handleFourth(); }`,
|
|
169
|
+
`if (count === 1) { handleOne(); } else if (count === 2) { handleTwo(); } else if (count === 3) { handleThree(); } else if (count === 4) { handleFour(); }`,
|
|
170
|
+
`if (value === "first") { process(); } else if (value === "second") { process(); } else if (value === "third") { process(); }`,
|
|
171
|
+
`if (isValid) { execute(); } else if (isPending) { wait(); } else if (isInvalid) { reject(); }`,
|
|
172
|
+
`if (value) { process(); }`,
|
|
173
|
+
`if (first) { doFirst(); } else { doSecond(); }`,
|
|
174
|
+
`if (first) { doFirst(); } else if (second) { doSecond(); } else { doDefault(); }`,
|
|
175
|
+
],
|
|
176
|
+
});
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
declare const _default: import("@flint.fyi/core").Rule<{
|
|
2
|
+
readonly description: "Reports using empty destructuring patterns that destructure no values.";
|
|
3
|
+
readonly id: "emptyDestructures";
|
|
4
|
+
readonly preset: "logical";
|
|
5
|
+
}, import("../nodes.js").TSNodesByName, import("../language.js").TypeScriptServices, "emptyPattern", undefined>;
|
|
6
|
+
export default _default;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { typescriptLanguage } from "../language.js";
|
|
2
|
+
export default typescriptLanguage.createRule({
|
|
3
|
+
about: {
|
|
4
|
+
description: "Reports using empty destructuring patterns that destructure no values.",
|
|
5
|
+
id: "emptyDestructures",
|
|
6
|
+
preset: "logical",
|
|
7
|
+
},
|
|
8
|
+
messages: {
|
|
9
|
+
emptyPattern: {
|
|
10
|
+
primary: "Destructuring patterns that don't extract at least one value are unnecessary.",
|
|
11
|
+
secondary: [
|
|
12
|
+
"Empty destructuring patterns like `{}` or `[]` don't extract any values and serve no practical purpose.",
|
|
13
|
+
"These patterns are likely mistakes or leftover code from refactoring.",
|
|
14
|
+
],
|
|
15
|
+
suggestions: [
|
|
16
|
+
"Remove the empty destructuring pattern if it's not needed.",
|
|
17
|
+
"Add bindings to extract values if you intended to destructure specific properties.",
|
|
18
|
+
],
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
setup(context) {
|
|
22
|
+
function checkBindingPattern(node) {
|
|
23
|
+
if (node.elements.length === 0) {
|
|
24
|
+
context.report({
|
|
25
|
+
message: "emptyPattern",
|
|
26
|
+
range: {
|
|
27
|
+
begin: node.getStart(context.sourceFile),
|
|
28
|
+
end: node.getEnd(),
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
visitors: {
|
|
35
|
+
ArrayBindingPattern: checkBindingPattern,
|
|
36
|
+
ObjectBindingPattern: checkBindingPattern,
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
},
|
|
40
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|