@depup/typescript-eslint__eslint-plugin 8.57.1-depup.0

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 (461) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +25 -0
  3. package/changes.json +5 -0
  4. package/dist/configs/eslint-recommended-raw.d.ts +10 -0
  5. package/dist/configs/eslint-recommended-raw.js +46 -0
  6. package/dist/configs/eslintrc/all.d.ts +159 -0
  7. package/dist/configs/eslintrc/all.js +165 -0
  8. package/dist/configs/eslintrc/base.d.ts +8 -0
  9. package/dist/configs/eslintrc/base.js +6 -0
  10. package/dist/configs/eslintrc/disable-type-checked.d.ts +71 -0
  11. package/dist/configs/eslintrc/disable-type-checked.js +73 -0
  12. package/dist/configs/eslintrc/eslint-recommended.d.ts +12 -0
  13. package/dist/configs/eslintrc/eslint-recommended.js +13 -0
  14. package/dist/configs/eslintrc/recommended-type-checked-only.d.ts +33 -0
  15. package/dist/configs/eslintrc/recommended-type-checked-only.js +39 -0
  16. package/dist/configs/eslintrc/recommended-type-checked.d.ts +56 -0
  17. package/dist/configs/eslintrc/recommended-type-checked.js +62 -0
  18. package/dist/configs/eslintrc/recommended.d.ts +29 -0
  19. package/dist/configs/eslintrc/recommended.js +35 -0
  20. package/dist/configs/eslintrc/strict-type-checked-only.d.ts +64 -0
  21. package/dist/configs/eslintrc/strict-type-checked-only.js +79 -0
  22. package/dist/configs/eslintrc/strict-type-checked.d.ts +98 -0
  23. package/dist/configs/eslintrc/strict-type-checked.js +114 -0
  24. package/dist/configs/eslintrc/strict.d.ts +40 -0
  25. package/dist/configs/eslintrc/strict.js +47 -0
  26. package/dist/configs/eslintrc/stylistic-type-checked-only.d.ts +15 -0
  27. package/dist/configs/eslintrc/stylistic-type-checked-only.js +21 -0
  28. package/dist/configs/eslintrc/stylistic-type-checked.d.ts +29 -0
  29. package/dist/configs/eslintrc/stylistic-type-checked.js +35 -0
  30. package/dist/configs/eslintrc/stylistic.d.ts +20 -0
  31. package/dist/configs/eslintrc/stylistic.js +26 -0
  32. package/dist/configs/flat/all.d.ts +7 -0
  33. package/dist/configs/flat/all.js +179 -0
  34. package/dist/configs/flat/base.d.ts +8 -0
  35. package/dist/configs/flat/base.js +17 -0
  36. package/dist/configs/flat/disable-type-checked.d.ts +7 -0
  37. package/dist/configs/flat/disable-type-checked.js +81 -0
  38. package/dist/configs/flat/eslint-recommended.d.ts +9 -0
  39. package/dist/configs/flat/eslint-recommended.js +16 -0
  40. package/dist/configs/flat/recommended-type-checked-only.d.ts +7 -0
  41. package/dist/configs/flat/recommended-type-checked-only.js +53 -0
  42. package/dist/configs/flat/recommended-type-checked.d.ts +7 -0
  43. package/dist/configs/flat/recommended-type-checked.js +76 -0
  44. package/dist/configs/flat/recommended.d.ts +7 -0
  45. package/dist/configs/flat/recommended.js +49 -0
  46. package/dist/configs/flat/strict-type-checked-only.d.ts +7 -0
  47. package/dist/configs/flat/strict-type-checked-only.js +93 -0
  48. package/dist/configs/flat/strict-type-checked.d.ts +7 -0
  49. package/dist/configs/flat/strict-type-checked.js +128 -0
  50. package/dist/configs/flat/strict.d.ts +7 -0
  51. package/dist/configs/flat/strict.js +61 -0
  52. package/dist/configs/flat/stylistic-type-checked-only.d.ts +7 -0
  53. package/dist/configs/flat/stylistic-type-checked-only.js +35 -0
  54. package/dist/configs/flat/stylistic-type-checked.d.ts +7 -0
  55. package/dist/configs/flat/stylistic-type-checked.js +49 -0
  56. package/dist/configs/flat/stylistic.d.ts +7 -0
  57. package/dist/configs/flat/stylistic.js +40 -0
  58. package/dist/index.d.ts +1128 -0
  59. package/dist/index.js +6 -0
  60. package/dist/raw-plugin.d.ts +1152 -0
  61. package/dist/raw-plugin.js +122 -0
  62. package/dist/rules/adjacent-overload-signatures.d.ts +4 -0
  63. package/dist/rules/adjacent-overload-signatures.js +124 -0
  64. package/dist/rules/array-type.d.ts +12 -0
  65. package/dist/rules/array-type.js +232 -0
  66. package/dist/rules/await-thenable.d.ts +6 -0
  67. package/dist/rules/await-thenable.js +228 -0
  68. package/dist/rules/ban-ts-comment.d.ts +17 -0
  69. package/dist/rules/ban-ts-comment.js +195 -0
  70. package/dist/rules/ban-tslint-comment.d.ts +4 -0
  71. package/dist/rules/ban-tslint-comment.js +53 -0
  72. package/dist/rules/class-literal-property-style.d.ts +7 -0
  73. package/dist/rules/class-literal-property-style.js +160 -0
  74. package/dist/rules/class-methods-use-this.d.ts +13 -0
  75. package/dist/rules/class-methods-use-this.js +219 -0
  76. package/dist/rules/consistent-generic-constructors.d.ts +6 -0
  77. package/dist/rules/consistent-generic-constructors.js +126 -0
  78. package/dist/rules/consistent-indexed-object-style.d.ts +7 -0
  79. package/dist/rules/consistent-indexed-object-style.js +256 -0
  80. package/dist/rules/consistent-return.d.ts +18 -0
  81. package/dist/rules/consistent-return.js +135 -0
  82. package/dist/rules/consistent-type-assertions.d.ts +14 -0
  83. package/dist/rules/consistent-type-assertions.js +256 -0
  84. package/dist/rules/consistent-type-definitions.d.ts +5 -0
  85. package/dist/rules/consistent-type-definitions.js +100 -0
  86. package/dist/rules/consistent-type-exports.d.ts +11 -0
  87. package/dist/rules/consistent-type-exports.js +335 -0
  88. package/dist/rules/consistent-type-imports.d.ts +15 -0
  89. package/dist/rules/consistent-type-imports.js +608 -0
  90. package/dist/rules/default-param-last.d.ts +4 -0
  91. package/dist/rules/default-param-last.js +68 -0
  92. package/dist/rules/dot-notation.d.ts +23 -0
  93. package/dist/rules/dot-notation.js +139 -0
  94. package/dist/rules/enum-utils/shared.d.ts +36 -0
  95. package/dist/rules/enum-utils/shared.js +121 -0
  96. package/dist/rules/explicit-function-return-type.d.ts +17 -0
  97. package/dist/rules/explicit-function-return-type.js +179 -0
  98. package/dist/rules/explicit-member-accessibility.d.ts +19 -0
  99. package/dist/rules/explicit-member-accessibility.js +299 -0
  100. package/dist/rules/explicit-module-boundary-types.d.ts +15 -0
  101. package/dist/rules/explicit-module-boundary-types.js +386 -0
  102. package/dist/rules/index.d.ts +448 -0
  103. package/dist/rules/index.js +275 -0
  104. package/dist/rules/init-declarations.d.ts +15 -0
  105. package/dist/rules/init-declarations.js +105 -0
  106. package/dist/rules/max-params.d.ts +25 -0
  107. package/dist/rules/max-params.js +72 -0
  108. package/dist/rules/member-ordering.d.ts +33 -0
  109. package/dist/rules/member-ordering.js +833 -0
  110. package/dist/rules/method-signature-style.d.ts +6 -0
  111. package/dist/rules/method-signature-style.js +186 -0
  112. package/dist/rules/naming-convention-utils/enums.d.ts +79 -0
  113. package/dist/rules/naming-convention-utils/enums.js +102 -0
  114. package/dist/rules/naming-convention-utils/format.d.ts +2 -0
  115. package/dist/rules/naming-convention-utils/format.js +89 -0
  116. package/dist/rules/naming-convention-utils/index.d.ts +6 -0
  117. package/dist/rules/naming-convention-utils/index.js +11 -0
  118. package/dist/rules/naming-convention-utils/parse-options.d.ts +2 -0
  119. package/dist/rules/naming-convention-utils/parse-options.js +69 -0
  120. package/dist/rules/naming-convention-utils/schema.d.ts +2 -0
  121. package/dist/rules/naming-convention-utils/schema.js +305 -0
  122. package/dist/rules/naming-convention-utils/shared.d.ts +5 -0
  123. package/dist/rules/naming-convention-utils/shared.js +16 -0
  124. package/dist/rules/naming-convention-utils/types.d.ts +39 -0
  125. package/dist/rules/naming-convention-utils/types.js +2 -0
  126. package/dist/rules/naming-convention-utils/validator.d.ts +3 -0
  127. package/dist/rules/naming-convention-utils/validator.js +349 -0
  128. package/dist/rules/naming-convention.d.ts +8 -0
  129. package/dist/rules/naming-convention.js +505 -0
  130. package/dist/rules/no-array-constructor.d.ts +4 -0
  131. package/dist/rules/no-array-constructor.js +62 -0
  132. package/dist/rules/no-array-delete.d.ts +6 -0
  133. package/dist/rules/no-array-delete.js +80 -0
  134. package/dist/rules/no-base-to-string.d.ts +11 -0
  135. package/dist/rules/no-base-to-string.js +324 -0
  136. package/dist/rules/no-confusing-non-null-assertion.d.ts +6 -0
  137. package/dist/rules/no-confusing-non-null-assertion.js +142 -0
  138. package/dist/rules/no-confusing-void-expression.d.ts +13 -0
  139. package/dist/rules/no-confusing-void-expression.js +357 -0
  140. package/dist/rules/no-deprecated.d.ts +11 -0
  141. package/dist/rules/no-deprecated.js +402 -0
  142. package/dist/rules/no-dupe-class-members.d.ts +14 -0
  143. package/dist/rules/no-dupe-class-members.js +39 -0
  144. package/dist/rules/no-duplicate-enum-values.d.ts +4 -0
  145. package/dist/rules/no-duplicate-enum-values.js +83 -0
  146. package/dist/rules/no-duplicate-type-constituents.d.ts +11 -0
  147. package/dist/rules/no-duplicate-type-constituents.js +219 -0
  148. package/dist/rules/no-dynamic-delete.d.ts +4 -0
  149. package/dist/rules/no-dynamic-delete.js +42 -0
  150. package/dist/rules/no-empty-function.d.ts +16 -0
  151. package/dist/rules/no-empty-function.js +134 -0
  152. package/dist/rules/no-empty-interface.d.ts +11 -0
  153. package/dist/rules/no-empty-interface.js +102 -0
  154. package/dist/rules/no-empty-object-type.d.ts +15 -0
  155. package/dist/rules/no-empty-object-type.js +143 -0
  156. package/dist/rules/no-explicit-any.d.ts +12 -0
  157. package/dist/rules/no-explicit-any.js +197 -0
  158. package/dist/rules/no-extra-non-null-assertion.d.ts +4 -0
  159. package/dist/rules/no-extra-non-null-assertion.js +35 -0
  160. package/dist/rules/no-extraneous-class.d.ts +13 -0
  161. package/dist/rules/no-extraneous-class.js +120 -0
  162. package/dist/rules/no-floating-promises.d.ts +16 -0
  163. package/dist/rules/no-floating-promises.js +365 -0
  164. package/dist/rules/no-for-in-array.d.ts +4 -0
  165. package/dist/rules/no-for-in-array.js +86 -0
  166. package/dist/rules/no-implied-eval.d.ts +4 -0
  167. package/dist/rules/no-implied-eval.js +152 -0
  168. package/dist/rules/no-import-type-side-effects.d.ts +7 -0
  169. package/dist/rules/no-import-type-side-effects.js +53 -0
  170. package/dist/rules/no-inferrable-types.d.ts +11 -0
  171. package/dist/rules/no-inferrable-types.js +182 -0
  172. package/dist/rules/no-invalid-this.d.ts +15 -0
  173. package/dist/rules/no-invalid-this.js +75 -0
  174. package/dist/rules/no-invalid-void-type.d.ts +9 -0
  175. package/dist/rules/no-invalid-void-type.js +210 -0
  176. package/dist/rules/no-loop-func.d.ts +13 -0
  177. package/dist/rules/no-loop-func.js +187 -0
  178. package/dist/rules/no-loss-of-precision.d.ts +9 -0
  179. package/dist/rules/no-loss-of-precision.js +35 -0
  180. package/dist/rules/no-magic-numbers.d.ts +29 -0
  181. package/dist/rules/no-magic-numbers.js +248 -0
  182. package/dist/rules/no-meaningless-void-operator.d.ts +10 -0
  183. package/dist/rules/no-meaningless-void-operator.js +102 -0
  184. package/dist/rules/no-misused-new.d.ts +4 -0
  185. package/dist/rules/no-misused-new.js +81 -0
  186. package/dist/rules/no-misused-promises.d.ts +21 -0
  187. package/dist/rules/no-misused-promises.js +765 -0
  188. package/dist/rules/no-misused-spread.d.ts +12 -0
  189. package/dist/rules/no-misused-spread.js +260 -0
  190. package/dist/rules/no-mixed-enums.d.ts +4 -0
  191. package/dist/rules/no-mixed-enums.js +200 -0
  192. package/dist/rules/no-namespace.d.ts +11 -0
  193. package/dist/rules/no-namespace.js +60 -0
  194. package/dist/rules/no-non-null-asserted-nullish-coalescing.d.ts +5 -0
  195. package/dist/rules/no-non-null-asserted-nullish-coalescing.js +73 -0
  196. package/dist/rules/no-non-null-asserted-optional-chain.d.ts +5 -0
  197. package/dist/rules/no-non-null-asserted-optional-chain.js +65 -0
  198. package/dist/rules/no-non-null-assertion.d.ts +6 -0
  199. package/dist/rules/no-non-null-assertion.js +93 -0
  200. package/dist/rules/no-redeclare.d.ts +12 -0
  201. package/dist/rules/no-redeclare.js +199 -0
  202. package/dist/rules/no-redundant-type-constituents.d.ts +4 -0
  203. package/dist/rules/no-redundant-type-constituents.js +431 -0
  204. package/dist/rules/no-require-imports.d.ts +11 -0
  205. package/dist/rules/no-require-imports.js +115 -0
  206. package/dist/rules/no-restricted-imports.d.ts +9 -0
  207. package/dist/rules/no-restricted-imports.js +243 -0
  208. package/dist/rules/no-restricted-types.d.ts +16 -0
  209. package/dist/rules/no-restricted-types.js +165 -0
  210. package/dist/rules/no-shadow.d.ts +16 -0
  211. package/dist/rules/no-shadow.js +521 -0
  212. package/dist/rules/no-this-alias.d.ts +11 -0
  213. package/dist/rules/no-this-alias.js +66 -0
  214. package/dist/rules/no-type-alias.d.ts +18 -0
  215. package/dist/rules/no-type-alias.js +268 -0
  216. package/dist/rules/no-unnecessary-boolean-literal-compare.d.ts +12 -0
  217. package/dist/rules/no-unnecessary-boolean-literal-compare.js +263 -0
  218. package/dist/rules/no-unnecessary-condition.d.ts +14 -0
  219. package/dist/rules/no-unnecessary-condition.js +675 -0
  220. package/dist/rules/no-unnecessary-parameter-property-assignment.d.ts +4 -0
  221. package/dist/rules/no-unnecessary-parameter-property-assignment.js +148 -0
  222. package/dist/rules/no-unnecessary-qualifier.d.ts +4 -0
  223. package/dist/rules/no-unnecessary-qualifier.js +156 -0
  224. package/dist/rules/no-unnecessary-template-expression.d.ts +6 -0
  225. package/dist/rules/no-unnecessary-template-expression.js +361 -0
  226. package/dist/rules/no-unnecessary-type-arguments.d.ts +5 -0
  227. package/dist/rules/no-unnecessary-type-arguments.js +197 -0
  228. package/dist/rules/no-unnecessary-type-assertion.d.ts +11 -0
  229. package/dist/rules/no-unnecessary-type-assertion.js +353 -0
  230. package/dist/rules/no-unnecessary-type-constraint.d.ts +5 -0
  231. package/dist/rules/no-unnecessary-type-constraint.js +119 -0
  232. package/dist/rules/no-unnecessary-type-conversion.d.ts +5 -0
  233. package/dist/rules/no-unnecessary-type-conversion.js +356 -0
  234. package/dist/rules/no-unnecessary-type-parameters.d.ts +5 -0
  235. package/dist/rules/no-unnecessary-type-parameters.js +422 -0
  236. package/dist/rules/no-unsafe-argument.d.ts +5 -0
  237. package/dist/rules/no-unsafe-argument.js +272 -0
  238. package/dist/rules/no-unsafe-assignment.d.ts +4 -0
  239. package/dist/rules/no-unsafe-assignment.js +322 -0
  240. package/dist/rules/no-unsafe-call.d.ts +5 -0
  241. package/dist/rules/no-unsafe-call.js +136 -0
  242. package/dist/rules/no-unsafe-declaration-merging.d.ts +4 -0
  243. package/dist/rules/no-unsafe-declaration-merging.js +54 -0
  244. package/dist/rules/no-unsafe-enum-comparison.d.ts +5 -0
  245. package/dist/rules/no-unsafe-enum-comparison.js +192 -0
  246. package/dist/rules/no-unsafe-function-type.d.ts +4 -0
  247. package/dist/rules/no-unsafe-function-type.js +45 -0
  248. package/dist/rules/no-unsafe-member-access.d.ts +10 -0
  249. package/dist/rules/no-unsafe-member-access.js +183 -0
  250. package/dist/rules/no-unsafe-return.d.ts +4 -0
  251. package/dist/rules/no-unsafe-return.js +183 -0
  252. package/dist/rules/no-unsafe-type-assertion.d.ts +4 -0
  253. package/dist/rules/no-unsafe-type-assertion.js +158 -0
  254. package/dist/rules/no-unsafe-unary-minus.d.ts +6 -0
  255. package/dist/rules/no-unsafe-unary-minus.js +78 -0
  256. package/dist/rules/no-unused-expressions.d.ts +19 -0
  257. package/dist/rules/no-unused-expressions.js +64 -0
  258. package/dist/rules/no-unused-private-class-members.d.ts +6 -0
  259. package/dist/rules/no-unused-private-class-members.js +44 -0
  260. package/dist/rules/no-unused-vars.d.ts +24 -0
  261. package/dist/rules/no-unused-vars.js +1033 -0
  262. package/dist/rules/no-use-before-define.d.ts +16 -0
  263. package/dist/rules/no-use-before-define.js +303 -0
  264. package/dist/rules/no-useless-constructor.d.ts +11 -0
  265. package/dist/rules/no-useless-constructor.js +57 -0
  266. package/dist/rules/no-useless-default-assignment.d.ts +11 -0
  267. package/dist/rules/no-useless-default-assignment.js +318 -0
  268. package/dist/rules/no-useless-empty-export.d.ts +4 -0
  269. package/dist/rules/no-useless-empty-export.js +70 -0
  270. package/dist/rules/no-var-requires.d.ts +10 -0
  271. package/dist/rules/no-var-requires.js +83 -0
  272. package/dist/rules/no-wrapper-object-types.d.ts +5 -0
  273. package/dist/rules/no-wrapper-object-types.js +60 -0
  274. package/dist/rules/non-nullable-type-assertion-style.d.ts +4 -0
  275. package/dist/rules/non-nullable-type-assertion-style.js +132 -0
  276. package/dist/rules/only-throw-error.d.ts +14 -0
  277. package/dist/rules/only-throw-error.js +158 -0
  278. package/dist/rules/parameter-properties.d.ts +13 -0
  279. package/dist/rules/parameter-properties.js +164 -0
  280. package/dist/rules/prefer-as-const.d.ts +5 -0
  281. package/dist/rules/prefer-as-const.js +72 -0
  282. package/dist/rules/prefer-destructuring.d.ts +19 -0
  283. package/dist/rules/prefer-destructuring.js +216 -0
  284. package/dist/rules/prefer-enum-initializers.d.ts +6 -0
  285. package/dist/rules/prefer-enum-initializers.js +62 -0
  286. package/dist/rules/prefer-find.d.ts +5 -0
  287. package/dist/rules/prefer-find.js +247 -0
  288. package/dist/rules/prefer-for-of.d.ts +5 -0
  289. package/dist/rules/prefer-for-of.js +115 -0
  290. package/dist/rules/prefer-function-type.d.ts +9 -0
  291. package/dist/rules/prefer-function-type.js +186 -0
  292. package/dist/rules/prefer-includes.d.ts +5 -0
  293. package/dist/rules/prefer-includes.js +242 -0
  294. package/dist/rules/prefer-literal-enum-member.d.ts +6 -0
  295. package/dist/rules/prefer-literal-enum-member.js +116 -0
  296. package/dist/rules/prefer-namespace-keyword.d.ts +4 -0
  297. package/dist/rules/prefer-namespace-keyword.js +42 -0
  298. package/dist/rules/prefer-nullish-coalescing.d.ts +22 -0
  299. package/dist/rules/prefer-nullish-coalescing.js +647 -0
  300. package/dist/rules/prefer-optional-chain-utils/PreferOptionalChainOptions.d.ts +11 -0
  301. package/dist/rules/prefer-optional-chain-utils/PreferOptionalChainOptions.js +2 -0
  302. package/dist/rules/prefer-optional-chain-utils/analyzeChain.d.ts +7 -0
  303. package/dist/rules/prefer-optional-chain-utils/analyzeChain.js +569 -0
  304. package/dist/rules/prefer-optional-chain-utils/checkNullishAndReport.d.ts +6 -0
  305. package/dist/rules/prefer-optional-chain-utils/checkNullishAndReport.js +45 -0
  306. package/dist/rules/prefer-optional-chain-utils/compareNodes.d.ts +15 -0
  307. package/dist/rules/prefer-optional-chain-utils/compareNodes.js +326 -0
  308. package/dist/rules/prefer-optional-chain-utils/gatherLogicalOperands.d.ts +61 -0
  309. package/dist/rules/prefer-optional-chain-utils/gatherLogicalOperands.js +411 -0
  310. package/dist/rules/prefer-optional-chain.d.ts +5 -0
  311. package/dist/rules/prefer-optional-chain.js +150 -0
  312. package/dist/rules/prefer-promise-reject-errors.d.ts +14 -0
  313. package/dist/rules/prefer-promise-reject-errors.js +124 -0
  314. package/dist/rules/prefer-readonly-parameter-types.d.ts +14 -0
  315. package/dist/rules/prefer-readonly-parameter-types.js +89 -0
  316. package/dist/rules/prefer-readonly.d.ts +10 -0
  317. package/dist/rules/prefer-readonly.js +439 -0
  318. package/dist/rules/prefer-reduce-type-parameter.d.ts +4 -0
  319. package/dist/rules/prefer-reduce-type-parameter.js +114 -0
  320. package/dist/rules/prefer-regexp-exec.d.ts +4 -0
  321. package/dist/rules/prefer-regexp-exec.js +178 -0
  322. package/dist/rules/prefer-return-this-type.d.ts +4 -0
  323. package/dist/rules/prefer-return-this-type.js +154 -0
  324. package/dist/rules/prefer-string-starts-ends-with.d.ts +12 -0
  325. package/dist/rules/prefer-string-starts-ends-with.js +512 -0
  326. package/dist/rules/prefer-ts-expect-error.d.ts +5 -0
  327. package/dist/rules/prefer-ts-expect-error.js +71 -0
  328. package/dist/rules/promise-function-async.d.ts +15 -0
  329. package/dist/rules/promise-function-async.js +204 -0
  330. package/dist/rules/related-getter-setter-pairs.d.ts +4 -0
  331. package/dist/rules/related-getter-setter-pairs.js +71 -0
  332. package/dist/rules/require-array-sort-compare.d.ts +10 -0
  333. package/dist/rules/require-array-sort-compare.js +63 -0
  334. package/dist/rules/require-await.d.ts +4 -0
  335. package/dist/rules/require-await.js +263 -0
  336. package/dist/rules/restrict-plus-operands.d.ts +15 -0
  337. package/dist/rules/restrict-plus-operands.js +231 -0
  338. package/dist/rules/restrict-template-expressions.d.ts +19 -0
  339. package/dist/rules/restrict-template-expressions.js +119 -0
  340. package/dist/rules/return-await.d.ts +5 -0
  341. package/dist/rules/return-await.js +363 -0
  342. package/dist/rules/sort-type-constituents.d.ts +14 -0
  343. package/dist/rules/sort-type-constituents.js +272 -0
  344. package/dist/rules/strict-boolean-expressions.d.ts +19 -0
  345. package/dist/rules/strict-boolean-expressions.js +882 -0
  346. package/dist/rules/strict-void-return.d.ts +10 -0
  347. package/dist/rules/strict-void-return.js +374 -0
  348. package/dist/rules/switch-exhaustiveness-check.d.ts +33 -0
  349. package/dist/rules/switch-exhaustiveness-check.js +291 -0
  350. package/dist/rules/triple-slash-reference.d.ts +12 -0
  351. package/dist/rules/triple-slash-reference.js +110 -0
  352. package/dist/rules/typedef.d.ts +16 -0
  353. package/dist/rules/typedef.js +239 -0
  354. package/dist/rules/unbound-method.d.ts +9 -0
  355. package/dist/rules/unbound-method.js +334 -0
  356. package/dist/rules/unified-signatures.d.ts +11 -0
  357. package/dist/rules/unified-signatures.js +465 -0
  358. package/dist/rules/use-unknown-in-catch-callback-variable.d.ts +6 -0
  359. package/dist/rules/use-unknown-in-catch-callback-variable.js +261 -0
  360. package/dist/util/assertionFunctionUtils.d.ts +16 -0
  361. package/dist/util/assertionFunctionUtils.js +116 -0
  362. package/dist/util/astUtils.d.ts +17 -0
  363. package/dist/util/astUtils.js +143 -0
  364. package/dist/util/baseTypeUtils.d.ts +13 -0
  365. package/dist/util/baseTypeUtils.js +75 -0
  366. package/dist/util/class-scope-analyzer/classScopeAnalyzer.d.ts +52 -0
  367. package/dist/util/class-scope-analyzer/classScopeAnalyzer.js +566 -0
  368. package/dist/util/class-scope-analyzer/extractComputedName.d.ts +17 -0
  369. package/dist/util/class-scope-analyzer/extractComputedName.js +70 -0
  370. package/dist/util/class-scope-analyzer/types.d.ts +12 -0
  371. package/dist/util/class-scope-analyzer/types.js +10 -0
  372. package/dist/util/collectUnusedVariables.d.ts +15 -0
  373. package/dist/util/collectUnusedVariables.js +598 -0
  374. package/dist/util/createRule.d.ts +5 -0
  375. package/dist/util/createRule.js +5 -0
  376. package/dist/util/escapeRegExp.d.ts +1 -0
  377. package/dist/util/escapeRegExp.js +14 -0
  378. package/dist/util/explicitReturnTypeUtils.d.ts +47 -0
  379. package/dist/util/explicitReturnTypeUtils.js +238 -0
  380. package/dist/util/getBaseTypesOfClassMember.d.ts +11 -0
  381. package/dist/util/getBaseTypesOfClassMember.js +31 -0
  382. package/dist/util/getConstraintInfo.d.ts +35 -0
  383. package/dist/util/getConstraintInfo.js +70 -0
  384. package/dist/util/getESLintCoreRule.d.ts +27 -0
  385. package/dist/util/getESLintCoreRule.js +16 -0
  386. package/dist/util/getFixOrSuggest.d.ts +9 -0
  387. package/dist/util/getFixOrSuggest.js +13 -0
  388. package/dist/util/getForStatementHeadLoc.d.ts +17 -0
  389. package/dist/util/getForStatementHeadLoc.js +26 -0
  390. package/dist/util/getFunctionHeadLoc.d.ts +101 -0
  391. package/dist/util/getFunctionHeadLoc.js +161 -0
  392. package/dist/util/getMemberHeadLoc.d.ts +36 -0
  393. package/dist/util/getMemberHeadLoc.js +79 -0
  394. package/dist/util/getOperatorPrecedence.d.ts +39 -0
  395. package/dist/util/getOperatorPrecedence.js +421 -0
  396. package/dist/util/getParentFunctionNode.d.ts +2 -0
  397. package/dist/util/getParentFunctionNode.js +18 -0
  398. package/dist/util/getStaticStringValue.d.ts +11 -0
  399. package/dist/util/getStaticStringValue.js +44 -0
  400. package/dist/util/getStringLength.d.ts +1 -0
  401. package/dist/util/getStringLength.js +14 -0
  402. package/dist/util/getTextWithParentheses.d.ts +3 -0
  403. package/dist/util/getTextWithParentheses.js +16 -0
  404. package/dist/util/getThisExpression.d.ts +2 -0
  405. package/dist/util/getThisExpression.js +24 -0
  406. package/dist/util/getValueOfLiteralType.d.ts +2 -0
  407. package/dist/util/getValueOfLiteralType.js +16 -0
  408. package/dist/util/getWrappedCode.d.ts +2 -0
  409. package/dist/util/getWrappedCode.js +6 -0
  410. package/dist/util/getWrappingFixer.d.ts +42 -0
  411. package/dist/util/getWrappingFixer.js +184 -0
  412. package/dist/util/hasOverloadSignatures.d.ts +6 -0
  413. package/dist/util/hasOverloadSignatures.js +47 -0
  414. package/dist/util/index.d.ts +40 -0
  415. package/dist/util/index.js +53 -0
  416. package/dist/util/isArrayMethodCallWithPredicate.d.ts +3 -0
  417. package/dist/util/isArrayMethodCallWithPredicate.js +64 -0
  418. package/dist/util/isAssignee.d.ts +2 -0
  419. package/dist/util/isAssignee.js +50 -0
  420. package/dist/util/isHigherPrecedenceThanAwait.d.ts +2 -0
  421. package/dist/util/isHigherPrecedenceThanAwait.js +46 -0
  422. package/dist/util/isNodeEqual.d.ts +2 -0
  423. package/dist/util/isNodeEqual.js +25 -0
  424. package/dist/util/isNullLiteral.d.ts +2 -0
  425. package/dist/util/isNullLiteral.js +7 -0
  426. package/dist/util/isPromiseAggregatorMethod.d.ts +3 -0
  427. package/dist/util/isPromiseAggregatorMethod.js +22 -0
  428. package/dist/util/isStartOfExpressionStatement.d.ts +7 -0
  429. package/dist/util/isStartOfExpressionStatement.js +22 -0
  430. package/dist/util/isTypeImport.d.ts +12 -0
  431. package/dist/util/isTypeImport.js +21 -0
  432. package/dist/util/isUndefinedIdentifier.d.ts +2 -0
  433. package/dist/util/isUndefinedIdentifier.js +7 -0
  434. package/dist/util/misc.d.ts +115 -0
  435. package/dist/util/misc.js +270 -0
  436. package/dist/util/needsPrecedingSemiColon.d.ts +11 -0
  437. package/dist/util/needsPrecedingSemiColon.js +97 -0
  438. package/dist/util/needsToBeAwaited.d.ts +7 -0
  439. package/dist/util/needsToBeAwaited.js +63 -0
  440. package/dist/util/objectIterators.d.ts +3 -0
  441. package/dist/util/objectIterators.js +25 -0
  442. package/dist/util/promiseUtils.d.ts +27 -0
  443. package/dist/util/promiseUtils.js +98 -0
  444. package/dist/util/rangeToLoc.d.ts +2 -0
  445. package/dist/util/rangeToLoc.js +9 -0
  446. package/dist/util/referenceContainsTypeQuery.d.ts +5 -0
  447. package/dist/util/referenceContainsTypeQuery.js +19 -0
  448. package/dist/util/scopeUtils.d.ts +3 -0
  449. package/dist/util/scopeUtils.js +10 -0
  450. package/dist/util/skipChainExpression.d.ts +2 -0
  451. package/dist/util/skipChainExpression.js +7 -0
  452. package/dist/util/truthinessUtils.d.ts +3 -0
  453. package/dist/util/truthinessUtils.js +60 -0
  454. package/dist/util/types.d.ts +2 -0
  455. package/dist/util/types.js +2 -0
  456. package/dist/util/walkStatements.d.ts +7 -0
  457. package/dist/util/walkStatements.js +56 -0
  458. package/index.d.ts +13 -0
  459. package/package.json +137 -0
  460. package/raw-plugin.d.ts +25 -0
  461. package/rules.d.ts +87 -0
@@ -0,0 +1,647 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const utils_1 = require("@typescript-eslint/utils");
37
+ const tsutils = __importStar(require("ts-api-utils"));
38
+ const ts = __importStar(require("typescript"));
39
+ const util_1 = require("../util");
40
+ const getWrappedCode_1 = require("../util/getWrappedCode");
41
+ const isMemberAccessLike = (0, util_1.isNodeOfTypes)([
42
+ utils_1.AST_NODE_TYPES.ChainExpression,
43
+ utils_1.AST_NODE_TYPES.Identifier,
44
+ utils_1.AST_NODE_TYPES.MemberExpression,
45
+ ]);
46
+ const isNullLiteralOrUndefinedIdentifier = (node) => (0, util_1.isNullLiteral)(node) || (0, util_1.isUndefinedIdentifier)(node);
47
+ const isNodeNullishComparison = (node) => isNullLiteralOrUndefinedIdentifier(node.left) &&
48
+ isNullLiteralOrUndefinedIdentifier(node.right);
49
+ exports.default = (0, util_1.createRule)({
50
+ name: 'prefer-nullish-coalescing',
51
+ meta: {
52
+ type: 'suggestion',
53
+ docs: {
54
+ description: 'Enforce using the nullish coalescing operator instead of logical assignments or chaining',
55
+ recommended: 'stylistic',
56
+ requiresTypeChecking: true,
57
+ },
58
+ hasSuggestions: true,
59
+ messages: {
60
+ noStrictNullCheck: 'This rule requires the `strictNullChecks` compiler option to be turned on to function correctly.',
61
+ preferNullishOverAssignment: 'Prefer using nullish coalescing operator (`??{{ equals }}`) instead of an assignment expression, as it is simpler to read.',
62
+ preferNullishOverOr: 'Prefer using nullish coalescing operator (`??{{ equals }}`) instead of a logical {{ description }} (`||{{ equals }}`), as it is a safer operator.',
63
+ preferNullishOverTernary: 'Prefer using nullish coalescing operator (`??{{ equals }}`) instead of a ternary expression, as it is simpler to read.',
64
+ suggestNullish: 'Fix to nullish coalescing operator (`??{{ equals }}`).',
65
+ },
66
+ schema: [
67
+ {
68
+ type: 'object',
69
+ additionalProperties: false,
70
+ properties: {
71
+ allowRuleToRunWithoutStrictNullChecksIKnowWhatIAmDoing: {
72
+ type: 'boolean',
73
+ description: 'Unless this is set to `true`, the rule will error on every file whose `tsconfig.json` does _not_ have the `strictNullChecks` compiler option (or `strict`) set to `true`.',
74
+ },
75
+ ignoreBooleanCoercion: {
76
+ type: 'boolean',
77
+ description: 'Whether to ignore arguments to the `Boolean` constructor',
78
+ },
79
+ ignoreConditionalTests: {
80
+ type: 'boolean',
81
+ description: 'Whether to ignore cases that are located within a conditional test.',
82
+ },
83
+ ignoreIfStatements: {
84
+ type: 'boolean',
85
+ description: 'Whether to ignore any if statements that could be simplified by using the nullish coalescing operator.',
86
+ },
87
+ ignoreMixedLogicalExpressions: {
88
+ type: 'boolean',
89
+ description: 'Whether to ignore any logical or expressions that are part of a mixed logical expression (with `&&`).',
90
+ },
91
+ ignorePrimitives: {
92
+ description: 'Whether to ignore all (`true`) or some (an object with properties) primitive types.',
93
+ oneOf: [
94
+ {
95
+ type: 'object',
96
+ additionalProperties: false,
97
+ description: 'Which primitives types may be ignored.',
98
+ properties: {
99
+ bigint: {
100
+ type: 'boolean',
101
+ description: 'Ignore bigint primitive types.',
102
+ },
103
+ boolean: {
104
+ type: 'boolean',
105
+ description: 'Ignore boolean primitive types.',
106
+ },
107
+ number: {
108
+ type: 'boolean',
109
+ description: 'Ignore number primitive types.',
110
+ },
111
+ string: {
112
+ type: 'boolean',
113
+ description: 'Ignore string primitive types.',
114
+ },
115
+ },
116
+ },
117
+ {
118
+ type: 'boolean',
119
+ description: 'Ignore all primitive types.',
120
+ enum: [true],
121
+ },
122
+ ],
123
+ },
124
+ ignoreTernaryTests: {
125
+ type: 'boolean',
126
+ description: 'Whether to ignore any ternary expressions that could be simplified by using the nullish coalescing operator.',
127
+ },
128
+ },
129
+ },
130
+ ],
131
+ },
132
+ defaultOptions: [
133
+ {
134
+ allowRuleToRunWithoutStrictNullChecksIKnowWhatIAmDoing: false,
135
+ ignoreBooleanCoercion: false,
136
+ ignoreConditionalTests: true,
137
+ ignoreIfStatements: false,
138
+ ignoreMixedLogicalExpressions: false,
139
+ ignorePrimitives: {
140
+ bigint: false,
141
+ boolean: false,
142
+ number: false,
143
+ string: false,
144
+ },
145
+ ignoreTernaryTests: false,
146
+ },
147
+ ],
148
+ create(context, [{ allowRuleToRunWithoutStrictNullChecksIKnowWhatIAmDoing, ignoreBooleanCoercion, ignoreConditionalTests, ignoreIfStatements, ignoreMixedLogicalExpressions, ignorePrimitives, ignoreTernaryTests, },]) {
149
+ const parserServices = (0, util_1.getParserServices)(context);
150
+ const compilerOptions = parserServices.program.getCompilerOptions();
151
+ const isStrictNullChecks = tsutils.isStrictCompilerOptionEnabled(compilerOptions, 'strictNullChecks');
152
+ if (!isStrictNullChecks &&
153
+ allowRuleToRunWithoutStrictNullChecksIKnowWhatIAmDoing !== true) {
154
+ context.report({
155
+ loc: {
156
+ start: { column: 0, line: 0 },
157
+ end: { column: 0, line: 0 },
158
+ },
159
+ messageId: 'noStrictNullCheck',
160
+ });
161
+ }
162
+ /**
163
+ * Checks whether a type tested for truthiness is eligible for conversion to
164
+ * a nullishness check, taking into account the rule's configuration.
165
+ */
166
+ function isTypeEligibleForPreferNullish(type) {
167
+ if (!(0, util_1.isNullableType)(type)) {
168
+ return false;
169
+ }
170
+ const ignorableFlags = [
171
+ /* eslint-disable @typescript-eslint/no-non-null-assertion */
172
+ (ignorePrimitives === true || ignorePrimitives.bigint) &&
173
+ ts.TypeFlags.BigIntLike,
174
+ (ignorePrimitives === true || ignorePrimitives.boolean) &&
175
+ ts.TypeFlags.BooleanLike,
176
+ (ignorePrimitives === true || ignorePrimitives.number) &&
177
+ ts.TypeFlags.NumberLike,
178
+ (ignorePrimitives === true || ignorePrimitives.string) &&
179
+ ts.TypeFlags.StringLike,
180
+ /* eslint-enable @typescript-eslint/no-non-null-assertion */
181
+ ]
182
+ .filter((flag) => typeof flag === 'number')
183
+ .reduce((previous, flag) => previous | flag, 0);
184
+ if (ignorableFlags === 0) {
185
+ // any types are eligible for conversion.
186
+ return true;
187
+ }
188
+ // if the type is `any` or `unknown` we can't make any assumptions
189
+ // about the value, so it could be any primitive, even though the flags
190
+ // won't be set.
191
+ //
192
+ // technically, this is true of `void` as well, however, it's a TS error
193
+ // to test `void` for truthiness, so we don't need to bother checking for
194
+ // it in valid code.
195
+ if (tsutils.isTypeFlagSet(type, ts.TypeFlags.Any | ts.TypeFlags.Unknown)) {
196
+ return false;
197
+ }
198
+ if (tsutils
199
+ .typeConstituents(type)
200
+ .some(t => tsutils
201
+ .intersectionConstituents(t)
202
+ .some(t => tsutils.isTypeFlagSet(t, ignorableFlags)))) {
203
+ return false;
204
+ }
205
+ return true;
206
+ }
207
+ /**
208
+ * Determines whether a control flow construct that uses the truthiness of
209
+ * a test expression is eligible for conversion to the nullish coalescing
210
+ * operator, taking into account (both dependent on the rule's configuration):
211
+ * 1. Whether the construct is in a permitted syntactic context
212
+ * 2. Whether the type of the test expression is deemed eligible for
213
+ * conversion
214
+ *
215
+ * @param node The overall node to be converted (e.g. `a || b` or `a ? a : b`)
216
+ * @param testNode The node being tested (i.e. `a`)
217
+ */
218
+ function isTruthinessCheckEligibleForPreferNullish({ node, testNode, }) {
219
+ const testType = parserServices.getTypeAtLocation(testNode);
220
+ if (!isTypeEligibleForPreferNullish(testType)) {
221
+ return false;
222
+ }
223
+ if (ignoreConditionalTests === true && isConditionalTest(node)) {
224
+ return false;
225
+ }
226
+ if (ignoreBooleanCoercion === true &&
227
+ isBooleanConstructorContext(node, context) &&
228
+ !(node.type === utils_1.AST_NODE_TYPES.ConditionalExpression &&
229
+ node.parent.type === utils_1.AST_NODE_TYPES.CallExpression)) {
230
+ return false;
231
+ }
232
+ return true;
233
+ }
234
+ function checkAndFixWithPreferNullishOverOr(node, description, equals) {
235
+ if (!isTruthinessCheckEligibleForPreferNullish({
236
+ node,
237
+ testNode: node.left,
238
+ })) {
239
+ return;
240
+ }
241
+ if (ignoreMixedLogicalExpressions === true &&
242
+ isMixedLogicalExpression(node)) {
243
+ return;
244
+ }
245
+ const barBarOperator = (0, util_1.nullThrows)(context.sourceCode.getTokenAfter(node.left, token => token.type === utils_1.AST_TOKEN_TYPES.Punctuator &&
246
+ token.value === node.operator), util_1.NullThrowsReasons.MissingToken('operator', node.type));
247
+ function* fix(fixer) {
248
+ if ((0, util_1.isLogicalOrOperator)(node.parent)) {
249
+ // '&&' and '??' operations cannot be mixed without parentheses (e.g. a && b ?? c)
250
+ if (node.left.type === utils_1.AST_NODE_TYPES.LogicalExpression &&
251
+ !(0, util_1.isLogicalOrOperator)(node.left.left)) {
252
+ yield fixer.insertTextBefore(node.left.right, '(');
253
+ }
254
+ else {
255
+ yield fixer.insertTextBefore(node.left, '(');
256
+ }
257
+ yield fixer.insertTextAfter(node.right, ')');
258
+ }
259
+ yield fixer.replaceText(barBarOperator, node.operator.replace('||', '??'));
260
+ }
261
+ context.report({
262
+ node: barBarOperator,
263
+ messageId: 'preferNullishOverOr',
264
+ data: { description, equals },
265
+ suggest: [
266
+ {
267
+ messageId: 'suggestNullish',
268
+ data: { equals },
269
+ fix,
270
+ },
271
+ ],
272
+ });
273
+ }
274
+ function getNullishCoalescingParams(node, nonNullishNode, nodesInsideTestExpression, operator) {
275
+ let nullishCoalescingLeftNode;
276
+ let hasTruthinessCheck = false;
277
+ let hasNullCheckWithoutTruthinessCheck = false;
278
+ let hasUndefinedCheckWithoutTruthinessCheck = false;
279
+ if (!nodesInsideTestExpression.length) {
280
+ hasTruthinessCheck = true;
281
+ nullishCoalescingLeftNode =
282
+ node.test.type === utils_1.AST_NODE_TYPES.UnaryExpression
283
+ ? node.test.argument
284
+ : node.test;
285
+ if (!areNodesSimilarMemberAccess(nullishCoalescingLeftNode, nonNullishNode)) {
286
+ return { isFixable: false };
287
+ }
288
+ }
289
+ else {
290
+ // we check that the test only contains null, undefined and the identifier
291
+ for (const testNode of nodesInsideTestExpression) {
292
+ if ((0, util_1.isNullLiteral)(testNode)) {
293
+ hasNullCheckWithoutTruthinessCheck = true;
294
+ }
295
+ else if ((0, util_1.isUndefinedIdentifier)(testNode)) {
296
+ hasUndefinedCheckWithoutTruthinessCheck = true;
297
+ }
298
+ else if (areNodesSimilarMemberAccess(testNode, nonNullishNode)) {
299
+ // Only consider the first expression in a multi-part nullish check,
300
+ // as subsequent expressions might not require all the optional chaining operators.
301
+ // For example: a?.b?.c !== undefined && a.b.c !== null ? a.b.c : 'foo';
302
+ // This works because `node.test` is always evaluated first in the loop
303
+ // and has the same or more necessary optional chaining operators
304
+ // than `node.alternate` or `node.consequent`.
305
+ nullishCoalescingLeftNode ??= testNode;
306
+ }
307
+ else {
308
+ return { isFixable: false };
309
+ }
310
+ }
311
+ }
312
+ if (!nullishCoalescingLeftNode) {
313
+ return { isFixable: false };
314
+ }
315
+ const isFixable = (() => {
316
+ if (hasTruthinessCheck) {
317
+ return isTruthinessCheckEligibleForPreferNullish({
318
+ node,
319
+ testNode: nullishCoalescingLeftNode,
320
+ });
321
+ }
322
+ // it is fixable if we check for both null and undefined, or not if neither
323
+ if (hasUndefinedCheckWithoutTruthinessCheck ===
324
+ hasNullCheckWithoutTruthinessCheck) {
325
+ return hasUndefinedCheckWithoutTruthinessCheck;
326
+ }
327
+ // it is fixable if we loosely check for either null or undefined
328
+ if (['==', '!='].includes(operator)) {
329
+ return true;
330
+ }
331
+ const type = parserServices.getTypeAtLocation(nullishCoalescingLeftNode);
332
+ const flags = (0, util_1.getTypeFlags)(type);
333
+ if (flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown)) {
334
+ return false;
335
+ }
336
+ const hasNullType = (flags & ts.TypeFlags.Null) !== 0;
337
+ // it is fixable if we check for undefined and the type is not nullable
338
+ if (hasUndefinedCheckWithoutTruthinessCheck && !hasNullType) {
339
+ return true;
340
+ }
341
+ const hasUndefinedType = (flags & ts.TypeFlags.Undefined) !== 0;
342
+ // it is fixable if we check for null and the type can't be undefined
343
+ return hasNullCheckWithoutTruthinessCheck && !hasUndefinedType;
344
+ })();
345
+ return isFixable
346
+ ? { isFixable: true, nullishCoalescingLeftNode }
347
+ : { isFixable: false };
348
+ }
349
+ return {
350
+ 'AssignmentExpression[operator = "||="]'(node) {
351
+ checkAndFixWithPreferNullishOverOr(node, 'assignment', '=');
352
+ },
353
+ ConditionalExpression(node) {
354
+ if (ignoreTernaryTests) {
355
+ return;
356
+ }
357
+ const { nodesInsideTestExpression, operator } = getOperatorAndNodesInsideTestExpression(node);
358
+ if (operator == null) {
359
+ return;
360
+ }
361
+ const { nonNullishBranch, nullishBranch } = getBranchNodes(node, operator);
362
+ const nullishCoalescingParams = getNullishCoalescingParams(node, nonNullishBranch, nodesInsideTestExpression, operator);
363
+ if (nullishCoalescingParams.isFixable) {
364
+ context.report({
365
+ node,
366
+ messageId: 'preferNullishOverTernary',
367
+ // TODO: also account for = in the ternary clause
368
+ data: { equals: '' },
369
+ suggest: [
370
+ {
371
+ messageId: 'suggestNullish',
372
+ data: { equals: '' },
373
+ fix(fixer) {
374
+ const nullishBranchText = (0, util_1.getTextWithParentheses)(context.sourceCode, nullishBranch);
375
+ const rightOperandReplacement = (0, util_1.isParenthesized)(nullishBranch, context.sourceCode)
376
+ ? nullishBranchText
377
+ : (0, getWrappedCode_1.getWrappedCode)(nullishBranchText, (0, util_1.getOperatorPrecedenceForNode)(nullishBranch), util_1.OperatorPrecedence.Coalesce);
378
+ return fixer.replaceText(node, `${(0, util_1.getTextWithParentheses)(context.sourceCode, nullishCoalescingParams.nullishCoalescingLeftNode)} ?? ${rightOperandReplacement}`);
379
+ },
380
+ },
381
+ ],
382
+ });
383
+ }
384
+ },
385
+ IfStatement(node) {
386
+ if (ignoreIfStatements || node.alternate != null) {
387
+ return;
388
+ }
389
+ let assignmentExpression;
390
+ if (node.consequent.type === utils_1.AST_NODE_TYPES.BlockStatement &&
391
+ node.consequent.body.length === 1 &&
392
+ node.consequent.body[0].type === utils_1.AST_NODE_TYPES.ExpressionStatement) {
393
+ assignmentExpression = node.consequent.body[0].expression;
394
+ }
395
+ else if (node.consequent.type === utils_1.AST_NODE_TYPES.ExpressionStatement) {
396
+ assignmentExpression = node.consequent.expression;
397
+ }
398
+ if (assignmentExpression?.type !== utils_1.AST_NODE_TYPES.AssignmentExpression ||
399
+ !isMemberAccessLike(assignmentExpression.left)) {
400
+ return;
401
+ }
402
+ const nullishCoalescingLeftNode = assignmentExpression.left;
403
+ const nullishCoalescingRightNode = assignmentExpression.right;
404
+ const { nodesInsideTestExpression, operator } = getOperatorAndNodesInsideTestExpression(node);
405
+ if (operator == null || !['!', '==', '==='].includes(operator)) {
406
+ return;
407
+ }
408
+ const nullishCoalescingParams = getNullishCoalescingParams(node, nullishCoalescingLeftNode, nodesInsideTestExpression, operator);
409
+ if (nullishCoalescingParams.isFixable) {
410
+ // Handle comments
411
+ const isConsequentNodeBlockStatement = node.consequent.type === utils_1.AST_NODE_TYPES.BlockStatement;
412
+ const commentsBefore = formatComments(context.sourceCode.getCommentsBefore(assignmentExpression), isConsequentNodeBlockStatement ? '\n' : ' ');
413
+ const commentsAfter = isConsequentNodeBlockStatement
414
+ ? formatComments(context.sourceCode.getCommentsAfter(assignmentExpression.parent), '\n')
415
+ : '';
416
+ context.report({
417
+ node,
418
+ messageId: 'preferNullishOverAssignment',
419
+ data: { equals: '=' },
420
+ suggest: [
421
+ {
422
+ messageId: 'suggestNullish',
423
+ data: { equals: '=' },
424
+ fix(fixer) {
425
+ const fixes = [];
426
+ if (commentsBefore) {
427
+ fixes.push(fixer.insertTextBefore(node, commentsBefore));
428
+ }
429
+ fixes.push(fixer.replaceText(node, `${(0, util_1.getTextWithParentheses)(context.sourceCode, nullishCoalescingLeftNode)} ??= ${(0, util_1.getTextWithParentheses)(context.sourceCode, nullishCoalescingRightNode)};`));
430
+ if (commentsAfter) {
431
+ fixes.push(fixer.insertTextAfter(node, ` ${commentsAfter.slice(0, -1)}`));
432
+ }
433
+ return fixes;
434
+ },
435
+ },
436
+ ],
437
+ });
438
+ }
439
+ },
440
+ 'LogicalExpression[operator = "||"]'(node) {
441
+ checkAndFixWithPreferNullishOverOr(node, 'or', '');
442
+ },
443
+ };
444
+ },
445
+ });
446
+ function isConditionalTest(node) {
447
+ const parent = node.parent;
448
+ if (parent == null) {
449
+ return false;
450
+ }
451
+ if (parent.type === utils_1.AST_NODE_TYPES.LogicalExpression) {
452
+ return isConditionalTest(parent);
453
+ }
454
+ if (parent.type === utils_1.AST_NODE_TYPES.ConditionalExpression &&
455
+ (parent.consequent === node || parent.alternate === node)) {
456
+ return isConditionalTest(parent);
457
+ }
458
+ if (parent.type === utils_1.AST_NODE_TYPES.SequenceExpression &&
459
+ parent.expressions.at(-1) === node) {
460
+ return isConditionalTest(parent);
461
+ }
462
+ if (parent.type === utils_1.AST_NODE_TYPES.UnaryExpression &&
463
+ parent.operator === '!') {
464
+ return isConditionalTest(parent);
465
+ }
466
+ if ((parent.type === utils_1.AST_NODE_TYPES.ConditionalExpression ||
467
+ parent.type === utils_1.AST_NODE_TYPES.DoWhileStatement ||
468
+ parent.type === utils_1.AST_NODE_TYPES.IfStatement ||
469
+ parent.type === utils_1.AST_NODE_TYPES.ForStatement ||
470
+ parent.type === utils_1.AST_NODE_TYPES.WhileStatement) &&
471
+ parent.test === node) {
472
+ return true;
473
+ }
474
+ return false;
475
+ }
476
+ function isBooleanConstructorContext(node, context) {
477
+ const parent = node.parent;
478
+ if (parent == null) {
479
+ return false;
480
+ }
481
+ if (parent.type === utils_1.AST_NODE_TYPES.LogicalExpression) {
482
+ return isBooleanConstructorContext(parent, context);
483
+ }
484
+ if (parent.type === utils_1.AST_NODE_TYPES.ConditionalExpression &&
485
+ (parent.consequent === node || parent.alternate === node)) {
486
+ return isBooleanConstructorContext(parent, context);
487
+ }
488
+ if (parent.type === utils_1.AST_NODE_TYPES.SequenceExpression &&
489
+ parent.expressions.at(-1) === node) {
490
+ return isBooleanConstructorContext(parent, context);
491
+ }
492
+ return isBuiltInBooleanCall(parent, context);
493
+ }
494
+ function isBuiltInBooleanCall(node, context) {
495
+ if (node.type === utils_1.AST_NODE_TYPES.CallExpression &&
496
+ node.callee.type === utils_1.AST_NODE_TYPES.Identifier &&
497
+ // eslint-disable-next-line @typescript-eslint/internal/prefer-ast-types-enum
498
+ node.callee.name === 'Boolean' &&
499
+ node.arguments[0]) {
500
+ const scope = context.sourceCode.getScope(node);
501
+ const variable = scope.set.get(utils_1.AST_TOKEN_TYPES.Boolean);
502
+ return variable == null || variable.defs.length === 0;
503
+ }
504
+ return false;
505
+ }
506
+ function isMixedLogicalExpression(node) {
507
+ const seen = new Set();
508
+ const queue = [node.parent, node.left, node.right];
509
+ for (const current of queue) {
510
+ if (seen.has(current)) {
511
+ continue;
512
+ }
513
+ seen.add(current);
514
+ if (current.type === utils_1.AST_NODE_TYPES.LogicalExpression) {
515
+ if (current.operator === '&&') {
516
+ return true;
517
+ }
518
+ if (['||', '||='].includes(current.operator)) {
519
+ // check the pieces of the node to catch cases like `a || b || c && d`
520
+ queue.push(current.parent, current.left, current.right);
521
+ }
522
+ }
523
+ }
524
+ return false;
525
+ }
526
+ /**
527
+ * Checks if two TSESTree nodes have the same member access sequence,
528
+ * regardless of optional chaining differences.
529
+ *
530
+ * Note: This does not imply that the nodes are runtime-equivalent.
531
+ *
532
+ * Example: `a.b.c`, `a?.b.c`, `a.b?.c`, `(a?.b).c`, `(a.b)?.c` are considered similar.
533
+ *
534
+ * @param a First TSESTree node.
535
+ * @param b Second TSESTree node.
536
+ * @returns `true` if the nodes access members in the same order; otherwise, `false`.
537
+ */
538
+ function areNodesSimilarMemberAccess(a, b) {
539
+ if (a.type === utils_1.AST_NODE_TYPES.MemberExpression &&
540
+ b.type === utils_1.AST_NODE_TYPES.MemberExpression) {
541
+ if (!areNodesSimilarMemberAccess(a.object, b.object)) {
542
+ return false;
543
+ }
544
+ if (a.computed === b.computed) {
545
+ return (0, util_1.isNodeEqual)(a.property, b.property);
546
+ }
547
+ if (a.property.type === utils_1.AST_NODE_TYPES.Literal &&
548
+ b.property.type === utils_1.AST_NODE_TYPES.Identifier) {
549
+ return a.property.value === b.property.name;
550
+ }
551
+ if (a.property.type === utils_1.AST_NODE_TYPES.Identifier &&
552
+ b.property.type === utils_1.AST_NODE_TYPES.Literal) {
553
+ return a.property.name === b.property.value;
554
+ }
555
+ return false;
556
+ }
557
+ if (a.type === utils_1.AST_NODE_TYPES.ChainExpression ||
558
+ b.type === utils_1.AST_NODE_TYPES.ChainExpression) {
559
+ return areNodesSimilarMemberAccess((0, util_1.skipChainExpression)(a), (0, util_1.skipChainExpression)(b));
560
+ }
561
+ return (0, util_1.isNodeEqual)(a, b);
562
+ }
563
+ /**
564
+ * Returns the branch nodes of a conditional expression:
565
+ * - the "nonNullish branch" is the branch when test node is not nullish
566
+ * - the "nullish branch" is the branch when test node is nullish
567
+ */
568
+ function getBranchNodes(node, operator) {
569
+ if (['', '!=', '!=='].includes(operator)) {
570
+ return { nonNullishBranch: node.consequent, nullishBranch: node.alternate };
571
+ }
572
+ return { nonNullishBranch: node.alternate, nullishBranch: node.consequent };
573
+ }
574
+ function getOperatorAndNodesInsideTestExpression(node) {
575
+ let operator = null;
576
+ let nodesInsideTestExpression = [];
577
+ if (isMemberAccessLike(node.test) ||
578
+ node.test.type === utils_1.AST_NODE_TYPES.UnaryExpression) {
579
+ operator = getNonBinaryNodeOperator(node.test);
580
+ }
581
+ else if (node.test.type === utils_1.AST_NODE_TYPES.BinaryExpression) {
582
+ nodesInsideTestExpression = [node.test.left, node.test.right];
583
+ if (node.test.operator === '==' ||
584
+ node.test.operator === '!=' ||
585
+ node.test.operator === '===' ||
586
+ node.test.operator === '!==') {
587
+ operator = node.test.operator;
588
+ }
589
+ }
590
+ else if (node.test.type === utils_1.AST_NODE_TYPES.LogicalExpression &&
591
+ node.test.left.type === utils_1.AST_NODE_TYPES.BinaryExpression &&
592
+ node.test.right.type === utils_1.AST_NODE_TYPES.BinaryExpression) {
593
+ if (isNodeNullishComparison(node.test.left) ||
594
+ isNodeNullishComparison(node.test.right)) {
595
+ return { nodesInsideTestExpression, operator };
596
+ }
597
+ nodesInsideTestExpression = [
598
+ node.test.left.left,
599
+ node.test.left.right,
600
+ node.test.right.left,
601
+ node.test.right.right,
602
+ ];
603
+ if (['||', '||='].includes(node.test.operator)) {
604
+ if (node.test.left.operator === '===' &&
605
+ node.test.right.operator === '===') {
606
+ operator = '===';
607
+ }
608
+ else if (((node.test.left.operator === '===' ||
609
+ node.test.right.operator === '===') &&
610
+ (node.test.left.operator === '==' ||
611
+ node.test.right.operator === '==')) ||
612
+ (node.test.left.operator === '==' && node.test.right.operator === '==')) {
613
+ operator = '==';
614
+ }
615
+ }
616
+ else if (node.test.operator === '&&') {
617
+ if (node.test.left.operator === '!==' &&
618
+ node.test.right.operator === '!==') {
619
+ operator = '!==';
620
+ }
621
+ else if (((node.test.left.operator === '!==' ||
622
+ node.test.right.operator === '!==') &&
623
+ (node.test.left.operator === '!=' ||
624
+ node.test.right.operator === '!=')) ||
625
+ (node.test.left.operator === '!=' && node.test.right.operator === '!=')) {
626
+ operator = '!=';
627
+ }
628
+ }
629
+ }
630
+ return { nodesInsideTestExpression, operator };
631
+ }
632
+ function getNonBinaryNodeOperator(node) {
633
+ if (node.type !== utils_1.AST_NODE_TYPES.UnaryExpression) {
634
+ return '';
635
+ }
636
+ if (isMemberAccessLike(node.argument) && node.operator === '!') {
637
+ return '!';
638
+ }
639
+ return null;
640
+ }
641
+ function formatComments(comments, separator) {
642
+ return comments
643
+ .map(({ type, value }) => type === utils_1.AST_TOKEN_TYPES.Line
644
+ ? `//${value}${separator}`
645
+ : `/*${value}*/${separator}`)
646
+ .join('');
647
+ }
@@ -0,0 +1,11 @@
1
+ export type PreferOptionalChainMessageIds = 'optionalChainSuggest' | 'preferOptionalChain';
2
+ export interface PreferOptionalChainOptions {
3
+ allowPotentiallyUnsafeFixesThatModifyTheReturnTypeIKnowWhatImDoing?: boolean;
4
+ checkAny?: boolean;
5
+ checkBigInt?: boolean;
6
+ checkBoolean?: boolean;
7
+ checkNumber?: boolean;
8
+ checkString?: boolean;
9
+ checkUnknown?: boolean;
10
+ requireNullish?: boolean;
11
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,7 @@
1
+ import type { ParserServicesWithTypeInformation, TSESTree } from '@typescript-eslint/utils';
2
+ import type { RuleContext } from '@typescript-eslint/utils/ts-eslint';
3
+ import type { LastChainOperand, ValidOperand } from './gatherLogicalOperands';
4
+ import type { PreferOptionalChainMessageIds, PreferOptionalChainOptions } from './PreferOptionalChainOptions';
5
+ export declare function analyzeChain(context: RuleContext<PreferOptionalChainMessageIds, [
6
+ PreferOptionalChainOptions
7
+ ]>, parserServices: ParserServicesWithTypeInformation, options: PreferOptionalChainOptions, node: TSESTree.Node, operator: TSESTree.LogicalExpression['operator'], chain: ValidOperand[], lastChainOperand?: LastChainOperand): void;