bahlint 28.58.6934-dev-001

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 (420) hide show
  1. package/LICENSE +19 -0
  2. package/README.md +354 -0
  3. package/bin/bahlint.js +267 -0
  4. package/bin/eslint.js +194 -0
  5. package/conf/ecma-version.js +16 -0
  6. package/conf/globals.js +169 -0
  7. package/conf/replacements.json +26 -0
  8. package/conf/rule-type-list.json +91 -0
  9. package/lib/api.js +39 -0
  10. package/lib/cli-engine/formatters/formatters-meta.json +18 -0
  11. package/lib/cli-engine/formatters/html.js +359 -0
  12. package/lib/cli-engine/formatters/json-with-metadata.js +16 -0
  13. package/lib/cli-engine/formatters/json.js +13 -0
  14. package/lib/cli-engine/formatters/stylish.js +153 -0
  15. package/lib/cli-engine/hash.js +35 -0
  16. package/lib/cli-engine/lint-result-cache.js +220 -0
  17. package/lib/cli.js +521 -0
  18. package/lib/config/config-loader.js +668 -0
  19. package/lib/config/config.js +674 -0
  20. package/lib/config/default-config.js +78 -0
  21. package/lib/config/flat-config-array.js +217 -0
  22. package/lib/config/flat-config-schema.js +598 -0
  23. package/lib/config-api.js +12 -0
  24. package/lib/eslint/eslint-helpers.js +1462 -0
  25. package/lib/eslint/eslint.js +1364 -0
  26. package/lib/eslint/index.js +7 -0
  27. package/lib/eslint/worker.js +173 -0
  28. package/lib/languages/js/index.js +336 -0
  29. package/lib/languages/js/source-code/index.js +7 -0
  30. package/lib/languages/js/source-code/source-code.js +1178 -0
  31. package/lib/languages/js/source-code/token-store/backward-token-comment-cursor.js +61 -0
  32. package/lib/languages/js/source-code/token-store/backward-token-cursor.js +57 -0
  33. package/lib/languages/js/source-code/token-store/cursor.js +76 -0
  34. package/lib/languages/js/source-code/token-store/cursors.js +120 -0
  35. package/lib/languages/js/source-code/token-store/decorative-cursor.js +38 -0
  36. package/lib/languages/js/source-code/token-store/filter-cursor.js +42 -0
  37. package/lib/languages/js/source-code/token-store/forward-token-comment-cursor.js +65 -0
  38. package/lib/languages/js/source-code/token-store/forward-token-cursor.js +62 -0
  39. package/lib/languages/js/source-code/token-store/index.js +695 -0
  40. package/lib/languages/js/source-code/token-store/limit-cursor.js +39 -0
  41. package/lib/languages/js/source-code/token-store/padded-token-cursor.js +45 -0
  42. package/lib/languages/js/source-code/token-store/skip-cursor.js +41 -0
  43. package/lib/languages/js/source-code/token-store/utils.js +131 -0
  44. package/lib/languages/js/validate-language-options.js +196 -0
  45. package/lib/linter/apply-disable-directives.js +583 -0
  46. package/lib/linter/code-path-analysis/code-path-analyzer.js +828 -0
  47. package/lib/linter/code-path-analysis/code-path-segment.js +262 -0
  48. package/lib/linter/code-path-analysis/code-path-state.js +2370 -0
  49. package/lib/linter/code-path-analysis/code-path.js +332 -0
  50. package/lib/linter/code-path-analysis/debug-helpers.js +223 -0
  51. package/lib/linter/code-path-analysis/fork-context.js +374 -0
  52. package/lib/linter/code-path-analysis/id-generator.js +44 -0
  53. package/lib/linter/esquery.js +332 -0
  54. package/lib/linter/file-context.js +88 -0
  55. package/lib/linter/file-report.js +604 -0
  56. package/lib/linter/index.js +11 -0
  57. package/lib/linter/interpolate.js +50 -0
  58. package/lib/linter/linter.js +1614 -0
  59. package/lib/linter/rule-fixer.js +199 -0
  60. package/lib/linter/source-code-fixer.js +154 -0
  61. package/lib/linter/source-code-traverser.js +333 -0
  62. package/lib/linter/source-code-visitor.js +81 -0
  63. package/lib/linter/timing.js +209 -0
  64. package/lib/linter/vfile.js +115 -0
  65. package/lib/options.js +416 -0
  66. package/lib/rule-tester/index.js +7 -0
  67. package/lib/rule-tester/rule-tester.js +1989 -0
  68. package/lib/rules/accessor-pairs.js +420 -0
  69. package/lib/rules/array-bracket-newline.js +291 -0
  70. package/lib/rules/array-bracket-spacing.js +301 -0
  71. package/lib/rules/array-callback-return.js +493 -0
  72. package/lib/rules/array-element-newline.js +374 -0
  73. package/lib/rules/arrow-body-style.js +418 -0
  74. package/lib/rules/arrow-parens.js +237 -0
  75. package/lib/rules/arrow-spacing.js +188 -0
  76. package/lib/rules/block-scoped-var.js +137 -0
  77. package/lib/rules/block-spacing.js +202 -0
  78. package/lib/rules/brace-style.js +278 -0
  79. package/lib/rules/callback-return.js +216 -0
  80. package/lib/rules/camelcase.js +422 -0
  81. package/lib/rules/capitalized-comments.js +325 -0
  82. package/lib/rules/class-methods-use-this.js +250 -0
  83. package/lib/rules/comma-dangle.js +424 -0
  84. package/lib/rules/comma-spacing.js +205 -0
  85. package/lib/rules/comma-style.js +391 -0
  86. package/lib/rules/complexity.js +201 -0
  87. package/lib/rules/computed-property-spacing.js +251 -0
  88. package/lib/rules/consistent-return.js +221 -0
  89. package/lib/rules/consistent-this.js +179 -0
  90. package/lib/rules/constructor-super.js +453 -0
  91. package/lib/rules/curly.js +425 -0
  92. package/lib/rules/default-case-last.js +51 -0
  93. package/lib/rules/default-case.js +103 -0
  94. package/lib/rules/default-param-last.js +78 -0
  95. package/lib/rules/dot-location.js +138 -0
  96. package/lib/rules/dot-notation.js +216 -0
  97. package/lib/rules/eol-last.js +135 -0
  98. package/lib/rules/eqeqeq.js +210 -0
  99. package/lib/rules/for-direction.js +168 -0
  100. package/lib/rules/func-call-spacing.js +281 -0
  101. package/lib/rules/func-name-matching.js +338 -0
  102. package/lib/rules/func-names.js +194 -0
  103. package/lib/rules/func-style.js +221 -0
  104. package/lib/rules/function-call-argument-newline.js +166 -0
  105. package/lib/rules/function-paren-newline.js +368 -0
  106. package/lib/rules/generator-star-spacing.js +246 -0
  107. package/lib/rules/getter-return.js +242 -0
  108. package/lib/rules/global-require.js +117 -0
  109. package/lib/rules/grouped-accessor-pairs.js +268 -0
  110. package/lib/rules/guard-for-in.js +85 -0
  111. package/lib/rules/handle-callback-err.js +122 -0
  112. package/lib/rules/id-blacklist.js +241 -0
  113. package/lib/rules/id-denylist.js +223 -0
  114. package/lib/rules/id-length.js +217 -0
  115. package/lib/rules/id-match.js +363 -0
  116. package/lib/rules/implicit-arrow-linebreak.js +125 -0
  117. package/lib/rules/indent-legacy.js +1369 -0
  118. package/lib/rules/indent.js +2334 -0
  119. package/lib/rules/index.js +332 -0
  120. package/lib/rules/init-declarations.js +172 -0
  121. package/lib/rules/jsx-quotes.js +128 -0
  122. package/lib/rules/key-spacing.js +822 -0
  123. package/lib/rules/keyword-spacing.js +701 -0
  124. package/lib/rules/line-comment-position.js +157 -0
  125. package/lib/rules/linebreak-style.js +135 -0
  126. package/lib/rules/lines-around-comment.js +581 -0
  127. package/lib/rules/lines-around-directive.js +249 -0
  128. package/lib/rules/lines-between-class-members.js +358 -0
  129. package/lib/rules/logical-assignment-operators.js +688 -0
  130. package/lib/rules/max-classes-per-file.js +90 -0
  131. package/lib/rules/max-depth.js +159 -0
  132. package/lib/rules/max-len.js +497 -0
  133. package/lib/rules/max-lines-per-function.js +238 -0
  134. package/lib/rules/max-lines.js +189 -0
  135. package/lib/rules/max-nested-callbacks.js +115 -0
  136. package/lib/rules/max-params.js +148 -0
  137. package/lib/rules/max-statements-per-line.js +224 -0
  138. package/lib/rules/max-statements.js +188 -0
  139. package/lib/rules/multiline-comment-style.js +652 -0
  140. package/lib/rules/multiline-ternary.js +257 -0
  141. package/lib/rules/new-cap.js +277 -0
  142. package/lib/rules/new-parens.js +120 -0
  143. package/lib/rules/newline-after-var.js +307 -0
  144. package/lib/rules/newline-before-return.js +242 -0
  145. package/lib/rules/newline-per-chained-call.js +159 -0
  146. package/lib/rules/no-alert.js +149 -0
  147. package/lib/rules/no-array-constructor.js +195 -0
  148. package/lib/rules/no-async-promise-executor.js +45 -0
  149. package/lib/rules/no-await-in-loop.js +115 -0
  150. package/lib/rules/no-bitwise.js +145 -0
  151. package/lib/rules/no-buffer-constructor.js +74 -0
  152. package/lib/rules/no-caller.js +52 -0
  153. package/lib/rules/no-case-declarations.js +80 -0
  154. package/lib/rules/no-catch-shadow.js +96 -0
  155. package/lib/rules/no-class-assign.js +66 -0
  156. package/lib/rules/no-compare-neg-zero.js +74 -0
  157. package/lib/rules/no-cond-assign.js +175 -0
  158. package/lib/rules/no-confusing-arrow.js +127 -0
  159. package/lib/rules/no-console.js +221 -0
  160. package/lib/rules/no-const-assign.js +73 -0
  161. package/lib/rules/no-constant-binary-expression.js +603 -0
  162. package/lib/rules/no-constant-condition.js +177 -0
  163. package/lib/rules/no-constructor-return.js +62 -0
  164. package/lib/rules/no-continue.js +38 -0
  165. package/lib/rules/no-control-regex.js +142 -0
  166. package/lib/rules/no-debugger.js +41 -0
  167. package/lib/rules/no-delete-var.js +42 -0
  168. package/lib/rules/no-div-regex.js +60 -0
  169. package/lib/rules/no-dupe-args.js +92 -0
  170. package/lib/rules/no-dupe-class-members.js +117 -0
  171. package/lib/rules/no-dupe-else-if.js +145 -0
  172. package/lib/rules/no-dupe-keys.js +165 -0
  173. package/lib/rules/no-duplicate-case.js +78 -0
  174. package/lib/rules/no-duplicate-imports.js +368 -0
  175. package/lib/rules/no-else-return.js +450 -0
  176. package/lib/rules/no-empty-character-class.js +83 -0
  177. package/lib/rules/no-empty-function.js +236 -0
  178. package/lib/rules/no-empty-pattern.js +85 -0
  179. package/lib/rules/no-empty-static-block.js +73 -0
  180. package/lib/rules/no-empty.js +153 -0
  181. package/lib/rules/no-eq-null.js +51 -0
  182. package/lib/rules/no-eval.js +295 -0
  183. package/lib/rules/no-ex-assign.js +57 -0
  184. package/lib/rules/no-extend-native.js +180 -0
  185. package/lib/rules/no-extra-bind.js +224 -0
  186. package/lib/rules/no-extra-boolean-cast.js +420 -0
  187. package/lib/rules/no-extra-label.js +169 -0
  188. package/lib/rules/no-extra-parens.js +1669 -0
  189. package/lib/rules/no-extra-semi.js +167 -0
  190. package/lib/rules/no-fallthrough.js +260 -0
  191. package/lib/rules/no-floating-decimal.js +99 -0
  192. package/lib/rules/no-func-assign.js +77 -0
  193. package/lib/rules/no-global-assign.js +101 -0
  194. package/lib/rules/no-implicit-coercion.js +468 -0
  195. package/lib/rules/no-implicit-globals.js +187 -0
  196. package/lib/rules/no-implied-eval.js +170 -0
  197. package/lib/rules/no-import-assign.js +227 -0
  198. package/lib/rules/no-inline-comments.js +115 -0
  199. package/lib/rules/no-inner-declarations.js +147 -0
  200. package/lib/rules/no-invalid-regexp.js +244 -0
  201. package/lib/rules/no-invalid-this.js +178 -0
  202. package/lib/rules/no-irregular-whitespace.js +292 -0
  203. package/lib/rules/no-iterator.js +48 -0
  204. package/lib/rules/no-label-var.js +78 -0
  205. package/lib/rules/no-labels.js +156 -0
  206. package/lib/rules/no-lone-blocks.js +140 -0
  207. package/lib/rules/no-lonely-if.js +126 -0
  208. package/lib/rules/no-loop-func.js +267 -0
  209. package/lib/rules/no-loss-of-precision.js +249 -0
  210. package/lib/rules/no-magic-numbers.js +365 -0
  211. package/lib/rules/no-misleading-character-class.js +595 -0
  212. package/lib/rules/no-mixed-operators.js +253 -0
  213. package/lib/rules/no-mixed-requires.js +267 -0
  214. package/lib/rules/no-mixed-spaces-and-tabs.js +148 -0
  215. package/lib/rules/no-multi-assign.js +66 -0
  216. package/lib/rules/no-multi-spaces.js +179 -0
  217. package/lib/rules/no-multi-str.js +67 -0
  218. package/lib/rules/no-multiple-empty-lines.js +210 -0
  219. package/lib/rules/no-native-reassign.js +114 -0
  220. package/lib/rules/no-negated-condition.js +100 -0
  221. package/lib/rules/no-negated-in-lhs.js +59 -0
  222. package/lib/rules/no-nested-ternary.js +46 -0
  223. package/lib/rules/no-new-func.js +96 -0
  224. package/lib/rules/no-new-native-nonconstructor.js +70 -0
  225. package/lib/rules/no-new-object.js +76 -0
  226. package/lib/rules/no-new-require.js +67 -0
  227. package/lib/rules/no-new-symbol.js +74 -0
  228. package/lib/rules/no-new-wrappers.js +62 -0
  229. package/lib/rules/no-new.js +42 -0
  230. package/lib/rules/no-nonoctal-decimal-escape.js +176 -0
  231. package/lib/rules/no-obj-calls.js +99 -0
  232. package/lib/rules/no-object-constructor.js +124 -0
  233. package/lib/rules/no-octal-escape.js +53 -0
  234. package/lib/rules/no-octal.js +42 -0
  235. package/lib/rules/no-param-reassign.js +248 -0
  236. package/lib/rules/no-path-concat.js +79 -0
  237. package/lib/rules/no-plusplus.js +102 -0
  238. package/lib/rules/no-process-env.js +68 -0
  239. package/lib/rules/no-process-exit.js +67 -0
  240. package/lib/rules/no-promise-executor-return.js +264 -0
  241. package/lib/rules/no-proto.js +45 -0
  242. package/lib/rules/no-prototype-builtins.js +181 -0
  243. package/lib/rules/no-redeclare.js +173 -0
  244. package/lib/rules/no-regex-spaces.js +219 -0
  245. package/lib/rules/no-restricted-exports.js +227 -0
  246. package/lib/rules/no-restricted-globals.js +266 -0
  247. package/lib/rules/no-restricted-imports.js +892 -0
  248. package/lib/rules/no-restricted-modules.js +249 -0
  249. package/lib/rules/no-restricted-properties.js +233 -0
  250. package/lib/rules/no-restricted-syntax.js +74 -0
  251. package/lib/rules/no-return-assign.js +87 -0
  252. package/lib/rules/no-return-await.js +162 -0
  253. package/lib/rules/no-script-url.js +68 -0
  254. package/lib/rules/no-self-assign.js +186 -0
  255. package/lib/rules/no-self-compare.js +77 -0
  256. package/lib/rules/no-sequences.js +158 -0
  257. package/lib/rules/no-setter-return.js +224 -0
  258. package/lib/rules/no-shadow-restricted-names.js +113 -0
  259. package/lib/rules/no-shadow.js +624 -0
  260. package/lib/rules/no-spaced-func.js +105 -0
  261. package/lib/rules/no-sparse-arrays.js +68 -0
  262. package/lib/rules/no-sync.js +81 -0
  263. package/lib/rules/no-tabs.js +110 -0
  264. package/lib/rules/no-template-curly-in-string.js +45 -0
  265. package/lib/rules/no-ternary.js +38 -0
  266. package/lib/rules/no-this-before-super.js +365 -0
  267. package/lib/rules/no-throw-literal.js +46 -0
  268. package/lib/rules/no-trailing-spaces.js +227 -0
  269. package/lib/rules/no-unassigned-vars.js +80 -0
  270. package/lib/rules/no-undef-init.js +101 -0
  271. package/lib/rules/no-undef.js +84 -0
  272. package/lib/rules/no-undefined.js +85 -0
  273. package/lib/rules/no-underscore-dangle.js +383 -0
  274. package/lib/rules/no-unexpected-multiline.js +130 -0
  275. package/lib/rules/no-unmodified-loop-condition.js +360 -0
  276. package/lib/rules/no-unneeded-ternary.js +232 -0
  277. package/lib/rules/no-unreachable-loop.js +190 -0
  278. package/lib/rules/no-unreachable.js +300 -0
  279. package/lib/rules/no-unsafe-finally.js +119 -0
  280. package/lib/rules/no-unsafe-negation.js +152 -0
  281. package/lib/rules/no-unsafe-optional-chaining.js +221 -0
  282. package/lib/rules/no-unused-expressions.js +227 -0
  283. package/lib/rules/no-unused-labels.js +158 -0
  284. package/lib/rules/no-unused-private-class-members.js +219 -0
  285. package/lib/rules/no-unused-vars.js +1739 -0
  286. package/lib/rules/no-use-before-define.js +446 -0
  287. package/lib/rules/no-useless-assignment.js +657 -0
  288. package/lib/rules/no-useless-backreference.js +263 -0
  289. package/lib/rules/no-useless-call.js +95 -0
  290. package/lib/rules/no-useless-catch.js +57 -0
  291. package/lib/rules/no-useless-computed-key.js +204 -0
  292. package/lib/rules/no-useless-concat.js +121 -0
  293. package/lib/rules/no-useless-constructor.js +262 -0
  294. package/lib/rules/no-useless-escape.js +406 -0
  295. package/lib/rules/no-useless-rename.js +202 -0
  296. package/lib/rules/no-useless-return.js +401 -0
  297. package/lib/rules/no-var.js +367 -0
  298. package/lib/rules/no-void.js +69 -0
  299. package/lib/rules/no-warning-comments.js +209 -0
  300. package/lib/rules/no-whitespace-before-property.js +150 -0
  301. package/lib/rules/no-with.js +37 -0
  302. package/lib/rules/nonblock-statement-body-position.js +164 -0
  303. package/lib/rules/object-curly-newline.js +383 -0
  304. package/lib/rules/object-curly-spacing.js +369 -0
  305. package/lib/rules/object-property-newline.js +151 -0
  306. package/lib/rules/object-shorthand.js +652 -0
  307. package/lib/rules/one-var-declaration-per-line.js +117 -0
  308. package/lib/rules/one-var.js +717 -0
  309. package/lib/rules/operator-assignment.js +270 -0
  310. package/lib/rules/operator-linebreak.js +315 -0
  311. package/lib/rules/padded-blocks.js +366 -0
  312. package/lib/rules/padding-line-between-statements.js +612 -0
  313. package/lib/rules/prefer-arrow-callback.js +437 -0
  314. package/lib/rules/prefer-const.js +546 -0
  315. package/lib/rules/prefer-destructuring.js +332 -0
  316. package/lib/rules/prefer-exponentiation-operator.js +235 -0
  317. package/lib/rules/prefer-named-capture-group.js +197 -0
  318. package/lib/rules/prefer-numeric-literals.js +157 -0
  319. package/lib/rules/prefer-object-has-own.js +148 -0
  320. package/lib/rules/prefer-object-spread.js +319 -0
  321. package/lib/rules/prefer-promise-reject-errors.js +154 -0
  322. package/lib/rules/prefer-reflect.js +150 -0
  323. package/lib/rules/prefer-regex-literals.js +605 -0
  324. package/lib/rules/prefer-rest-params.js +117 -0
  325. package/lib/rules/prefer-spread.js +91 -0
  326. package/lib/rules/prefer-template.js +347 -0
  327. package/lib/rules/preserve-caught-error.js +535 -0
  328. package/lib/rules/quote-props.js +394 -0
  329. package/lib/rules/quotes.js +416 -0
  330. package/lib/rules/radix.js +193 -0
  331. package/lib/rules/require-atomic-updates.js +365 -0
  332. package/lib/rules/require-await.js +184 -0
  333. package/lib/rules/require-unicode-regexp.js +317 -0
  334. package/lib/rules/require-yield.js +86 -0
  335. package/lib/rules/rest-spread-spacing.js +150 -0
  336. package/lib/rules/semi-spacing.js +297 -0
  337. package/lib/rules/semi-style.js +218 -0
  338. package/lib/rules/semi.js +476 -0
  339. package/lib/rules/sort-imports.js +319 -0
  340. package/lib/rules/sort-keys.js +268 -0
  341. package/lib/rules/sort-vars.js +140 -0
  342. package/lib/rules/space-before-blocks.js +232 -0
  343. package/lib/rules/space-before-function-paren.js +202 -0
  344. package/lib/rules/space-in-parens.js +374 -0
  345. package/lib/rules/space-infix-ops.js +249 -0
  346. package/lib/rules/space-unary-ops.js +400 -0
  347. package/lib/rules/spaced-comment.js +447 -0
  348. package/lib/rules/strict.js +314 -0
  349. package/lib/rules/switch-colon-spacing.js +158 -0
  350. package/lib/rules/symbol-description.js +70 -0
  351. package/lib/rules/template-curly-spacing.js +168 -0
  352. package/lib/rules/template-tag-spacing.js +121 -0
  353. package/lib/rules/unicode-bom.js +73 -0
  354. package/lib/rules/use-isnan.js +268 -0
  355. package/lib/rules/utils/ast-utils.js +2828 -0
  356. package/lib/rules/utils/char-source.js +247 -0
  357. package/lib/rules/utils/fix-tracker.js +125 -0
  358. package/lib/rules/utils/keywords.js +67 -0
  359. package/lib/rules/utils/lazy-loading-rule-map.js +118 -0
  360. package/lib/rules/utils/regular-expressions.js +58 -0
  361. package/lib/rules/utils/unicode/index.js +16 -0
  362. package/lib/rules/utils/unicode/is-combining-character.js +13 -0
  363. package/lib/rules/utils/unicode/is-emoji-modifier.js +13 -0
  364. package/lib/rules/utils/unicode/is-regional-indicator-symbol.js +13 -0
  365. package/lib/rules/utils/unicode/is-surrogate-pair.js +14 -0
  366. package/lib/rules/valid-typeof.js +171 -0
  367. package/lib/rules/vars-on-top.js +165 -0
  368. package/lib/rules/wrap-iife.js +238 -0
  369. package/lib/rules/wrap-regex.js +91 -0
  370. package/lib/rules/yield-star-spacing.js +158 -0
  371. package/lib/rules/yoda.js +362 -0
  372. package/lib/services/parser-service.js +64 -0
  373. package/lib/services/processor-service.js +100 -0
  374. package/lib/services/suppressions-service.js +302 -0
  375. package/lib/services/warning-service.js +87 -0
  376. package/lib/shared/ajv.js +34 -0
  377. package/lib/shared/assert.js +21 -0
  378. package/lib/shared/ast-utils.js +30 -0
  379. package/lib/shared/deep-merge-arrays.js +62 -0
  380. package/lib/shared/directives.js +16 -0
  381. package/lib/shared/flags.js +89 -0
  382. package/lib/shared/logging.js +38 -0
  383. package/lib/shared/naming.js +109 -0
  384. package/lib/shared/option-utils.js +63 -0
  385. package/lib/shared/relative-module-resolver.js +28 -0
  386. package/lib/shared/runtime-info.js +177 -0
  387. package/lib/shared/serialization.js +78 -0
  388. package/lib/shared/severity.js +49 -0
  389. package/lib/shared/stats.js +30 -0
  390. package/lib/shared/string-utils.js +58 -0
  391. package/lib/shared/text-table.js +68 -0
  392. package/lib/shared/translate-cli-options.js +223 -0
  393. package/lib/shared/traverser.js +202 -0
  394. package/lib/types/config-api.d.ts +12 -0
  395. package/lib/types/index.d.ts +1482 -0
  396. package/lib/types/rules.d.ts +5603 -0
  397. package/lib/types/universal.d.ts +6 -0
  398. package/lib/types/use-at-your-own-risk.d.ts +34 -0
  399. package/lib/universal.js +10 -0
  400. package/lib/unsupported-api.js +26 -0
  401. package/messages/all-files-ignored.js +16 -0
  402. package/messages/all-matched-files-ignored.js +21 -0
  403. package/messages/config-file-missing.js +16 -0
  404. package/messages/config-plugin-missing.js +14 -0
  405. package/messages/config-serialize-function.js +30 -0
  406. package/messages/eslintrc-incompat.js +117 -0
  407. package/messages/eslintrc-plugins.js +27 -0
  408. package/messages/extend-config-missing.js +13 -0
  409. package/messages/failed-to-read-json.js +11 -0
  410. package/messages/file-not-found.js +10 -0
  411. package/messages/invalid-rule-options.js +17 -0
  412. package/messages/invalid-rule-severity.js +13 -0
  413. package/messages/no-config-found.js +15 -0
  414. package/messages/plugin-conflict.js +22 -0
  415. package/messages/plugin-invalid.js +16 -0
  416. package/messages/plugin-missing.js +19 -0
  417. package/messages/print-config-with-directory-path.js +8 -0
  418. package/messages/shared.js +23 -0
  419. package/messages/whitespace-found.js +11 -0
  420. package/package.json +220 -0
@@ -0,0 +1,401 @@
1
+ /**
2
+ * @fileoverview Disallow redundant return statements
3
+ * @author Teddy Katz
4
+ */
5
+ "use strict";
6
+
7
+ //------------------------------------------------------------------------------
8
+ // Requirements
9
+ //------------------------------------------------------------------------------
10
+
11
+ const astUtils = require("./utils/ast-utils"),
12
+ FixTracker = require("./utils/fix-tracker");
13
+
14
+ //------------------------------------------------------------------------------
15
+ // Helpers
16
+ //------------------------------------------------------------------------------
17
+
18
+ /**
19
+ * Removes the given element from the array.
20
+ * @param {Array} array The source array to remove.
21
+ * @param {any} element The target item to remove.
22
+ * @returns {void}
23
+ */
24
+ function remove(array, element) {
25
+ const index = array.indexOf(element);
26
+
27
+ if (index !== -1) {
28
+ array.splice(index, 1);
29
+ }
30
+ }
31
+
32
+ /**
33
+ * Checks whether it can remove the given return statement or not.
34
+ * @param {ASTNode} node The return statement node to check.
35
+ * @returns {boolean} `true` if the node is removable.
36
+ */
37
+ function isRemovable(node) {
38
+ return astUtils.STATEMENT_LIST_PARENTS.has(node.parent.type);
39
+ }
40
+
41
+ /**
42
+ * Checks whether the given return statement is in a `finally` block or not.
43
+ * @param {ASTNode} node The return statement node to check.
44
+ * @returns {boolean} `true` if the node is in a `finally` block.
45
+ */
46
+ function isInFinally(node) {
47
+ for (
48
+ let currentNode = node;
49
+ currentNode && currentNode.parent && !astUtils.isFunction(currentNode);
50
+ currentNode = currentNode.parent
51
+ ) {
52
+ if (
53
+ currentNode.parent.type === "TryStatement" &&
54
+ currentNode.parent.finalizer === currentNode
55
+ ) {
56
+ return true;
57
+ }
58
+ }
59
+
60
+ return false;
61
+ }
62
+
63
+ /**
64
+ * Checks all segments in a set and returns true if any are reachable.
65
+ * @param {Set<CodePathSegment>} segments The segments to check.
66
+ * @returns {boolean} True if any segment is reachable; false otherwise.
67
+ */
68
+ function isAnySegmentReachable(segments) {
69
+ for (const segment of segments) {
70
+ if (segment.reachable) {
71
+ return true;
72
+ }
73
+ }
74
+
75
+ return false;
76
+ }
77
+
78
+ //------------------------------------------------------------------------------
79
+ // Rule Definition
80
+ //------------------------------------------------------------------------------
81
+
82
+ /** @type {import('../types').Rule.RuleModule} */
83
+ module.exports = {
84
+ meta: {
85
+ type: "suggestion",
86
+
87
+ docs: {
88
+ description: "Disallow redundant return statements",
89
+ recommended: false,
90
+ url: "https://eslint.org/docs/latest/rules/no-useless-return",
91
+ },
92
+
93
+ fixable: "code",
94
+ schema: [],
95
+
96
+ messages: {
97
+ unnecessaryReturn: "Unnecessary return statement.",
98
+ },
99
+ },
100
+
101
+ create(context) {
102
+ const segmentInfoMap = new WeakMap();
103
+ const sourceCode = context.sourceCode;
104
+ let scopeInfo = null;
105
+
106
+ /**
107
+ * Checks whether the given segment is terminated by a return statement or not.
108
+ * @param {CodePathSegment} segment The segment to check.
109
+ * @returns {boolean} `true` if the segment is terminated by a return statement, or if it's still a part of unreachable.
110
+ */
111
+ function isReturned(segment) {
112
+ const info = segmentInfoMap.get(segment);
113
+
114
+ return !info || info.returned;
115
+ }
116
+
117
+ /**
118
+ * Collects useless return statements from the given previous segments.
119
+ *
120
+ * A previous segment may be an unreachable segment.
121
+ * In that case, the information object of the unreachable segment is not
122
+ * initialized because `onCodePathSegmentStart` event is not notified for
123
+ * unreachable segments.
124
+ * This goes to the previous segments of the unreachable segment recursively
125
+ * if the unreachable segment was generated by a return statement. Otherwise,
126
+ * this ignores the unreachable segment.
127
+ *
128
+ * This behavior would simulate code paths for the case that the return
129
+ * statement does not exist.
130
+ * @param {ASTNode[]} uselessReturns The collected return statements.
131
+ * @param {CodePathSegment[]} prevSegments The previous segments to traverse.
132
+ * @param {WeakSet<CodePathSegment>} [providedTraversedSegments] A set of segments that have already been traversed in this call
133
+ * @returns {ASTNode[]} `uselessReturns`.
134
+ */
135
+ function getUselessReturns(
136
+ uselessReturns,
137
+ prevSegments,
138
+ providedTraversedSegments,
139
+ ) {
140
+ const traversedSegments =
141
+ providedTraversedSegments || new WeakSet();
142
+
143
+ for (const segment of prevSegments) {
144
+ if (!segment.reachable) {
145
+ if (!traversedSegments.has(segment)) {
146
+ traversedSegments.add(segment);
147
+ getUselessReturns(
148
+ uselessReturns,
149
+ segment.allPrevSegments.filter(isReturned),
150
+ traversedSegments,
151
+ );
152
+ }
153
+ continue;
154
+ }
155
+
156
+ if (segmentInfoMap.has(segment)) {
157
+ uselessReturns.push(
158
+ ...segmentInfoMap.get(segment).uselessReturns,
159
+ );
160
+ }
161
+ }
162
+
163
+ return uselessReturns;
164
+ }
165
+
166
+ /**
167
+ * Removes the return statements on the given segment from the useless return
168
+ * statement list.
169
+ *
170
+ * This segment may be an unreachable segment.
171
+ * In that case, the information object of the unreachable segment is not
172
+ * initialized because `onCodePathSegmentStart` event is not notified for
173
+ * unreachable segments.
174
+ * This goes to the previous segments of the unreachable segment recursively
175
+ * if the unreachable segment was generated by a return statement. Otherwise,
176
+ * this ignores the unreachable segment.
177
+ *
178
+ * This behavior would simulate code paths for the case that the return
179
+ * statement does not exist.
180
+ * @param {CodePathSegment} segment The segment to get return statements.
181
+ * @param {Set<CodePathSegment>} usedUnreachableSegments A set of segments that have already been traversed in this call.
182
+ * @returns {void}
183
+ */
184
+ function markReturnStatementsOnSegmentAsUsed(
185
+ segment,
186
+ usedUnreachableSegments,
187
+ ) {
188
+ if (!segment.reachable) {
189
+ usedUnreachableSegments.add(segment);
190
+ segment.allPrevSegments
191
+ .filter(isReturned)
192
+ .filter(
193
+ prevSegment =>
194
+ !usedUnreachableSegments.has(prevSegment),
195
+ )
196
+ .forEach(prevSegment =>
197
+ markReturnStatementsOnSegmentAsUsed(
198
+ prevSegment,
199
+ usedUnreachableSegments,
200
+ ),
201
+ );
202
+ return;
203
+ }
204
+
205
+ const info = segmentInfoMap.get(segment);
206
+
207
+ if (!info) {
208
+ return;
209
+ }
210
+
211
+ info.uselessReturns = info.uselessReturns.filter(node => {
212
+ if (
213
+ scopeInfo.traversedTryBlockStatements &&
214
+ scopeInfo.traversedTryBlockStatements.length > 0
215
+ ) {
216
+ const returnInitialRange = node.range[0];
217
+ const returnFinalRange = node.range[1];
218
+
219
+ const areBlocksInRange =
220
+ scopeInfo.traversedTryBlockStatements.some(
221
+ tryBlockStatement => {
222
+ const blockInitialRange =
223
+ tryBlockStatement.range[0];
224
+ const blockFinalRange =
225
+ tryBlockStatement.range[1];
226
+
227
+ return (
228
+ returnInitialRange >= blockInitialRange &&
229
+ returnFinalRange <= blockFinalRange
230
+ );
231
+ },
232
+ );
233
+
234
+ if (areBlocksInRange) {
235
+ return true;
236
+ }
237
+ }
238
+
239
+ remove(scopeInfo.uselessReturns, node);
240
+ return false;
241
+ });
242
+ }
243
+
244
+ /**
245
+ * Removes the return statements on the current segments from the useless
246
+ * return statement list.
247
+ *
248
+ * This function will be called at every statement except FunctionDeclaration,
249
+ * BlockStatement, and BreakStatement.
250
+ *
251
+ * - FunctionDeclarations are always executed whether it's returned or not.
252
+ * - BlockStatements do nothing.
253
+ * - BreakStatements go the next merely.
254
+ * @returns {void}
255
+ */
256
+ function markReturnStatementsOnCurrentSegmentsAsUsed() {
257
+ scopeInfo.currentSegments.forEach(segment =>
258
+ markReturnStatementsOnSegmentAsUsed(segment, new Set()),
259
+ );
260
+ }
261
+
262
+ //----------------------------------------------------------------------
263
+ // Public
264
+ //----------------------------------------------------------------------
265
+
266
+ return {
267
+ // Makes and pushes a new scope information.
268
+ onCodePathStart(codePath) {
269
+ scopeInfo = {
270
+ upper: scopeInfo,
271
+ uselessReturns: [],
272
+ traversedTryBlockStatements: [],
273
+ codePath,
274
+ currentSegments: new Set(),
275
+ };
276
+ },
277
+
278
+ // Reports useless return statements if exist.
279
+ onCodePathEnd() {
280
+ for (const node of scopeInfo.uselessReturns) {
281
+ context.report({
282
+ node,
283
+ loc: node.loc,
284
+ messageId: "unnecessaryReturn",
285
+ fix(fixer) {
286
+ if (
287
+ isRemovable(node) &&
288
+ !sourceCode.getCommentsInside(node).length
289
+ ) {
290
+ /*
291
+ * Extend the replacement range to include the
292
+ * entire function to avoid conflicting with
293
+ * no-else-return.
294
+ * https://github.com/eslint/eslint/issues/8026
295
+ */
296
+ return new FixTracker(fixer, sourceCode)
297
+ .retainEnclosingFunction(node)
298
+ .remove(node);
299
+ }
300
+ return null;
301
+ },
302
+ });
303
+ }
304
+
305
+ scopeInfo = scopeInfo.upper;
306
+ },
307
+
308
+ /*
309
+ * Initializes segments.
310
+ * NOTE: This event is notified for only reachable segments.
311
+ */
312
+ onCodePathSegmentStart(segment) {
313
+ scopeInfo.currentSegments.add(segment);
314
+
315
+ const info = {
316
+ uselessReturns: getUselessReturns(
317
+ [],
318
+ segment.allPrevSegments,
319
+ ),
320
+ returned: false,
321
+ };
322
+
323
+ // Stores the info.
324
+ segmentInfoMap.set(segment, info);
325
+ },
326
+
327
+ onUnreachableCodePathSegmentStart(segment) {
328
+ scopeInfo.currentSegments.add(segment);
329
+ },
330
+
331
+ onUnreachableCodePathSegmentEnd(segment) {
332
+ scopeInfo.currentSegments.delete(segment);
333
+ },
334
+
335
+ onCodePathSegmentEnd(segment) {
336
+ scopeInfo.currentSegments.delete(segment);
337
+ },
338
+
339
+ // Adds ReturnStatement node to check whether it's useless or not.
340
+ ReturnStatement(node) {
341
+ if (node.argument) {
342
+ markReturnStatementsOnCurrentSegmentsAsUsed();
343
+ }
344
+ if (
345
+ node.argument ||
346
+ astUtils.isInLoop(node) ||
347
+ isInFinally(node) ||
348
+ // Ignore `return` statements in unreachable places (https://github.com/eslint/eslint/issues/11647).
349
+ !isAnySegmentReachable(scopeInfo.currentSegments)
350
+ ) {
351
+ return;
352
+ }
353
+
354
+ for (const segment of scopeInfo.currentSegments) {
355
+ const info = segmentInfoMap.get(segment);
356
+
357
+ if (info) {
358
+ info.uselessReturns.push(node);
359
+ info.returned = true;
360
+ }
361
+ }
362
+ scopeInfo.uselessReturns.push(node);
363
+ },
364
+
365
+ "TryStatement > BlockStatement.block:exit"(node) {
366
+ scopeInfo.traversedTryBlockStatements.push(node);
367
+ },
368
+
369
+ "TryStatement:exit"() {
370
+ scopeInfo.traversedTryBlockStatements.pop();
371
+ },
372
+
373
+ /*
374
+ * Registers for all statement nodes except FunctionDeclaration, BlockStatement, BreakStatement.
375
+ * Removes return statements of the current segments from the useless return statement list.
376
+ */
377
+ ClassDeclaration: markReturnStatementsOnCurrentSegmentsAsUsed,
378
+ ContinueStatement: markReturnStatementsOnCurrentSegmentsAsUsed,
379
+ DebuggerStatement: markReturnStatementsOnCurrentSegmentsAsUsed,
380
+ DoWhileStatement: markReturnStatementsOnCurrentSegmentsAsUsed,
381
+ EmptyStatement: markReturnStatementsOnCurrentSegmentsAsUsed,
382
+ ExpressionStatement: markReturnStatementsOnCurrentSegmentsAsUsed,
383
+ ForInStatement: markReturnStatementsOnCurrentSegmentsAsUsed,
384
+ ForOfStatement: markReturnStatementsOnCurrentSegmentsAsUsed,
385
+ ForStatement: markReturnStatementsOnCurrentSegmentsAsUsed,
386
+ IfStatement: markReturnStatementsOnCurrentSegmentsAsUsed,
387
+ ImportDeclaration: markReturnStatementsOnCurrentSegmentsAsUsed,
388
+ LabeledStatement: markReturnStatementsOnCurrentSegmentsAsUsed,
389
+ SwitchStatement: markReturnStatementsOnCurrentSegmentsAsUsed,
390
+ ThrowStatement: markReturnStatementsOnCurrentSegmentsAsUsed,
391
+ TryStatement: markReturnStatementsOnCurrentSegmentsAsUsed,
392
+ VariableDeclaration: markReturnStatementsOnCurrentSegmentsAsUsed,
393
+ WhileStatement: markReturnStatementsOnCurrentSegmentsAsUsed,
394
+ WithStatement: markReturnStatementsOnCurrentSegmentsAsUsed,
395
+ ExportNamedDeclaration: markReturnStatementsOnCurrentSegmentsAsUsed,
396
+ ExportDefaultDeclaration:
397
+ markReturnStatementsOnCurrentSegmentsAsUsed,
398
+ ExportAllDeclaration: markReturnStatementsOnCurrentSegmentsAsUsed,
399
+ };
400
+ },
401
+ };