eslint 9.16.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 (70) 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/linter/source-code-fixer.js +1 -1
  6. package/lib/rules/arrow-body-style.js +1 -0
  7. package/lib/rules/camelcase.js +1 -0
  8. package/lib/rules/capitalized-comments.js +1 -0
  9. package/lib/rules/consistent-this.js +1 -0
  10. package/lib/rules/curly.js +1 -0
  11. package/lib/rules/default-case-last.js +2 -2
  12. package/lib/rules/default-param-last.js +1 -0
  13. package/lib/rules/dot-notation.js +1 -0
  14. package/lib/rules/for-direction.js +2 -2
  15. package/lib/rules/func-name-matching.js +1 -0
  16. package/lib/rules/func-style.js +1 -0
  17. package/lib/rules/id-denylist.js +1 -0
  18. package/lib/rules/id-length.js +1 -0
  19. package/lib/rules/id-match.js +1 -0
  20. package/lib/rules/init-declarations.js +1 -0
  21. package/lib/rules/logical-assignment-operators.js +1 -0
  22. package/lib/rules/no-console.js +3 -1
  23. package/lib/rules/no-continue.js +1 -0
  24. package/lib/rules/no-div-regex.js +1 -0
  25. package/lib/rules/no-else-return.js +1 -0
  26. package/lib/rules/no-extra-boolean-cast.js +1 -0
  27. package/lib/rules/no-extra-label.js +1 -0
  28. package/lib/rules/no-implicit-coercion.js +1 -0
  29. package/lib/rules/no-inline-comments.js +1 -0
  30. package/lib/rules/no-label-var.js +1 -0
  31. package/lib/rules/no-labels.js +1 -0
  32. package/lib/rules/no-lonely-if.js +1 -0
  33. package/lib/rules/no-magic-numbers.js +1 -0
  34. package/lib/rules/no-multi-str.js +1 -0
  35. package/lib/rules/no-negated-condition.js +1 -0
  36. package/lib/rules/no-nested-ternary.js +1 -0
  37. package/lib/rules/no-param-reassign.js +2 -2
  38. package/lib/rules/no-plusplus.js +1 -0
  39. package/lib/rules/no-script-url.js +3 -3
  40. package/lib/rules/no-shadow-restricted-names.js +17 -7
  41. package/lib/rules/no-ternary.js +1 -0
  42. package/lib/rules/no-undef-init.js +1 -0
  43. package/lib/rules/no-undefined.js +1 -0
  44. package/lib/rules/no-underscore-dangle.js +1 -0
  45. package/lib/rules/no-unneeded-ternary.js +1 -0
  46. package/lib/rules/no-unused-vars.js +613 -2
  47. package/lib/rules/no-useless-assignment.js +9 -0
  48. package/lib/rules/no-useless-computed-key.js +1 -0
  49. package/lib/rules/no-useless-concat.js +1 -0
  50. package/lib/rules/no-void.js +1 -0
  51. package/lib/rules/no-warning-comments.js +1 -0
  52. package/lib/rules/object-shorthand.js +1 -0
  53. package/lib/rules/one-var.js +1 -0
  54. package/lib/rules/operator-assignment.js +1 -0
  55. package/lib/rules/prefer-arrow-callback.js +1 -0
  56. package/lib/rules/prefer-destructuring.js +1 -0
  57. package/lib/rules/prefer-exponentiation-operator.js +1 -0
  58. package/lib/rules/prefer-numeric-literals.js +1 -0
  59. package/lib/rules/prefer-object-spread.js +3 -2
  60. package/lib/rules/prefer-spread.js +1 -0
  61. package/lib/rules/prefer-template.js +1 -0
  62. package/lib/rules/require-unicode-regexp.js +2 -2
  63. package/lib/rules/sort-imports.js +3 -2
  64. package/lib/rules/sort-keys.js +1 -0
  65. package/lib/rules/sort-vars.js +1 -0
  66. package/lib/rules/vars-on-top.js +1 -0
  67. package/lib/rules/yoda.js +1 -0
  68. package/lib/shared/flags.js +3 -3
  69. package/lib/types/index.d.ts +1 -1
  70. package/package.json +7 -7
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://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")
@@ -107,7 +107,7 @@ SourceCodeFixer.applyFixes = function(sourceText, messages, shouldFix) {
107
107
  }
108
108
 
109
109
  messages.forEach(problem => {
110
- if (Object.hasOwn(problem, "fix")) {
110
+ if (Object.hasOwn(problem, "fix") && problem.fix) {
111
111
  fixes.push(problem);
112
112
  } else {
113
113
  remainingMessages.push(problem);
@@ -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
 
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @fileoverview enforce "for" loop update clause moving the counter in the right direction.(for-direction)
2
+ * @fileoverview enforce `for` loop update clause moving the counter in the right direction.(for-direction)
3
3
  * @author Aladdin-ADD<hh_2013@foxmail.com>
4
4
  */
5
5
 
@@ -21,7 +21,7 @@ module.exports = {
21
21
  type: "problem",
22
22
 
23
23
  docs: {
24
- description: "Enforce \"for\" loop update clause moving the counter in the right direction",
24
+ description: "Enforce `for` loop update clause moving the counter in the right direction",
25
25
  recommended: true,
26
26
  url: "https://eslint.org/docs/latest/rules/for-direction"
27
27
  },
@@ -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
 
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @fileoverview Disallow reassignment of function parameters.
2
+ * @fileoverview Disallow reassigning function parameters.
3
3
  * @author Nat Burns
4
4
  */
5
5
  "use strict";
@@ -16,7 +16,7 @@ module.exports = {
16
16
  type: "suggestion",
17
17
 
18
18
  docs: {
19
- description: "Disallow reassigning `function` parameters",
19
+ description: "Disallow reassigning function parameters",
20
20
  recommended: false,
21
21
  url: "https://eslint.org/docs/latest/rules/no-param-reassign"
22
22
  },
@@ -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
 
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @fileoverview Rule to flag when using javascript: urls
2
+ * @fileoverview Rule to disallow `javascript:` URLs
3
3
  * @author Ilya Volodin
4
4
  */
5
5
  /* eslint no-script-url: 0 -- Code is checking to report such URLs */
@@ -18,7 +18,7 @@ module.exports = {
18
18
  type: "suggestion",
19
19
 
20
20
  docs: {
21
- description: "Disallow `javascript:` urls",
21
+ description: "Disallow `javascript:` URLs",
22
22
  recommended: false,
23
23
  url: "https://eslint.org/docs/latest/rules/no-script-url"
24
24
  },
@@ -33,7 +33,7 @@ module.exports = {
33
33
  create(context) {
34
34
 
35
35
  /**
36
- * Check whether a node's static value starts with "javascript:" or not.
36
+ * Check whether a node's static value starts with `javascript:` or not.
37
37
  * And report an error for unexpected script URL.
38
38
  * @param {ASTNode} node node to check
39
39
  * @returns {void}
@@ -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