@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.
Files changed (300) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/lib/createTypeScriptFileFromProgram.js +1 -0
  3. package/lib/index.d.ts +1 -0
  4. package/lib/index.js +1 -0
  5. package/lib/language.d.ts +1 -0
  6. package/lib/nodes.d.ts +1 -0
  7. package/lib/plugin.d.ts +165 -1
  8. package/lib/plugin.js +82 -0
  9. package/lib/rules/anyReturns.d.ts +6 -0
  10. package/lib/rules/anyReturns.js +187 -0
  11. package/lib/rules/anyReturns.test.d.ts +1 -0
  12. package/lib/rules/anyReturns.test.js +647 -0
  13. package/lib/rules/asyncPromiseExecutors.d.ts +6 -0
  14. package/lib/rules/asyncPromiseExecutors.js +51 -0
  15. package/lib/rules/asyncPromiseExecutors.test.d.ts +1 -0
  16. package/lib/rules/asyncPromiseExecutors.test.js +71 -0
  17. package/lib/rules/caseDeclarations.d.ts +6 -0
  18. package/lib/rules/caseDeclarations.js +53 -0
  19. package/lib/rules/caseDeclarations.test.d.ts +1 -0
  20. package/lib/rules/caseDeclarations.test.js +227 -0
  21. package/lib/rules/caseDuplicates.d.ts +6 -0
  22. package/lib/rules/caseDuplicates.js +49 -0
  23. package/lib/rules/caseDuplicates.test.d.ts +1 -0
  24. package/lib/rules/caseDuplicates.test.js +307 -0
  25. package/lib/rules/chainedAssignments.d.ts +6 -0
  26. package/lib/rules/chainedAssignments.js +48 -0
  27. package/lib/rules/chainedAssignments.test.d.ts +1 -0
  28. package/lib/rules/chainedAssignments.test.js +238 -0
  29. package/lib/rules/classAssignments.d.ts +6 -0
  30. package/lib/rules/classAssignments.js +42 -0
  31. package/lib/rules/classAssignments.test.d.ts +1 -0
  32. package/lib/rules/classAssignments.test.js +156 -0
  33. package/lib/rules/constantAssignments.d.ts +6 -0
  34. package/lib/rules/constantAssignments.js +61 -0
  35. package/lib/rules/constantAssignments.test.d.ts +1 -0
  36. package/lib/rules/constantAssignments.test.js +221 -0
  37. package/lib/rules/constructorReturns.d.ts +6 -0
  38. package/lib/rules/constructorReturns.js +52 -0
  39. package/lib/rules/constructorReturns.test.d.ts +1 -0
  40. package/lib/rules/constructorReturns.test.js +96 -0
  41. package/lib/rules/defaultCaseLast.d.ts +6 -0
  42. package/lib/rules/defaultCaseLast.js +43 -0
  43. package/lib/rules/defaultCaseLast.test.d.ts +1 -0
  44. package/lib/rules/defaultCaseLast.test.js +195 -0
  45. package/lib/rules/duplicateArguments.d.ts +6 -0
  46. package/lib/rules/duplicateArguments.js +51 -0
  47. package/lib/rules/duplicateArguments.test.d.ts +1 -0
  48. package/lib/rules/duplicateArguments.test.js +139 -0
  49. package/lib/rules/elseIfDuplicates.d.ts +6 -0
  50. package/lib/rules/elseIfDuplicates.js +53 -0
  51. package/lib/rules/elseIfDuplicates.test.d.ts +1 -0
  52. package/lib/rules/elseIfDuplicates.test.js +176 -0
  53. package/lib/rules/emptyDestructures.d.ts +6 -0
  54. package/lib/rules/emptyDestructures.js +40 -0
  55. package/lib/rules/emptyDestructures.test.d.ts +1 -0
  56. package/lib/rules/emptyDestructures.test.js +186 -0
  57. package/lib/rules/emptyStaticBlocks.d.ts +6 -0
  58. package/lib/rules/emptyStaticBlocks.js +54 -0
  59. package/lib/rules/emptyStaticBlocks.test.d.ts +1 -0
  60. package/lib/rules/emptyStaticBlocks.test.js +167 -0
  61. package/lib/rules/exceptionAssignments.d.ts +6 -0
  62. package/lib/rules/exceptionAssignments.js +61 -0
  63. package/lib/rules/exceptionAssignments.test.d.ts +1 -0
  64. package/lib/rules/exceptionAssignments.test.js +264 -0
  65. package/lib/rules/forDirections.d.ts +6 -0
  66. package/lib/rules/forDirections.js +124 -0
  67. package/lib/rules/forDirections.test.d.ts +1 -0
  68. package/lib/rules/forDirections.test.js +99 -0
  69. package/lib/rules/functionAssignments.d.ts +6 -0
  70. package/lib/rules/functionAssignments.js +42 -0
  71. package/lib/rules/functionAssignments.test.d.ts +1 -0
  72. package/lib/rules/functionAssignments.test.js +209 -0
  73. package/lib/rules/functionNewCalls.d.ts +6 -0
  74. package/lib/rules/functionNewCalls.js +60 -0
  75. package/lib/rules/functionNewCalls.test.d.ts +1 -0
  76. package/lib/rules/functionNewCalls.test.js +115 -0
  77. package/lib/rules/generatorFunctionYields.d.ts +6 -0
  78. package/lib/rules/generatorFunctionYields.js +57 -0
  79. package/lib/rules/generatorFunctionYields.test.d.ts +1 -0
  80. package/lib/rules/generatorFunctionYields.test.js +151 -0
  81. package/lib/rules/globalAssignments.d.ts +6 -0
  82. package/lib/rules/globalAssignments.js +59 -0
  83. package/lib/rules/globalAssignments.test.d.ts +1 -0
  84. package/lib/rules/globalAssignments.test.js +215 -0
  85. package/lib/rules/globalObjectCalls.d.ts +6 -0
  86. package/lib/rules/globalObjectCalls.js +43 -0
  87. package/lib/rules/globalObjectCalls.test.d.ts +1 -0
  88. package/lib/rules/globalObjectCalls.test.js +93 -0
  89. package/lib/rules/negativeZeroComparisons.d.ts +6 -0
  90. package/lib/rules/negativeZeroComparisons.js +65 -0
  91. package/lib/rules/negativeZeroComparisons.test.d.ts +1 -0
  92. package/lib/rules/negativeZeroComparisons.test.js +209 -0
  93. package/lib/rules/newExpressions.d.ts +6 -0
  94. package/lib/rules/newExpressions.js +54 -0
  95. package/lib/rules/newExpressions.test.d.ts +1 -0
  96. package/lib/rules/newExpressions.test.js +79 -0
  97. package/lib/rules/newNativeNonConstructors.d.ts +6 -0
  98. package/lib/rules/newNativeNonConstructors.js +49 -0
  99. package/lib/rules/newNativeNonConstructors.test.d.ts +1 -0
  100. package/lib/rules/newNativeNonConstructors.test.js +94 -0
  101. package/lib/rules/nonOctalDecimalEscapes.d.ts +6 -0
  102. package/lib/rules/nonOctalDecimalEscapes.js +57 -0
  103. package/lib/rules/nonOctalDecimalEscapes.test.d.ts +1 -0
  104. package/lib/rules/nonOctalDecimalEscapes.test.js +69 -0
  105. package/lib/rules/numericLiteralParsing.d.ts +6 -0
  106. package/lib/rules/numericLiteralParsing.js +97 -0
  107. package/lib/rules/numericLiteralParsing.test.d.ts +1 -0
  108. package/lib/rules/numericLiteralParsing.test.js +99 -0
  109. package/lib/rules/objectProto.d.ts +6 -0
  110. package/lib/rules/objectProto.js +54 -0
  111. package/lib/rules/objectProto.test.d.ts +1 -0
  112. package/lib/rules/objectProto.test.js +96 -0
  113. package/lib/rules/octalNumbers.d.ts +6 -0
  114. package/lib/rules/octalNumbers.js +68 -0
  115. package/lib/rules/octalNumbers.test.d.ts +1 -0
  116. package/lib/rules/octalNumbers.test.js +245 -0
  117. package/lib/rules/returnAssignments.d.ts +6 -0
  118. package/lib/rules/returnAssignments.js +50 -0
  119. package/lib/rules/returnAssignments.test.d.ts +1 -0
  120. package/lib/rules/returnAssignments.test.js +185 -0
  121. package/lib/rules/selfAssignments.d.ts +6 -0
  122. package/lib/rules/selfAssignments.js +44 -0
  123. package/lib/rules/selfAssignments.test.d.ts +1 -0
  124. package/lib/rules/selfAssignments.test.js +66 -0
  125. package/lib/rules/selfComparisons.d.ts +6 -0
  126. package/lib/rules/selfComparisons.js +41 -0
  127. package/lib/rules/selfComparisons.test.d.ts +1 -0
  128. package/lib/rules/selfComparisons.test.js +297 -0
  129. package/lib/rules/sequences.d.ts +6 -0
  130. package/lib/rules/sequences.js +34 -0
  131. package/lib/rules/sequences.test.d.ts +1 -0
  132. package/lib/rules/sequences.test.js +48 -0
  133. package/lib/rules/sparseArrays.d.ts +6 -0
  134. package/lib/rules/sparseArrays.js +54 -0
  135. package/lib/rules/sparseArrays.test.d.ts +1 -0
  136. package/lib/rules/sparseArrays.test.js +110 -0
  137. package/lib/rules/symbolDescriptions.d.ts +6 -0
  138. package/lib/rules/symbolDescriptions.js +41 -0
  139. package/lib/rules/symbolDescriptions.test.d.ts +1 -0
  140. package/lib/rules/symbolDescriptions.test.js +89 -0
  141. package/lib/rules/typeofComparisons.d.ts +6 -0
  142. package/lib/rules/typeofComparisons.js +78 -0
  143. package/lib/rules/typeofComparisons.test.d.ts +1 -0
  144. package/lib/rules/typeofComparisons.test.js +85 -0
  145. package/lib/rules/unassignedVariables.d.ts +6 -0
  146. package/lib/rules/unassignedVariables.js +55 -0
  147. package/lib/rules/unassignedVariables.test.d.ts +1 -0
  148. package/lib/rules/unassignedVariables.test.js +72 -0
  149. package/lib/rules/undefinedVariables.d.ts +6 -0
  150. package/lib/rules/undefinedVariables.js +76 -0
  151. package/lib/rules/undefinedVariables.test.d.ts +1 -0
  152. package/lib/rules/undefinedVariables.test.js +80 -0
  153. package/lib/rules/unicodeBOMs.d.ts +6 -0
  154. package/lib/rules/unicodeBOMs.js +41 -0
  155. package/lib/rules/unicodeBOMs.test.d.ts +1 -0
  156. package/lib/rules/unicodeBOMs.test.js +65 -0
  157. package/lib/rules/unnecessaryCatches.d.ts +6 -0
  158. package/lib/rules/unnecessaryCatches.js +68 -0
  159. package/lib/rules/unnecessaryCatches.test.d.ts +1 -0
  160. package/lib/rules/unnecessaryCatches.test.js +210 -0
  161. package/lib/rules/unsafeNegations.d.ts +6 -0
  162. package/lib/rules/unsafeNegations.js +50 -0
  163. package/lib/rules/unsafeNegations.test.d.ts +1 -0
  164. package/lib/rules/unsafeNegations.test.js +63 -0
  165. package/lib/rules/utils/discriminateAnyType.d.ts +12 -0
  166. package/lib/rules/utils/discriminateAnyType.js +41 -0
  167. package/lib/rules/utils/getThisExpression.d.ts +2 -0
  168. package/lib/rules/utils/getThisExpression.js +23 -0
  169. package/lib/rules/utils/isUnsafeAssignment.d.ts +13 -0
  170. package/lib/rules/utils/isUnsafeAssignment.js +76 -0
  171. package/lib/rules/utils/operators.d.ts +4 -0
  172. package/lib/rules/utils/operators.js +36 -0
  173. package/lib/rules/variableDeletions.d.ts +6 -0
  174. package/lib/rules/variableDeletions.js +39 -0
  175. package/lib/rules/variableDeletions.test.d.ts +1 -0
  176. package/lib/rules/variableDeletions.test.js +75 -0
  177. package/lib/rules/voidOperator.d.ts +6 -0
  178. package/lib/rules/voidOperator.js +36 -0
  179. package/lib/rules/voidOperator.test.d.ts +1 -0
  180. package/lib/rules/voidOperator.test.js +98 -0
  181. package/lib/utils/declarationIncludesGlobal.d.ts +2 -0
  182. package/lib/utils/declarationIncludesGlobal.js +5 -0
  183. package/lib/utils/declarationsIncludeGlobal.d.ts +2 -0
  184. package/lib/utils/declarationsIncludeGlobal.js +4 -0
  185. package/lib/utils/getModifyingReferences.d.ts +8 -0
  186. package/lib/utils/getModifyingReferences.js +42 -0
  187. package/lib/utils/hasSameTokens.d.ts +2 -0
  188. package/lib/utils/hasSameTokens.js +30 -0
  189. package/lib/utils/isGlobalDeclaration.d.ts +2 -0
  190. package/lib/utils/isGlobalDeclaration.js +5 -0
  191. package/lib/utils/isGlobalDeclarationOfName.d.ts +5 -0
  192. package/lib/utils/isGlobalDeclarationOfName.js +31 -0
  193. package/lib/utils/isGlobalVariable.d.ts +8 -0
  194. package/lib/utils/isGlobalVariable.js +21 -0
  195. package/lib/utils/unwrapParentParenthesizedExpressions.d.ts +2 -0
  196. package/lib/utils/unwrapParentParenthesizedExpressions.js +6 -0
  197. package/lib/utils/unwrapParenthesizedExpression.d.ts +2 -0
  198. package/lib/utils/unwrapParenthesizedExpression.js +6 -0
  199. package/package.json +1 -1
  200. package/src/createTypeScriptFileFromProgram.ts +1 -0
  201. package/src/index.ts +1 -0
  202. package/src/language.ts +1 -0
  203. package/src/nodes.ts +1 -0
  204. package/src/plugin.ts +82 -0
  205. package/src/rules/anyReturns.test.ts +649 -0
  206. package/src/rules/anyReturns.ts +263 -0
  207. package/src/rules/asyncPromiseExecutors.test.ts +72 -0
  208. package/src/rules/asyncPromiseExecutors.ts +61 -0
  209. package/src/rules/caseDeclarations.test.ts +228 -0
  210. package/src/rules/caseDeclarations.ts +70 -0
  211. package/src/rules/caseDuplicates.test.ts +308 -0
  212. package/src/rules/caseDuplicates.ts +57 -0
  213. package/src/rules/chainedAssignments.test.ts +239 -0
  214. package/src/rules/chainedAssignments.ts +55 -0
  215. package/src/rules/classAssignments.test.ts +157 -0
  216. package/src/rules/classAssignments.ts +50 -0
  217. package/src/rules/constantAssignments.test.ts +222 -0
  218. package/src/rules/constantAssignments.ts +78 -0
  219. package/src/rules/constructorReturns.test.ts +97 -0
  220. package/src/rules/constructorReturns.ts +59 -0
  221. package/src/rules/defaultCaseLast.test.ts +196 -0
  222. package/src/rules/defaultCaseLast.ts +54 -0
  223. package/src/rules/duplicateArguments.test.ts +140 -0
  224. package/src/rules/duplicateArguments.ts +58 -0
  225. package/src/rules/elseIfDuplicates.test.ts +177 -0
  226. package/src/rules/elseIfDuplicates.ts +69 -0
  227. package/src/rules/emptyDestructures.test.ts +187 -0
  228. package/src/rules/emptyDestructures.ts +48 -0
  229. package/src/rules/emptyStaticBlocks.test.ts +168 -0
  230. package/src/rules/emptyStaticBlocks.ts +60 -0
  231. package/src/rules/exceptionAssignments.test.ts +265 -0
  232. package/src/rules/exceptionAssignments.ts +77 -0
  233. package/src/rules/forDirections.test.ts +100 -0
  234. package/src/rules/forDirections.ts +163 -0
  235. package/src/rules/functionAssignments.test.ts +210 -0
  236. package/src/rules/functionAssignments.ts +51 -0
  237. package/src/rules/functionNewCalls.test.ts +116 -0
  238. package/src/rules/functionNewCalls.ts +75 -0
  239. package/src/rules/generatorFunctionYields.test.ts +152 -0
  240. package/src/rules/generatorFunctionYields.ts +71 -0
  241. package/src/rules/globalAssignments.test.ts +216 -0
  242. package/src/rules/globalAssignments.ts +67 -0
  243. package/src/rules/globalObjectCalls.test.ts +94 -0
  244. package/src/rules/globalObjectCalls.ts +52 -0
  245. package/src/rules/negativeZeroComparisons.test.ts +210 -0
  246. package/src/rules/negativeZeroComparisons.ts +87 -0
  247. package/src/rules/newExpressions.test.ts +80 -0
  248. package/src/rules/newExpressions.ts +67 -0
  249. package/src/rules/newNativeNonConstructors.test.ts +95 -0
  250. package/src/rules/newNativeNonConstructors.ts +59 -0
  251. package/src/rules/nonOctalDecimalEscapes.test.ts +70 -0
  252. package/src/rules/nonOctalDecimalEscapes.ts +70 -0
  253. package/src/rules/numericLiteralParsing.test.ts +100 -0
  254. package/src/rules/numericLiteralParsing.ts +116 -0
  255. package/src/rules/objectProto.test.ts +97 -0
  256. package/src/rules/objectProto.ts +62 -0
  257. package/src/rules/octalNumbers.test.ts +246 -0
  258. package/src/rules/octalNumbers.ts +75 -0
  259. package/src/rules/returnAssignments.test.ts +186 -0
  260. package/src/rules/returnAssignments.ts +57 -0
  261. package/src/rules/selfAssignments.test.ts +67 -0
  262. package/src/rules/selfAssignments.ts +50 -0
  263. package/src/rules/selfComparisons.test.ts +298 -0
  264. package/src/rules/selfComparisons.ts +45 -0
  265. package/src/rules/sequences.test.ts +49 -0
  266. package/src/rules/sequences.ts +37 -0
  267. package/src/rules/sparseArrays.test.ts +111 -0
  268. package/src/rules/sparseArrays.ts +61 -0
  269. package/src/rules/symbolDescriptions.test.ts +90 -0
  270. package/src/rules/symbolDescriptions.ts +47 -0
  271. package/src/rules/typeofComparisons.test.ts +86 -0
  272. package/src/rules/typeofComparisons.ts +88 -0
  273. package/src/rules/unassignedVariables.test.ts +73 -0
  274. package/src/rules/unassignedVariables.ts +69 -0
  275. package/src/rules/undefinedVariables.test.ts +81 -0
  276. package/src/rules/undefinedVariables.ts +97 -0
  277. package/src/rules/unicodeBOMs.test.ts +66 -0
  278. package/src/rules/unicodeBOMs.ts +44 -0
  279. package/src/rules/unnecessaryCatches.test.ts +211 -0
  280. package/src/rules/unnecessaryCatches.ts +84 -0
  281. package/src/rules/unsafeNegations.test.ts +64 -0
  282. package/src/rules/unsafeNegations.ts +59 -0
  283. package/src/rules/utils/discriminateAnyType.ts +66 -0
  284. package/src/rules/utils/getThisExpression.ts +24 -0
  285. package/src/rules/utils/isUnsafeAssignment.ts +113 -0
  286. package/src/rules/utils/operators.ts +39 -0
  287. package/src/rules/variableDeletions.test.ts +76 -0
  288. package/src/rules/variableDeletions.ts +43 -0
  289. package/src/rules/voidOperator.test.ts +99 -0
  290. package/src/rules/voidOperator.ts +38 -0
  291. package/src/utils/declarationIncludesGlobal.ts +9 -0
  292. package/src/utils/declarationsIncludeGlobal.ts +7 -0
  293. package/src/utils/getModifyingReferences.ts +58 -0
  294. package/src/utils/hasSameTokens.ts +45 -0
  295. package/src/utils/isGlobalDeclaration.ts +12 -0
  296. package/src/utils/isGlobalDeclarationOfName.ts +51 -0
  297. package/src/utils/isGlobalVariable.ts +30 -0
  298. package/src/utils/unwrapParentParenthesizedExpressions.ts +7 -0
  299. package/src/utils/unwrapParenthesizedExpression.ts +9 -0
  300. package/tsconfig.tsbuildinfo +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,22 @@
1
1
  # @flint/ts
2
2
 
3
+ ## 0.14.4
4
+
5
+ ### Patch Changes
6
+
7
+ - 158b542: expose \`program\` in TS rules context
8
+ - Updated dependencies [3d19082]
9
+ - Updated dependencies [a3f9043]
10
+ - @flint.fyi/core@0.15.1
11
+ - @flint.fyi/rule-tester@0.14.2
12
+
13
+ ## 0.14.3
14
+
15
+ ### Patch Changes
16
+
17
+ - 9b6b884: added browser plugin with alerts rule
18
+ - c8bad31: feat: add JSX plugin with accessKeys rule
19
+
3
20
  ## 0.14.2
4
21
 
5
22
  ### Patch Changes
@@ -33,6 +33,7 @@ export function createTypeScriptFileFromProgram(program, sourceFile) {
33
33
  async runRule(rule, options) {
34
34
  const reports = [];
35
35
  const context = {
36
+ program,
36
37
  report: (report) => {
37
38
  reports.push({
38
39
  ...report,
package/lib/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  export { getTSNodeRange } from "./getTSNodeRange.js";
2
2
  export * from "./language.js";
3
3
  export { ts } from "./plugin.js";
4
+ export { isGlobalDeclaration } from "./utils/isGlobalDeclaration.js";
package/lib/index.js CHANGED
@@ -1,3 +1,4 @@
1
1
  export { getTSNodeRange } from "./getTSNodeRange.js";
2
2
  export * from "./language.js";
3
3
  export { ts } from "./plugin.js";
4
+ export { isGlobalDeclaration } from "./utils/isGlobalDeclaration.js";
package/lib/language.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import * as ts from "typescript";
2
2
  import { TSNodesByName } from "./nodes.js";
3
3
  export interface TypeScriptServices {
4
+ program: ts.Program;
4
5
  sourceFile: ts.SourceFile;
5
6
  typeChecker: ts.TypeChecker;
6
7
  }
package/lib/nodes.d.ts CHANGED
@@ -22,6 +22,7 @@ export interface TSNodesByName {
22
22
  ComputedPropertyName: ts.ComputedPropertyName;
23
23
  ConditionalExpression: ts.ConditionalExpression;
24
24
  ConditionalType: ts.ConditionalType;
25
+ Constructor: ts.ConstructorDeclaration;
25
26
  ContinueStatement: ts.ContinueStatement;
26
27
  DebuggerStatement: ts.DebuggerStatement;
27
28
  Decorator: ts.Decorator;
package/lib/plugin.d.ts CHANGED
@@ -1,16 +1,96 @@
1
1
  export declare const ts: import("@flint.fyi/core").Plugin<import("@flint.fyi/core").RuleAbout, string | undefined, [import("@flint.fyi/core").Rule<{
2
+ readonly description: "Reports returning a value with type `any` from a function.";
3
+ readonly id: "anyReturns";
4
+ readonly preset: "logical";
5
+ }, import("./nodes.js").TSNodesByName, import("./language.js").TypeScriptServices, "unsafeReturn" | "unsafeReturnAssignment" | "unsafeReturnThis", undefined>, import("@flint.fyi/core").Rule<{
6
+ readonly description: "Reports using async functions as Promise executor functions.";
7
+ readonly id: "asyncPromiseExecutors";
8
+ readonly preset: "logical";
9
+ }, import("./nodes.js").TSNodesByName, import("./language.js").TypeScriptServices, "asyncPromiseExecutor", undefined>, import("@flint.fyi/core").Rule<{
10
+ readonly description: "Reports lexical declarations in case clauses without wrapping them in blocks.";
11
+ readonly id: "caseDeclarations";
12
+ readonly preset: "untyped";
13
+ }, import("./nodes.js").TSNodesByName, import("./language.js").TypeScriptServices, "unexpectedLexicalDeclaration", undefined>, import("@flint.fyi/core").Rule<{
14
+ readonly description: "Reports switch statements with duplicate case clause test expressions.";
15
+ readonly id: "caseDuplicates";
16
+ readonly preset: "logical";
17
+ }, import("./nodes.js").TSNodesByName, import("./language.js").TypeScriptServices, "duplicateCase", undefined>, import("@flint.fyi/core").Rule<{
18
+ readonly description: "Reports using chained assignment expressions (e.g., a = b = c).";
19
+ readonly id: "chainedAssignments";
20
+ readonly preset: "stylistic";
21
+ }, import("./nodes.js").TSNodesByName, import("./language.js").TypeScriptServices, "noChainedAssignment", undefined>, import("@flint.fyi/core").Rule<{
22
+ readonly description: "Reports reassigning class declarations.";
23
+ readonly id: "classAssignments";
24
+ readonly preset: "untyped";
25
+ }, import("./nodes.js").TSNodesByName, import("./language.js").TypeScriptServices, "noClassAssign", undefined>, import("@flint.fyi/core").Rule<{
2
26
  readonly description: "Reports unnecessary extra non-null assertions.";
3
27
  readonly id: "consecutiveNonNullAssertions";
4
28
  readonly preset: "logical";
5
29
  }, import("./nodes.js").TSNodesByName, import("./language.js").TypeScriptServices, "consecutiveNonNullAssertion", undefined>, import("@flint.fyi/core").Rule<{
30
+ readonly description: "Reports attempting to reassign variables declared with const.";
31
+ readonly id: "constantAssignments";
32
+ readonly preset: "untyped";
33
+ }, import("./nodes.js").TSNodesByName, import("./language.js").TypeScriptServices, "noConstAssign", undefined>, import("@flint.fyi/core").Rule<{
34
+ readonly description: "Reports returning values from constructor functions.";
35
+ readonly id: "constructorReturns";
36
+ readonly preset: "untyped";
37
+ }, import("./nodes.js").TSNodesByName, import("./language.js").TypeScriptServices, "noConstructorReturn", undefined>, import("@flint.fyi/core").Rule<{
6
38
  readonly description: "Reports using debugger statements.";
7
39
  readonly id: "debuggerStatements";
8
40
  readonly preset: "logical";
9
41
  }, import("./nodes.js").TSNodesByName, import("./language.js").TypeScriptServices, "noDebugger", undefined>, import("@flint.fyi/core").Rule<{
42
+ readonly description: "Reports switch statements where the default clause is not last.";
43
+ readonly id: "defaultCaseLast";
44
+ readonly preset: "logical";
45
+ }, import("./nodes.js").TSNodesByName, import("./language.js").TypeScriptServices, "defaultCaseShouldBeLast", undefined>, import("@flint.fyi/core").Rule<{
46
+ readonly description: "Reports functions with duplicate parameter names in their signatures.";
47
+ readonly id: "duplicateArguments";
48
+ readonly preset: "untyped";
49
+ }, import("./nodes.js").TSNodesByName, import("./language.js").TypeScriptServices, "duplicateParam", undefined>, import("@flint.fyi/core").Rule<{
50
+ readonly description: "Reports duplicate conditions in if-else-if chains that make code unreachable.";
51
+ readonly id: "elseIfDuplicates";
52
+ readonly preset: "logical";
53
+ }, import("./nodes.js").TSNodesByName, import("./language.js").TypeScriptServices, "duplicateCondition", undefined>, import("@flint.fyi/core").Rule<{
54
+ readonly description: "Reports using empty destructuring patterns that destructure no values.";
55
+ readonly id: "emptyDestructures";
56
+ readonly preset: "logical";
57
+ }, import("./nodes.js").TSNodesByName, import("./language.js").TypeScriptServices, "emptyPattern", undefined>, import("@flint.fyi/core").Rule<{
58
+ readonly description: "Reports empty static initialization blocks within class declarations.";
59
+ readonly id: "emptyStaticBlocks";
60
+ readonly preset: "stylistic";
61
+ }, import("./nodes.js").TSNodesByName, import("./language.js").TypeScriptServices, "emptyStaticBlock", undefined>, import("@flint.fyi/core").Rule<{
62
+ readonly description: "Reports reassigning exception parameters in catch clauses.";
63
+ readonly id: "exceptionAssignments";
64
+ readonly preset: "logical";
65
+ }, import("./nodes.js").TSNodesByName, import("./language.js").TypeScriptServices, "noExAssign", undefined>, import("@flint.fyi/core").Rule<{
66
+ readonly description: "Reports for loops with counter variables that move in the wrong direction.";
67
+ readonly id: "forDirections";
68
+ readonly preset: "stylistic";
69
+ }, import("./nodes.js").TSNodesByName, import("./language.js").TypeScriptServices, "wrongDirection", undefined>, import("@flint.fyi/core").Rule<{
10
70
  readonly description: "Reports iterating over an array with a for-in loop.";
11
71
  readonly id: "forInArrays";
12
72
  readonly preset: "logical";
13
73
  }, import("./nodes.js").TSNodesByName, import("./language.js").TypeScriptServices, "forIn", undefined>, import("@flint.fyi/core").Rule<{
74
+ readonly description: "Reports reassigning variables declared with function declarations.";
75
+ readonly id: "functionAssignments";
76
+ readonly preset: "untyped";
77
+ }, import("./nodes.js").TSNodesByName, import("./language.js").TypeScriptServices, "noFunctionAssignment", undefined>, import("@flint.fyi/core").Rule<{
78
+ readonly description: "Reports using the Function constructor to create functions from strings.";
79
+ readonly id: "functionNewCalls";
80
+ readonly preset: "logical";
81
+ }, import("./nodes.js").TSNodesByName, import("./language.js").TypeScriptServices, "noFunctionConstructor", undefined>, import("@flint.fyi/core").Rule<{
82
+ readonly description: "Reports generator functions that do not yield values.";
83
+ readonly id: "generatorFunctionYields";
84
+ readonly preset: "logical";
85
+ }, import("./nodes.js").TSNodesByName, import("./language.js").TypeScriptServices, "missingYield", undefined>, import("@flint.fyi/core").Rule<{
86
+ readonly description: "Reports attempting to assign to read-only global variables such as undefined, NaN, Infinity, Object, etc.";
87
+ readonly id: "globalAssignments";
88
+ readonly preset: "untyped";
89
+ }, import("./nodes.js").TSNodesByName, import("./language.js").TypeScriptServices, "noGlobalAssign", undefined>, import("@flint.fyi/core").Rule<{
90
+ readonly description: "Reports calling global objects like Math, JSON, or Reflect as functions.";
91
+ readonly id: "globalObjectCalls";
92
+ readonly preset: "untyped";
93
+ }, import("./nodes.js").TSNodesByName, import("./language.js").TypeScriptServices, "noGlobalObjectCall", undefined>, import("@flint.fyi/core").Rule<{
14
94
  readonly description: "Reports using legacy `namespace` declarations.";
15
95
  readonly id: "namespaceDeclarations";
16
96
  readonly preset: "logical";
@@ -18,7 +98,91 @@ export declare const ts: import("@flint.fyi/core").Plugin<import("@flint.fyi/cor
18
98
  readonly allowDeclarations: import("zod").ZodDefault<import("zod").ZodBoolean>;
19
99
  readonly allowDefinitionFiles: import("zod").ZodDefault<import("zod").ZodBoolean>;
20
100
  }>, import("@flint.fyi/core").Rule<{
101
+ readonly description: "Reports comparisons with -0 that may not behave as expected.";
102
+ readonly id: "negativeZeroComparisons";
103
+ readonly preset: "logical";
104
+ }, import("./nodes.js").TSNodesByName, import("./language.js").TypeScriptServices, "unexpectedNegativeZeroComparison", undefined>, import("@flint.fyi/core").Rule<{
105
+ readonly description: "Reports standalone new expressions that don't use the constructed object.";
106
+ readonly id: "newExpressions";
107
+ readonly preset: "logical";
108
+ }, import("./nodes.js").TSNodesByName, import("./language.js").TypeScriptServices, "noStandaloneNew", undefined>, import("@flint.fyi/core").Rule<{
109
+ readonly description: "Disallows using `new` with global non-constructor functions like Symbol and BigInt.";
110
+ readonly id: "newNativeNonConstructors";
111
+ readonly preset: "untyped";
112
+ }, import("./nodes.js").TSNodesByName, import("./language.js").TypeScriptServices, "noNewNonConstructor", undefined>, import("@flint.fyi/core").Rule<{
113
+ readonly description: "Reports non-octal decimal escape sequences (\\8 and \\9) in string literals.";
114
+ readonly id: "nonOctalDecimalEscapes";
115
+ readonly preset: "logical";
116
+ }, import("./nodes.js").TSNodesByName, import("./language.js").TypeScriptServices, "unexpectedEscape", undefined>, import("@flint.fyi/core").Rule<{
117
+ readonly description: "Reports parseInt calls with binary, hexadecimal, or octal strings that can be replaced with numeric literals.";
118
+ readonly id: "numericLiteralParsing";
119
+ readonly preset: "stylistic";
120
+ }, import("./nodes.js").TSNodesByName, import("./language.js").TypeScriptServices, "preferLiteral", undefined>, import("@flint.fyi/core").Rule<{
121
+ readonly description: "Reports using the deprecated __proto__ property to access or modify an object's prototype.";
122
+ readonly id: "objectProto";
123
+ readonly preset: "untyped";
124
+ }, import("./nodes.js").TSNodesByName, import("./language.js").TypeScriptServices, "noProto", undefined>, import("@flint.fyi/core").Rule<{
21
125
  readonly description: "Reports using octal escape sequences in string literals.";
22
126
  readonly id: "octalEscapes";
23
127
  readonly preset: "logical";
24
- }, import("./nodes.js").TSNodesByName, import("./language.js").TypeScriptServices, "noOctalEscape", undefined>]>;
128
+ }, import("./nodes.js").TSNodesByName, import("./language.js").TypeScriptServices, "noOctalEscape", undefined>, import("@flint.fyi/core").Rule<{
129
+ readonly description: "Reports using legacy octal numeric literals.";
130
+ readonly id: "octalNumbers";
131
+ readonly preset: "untyped";
132
+ }, import("./nodes.js").TSNodesByName, import("./language.js").TypeScriptServices, "noOctalNumber", undefined>, import("@flint.fyi/core").Rule<{
133
+ readonly description: "Reports using assignment expressions in return statements.";
134
+ readonly id: "returnAssignments";
135
+ readonly preset: "stylistic";
136
+ }, import("./nodes.js").TSNodesByName, import("./language.js").TypeScriptServices, "noReturnAssign", undefined>, import("@flint.fyi/core").Rule<{
137
+ readonly description: "Reports self-assignments which have no effect and are likely errors.";
138
+ readonly id: "selfAssignments";
139
+ readonly preset: "logical";
140
+ }, import("./nodes.js").TSNodesByName, import("./language.js").TypeScriptServices, "selfAssignment", undefined>, import("@flint.fyi/core").Rule<{
141
+ readonly description: "Reports comparing a value to itself.";
142
+ readonly id: "selfComparisons";
143
+ readonly preset: "logical";
144
+ }, import("./nodes.js").TSNodesByName, import("./language.js").TypeScriptServices, "noSelfComparison", undefined>, import("@flint.fyi/core").Rule<{
145
+ readonly description: "Reports using the comma operator in expressions.";
146
+ readonly id: "sequences";
147
+ readonly preset: "untyped";
148
+ }, import("./nodes.js").TSNodesByName, import("./language.js").TypeScriptServices, "noSequences", undefined>, import("@flint.fyi/core").Rule<{
149
+ readonly description: "Reports array literals with holes (sparse arrays).";
150
+ readonly id: "sparseArrays";
151
+ readonly preset: "logical";
152
+ }, import("./nodes.js").TSNodesByName, import("./language.js").TypeScriptServices, "noSparseArray", undefined>, import("@flint.fyi/core").Rule<{
153
+ readonly description: "Reports Symbol() calls without description arguments.";
154
+ readonly id: "symbolDescriptions";
155
+ readonly preset: "stylistic";
156
+ }, import("./nodes.js").TSNodesByName, import("./language.js").TypeScriptServices, "missingDescription", undefined>, import("@flint.fyi/core").Rule<{
157
+ readonly description: "Reports typeof expressions that compare impossible string literals.";
158
+ readonly id: "typeofComparisons";
159
+ readonly preset: "untyped";
160
+ }, import("./nodes.js").TSNodesByName, import("./language.js").TypeScriptServices, "invalidValue", undefined>, import("@flint.fyi/core").Rule<{
161
+ readonly description: "Reports variables that are declared but never assigned a value.";
162
+ readonly id: "unassignedVariables";
163
+ readonly preset: "untyped";
164
+ }, import("./nodes.js").TSNodesByName, import("./language.js").TypeScriptServices, "noUnassigned", undefined>, import("@flint.fyi/core").Rule<{
165
+ readonly description: "Reports using variables that are not defined.";
166
+ readonly id: "undefinedVariables";
167
+ readonly preset: "untyped";
168
+ }, import("./nodes.js").TSNodesByName, import("./language.js").TypeScriptServices, "undefinedVariable", undefined>, import("@flint.fyi/core").Rule<{
169
+ readonly description: "Reports files with Unicode Byte Order Marks (BOMs).";
170
+ readonly id: "unicodeBOMs";
171
+ readonly preset: "stylistic";
172
+ }, import("./nodes.js").TSNodesByName, import("./language.js").TypeScriptServices, "noBOM", undefined>, import("@flint.fyi/core").Rule<{
173
+ readonly description: "Reports catch clauses that only rethrow the caught error without modification.";
174
+ readonly id: "unnecessaryCatches";
175
+ readonly preset: "logical";
176
+ }, import("./nodes.js").TSNodesByName, import("./language.js").TypeScriptServices, "unnecessaryCatch", undefined>, import("@flint.fyi/core").Rule<{
177
+ readonly description: "Reports negating the left operand of `in` or `instanceof` relations.";
178
+ readonly id: "unsafeNegations";
179
+ readonly preset: "untyped";
180
+ }, import("./nodes.js").TSNodesByName, import("./language.js").TypeScriptServices, "preferNegatingRelation", undefined>, import("@flint.fyi/core").Rule<{
181
+ readonly description: "Reports attempting to delete variables with the delete operator.";
182
+ readonly id: "variableDeletions";
183
+ readonly preset: "untyped";
184
+ }, import("./nodes.js").TSNodesByName, import("./language.js").TypeScriptServices, "noDeleteVar", undefined>, import("@flint.fyi/core").Rule<{
185
+ readonly description: "Reports using the void operator.";
186
+ readonly id: "voidOperator";
187
+ readonly preset: "stylistic";
188
+ }, import("./nodes.js").TSNodesByName, import("./language.js").TypeScriptServices, "noVoid", undefined>]>;
package/lib/plugin.js CHANGED
@@ -1,19 +1,101 @@
1
1
  import { createPlugin } from "@flint.fyi/core";
2
+ import anyReturns from "./rules/anyReturns.js";
3
+ import asyncPromiseExecutors from "./rules/asyncPromiseExecutors.js";
4
+ import caseDeclarations from "./rules/caseDeclarations.js";
5
+ import caseDuplicates from "./rules/caseDuplicates.js";
6
+ import chainedAssignments from "./rules/chainedAssignments.js";
7
+ import classAssignments from "./rules/classAssignments.js";
2
8
  import consecutiveNonNullAssertions from "./rules/consecutiveNonNullAssertions.js";
9
+ import constantAssignments from "./rules/constantAssignments.js";
10
+ import constructorReturns from "./rules/constructorReturns.js";
3
11
  import debuggerStatements from "./rules/debuggerStatements.js";
12
+ import defaultCaseLast from "./rules/defaultCaseLast.js";
13
+ import duplicateArguments from "./rules/duplicateArguments.js";
14
+ import elseIfDuplicates from "./rules/elseIfDuplicates.js";
15
+ import emptyDestructures from "./rules/emptyDestructures.js";
16
+ import emptyStaticBlocks from "./rules/emptyStaticBlocks.js";
17
+ import exceptionAssignments from "./rules/exceptionAssignments.js";
18
+ import forDirections from "./rules/forDirections.js";
4
19
  import forInArrays from "./rules/forInArrays.js";
20
+ import functionAssignments from "./rules/functionAssignments.js";
21
+ import functionNewCalls from "./rules/functionNewCalls.js";
22
+ import generatorFunctionYields from "./rules/generatorFunctionYields.js";
23
+ import globalAssignments from "./rules/globalAssignments.js";
24
+ import globalObjectCalls from "./rules/globalObjectCalls.js";
5
25
  import namespaceDeclarations from "./rules/namespaceDeclarations.js";
26
+ import negativeZeroComparisons from "./rules/negativeZeroComparisons.js";
27
+ import newExpressions from "./rules/newExpressions.js";
28
+ import newNativeNonConstructors from "./rules/newNativeNonConstructors.js";
29
+ import nonOctalDecimalEscapes from "./rules/nonOctalDecimalEscapes.js";
30
+ import numericLiteralParsing from "./rules/numericLiteralParsing.js";
31
+ import objectProto from "./rules/objectProto.js";
6
32
  import octalEscapes from "./rules/octalEscapes.js";
33
+ import octalNumbers from "./rules/octalNumbers.js";
34
+ import returnAssignments from "./rules/returnAssignments.js";
35
+ import selfAssignments from "./rules/selfAssignments.js";
36
+ import selfComparisons from "./rules/selfComparisons.js";
37
+ import sequences from "./rules/sequences.js";
38
+ import sparseArrays from "./rules/sparseArrays.js";
39
+ import symbolDescriptions from "./rules/symbolDescriptions.js";
40
+ import typeofComparisons from "./rules/typeofComparisons.js";
41
+ import unassignedVariables from "./rules/unassignedVariables.js";
42
+ import undefinedVariables from "./rules/undefinedVariables.js";
43
+ import unicodeBOMs from "./rules/unicodeBOMs.js";
44
+ import unnecessaryCatches from "./rules/unnecessaryCatches.js";
45
+ import unsafeNegations from "./rules/unsafeNegations.js";
46
+ import variableDeletions from "./rules/variableDeletions.js";
47
+ import voidOperator from "./rules/voidOperator.js";
7
48
  export const ts = createPlugin({
8
49
  files: {
9
50
  all: ["**/*.{cjs,js,jsx,mjs,ts,tsx}"],
10
51
  },
11
52
  name: "ts",
12
53
  rules: [
54
+ anyReturns,
55
+ asyncPromiseExecutors,
56
+ caseDeclarations,
57
+ caseDuplicates,
58
+ chainedAssignments,
59
+ classAssignments,
13
60
  consecutiveNonNullAssertions,
61
+ constantAssignments,
62
+ constructorReturns,
14
63
  debuggerStatements,
64
+ defaultCaseLast,
65
+ duplicateArguments,
66
+ elseIfDuplicates,
67
+ emptyDestructures,
68
+ emptyStaticBlocks,
69
+ exceptionAssignments,
70
+ forDirections,
15
71
  forInArrays,
72
+ functionAssignments,
73
+ functionNewCalls,
74
+ generatorFunctionYields,
75
+ globalAssignments,
76
+ globalObjectCalls,
16
77
  namespaceDeclarations,
78
+ negativeZeroComparisons,
79
+ newExpressions,
80
+ newNativeNonConstructors,
81
+ nonOctalDecimalEscapes,
82
+ numericLiteralParsing,
83
+ objectProto,
17
84
  octalEscapes,
85
+ octalNumbers,
86
+ returnAssignments,
87
+ selfAssignments,
88
+ selfComparisons,
89
+ sequences,
90
+ sparseArrays,
91
+ symbolDescriptions,
92
+ typeofComparisons,
93
+ unassignedVariables,
94
+ undefinedVariables,
95
+ unicodeBOMs,
96
+ unnecessaryCatches,
97
+ unsafeNegations,
98
+ variableDeletions,
99
+ voidOperator,
18
100
  ],
19
101
  });
@@ -0,0 +1,6 @@
1
+ declare const _default: import("@flint.fyi/core").Rule<{
2
+ readonly description: "Reports returning a value with type `any` from a function.";
3
+ readonly id: "anyReturns";
4
+ readonly preset: "logical";
5
+ }, import("../nodes.js").TSNodesByName, import("../language.js").TypeScriptServices, "unsafeReturn" | "unsafeReturnAssignment" | "unsafeReturnThis", undefined>;
6
+ export default _default;
@@ -0,0 +1,187 @@
1
+ import * as tsutils from "ts-api-utils";
2
+ import * as ts from "typescript";
3
+ import { typescriptLanguage } from "../language.js";
4
+ import { AnyType, discriminateAnyType } from "./utils/discriminateAnyType.js";
5
+ import { getConstrainedTypeAtLocation } from "./utils/getConstrainedType.js";
6
+ import { getThisExpression } from "./utils/getThisExpression.js";
7
+ import { isUnsafeAssignment } from "./utils/isUnsafeAssignment.js";
8
+ export default typescriptLanguage.createRule({
9
+ about: {
10
+ description: "Reports returning a value with type `any` from a function.",
11
+ id: "anyReturns",
12
+ preset: "logical",
13
+ },
14
+ messages: {
15
+ unsafeReturn: {
16
+ primary: "Unsafe return of a value of type {{ type }}.",
17
+ secondary: [
18
+ "Returning a value of type `any` or a similar unsafe type defeats TypeScript's type safety guarantees.",
19
+ "This can allow unexpected types to propagate through your codebase, potentially causing runtime errors.",
20
+ ],
21
+ suggestions: [
22
+ "Ensure the returned value has a well-defined, specific type.",
23
+ ],
24
+ },
25
+ unsafeReturnAssignment: {
26
+ primary: "Unsafe return of type `{{ sender }}` from function with return type `{{ receiver }}`.",
27
+ secondary: [
28
+ "The function's declared return type does not safely accept the value being returned.",
29
+ "This can allow unexpected types to propagate through your codebase, potentially causing runtime errors.",
30
+ ],
31
+ suggestions: [
32
+ "Adjust the return type of the function to match the returned value, if appropriate.",
33
+ "Otherwise, refine the returned value to ensure it matches the expected return type.",
34
+ ],
35
+ },
36
+ unsafeReturnThis: {
37
+ primary: "Unsafe return of a value of type `{{ type }}`. `this` is typed as `any`.",
38
+ secondary: [
39
+ "Returning `this` when it is implicitly typed as `any` introduces type-unsafe behavior.",
40
+ "This can allow unexpected types to propagate through your codebase, potentially causing runtime errors.",
41
+ ],
42
+ suggestions: [
43
+ "Enable the `noImplicitThis` compiler option to enforce explicit `this` types.",
44
+ "Add an explicit `this` parameter to the function to clarify its type.",
45
+ ],
46
+ },
47
+ },
48
+ setup(context) {
49
+ const isNoImplicitThis = tsutils.isStrictCompilerOptionEnabled(context.program.getCompilerOptions(), "noImplicitThis");
50
+ function checkReturn(returnNode, reportingNode) {
51
+ const type = context.typeChecker.getTypeAtLocation(returnNode);
52
+ const anyType = discriminateAnyType(type, context.typeChecker, context.program, returnNode);
53
+ const functionNode = ts.findAncestor(returnNode,
54
+ // TODO: I believe isFunctionLikeDeclaration was incorrectly marked
55
+ // as deprecated in https://github.com/JoshuaKGoldberg/ts-api-utils/pull/124
56
+ // It says "With TypeScript v5, in favor of typescript's `isFunctionLike`."
57
+ // However, isFunctionLike also checks for signature-like nodes,
58
+ // whereas isFunctionLikeDeclaration checks only for function-like nodes.
59
+ // eslint-disable-next-line @typescript-eslint/no-deprecated
60
+ tsutils.isFunctionLikeDeclaration);
61
+ if (!functionNode) {
62
+ return;
63
+ }
64
+ // function has an explicit return type, so ensure it's a safe return
65
+ const returnNodeType = getConstrainedTypeAtLocation(returnNode, context.typeChecker);
66
+ // function expressions will not have their return type modified based on receiver typing
67
+ // so we have to use the contextual typing in these cases, i.e.
68
+ // const foo1: () => Set<string> = () => new Set<any>();
69
+ // the return type of the arrow function is Set<any> even though the variable is typed as Set<string>
70
+ let functionType = ts.isFunctionExpression(functionNode) ||
71
+ ts.isArrowFunction(functionNode)
72
+ ? context.typeChecker.getContextualType(functionNode)
73
+ : context.typeChecker.getTypeAtLocation(functionNode);
74
+ functionType ??= context.typeChecker.getTypeAtLocation(functionNode);
75
+ const callSignatures = tsutils.getCallSignaturesOfType(functionType);
76
+ // If there is an explicit type annotation *and* that type matches the actual
77
+ // function return type, we shouldn't complain (it's intentional, even if unsafe)
78
+ if (functionNode.type) {
79
+ for (const signature of callSignatures) {
80
+ const signatureReturnType = signature.getReturnType();
81
+ if (returnNodeType === signatureReturnType ||
82
+ tsutils.isTypeFlagSet(signatureReturnType, ts.TypeFlags.Any | ts.TypeFlags.Unknown)) {
83
+ return;
84
+ }
85
+ if (tsutils.includesModifier(functionNode.modifiers, ts.SyntaxKind.AsyncKeyword)) {
86
+ const awaitedSignatureReturnType = context.typeChecker.getAwaitedType(signatureReturnType);
87
+ const awaitedReturnNodeType = context.typeChecker.getAwaitedType(returnNodeType);
88
+ if (awaitedReturnNodeType === awaitedSignatureReturnType ||
89
+ (awaitedSignatureReturnType &&
90
+ tsutils.isTypeFlagSet(awaitedSignatureReturnType, ts.TypeFlags.Any | ts.TypeFlags.Unknown))) {
91
+ return;
92
+ }
93
+ }
94
+ }
95
+ }
96
+ if (anyType !== AnyType.Safe) {
97
+ // Allow cases when the declared return type of the function is either unknown or unknown[]
98
+ // and the function is returning any or any[].
99
+ for (const signature of callSignatures) {
100
+ const functionReturnType = signature.getReturnType();
101
+ if (anyType === AnyType.Any &&
102
+ tsutils.isTypeFlagSet(functionReturnType, ts.TypeFlags.Unknown)) {
103
+ return;
104
+ }
105
+ if (anyType === AnyType.AnyArray &&
106
+ context.typeChecker.isArrayType(functionReturnType) &&
107
+ tsutils.isTypeFlagSet(context.typeChecker.getTypeArguments(functionReturnType)[0], ts.TypeFlags.Unknown)) {
108
+ return;
109
+ }
110
+ const awaitedType = context.typeChecker.getAwaitedType(functionReturnType);
111
+ if (awaitedType &&
112
+ anyType === AnyType.PromiseAny &&
113
+ tsutils.isTypeFlagSet(awaitedType, ts.TypeFlags.Unknown)) {
114
+ return;
115
+ }
116
+ }
117
+ if (anyType === AnyType.PromiseAny &&
118
+ !tsutils.includesModifier(functionNode.modifiers, ts.SyntaxKind.AsyncKeyword)) {
119
+ return;
120
+ }
121
+ let message = "unsafeReturn";
122
+ const isErrorType = tsutils.isIntrinsicErrorType(returnNodeType);
123
+ if (!isNoImplicitThis) {
124
+ // `return this`
125
+ const thisExpression = getThisExpression(returnNode);
126
+ if (thisExpression &&
127
+ tsutils.isTypeFlagSet(getConstrainedTypeAtLocation(thisExpression, context.typeChecker), ts.TypeFlags.Any)) {
128
+ message = "unsafeReturnThis";
129
+ }
130
+ }
131
+ // If the function return type was not unknown/unknown[], mark usage as unsafeReturn.
132
+ context.report({
133
+ data: {
134
+ type: isErrorType
135
+ ? "error"
136
+ : anyType === AnyType.Any
137
+ ? "`any`"
138
+ : anyType === AnyType.PromiseAny
139
+ ? "`Promise<any>`"
140
+ : "`any[]`",
141
+ },
142
+ message,
143
+ range: {
144
+ begin: reportingNode.getStart(),
145
+ end: reportingNode.getEnd(),
146
+ },
147
+ });
148
+ return;
149
+ }
150
+ const signature = functionType.getCallSignatures().at(0);
151
+ if (signature) {
152
+ const functionReturnType = signature.getReturnType();
153
+ const result = isUnsafeAssignment(returnNodeType, functionReturnType, context.typeChecker, returnNode);
154
+ if (!result) {
155
+ return;
156
+ }
157
+ const { receiver, sender } = result;
158
+ context.report({
159
+ data: {
160
+ receiver: context.typeChecker.typeToString(receiver),
161
+ sender: context.typeChecker.typeToString(sender),
162
+ },
163
+ message: "unsafeReturnAssignment",
164
+ range: {
165
+ begin: reportingNode.getStart(),
166
+ end: reportingNode.getEnd(),
167
+ },
168
+ });
169
+ return;
170
+ }
171
+ }
172
+ return {
173
+ visitors: {
174
+ ArrowFunction: (node) => {
175
+ if (!ts.isBlock(node.body)) {
176
+ checkReturn(node.body, node.body);
177
+ }
178
+ },
179
+ ReturnStatement: (node) => {
180
+ if (node.expression != null) {
181
+ checkReturn(node.expression, node);
182
+ }
183
+ },
184
+ },
185
+ };
186
+ },
187
+ });
@@ -0,0 +1 @@
1
+ export {};