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
@@ -9,11 +9,6 @@
9
9
  // Requirements
10
10
  //-----------------------------------------------------------------------------
11
11
 
12
- /*
13
- * Note: This can be removed in ESLint v9 because structuredClone is available globally
14
- * starting in Node.js v17.
15
- */
16
- const structuredClone = require("@ungap/structured-clone").default;
17
12
  const { normalizeSeverityToNumber } = require("../shared/severity");
18
13
 
19
14
  //-----------------------------------------------------------------------------
@@ -33,15 +28,12 @@ const { normalizeSeverityToNumber } = require("../shared/severity");
33
28
  //-----------------------------------------------------------------------------
34
29
 
35
30
  const ruleSeverities = new Map([
36
- [0, 0], ["off", 0],
37
- [1, 1], ["warn", 1],
38
- [2, 2], ["error", 2]
39
- ]);
40
-
41
- const globalVariablesValues = new Set([
42
- true, "true", "writable", "writeable",
43
- false, "false", "readonly", "readable", null,
44
- "off"
31
+ [0, 0],
32
+ ["off", 0],
33
+ [1, 1],
34
+ ["warn", 1],
35
+ [2, 2],
36
+ ["error", 2],
45
37
  ]);
46
38
 
47
39
  /**
@@ -50,7 +42,7 @@ const globalVariablesValues = new Set([
50
42
  * @returns {boolean} `true` if the value is a non-null object.
51
43
  */
52
44
  function isNonNullObject(value) {
53
- return typeof value === "object" && value !== null;
45
+ return typeof value === "object" && value !== null;
54
46
  }
55
47
 
56
48
  /**
@@ -59,7 +51,7 @@ function isNonNullObject(value) {
59
51
  * @returns {boolean} `true` if the value is a non-null non-array object.
60
52
  */
61
53
  function isNonArrayObject(value) {
62
- return isNonNullObject(value) && !Array.isArray(value);
54
+ return isNonNullObject(value) && !Array.isArray(value);
63
55
  }
64
56
 
65
57
  /**
@@ -68,7 +60,7 @@ function isNonArrayObject(value) {
68
60
  * @returns {boolean} `true` if the value is undefined.
69
61
  */
70
62
  function isUndefined(value) {
71
- return typeof value === "undefined";
63
+ return typeof value === "undefined";
72
64
  }
73
65
 
74
66
  /**
@@ -79,57 +71,56 @@ function isUndefined(value) {
79
71
  * @returns {Object} An object with properties from both first and second.
80
72
  */
81
73
  function deepMerge(first, second, mergeMap = new Map()) {
82
-
83
- let secondMergeMap = mergeMap.get(first);
84
-
85
- if (secondMergeMap) {
86
- const result = secondMergeMap.get(second);
87
-
88
- if (result) {
89
-
90
- // If this combination of first and second arguments has been already visited, return the previously created result.
91
- return result;
92
- }
93
- } else {
94
- secondMergeMap = new Map();
95
- mergeMap.set(first, secondMergeMap);
96
- }
97
-
98
- /*
99
- * First create a result object where properties from the second object
100
- * overwrite properties from the first. This sets up a baseline to use
101
- * later rather than needing to inspect and change every property
102
- * individually.
103
- */
104
- const result = {
105
- ...first,
106
- ...second
107
- };
108
-
109
- delete result.__proto__; // eslint-disable-line no-proto -- don't merge own property "__proto__"
110
-
111
- // Store the pending result for this combination of first and second arguments.
112
- secondMergeMap.set(second, result);
113
-
114
- for (const key of Object.keys(second)) {
115
-
116
- // avoid hairy edge case
117
- if (key === "__proto__" || !Object.prototype.propertyIsEnumerable.call(first, key)) {
118
- continue;
119
- }
120
-
121
- const firstValue = first[key];
122
- const secondValue = second[key];
123
-
124
- if (isNonArrayObject(firstValue) && isNonArrayObject(secondValue)) {
125
- result[key] = deepMerge(firstValue, secondValue, mergeMap);
126
- } else if (isUndefined(secondValue)) {
127
- result[key] = firstValue;
128
- }
129
- }
130
-
131
- return result;
132
-
74
+ let secondMergeMap = mergeMap.get(first);
75
+
76
+ if (secondMergeMap) {
77
+ const result = secondMergeMap.get(second);
78
+
79
+ if (result) {
80
+ // If this combination of first and second arguments has been already visited, return the previously created result.
81
+ return result;
82
+ }
83
+ } else {
84
+ secondMergeMap = new Map();
85
+ mergeMap.set(first, secondMergeMap);
86
+ }
87
+
88
+ /*
89
+ * First create a result object where properties from the second object
90
+ * overwrite properties from the first. This sets up a baseline to use
91
+ * later rather than needing to inspect and change every property
92
+ * individually.
93
+ */
94
+ const result = {
95
+ ...first,
96
+ ...second,
97
+ };
98
+
99
+ delete result.__proto__; // eslint-disable-line no-proto -- don't merge own property "__proto__"
100
+
101
+ // Store the pending result for this combination of first and second arguments.
102
+ secondMergeMap.set(second, result);
103
+
104
+ for (const key of Object.keys(second)) {
105
+ // avoid hairy edge case
106
+ if (
107
+ key === "__proto__" ||
108
+ !Object.prototype.propertyIsEnumerable.call(first, key)
109
+ ) {
110
+ continue;
111
+ }
112
+
113
+ const firstValue = first[key];
114
+ const secondValue = second[key];
115
+
116
+ if (isNonArrayObject(firstValue) && isNonArrayObject(secondValue)) {
117
+ result[key] = deepMerge(firstValue, secondValue, mergeMap);
118
+ } else if (isUndefined(secondValue)) {
119
+ result[key] = firstValue;
120
+ }
121
+ }
122
+
123
+ return result;
133
124
  }
134
125
 
135
126
  /**
@@ -139,13 +130,27 @@ function deepMerge(first, second, mergeMap = new Map()) {
139
130
  * @returns {Array} An array of rule options.
140
131
  */
141
132
  function normalizeRuleOptions(ruleOptions) {
133
+ const finalOptions = Array.isArray(ruleOptions)
134
+ ? ruleOptions.slice(0)
135
+ : [ruleOptions];
142
136
 
143
- const finalOptions = Array.isArray(ruleOptions)
144
- ? ruleOptions.slice(0)
145
- : [ruleOptions];
137
+ finalOptions[0] = ruleSeverities.get(finalOptions[0]);
138
+ return structuredClone(finalOptions);
139
+ }
146
140
 
147
- finalOptions[0] = ruleSeverities.get(finalOptions[0]);
148
- return structuredClone(finalOptions);
141
+ /**
142
+ * Determines if an object has any methods.
143
+ * @param {Object} object The object to check.
144
+ * @returns {boolean} `true` if the object has any methods.
145
+ */
146
+ function hasMethod(object) {
147
+ for (const key of Object.keys(object)) {
148
+ if (typeof object[key] === "function") {
149
+ return true;
150
+ }
151
+ }
152
+
153
+ return false;
149
154
  }
150
155
 
151
156
  //-----------------------------------------------------------------------------
@@ -156,16 +161,17 @@ function normalizeRuleOptions(ruleOptions) {
156
161
  * The error type when a rule's options are configured with an invalid type.
157
162
  */
158
163
  class InvalidRuleOptionsError extends Error {
159
-
160
- /**
161
- * @param {string} ruleId Rule name being configured.
162
- * @param {any} value The invalid value.
163
- */
164
- constructor(ruleId, value) {
165
- super(`Key "${ruleId}": Expected severity of "off", 0, "warn", 1, "error", or 2.`);
166
- this.messageTemplate = "invalid-rule-options";
167
- this.messageData = { ruleId, value };
168
- }
164
+ /**
165
+ * @param {string} ruleId Rule name being configured.
166
+ * @param {any} value The invalid value.
167
+ */
168
+ constructor(ruleId, value) {
169
+ super(
170
+ `Key "${ruleId}": Expected severity of "off", 0, "warn", 1, "error", or 2.`,
171
+ );
172
+ this.messageTemplate = "invalid-rule-options";
173
+ this.messageData = { ruleId, value };
174
+ }
169
175
  }
170
176
 
171
177
  /**
@@ -176,25 +182,30 @@ class InvalidRuleOptionsError extends Error {
176
182
  * @throws {InvalidRuleOptionsError} If the value isn't a valid rule options.
177
183
  */
178
184
  function assertIsRuleOptions(ruleId, value) {
179
- if (typeof value !== "string" && typeof value !== "number" && !Array.isArray(value)) {
180
- throw new InvalidRuleOptionsError(ruleId, value);
181
- }
185
+ if (
186
+ typeof value !== "string" &&
187
+ typeof value !== "number" &&
188
+ !Array.isArray(value)
189
+ ) {
190
+ throw new InvalidRuleOptionsError(ruleId, value);
191
+ }
182
192
  }
183
193
 
184
194
  /**
185
195
  * The error type when a rule's severity is invalid.
186
196
  */
187
197
  class InvalidRuleSeverityError extends Error {
188
-
189
- /**
190
- * @param {string} ruleId Rule name being configured.
191
- * @param {any} value The invalid value.
192
- */
193
- constructor(ruleId, value) {
194
- super(`Key "${ruleId}": Expected severity of "off", 0, "warn", 1, "error", or 2.`);
195
- this.messageTemplate = "invalid-rule-severity";
196
- this.messageData = { ruleId, value };
197
- }
198
+ /**
199
+ * @param {string} ruleId Rule name being configured.
200
+ * @param {any} value The invalid value.
201
+ */
202
+ constructor(ruleId, value) {
203
+ super(
204
+ `Key "${ruleId}": Expected severity of "off", 0, "warn", 1, "error", or 2.`,
205
+ );
206
+ this.messageTemplate = "invalid-rule-severity";
207
+ this.messageData = { ruleId, value };
208
+ }
198
209
  }
199
210
 
200
211
  /**
@@ -205,11 +216,11 @@ class InvalidRuleSeverityError extends Error {
205
216
  * @throws {InvalidRuleSeverityError} If the value isn't a valid rule severity.
206
217
  */
207
218
  function assertIsRuleSeverity(ruleId, value) {
208
- const severity = ruleSeverities.get(value);
219
+ const severity = ruleSeverities.get(value);
209
220
 
210
- if (typeof severity === "undefined") {
211
- throw new InvalidRuleSeverityError(ruleId, value);
212
- }
221
+ if (typeof severity === "undefined") {
222
+ throw new InvalidRuleSeverityError(ruleId, value);
223
+ }
213
224
  }
214
225
 
215
226
  /**
@@ -219,9 +230,11 @@ function assertIsRuleSeverity(ruleId, value) {
219
230
  * @throws {TypeError} If the string isn't in the correct format.
220
231
  */
221
232
  function assertIsPluginMemberName(value) {
222
- if (!/[@a-z0-9-_$]+(?:\/(?:[a-z0-9-_$]+))+$/iu.test(value)) {
223
- throw new TypeError(`Expected string in the form "pluginName/objectName" but found "${value}".`);
224
- }
233
+ if (!/[\w\-@$]+(?:\/[\w\-$]+)+$/iu.test(value)) {
234
+ throw new TypeError(
235
+ `Expected string in the form "pluginName/objectName" but found "${value}".`,
236
+ );
237
+ }
225
238
  }
226
239
 
227
240
  /**
@@ -231,79 +244,98 @@ function assertIsPluginMemberName(value) {
231
244
  * @throws {TypeError} If the value isn't an object.
232
245
  */
233
246
  function assertIsObject(value) {
234
- if (!isNonNullObject(value)) {
235
- throw new TypeError("Expected an object.");
236
- }
247
+ if (!isNonNullObject(value)) {
248
+ throw new TypeError("Expected an object.");
249
+ }
237
250
  }
238
251
 
239
252
  /**
240
253
  * The error type when there's an eslintrc-style options in a flat config.
241
254
  */
242
255
  class IncompatibleKeyError extends Error {
243
-
244
- /**
245
- * @param {string} key The invalid key.
246
- */
247
- constructor(key) {
248
- super("This appears to be in eslintrc format rather than flat config format.");
249
- this.messageTemplate = "eslintrc-incompat";
250
- this.messageData = { key };
251
- }
256
+ /**
257
+ * @param {string} key The invalid key.
258
+ */
259
+ constructor(key) {
260
+ super(
261
+ "This appears to be in eslintrc format rather than flat config format.",
262
+ );
263
+ this.messageTemplate = "eslintrc-incompat";
264
+ this.messageData = { key };
265
+ }
252
266
  }
253
267
 
254
268
  /**
255
269
  * The error type when there's an eslintrc-style plugins array found.
256
270
  */
257
271
  class IncompatiblePluginsError extends Error {
258
-
259
- /**
260
- * Creates a new instance.
261
- * @param {Array<string>} plugins The plugins array.
262
- */
263
- constructor(plugins) {
264
- super("This appears to be in eslintrc format (array of strings) rather than flat config format (object).");
265
- this.messageTemplate = "eslintrc-plugins";
266
- this.messageData = { plugins };
267
- }
272
+ /**
273
+ * Creates a new instance.
274
+ * @param {Array<string>} plugins The plugins array.
275
+ */
276
+ constructor(plugins) {
277
+ super(
278
+ "This appears to be in eslintrc format (array of strings) rather than flat config format (object).",
279
+ );
280
+ this.messageTemplate = "eslintrc-plugins";
281
+ this.messageData = { plugins };
282
+ }
268
283
  }
269
284
 
270
-
271
285
  //-----------------------------------------------------------------------------
272
286
  // Low-Level Schemas
273
287
  //-----------------------------------------------------------------------------
274
288
 
275
289
  /** @type {ObjectPropertySchema} */
276
290
  const booleanSchema = {
277
- merge: "replace",
278
- validate: "boolean"
291
+ merge: "replace",
292
+ validate: "boolean",
279
293
  };
280
294
 
281
295
  const ALLOWED_SEVERITIES = new Set(["error", "warn", "off", 2, 1, 0]);
282
296
 
283
297
  /** @type {ObjectPropertySchema} */
284
298
  const disableDirectiveSeveritySchema = {
285
- merge(first, second) {
286
- const value = second === void 0 ? first : second;
287
-
288
- if (typeof value === "boolean") {
289
- return value ? "warn" : "off";
290
- }
291
-
292
- return normalizeSeverityToNumber(value);
293
- },
294
- validate(value) {
295
- if (!(ALLOWED_SEVERITIES.has(value) || typeof value === "boolean")) {
296
- throw new TypeError("Expected one of: \"error\", \"warn\", \"off\", 0, 1, 2, or a boolean.");
297
- }
298
- }
299
+ merge(first, second) {
300
+ const value = second === void 0 ? first : second;
301
+
302
+ if (typeof value === "boolean") {
303
+ return value ? "warn" : "off";
304
+ }
305
+
306
+ return normalizeSeverityToNumber(value);
307
+ },
308
+ validate(value) {
309
+ if (!(ALLOWED_SEVERITIES.has(value) || typeof value === "boolean")) {
310
+ throw new TypeError(
311
+ 'Expected one of: "error", "warn", "off", 0, 1, 2, or a boolean.',
312
+ );
313
+ }
314
+ },
315
+ };
316
+
317
+ /** @type {ObjectPropertySchema} */
318
+ const unusedInlineConfigsSeveritySchema = {
319
+ merge(first, second) {
320
+ const value = second === void 0 ? first : second;
321
+
322
+ return normalizeSeverityToNumber(value);
323
+ },
324
+ validate(value) {
325
+ if (!ALLOWED_SEVERITIES.has(value)) {
326
+ throw new TypeError(
327
+ 'Expected one of: "error", "warn", "off", 0, 1, or 2.',
328
+ );
329
+ }
330
+ },
299
331
  };
300
332
 
301
333
  /** @type {ObjectPropertySchema} */
302
334
  const deepObjectAssignSchema = {
303
- merge(first = {}, second = {}) {
304
- return deepMerge(first, second);
305
- },
306
- validate: "object"
335
+ merge(first = {}, second = {}) {
336
+ return deepMerge(first, second);
337
+ },
338
+ validate: "object",
307
339
  };
308
340
 
309
341
  //-----------------------------------------------------------------------------
@@ -311,221 +343,194 @@ const deepObjectAssignSchema = {
311
343
  //-----------------------------------------------------------------------------
312
344
 
313
345
  /** @type {ObjectPropertySchema} */
314
- const globalsSchema = {
315
- merge: "assign",
316
- validate(value) {
317
-
318
- assertIsObject(value);
319
-
320
- for (const key of Object.keys(value)) {
321
-
322
- // avoid hairy edge case
323
- if (key === "__proto__") {
324
- continue;
325
- }
326
-
327
- if (key !== key.trim()) {
328
- throw new TypeError(`Global "${key}" has leading or trailing whitespace.`);
329
- }
330
-
331
- if (!globalVariablesValues.has(value[key])) {
332
- throw new TypeError(`Key "${key}": Expected "readonly", "writable", or "off".`);
333
- }
334
- }
335
- }
346
+ const languageOptionsSchema = {
347
+ merge(first = {}, second = {}) {
348
+ const result = deepMerge(first, second);
349
+
350
+ for (const [key, value] of Object.entries(result)) {
351
+ /*
352
+ * Special case: Because the `parser` property is an object, it should
353
+ * not be deep merged. Instead, it should be replaced if it exists in
354
+ * the second object. To make this more generic, we just check for
355
+ * objects with methods and replace them if they exist in the second
356
+ * object.
357
+ */
358
+ if (isNonArrayObject(value)) {
359
+ if (hasMethod(value)) {
360
+ result[key] = second[key] ?? first[key];
361
+ continue;
362
+ }
363
+
364
+ // for other objects, make sure we aren't reusing the same object
365
+ result[key] = { ...result[key] };
366
+ continue;
367
+ }
368
+ }
369
+
370
+ return result;
371
+ },
372
+ validate: "object",
336
373
  };
337
374
 
338
375
  /** @type {ObjectPropertySchema} */
339
- const parserSchema = {
340
- merge: "replace",
341
- validate(value) {
342
-
343
- if (!value || typeof value !== "object" ||
344
- (typeof value.parse !== "function" && typeof value.parseForESLint !== "function")
345
- ) {
346
- throw new TypeError("Expected object with parse() or parseForESLint() method.");
347
- }
348
-
349
- }
376
+ const languageSchema = {
377
+ merge: "replace",
378
+ validate: assertIsPluginMemberName,
350
379
  };
351
380
 
352
381
  /** @type {ObjectPropertySchema} */
353
382
  const pluginsSchema = {
354
- merge(first = {}, second = {}) {
355
- const keys = new Set([...Object.keys(first), ...Object.keys(second)]);
356
- const result = {};
357
-
358
- // manually validate that plugins are not redefined
359
- for (const key of keys) {
360
-
361
- // avoid hairy edge case
362
- if (key === "__proto__") {
363
- continue;
364
- }
365
-
366
- if (key in first && key in second && first[key] !== second[key]) {
367
- throw new TypeError(`Cannot redefine plugin "${key}".`);
368
- }
369
-
370
- result[key] = second[key] || first[key];
371
- }
372
-
373
- return result;
374
- },
375
- validate(value) {
376
-
377
- // first check the value to be sure it's an object
378
- if (value === null || typeof value !== "object") {
379
- throw new TypeError("Expected an object.");
380
- }
381
-
382
- // make sure it's not an array, which would mean eslintrc-style is used
383
- if (Array.isArray(value)) {
384
- throw new IncompatiblePluginsError(value);
385
- }
386
-
387
- // second check the keys to make sure they are objects
388
- for (const key of Object.keys(value)) {
389
-
390
- // avoid hairy edge case
391
- if (key === "__proto__") {
392
- continue;
393
- }
394
-
395
- if (value[key] === null || typeof value[key] !== "object") {
396
- throw new TypeError(`Key "${key}": Expected an object.`);
397
- }
398
- }
399
- }
383
+ merge(first = {}, second = {}) {
384
+ const keys = new Set([...Object.keys(first), ...Object.keys(second)]);
385
+ const result = {};
386
+
387
+ // manually validate that plugins are not redefined
388
+ for (const key of keys) {
389
+ // avoid hairy edge case
390
+ if (key === "__proto__") {
391
+ continue;
392
+ }
393
+
394
+ if (key in first && key in second && first[key] !== second[key]) {
395
+ throw new TypeError(`Cannot redefine plugin "${key}".`);
396
+ }
397
+
398
+ result[key] = second[key] || first[key];
399
+ }
400
+
401
+ return result;
402
+ },
403
+ validate(value) {
404
+ // first check the value to be sure it's an object
405
+ if (value === null || typeof value !== "object") {
406
+ throw new TypeError("Expected an object.");
407
+ }
408
+
409
+ // make sure it's not an array, which would mean eslintrc-style is used
410
+ if (Array.isArray(value)) {
411
+ throw new IncompatiblePluginsError(value);
412
+ }
413
+
414
+ // second check the keys to make sure they are objects
415
+ for (const key of Object.keys(value)) {
416
+ // avoid hairy edge case
417
+ if (key === "__proto__") {
418
+ continue;
419
+ }
420
+
421
+ if (value[key] === null || typeof value[key] !== "object") {
422
+ throw new TypeError(`Key "${key}": Expected an object.`);
423
+ }
424
+ }
425
+ },
400
426
  };
401
427
 
402
428
  /** @type {ObjectPropertySchema} */
403
429
  const processorSchema = {
404
- merge: "replace",
405
- validate(value) {
406
- if (typeof value === "string") {
407
- assertIsPluginMemberName(value);
408
- } else if (value && typeof value === "object") {
409
- if (typeof value.preprocess !== "function" || typeof value.postprocess !== "function") {
410
- throw new TypeError("Object must have a preprocess() and a postprocess() method.");
411
- }
412
- } else {
413
- throw new TypeError("Expected an object or a string.");
414
- }
415
- }
430
+ merge: "replace",
431
+ validate(value) {
432
+ if (typeof value === "string") {
433
+ assertIsPluginMemberName(value);
434
+ } else if (value && typeof value === "object") {
435
+ if (
436
+ typeof value.preprocess !== "function" ||
437
+ typeof value.postprocess !== "function"
438
+ ) {
439
+ throw new TypeError(
440
+ "Object must have a preprocess() and a postprocess() method.",
441
+ );
442
+ }
443
+ } else {
444
+ throw new TypeError("Expected an object or a string.");
445
+ }
446
+ },
416
447
  };
417
448
 
418
449
  /** @type {ObjectPropertySchema} */
419
450
  const rulesSchema = {
420
- merge(first = {}, second = {}) {
421
-
422
- const result = {
423
- ...first,
424
- ...second
425
- };
426
-
427
-
428
- for (const ruleId of Object.keys(result)) {
429
-
430
- try {
431
-
432
- // avoid hairy edge case
433
- if (ruleId === "__proto__") {
434
-
435
- /* eslint-disable-next-line no-proto -- Though deprecated, may still be present */
436
- delete result.__proto__;
437
- continue;
438
- }
439
-
440
- result[ruleId] = normalizeRuleOptions(result[ruleId]);
441
-
442
- /*
443
- * If either rule config is missing, then the correct
444
- * config is already present and we just need to normalize
445
- * the severity.
446
- */
447
- if (!(ruleId in first) || !(ruleId in second)) {
448
- continue;
449
- }
450
-
451
- const firstRuleOptions = normalizeRuleOptions(first[ruleId]);
452
- const secondRuleOptions = normalizeRuleOptions(second[ruleId]);
453
-
454
- /*
455
- * If the second rule config only has a severity (length of 1),
456
- * then use that severity and keep the rest of the options from
457
- * the first rule config.
458
- */
459
- if (secondRuleOptions.length === 1) {
460
- result[ruleId] = [secondRuleOptions[0], ...firstRuleOptions.slice(1)];
461
- continue;
462
- }
463
-
464
- /*
465
- * In any other situation, then the second rule config takes
466
- * precedence. That means the value at `result[ruleId]` is
467
- * already correct and no further work is necessary.
468
- */
469
- } catch (ex) {
470
- throw new Error(`Key "${ruleId}": ${ex.message}`, { cause: ex });
471
- }
472
-
473
- }
474
-
475
- return result;
476
-
477
-
478
- },
479
-
480
- validate(value) {
481
- assertIsObject(value);
482
-
483
- /*
484
- * We are not checking the rule schema here because there is no
485
- * guarantee that the rule definition is present at this point. Instead
486
- * we wait and check the rule schema during the finalization step
487
- * of calculating a config.
488
- */
489
- for (const ruleId of Object.keys(value)) {
490
-
491
- // avoid hairy edge case
492
- if (ruleId === "__proto__") {
493
- continue;
494
- }
495
-
496
- const ruleOptions = value[ruleId];
497
-
498
- assertIsRuleOptions(ruleId, ruleOptions);
499
-
500
- if (Array.isArray(ruleOptions)) {
501
- assertIsRuleSeverity(ruleId, ruleOptions[0]);
502
- } else {
503
- assertIsRuleSeverity(ruleId, ruleOptions);
504
- }
505
- }
506
- }
507
- };
508
-
509
- /** @type {ObjectPropertySchema} */
510
- const ecmaVersionSchema = {
511
- merge: "replace",
512
- validate(value) {
513
- if (typeof value === "number" || value === "latest") {
514
- return;
515
- }
516
-
517
- throw new TypeError("Expected a number or \"latest\".");
518
- }
519
- };
520
-
521
- /** @type {ObjectPropertySchema} */
522
- const sourceTypeSchema = {
523
- merge: "replace",
524
- validate(value) {
525
- if (typeof value !== "string" || !/^(?:script|module|commonjs)$/u.test(value)) {
526
- throw new TypeError("Expected \"script\", \"module\", or \"commonjs\".");
527
- }
528
- }
451
+ merge(first = {}, second = {}) {
452
+ const result = {
453
+ ...first,
454
+ ...second,
455
+ };
456
+
457
+ for (const ruleId of Object.keys(result)) {
458
+ try {
459
+ // avoid hairy edge case
460
+ if (ruleId === "__proto__") {
461
+ /* eslint-disable-next-line no-proto -- Though deprecated, may still be present */
462
+ delete result.__proto__;
463
+ continue;
464
+ }
465
+
466
+ result[ruleId] = normalizeRuleOptions(result[ruleId]);
467
+
468
+ /*
469
+ * If either rule config is missing, then the correct
470
+ * config is already present and we just need to normalize
471
+ * the severity.
472
+ */
473
+ if (!(ruleId in first) || !(ruleId in second)) {
474
+ continue;
475
+ }
476
+
477
+ const firstRuleOptions = normalizeRuleOptions(first[ruleId]);
478
+ const secondRuleOptions = normalizeRuleOptions(second[ruleId]);
479
+
480
+ /*
481
+ * If the second rule config only has a severity (length of 1),
482
+ * then use that severity and keep the rest of the options from
483
+ * the first rule config.
484
+ */
485
+ if (secondRuleOptions.length === 1) {
486
+ result[ruleId] = [
487
+ secondRuleOptions[0],
488
+ ...firstRuleOptions.slice(1),
489
+ ];
490
+ continue;
491
+ }
492
+
493
+ /*
494
+ * In any other situation, then the second rule config takes
495
+ * precedence. That means the value at `result[ruleId]` is
496
+ * already correct and no further work is necessary.
497
+ */
498
+ } catch (ex) {
499
+ throw new Error(`Key "${ruleId}": ${ex.message}`, {
500
+ cause: ex,
501
+ });
502
+ }
503
+ }
504
+
505
+ return result;
506
+ },
507
+
508
+ validate(value) {
509
+ assertIsObject(value);
510
+
511
+ /*
512
+ * We are not checking the rule schema here because there is no
513
+ * guarantee that the rule definition is present at this point. Instead
514
+ * we wait and check the rule schema during the finalization step
515
+ * of calculating a config.
516
+ */
517
+ for (const ruleId of Object.keys(value)) {
518
+ // avoid hairy edge case
519
+ if (ruleId === "__proto__") {
520
+ continue;
521
+ }
522
+
523
+ const ruleOptions = value[ruleId];
524
+
525
+ assertIsRuleOptions(ruleId, ruleOptions);
526
+
527
+ if (Array.isArray(ruleOptions)) {
528
+ assertIsRuleSeverity(ruleId, ruleOptions[0]);
529
+ } else {
530
+ assertIsRuleSeverity(ruleId, ruleOptions);
531
+ }
532
+ }
533
+ },
529
534
  };
530
535
 
531
536
  /**
@@ -535,25 +540,25 @@ const sourceTypeSchema = {
535
540
  * @returns {ObjectPropertySchema} The schema.
536
541
  */
537
542
  function createEslintrcErrorSchema(key) {
538
- return {
539
- merge: "replace",
540
- validate() {
541
- throw new IncompatibleKeyError(key);
542
- }
543
- };
543
+ return {
544
+ merge: "replace",
545
+ validate() {
546
+ throw new IncompatibleKeyError(key);
547
+ },
548
+ };
544
549
  }
545
550
 
546
551
  const eslintrcKeys = [
547
- "env",
548
- "extends",
549
- "globals",
550
- "ignorePatterns",
551
- "noInlineConfig",
552
- "overrides",
553
- "parser",
554
- "parserOptions",
555
- "reportUnusedDisableDirectives",
556
- "root"
552
+ "env",
553
+ "extends",
554
+ "globals",
555
+ "ignorePatterns",
556
+ "noInlineConfig",
557
+ "overrides",
558
+ "parser",
559
+ "parserOptions",
560
+ "reportUnusedDisableDirectives",
561
+ "root",
557
562
  ];
558
563
 
559
564
  //-----------------------------------------------------------------------------
@@ -561,30 +566,25 @@ const eslintrcKeys = [
561
566
  //-----------------------------------------------------------------------------
562
567
 
563
568
  const flatConfigSchema = {
564
-
565
- // eslintrc-style keys that should always error
566
- ...Object.fromEntries(eslintrcKeys.map(key => [key, createEslintrcErrorSchema(key)])),
567
-
568
- // flat config keys
569
- settings: deepObjectAssignSchema,
570
- linterOptions: {
571
- schema: {
572
- noInlineConfig: booleanSchema,
573
- reportUnusedDisableDirectives: disableDirectiveSeveritySchema
574
- }
575
- },
576
- languageOptions: {
577
- schema: {
578
- ecmaVersion: ecmaVersionSchema,
579
- sourceType: sourceTypeSchema,
580
- globals: globalsSchema,
581
- parser: parserSchema,
582
- parserOptions: deepObjectAssignSchema
583
- }
584
- },
585
- processor: processorSchema,
586
- plugins: pluginsSchema,
587
- rules: rulesSchema
569
+ // eslintrc-style keys that should always error
570
+ ...Object.fromEntries(
571
+ eslintrcKeys.map(key => [key, createEslintrcErrorSchema(key)]),
572
+ ),
573
+
574
+ // flat config keys
575
+ settings: deepObjectAssignSchema,
576
+ linterOptions: {
577
+ schema: {
578
+ noInlineConfig: booleanSchema,
579
+ reportUnusedDisableDirectives: disableDirectiveSeveritySchema,
580
+ reportUnusedInlineConfigs: unusedInlineConfigsSeveritySchema,
581
+ },
582
+ },
583
+ language: languageSchema,
584
+ languageOptions: languageOptionsSchema,
585
+ processor: processorSchema,
586
+ plugins: pluginsSchema,
587
+ rules: rulesSchema,
588
588
  };
589
589
 
590
590
  //-----------------------------------------------------------------------------
@@ -592,7 +592,7 @@ const flatConfigSchema = {
592
592
  //-----------------------------------------------------------------------------
593
593
 
594
594
  module.exports = {
595
- flatConfigSchema,
596
- assertIsRuleSeverity,
597
- assertIsRuleOptions
595
+ flatConfigSchema,
596
+ hasMethod,
597
+ assertIsRuleSeverity,
598
598
  };