eslint 8.57.1 → 9.39.1

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 (458) hide show
  1. package/README.md +165 -115
  2. package/bin/eslint.js +112 -89
  3. package/conf/default-cli-options.js +22 -22
  4. package/conf/ecma-version.js +16 -0
  5. package/conf/globals.js +109 -94
  6. package/conf/replacements.json +24 -20
  7. package/conf/rule-type-list.json +89 -26
  8. package/lib/api.js +16 -20
  9. package/lib/cli-engine/cli-engine.js +841 -810
  10. package/lib/cli-engine/file-enumerator.js +384 -390
  11. package/lib/cli-engine/formatters/formatters-meta.json +17 -45
  12. package/lib/cli-engine/formatters/html.js +110 -102
  13. package/lib/cli-engine/formatters/json-with-metadata.js +5 -5
  14. package/lib/cli-engine/formatters/json.js +2 -2
  15. package/lib/cli-engine/formatters/stylish.js +97 -76
  16. package/lib/cli-engine/hash.js +1 -1
  17. package/lib/cli-engine/index.js +1 -1
  18. package/lib/cli-engine/lint-result-cache.js +165 -148
  19. package/lib/cli-engine/load-rules.js +17 -17
  20. package/lib/cli.js +481 -399
  21. package/lib/config/config-loader.js +816 -0
  22. package/lib/config/config.js +674 -0
  23. package/lib/config/default-config.js +57 -46
  24. package/lib/config/flat-config-array.js +170 -333
  25. package/lib/config/flat-config-schema.js +389 -389
  26. package/lib/config-api.js +12 -0
  27. package/lib/eslint/eslint-helpers.js +1196 -663
  28. package/lib/eslint/eslint.js +1262 -607
  29. package/lib/eslint/index.js +3 -3
  30. package/lib/eslint/legacy-eslint.js +786 -0
  31. package/lib/eslint/worker.js +173 -0
  32. package/lib/languages/js/index.js +336 -0
  33. package/lib/languages/js/source-code/index.js +7 -0
  34. package/lib/languages/js/source-code/source-code.js +1364 -0
  35. package/lib/languages/js/source-code/token-store/backward-token-comment-cursor.js +61 -0
  36. package/lib/languages/js/source-code/token-store/backward-token-cursor.js +57 -0
  37. package/lib/{source-code → languages/js/source-code}/token-store/cursor.js +36 -36
  38. package/lib/languages/js/source-code/token-store/cursors.js +120 -0
  39. package/lib/{source-code → languages/js/source-code}/token-store/decorative-cursor.js +17 -18
  40. package/lib/{source-code → languages/js/source-code}/token-store/filter-cursor.js +19 -20
  41. package/lib/languages/js/source-code/token-store/forward-token-comment-cursor.js +65 -0
  42. package/lib/languages/js/source-code/token-store/forward-token-cursor.js +62 -0
  43. package/lib/languages/js/source-code/token-store/index.js +721 -0
  44. package/lib/{source-code → languages/js/source-code}/token-store/limit-cursor.js +17 -18
  45. package/lib/languages/js/source-code/token-store/padded-token-cursor.js +45 -0
  46. package/lib/{source-code → languages/js/source-code}/token-store/skip-cursor.js +19 -20
  47. package/lib/languages/js/source-code/token-store/utils.js +110 -0
  48. package/lib/languages/js/validate-language-options.js +196 -0
  49. package/lib/linter/apply-disable-directives.js +490 -371
  50. package/lib/linter/code-path-analysis/code-path-analyzer.js +650 -674
  51. package/lib/linter/code-path-analysis/code-path-segment.js +215 -216
  52. package/lib/linter/code-path-analysis/code-path-state.js +2118 -2096
  53. package/lib/linter/code-path-analysis/code-path.js +307 -317
  54. package/lib/linter/code-path-analysis/debug-helpers.js +183 -163
  55. package/lib/linter/code-path-analysis/fork-context.js +297 -272
  56. package/lib/linter/code-path-analysis/id-generator.js +22 -23
  57. package/lib/linter/esquery.js +332 -0
  58. package/lib/linter/file-context.js +144 -0
  59. package/lib/linter/file-report.js +608 -0
  60. package/lib/linter/index.js +3 -5
  61. package/lib/linter/interpolate.js +38 -16
  62. package/lib/linter/linter.js +2328 -1785
  63. package/lib/linter/rule-fixer.js +136 -107
  64. package/lib/linter/rules.js +37 -46
  65. package/lib/linter/source-code-fixer.js +96 -94
  66. package/lib/linter/source-code-traverser.js +333 -0
  67. package/lib/linter/source-code-visitor.js +81 -0
  68. package/lib/linter/timing.js +145 -97
  69. package/lib/linter/vfile.js +115 -0
  70. package/lib/options.js +464 -326
  71. package/lib/rule-tester/index.js +3 -1
  72. package/lib/rule-tester/rule-tester.js +1371 -998
  73. package/lib/rules/accessor-pairs.js +333 -259
  74. package/lib/rules/array-bracket-newline.js +250 -220
  75. package/lib/rules/array-bracket-spacing.js +286 -229
  76. package/lib/rules/array-callback-return.js +401 -354
  77. package/lib/rules/array-element-newline.js +358 -295
  78. package/lib/rules/arrow-body-style.js +400 -278
  79. package/lib/rules/arrow-parens.js +206 -155
  80. package/lib/rules/arrow-spacing.js +169 -145
  81. package/lib/rules/block-scoped-var.js +125 -123
  82. package/lib/rules/block-spacing.js +186 -158
  83. package/lib/rules/brace-style.js +262 -181
  84. package/lib/rules/callback-return.js +203 -174
  85. package/lib/rules/camelcase.js +403 -380
  86. package/lib/rules/capitalized-comments.js +253 -228
  87. package/lib/rules/class-methods-use-this.js +231 -168
  88. package/lib/rules/comma-dangle.js +379 -328
  89. package/lib/rules/comma-spacing.js +193 -177
  90. package/lib/rules/comma-style.js +375 -298
  91. package/lib/rules/complexity.js +180 -144
  92. package/lib/rules/computed-property-spacing.js +236 -193
  93. package/lib/rules/consistent-return.js +181 -170
  94. package/lib/rules/consistent-this.js +167 -141
  95. package/lib/rules/constructor-super.js +418 -411
  96. package/lib/rules/curly.js +407 -468
  97. package/lib/rules/default-case-last.js +39 -32
  98. package/lib/rules/default-case.js +89 -83
  99. package/lib/rules/default-param-last.js +69 -53
  100. package/lib/rules/dot-location.js +122 -92
  101. package/lib/rules/dot-notation.js +193 -153
  102. package/lib/rules/eol-last.js +122 -102
  103. package/lib/rules/eqeqeq.js +191 -155
  104. package/lib/rules/for-direction.js +150 -122
  105. package/lib/rules/func-call-spacing.js +261 -213
  106. package/lib/rules/func-name-matching.js +294 -209
  107. package/lib/rules/func-names.js +165 -164
  108. package/lib/rules/func-style.js +209 -86
  109. package/lib/rules/function-call-argument-newline.js +152 -111
  110. package/lib/rules/function-paren-newline.js +349 -273
  111. package/lib/rules/generator-star-spacing.js +229 -192
  112. package/lib/rules/getter-return.js +208 -170
  113. package/lib/rules/global-require.js +85 -58
  114. package/lib/rules/grouped-accessor-pairs.js +201 -148
  115. package/lib/rules/guard-for-in.js +72 -63
  116. package/lib/rules/handle-callback-err.js +108 -87
  117. package/lib/rules/id-blacklist.js +182 -187
  118. package/lib/rules/id-denylist.js +174 -179
  119. package/lib/rules/id-length.js +197 -157
  120. package/lib/rules/id-match.js +350 -286
  121. package/lib/rules/implicit-arrow-linebreak.js +102 -61
  122. package/lib/rules/indent-legacy.js +1345 -1102
  123. package/lib/rules/indent.js +2272 -1741
  124. package/lib/rules/index.js +320 -294
  125. package/lib/rules/init-declarations.js +139 -106
  126. package/lib/rules/jsx-quotes.js +94 -64
  127. package/lib/rules/key-spacing.js +750 -615
  128. package/lib/rules/keyword-spacing.js +648 -587
  129. package/lib/rules/line-comment-position.js +143 -108
  130. package/lib/rules/linebreak-style.js +115 -88
  131. package/lib/rules/lines-around-comment.js +540 -430
  132. package/lib/rules/lines-around-directive.js +233 -185
  133. package/lib/rules/lines-between-class-members.js +305 -216
  134. package/lib/rules/logical-assignment-operators.js +582 -398
  135. package/lib/rules/max-classes-per-file.js +69 -68
  136. package/lib/rules/max-depth.js +146 -143
  137. package/lib/rules/max-len.js +473 -416
  138. package/lib/rules/max-lines-per-function.js +201 -176
  139. package/lib/rules/max-lines.js +158 -162
  140. package/lib/rules/max-nested-callbacks.js +102 -104
  141. package/lib/rules/max-params.js +102 -75
  142. package/lib/rules/max-statements-per-line.js +205 -180
  143. package/lib/rules/max-statements.js +168 -164
  144. package/lib/rules/multiline-comment-style.js +638 -460
  145. package/lib/rules/multiline-ternary.js +241 -158
  146. package/lib/rules/new-cap.js +233 -232
  147. package/lib/rules/new-parens.js +88 -61
  148. package/lib/rules/newline-after-var.js +287 -233
  149. package/lib/rules/newline-before-return.js +229 -204
  150. package/lib/rules/newline-per-chained-call.js +142 -109
  151. package/lib/rules/no-alert.js +90 -79
  152. package/lib/rules/no-array-constructor.js +175 -113
  153. package/lib/rules/no-async-promise-executor.js +30 -24
  154. package/lib/rules/no-await-in-loop.js +79 -70
  155. package/lib/rules/no-bitwise.js +113 -87
  156. package/lib/rules/no-buffer-constructor.js +61 -37
  157. package/lib/rules/no-caller.js +39 -33
  158. package/lib/rules/no-case-declarations.js +61 -45
  159. package/lib/rules/no-catch-shadow.js +76 -62
  160. package/lib/rules/no-class-assign.js +51 -48
  161. package/lib/rules/no-compare-neg-zero.js +62 -48
  162. package/lib/rules/no-cond-assign.js +148 -132
  163. package/lib/rules/no-confusing-arrow.js +98 -63
  164. package/lib/rules/no-console.js +202 -188
  165. package/lib/rules/no-const-assign.js +58 -41
  166. package/lib/rules/no-constant-binary-expression.js +501 -407
  167. package/lib/rules/no-constant-condition.js +158 -131
  168. package/lib/rules/no-constructor-return.js +49 -49
  169. package/lib/rules/no-continue.js +25 -26
  170. package/lib/rules/no-control-regex.js +125 -121
  171. package/lib/rules/no-debugger.js +28 -30
  172. package/lib/rules/no-delete-var.js +29 -29
  173. package/lib/rules/no-div-regex.js +47 -40
  174. package/lib/rules/no-dupe-args.js +79 -69
  175. package/lib/rules/no-dupe-class-members.js +102 -89
  176. package/lib/rules/no-dupe-else-if.js +100 -77
  177. package/lib/rules/no-dupe-keys.js +133 -110
  178. package/lib/rules/no-duplicate-case.js +50 -43
  179. package/lib/rules/no-duplicate-imports.js +266 -188
  180. package/lib/rules/no-else-return.js +430 -385
  181. package/lib/rules/no-empty-character-class.js +57 -50
  182. package/lib/rules/no-empty-function.js +197 -128
  183. package/lib/rules/no-empty-pattern.js +63 -56
  184. package/lib/rules/no-empty-static-block.js +61 -35
  185. package/lib/rules/no-empty.js +135 -85
  186. package/lib/rules/no-eq-null.js +37 -32
  187. package/lib/rules/no-eval.js +258 -249
  188. package/lib/rules/no-ex-assign.js +42 -39
  189. package/lib/rules/no-extend-native.js +161 -160
  190. package/lib/rules/no-extra-bind.js +201 -190
  191. package/lib/rules/no-extra-boolean-cast.js +398 -295
  192. package/lib/rules/no-extra-label.js +150 -130
  193. package/lib/rules/no-extra-parens.js +1654 -1307
  194. package/lib/rules/no-extra-semi.js +146 -126
  195. package/lib/rules/no-fallthrough.js +200 -136
  196. package/lib/rules/no-floating-decimal.js +74 -48
  197. package/lib/rules/no-func-assign.js +54 -55
  198. package/lib/rules/no-global-assign.js +78 -72
  199. package/lib/rules/no-implicit-coercion.js +350 -262
  200. package/lib/rules/no-implicit-globals.js +174 -133
  201. package/lib/rules/no-implied-eval.js +150 -112
  202. package/lib/rules/no-import-assign.js +145 -159
  203. package/lib/rules/no-inline-comments.js +101 -96
  204. package/lib/rules/no-inner-declarations.js +115 -78
  205. package/lib/rules/no-invalid-regexp.js +223 -174
  206. package/lib/rules/no-invalid-this.js +145 -117
  207. package/lib/rules/no-irregular-whitespace.js +266 -250
  208. package/lib/rules/no-iterator.js +29 -33
  209. package/lib/rules/no-label-var.js +59 -61
  210. package/lib/rules/no-labels.js +138 -131
  211. package/lib/rules/no-lone-blocks.js +127 -123
  212. package/lib/rules/no-lonely-if.js +105 -67
  213. package/lib/rules/no-loop-func.js +245 -184
  214. package/lib/rules/no-loss-of-precision.js +236 -201
  215. package/lib/rules/no-magic-numbers.js +339 -217
  216. package/lib/rules/no-misleading-character-class.js +548 -253
  217. package/lib/rules/no-mixed-operators.js +188 -164
  218. package/lib/rules/no-mixed-requires.js +253 -224
  219. package/lib/rules/no-mixed-spaces-and-tabs.js +135 -103
  220. package/lib/rules/no-multi-assign.js +46 -47
  221. package/lib/rules/no-multi-spaces.js +163 -125
  222. package/lib/rules/no-multi-str.js +42 -40
  223. package/lib/rules/no-multiple-empty-lines.js +196 -140
  224. package/lib/rules/no-native-reassign.js +90 -74
  225. package/lib/rules/no-negated-condition.js +79 -74
  226. package/lib/rules/no-negated-in-lhs.js +45 -32
  227. package/lib/rules/no-nested-ternary.js +33 -31
  228. package/lib/rules/no-new-func.js +71 -62
  229. package/lib/rules/no-new-native-nonconstructor.js +43 -39
  230. package/lib/rules/no-new-object.js +48 -39
  231. package/lib/rules/no-new-require.js +48 -31
  232. package/lib/rules/no-new-symbol.js +61 -43
  233. package/lib/rules/no-new-wrappers.js +43 -41
  234. package/lib/rules/no-new.js +28 -29
  235. package/lib/rules/no-nonoctal-decimal-escape.js +149 -121
  236. package/lib/rules/no-obj-calls.js +66 -53
  237. package/lib/rules/no-object-constructor.js +104 -97
  238. package/lib/rules/no-octal-escape.js +40 -43
  239. package/lib/rules/no-octal.js +29 -32
  240. package/lib/rules/no-param-reassign.js +236 -218
  241. package/lib/rules/no-path-concat.js +66 -51
  242. package/lib/rules/no-plusplus.js +60 -63
  243. package/lib/rules/no-process-env.js +49 -32
  244. package/lib/rules/no-process-exit.js +48 -28
  245. package/lib/rules/no-promise-executor-return.js +205 -204
  246. package/lib/rules/no-proto.js +26 -29
  247. package/lib/rules/no-prototype-builtins.js +146 -124
  248. package/lib/rules/no-redeclare.js +154 -155
  249. package/lib/rules/no-regex-spaces.js +183 -161
  250. package/lib/rules/no-restricted-exports.js +208 -174
  251. package/lib/rules/no-restricted-globals.js +254 -112
  252. package/lib/rules/no-restricted-imports.js +824 -384
  253. package/lib/rules/no-restricted-modules.js +222 -186
  254. package/lib/rules/no-restricted-properties.js +218 -153
  255. package/lib/rules/no-restricted-syntax.js +56 -52
  256. package/lib/rules/no-return-assign.js +56 -49
  257. package/lib/rules/no-return-await.js +147 -120
  258. package/lib/rules/no-script-url.js +53 -46
  259. package/lib/rules/no-self-assign.js +148 -145
  260. package/lib/rules/no-self-compare.js +63 -46
  261. package/lib/rules/no-sequences.js +135 -115
  262. package/lib/rules/no-setter-return.js +176 -178
  263. package/lib/rules/no-shadow-restricted-names.js +84 -36
  264. package/lib/rules/no-shadow.js +598 -310
  265. package/lib/rules/no-spaced-func.js +82 -60
  266. package/lib/rules/no-sparse-arrays.js +46 -28
  267. package/lib/rules/no-sync.js +61 -44
  268. package/lib/rules/no-tabs.js +83 -54
  269. package/lib/rules/no-template-curly-in-string.js +33 -32
  270. package/lib/rules/no-ternary.js +25 -28
  271. package/lib/rules/no-this-before-super.js +332 -298
  272. package/lib/rules/no-throw-literal.js +31 -36
  273. package/lib/rules/no-trailing-spaces.js +208 -174
  274. package/lib/rules/no-unassigned-vars.js +80 -0
  275. package/lib/rules/no-undef-init.js +86 -60
  276. package/lib/rules/no-undef.js +52 -47
  277. package/lib/rules/no-undefined.js +73 -74
  278. package/lib/rules/no-underscore-dangle.js +370 -322
  279. package/lib/rules/no-unexpected-multiline.js +112 -102
  280. package/lib/rules/no-unmodified-loop-condition.js +254 -254
  281. package/lib/rules/no-unneeded-ternary.js +212 -146
  282. package/lib/rules/no-unreachable-loop.js +145 -140
  283. package/lib/rules/no-unreachable.js +255 -248
  284. package/lib/rules/no-unsafe-finally.js +93 -85
  285. package/lib/rules/no-unsafe-negation.js +105 -81
  286. package/lib/rules/no-unsafe-optional-chaining.js +193 -177
  287. package/lib/rules/no-unused-expressions.js +199 -158
  288. package/lib/rules/no-unused-labels.js +139 -124
  289. package/lib/rules/no-unused-private-class-members.js +206 -182
  290. package/lib/rules/no-unused-vars.js +1708 -687
  291. package/lib/rules/no-use-before-define.js +327 -229
  292. package/lib/rules/no-useless-assignment.js +654 -0
  293. package/lib/rules/no-useless-backreference.js +212 -143
  294. package/lib/rules/no-useless-call.js +58 -53
  295. package/lib/rules/no-useless-catch.js +40 -40
  296. package/lib/rules/no-useless-computed-key.js +144 -108
  297. package/lib/rules/no-useless-concat.js +65 -59
  298. package/lib/rules/no-useless-constructor.js +160 -97
  299. package/lib/rules/no-useless-escape.js +364 -291
  300. package/lib/rules/no-useless-rename.js +183 -153
  301. package/lib/rules/no-useless-return.js +344 -307
  302. package/lib/rules/no-var.js +245 -212
  303. package/lib/rules/no-void.js +51 -46
  304. package/lib/rules/no-warning-comments.js +191 -183
  305. package/lib/rules/no-whitespace-before-property.js +131 -97
  306. package/lib/rules/no-with.js +24 -26
  307. package/lib/rules/nonblock-statement-body-position.js +149 -112
  308. package/lib/rules/object-curly-newline.js +306 -247
  309. package/lib/rules/object-curly-spacing.js +360 -296
  310. package/lib/rules/object-property-newline.js +137 -88
  311. package/lib/rules/object-shorthand.js +632 -500
  312. package/lib/rules/one-var-declaration-per-line.js +104 -82
  313. package/lib/rules/one-var.js +686 -536
  314. package/lib/rules/operator-assignment.js +219 -158
  315. package/lib/rules/operator-linebreak.js +295 -233
  316. package/lib/rules/padded-blocks.js +346 -290
  317. package/lib/rules/padding-line-between-statements.js +443 -421
  318. package/lib/rules/prefer-arrow-callback.js +371 -315
  319. package/lib/rules/prefer-const.js +418 -373
  320. package/lib/rules/prefer-destructuring.js +309 -278
  321. package/lib/rules/prefer-exponentiation-operator.js +176 -132
  322. package/lib/rules/prefer-named-capture-group.js +160 -141
  323. package/lib/rules/prefer-numeric-literals.js +121 -112
  324. package/lib/rules/prefer-object-has-own.js +116 -82
  325. package/lib/rules/prefer-object-spread.js +214 -193
  326. package/lib/rules/prefer-promise-reject-errors.js +140 -118
  327. package/lib/rules/prefer-reflect.js +126 -103
  328. package/lib/rules/prefer-regex-literals.js +561 -463
  329. package/lib/rules/prefer-rest-params.js +79 -80
  330. package/lib/rules/prefer-spread.js +47 -43
  331. package/lib/rules/prefer-template.js +266 -194
  332. package/lib/rules/preserve-caught-error.js +535 -0
  333. package/lib/rules/quote-props.js +373 -289
  334. package/lib/rules/quotes.js +374 -308
  335. package/lib/rules/radix.js +152 -134
  336. package/lib/rules/require-atomic-updates.js +316 -282
  337. package/lib/rules/require-await.js +153 -82
  338. package/lib/rules/require-unicode-regexp.js +296 -108
  339. package/lib/rules/require-yield.js +53 -54
  340. package/lib/rules/rest-spread-spacing.js +128 -98
  341. package/lib/rules/semi-spacing.js +281 -232
  342. package/lib/rules/semi-style.js +176 -116
  343. package/lib/rules/semi.js +456 -418
  344. package/lib/rules/sort-imports.js +307 -229
  345. package/lib/rules/sort-keys.js +219 -181
  346. package/lib/rules/sort-vars.js +127 -91
  347. package/lib/rules/space-before-blocks.js +199 -171
  348. package/lib/rules/space-before-function-paren.js +186 -148
  349. package/lib/rules/space-in-parens.js +359 -270
  350. package/lib/rules/space-infix-ops.js +237 -183
  351. package/lib/rules/space-unary-ops.js +356 -280
  352. package/lib/rules/spaced-comment.js +363 -301
  353. package/lib/rules/strict.js +266 -229
  354. package/lib/rules/switch-colon-spacing.js +130 -104
  355. package/lib/rules/symbol-description.js +45 -48
  356. package/lib/rules/template-curly-spacing.js +148 -124
  357. package/lib/rules/template-tag-spacing.js +98 -70
  358. package/lib/rules/unicode-bom.js +54 -54
  359. package/lib/rules/use-isnan.js +237 -110
  360. package/lib/rules/utils/ast-utils.js +2139 -1688
  361. package/lib/rules/utils/char-source.js +247 -0
  362. package/lib/rules/utils/fix-tracker.js +99 -88
  363. package/lib/rules/utils/keywords.js +59 -59
  364. package/lib/rules/utils/lazy-loading-rule-map.js +81 -78
  365. package/lib/rules/utils/regular-expressions.js +35 -19
  366. package/lib/rules/utils/unicode/index.js +9 -4
  367. package/lib/rules/utils/unicode/is-combining-character.js +1 -1
  368. package/lib/rules/utils/unicode/is-emoji-modifier.js +1 -1
  369. package/lib/rules/utils/unicode/is-regional-indicator-symbol.js +1 -1
  370. package/lib/rules/utils/unicode/is-surrogate-pair.js +1 -1
  371. package/lib/rules/valid-typeof.js +153 -109
  372. package/lib/rules/vars-on-top.js +152 -144
  373. package/lib/rules/wrap-iife.js +204 -173
  374. package/lib/rules/wrap-regex.js +77 -47
  375. package/lib/rules/yield-star-spacing.js +145 -116
  376. package/lib/rules/yoda.js +283 -274
  377. package/lib/services/parser-service.js +65 -0
  378. package/lib/services/processor-service.js +101 -0
  379. package/lib/services/suppressions-service.js +302 -0
  380. package/lib/services/warning-service.js +98 -0
  381. package/lib/shared/ajv.js +14 -14
  382. package/lib/shared/assert.js +21 -0
  383. package/lib/shared/ast-utils.js +7 -6
  384. package/lib/shared/deep-merge-arrays.js +62 -0
  385. package/lib/shared/directives.js +3 -2
  386. package/lib/shared/flags.js +108 -0
  387. package/lib/shared/logging.js +24 -16
  388. package/lib/shared/naming.js +109 -0
  389. package/lib/shared/option-utils.js +63 -0
  390. package/lib/shared/relative-module-resolver.js +18 -40
  391. package/lib/shared/runtime-info.js +138 -128
  392. package/lib/shared/serialization.js +78 -0
  393. package/lib/shared/severity.js +22 -22
  394. package/lib/shared/stats.js +30 -0
  395. package/lib/shared/string-utils.js +19 -21
  396. package/lib/shared/text-table.js +68 -0
  397. package/lib/shared/translate-cli-options.js +281 -0
  398. package/lib/shared/traverser.js +153 -146
  399. package/lib/types/config-api.d.ts +12 -0
  400. package/lib/types/index.d.ts +1473 -0
  401. package/lib/types/rules.d.ts +5589 -0
  402. package/lib/types/universal.d.ts +6 -0
  403. package/lib/types/use-at-your-own-risk.d.ts +87 -0
  404. package/lib/universal.js +10 -0
  405. package/lib/unsupported-api.js +8 -9
  406. package/messages/all-files-ignored.js +3 -3
  407. package/messages/all-matched-files-ignored.js +21 -0
  408. package/messages/config-file-missing.js +16 -0
  409. package/messages/config-plugin-missing.js +14 -0
  410. package/messages/config-serialize-function.js +30 -0
  411. package/messages/eslintrc-incompat.js +35 -16
  412. package/messages/eslintrc-plugins.js +8 -5
  413. package/messages/extend-config-missing.js +3 -3
  414. package/messages/failed-to-read-json.js +3 -3
  415. package/messages/file-not-found.js +3 -3
  416. package/messages/invalid-rule-options.js +2 -2
  417. package/messages/invalid-rule-severity.js +2 -2
  418. package/messages/no-config-found.js +4 -4
  419. package/messages/plugin-conflict.js +9 -9
  420. package/messages/plugin-invalid.js +4 -4
  421. package/messages/plugin-missing.js +4 -4
  422. package/messages/print-config-with-directory-path.js +2 -2
  423. package/messages/shared.js +6 -1
  424. package/messages/whitespace-found.js +3 -3
  425. package/package.json +105 -60
  426. package/conf/config-schema.js +0 -93
  427. package/lib/cli-engine/formatters/checkstyle.js +0 -60
  428. package/lib/cli-engine/formatters/compact.js +0 -60
  429. package/lib/cli-engine/formatters/jslint-xml.js +0 -41
  430. package/lib/cli-engine/formatters/junit.js +0 -82
  431. package/lib/cli-engine/formatters/tap.js +0 -95
  432. package/lib/cli-engine/formatters/unix.js +0 -58
  433. package/lib/cli-engine/formatters/visualstudio.js +0 -63
  434. package/lib/cli-engine/xml-escape.js +0 -34
  435. package/lib/config/flat-config-helpers.js +0 -111
  436. package/lib/config/rule-validator.js +0 -158
  437. package/lib/eslint/flat-eslint.js +0 -1159
  438. package/lib/linter/config-comment-parser.js +0 -185
  439. package/lib/linter/node-event-generator.js +0 -354
  440. package/lib/linter/report-translator.js +0 -369
  441. package/lib/linter/safe-emitter.js +0 -52
  442. package/lib/rule-tester/flat-rule-tester.js +0 -1131
  443. package/lib/rules/require-jsdoc.js +0 -122
  444. package/lib/rules/utils/patterns/letters.js +0 -36
  445. package/lib/rules/valid-jsdoc.js +0 -516
  446. package/lib/shared/config-validator.js +0 -347
  447. package/lib/shared/deprecation-warnings.js +0 -58
  448. package/lib/shared/types.js +0 -216
  449. package/lib/source-code/index.js +0 -5
  450. package/lib/source-code/source-code.js +0 -1055
  451. package/lib/source-code/token-store/backward-token-comment-cursor.js +0 -57
  452. package/lib/source-code/token-store/backward-token-cursor.js +0 -58
  453. package/lib/source-code/token-store/cursors.js +0 -90
  454. package/lib/source-code/token-store/forward-token-comment-cursor.js +0 -57
  455. package/lib/source-code/token-store/forward-token-cursor.js +0 -63
  456. package/lib/source-code/token-store/index.js +0 -627
  457. package/lib/source-code/token-store/padded-token-cursor.js +0 -38
  458. package/lib/source-code/token-store/utils.js +0 -107
@@ -20,323 +20,313 @@ const IdGenerator = require("./id-generator");
20
20
  * A code path.
21
21
  */
22
22
  class CodePath {
23
-
24
- /**
25
- * Creates a new instance.
26
- * @param {Object} options Options for the function (see below).
27
- * @param {string} options.id An identifier.
28
- * @param {string} options.origin The type of code path origin.
29
- * @param {CodePath|null} options.upper The code path of the upper function scope.
30
- * @param {Function} options.onLooped A callback function to notify looping.
31
- */
32
- constructor({ id, origin, upper, onLooped }) {
33
-
34
- /**
35
- * The identifier of this code path.
36
- * Rules use it to store additional information of each rule.
37
- * @type {string}
38
- */
39
- this.id = id;
40
-
41
- /**
42
- * The reason that this code path was started. May be "program",
43
- * "function", "class-field-initializer", or "class-static-block".
44
- * @type {string}
45
- */
46
- this.origin = origin;
47
-
48
- /**
49
- * The code path of the upper function scope.
50
- * @type {CodePath|null}
51
- */
52
- this.upper = upper;
53
-
54
- /**
55
- * The code paths of nested function scopes.
56
- * @type {CodePath[]}
57
- */
58
- this.childCodePaths = [];
59
-
60
- // Initializes internal state.
61
- Object.defineProperty(
62
- this,
63
- "internal",
64
- { value: new CodePathState(new IdGenerator(`${id}_`), onLooped) }
65
- );
66
-
67
- // Adds this into `childCodePaths` of `upper`.
68
- if (upper) {
69
- upper.childCodePaths.push(this);
70
- }
71
- }
72
-
73
- /**
74
- * Gets the state of a given code path.
75
- * @param {CodePath} codePath A code path to get.
76
- * @returns {CodePathState} The state of the code path.
77
- */
78
- static getState(codePath) {
79
- return codePath.internal;
80
- }
81
-
82
- /**
83
- * The initial code path segment. This is the segment that is at the head
84
- * of the code path.
85
- * This is a passthrough to the underlying `CodePathState`.
86
- * @type {CodePathSegment}
87
- */
88
- get initialSegment() {
89
- return this.internal.initialSegment;
90
- }
91
-
92
- /**
93
- * Final code path segments. These are the terminal (tail) segments in the
94
- * code path, which is the combination of `returnedSegments` and `thrownSegments`.
95
- * All segments in this array are reachable.
96
- * This is a passthrough to the underlying `CodePathState`.
97
- * @type {CodePathSegment[]}
98
- */
99
- get finalSegments() {
100
- return this.internal.finalSegments;
101
- }
102
-
103
- /**
104
- * Final code path segments that represent normal completion of the code path.
105
- * For functions, this means both explicit `return` statements and implicit returns,
106
- * such as the last reachable segment in a function that does not have an
107
- * explicit `return` as this implicitly returns `undefined`. For scripts,
108
- * modules, class field initializers, and class static blocks, this means
109
- * all lines of code have been executed.
110
- * These segments are also present in `finalSegments`.
111
- * This is a passthrough to the underlying `CodePathState`.
112
- * @type {CodePathSegment[]}
113
- */
114
- get returnedSegments() {
115
- return this.internal.returnedForkContext;
116
- }
117
-
118
- /**
119
- * Final code path segments that represent `throw` statements.
120
- * This is a passthrough to the underlying `CodePathState`.
121
- * These segments are also present in `finalSegments`.
122
- * @type {CodePathSegment[]}
123
- */
124
- get thrownSegments() {
125
- return this.internal.thrownForkContext;
126
- }
127
-
128
- /**
129
- * Tracks the traversal of the code path through each segment. This array
130
- * starts empty and segments are added or removed as the code path is
131
- * traversed. This array always ends up empty at the end of a code path
132
- * traversal. The `CodePathState` uses this to track its progress through
133
- * the code path.
134
- * This is a passthrough to the underlying `CodePathState`.
135
- * @type {CodePathSegment[]}
136
- * @deprecated
137
- */
138
- get currentSegments() {
139
- return this.internal.currentSegments;
140
- }
141
-
142
- /**
143
- * Traverses all segments in this code path.
144
- *
145
- * codePath.traverseSegments((segment, controller) => {
146
- * // do something.
147
- * });
148
- *
149
- * This method enumerates segments in order from the head.
150
- *
151
- * The `controller` argument has two methods:
152
- *
153
- * - `skip()` - skips the following segments in this branch
154
- * - `break()` - skips all following segments in the traversal
155
- *
156
- * A note on the parameters: the `options` argument is optional. This means
157
- * the first argument might be an options object or the callback function.
158
- * @param {Object} [optionsOrCallback] Optional first and last segments to traverse.
159
- * @param {CodePathSegment} [optionsOrCallback.first] The first segment to traverse.
160
- * @param {CodePathSegment} [optionsOrCallback.last] The last segment to traverse.
161
- * @param {Function} callback A callback function.
162
- * @returns {void}
163
- */
164
- traverseSegments(optionsOrCallback, callback) {
165
-
166
- // normalize the arguments into a callback and options
167
- let resolvedOptions;
168
- let resolvedCallback;
169
-
170
- if (typeof optionsOrCallback === "function") {
171
- resolvedCallback = optionsOrCallback;
172
- resolvedOptions = {};
173
- } else {
174
- resolvedOptions = optionsOrCallback || {};
175
- resolvedCallback = callback;
176
- }
177
-
178
- // determine where to start traversing from based on the options
179
- const startSegment = resolvedOptions.first || this.internal.initialSegment;
180
- const lastSegment = resolvedOptions.last;
181
-
182
- // set up initial location information
183
- let record = null;
184
- let index = 0;
185
- let end = 0;
186
- let segment = null;
187
-
188
- // segments that have already been visited during traversal
189
- const visited = new Set();
190
-
191
- // tracks the traversal steps
192
- const stack = [[startSegment, 0]];
193
-
194
- // tracks the last skipped segment during traversal
195
- let skippedSegment = null;
196
-
197
- // indicates if we exited early from the traversal
198
- let broken = false;
199
-
200
- /**
201
- * Maintains traversal state.
202
- */
203
- const controller = {
204
-
205
- /**
206
- * Skip the following segments in this branch.
207
- * @returns {void}
208
- */
209
- skip() {
210
- if (stack.length <= 1) {
211
- broken = true;
212
- } else {
213
- skippedSegment = stack[stack.length - 2][0];
214
- }
215
- },
216
-
217
- /**
218
- * Stop traversal completely - do not traverse to any
219
- * other segments.
220
- * @returns {void}
221
- */
222
- break() {
223
- broken = true;
224
- }
225
- };
226
-
227
- /**
228
- * Checks if a given previous segment has been visited.
229
- * @param {CodePathSegment} prevSegment A previous segment to check.
230
- * @returns {boolean} `true` if the segment has been visited.
231
- */
232
- function isVisited(prevSegment) {
233
- return (
234
- visited.has(prevSegment) ||
235
- segment.isLoopedPrevSegment(prevSegment)
236
- );
237
- }
238
-
239
- // the traversal
240
- while (stack.length > 0) {
241
-
242
- /*
243
- * This isn't a pure stack. We use the top record all the time
244
- * but don't always pop it off. The record is popped only if
245
- * one of the following is true:
246
- *
247
- * 1) We have already visited the segment.
248
- * 2) We have not visited *all* of the previous segments.
249
- * 3) We have traversed past the available next segments.
250
- *
251
- * Otherwise, we just read the value and sometimes modify the
252
- * record as we traverse.
253
- */
254
- record = stack[stack.length - 1];
255
- segment = record[0];
256
- index = record[1];
257
-
258
- if (index === 0) {
259
-
260
- // Skip if this segment has been visited already.
261
- if (visited.has(segment)) {
262
- stack.pop();
263
- continue;
264
- }
265
-
266
- // Skip if all previous segments have not been visited.
267
- if (segment !== startSegment &&
268
- segment.prevSegments.length > 0 &&
269
- !segment.prevSegments.every(isVisited)
270
- ) {
271
- stack.pop();
272
- continue;
273
- }
274
-
275
- // Reset the skipping flag if all branches have been skipped.
276
- if (skippedSegment && segment.prevSegments.includes(skippedSegment)) {
277
- skippedSegment = null;
278
- }
279
- visited.add(segment);
280
-
281
- /*
282
- * If the most recent segment hasn't been skipped, then we call
283
- * the callback, passing in the segment and the controller.
284
- */
285
- if (!skippedSegment) {
286
- resolvedCallback.call(this, segment, controller);
287
-
288
- // exit if we're at the last segment
289
- if (segment === lastSegment) {
290
- controller.skip();
291
- }
292
-
293
- /*
294
- * If the previous statement was executed, or if the callback
295
- * called a method on the controller, we might need to exit the
296
- * loop, so check for that and break accordingly.
297
- */
298
- if (broken) {
299
- break;
300
- }
301
- }
302
- }
303
-
304
- // Update the stack.
305
- end = segment.nextSegments.length - 1;
306
- if (index < end) {
307
-
308
- /*
309
- * If we haven't yet visited all of the next segments, update
310
- * the current top record on the stack to the next index to visit
311
- * and then push a record for the current segment on top.
312
- *
313
- * Setting the current top record's index lets us know how many
314
- * times we've been here and ensures that the segment won't be
315
- * reprocessed (because we only process segments with an index
316
- * of 0).
317
- */
318
- record[1] += 1;
319
- stack.push([segment.nextSegments[index], 0]);
320
- } else if (index === end) {
321
-
322
- /*
323
- * If we are at the last next segment, then reset the top record
324
- * in the stack to next segment and set its index to 0 so it will
325
- * be processed next.
326
- */
327
- record[0] = segment.nextSegments[index];
328
- record[1] = 0;
329
- } else {
330
-
331
- /*
332
- * If index > end, that means we have no more segments that need
333
- * processing. So, we pop that record off of the stack in order to
334
- * continue traversing at the next level up.
335
- */
336
- stack.pop();
337
- }
338
- }
339
- }
23
+ /**
24
+ * Creates a new instance.
25
+ * @param {Object} options Options for the function (see below).
26
+ * @param {string} options.id An identifier.
27
+ * @param {string} options.origin The type of code path origin.
28
+ * @param {CodePath|null} options.upper The code path of the upper function scope.
29
+ * @param {Function} options.onLooped A callback function to notify looping.
30
+ */
31
+ constructor({ id, origin, upper, onLooped }) {
32
+ /**
33
+ * The identifier of this code path.
34
+ * Rules use it to store additional information of each rule.
35
+ * @type {string}
36
+ */
37
+ this.id = id;
38
+
39
+ /**
40
+ * The reason that this code path was started. May be "program",
41
+ * "function", "class-field-initializer", or "class-static-block".
42
+ * @type {string}
43
+ */
44
+ this.origin = origin;
45
+
46
+ /**
47
+ * The code path of the upper function scope.
48
+ * @type {CodePath|null}
49
+ */
50
+ this.upper = upper;
51
+
52
+ /**
53
+ * The code paths of nested function scopes.
54
+ * @type {CodePath[]}
55
+ */
56
+ this.childCodePaths = [];
57
+
58
+ // Initializes internal state.
59
+ Object.defineProperty(this, "internal", {
60
+ value: new CodePathState(new IdGenerator(`${id}_`), onLooped),
61
+ });
62
+
63
+ // Adds this into `childCodePaths` of `upper`.
64
+ if (upper) {
65
+ upper.childCodePaths.push(this);
66
+ }
67
+ }
68
+
69
+ /**
70
+ * Gets the state of a given code path.
71
+ * @param {CodePath} codePath A code path to get.
72
+ * @returns {CodePathState} The state of the code path.
73
+ */
74
+ static getState(codePath) {
75
+ return codePath.internal;
76
+ }
77
+
78
+ /**
79
+ * The initial code path segment. This is the segment that is at the head
80
+ * of the code path.
81
+ * This is a passthrough to the underlying `CodePathState`.
82
+ * @type {CodePathSegment}
83
+ */
84
+ get initialSegment() {
85
+ return this.internal.initialSegment;
86
+ }
87
+
88
+ /**
89
+ * Final code path segments. These are the terminal (tail) segments in the
90
+ * code path, which is the combination of `returnedSegments` and `thrownSegments`.
91
+ * All segments in this array are reachable.
92
+ * This is a passthrough to the underlying `CodePathState`.
93
+ * @type {CodePathSegment[]}
94
+ */
95
+ get finalSegments() {
96
+ return this.internal.finalSegments;
97
+ }
98
+
99
+ /**
100
+ * Final code path segments that represent normal completion of the code path.
101
+ * For functions, this means both explicit `return` statements and implicit returns,
102
+ * such as the last reachable segment in a function that does not have an
103
+ * explicit `return` as this implicitly returns `undefined`. For scripts,
104
+ * modules, class field initializers, and class static blocks, this means
105
+ * all lines of code have been executed.
106
+ * These segments are also present in `finalSegments`.
107
+ * This is a passthrough to the underlying `CodePathState`.
108
+ * @type {CodePathSegment[]}
109
+ */
110
+ get returnedSegments() {
111
+ return this.internal.returnedForkContext;
112
+ }
113
+
114
+ /**
115
+ * Final code path segments that represent `throw` statements.
116
+ * This is a passthrough to the underlying `CodePathState`.
117
+ * These segments are also present in `finalSegments`.
118
+ * @type {CodePathSegment[]}
119
+ */
120
+ get thrownSegments() {
121
+ return this.internal.thrownForkContext;
122
+ }
123
+
124
+ /**
125
+ * Traverses all segments in this code path.
126
+ *
127
+ * codePath.traverseSegments((segment, controller) => {
128
+ * // do something.
129
+ * });
130
+ *
131
+ * This method enumerates segments in order from the head.
132
+ *
133
+ * The `controller` argument has two methods:
134
+ *
135
+ * - `skip()` - skips the following segments in this branch
136
+ * - `break()` - skips all following segments in the traversal
137
+ *
138
+ * A note on the parameters: the `options` argument is optional. This means
139
+ * the first argument might be an options object or the callback function.
140
+ * @param {Object} [optionsOrCallback] Optional first and last segments to traverse.
141
+ * @param {CodePathSegment} [optionsOrCallback.first] The first segment to traverse.
142
+ * @param {CodePathSegment} [optionsOrCallback.last] The last segment to traverse.
143
+ * @param {Function} callback A callback function.
144
+ * @returns {void}
145
+ */
146
+ traverseSegments(optionsOrCallback, callback) {
147
+ // normalize the arguments into a callback and options
148
+ let resolvedOptions;
149
+ let resolvedCallback;
150
+
151
+ if (typeof optionsOrCallback === "function") {
152
+ resolvedCallback = optionsOrCallback;
153
+ resolvedOptions = {};
154
+ } else {
155
+ resolvedOptions = optionsOrCallback || {};
156
+ resolvedCallback = callback;
157
+ }
158
+
159
+ // determine where to start traversing from based on the options
160
+ const startSegment =
161
+ resolvedOptions.first || this.internal.initialSegment;
162
+ const lastSegment = resolvedOptions.last;
163
+
164
+ // set up initial location information
165
+ let record;
166
+ let index;
167
+ let end;
168
+ let segment = null;
169
+
170
+ // segments that have already been visited during traversal
171
+ const visited = new Set();
172
+
173
+ // tracks the traversal steps
174
+ const stack = [[startSegment, 0]];
175
+
176
+ // segments that have been skipped during traversal
177
+ const skipped = new Set();
178
+
179
+ // indicates if we exited early from the traversal
180
+ let broken = false;
181
+
182
+ /**
183
+ * Maintains traversal state.
184
+ */
185
+ const controller = {
186
+ /**
187
+ * Skip the following segments in this branch.
188
+ * @returns {void}
189
+ */
190
+ skip() {
191
+ skipped.add(segment);
192
+ },
193
+
194
+ /**
195
+ * Stop traversal completely - do not traverse to any
196
+ * other segments.
197
+ * @returns {void}
198
+ */
199
+ break() {
200
+ broken = true;
201
+ },
202
+ };
203
+
204
+ /**
205
+ * Checks if a given previous segment has been visited.
206
+ * @param {CodePathSegment} prevSegment A previous segment to check.
207
+ * @returns {boolean} `true` if the segment has been visited.
208
+ */
209
+ function isVisited(prevSegment) {
210
+ return (
211
+ visited.has(prevSegment) ||
212
+ segment.isLoopedPrevSegment(prevSegment)
213
+ );
214
+ }
215
+
216
+ /**
217
+ * Checks if a given previous segment has been skipped.
218
+ * @param {CodePathSegment} prevSegment A previous segment to check.
219
+ * @returns {boolean} `true` if the segment has been skipped.
220
+ */
221
+ function isSkipped(prevSegment) {
222
+ return (
223
+ skipped.has(prevSegment) ||
224
+ segment.isLoopedPrevSegment(prevSegment)
225
+ );
226
+ }
227
+
228
+ // the traversal
229
+ while (stack.length > 0) {
230
+ /*
231
+ * This isn't a pure stack. We use the top record all the time
232
+ * but don't always pop it off. The record is popped only if
233
+ * one of the following is true:
234
+ *
235
+ * 1) We have already visited the segment.
236
+ * 2) We have not visited *all* of the previous segments.
237
+ * 3) We have traversed past the available next segments.
238
+ *
239
+ * Otherwise, we just read the value and sometimes modify the
240
+ * record as we traverse.
241
+ */
242
+ record = stack.at(-1);
243
+ segment = record[0];
244
+ index = record[1];
245
+
246
+ if (index === 0) {
247
+ // Skip if this segment has been visited already.
248
+ if (visited.has(segment)) {
249
+ stack.pop();
250
+ continue;
251
+ }
252
+
253
+ // Skip if all previous segments have not been visited.
254
+ if (
255
+ segment !== startSegment &&
256
+ segment.prevSegments.length > 0 &&
257
+ !segment.prevSegments.every(isVisited)
258
+ ) {
259
+ stack.pop();
260
+ continue;
261
+ }
262
+
263
+ visited.add(segment);
264
+
265
+ // Skips the segment if all previous segments have been skipped.
266
+ const shouldSkip =
267
+ skipped.size > 0 &&
268
+ segment.prevSegments.length > 0 &&
269
+ segment.prevSegments.every(isSkipped);
270
+
271
+ /*
272
+ * If the most recent segment hasn't been skipped, then we call
273
+ * the callback, passing in the segment and the controller.
274
+ */
275
+ if (!shouldSkip) {
276
+ resolvedCallback.call(this, segment, controller);
277
+
278
+ // exit if we're at the last segment
279
+ if (segment === lastSegment) {
280
+ controller.skip();
281
+ }
282
+
283
+ /*
284
+ * If the previous statement was executed, or if the callback
285
+ * called a method on the controller, we might need to exit the
286
+ * loop, so check for that and break accordingly.
287
+ */
288
+ if (broken) {
289
+ break;
290
+ }
291
+ } else {
292
+ // If the most recent segment has been skipped, then mark it as skipped.
293
+ skipped.add(segment);
294
+ }
295
+ }
296
+
297
+ // Update the stack.
298
+ end = segment.nextSegments.length - 1;
299
+ if (index < end) {
300
+ /*
301
+ * If we haven't yet visited all of the next segments, update
302
+ * the current top record on the stack to the next index to visit
303
+ * and then push a record for the current segment on top.
304
+ *
305
+ * Setting the current top record's index lets us know how many
306
+ * times we've been here and ensures that the segment won't be
307
+ * reprocessed (because we only process segments with an index
308
+ * of 0).
309
+ */
310
+ record[1] += 1;
311
+ stack.push([segment.nextSegments[index], 0]);
312
+ } else if (index === end) {
313
+ /*
314
+ * If we are at the last next segment, then reset the top record
315
+ * in the stack to next segment and set its index to 0 so it will
316
+ * be processed next.
317
+ */
318
+ record[0] = segment.nextSegments[index];
319
+ record[1] = 0;
320
+ } else {
321
+ /*
322
+ * If index > end, that means we have no more segments that need
323
+ * processing. So, we pop that record off of the stack in order to
324
+ * continue traversing at the next level up.
325
+ */
326
+ stack.pop();
327
+ }
328
+ }
329
+ }
340
330
  }
341
331
 
342
332
  module.exports = CodePath;