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
@@ -16,238 +16,292 @@ const astUtils = require("./utils/ast-utils");
16
16
  // Rule Definition
17
17
  //------------------------------------------------------------------------------
18
18
 
19
- /** @type {import('../shared/types').Rule} */
19
+ /** @type {import('../types').Rule.RuleModule} */
20
20
  module.exports = {
21
- meta: {
22
- type: "layout",
23
-
24
- docs: {
25
- description: "Require or disallow an empty line after variable declarations",
26
- recommended: false,
27
- url: "https://eslint.org/docs/latest/rules/newline-after-var"
28
- },
29
- schema: [
30
- {
31
- enum: ["never", "always"]
32
- }
33
- ],
34
- fixable: "whitespace",
35
- messages: {
36
- expected: "Expected blank line after variable declarations.",
37
- unexpected: "Unexpected blank line after variable declarations."
38
- },
39
-
40
- deprecated: true,
41
-
42
- replacedBy: ["padding-line-between-statements"]
43
- },
44
-
45
- create(context) {
46
- const sourceCode = context.sourceCode;
47
-
48
- // Default `mode` to "always".
49
- const mode = context.options[0] === "never" ? "never" : "always";
50
-
51
- // Cache starting and ending line numbers of comments for faster lookup
52
- const commentEndLine = sourceCode.getAllComments().reduce((result, token) => {
53
- result[token.loc.start.line] = token.loc.end.line;
54
- return result;
55
- }, {});
56
-
57
-
58
- //--------------------------------------------------------------------------
59
- // Helpers
60
- //--------------------------------------------------------------------------
61
-
62
- /**
63
- * Gets a token from the given node to compare line to the next statement.
64
- *
65
- * In general, the token is the last token of the node. However, the token is the second last token if the following conditions satisfy.
66
- *
67
- * - The last token is semicolon.
68
- * - The semicolon is on a different line from the previous token of the semicolon.
69
- *
70
- * This behavior would address semicolon-less style code. e.g.:
71
- *
72
- * var foo = 1
73
- *
74
- * ;(a || b).doSomething()
75
- * @param {ASTNode} node The node to get.
76
- * @returns {Token} The token to compare line to the next statement.
77
- */
78
- function getLastToken(node) {
79
- const lastToken = sourceCode.getLastToken(node);
80
-
81
- if (lastToken.type === "Punctuator" && lastToken.value === ";") {
82
- const prevToken = sourceCode.getTokenBefore(lastToken);
83
-
84
- if (prevToken.loc.end.line !== lastToken.loc.start.line) {
85
- return prevToken;
86
- }
87
- }
88
-
89
- return lastToken;
90
- }
91
-
92
- /**
93
- * Determine if provided keyword is a variable declaration
94
- * @private
95
- * @param {string} keyword keyword to test
96
- * @returns {boolean} True if `keyword` is a type of var
97
- */
98
- function isVar(keyword) {
99
- return keyword === "var" || keyword === "let" || keyword === "const";
100
- }
101
-
102
- /**
103
- * Determine if provided keyword is a variant of for specifiers
104
- * @private
105
- * @param {string} keyword keyword to test
106
- * @returns {boolean} True if `keyword` is a variant of for specifier
107
- */
108
- function isForTypeSpecifier(keyword) {
109
- return keyword === "ForStatement" || keyword === "ForInStatement" || keyword === "ForOfStatement";
110
- }
111
-
112
- /**
113
- * Determine if provided keyword is an export specifiers
114
- * @private
115
- * @param {string} nodeType nodeType to test
116
- * @returns {boolean} True if `nodeType` is an export specifier
117
- */
118
- function isExportSpecifier(nodeType) {
119
- return nodeType === "ExportNamedDeclaration" || nodeType === "ExportSpecifier" ||
120
- nodeType === "ExportDefaultDeclaration" || nodeType === "ExportAllDeclaration";
121
- }
122
-
123
- /**
124
- * Determine if provided node is the last of their parent block.
125
- * @private
126
- * @param {ASTNode} node node to test
127
- * @returns {boolean} True if `node` is last of their parent block.
128
- */
129
- function isLastNode(node) {
130
- const token = sourceCode.getTokenAfter(node);
131
-
132
- return !token || (token.type === "Punctuator" && token.value === "}");
133
- }
134
-
135
- /**
136
- * Gets the last line of a group of consecutive comments
137
- * @param {number} commentStartLine The starting line of the group
138
- * @returns {number} The number of the last comment line of the group
139
- */
140
- function getLastCommentLineOfBlock(commentStartLine) {
141
- const currentCommentEnd = commentEndLine[commentStartLine];
142
-
143
- return commentEndLine[currentCommentEnd + 1] ? getLastCommentLineOfBlock(currentCommentEnd + 1) : currentCommentEnd;
144
- }
145
-
146
- /**
147
- * Determine if a token starts more than one line after a comment ends
148
- * @param {token} token The token being checked
149
- * @param {integer} commentStartLine The line number on which the comment starts
150
- * @returns {boolean} True if `token` does not start immediately after a comment
151
- */
152
- function hasBlankLineAfterComment(token, commentStartLine) {
153
- return token.loc.start.line > getLastCommentLineOfBlock(commentStartLine) + 1;
154
- }
155
-
156
- /**
157
- * Checks that a blank line exists after a variable declaration when mode is
158
- * set to "always", or checks that there is no blank line when mode is set
159
- * to "never"
160
- * @private
161
- * @param {ASTNode} node `VariableDeclaration` node to test
162
- * @returns {void}
163
- */
164
- function checkForBlankLine(node) {
165
-
166
- /*
167
- * lastToken is the last token on the node's line. It will usually also be the last token of the node, but it will
168
- * sometimes be second-last if there is a semicolon on a different line.
169
- */
170
- const lastToken = getLastToken(node),
171
-
172
- /*
173
- * If lastToken is the last token of the node, nextToken should be the token after the node. Otherwise, nextToken
174
- * is the last token of the node.
175
- */
176
- nextToken = lastToken === sourceCode.getLastToken(node) ? sourceCode.getTokenAfter(node) : sourceCode.getLastToken(node),
177
- nextLineNum = lastToken.loc.end.line + 1;
178
-
179
- // Ignore if there is no following statement
180
- if (!nextToken) {
181
- return;
182
- }
183
-
184
- // Ignore if parent of node is a for variant
185
- if (isForTypeSpecifier(node.parent.type)) {
186
- return;
187
- }
188
-
189
- // Ignore if parent of node is an export specifier
190
- if (isExportSpecifier(node.parent.type)) {
191
- return;
192
- }
193
-
194
- /*
195
- * Some coding styles use multiple `var` statements, so do nothing if
196
- * the next token is a `var` statement.
197
- */
198
- if (nextToken.type === "Keyword" && isVar(nextToken.value)) {
199
- return;
200
- }
201
-
202
- // Ignore if it is last statement in a block
203
- if (isLastNode(node)) {
204
- return;
205
- }
206
-
207
- // Next statement is not a `var`...
208
- const noNextLineToken = nextToken.loc.start.line > nextLineNum;
209
- const hasNextLineComment = (typeof commentEndLine[nextLineNum] !== "undefined");
210
-
211
- if (mode === "never" && noNextLineToken && !hasNextLineComment) {
212
- context.report({
213
- node,
214
- messageId: "unexpected",
215
- fix(fixer) {
216
- const linesBetween = sourceCode.getText().slice(lastToken.range[1], nextToken.range[0]).split(astUtils.LINEBREAK_MATCHER);
217
-
218
- return fixer.replaceTextRange([lastToken.range[1], nextToken.range[0]], `${linesBetween.slice(0, -1).join("")}\n${linesBetween[linesBetween.length - 1]}`);
219
- }
220
- });
221
- }
222
-
223
- // Token on the next line, or comment without blank line
224
- if (
225
- mode === "always" && (
226
- !noNextLineToken ||
227
- hasNextLineComment && !hasBlankLineAfterComment(nextToken, nextLineNum)
228
- )
229
- ) {
230
- context.report({
231
- node,
232
- messageId: "expected",
233
- fix(fixer) {
234
- if ((noNextLineToken ? getLastCommentLineOfBlock(nextLineNum) : lastToken.loc.end.line) === nextToken.loc.start.line) {
235
- return fixer.insertTextBefore(nextToken, "\n\n");
236
- }
237
-
238
- return fixer.insertTextBeforeRange([nextToken.range[0] - nextToken.loc.start.column, nextToken.range[1]], "\n");
239
- }
240
- });
241
- }
242
- }
243
-
244
- //--------------------------------------------------------------------------
245
- // Public
246
- //--------------------------------------------------------------------------
247
-
248
- return {
249
- VariableDeclaration: checkForBlankLine
250
- };
251
-
252
- }
21
+ meta: {
22
+ type: "layout",
23
+
24
+ docs: {
25
+ description:
26
+ "Require or disallow an empty line after variable declarations",
27
+ recommended: false,
28
+ url: "https://eslint.org/docs/latest/rules/newline-after-var",
29
+ },
30
+ schema: [
31
+ {
32
+ enum: ["never", "always"],
33
+ },
34
+ ],
35
+ fixable: "whitespace",
36
+ messages: {
37
+ expected: "Expected blank line after variable declarations.",
38
+ unexpected: "Unexpected blank line after variable declarations.",
39
+ },
40
+
41
+ deprecated: {
42
+ message: "The rule was replaced with a more general rule.",
43
+ url: "https://eslint.org/blog/2017/06/eslint-v4.0.0-released/",
44
+ deprecatedSince: "4.0.0",
45
+ availableUntil: "11.0.0",
46
+ replacedBy: [
47
+ {
48
+ message: "The new rule moved to a plugin.",
49
+ url: "https://eslint.org/docs/latest/rules/padding-line-between-statements#examples",
50
+ plugin: {
51
+ name: "@stylistic/eslint-plugin",
52
+ url: "https://eslint.style",
53
+ },
54
+ rule: {
55
+ name: "padding-line-between-statements",
56
+ url: "https://eslint.style/rules/padding-line-between-statements",
57
+ },
58
+ },
59
+ ],
60
+ },
61
+ },
62
+
63
+ create(context) {
64
+ const sourceCode = context.sourceCode;
65
+
66
+ // Default `mode` to "always".
67
+ const mode = context.options[0] === "never" ? "never" : "always";
68
+
69
+ // Cache starting and ending line numbers of comments for faster lookup
70
+ const commentEndLine = sourceCode
71
+ .getAllComments()
72
+ .reduce((result, token) => {
73
+ result[token.loc.start.line] = token.loc.end.line;
74
+ return result;
75
+ }, {});
76
+
77
+ //--------------------------------------------------------------------------
78
+ // Helpers
79
+ //--------------------------------------------------------------------------
80
+
81
+ /**
82
+ * Gets a token from the given node to compare line to the next statement.
83
+ *
84
+ * In general, the token is the last token of the node. However, the token is the second last token if the following conditions satisfy.
85
+ *
86
+ * - The last token is semicolon.
87
+ * - The semicolon is on a different line from the previous token of the semicolon.
88
+ *
89
+ * This behavior would address semicolon-less style code. e.g.:
90
+ *
91
+ * var foo = 1
92
+ *
93
+ * ;(a || b).doSomething()
94
+ * @param {ASTNode} node The node to get.
95
+ * @returns {Token} The token to compare line to the next statement.
96
+ */
97
+ function getLastToken(node) {
98
+ const lastToken = sourceCode.getLastToken(node);
99
+
100
+ if (lastToken.type === "Punctuator" && lastToken.value === ";") {
101
+ const prevToken = sourceCode.getTokenBefore(lastToken);
102
+
103
+ if (prevToken.loc.end.line !== lastToken.loc.start.line) {
104
+ return prevToken;
105
+ }
106
+ }
107
+
108
+ return lastToken;
109
+ }
110
+
111
+ /**
112
+ * Determine if provided keyword is a variable declaration
113
+ * @private
114
+ * @param {string} keyword keyword to test
115
+ * @returns {boolean} True if `keyword` is a type of var
116
+ */
117
+ function isVar(keyword) {
118
+ return (
119
+ keyword === "var" || keyword === "let" || keyword === "const"
120
+ );
121
+ }
122
+
123
+ /**
124
+ * Determine if provided keyword is a variant of for specifiers
125
+ * @private
126
+ * @param {string} keyword keyword to test
127
+ * @returns {boolean} True if `keyword` is a variant of for specifier
128
+ */
129
+ function isForTypeSpecifier(keyword) {
130
+ return (
131
+ keyword === "ForStatement" ||
132
+ keyword === "ForInStatement" ||
133
+ keyword === "ForOfStatement"
134
+ );
135
+ }
136
+
137
+ /**
138
+ * Determine if provided keyword is an export specifiers
139
+ * @private
140
+ * @param {string} nodeType nodeType to test
141
+ * @returns {boolean} True if `nodeType` is an export specifier
142
+ */
143
+ function isExportSpecifier(nodeType) {
144
+ return (
145
+ nodeType === "ExportNamedDeclaration" ||
146
+ nodeType === "ExportSpecifier" ||
147
+ nodeType === "ExportDefaultDeclaration" ||
148
+ nodeType === "ExportAllDeclaration"
149
+ );
150
+ }
151
+
152
+ /**
153
+ * Determine if provided node is the last of their parent block.
154
+ * @private
155
+ * @param {ASTNode} node node to test
156
+ * @returns {boolean} True if `node` is last of their parent block.
157
+ */
158
+ function isLastNode(node) {
159
+ const token = sourceCode.getTokenAfter(node);
160
+
161
+ return (
162
+ !token || (token.type === "Punctuator" && token.value === "}")
163
+ );
164
+ }
165
+
166
+ /**
167
+ * Gets the last line of a group of consecutive comments
168
+ * @param {number} commentStartLine The starting line of the group
169
+ * @returns {number} The number of the last comment line of the group
170
+ */
171
+ function getLastCommentLineOfBlock(commentStartLine) {
172
+ const currentCommentEnd = commentEndLine[commentStartLine];
173
+
174
+ return commentEndLine[currentCommentEnd + 1]
175
+ ? getLastCommentLineOfBlock(currentCommentEnd + 1)
176
+ : currentCommentEnd;
177
+ }
178
+
179
+ /**
180
+ * Determine if a token starts more than one line after a comment ends
181
+ * @param {token} token The token being checked
182
+ * @param {integer} commentStartLine The line number on which the comment starts
183
+ * @returns {boolean} True if `token` does not start immediately after a comment
184
+ */
185
+ function hasBlankLineAfterComment(token, commentStartLine) {
186
+ return (
187
+ token.loc.start.line >
188
+ getLastCommentLineOfBlock(commentStartLine) + 1
189
+ );
190
+ }
191
+
192
+ /**
193
+ * Checks that a blank line exists after a variable declaration when mode is
194
+ * set to "always", or checks that there is no blank line when mode is set
195
+ * to "never"
196
+ * @private
197
+ * @param {ASTNode} node `VariableDeclaration` node to test
198
+ * @returns {void}
199
+ */
200
+ function checkForBlankLine(node) {
201
+ /*
202
+ * lastToken is the last token on the node's line. It will usually also be the last token of the node, but it will
203
+ * sometimes be second-last if there is a semicolon on a different line.
204
+ */
205
+ const lastToken = getLastToken(node),
206
+ /*
207
+ * If lastToken is the last token of the node, nextToken should be the token after the node. Otherwise, nextToken
208
+ * is the last token of the node.
209
+ */
210
+ nextToken =
211
+ lastToken === sourceCode.getLastToken(node)
212
+ ? sourceCode.getTokenAfter(node)
213
+ : sourceCode.getLastToken(node),
214
+ nextLineNum = lastToken.loc.end.line + 1;
215
+
216
+ // Ignore if there is no following statement
217
+ if (!nextToken) {
218
+ return;
219
+ }
220
+
221
+ // Ignore if parent of node is a for variant
222
+ if (isForTypeSpecifier(node.parent.type)) {
223
+ return;
224
+ }
225
+
226
+ // Ignore if parent of node is an export specifier
227
+ if (isExportSpecifier(node.parent.type)) {
228
+ return;
229
+ }
230
+
231
+ /*
232
+ * Some coding styles use multiple `var` statements, so do nothing if
233
+ * the next token is a `var` statement.
234
+ */
235
+ if (nextToken.type === "Keyword" && isVar(nextToken.value)) {
236
+ return;
237
+ }
238
+
239
+ // Ignore if it is last statement in a block
240
+ if (isLastNode(node)) {
241
+ return;
242
+ }
243
+
244
+ // Next statement is not a `var`...
245
+ const noNextLineToken = nextToken.loc.start.line > nextLineNum;
246
+ const hasNextLineComment =
247
+ typeof commentEndLine[nextLineNum] !== "undefined";
248
+
249
+ if (mode === "never" && noNextLineToken && !hasNextLineComment) {
250
+ context.report({
251
+ node,
252
+ messageId: "unexpected",
253
+ fix(fixer) {
254
+ const linesBetween = sourceCode
255
+ .getText()
256
+ .slice(lastToken.range[1], nextToken.range[0])
257
+ .split(astUtils.LINEBREAK_MATCHER);
258
+
259
+ return fixer.replaceTextRange(
260
+ [lastToken.range[1], nextToken.range[0]],
261
+ `${linesBetween.slice(0, -1).join("")}\n${linesBetween.at(-1)}`,
262
+ );
263
+ },
264
+ });
265
+ }
266
+
267
+ // Token on the next line, or comment without blank line
268
+ if (
269
+ mode === "always" &&
270
+ (!noNextLineToken ||
271
+ (hasNextLineComment &&
272
+ !hasBlankLineAfterComment(nextToken, nextLineNum)))
273
+ ) {
274
+ context.report({
275
+ node,
276
+ messageId: "expected",
277
+ fix(fixer) {
278
+ if (
279
+ (noNextLineToken
280
+ ? getLastCommentLineOfBlock(nextLineNum)
281
+ : lastToken.loc.end.line) ===
282
+ nextToken.loc.start.line
283
+ ) {
284
+ return fixer.insertTextBefore(nextToken, "\n\n");
285
+ }
286
+
287
+ return fixer.insertTextBeforeRange(
288
+ [
289
+ nextToken.range[0] - nextToken.loc.start.column,
290
+ nextToken.range[1],
291
+ ],
292
+ "\n",
293
+ );
294
+ },
295
+ });
296
+ }
297
+ }
298
+
299
+ //--------------------------------------------------------------------------
300
+ // Public
301
+ //--------------------------------------------------------------------------
302
+
303
+ return {
304
+ VariableDeclaration: checkForBlankLine,
305
+ };
306
+ },
253
307
  };