eslint 9.17.0 → 9.18.0

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 (63) hide show
  1. package/README.md +2 -2
  2. package/lib/cli.js +3 -4
  3. package/lib/config/config-loader.js +9 -22
  4. package/lib/eslint/eslint.js +2 -5
  5. package/lib/rules/arrow-body-style.js +1 -0
  6. package/lib/rules/camelcase.js +1 -0
  7. package/lib/rules/capitalized-comments.js +1 -0
  8. package/lib/rules/consistent-this.js +1 -0
  9. package/lib/rules/curly.js +1 -0
  10. package/lib/rules/default-case-last.js +2 -2
  11. package/lib/rules/default-param-last.js +1 -0
  12. package/lib/rules/dot-notation.js +1 -0
  13. package/lib/rules/func-name-matching.js +1 -0
  14. package/lib/rules/func-style.js +1 -0
  15. package/lib/rules/id-denylist.js +1 -0
  16. package/lib/rules/id-length.js +1 -0
  17. package/lib/rules/id-match.js +1 -0
  18. package/lib/rules/init-declarations.js +1 -0
  19. package/lib/rules/logical-assignment-operators.js +1 -0
  20. package/lib/rules/no-console.js +3 -1
  21. package/lib/rules/no-continue.js +1 -0
  22. package/lib/rules/no-div-regex.js +1 -0
  23. package/lib/rules/no-else-return.js +1 -0
  24. package/lib/rules/no-extra-boolean-cast.js +1 -0
  25. package/lib/rules/no-extra-label.js +1 -0
  26. package/lib/rules/no-implicit-coercion.js +1 -0
  27. package/lib/rules/no-inline-comments.js +1 -0
  28. package/lib/rules/no-label-var.js +1 -0
  29. package/lib/rules/no-labels.js +1 -0
  30. package/lib/rules/no-lonely-if.js +1 -0
  31. package/lib/rules/no-magic-numbers.js +1 -0
  32. package/lib/rules/no-multi-str.js +1 -0
  33. package/lib/rules/no-negated-condition.js +1 -0
  34. package/lib/rules/no-nested-ternary.js +1 -0
  35. package/lib/rules/no-plusplus.js +1 -0
  36. package/lib/rules/no-shadow-restricted-names.js +17 -7
  37. package/lib/rules/no-ternary.js +1 -0
  38. package/lib/rules/no-undef-init.js +1 -0
  39. package/lib/rules/no-undefined.js +1 -0
  40. package/lib/rules/no-underscore-dangle.js +1 -0
  41. package/lib/rules/no-unneeded-ternary.js +1 -0
  42. package/lib/rules/no-useless-computed-key.js +1 -0
  43. package/lib/rules/no-useless-concat.js +1 -0
  44. package/lib/rules/no-void.js +1 -0
  45. package/lib/rules/no-warning-comments.js +1 -0
  46. package/lib/rules/object-shorthand.js +1 -0
  47. package/lib/rules/one-var.js +1 -0
  48. package/lib/rules/operator-assignment.js +1 -0
  49. package/lib/rules/prefer-arrow-callback.js +1 -0
  50. package/lib/rules/prefer-destructuring.js +1 -0
  51. package/lib/rules/prefer-exponentiation-operator.js +1 -0
  52. package/lib/rules/prefer-numeric-literals.js +1 -0
  53. package/lib/rules/prefer-object-spread.js +1 -0
  54. package/lib/rules/prefer-spread.js +1 -0
  55. package/lib/rules/prefer-template.js +1 -0
  56. package/lib/rules/sort-imports.js +3 -2
  57. package/lib/rules/sort-keys.js +1 -0
  58. package/lib/rules/sort-vars.js +1 -0
  59. package/lib/rules/vars-on-top.js +1 -0
  60. package/lib/rules/yoda.js +1 -0
  61. package/lib/shared/flags.js +3 -3
  62. package/lib/types/index.d.ts +1 -1
  63. package/package.json +5 -5
package/README.md CHANGED
@@ -299,8 +299,8 @@ to get your logo on our READMEs and [website](https://eslint.org/sponsors).
299
299
  <h3>Platinum Sponsors</h3>
300
300
  <p><a href="https://automattic.com"><img src="https://images.opencollective.com/automattic/d0ef3e1/logo.png" alt="Automattic" height="128"></a> <a href="https://www.airbnb.com/"><img src="https://images.opencollective.com/airbnb/d327d66/logo.png" alt="Airbnb" height="128"></a></p><h3>Gold Sponsors</h3>
301
301
  <p><a href="https://trunk.io/"><img src="https://images.opencollective.com/trunkio/fb92d60/avatar.png" alt="trunk.io" height="96"></a></p><h3>Silver Sponsors</h3>
302
- <p><a href="https://www.serptriumph.com/"><img src="https://images.opencollective.com/serp-triumph5/fea3074/logo.png" alt="SERP Triumph" height="64"></a> <a href="https://www.jetbrains.com/"><img src="https://images.opencollective.com/jetbrains/fe76f99/logo.png" alt="JetBrains" height="64"></a> <a href="https://liftoff.io/"><img src="https://images.opencollective.com/liftoff/5c4fa84/logo.png" alt="Liftoff" height="64"></a> <a href="https://americanexpress.io"><img src="https://avatars.githubusercontent.com/u/3853301?v=4" alt="American Express" height="64"></a> <a href="https://www.workleap.com"><img src="https://avatars.githubusercontent.com/u/53535748?u=d1e55d7661d724bf2281c1bfd33cb8f99fe2465f&v=4" alt="Workleap" height="64"></a></p><h3>Bronze Sponsors</h3>
303
- <p><a href="https://cybozu.co.jp/"><img src="https://images.opencollective.com/cybozu/933e46d/logo.png" alt="Cybozu" height="32"></a> <a href="https://syntax.fm"><img src="https://github.com/syntaxfm.png" alt="Syntax" height="32"></a> <a href="https://www.wordhint.net/"><img src="https://images.opencollective.com/wordhint/be86813/avatar.png" alt="WordHint" height="32"></a> <a href="https://www.crosswordsolver.org/anagram-solver/"><img src="https://images.opencollective.com/anagram-solver/2666271/logo.png" alt="Anagram Solver" height="32"></a> <a href="https://icons8.com/"><img src="https://images.opencollective.com/icons8/7fa1641/logo.png" alt="Icons8" height="32"></a> <a href="https://discord.com"><img src="https://images.opencollective.com/discordapp/f9645d9/logo.png" alt="Discord" height="32"></a> <a href="https://www.gitbook.com"><img src="https://avatars.githubusercontent.com/u/7111340?v=4" alt="GitBook" height="32"></a> <a href="https://nx.dev"><img src="https://avatars.githubusercontent.com/u/23692104?v=4" alt="Nx" height="32"></a> <a href="https://opensource.mercedes-benz.com/"><img src="https://avatars.githubusercontent.com/u/34240465?v=4" alt="Mercedes-Benz Group" height="32"></a> <a href="https://herocoders.com"><img src="https://avatars.githubusercontent.com/u/37549774?v=4" alt="HeroCoders" height="32"></a></p>
302
+ <p><a href="https://www.serptriumph.com/"><img src="https://images.opencollective.com/serp-triumph5/fea3074/logo.png" alt="SERP Triumph" height="64"></a> <a href="https://www.jetbrains.com/"><img src="https://images.opencollective.com/jetbrains/fe76f99/logo.png" alt="JetBrains" height="64"></a> <a href="https://liftoff.io/"><img src="https://images.opencollective.com/liftoff/5c4fa84/logo.png" alt="Liftoff" height="64"></a> <a href="https://americanexpress.io"><img src="https://avatars.githubusercontent.com/u/3853301" alt="American Express" height="64"></a></p><h3>Bronze Sponsors</h3>
303
+ <p><a href="https://cybozu.co.jp/"><img src="https://images.opencollective.com/cybozu/933e46d/logo.png" alt="Cybozu" height="32"></a> <a href="https://www.crosswordsolver.org/anagram-solver/"><img src="https://images.opencollective.com/anagram-solver/2666271/logo.png" alt="Anagram Solver" height="32"></a> <a href="https://icons8.com/"><img src="https://images.opencollective.com/icons8/7fa1641/logo.png" alt="Icons8" height="32"></a> <a href="https://discord.com"><img src="https://images.opencollective.com/discordapp/f9645d9/logo.png" alt="Discord" height="32"></a> <a href="https://www.gitbook.com"><img src="https://avatars.githubusercontent.com/u/7111340" alt="GitBook" height="32"></a> <a href="https://nx.dev"><img src="https://avatars.githubusercontent.com/u/23692104" alt="Nx" height="32"></a> <a href="https://opensource.mercedes-benz.com/"><img src="https://avatars.githubusercontent.com/u/34240465" alt="Mercedes-Benz Group" height="32"></a> <a href="https://herocoders.com"><img src="https://avatars.githubusercontent.com/u/37549774" alt="HeroCoders" height="32"></a></p>
304
304
  <h3>Technology Sponsors</h3>
305
305
  Technology sponsors allow us to use their products and services for free as part of a contribution to the open source ecosystem and our work.
306
306
  <p><a href="https://netlify.com"><img src="https://raw.githubusercontent.com/eslint/eslint.org/main/src/assets/images/techsponsors/netlify-icon.svg" alt="Netlify" height="32"></a> <a href="https://algolia.com"><img src="https://raw.githubusercontent.com/eslint/eslint.org/main/src/assets/images/techsponsors/algolia-icon.svg" alt="Algolia" height="32"></a> <a href="https://1password.com"><img src="https://raw.githubusercontent.com/eslint/eslint.org/main/src/assets/images/techsponsors/1password-icon.svg" alt="1Password" height="32"></a></p>
package/lib/cli.js CHANGED
@@ -341,16 +341,15 @@ const cli = {
341
341
  /**
342
342
  * Calculates the command string for the --inspect-config operation.
343
343
  * @param {string} configFile The path to the config file to inspect.
344
- * @param {boolean} hasUnstableTSConfigFlag `true` if the `unstable_ts_config` flag is enabled, `false` if it's not.
345
344
  * @returns {Promise<string>} The command string to execute.
346
345
  */
347
- async calculateInspectConfigFlags(configFile, hasUnstableTSConfigFlag) {
346
+ async calculateInspectConfigFlags(configFile) {
348
347
 
349
348
  // find the config file
350
349
  const {
351
350
  configFilePath,
352
351
  basePath
353
- } = await locateConfigFileToUse({ cwd: process.cwd(), configFile }, hasUnstableTSConfigFlag);
352
+ } = await locateConfigFileToUse({ cwd: process.cwd(), configFile });
354
353
 
355
354
  return ["--config", configFilePath, "--basePath", basePath];
356
355
  },
@@ -451,7 +450,7 @@ const cli = {
451
450
  try {
452
451
  const flatOptions = await translateOptions(options, "flat");
453
452
  const spawn = require("cross-spawn");
454
- const flags = await cli.calculateInspectConfigFlags(flatOptions.overrideConfigFile, flatOptions.flags ? flatOptions.flags.includes("unstable_ts_config") : false);
453
+ const flags = await cli.calculateInspectConfigFlags(flatOptions.overrideConfigFile);
455
454
 
456
455
  spawn.sync("npx", ["@eslint/config-inspector@latest", ...flags], { encoding: "utf8", stdio: "inherit" });
457
456
  } catch (error) {
@@ -31,7 +31,6 @@ const { FlatConfigArray } = require("./flat-config-array");
31
31
  * @property {Array<FlatConfigObject>} [defaultConfigs] The default configs to use.
32
32
  * @property {Array<string>} [ignorePatterns] The ignore patterns to use.
33
33
  * @property {FlatConfigObject|Array<FlatConfigObject>} overrideConfig The override config to use.
34
- * @property {boolean} allowTS Indicates if TypeScript configuration files are allowed.
35
34
  */
36
35
 
37
36
  //------------------------------------------------------------------------------
@@ -41,10 +40,7 @@ const { FlatConfigArray } = require("./flat-config-array");
41
40
  const FLAT_CONFIG_FILENAMES = [
42
41
  "eslint.config.js",
43
42
  "eslint.config.mjs",
44
- "eslint.config.cjs"
45
- ];
46
-
47
- const TS_FLAT_CONFIG_FILENAMES = [
43
+ "eslint.config.cjs",
48
44
  "eslint.config.ts",
49
45
  "eslint.config.mts",
50
46
  "eslint.config.cts"
@@ -119,10 +115,9 @@ function isRunningInDeno() {
119
115
  /**
120
116
  * Load the config array from the given filename.
121
117
  * @param {string} filePath The filename to load from.
122
- * @param {boolean} allowTS Indicates if TypeScript configuration files are allowed.
123
118
  * @returns {Promise<any>} The config loaded from the config file.
124
119
  */
125
- async function loadConfigFile(filePath, allowTS) {
120
+ async function loadConfigFile(filePath) {
126
121
 
127
122
  debug(`Loading config from ${filePath}`);
128
123
 
@@ -171,7 +166,7 @@ async function loadConfigFile(filePath, allowTS) {
171
166
  *
172
167
  * When Node.js supports native TypeScript imports, we can remove this check.
173
168
  */
174
- if (allowTS && isTS && !isDeno && !isBun) {
169
+ if (isTS && !isDeno && !isBun) {
175
170
 
176
171
  // eslint-disable-next-line no-use-before-define -- `ConfigLoader.loadJiti` can be overwritten for testing
177
172
  const { createJiti } = await ConfigLoader.loadJiti().catch(() => {
@@ -261,8 +256,7 @@ class ConfigLoader {
261
256
  const resultPromise = ConfigLoader.locateConfigFileToUse({
262
257
  useConfigFile: this.#options.configFile,
263
258
  cwd: this.#options.cwd,
264
- fromDirectory,
265
- allowTS: this.#options.allowTS
259
+ fromDirectory
266
260
  });
267
261
 
268
262
  // ensure `ConfigLoader.locateConfigFileToUse` is called only once for `fromDirectory`
@@ -443,15 +437,10 @@ class ConfigLoader {
443
437
  * @param {string|false|undefined} options.useConfigFile The path to the config file to use.
444
438
  * @param {string} options.cwd Path to a directory that should be considered as the current working directory.
445
439
  * @param {string} [options.fromDirectory] The directory from which to start searching. Defaults to `cwd`.
446
- * @param {boolean} options.allowTS Indicates if TypeScript configuration files are allowed.
447
440
  * @returns {Promise<{configFilePath:string|undefined,basePath:string}>} Location information for
448
441
  * the config file.
449
442
  */
450
- static async locateConfigFileToUse({ useConfigFile, cwd, fromDirectory = cwd, allowTS }) {
451
-
452
- const configFilenames = allowTS
453
- ? [...FLAT_CONFIG_FILENAMES, ...TS_FLAT_CONFIG_FILENAMES]
454
- : FLAT_CONFIG_FILENAMES;
443
+ static async locateConfigFileToUse({ useConfigFile, cwd, fromDirectory = cwd }) {
455
444
 
456
445
  // determine where to load config file from
457
446
  let configFilePath;
@@ -464,7 +453,7 @@ class ConfigLoader {
464
453
  } else if (useConfigFile !== false) {
465
454
  debug("Searching for eslint.config.js");
466
455
  configFilePath = await findUp(
467
- configFilenames,
456
+ FLAT_CONFIG_FILENAMES,
468
457
  { cwd: fromDirectory }
469
458
  );
470
459
 
@@ -497,8 +486,7 @@ class ConfigLoader {
497
486
  ignoreEnabled,
498
487
  ignorePatterns,
499
488
  overrideConfig,
500
- defaultConfigs = [],
501
- allowTS
489
+ defaultConfigs = []
502
490
  } = options;
503
491
 
504
492
  debug(`Calculating config array from config file ${configFilePath} and base path ${basePath}`);
@@ -509,7 +497,7 @@ class ConfigLoader {
509
497
  if (configFilePath) {
510
498
 
511
499
  debug(`Loading config file ${configFilePath}`);
512
- const fileConfig = await loadConfigFile(configFilePath, allowTS);
500
+ const fileConfig = await loadConfigFile(configFilePath);
513
501
 
514
502
  if (Array.isArray(fileConfig)) {
515
503
  configs.push(...fileConfig);
@@ -618,8 +606,7 @@ class LegacyConfigLoader extends ConfigLoader {
618
606
  if (!this.#configFilePath) {
619
607
  this.#configFilePath = ConfigLoader.locateConfigFileToUse({
620
608
  useConfigFile: this.#options.configFile,
621
- cwd: this.#options.cwd,
622
- allowTS: this.#options.allowTS
609
+ cwd: this.#options.cwd
623
610
  });
624
611
  }
625
612
 
@@ -266,15 +266,13 @@ function compareResultsByFilePath(a, b) {
266
266
  * This function is used primarily by the `--inspect-config` option. For now,
267
267
  * we will maintain the existing behavior, which is to search up from the cwd.
268
268
  * @param {ESLintOptions} options The ESLint instance options.
269
- * @param {boolean} allowTS `true` if the `unstable_ts_config` flag is enabled, `false` if it's not.
270
269
  * @returns {Promise<{configFilePath:string|undefined;basePath:string}>} Location information for
271
270
  * the config file.
272
271
  */
273
- async function locateConfigFileToUse({ configFile, cwd }, allowTS) {
272
+ async function locateConfigFileToUse({ configFile, cwd }) {
274
273
 
275
274
  const configLoader = new ConfigLoader({
276
275
  cwd,
277
- allowTS,
278
276
  configFile
279
277
  });
280
278
 
@@ -469,8 +467,7 @@ class ESLint {
469
467
  configFile: processedOptions.configFile,
470
468
  ignoreEnabled: processedOptions.ignore,
471
469
  ignorePatterns: processedOptions.ignorePatterns,
472
- defaultConfigs,
473
- allowTS: processedOptions.flags.includes("unstable_ts_config")
470
+ defaultConfigs
474
471
  };
475
472
 
476
473
  this.#configLoader = processedOptions.flags.includes("unstable_config_lookup_from_file")
@@ -24,6 +24,7 @@ module.exports = {
24
24
  docs: {
25
25
  description: "Require braces around arrow function bodies",
26
26
  recommended: false,
27
+ frozen: true,
27
28
  url: "https://eslint.org/docs/latest/rules/arrow-body-style"
28
29
  },
29
30
 
@@ -31,6 +31,7 @@ module.exports = {
31
31
  docs: {
32
32
  description: "Enforce camelcase naming convention",
33
33
  recommended: false,
34
+ frozen: true,
34
35
  url: "https://eslint.org/docs/latest/rules/camelcase"
35
36
  },
36
37
 
@@ -107,6 +107,7 @@ module.exports = {
107
107
  docs: {
108
108
  description: "Enforce or disallow capitalization of the first letter of a comment",
109
109
  recommended: false,
110
+ frozen: true,
110
111
  url: "https://eslint.org/docs/latest/rules/capitalized-comments"
111
112
  },
112
113
 
@@ -16,6 +16,7 @@ module.exports = {
16
16
  docs: {
17
17
  description: "Enforce consistent naming when capturing the current execution context",
18
18
  recommended: false,
19
+ frozen: true,
19
20
  url: "https://eslint.org/docs/latest/rules/consistent-this"
20
21
  },
21
22
 
@@ -22,6 +22,7 @@ module.exports = {
22
22
  docs: {
23
23
  description: "Enforce consistent brace style for all control statements",
24
24
  recommended: false,
25
+ frozen: true,
25
26
  url: "https://eslint.org/docs/latest/rules/curly"
26
27
  },
27
28
 
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @fileoverview Rule to enforce `default` clauses in switch statements to be last
2
+ * @fileoverview Rule to enforce `default` clauses in `switch` statements to be last
3
3
  * @author Milos Djermanovic
4
4
  */
5
5
 
@@ -15,7 +15,7 @@ module.exports = {
15
15
  type: "suggestion",
16
16
 
17
17
  docs: {
18
- description: "Enforce `default` clauses in switch statements to be last",
18
+ description: "Enforce `default` clauses in `switch` statements to be last",
19
19
  recommended: false,
20
20
  url: "https://eslint.org/docs/latest/rules/default-case-last"
21
21
  },
@@ -13,6 +13,7 @@ module.exports = {
13
13
  docs: {
14
14
  description: "Enforce default parameters to be last",
15
15
  recommended: false,
16
+ frozen: true,
16
17
  url: "https://eslint.org/docs/latest/rules/default-param-last"
17
18
  },
18
19
 
@@ -33,6 +33,7 @@ module.exports = {
33
33
  docs: {
34
34
  description: "Enforce dot notation whenever possible",
35
35
  recommended: false,
36
+ frozen: true,
36
37
  url: "https://eslint.org/docs/latest/rules/dot-notation"
37
38
  },
38
39
 
@@ -76,6 +76,7 @@ module.exports = {
76
76
  docs: {
77
77
  description: "Require function names to match the name of the variable or property to which they are assigned",
78
78
  recommended: false,
79
+ frozen: true,
79
80
  url: "https://eslint.org/docs/latest/rules/func-name-matching"
80
81
  },
81
82
 
@@ -21,6 +21,7 @@ module.exports = {
21
21
  docs: {
22
22
  description: "Enforce the consistent use of either `function` declarations or expressions assigned to variables",
23
23
  recommended: false,
24
+ frozen: true,
24
25
  url: "https://eslint.org/docs/latest/rules/func-style"
25
26
  },
26
27
 
@@ -109,6 +109,7 @@ module.exports = {
109
109
  docs: {
110
110
  description: "Disallow specified identifiers",
111
111
  recommended: false,
112
+ frozen: true,
112
113
  url: "https://eslint.org/docs/latest/rules/id-denylist"
113
114
  },
114
115
 
@@ -32,6 +32,7 @@ module.exports = {
32
32
  docs: {
33
33
  description: "Enforce minimum and maximum identifier lengths",
34
34
  recommended: false,
35
+ frozen: true,
35
36
  url: "https://eslint.org/docs/latest/rules/id-length"
36
37
  },
37
38
 
@@ -30,6 +30,7 @@ module.exports = {
30
30
  docs: {
31
31
  description: "Require identifiers to match a specified regular expression",
32
32
  recommended: false,
33
+ frozen: true,
33
34
  url: "https://eslint.org/docs/latest/rules/id-match"
34
35
  },
35
36
 
@@ -50,6 +50,7 @@ module.exports = {
50
50
  docs: {
51
51
  description: "Require or disallow initialization in variable declarations",
52
52
  recommended: false,
53
+ frozen: true,
53
54
  url: "https://eslint.org/docs/latest/rules/init-declarations"
54
55
  },
55
56
 
@@ -186,6 +186,7 @@ module.exports = {
186
186
  docs: {
187
187
  description: "Require or disallow logical assignment operator shorthand",
188
188
  recommended: false,
189
+ frozen: true,
189
190
  url: "https://eslint.org/docs/latest/rules/logical-assignment-operators"
190
191
  },
191
192
 
@@ -49,6 +49,7 @@ module.exports = {
49
49
 
50
50
  messages: {
51
51
  unexpected: "Unexpected console statement.",
52
+ limited: "Unexpected console statement. Only these console methods are allowed: {{ allowed }}.",
52
53
  removeConsole: "Remove the console.{{ propertyName }}()."
53
54
  }
54
55
  },
@@ -169,7 +170,8 @@ module.exports = {
169
170
  context.report({
170
171
  node,
171
172
  loc: node.loc,
172
- messageId: "unexpected",
173
+ messageId: allowed.length ? "limited" : "unexpected",
174
+ data: { allowed: allowed.join(", ") },
173
175
  suggest: canProvideSuggestions(node)
174
176
  ? [{
175
177
  messageId: "removeConsole",
@@ -17,6 +17,7 @@ module.exports = {
17
17
  docs: {
18
18
  description: "Disallow `continue` statements",
19
19
  recommended: false,
20
+ frozen: true,
20
21
  url: "https://eslint.org/docs/latest/rules/no-continue"
21
22
  },
22
23
 
@@ -17,6 +17,7 @@ module.exports = {
17
17
  docs: {
18
18
  description: "Disallow equal signs explicitly at the beginning of regular expressions",
19
19
  recommended: false,
20
+ frozen: true,
20
21
  url: "https://eslint.org/docs/latest/rules/no-div-regex"
21
22
  },
22
23
 
@@ -26,6 +26,7 @@ module.exports = {
26
26
  docs: {
27
27
  description: "Disallow `else` blocks after `return` statements in `if` statements",
28
28
  recommended: false,
29
+ frozen: true,
29
30
  url: "https://eslint.org/docs/latest/rules/no-else-return"
30
31
  },
31
32
 
@@ -28,6 +28,7 @@ module.exports = {
28
28
  docs: {
29
29
  description: "Disallow unnecessary boolean casts",
30
30
  recommended: true,
31
+ frozen: true,
31
32
  url: "https://eslint.org/docs/latest/rules/no-extra-boolean-cast"
32
33
  },
33
34
 
@@ -23,6 +23,7 @@ module.exports = {
23
23
  docs: {
24
24
  description: "Disallow unnecessary labels",
25
25
  recommended: false,
26
+ frozen: true,
26
27
  url: "https://eslint.org/docs/latest/rules/no-extra-label"
27
28
  },
28
29
 
@@ -179,6 +179,7 @@ module.exports = {
179
179
  docs: {
180
180
  description: "Disallow shorthand type conversions",
181
181
  recommended: false,
182
+ frozen: true,
182
183
  url: "https://eslint.org/docs/latest/rules/no-implicit-coercion"
183
184
  },
184
185
 
@@ -20,6 +20,7 @@ module.exports = {
20
20
  docs: {
21
21
  description: "Disallow inline comments after code",
22
22
  recommended: false,
23
+ frozen: true,
23
24
  url: "https://eslint.org/docs/latest/rules/no-inline-comments"
24
25
  },
25
26
 
@@ -23,6 +23,7 @@ module.exports = {
23
23
  docs: {
24
24
  description: "Disallow labels that share a name with a variable",
25
25
  recommended: false,
26
+ frozen: true,
26
27
  url: "https://eslint.org/docs/latest/rules/no-label-var"
27
28
  },
28
29
 
@@ -27,6 +27,7 @@ module.exports = {
27
27
  docs: {
28
28
  description: "Disallow labeled statements",
29
29
  recommended: false,
30
+ frozen: true,
30
31
  url: "https://eslint.org/docs/latest/rules/no-labels"
31
32
  },
32
33
 
@@ -22,6 +22,7 @@ module.exports = {
22
22
  docs: {
23
23
  description: "Disallow `if` statements as the only statement in `else` blocks",
24
24
  recommended: false,
25
+ frozen: true,
25
26
  url: "https://eslint.org/docs/latest/rules/no-lonely-if"
26
27
  },
27
28
 
@@ -34,6 +34,7 @@ module.exports = {
34
34
  docs: {
35
35
  description: "Disallow magic numbers",
36
36
  recommended: false,
37
+ frozen: true,
37
38
  url: "https://eslint.org/docs/latest/rules/no-magic-numbers"
38
39
  },
39
40
 
@@ -23,6 +23,7 @@ module.exports = {
23
23
  docs: {
24
24
  description: "Disallow multiline strings",
25
25
  recommended: false,
26
+ frozen: true,
26
27
  url: "https://eslint.org/docs/latest/rules/no-multi-str"
27
28
  },
28
29
 
@@ -16,6 +16,7 @@ module.exports = {
16
16
  docs: {
17
17
  description: "Disallow negated conditions",
18
18
  recommended: false,
19
+ frozen: true,
19
20
  url: "https://eslint.org/docs/latest/rules/no-negated-condition"
20
21
  },
21
22
 
@@ -17,6 +17,7 @@ module.exports = {
17
17
  docs: {
18
18
  description: "Disallow nested ternary expressions",
19
19
  recommended: false,
20
+ frozen: true,
20
21
  url: "https://eslint.org/docs/latest/rules/no-nested-ternary"
21
22
  },
22
23
 
@@ -57,6 +57,7 @@ module.exports = {
57
57
  docs: {
58
58
  description: "Disallow the unary operators `++` and `--`",
59
59
  recommended: false,
60
+ frozen: true,
60
61
  url: "https://eslint.org/docs/latest/rules/no-plusplus"
61
62
  },
62
63
 
@@ -45,17 +45,27 @@ module.exports = {
45
45
  const RESTRICTED = new Set(["undefined", "NaN", "Infinity", "arguments", "eval"]);
46
46
  const sourceCode = context.sourceCode;
47
47
 
48
+ // Track reported nodes to avoid duplicate reports. For example, on class declarations.
49
+ const reportedNodes = new Set();
50
+
48
51
  return {
49
- "VariableDeclaration, :function, CatchClause"(node) {
52
+ "VariableDeclaration, :function, CatchClause, ImportDeclaration, ClassDeclaration, ClassExpression"(node) {
50
53
  for (const variable of sourceCode.getDeclaredVariables(node)) {
51
54
  if (variable.defs.length > 0 && RESTRICTED.has(variable.name) && !safelyShadowsUndefined(variable)) {
52
- context.report({
53
- node: variable.defs[0].name,
54
- messageId: "shadowingRestrictedName",
55
- data: {
56
- name: variable.name
55
+ for (const def of variable.defs) {
56
+ const nodeToReport = def.name;
57
+
58
+ if (!reportedNodes.has(nodeToReport)) {
59
+ reportedNodes.add(nodeToReport);
60
+ context.report({
61
+ node: nodeToReport,
62
+ messageId: "shadowingRestrictedName",
63
+ data: {
64
+ name: variable.name
65
+ }
66
+ });
57
67
  }
58
- });
68
+ }
59
69
  }
60
70
  }
61
71
  }
@@ -17,6 +17,7 @@ module.exports = {
17
17
  docs: {
18
18
  description: "Disallow ternary operators",
19
19
  recommended: false,
20
+ frozen: true,
20
21
  url: "https://eslint.org/docs/latest/rules/no-ternary"
21
22
  },
22
23
 
@@ -19,6 +19,7 @@ module.exports = {
19
19
  docs: {
20
20
  description: "Disallow initializing variables to `undefined`",
21
21
  recommended: false,
22
+ frozen: true,
22
23
  url: "https://eslint.org/docs/latest/rules/no-undef-init"
23
24
  },
24
25
 
@@ -16,6 +16,7 @@ module.exports = {
16
16
  docs: {
17
17
  description: "Disallow the use of `undefined` as an identifier",
18
18
  recommended: false,
19
+ frozen: true,
19
20
  url: "https://eslint.org/docs/latest/rules/no-undefined"
20
21
  },
21
22
 
@@ -29,6 +29,7 @@ module.exports = {
29
29
  docs: {
30
30
  description: "Disallow dangling underscores in identifiers",
31
31
  recommended: false,
32
+ frozen: true,
32
33
  url: "https://eslint.org/docs/latest/rules/no-underscore-dangle"
33
34
  },
34
35
 
@@ -33,6 +33,7 @@ module.exports = {
33
33
  docs: {
34
34
  description: "Disallow ternary operators when simpler alternatives exist",
35
35
  recommended: false,
36
+ frozen: true,
36
37
  url: "https://eslint.org/docs/latest/rules/no-unneeded-ternary"
37
38
  },
38
39
 
@@ -100,6 +100,7 @@ module.exports = {
100
100
  docs: {
101
101
  description: "Disallow unnecessary computed property keys in objects and classes",
102
102
  recommended: false,
103
+ frozen: true,
103
104
  url: "https://eslint.org/docs/latest/rules/no-useless-computed-key"
104
105
  },
105
106
 
@@ -72,6 +72,7 @@ module.exports = {
72
72
  docs: {
73
73
  description: "Disallow unnecessary concatenation of literals or template literals",
74
74
  recommended: false,
75
+ frozen: true,
75
76
  url: "https://eslint.org/docs/latest/rules/no-useless-concat"
76
77
  },
77
78
 
@@ -20,6 +20,7 @@ module.exports = {
20
20
  docs: {
21
21
  description: "Disallow `void` operators",
22
22
  recommended: false,
23
+ frozen: true,
23
24
  url: "https://eslint.org/docs/latest/rules/no-void"
24
25
  },
25
26
 
@@ -27,6 +27,7 @@ module.exports = {
27
27
  docs: {
28
28
  description: "Disallow specified warning terms in comments",
29
29
  recommended: false,
30
+ frozen: true,
30
31
  url: "https://eslint.org/docs/latest/rules/no-warning-comments"
31
32
  },
32
33
 
@@ -30,6 +30,7 @@ module.exports = {
30
30
  docs: {
31
31
  description: "Require or disallow method and property shorthand syntax for object literals",
32
32
  recommended: false,
33
+ frozen: true,
33
34
  url: "https://eslint.org/docs/latest/rules/object-shorthand"
34
35
  },
35
36
 
@@ -36,6 +36,7 @@ module.exports = {
36
36
  docs: {
37
37
  description: "Enforce variables to be declared either together or separately in functions",
38
38
  recommended: false,
39
+ frozen: true,
39
40
  url: "https://eslint.org/docs/latest/rules/one-var"
40
41
  },
41
42
 
@@ -67,6 +67,7 @@ module.exports = {
67
67
  docs: {
68
68
  description: "Require or disallow assignment operator shorthand where possible",
69
69
  recommended: false,
70
+ frozen: true,
70
71
  url: "https://eslint.org/docs/latest/rules/operator-assignment"
71
72
  },
72
73
 
@@ -155,6 +155,7 @@ module.exports = {
155
155
  docs: {
156
156
  description: "Require using arrow functions for callbacks",
157
157
  recommended: false,
158
+ frozen: true,
158
159
  url: "https://eslint.org/docs/latest/rules/prefer-arrow-callback"
159
160
  },
160
161
 
@@ -28,6 +28,7 @@ module.exports = {
28
28
  docs: {
29
29
  description: "Require destructuring from arrays and/or objects",
30
30
  recommended: false,
31
+ frozen: true,
31
32
  url: "https://eslint.org/docs/latest/rules/prefer-destructuring"
32
33
  },
33
34
 
@@ -93,6 +93,7 @@ module.exports = {
93
93
  docs: {
94
94
  description: "Disallow the use of `Math.pow` in favor of the `**` operator",
95
95
  recommended: false,
96
+ frozen: true,
96
97
  url: "https://eslint.org/docs/latest/rules/prefer-exponentiation-operator"
97
98
  },
98
99
 
@@ -47,6 +47,7 @@ module.exports = {
47
47
  docs: {
48
48
  description: "Disallow `parseInt()` and `Number.parseInt()` in favor of binary, octal, and hexadecimal literals",
49
49
  recommended: false,
50
+ frozen: true,
50
51
  url: "https://eslint.org/docs/latest/rules/prefer-numeric-literals"
51
52
  },
52
53
 
@@ -248,6 +248,7 @@ module.exports = {
248
248
  description:
249
249
  "Disallow using `Object.assign` with an object literal as the first argument and prefer the use of object spread instead",
250
250
  recommended: false,
251
+ frozen: true,
251
252
  url: "https://eslint.org/docs/latest/rules/prefer-object-spread"
252
253
  },
253
254
 
@@ -51,6 +51,7 @@ module.exports = {
51
51
  docs: {
52
52
  description: "Require spread operators instead of `.apply()`",
53
53
  recommended: false,
54
+ frozen: true,
54
55
  url: "https://eslint.org/docs/latest/rules/prefer-spread"
55
56
  },
56
57
 
@@ -130,6 +130,7 @@ module.exports = {
130
130
  docs: {
131
131
  description: "Require template literals instead of string concatenation",
132
132
  recommended: false,
133
+ frozen: true,
133
134
  url: "https://eslint.org/docs/latest/rules/prefer-template"
134
135
  },
135
136
 
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @fileoverview Rule to require sorting of import declarations
2
+ * @fileoverview Rule to enforce sorted `import` declarations within modules
3
3
  * @author Christian Schuller
4
4
  */
5
5
 
@@ -23,8 +23,9 @@ module.exports = {
23
23
  }],
24
24
 
25
25
  docs: {
26
- description: "Enforce sorted import declarations within modules",
26
+ description: "Enforce sorted `import` declarations within modules",
27
27
  recommended: false,
28
+ frozen: true,
28
29
  url: "https://eslint.org/docs/latest/rules/sort-imports"
29
30
  },
30
31
 
@@ -91,6 +91,7 @@ module.exports = {
91
91
  docs: {
92
92
  description: "Require object keys to be sorted",
93
93
  recommended: false,
94
+ frozen: true,
94
95
  url: "https://eslint.org/docs/latest/rules/sort-keys"
95
96
  },
96
97
 
@@ -21,6 +21,7 @@ module.exports = {
21
21
  docs: {
22
22
  description: "Require variables within the same declaration block to be sorted",
23
23
  recommended: false,
24
+ frozen: true,
24
25
  url: "https://eslint.org/docs/latest/rules/sort-vars"
25
26
  },
26
27
 
@@ -17,6 +17,7 @@ module.exports = {
17
17
  docs: {
18
18
  description: "Require `var` declarations be placed at the top of their containing scope",
19
19
  recommended: false,
20
+ frozen: true,
20
21
  url: "https://eslint.org/docs/latest/rules/vars-on-top"
21
22
  },
22
23
 
package/lib/rules/yoda.js CHANGED
@@ -119,6 +119,7 @@ module.exports = {
119
119
  docs: {
120
120
  description: 'Require or disallow "Yoda" conditions',
121
121
  recommended: false,
122
+ frozen: true,
122
123
  url: "https://eslint.org/docs/latest/rules/yoda"
123
124
  },
124
125
 
@@ -10,8 +10,7 @@
10
10
  */
11
11
  const activeFlags = new Map([
12
12
  ["test_only", "Used only for testing."],
13
- ["unstable_config_lookup_from_file", "Look up `eslint.config.js` from the file being linted."],
14
- ["unstable_ts_config", "Enable TypeScript configuration files."]
13
+ ["unstable_config_lookup_from_file", "Look up `eslint.config.js` from the file being linted."]
15
14
  ]);
16
15
 
17
16
  /**
@@ -19,7 +18,8 @@ const activeFlags = new Map([
19
18
  * @type {Map<string, string>}
20
19
  */
21
20
  const inactiveFlags = new Map([
22
- ["test_only_old", "Used only for testing."]
21
+ ["test_only_old", "Used only for testing."],
22
+ ["unstable_ts_config", "This flag is no longer required to enable TypeScript configuration files."]
23
23
  ]);
24
24
 
25
25
  module.exports = {
@@ -1484,7 +1484,7 @@ export namespace ESLint {
1484
1484
  allowInlineConfig?: boolean | undefined;
1485
1485
  baseConfig?: Linter.Config | Linter.Config[] | null | undefined;
1486
1486
  overrideConfig?: Linter.Config | Linter.Config[] | null | undefined;
1487
- overrideConfigFile?: string | boolean | undefined;
1487
+ overrideConfigFile?: string | true | null | undefined;
1488
1488
  plugins?: Record<string, Plugin> | null | undefined;
1489
1489
  ruleFilter?: ((arg: { ruleId: string; severity: Exclude<Linter.Severity, 0> }) => boolean) | undefined;
1490
1490
  stats?: boolean | undefined;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eslint",
3
- "version": "9.17.0",
3
+ "version": "9.18.0",
4
4
  "author": "Nicholas C. Zakas <nicholas+npm@nczconsulting.com>",
5
5
  "description": "An AST-based pattern checker for JavaScript.",
6
6
  "type": "commonjs",
@@ -100,10 +100,10 @@
100
100
  "@eslint-community/eslint-utils": "^4.2.0",
101
101
  "@eslint-community/regexpp": "^4.12.1",
102
102
  "@eslint/config-array": "^0.19.0",
103
- "@eslint/core": "^0.9.0",
103
+ "@eslint/core": "^0.10.0",
104
104
  "@eslint/eslintrc": "^3.2.0",
105
- "@eslint/js": "9.17.0",
106
- "@eslint/plugin-kit": "^0.2.3",
105
+ "@eslint/js": "9.18.0",
106
+ "@eslint/plugin-kit": "^0.2.5",
107
107
  "@humanfs/node": "^0.16.6",
108
108
  "@humanwhocodes/module-importer": "^1.0.1",
109
109
  "@humanwhocodes/retry": "^0.4.1",
@@ -136,7 +136,7 @@
136
136
  "@arethetypeswrong/cli": "^0.17.0",
137
137
  "@babel/core": "^7.4.3",
138
138
  "@babel/preset-env": "^7.4.3",
139
- "@eslint/json": "^0.8.0",
139
+ "@eslint/json": "^0.9.0",
140
140
  "@trunkio/launcher": "^1.3.0",
141
141
  "@types/node": "^20.11.5",
142
142
  "@typescript-eslint/parser": "^8.4.0",