@flint.fyi/ts 0.14.3 → 0.14.5

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.
Files changed (147) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/lib/createTypeScriptFileFromProgram.js +5 -1
  3. package/lib/index.d.ts +3 -0
  4. package/lib/index.js +3 -0
  5. package/lib/language.d.ts +1 -0
  6. package/lib/plugin.d.ts +61 -1
  7. package/lib/plugin.js +30 -0
  8. package/lib/rules/anyReturns.d.ts +6 -0
  9. package/lib/rules/anyReturns.js +187 -0
  10. package/lib/rules/anyReturns.test.d.ts +1 -0
  11. package/lib/rules/anyReturns.test.js +647 -0
  12. package/lib/rules/caseDuplicates.d.ts +6 -0
  13. package/lib/rules/caseDuplicates.js +49 -0
  14. package/lib/rules/caseDuplicates.test.d.ts +1 -0
  15. package/lib/rules/caseDuplicates.test.js +307 -0
  16. package/lib/rules/chainedAssignments.js +2 -1
  17. package/lib/rules/chainedAssignments.test.js +24 -0
  18. package/lib/rules/debuggerStatements.test.js +4 -4
  19. package/lib/rules/elseIfDuplicates.d.ts +6 -0
  20. package/lib/rules/elseIfDuplicates.js +53 -0
  21. package/lib/rules/elseIfDuplicates.test.d.ts +1 -0
  22. package/lib/rules/elseIfDuplicates.test.js +176 -0
  23. package/lib/rules/emptyBlocks.d.ts +6 -0
  24. package/lib/rules/emptyBlocks.js +66 -0
  25. package/lib/rules/emptyBlocks.test.d.ts +1 -0
  26. package/lib/rules/emptyBlocks.test.js +135 -0
  27. package/lib/rules/forDirections.d.ts +6 -0
  28. package/lib/rules/forDirections.js +124 -0
  29. package/lib/rules/forDirections.test.d.ts +1 -0
  30. package/lib/rules/forDirections.test.js +99 -0
  31. package/lib/rules/functionNewCalls.d.ts +6 -0
  32. package/lib/rules/functionNewCalls.js +60 -0
  33. package/lib/rules/functionNewCalls.test.d.ts +1 -0
  34. package/lib/rules/functionNewCalls.test.js +115 -0
  35. package/lib/rules/negativeZeroComparisons.js +4 -22
  36. package/lib/rules/nonOctalDecimalEscapes.d.ts +6 -0
  37. package/lib/rules/nonOctalDecimalEscapes.js +57 -0
  38. package/lib/rules/nonOctalDecimalEscapes.test.d.ts +1 -0
  39. package/lib/rules/nonOctalDecimalEscapes.test.js +69 -0
  40. package/lib/rules/numericLiteralParsing.d.ts +6 -0
  41. package/lib/rules/numericLiteralParsing.js +97 -0
  42. package/lib/rules/numericLiteralParsing.test.d.ts +1 -0
  43. package/lib/rules/numericLiteralParsing.test.js +99 -0
  44. package/lib/rules/octalNumbers.test.js +2 -2
  45. package/lib/rules/selfAssignments.d.ts +6 -0
  46. package/lib/rules/selfAssignments.js +44 -0
  47. package/lib/rules/selfAssignments.test.d.ts +1 -0
  48. package/lib/rules/selfAssignments.test.js +66 -0
  49. package/lib/rules/selfComparisons.d.ts +6 -0
  50. package/lib/rules/selfComparisons.js +41 -0
  51. package/lib/rules/selfComparisons.test.d.ts +1 -0
  52. package/lib/rules/selfComparisons.test.js +297 -0
  53. package/lib/rules/sequences.d.ts +6 -0
  54. package/lib/rules/sequences.js +34 -0
  55. package/lib/rules/sequences.test.d.ts +1 -0
  56. package/lib/rules/sequences.test.js +48 -0
  57. package/lib/rules/shadowedRestrictedNames.d.ts +6 -0
  58. package/lib/rules/shadowedRestrictedNames.js +95 -0
  59. package/lib/rules/shadowedRestrictedNames.test.d.ts +1 -0
  60. package/lib/rules/shadowedRestrictedNames.test.js +147 -0
  61. package/lib/rules/symbolDescriptions.test.js +4 -4
  62. package/lib/rules/typeofComparisons.d.ts +6 -0
  63. package/lib/rules/typeofComparisons.js +78 -0
  64. package/lib/rules/typeofComparisons.test.d.ts +1 -0
  65. package/lib/rules/typeofComparisons.test.js +85 -0
  66. package/lib/rules/unicodeBOMs.test.js +1 -0
  67. package/lib/rules/unnecessaryBlocks.d.ts +6 -0
  68. package/lib/rules/unnecessaryBlocks.js +75 -0
  69. package/lib/rules/unnecessaryBlocks.test.d.ts +1 -0
  70. package/lib/rules/unnecessaryBlocks.test.js +147 -0
  71. package/lib/rules/unnecessaryConcatenation.d.ts +6 -0
  72. package/lib/rules/unnecessaryConcatenation.js +38 -0
  73. package/lib/rules/unnecessaryConcatenation.test.d.ts +1 -0
  74. package/lib/rules/unnecessaryConcatenation.test.js +87 -0
  75. package/lib/rules/utils/discriminateAnyType.d.ts +12 -0
  76. package/lib/rules/utils/discriminateAnyType.js +41 -0
  77. package/lib/rules/utils/getThisExpression.d.ts +2 -0
  78. package/lib/rules/utils/getThisExpression.js +23 -0
  79. package/lib/rules/utils/isUnsafeAssignment.d.ts +13 -0
  80. package/lib/rules/utils/isUnsafeAssignment.js +76 -0
  81. package/lib/rules/utils/operators.d.ts +4 -0
  82. package/lib/rules/utils/operators.js +36 -0
  83. package/lib/rules/voidOperator.test.js +2 -2
  84. package/lib/utils/declarationIncludesGlobal.d.ts +2 -0
  85. package/lib/utils/declarationIncludesGlobal.js +5 -0
  86. package/lib/utils/declarationsIncludeGlobal.js +2 -5
  87. package/lib/utils/getDeclarationsIfGlobal.d.ts +2 -0
  88. package/lib/utils/getDeclarationsIfGlobal.js +7 -0
  89. package/lib/utils/hasSameTokens.d.ts +2 -0
  90. package/lib/utils/hasSameTokens.js +30 -0
  91. package/lib/utils/isGlobalDeclaration.js +2 -3
  92. package/lib/utils/isGlobalDeclarationOfName.d.ts +5 -0
  93. package/lib/utils/isGlobalDeclarationOfName.js +35 -0
  94. package/package.json +3 -3
  95. package/src/createTypeScriptFileFromProgram.ts +6 -1
  96. package/src/index.ts +3 -0
  97. package/src/language.ts +1 -0
  98. package/src/plugin.ts +30 -0
  99. package/src/rules/anyReturns.test.ts +649 -0
  100. package/src/rules/anyReturns.ts +263 -0
  101. package/src/rules/caseDuplicates.test.ts +308 -0
  102. package/src/rules/caseDuplicates.ts +57 -0
  103. package/src/rules/chainedAssignments.test.ts +24 -0
  104. package/src/rules/chainedAssignments.ts +4 -1
  105. package/src/rules/debuggerStatements.test.ts +4 -4
  106. package/src/rules/elseIfDuplicates.test.ts +177 -0
  107. package/src/rules/elseIfDuplicates.ts +69 -0
  108. package/src/rules/emptyBlocks.test.ts +136 -0
  109. package/src/rules/emptyBlocks.ts +73 -0
  110. package/src/rules/forDirections.test.ts +100 -0
  111. package/src/rules/forDirections.ts +163 -0
  112. package/src/rules/functionNewCalls.test.ts +116 -0
  113. package/src/rules/functionNewCalls.ts +75 -0
  114. package/src/rules/negativeZeroComparisons.ts +8 -27
  115. package/src/rules/nonOctalDecimalEscapes.test.ts +70 -0
  116. package/src/rules/nonOctalDecimalEscapes.ts +70 -0
  117. package/src/rules/numericLiteralParsing.test.ts +100 -0
  118. package/src/rules/numericLiteralParsing.ts +116 -0
  119. package/src/rules/octalNumbers.test.ts +2 -2
  120. package/src/rules/selfAssignments.test.ts +67 -0
  121. package/src/rules/selfAssignments.ts +50 -0
  122. package/src/rules/selfComparisons.test.ts +298 -0
  123. package/src/rules/selfComparisons.ts +45 -0
  124. package/src/rules/sequences.test.ts +49 -0
  125. package/src/rules/sequences.ts +37 -0
  126. package/src/rules/shadowedRestrictedNames.test.ts +148 -0
  127. package/src/rules/shadowedRestrictedNames.ts +105 -0
  128. package/src/rules/symbolDescriptions.test.ts +4 -4
  129. package/src/rules/typeofComparisons.test.ts +86 -0
  130. package/src/rules/typeofComparisons.ts +88 -0
  131. package/src/rules/unicodeBOMs.test.ts +1 -0
  132. package/src/rules/unnecessaryBlocks.test.ts +148 -0
  133. package/src/rules/unnecessaryBlocks.ts +89 -0
  134. package/src/rules/unnecessaryConcatenation.test.ts +88 -0
  135. package/src/rules/unnecessaryConcatenation.ts +44 -0
  136. package/src/rules/utils/discriminateAnyType.ts +66 -0
  137. package/src/rules/utils/getThisExpression.ts +24 -0
  138. package/src/rules/utils/isUnsafeAssignment.ts +113 -0
  139. package/src/rules/utils/operators.ts +39 -0
  140. package/src/rules/voidOperator.test.ts +2 -2
  141. package/src/utils/declarationIncludesGlobal.ts +9 -0
  142. package/src/utils/declarationsIncludeGlobal.ts +3 -7
  143. package/src/utils/getDeclarationsIfGlobal.ts +14 -0
  144. package/src/utils/hasSameTokens.ts +45 -0
  145. package/src/utils/isGlobalDeclaration.ts +3 -5
  146. package/src/utils/isGlobalDeclarationOfName.ts +56 -0
  147. package/tsconfig.tsbuildinfo +1 -1
@@ -0,0 +1,76 @@
1
+ import * as tsutils from "ts-api-utils";
2
+ import * as ts from "typescript";
3
+ /**
4
+ * Does a simple check to see if there is an any being assigned to a non-any type.
5
+ *
6
+ * This also checks generic positions to ensure there's no unsafe sub-assignments.
7
+ * Note: in the case of generic positions, it makes the assumption that the two types are the same.
8
+ * @example See tests for examples
9
+ * @returns false if it's safe, or an object with the two types if it's unsafe
10
+ */
11
+ export function isUnsafeAssignment(type, receiver, checker, senderNode) {
12
+ return isUnsafeAssignmentWorker(type, receiver, checker, senderNode, new Map());
13
+ }
14
+ function isUnsafeAssignmentWorker(type, receiver, checker, senderNode, visited) {
15
+ if (tsutils.isTypeFlagSet(type, ts.TypeFlags.Any)) {
16
+ // Allow assignment of any ==> unknown.
17
+ if (tsutils.isTypeFlagSet(receiver, ts.TypeFlags.Unknown)) {
18
+ return false;
19
+ }
20
+ if (!tsutils.isTypeFlagSet(receiver, ts.TypeFlags.Any)) {
21
+ return { receiver, sender: type };
22
+ }
23
+ }
24
+ const typeAlreadyVisited = visited.get(type);
25
+ if (typeAlreadyVisited) {
26
+ if (typeAlreadyVisited.has(receiver)) {
27
+ return false;
28
+ }
29
+ typeAlreadyVisited.add(receiver);
30
+ }
31
+ else {
32
+ visited.set(type, new Set([receiver]));
33
+ }
34
+ if (tsutils.isTypeReference(type) && tsutils.isTypeReference(receiver)) {
35
+ // TODO - figure out how to handle cases like this,
36
+ // where the types are assignable, but not the same type
37
+ /*
38
+ function foo(): ReadonlySet<number> { return new Set<any>(); }
39
+
40
+ // and
41
+
42
+ type Test<T> = { prop: T }
43
+ type Test2 = { prop: string }
44
+ declare const a: Test<any>;
45
+ const b: Test2 = a;
46
+ */
47
+ if (type.target !== receiver.target) {
48
+ // if the type references are different, assume safe, as we won't know how to compare the two types
49
+ // the generic positions might not be equivalent for both types
50
+ return false;
51
+ }
52
+ if (senderNode != null &&
53
+ ts.isNewExpression(senderNode) &&
54
+ ts.isIdentifier(senderNode.expression) &&
55
+ senderNode.expression.text === "Map" &&
56
+ (senderNode.arguments == null || senderNode.arguments.length === 0) &&
57
+ senderNode.typeArguments == null) {
58
+ // special case to handle `new Map()`
59
+ // unfortunately Map's default empty constructor is typed to return `Map<any, any>` :(
60
+ // https://github.com/typescript-eslint/typescript-eslint/issues/2109#issuecomment-634144396
61
+ return false;
62
+ }
63
+ const typeArguments = type.typeArguments ?? [];
64
+ const receiverTypeArguments = receiver.typeArguments ?? [];
65
+ for (let i = 0; i < typeArguments.length; i += 1) {
66
+ const arg = typeArguments[i];
67
+ const receiverArg = receiverTypeArguments[i];
68
+ const unsafe = isUnsafeAssignmentWorker(arg, receiverArg, checker, senderNode, visited);
69
+ if (unsafe) {
70
+ return { receiver, sender: type };
71
+ }
72
+ }
73
+ return false;
74
+ }
75
+ return false;
76
+ }
@@ -0,0 +1,4 @@
1
+ import * as ts from "typescript";
2
+ export declare function isComparisonOperator(token: ts.BinaryOperatorToken): boolean;
3
+ export declare function isEqualityOperator(token: ts.BinaryOperatorToken): boolean;
4
+ export declare function isNegatedEqualityOperator(token: ts.BinaryOperatorToken): boolean;
@@ -0,0 +1,36 @@
1
+ import * as ts from "typescript";
2
+ export function isComparisonOperator(token) {
3
+ switch (token.kind) {
4
+ case ts.SyntaxKind.EqualsEqualsEqualsToken:
5
+ case ts.SyntaxKind.EqualsEqualsToken:
6
+ case ts.SyntaxKind.ExclamationEqualsEqualsToken:
7
+ case ts.SyntaxKind.ExclamationEqualsToken:
8
+ case ts.SyntaxKind.GreaterThanEqualsToken:
9
+ case ts.SyntaxKind.GreaterThanToken:
10
+ case ts.SyntaxKind.LessThanEqualsToken:
11
+ case ts.SyntaxKind.LessThanToken:
12
+ return true;
13
+ default:
14
+ return false;
15
+ }
16
+ }
17
+ export function isEqualityOperator(token) {
18
+ switch (token.kind) {
19
+ case ts.SyntaxKind.EqualsEqualsEqualsToken:
20
+ case ts.SyntaxKind.EqualsEqualsToken:
21
+ case ts.SyntaxKind.ExclamationEqualsEqualsToken:
22
+ case ts.SyntaxKind.ExclamationEqualsToken:
23
+ return true;
24
+ default:
25
+ return false;
26
+ }
27
+ }
28
+ export function isNegatedEqualityOperator(token) {
29
+ switch (token.kind) {
30
+ case ts.SyntaxKind.ExclamationEqualsEqualsToken:
31
+ case ts.SyntaxKind.ExclamationEqualsToken:
32
+ return true;
33
+ default:
34
+ return false;
35
+ }
36
+ }
@@ -71,8 +71,8 @@ function process() {
71
71
  snapshot: `
72
72
  function process() {
73
73
  void doSomething();
74
- ~~~~~~~~~~~~~~~~~~
75
- Prefer an explicit value over using the void operator to produce undefined.
74
+ ~~~~~~~~~~~~~~~~~~
75
+ Prefer an explicit value over using the void operator to produce undefined.
76
76
  }
77
77
  `,
78
78
  },
@@ -0,0 +1,2 @@
1
+ import * as ts from "typescript";
2
+ export declare function declarationIncludesGlobal(declaration: ts.Declaration): boolean;
@@ -0,0 +1,5 @@
1
+ export function declarationIncludesGlobal(declaration) {
2
+ const sourceFile = declaration.getSourceFile();
3
+ return (sourceFile.hasNoDefaultLib ||
4
+ /\/lib\.[^/]*\.d\.ts$/.test(sourceFile.fileName));
5
+ }
@@ -1,7 +1,4 @@
1
+ import { declarationIncludesGlobal } from "./declarationIncludesGlobal.js";
1
2
  export function declarationsIncludeGlobal(declarations) {
2
- return declarations.some((declaration) => {
3
- const sourceFile = declaration.getSourceFile();
4
- return (sourceFile.hasNoDefaultLib ||
5
- /\/lib\.[^/]*\.d\.ts$/.test(sourceFile.fileName));
6
- });
3
+ return declarations.some(declarationIncludesGlobal);
7
4
  }
@@ -0,0 +1,2 @@
1
+ import * as ts from "typescript";
2
+ export declare function getDeclarationsIfGlobal(node: ts.Expression, typeChecker: ts.TypeChecker): ts.Declaration[] | undefined;
@@ -0,0 +1,7 @@
1
+ import { declarationsIncludeGlobal } from "./declarationsIncludeGlobal.js";
2
+ export function getDeclarationsIfGlobal(node, typeChecker) {
3
+ const declarations = typeChecker.getSymbolAtLocation(node)?.getDeclarations();
4
+ return !!declarations && declarationsIncludeGlobal(declarations)
5
+ ? declarations
6
+ : undefined;
7
+ }
@@ -0,0 +1,2 @@
1
+ import * as ts from "typescript";
2
+ export declare function hasSameTokens(nodeA: ts.Node, nodeB: ts.Node, sourceFile: ts.SourceFile): boolean;
@@ -0,0 +1,30 @@
1
+ import * as ts from "typescript";
2
+ export function hasSameTokens(nodeA, nodeB, sourceFile) {
3
+ const queueA = [nodeA];
4
+ const queueB = [nodeB];
5
+ while (true) {
6
+ const currentA = queueA.shift();
7
+ const currentB = queueB.shift();
8
+ if (!currentA || !currentB) {
9
+ break;
10
+ }
11
+ if (currentA.kind !== currentB.kind) {
12
+ return false;
13
+ }
14
+ if (currentA.kind >= ts.SyntaxKind.FirstToken &&
15
+ currentA.kind <= ts.SyntaxKind.LastToken) {
16
+ if (currentA.getText(sourceFile) !== currentB.getText(sourceFile)) {
17
+ return false;
18
+ }
19
+ continue;
20
+ }
21
+ const childrenA = currentA.getChildren(sourceFile);
22
+ const childrenB = currentB.getChildren(sourceFile);
23
+ if (childrenA.length !== childrenB.length) {
24
+ return false;
25
+ }
26
+ queueA.push(...childrenA);
27
+ queueB.push(...childrenB);
28
+ }
29
+ return queueA.length === queueB.length;
30
+ }
@@ -1,5 +1,4 @@
1
- import { declarationsIncludeGlobal } from "./declarationsIncludeGlobal.js";
1
+ import { getDeclarationsIfGlobal } from "./getDeclarationsIfGlobal.js";
2
2
  export function isGlobalDeclaration(node, typeChecker) {
3
- const declarations = typeChecker.getSymbolAtLocation(node)?.getDeclarations();
4
- return !!declarations && declarationsIncludeGlobal(declarations);
3
+ return !!getDeclarationsIfGlobal(node, typeChecker);
5
4
  }
@@ -0,0 +1,5 @@
1
+ import * as ts from "typescript";
2
+ /**
3
+ * TODO: Use a scope analyzer (#400).
4
+ */
5
+ export declare function isGlobalDeclarationOfName(node: ts.Node, name: string, typeChecker: ts.TypeChecker): boolean;
@@ -0,0 +1,35 @@
1
+ import * as ts from "typescript";
2
+ import { declarationIncludesGlobal } from "./declarationIncludesGlobal.js";
3
+ /**
4
+ * TODO: Use a scope analyzer (#400).
5
+ */
6
+ export function isGlobalDeclarationOfName(node, name, typeChecker) {
7
+ const declarations = typeChecker.getSymbolAtLocation(node)?.getDeclarations();
8
+ if (!declarations) {
9
+ return false;
10
+ }
11
+ return declarations.every((declaration) => {
12
+ // Special case: a variable set to a known identifier. E.g.:
13
+ // const CustomFunction = Function;
14
+ if (ts.isVariableDeclaration(declaration) &&
15
+ declaration.initializer &&
16
+ declaration.initializer.kind === ts.SyntaxKind.Identifier) {
17
+ return isGlobalDeclarationOfName(declaration.initializer, name, typeChecker);
18
+ }
19
+ // Special case: a property of an interface
20
+ if (ts.isPropertySignature(declaration)) {
21
+ return isGlobalDeclarationOfName(declaration.parent, name, typeChecker);
22
+ }
23
+ return (isDeclarationOfName(declaration, name) &&
24
+ declarationIncludesGlobal(declaration));
25
+ });
26
+ }
27
+ function isDeclarationOfName(node, name) {
28
+ if (ts.isClassDeclaration(node) ||
29
+ ts.isFunctionDeclaration(node) ||
30
+ ts.isInterfaceDeclaration(node) ||
31
+ ts.isVariableDeclaration(node)) {
32
+ return node.name && ts.isIdentifier(node.name) && node.name.text === name;
33
+ }
34
+ return false;
35
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flint.fyi/ts",
3
- "version": "0.14.3",
3
+ "version": "0.14.5",
4
4
  "description": "[Experimental] TypeScript language plugin for Flint.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -17,12 +17,12 @@
17
17
  "dependencies": {
18
18
  "@flint.fyi/core": "",
19
19
  "@flint.fyi/rule-tester": "",
20
- "@typescript-eslint/project-service": "^8.35.0",
20
+ "@typescript-eslint/project-service": "^8.46.2",
21
21
  "@typescript/vfs": "^1.6.1",
22
22
  "cached-factory": "^0.1.0",
23
23
  "debug-for-file": "^0.2.0",
24
24
  "ts-api-utils": "^2.1.0",
25
- "typescript": ">=5.8.0"
25
+ "typescript": ">=5.9.3"
26
26
  },
27
27
  "engines": {
28
28
  "node": ">=24.0.0"
@@ -49,9 +49,14 @@ export function createTypeScriptFileFromProgram(
49
49
  const reports: NormalizedReport[] = [];
50
50
 
51
51
  const context = {
52
+ program,
52
53
  report: (report: RuleReport) => {
53
54
  reports.push({
54
55
  ...report,
56
+ fix:
57
+ report.fix && !Array.isArray(report.fix)
58
+ ? [report.fix]
59
+ : report.fix,
55
60
  message: rule.messages[report.message],
56
61
  range: normalizeRange(report.range, sourceFile),
57
62
  });
@@ -73,7 +78,7 @@ export function createTypeScriptFileFromProgram(
73
78
  node.forEachChild(visit);
74
79
  };
75
80
 
76
- sourceFile.forEachChild(visit);
81
+ visit(sourceFile);
77
82
 
78
83
  return reports;
79
84
  },
package/src/index.ts CHANGED
@@ -1,4 +1,7 @@
1
1
  export { getTSNodeRange } from "./getTSNodeRange.js";
2
2
  export * from "./language.js";
3
3
  export { ts } from "./plugin.js";
4
+ export { getDeclarationsIfGlobal } from "./utils/getDeclarationsIfGlobal.js";
4
5
  export { isGlobalDeclaration } from "./utils/isGlobalDeclaration.js";
6
+ export { isGlobalDeclarationOfName } from "./utils/isGlobalDeclarationOfName.js";
7
+ export { isGlobalVariable } from "./utils/isGlobalVariable.js";
package/src/language.ts CHANGED
@@ -19,6 +19,7 @@ const log = debugForFile(import.meta.filename);
19
19
  const projectRoot = path.join(import.meta.dirname, "../..");
20
20
 
21
21
  export interface TypeScriptServices {
22
+ program: ts.Program;
22
23
  sourceFile: ts.SourceFile;
23
24
  typeChecker: ts.TypeChecker;
24
25
  }
package/src/plugin.ts CHANGED
@@ -1,7 +1,9 @@
1
1
  import { createPlugin } from "@flint.fyi/core";
2
2
 
3
+ import anyReturns from "./rules/anyReturns.js";
3
4
  import asyncPromiseExecutors from "./rules/asyncPromiseExecutors.js";
4
5
  import caseDeclarations from "./rules/caseDeclarations.js";
6
+ import caseDuplicates from "./rules/caseDuplicates.js";
5
7
  import chainedAssignments from "./rules/chainedAssignments.js";
6
8
  import classAssignments from "./rules/classAssignments.js";
7
9
  import consecutiveNonNullAssertions from "./rules/consecutiveNonNullAssertions.js";
@@ -10,11 +12,15 @@ import constructorReturns from "./rules/constructorReturns.js";
10
12
  import debuggerStatements from "./rules/debuggerStatements.js";
11
13
  import defaultCaseLast from "./rules/defaultCaseLast.js";
12
14
  import duplicateArguments from "./rules/duplicateArguments.js";
15
+ import elseIfDuplicates from "./rules/elseIfDuplicates.js";
16
+ import emptyBlocks from "./rules/emptyBlocks.js";
13
17
  import emptyDestructures from "./rules/emptyDestructures.js";
14
18
  import emptyStaticBlocks from "./rules/emptyStaticBlocks.js";
15
19
  import exceptionAssignments from "./rules/exceptionAssignments.js";
20
+ import forDirections from "./rules/forDirections.js";
16
21
  import forInArrays from "./rules/forInArrays.js";
17
22
  import functionAssignments from "./rules/functionAssignments.js";
23
+ import functionNewCalls from "./rules/functionNewCalls.js";
18
24
  import generatorFunctionYields from "./rules/generatorFunctionYields.js";
19
25
  import globalAssignments from "./rules/globalAssignments.js";
20
26
  import globalObjectCalls from "./rules/globalObjectCalls.js";
@@ -22,16 +28,25 @@ import namespaceDeclarations from "./rules/namespaceDeclarations.js";
22
28
  import negativeZeroComparisons from "./rules/negativeZeroComparisons.js";
23
29
  import newExpressions from "./rules/newExpressions.js";
24
30
  import newNativeNonConstructors from "./rules/newNativeNonConstructors.js";
31
+ import nonOctalDecimalEscapes from "./rules/nonOctalDecimalEscapes.js";
32
+ import numericLiteralParsing from "./rules/numericLiteralParsing.js";
25
33
  import objectProto from "./rules/objectProto.js";
26
34
  import octalEscapes from "./rules/octalEscapes.js";
27
35
  import octalNumbers from "./rules/octalNumbers.js";
28
36
  import returnAssignments from "./rules/returnAssignments.js";
37
+ import selfAssignments from "./rules/selfAssignments.js";
38
+ import selfComparisons from "./rules/selfComparisons.js";
39
+ import sequences from "./rules/sequences.js";
40
+ import shadowedRestrictedNames from "./rules/shadowedRestrictedNames.js";
29
41
  import sparseArrays from "./rules/sparseArrays.js";
30
42
  import symbolDescriptions from "./rules/symbolDescriptions.js";
43
+ import typeofComparisons from "./rules/typeofComparisons.js";
31
44
  import unassignedVariables from "./rules/unassignedVariables.js";
32
45
  import undefinedVariables from "./rules/undefinedVariables.js";
33
46
  import unicodeBOMs from "./rules/unicodeBOMs.js";
47
+ import unnecessaryBlocks from "./rules/unnecessaryBlocks.js";
34
48
  import unnecessaryCatches from "./rules/unnecessaryCatches.js";
49
+ import unnecessaryConcatenation from "./rules/unnecessaryConcatenation.js";
35
50
  import unsafeNegations from "./rules/unsafeNegations.js";
36
51
  import variableDeletions from "./rules/variableDeletions.js";
37
52
  import voidOperator from "./rules/voidOperator.js";
@@ -42,8 +57,10 @@ export const ts = createPlugin({
42
57
  },
43
58
  name: "ts",
44
59
  rules: [
60
+ anyReturns,
45
61
  asyncPromiseExecutors,
46
62
  caseDeclarations,
63
+ caseDuplicates,
47
64
  chainedAssignments,
48
65
  classAssignments,
49
66
  consecutiveNonNullAssertions,
@@ -52,11 +69,15 @@ export const ts = createPlugin({
52
69
  debuggerStatements,
53
70
  defaultCaseLast,
54
71
  duplicateArguments,
72
+ elseIfDuplicates,
73
+ emptyBlocks,
55
74
  emptyDestructures,
56
75
  emptyStaticBlocks,
57
76
  exceptionAssignments,
77
+ forDirections,
58
78
  forInArrays,
59
79
  functionAssignments,
80
+ functionNewCalls,
60
81
  generatorFunctionYields,
61
82
  globalAssignments,
62
83
  globalObjectCalls,
@@ -64,16 +85,25 @@ export const ts = createPlugin({
64
85
  negativeZeroComparisons,
65
86
  newExpressions,
66
87
  newNativeNonConstructors,
88
+ nonOctalDecimalEscapes,
89
+ numericLiteralParsing,
67
90
  objectProto,
68
91
  octalEscapes,
69
92
  octalNumbers,
70
93
  returnAssignments,
94
+ selfAssignments,
95
+ selfComparisons,
96
+ sequences,
97
+ shadowedRestrictedNames,
71
98
  sparseArrays,
72
99
  symbolDescriptions,
100
+ typeofComparisons,
73
101
  unassignedVariables,
74
102
  undefinedVariables,
75
103
  unicodeBOMs,
104
+ unnecessaryBlocks,
76
105
  unnecessaryCatches,
106
+ unnecessaryConcatenation,
77
107
  unsafeNegations,
78
108
  variableDeletions,
79
109
  voidOperator,