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,365 @@
1
+ /**
2
+ * @fileoverview Rule to flag statements that use magic numbers (adapted from https://github.com/danielstjules/buddy.js)
3
+ * @author Vincent Lemeunier
4
+ */
5
+
6
+ "use strict";
7
+
8
+ const astUtils = require("./utils/ast-utils");
9
+
10
+ // Maximum array length by the ECMAScript Specification.
11
+ const MAX_ARRAY_LENGTH = 2 ** 32 - 1;
12
+
13
+ //------------------------------------------------------------------------------
14
+ // Rule Definition
15
+ //------------------------------------------------------------------------------
16
+
17
+ /**
18
+ * Convert the value to bigint if it's a string. Otherwise return the value as-is.
19
+ * @param {bigint|number|string} x The value to normalize.
20
+ * @returns {bigint|number} The normalized value.
21
+ */
22
+ function normalizeIgnoreValue(x) {
23
+ if (typeof x === "string") {
24
+ return BigInt(x.slice(0, -1));
25
+ }
26
+ return x;
27
+ }
28
+
29
+ /**
30
+ * Checks if the node parent is a TypeScript enum member
31
+ * @param {ASTNode} node The node to be validated
32
+ * @returns {boolean} True if the node parent is a TypeScript enum member
33
+ */
34
+ function isParentTSEnumDeclaration(node) {
35
+ return node.parent.type === "TSEnumMember";
36
+ }
37
+
38
+ /**
39
+ * Checks if the node is a valid TypeScript numeric literal type.
40
+ * @param {ASTNode} node The node to be validated
41
+ * @returns {boolean} True if the node is a TypeScript numeric literal type
42
+ */
43
+ function isTSNumericLiteralType(node) {
44
+ let ancestor = node.parent;
45
+
46
+ // Go up while we're part of a type union
47
+ while (ancestor.parent.type === "TSUnionType") {
48
+ ancestor = ancestor.parent;
49
+ }
50
+
51
+ // Check if the final ancestor is in a type alias declaration
52
+ return ancestor.parent.type === "TSTypeAliasDeclaration";
53
+ }
54
+
55
+ /**
56
+ * Checks if the node parent is a readonly class property
57
+ * @param {ASTNode} node The node to be validated
58
+ * @returns {boolean} True if the node parent is a readonly class property
59
+ */
60
+ function isParentTSReadonlyPropertyDefinition(node) {
61
+ if (node.parent?.type === "PropertyDefinition" && node.parent.readonly) {
62
+ return true;
63
+ }
64
+
65
+ return false;
66
+ }
67
+
68
+ /**
69
+ * Checks if the node is part of a type indexed access (eg. Foo[4])
70
+ * @param {ASTNode} node The node to be validated
71
+ * @returns {boolean} True if the node is part of an indexed access
72
+ */
73
+ function isAncestorTSIndexedAccessType(node) {
74
+ let ancestor = node.parent;
75
+
76
+ /*
77
+ * Go up another level while we're part of a type union (eg. 1 | 2) or
78
+ * intersection (eg. 1 & 2)
79
+ */
80
+ while (
81
+ ancestor.parent.type === "TSUnionType" ||
82
+ ancestor.parent.type === "TSIntersectionType"
83
+ ) {
84
+ ancestor = ancestor.parent;
85
+ }
86
+
87
+ return ancestor.parent.type === "TSIndexedAccessType";
88
+ }
89
+
90
+ /** @type {import('../types').Rule.RuleModule} */
91
+ module.exports = {
92
+ meta: {
93
+ type: "suggestion",
94
+ dialects: ["typescript", "javascript"],
95
+ language: "javascript",
96
+
97
+ docs: {
98
+ description: "Disallow magic numbers",
99
+ recommended: false,
100
+ frozen: true,
101
+ url: "https://eslint.org/docs/latest/rules/no-magic-numbers",
102
+ },
103
+
104
+ schema: [
105
+ {
106
+ type: "object",
107
+ properties: {
108
+ detectObjects: {
109
+ type: "boolean",
110
+ default: false,
111
+ },
112
+ enforceConst: {
113
+ type: "boolean",
114
+ default: false,
115
+ },
116
+ ignore: {
117
+ type: "array",
118
+ items: {
119
+ anyOf: [
120
+ { type: "number" },
121
+ {
122
+ type: "string",
123
+ pattern: "^[+-]?(?:0|[1-9][0-9]*)n$",
124
+ },
125
+ ],
126
+ },
127
+ uniqueItems: true,
128
+ },
129
+ ignoreArrayIndexes: {
130
+ type: "boolean",
131
+ default: false,
132
+ },
133
+ ignoreDefaultValues: {
134
+ type: "boolean",
135
+ default: false,
136
+ },
137
+ ignoreClassFieldInitialValues: {
138
+ type: "boolean",
139
+ default: false,
140
+ },
141
+ ignoreEnums: {
142
+ type: "boolean",
143
+ default: false,
144
+ },
145
+ ignoreNumericLiteralTypes: {
146
+ type: "boolean",
147
+ default: false,
148
+ },
149
+ ignoreReadonlyClassProperties: {
150
+ type: "boolean",
151
+ default: false,
152
+ },
153
+ ignoreTypeIndexes: {
154
+ type: "boolean",
155
+ default: false,
156
+ },
157
+ },
158
+ additionalProperties: false,
159
+ },
160
+ ],
161
+
162
+ messages: {
163
+ useConst: "Number constants declarations must use 'const'.",
164
+ noMagic: "No magic number: {{raw}}.",
165
+ },
166
+ },
167
+
168
+ create(context) {
169
+ const config = context.options[0] || {},
170
+ detectObjects = !!config.detectObjects,
171
+ enforceConst = !!config.enforceConst,
172
+ ignore = new Set((config.ignore || []).map(normalizeIgnoreValue)),
173
+ ignoreArrayIndexes = !!config.ignoreArrayIndexes,
174
+ ignoreDefaultValues = !!config.ignoreDefaultValues,
175
+ ignoreClassFieldInitialValues =
176
+ !!config.ignoreClassFieldInitialValues,
177
+ ignoreEnums = !!config.ignoreEnums,
178
+ ignoreNumericLiteralTypes = !!config.ignoreNumericLiteralTypes,
179
+ ignoreReadonlyClassProperties =
180
+ !!config.ignoreReadonlyClassProperties,
181
+ ignoreTypeIndexes = !!config.ignoreTypeIndexes;
182
+
183
+ const okTypes = detectObjects
184
+ ? []
185
+ : ["ObjectExpression", "Property", "AssignmentExpression"];
186
+
187
+ /**
188
+ * Returns whether the rule is configured to ignore the given value
189
+ * @param {bigint|number} value The value to check
190
+ * @returns {boolean} true if the value is ignored
191
+ */
192
+ function isIgnoredValue(value) {
193
+ return ignore.has(value);
194
+ }
195
+
196
+ /**
197
+ * Returns whether the number is a default value assignment.
198
+ * @param {ASTNode} fullNumberNode `Literal` or `UnaryExpression` full number node
199
+ * @returns {boolean} true if the number is a default value
200
+ */
201
+ function isDefaultValue(fullNumberNode) {
202
+ const parent = fullNumberNode.parent;
203
+
204
+ return (
205
+ parent.type === "AssignmentPattern" &&
206
+ parent.right === fullNumberNode
207
+ );
208
+ }
209
+
210
+ /**
211
+ * Returns whether the number is the initial value of a class field.
212
+ * @param {ASTNode} fullNumberNode `Literal` or `UnaryExpression` full number node
213
+ * @returns {boolean} true if the number is the initial value of a class field.
214
+ */
215
+ function isClassFieldInitialValue(fullNumberNode) {
216
+ const parent = fullNumberNode.parent;
217
+
218
+ return (
219
+ parent.type === "PropertyDefinition" &&
220
+ parent.value === fullNumberNode
221
+ );
222
+ }
223
+
224
+ /**
225
+ * Returns whether the given node is used as a radix within parseInt() or Number.parseInt()
226
+ * @param {ASTNode} fullNumberNode `Literal` or `UnaryExpression` full number node
227
+ * @returns {boolean} true if the node is radix
228
+ */
229
+ function isParseIntRadix(fullNumberNode) {
230
+ const parent = fullNumberNode.parent;
231
+
232
+ return (
233
+ parent.type === "CallExpression" &&
234
+ fullNumberNode === parent.arguments[1] &&
235
+ (astUtils.isSpecificId(parent.callee, "parseInt") ||
236
+ astUtils.isSpecificMemberAccess(
237
+ parent.callee,
238
+ "Number",
239
+ "parseInt",
240
+ ))
241
+ );
242
+ }
243
+
244
+ /**
245
+ * Returns whether the given node is a direct child of a JSX node.
246
+ * In particular, it aims to detect numbers used as prop values in JSX tags.
247
+ * Example: <input maxLength={10} />
248
+ * @param {ASTNode} fullNumberNode `Literal` or `UnaryExpression` full number node
249
+ * @returns {boolean} true if the node is a JSX number
250
+ */
251
+ function isJSXNumber(fullNumberNode) {
252
+ return fullNumberNode.parent.type.indexOf("JSX") === 0;
253
+ }
254
+
255
+ /**
256
+ * Returns whether the given node is used as an array index.
257
+ * Value must coerce to a valid array index name: "0", "1", "2" ... "4294967294".
258
+ *
259
+ * All other values, like "-1", "2.5", or "4294967295", are just "normal" object properties,
260
+ * which can be created and accessed on an array in addition to the array index properties,
261
+ * but they don't affect array's length and are not considered by methods such as .map(), .forEach() etc.
262
+ *
263
+ * The maximum array length by the specification is 2 ** 32 - 1 = 4294967295,
264
+ * thus the maximum valid index is 2 ** 32 - 2 = 4294967294.
265
+ *
266
+ * All notations are allowed, as long as the value coerces to one of "0", "1", "2" ... "4294967294".
267
+ *
268
+ * Valid examples:
269
+ * a[0], a[1], a[1.2e1], a[0xAB], a[0n], a[1n]
270
+ * a[-0] (same as a[0] because -0 coerces to "0")
271
+ * a[-0n] (-0n evaluates to 0n)
272
+ *
273
+ * Invalid examples:
274
+ * a[-1], a[-0xAB], a[-1n], a[2.5], a[1.23e1], a[12e-1]
275
+ * a[4294967295] (above the max index, it's an access to a regular property a["4294967295"])
276
+ * a[999999999999999999999] (even if it wasn't above the max index, it would be a["1e+21"])
277
+ * a[1e310] (same as a["Infinity"])
278
+ * @param {ASTNode} fullNumberNode `Literal` or `UnaryExpression` full number node
279
+ * @param {bigint|number} value Value expressed by the fullNumberNode
280
+ * @returns {boolean} true if the node is a valid array index
281
+ */
282
+ function isArrayIndex(fullNumberNode, value) {
283
+ const parent = fullNumberNode.parent;
284
+
285
+ return (
286
+ parent.type === "MemberExpression" &&
287
+ parent.property === fullNumberNode &&
288
+ (Number.isInteger(value) || typeof value === "bigint") &&
289
+ value >= 0 &&
290
+ value < MAX_ARRAY_LENGTH
291
+ );
292
+ }
293
+
294
+ return {
295
+ Literal(node) {
296
+ if (!astUtils.isNumericLiteral(node)) {
297
+ return;
298
+ }
299
+
300
+ let fullNumberNode;
301
+ let value;
302
+ let raw;
303
+
304
+ // Treat unary minus/plus as a part of the number
305
+ if (
306
+ node.parent.type === "UnaryExpression" &&
307
+ ["-", "+"].includes(node.parent.operator)
308
+ ) {
309
+ fullNumberNode = node.parent;
310
+ value =
311
+ node.parent.operator === "-" ? -node.value : node.value;
312
+ raw = `${node.parent.operator}${node.raw}`;
313
+ } else {
314
+ fullNumberNode = node;
315
+ value = node.value;
316
+ raw = node.raw;
317
+ }
318
+
319
+ const parent = fullNumberNode.parent;
320
+
321
+ // Always allow radix arguments and JSX props
322
+ if (
323
+ isIgnoredValue(value) ||
324
+ (ignoreDefaultValues && isDefaultValue(fullNumberNode)) ||
325
+ (ignoreClassFieldInitialValues &&
326
+ isClassFieldInitialValue(fullNumberNode)) ||
327
+ (ignoreEnums &&
328
+ isParentTSEnumDeclaration(fullNumberNode)) ||
329
+ (ignoreNumericLiteralTypes &&
330
+ isTSNumericLiteralType(fullNumberNode)) ||
331
+ (ignoreTypeIndexes &&
332
+ isAncestorTSIndexedAccessType(fullNumberNode)) ||
333
+ (ignoreReadonlyClassProperties &&
334
+ isParentTSReadonlyPropertyDefinition(fullNumberNode)) ||
335
+ isParseIntRadix(fullNumberNode) ||
336
+ isJSXNumber(fullNumberNode) ||
337
+ (ignoreArrayIndexes && isArrayIndex(fullNumberNode, value))
338
+ ) {
339
+ return;
340
+ }
341
+
342
+ if (parent.type === "VariableDeclarator") {
343
+ if (enforceConst && parent.parent.kind !== "const") {
344
+ context.report({
345
+ node: fullNumberNode,
346
+ messageId: "useConst",
347
+ });
348
+ }
349
+ } else if (
350
+ !okTypes.includes(parent.type) ||
351
+ (parent.type === "AssignmentExpression" &&
352
+ parent.left.type === "Identifier")
353
+ ) {
354
+ context.report({
355
+ node: fullNumberNode,
356
+ messageId: "noMagic",
357
+ data: {
358
+ raw,
359
+ },
360
+ });
361
+ }
362
+ },
363
+ };
364
+ },
365
+ };