eslint-plugin-unicorn 62.0.0 → 63.0.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 (146) hide show
  1. package/index.d.ts +5 -5
  2. package/index.js +5 -9
  3. package/package.json +6 -8
  4. package/readme.md +2 -1
  5. package/rules/ast/index.js +1 -0
  6. package/rules/ast/is-empty-object-expression.js +5 -0
  7. package/rules/better-regex.js +88 -89
  8. package/rules/catch-error-name.js +54 -60
  9. package/rules/consistent-assert.js +6 -4
  10. package/rules/consistent-date-clone.js +4 -4
  11. package/rules/consistent-destructuring.js +93 -94
  12. package/rules/consistent-empty-array-spread.js +8 -12
  13. package/rules/consistent-existence-index-check.js +4 -5
  14. package/rules/consistent-function-scoping.js +1 -1
  15. package/rules/custom-error-definition.js +10 -2
  16. package/rules/expiring-todo-comments.js +8 -8
  17. package/rules/explicit-length-check.js +73 -60
  18. package/rules/filename-case.js +39 -41
  19. package/rules/fix/fix-space-around-keywords.js +1 -1
  20. package/rules/fix/remove-argument.js +1 -1
  21. package/rules/fix/remove-method-call.js +1 -1
  22. package/rules/fix/remove-parentheses.js +1 -1
  23. package/rules/fix/replace-argument.js +1 -1
  24. package/rules/fix/replace-member-expression-property.js +1 -1
  25. package/rules/fix/replace-node-or-token-and-spaces-before.js +1 -1
  26. package/rules/fix/switch-call-expression-to-new-expression.js +5 -3
  27. package/rules/fix/switch-new-expression-to-call-expression.js +6 -4
  28. package/rules/import-style.js +4 -0
  29. package/rules/index.js +1 -0
  30. package/rules/isolated-functions.js +202 -0
  31. package/rules/no-abusive-eslint-disable.js +13 -27
  32. package/rules/no-accessor-recursion.js +17 -20
  33. package/rules/no-anonymous-default-export.js +9 -5
  34. package/rules/no-array-callback-reference.js +5 -5
  35. package/rules/no-array-for-each.js +13 -10
  36. package/rules/no-array-method-this-argument.js +7 -4
  37. package/rules/no-array-reduce.js +16 -18
  38. package/rules/no-await-in-promise-methods.js +4 -4
  39. package/rules/no-console-spaces.js +33 -35
  40. package/rules/no-document-cookie.js +3 -1
  41. package/rules/no-empty-file.js +17 -19
  42. package/rules/no-for-loop.js +181 -103
  43. package/rules/no-hex-escape.js +7 -6
  44. package/rules/no-immediate-mutation.js +3 -3
  45. package/rules/no-instanceof-builtins.js +48 -51
  46. package/rules/no-invalid-remove-event-listener.js +4 -4
  47. package/rules/no-keyword-prefix.js +45 -47
  48. package/rules/no-lonely-if.js +7 -6
  49. package/rules/no-magic-array-flat-depth.js +4 -4
  50. package/rules/no-named-default.js +7 -6
  51. package/rules/no-negated-condition.js +9 -6
  52. package/rules/no-negation-in-equality-check.js +5 -5
  53. package/rules/no-nested-ternary.js +6 -6
  54. package/rules/no-new-array.js +10 -9
  55. package/rules/no-new-buffer.js +21 -23
  56. package/rules/no-null.js +91 -96
  57. package/rules/no-object-as-default-parameter.js +4 -4
  58. package/rules/no-process-exit.js +1 -1
  59. package/rules/no-single-promise-in-promise-methods.js +7 -9
  60. package/rules/no-typeof-undefined.js +76 -85
  61. package/rules/no-unnecessary-array-splice-count.js +3 -1
  62. package/rules/no-unnecessary-await.js +6 -8
  63. package/rules/no-unnecessary-polyfills.js +50 -46
  64. package/rules/no-unnecessary-slice-end.js +3 -1
  65. package/rules/no-unreadable-array-destructuring.js +45 -45
  66. package/rules/no-unreadable-iife.js +5 -7
  67. package/rules/no-unused-properties.js +9 -11
  68. package/rules/no-useless-collection-argument.js +45 -15
  69. package/rules/no-useless-fallback-in-spread.js +8 -7
  70. package/rules/no-useless-length-check.js +64 -63
  71. package/rules/no-useless-spread.js +11 -10
  72. package/rules/no-useless-switch-case.js +4 -4
  73. package/rules/no-useless-undefined.js +2 -6
  74. package/rules/no-zero-fractions.js +11 -9
  75. package/rules/number-literal-case.js +4 -4
  76. package/rules/numeric-separators-style.js +36 -57
  77. package/rules/prefer-add-event-listener.js +104 -104
  78. package/rules/prefer-array-find.js +1 -6
  79. package/rules/prefer-array-flat-map.js +4 -4
  80. package/rules/prefer-array-flat.js +28 -33
  81. package/rules/prefer-at.js +1 -5
  82. package/rules/prefer-bigint-literals.js +59 -11
  83. package/rules/prefer-blob-reading-methods.js +4 -4
  84. package/rules/prefer-class-fields.js +87 -89
  85. package/rules/prefer-code-point.js +7 -6
  86. package/rules/prefer-date-now.js +13 -10
  87. package/rules/prefer-dom-node-append.js +4 -4
  88. package/rules/prefer-dom-node-dataset.js +4 -4
  89. package/rules/prefer-dom-node-remove.js +67 -69
  90. package/rules/prefer-dom-node-text-content.js +7 -6
  91. package/rules/prefer-event-target.js +4 -4
  92. package/rules/prefer-export-from.js +70 -69
  93. package/rules/prefer-global-this.js +4 -4
  94. package/rules/prefer-json-parse-buffer.js +4 -4
  95. package/rules/prefer-keyboard-event-key.js +6 -6
  96. package/rules/prefer-logical-operator-over-ternary.js +36 -35
  97. package/rules/prefer-math-min-max.js +4 -5
  98. package/rules/prefer-modern-math-apis.js +62 -63
  99. package/rules/prefer-negative-index.js +6 -9
  100. package/rules/prefer-node-protocol.js +5 -10
  101. package/rules/prefer-number-properties.js +1 -5
  102. package/rules/prefer-object-from-entries.js +44 -49
  103. package/rules/prefer-optional-catch-binding.js +4 -4
  104. package/rules/prefer-prototype-methods.js +7 -5
  105. package/rules/prefer-query-selector.js +4 -4
  106. package/rules/prefer-reflect-apply.js +4 -4
  107. package/rules/prefer-regexp-test.js +4 -4
  108. package/rules/prefer-response-static-json.js +7 -8
  109. package/rules/prefer-set-has.js +23 -9
  110. package/rules/prefer-set-size.js +55 -35
  111. package/rules/prefer-single-call.js +71 -78
  112. package/rules/prefer-spread.js +30 -0
  113. package/rules/prefer-string-raw.js +5 -1
  114. package/rules/prefer-string-replace-all.js +4 -4
  115. package/rules/prefer-string-slice.js +11 -11
  116. package/rules/prefer-string-starts-ends-with.js +113 -111
  117. package/rules/prefer-string-trim-start-end.js +4 -4
  118. package/rules/prefer-structured-clone.js +2 -5
  119. package/rules/prefer-switch.js +39 -41
  120. package/rules/prefer-ternary.js +76 -78
  121. package/rules/prefer-top-level-await.js +65 -67
  122. package/rules/prefer-type-error.js +4 -4
  123. package/rules/prevent-abbreviations.js +48 -50
  124. package/rules/relative-url-style.js +5 -9
  125. package/rules/require-array-join-separator.js +4 -4
  126. package/rules/require-module-attributes.js +2 -2
  127. package/rules/require-number-to-fixed-digits-argument.js +4 -4
  128. package/rules/require-post-message-target-origin.js +33 -35
  129. package/rules/rule/index.js +1 -1
  130. package/rules/rule/to-eslint-create.js +5 -7
  131. package/rules/shared/is-jest-inline-snapshot.js +18 -0
  132. package/rules/shared/negative-index.js +4 -2
  133. package/rules/shared/no-array-mutate-rule.js +48 -49
  134. package/rules/shared/simple-array-search-rule.js +4 -4
  135. package/rules/string-content.js +2 -5
  136. package/rules/switch-case-braces.js +47 -49
  137. package/rules/template-indent.js +24 -50
  138. package/rules/throw-new-error.js +4 -4
  139. package/rules/utils/array-or-object-prototype-property.js +7 -11
  140. package/rules/utils/create-deprecated-rules.js +9 -2
  141. package/rules/utils/eslint-directive.js +21 -0
  142. package/rules/utils/index.js +15 -3
  143. package/rules/utils/parentheses/get-parent-syntax-opening-parenthesis.js +80 -0
  144. package/rules/utils/parentheses/iterate-surrounding-parentheses.js +82 -0
  145. package/rules/utils/parentheses/parentheses.js +81 -0
  146. package/rules/utils/parentheses.js +0 -71
package/index.d.ts CHANGED
@@ -2,15 +2,15 @@ import type {ESLint, Linter} from 'eslint';
2
2
 
3
3
  declare const eslintPluginUnicorn: ESLint.Plugin & {
4
4
  configs: {
5
- recommended: Linter.FlatConfig;
6
- unopinionated: Linter.FlatConfig;
7
- all: Linter.FlatConfig;
5
+ recommended: Linter.Config;
6
+ unopinionated: Linter.Config;
7
+ all: Linter.Config;
8
8
 
9
9
  /** @deprecated Use `all` instead. The `flat/` prefix is no longer needed. */
10
- 'flat/all': Linter.FlatConfig;
10
+ 'flat/all': Linter.Config;
11
11
 
12
12
  /** @deprecated Use `recommended` instead. The `flat/` prefix is no longer needed. */
13
- 'flat/recommended': Linter.FlatConfig;
13
+ 'flat/recommended': Linter.Config;
14
14
  };
15
15
  };
16
16
 
package/index.js CHANGED
@@ -1,13 +1,12 @@
1
1
  import createDeprecatedRules from './rules/utils/create-deprecated-rules.js';
2
2
  import flatConfigBase from './configs/flat-config-base.js';
3
3
  import * as rawRules from './rules/index.js';
4
- import {createRules} from './rules/rule/index.js';
4
+ import {toEslintRules} from './rules/rule/index.js';
5
5
  import packageJson from './package.json' with {type: 'json'};
6
6
 
7
- const rules = createRules(rawRules);
7
+ const rules = toEslintRules(rawRules);
8
8
 
9
9
  const deprecatedRules = createDeprecatedRules({
10
- // {ruleId: {message: string, replacedBy: string[]}}
11
10
  'no-instanceof-array': {
12
11
  message: 'Replaced by `unicorn/no-instanceof-builtins` which covers more cases.',
13
12
  replacedBy: ['unicorn/no-instanceof-builtins'],
@@ -68,7 +67,7 @@ const unicorn = {
68
67
  version: packageJson.version,
69
68
  },
70
69
  rules: {
71
- ...createRules(rules),
70
+ ...rules,
72
71
  ...deprecatedRules,
73
72
  },
74
73
  };
@@ -83,9 +82,6 @@ const configs = {
83
82
  'flat/all': createConfig(allRules, 'unicorn/flat/all'),
84
83
  };
85
84
 
86
- const allConfigs = {
87
- ...unicorn,
88
- configs,
89
- };
85
+ unicorn.configs = configs;
90
86
 
91
- export default allConfigs;
87
+ export default unicorn;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eslint-plugin-unicorn",
3
- "version": "62.0.0",
3
+ "version": "63.0.0",
4
4
  "description": "More than 100 powerful ESLint rules",
5
5
  "license": "MIT",
6
6
  "repository": "sindresorhus/eslint-plugin-unicorn",
@@ -58,12 +58,10 @@
58
58
  "dependencies": {
59
59
  "@babel/helper-validator-identifier": "^7.28.5",
60
60
  "@eslint-community/eslint-utils": "^4.9.0",
61
- "@eslint/plugin-kit": "^0.4.0",
62
61
  "change-case": "^5.4.4",
63
62
  "ci-info": "^4.3.1",
64
63
  "clean-regexp": "^1.0.0",
65
64
  "core-js-compat": "^3.46.0",
66
- "esquery": "^1.6.0",
67
65
  "find-up-simple": "^1.0.1",
68
66
  "globals": "^16.4.0",
69
67
  "indent-string": "^5.0.0",
@@ -81,12 +79,12 @@
81
79
  "@babel/eslint-parser": "^7.28.5",
82
80
  "@eslint/eslintrc": "^3.3.1",
83
81
  "@lubien/fixture-beta-package": "^1.0.0-beta.1",
84
- "@typescript-eslint/parser": "^8.46.2",
85
- "@typescript-eslint/types": "^8.46.2",
82
+ "@typescript-eslint/parser": "^8.53.1",
83
+ "@typescript-eslint/types": "^8.53.1",
86
84
  "ava": "^6.4.1",
87
85
  "c8": "^10.1.3",
88
86
  "enquirer": "^2.4.1",
89
- "eslint": "^9.38.0",
87
+ "eslint": "^10.0.0",
90
88
  "eslint-ava-rule-tester": "^5.0.1",
91
89
  "eslint-config-xo": "^0.49.0",
92
90
  "eslint-doc-generator": "^2.3.0",
@@ -95,15 +93,15 @@
95
93
  "eslint-plugin-unicorn": "^61.0.2",
96
94
  "eslint-remote-tester": "^4.0.3",
97
95
  "eslint-remote-tester-repositories": "^2.0.2",
96
+ "eslint-scope": "^9.0.0",
98
97
  "espree": "^10.4.0",
99
98
  "listr2": "^9.0.5",
100
- "lodash-es": "^4.17.21",
101
99
  "markdownlint-cli": "^0.45.0",
102
100
  "nano-spawn": "^2.0.0",
103
101
  "node-style-text": "^2.1.2",
104
102
  "npm-package-json-lint": "^9.0.0",
105
103
  "npm-run-all2": "^8.0.4",
106
- "open-editor": "^5.1.0",
104
+ "open-editor": "^6.0.0",
107
105
  "outdent": "^0.8.0",
108
106
  "pretty-ms": "^9.3.0",
109
107
  "typescript": "^5.9.3",
package/readme.md CHANGED
@@ -73,6 +73,7 @@ export default [
73
73
  | [explicit-length-check](docs/rules/explicit-length-check.md) | Enforce explicitly comparing the `length` or `size` property of a value. | ✅ | 🔧 | 💡 |
74
74
  | [filename-case](docs/rules/filename-case.md) | Enforce a case style for filenames. | ✅ | | |
75
75
  | [import-style](docs/rules/import-style.md) | Enforce specific import styles per module. | ✅ ☑️ | | |
76
+ | [isolated-functions](docs/rules/isolated-functions.md) | Prevent usage of variables from outside the scope of isolated functions. | ✅ | | |
76
77
  | [new-for-builtins](docs/rules/new-for-builtins.md) | Enforce the use of `new` for all builtins, except `String`, `Number`, `Boolean`, `Symbol` and `BigInt`. | ✅ ☑️ | 🔧 | 💡 |
77
78
  | [no-abusive-eslint-disable](docs/rules/no-abusive-eslint-disable.md) | Enforce specifying rules to disable in `eslint-disable` comments. | ✅ ☑️ | | |
78
79
  | [no-accessor-recursion](docs/rules/no-accessor-recursion.md) | Disallow recursive access to `this` within getters and setters. | ✅ ☑️ | | |
@@ -119,7 +120,7 @@ export default [
119
120
  | [no-unreadable-array-destructuring](docs/rules/no-unreadable-array-destructuring.md) | Disallow unreadable array destructuring. | ✅ ☑️ | 🔧 | |
120
121
  | [no-unreadable-iife](docs/rules/no-unreadable-iife.md) | Disallow unreadable IIFEs. | ✅ ☑️ | | |
121
122
  | [no-unused-properties](docs/rules/no-unused-properties.md) | Disallow unused object properties. | | | |
122
- | [no-useless-collection-argument](docs/rules/no-useless-collection-argument.md) | Disallow useless values or fallbacks in `Set`, `Map`, `WeakSet`, or `WeakMap`. | ✅ ☑️ | 🔧 | |
123
+ | [no-useless-collection-argument](docs/rules/no-useless-collection-argument.md) | Disallow useless values or fallbacks in `Set`, `Map`, `WeakSet`, or `WeakMap`. | ✅ ☑️ | 🔧 | 💡 |
123
124
  | [no-useless-error-capture-stack-trace](docs/rules/no-useless-error-capture-stack-trace.md) | Disallow unnecessary `Error.captureStackTrace(…)`. | ✅ ☑️ | 🔧 | |
124
125
  | [no-useless-fallback-in-spread](docs/rules/no-useless-fallback-in-spread.md) | Disallow useless fallback when spreading in object literals. | ✅ ☑️ | 🔧 | |
125
126
  | [no-useless-length-check](docs/rules/no-useless-length-check.md) | Disallow useless array length check. | ✅ ☑️ | 🔧 | |
@@ -18,6 +18,7 @@ export {default as isArrowFunctionBody} from './is-arrow-function-body.js';
18
18
  export {default as isDirective} from './is-directive.js';
19
19
  export {default as isEmptyNode} from './is-empty-node.js';
20
20
  export {default as isEmptyArrayExpression} from './is-empty-array-expression.js';
21
+ export {default as isEmptyObjectExpression} from './is-empty-object-expression.js';
21
22
  export {default as isExpressionStatement} from './is-expression-statement.js';
22
23
  export {default as isFunction} from './is-function.js';
23
24
  export {default as isMemberExpression} from './is-member-expression.js';
@@ -0,0 +1,5 @@
1
+ const isEmptyArrayExpression = node =>
2
+ node.type === 'ObjectExpression'
3
+ && node.properties.length === 0;
4
+
5
+ export default isEmptyArrayExpression;
@@ -12,7 +12,7 @@ const messages = {
12
12
 
13
13
  /** @param {import('eslint').Rule.RuleContext} context */
14
14
  const create = context => {
15
- const {sortCharacterClasses} = context.options[0] || {};
15
+ const {sortCharacterClasses} = context.options[0];
16
16
 
17
17
  const ignoreList = [];
18
18
 
@@ -20,99 +20,98 @@ const create = context => {
20
20
  ignoreList.push('charClassClassrangesMerge');
21
21
  }
22
22
 
23
- return {
24
- Literal(node) {
25
- if (!isRegexLiteral(node)) {
26
- return;
27
- }
28
-
29
- const {raw: original, regex} = node;
30
- // Regular Expressions with `u` and `v` flag are not well handled by `regexp-tree`
31
- // https://github.com/DmitrySoshnikov/regexp-tree/issues/162
32
- if (regex.flags.includes('u') || regex.flags.includes('v')) {
33
- return;
34
- }
35
-
36
- let optimized = original;
37
-
38
- try {
39
- optimized = regexpTree.optimize(original, undefined, {blacklist: ignoreList}).toString();
40
- } catch (error) {
41
- return {
42
- node,
43
- messageId: MESSAGE_ID_PARSE_ERROR,
44
- data: {
45
- original,
46
- error: error.message,
47
- },
48
- };
49
- }
50
-
51
- if (original === optimized) {
52
- return;
53
- }
54
-
55
- const problem = {
23
+ context.on('Literal', node => {
24
+ if (!isRegexLiteral(node)) {
25
+ return;
26
+ }
27
+
28
+ const {raw: original, regex} = node;
29
+ // Regular Expressions with `u` and `v` flag are not well handled by `regexp-tree`
30
+ // https://github.com/DmitrySoshnikov/regexp-tree/issues/162
31
+ if (regex.flags.includes('u') || regex.flags.includes('v')) {
32
+ return;
33
+ }
34
+
35
+ let optimized = original;
36
+
37
+ try {
38
+ optimized = regexpTree.optimize(original, undefined, {blacklist: ignoreList}).toString();
39
+ } catch (error) {
40
+ return {
56
41
  node,
57
- messageId: MESSAGE_ID,
42
+ messageId: MESSAGE_ID_PARSE_ERROR,
58
43
  data: {
59
44
  original,
60
- optimized,
45
+ error: error.message,
61
46
  },
62
47
  };
63
-
64
- if (
65
- node.parent.type === 'MemberExpression'
66
- && node.parent.object === node
67
- && !node.parent.optional
68
- && !node.parent.computed
69
- && node.parent.property.type === 'Identifier'
70
- && (
71
- node.parent.property.name === 'toString'
72
- || node.parent.property.name === 'source'
73
- )
74
- ) {
75
- return problem;
76
- }
77
-
78
- return Object.assign(problem, {
79
- fix: fixer => fixer.replaceText(node, optimized),
80
- });
81
- },
82
- NewExpression(node) {
83
- if (!isNewExpression(node, {name: 'RegExp', minimumArguments: 1})) {
84
- return;
85
- }
86
-
87
- const [patternNode, flagsNode] = node.arguments;
88
-
89
- if (!isStringLiteral(patternNode)) {
90
- return;
91
- }
92
-
93
- const oldPattern = patternNode.value;
94
- const flags = isStringLiteral(flagsNode)
95
- ? flagsNode.value
96
- : '';
97
-
98
- const newPattern = cleanRegexp(oldPattern, flags);
99
-
100
- if (oldPattern !== newPattern) {
101
- return {
102
- node,
103
- messageId: MESSAGE_ID,
104
- data: {
105
- original: oldPattern,
106
- optimized: newPattern,
107
- },
108
- fix: fixer => fixer.replaceText(
109
- patternNode,
110
- escapeString(newPattern, patternNode.raw.charAt(0)),
111
- ),
112
- };
113
- }
114
- },
115
- };
48
+ }
49
+
50
+ if (original === optimized) {
51
+ return;
52
+ }
53
+
54
+ const problem = {
55
+ node,
56
+ messageId: MESSAGE_ID,
57
+ data: {
58
+ original,
59
+ optimized,
60
+ },
61
+ };
62
+
63
+ if (
64
+ node.parent.type === 'MemberExpression'
65
+ && node.parent.object === node
66
+ && !node.parent.optional
67
+ && !node.parent.computed
68
+ && node.parent.property.type === 'Identifier'
69
+ && (
70
+ node.parent.property.name === 'toString'
71
+ || node.parent.property.name === 'source'
72
+ )
73
+ ) {
74
+ return problem;
75
+ }
76
+
77
+ return Object.assign(problem, {
78
+ fix: fixer => fixer.replaceText(node, optimized),
79
+ });
80
+ });
81
+
82
+ context.on('NewExpression', node => {
83
+ if (!isNewExpression(node, {name: 'RegExp', minimumArguments: 1})) {
84
+ return;
85
+ }
86
+
87
+ const [patternNode, flagsNode] = node.arguments;
88
+
89
+ if (!isStringLiteral(patternNode)) {
90
+ return;
91
+ }
92
+
93
+ const oldPattern = patternNode.value;
94
+ const flags = isStringLiteral(flagsNode)
95
+ ? flagsNode.value
96
+ : '';
97
+
98
+ const newPattern = cleanRegexp(oldPattern, flags);
99
+
100
+ if (oldPattern !== newPattern) {
101
+ return {
102
+ node,
103
+ messageId: MESSAGE_ID,
104
+ data: {
105
+ original: oldPattern,
106
+ optimized: newPattern,
107
+ },
108
+ fix: fixer => fixer.replaceText(
109
+ patternNode,
110
+ escapeString(newPattern, patternNode.raw.charAt(0)),
111
+ ),
112
+ };
113
+ }
114
+ });
116
115
  };
117
116
 
118
117
  const schema = [
@@ -32,11 +32,7 @@ const isPromiseCatchParameter = node =>
32
32
 
33
33
  /** @param {import('eslint').Rule.RuleContext} context */
34
34
  const create = context => {
35
- const options = {
36
- name: 'error',
37
- ignore: [],
38
- ...context.options[0],
39
- };
35
+ const options = context.options[0];
40
36
  const {name: expectedName} = options;
41
37
  const ignore = options.ignore.map(
42
38
  pattern => isRegExp(pattern) ? pattern : new RegExp(pattern, 'u'),
@@ -47,60 +43,58 @@ const create = context => {
47
43
  || name.endsWith(expectedName)
48
44
  || name.endsWith(upperFirst(expectedName));
49
45
 
50
- return {
51
- Identifier(node) {
52
- if (
53
- !(node.parent.type === 'CatchClause' && node.parent.param === node)
54
- && !isPromiseCatchParameter(node)
55
- ) {
56
- return;
57
- }
58
-
59
- const originalName = node.name;
60
-
61
- if (
62
- isNameAllowed(originalName)
63
- || isNameAllowed(originalName.replaceAll(/_+$/g, ''))
64
- ) {
65
- return;
66
- }
67
-
68
- const scope = context.sourceCode.getScope(node);
69
- const variable = findVariable(scope, node);
70
-
71
- // This was reported https://github.com/sindresorhus/eslint-plugin-unicorn/issues/1075#issuecomment-768072967
72
- // But can't reproduce, just ignore this case
73
- /* c8 ignore next 3 */
74
- if (!variable) {
75
- return;
76
- }
77
-
78
- if (originalName === '_' && variable.references.length === 0) {
79
- return;
80
- }
81
-
82
- const scopes = [
83
- variable.scope,
84
- ...variable.references.map(({from}) => from),
85
- ];
86
- const fixedName = getAvailableVariableName(expectedName, scopes);
87
-
88
- const problem = {
89
- node,
90
- messageId: MESSAGE_ID,
91
- data: {
92
- originalName,
93
- fixedName: fixedName || expectedName,
94
- },
95
- };
96
-
97
- if (fixedName) {
98
- problem.fix = fixer => renameVariable(variable, fixedName, context, fixer);
99
- }
100
-
101
- return problem;
102
- },
103
- };
46
+ context.on('Identifier', node => {
47
+ if (
48
+ !(node.parent.type === 'CatchClause' && node.parent.param === node)
49
+ && !isPromiseCatchParameter(node)
50
+ ) {
51
+ return;
52
+ }
53
+
54
+ const originalName = node.name;
55
+
56
+ if (
57
+ isNameAllowed(originalName)
58
+ || isNameAllowed(originalName.replaceAll(/_+$/g, ''))
59
+ ) {
60
+ return;
61
+ }
62
+
63
+ const scope = context.sourceCode.getScope(node);
64
+ const variable = findVariable(scope, node);
65
+
66
+ // This was reported https://github.com/sindresorhus/eslint-plugin-unicorn/issues/1075#issuecomment-768072967
67
+ // But can't reproduce, just ignore this case
68
+ /* c8 ignore next 3 */
69
+ if (!variable) {
70
+ return;
71
+ }
72
+
73
+ if (originalName === '_' && variable.references.length === 0) {
74
+ return;
75
+ }
76
+
77
+ const scopes = [
78
+ variable.scope,
79
+ ...variable.references.map(({from}) => from),
80
+ ];
81
+ const fixedName = getAvailableVariableName(expectedName, scopes);
82
+
83
+ const problem = {
84
+ node,
85
+ messageId: MESSAGE_ID,
86
+ data: {
87
+ originalName,
88
+ fixedName: fixedName || expectedName,
89
+ },
90
+ };
91
+
92
+ if (fixedName) {
93
+ problem.fix = fixer => renameVariable(variable, fixedName, context, fixer);
94
+ }
95
+
96
+ return problem;
97
+ });
104
98
  };
105
99
 
106
100
  const schema = [
@@ -130,7 +124,7 @@ const config = {
130
124
  },
131
125
  fixable: 'code',
132
126
  schema,
133
- defaultOptions: [{}],
127
+ defaultOptions: [{name: 'error', ignore: []}],
134
128
  messages,
135
129
  },
136
130
  };
@@ -22,20 +22,22 @@ const isAssertFunction = (specifier, moduleName) =>
22
22
  // `import {default as assert} from 'node:assert/strict';`
23
23
  || (
24
24
  specifier.type === 'ImportSpecifier'
25
+ && specifier.imported.type === 'Identifier'
25
26
  && specifier.imported.name === 'default'
26
27
  )
27
28
  // `import {strict as assert} from 'node:assert';`
28
29
  || (
29
30
  moduleName === 'assert'
30
31
  && specifier.type === 'ImportSpecifier'
32
+ && specifier.imported.type === 'Identifier'
31
33
  && specifier.imported.name === 'strict'
32
34
  );
33
35
 
34
36
  const NODE_PROTOCOL = 'node:';
35
37
 
36
38
  /** @type {import('eslint').Rule.RuleModule['create']} */
37
- const create = context => ({
38
- * ImportDeclaration(importDeclaration) {
39
+ const create = context => {
40
+ context.on('ImportDeclaration', function * (importDeclaration) {
39
41
  if (!isValueImport(importDeclaration)) {
40
42
  return;
41
43
  }
@@ -78,8 +80,8 @@ const create = context => ({
78
80
  };
79
81
  }
80
82
  }
81
- },
82
- });
83
+ });
84
+ };
83
85
 
84
86
  /** @type {import('eslint').Rule.RuleModule} */
85
87
  const config = {
@@ -7,8 +7,8 @@ const messages = {
7
7
  };
8
8
 
9
9
  /** @param {import('eslint').Rule.RuleContext} context */
10
- const create = context => ({
11
- NewExpression(newExpression) {
10
+ const create = context => {
11
+ context.on('NewExpression', newExpression => {
12
12
  if (!isNewExpression(newExpression, {name: 'Date', argumentsLength: 1})) {
13
13
  return;
14
14
  }
@@ -34,8 +34,8 @@ const create = context => ({
34
34
  messageId: MESSAGE_ID_ERROR,
35
35
  fix: fixer => removeMethodCall(fixer, callExpression, context),
36
36
  };
37
- },
38
- });
37
+ });
38
+ };
39
39
 
40
40
  /** @type {import('eslint').Rule.RuleModule} */
41
41
  const config = {