eslint-plugin-unicorn 59.0.0 → 60.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 (48) hide show
  1. package/index.js +5 -2
  2. package/package.json +38 -39
  3. package/readme.md +6 -2
  4. package/rules/ast/call-or-new-expression.js +1 -0
  5. package/rules/ast/is-member-expression.js +1 -0
  6. package/rules/catch-error-name.js +2 -2
  7. package/rules/consistent-destructuring.js +0 -1
  8. package/rules/custom-error-definition.js +1 -1
  9. package/rules/error-message.js +16 -12
  10. package/rules/expiring-todo-comments.js +1 -0
  11. package/rules/filename-case.js +3 -28
  12. package/rules/fix/replace-node-or-token-and-spaces-before.js +1 -0
  13. package/rules/import-style.js +5 -2
  14. package/rules/index.js +134 -266
  15. package/rules/no-anonymous-default-export.js +2 -2
  16. package/rules/no-array-callback-reference.js +0 -1
  17. package/rules/no-array-reverse.js +109 -0
  18. package/rules/no-nested-ternary.js +2 -2
  19. package/rules/no-typeof-undefined.js +2 -2
  20. package/rules/no-unnecessary-array-flat-depth.js +0 -1
  21. package/rules/no-unnecessary-await.js +5 -1
  22. package/rules/no-unnecessary-polyfills.js +1 -1
  23. package/rules/no-useless-error-capture-stack-trace.js +146 -0
  24. package/rules/prefer-at.js +22 -23
  25. package/rules/prefer-class-fields.js +158 -0
  26. package/rules/prefer-default-parameters.js +0 -1
  27. package/rules/prefer-math-min-max.js +1 -0
  28. package/rules/prefer-modern-dom-apis.js +3 -1
  29. package/rules/prefer-module.js +10 -12
  30. package/rules/prefer-set-has.js +8 -15
  31. package/rules/prefer-single-call.js +1 -1
  32. package/rules/prefer-string-raw.js +4 -18
  33. package/rules/prefer-string-replace-all.js +37 -4
  34. package/rules/prefer-ternary.js +1 -0
  35. package/rules/prevent-abbreviations.js +7 -3
  36. package/rules/require-module-specifiers.js +158 -0
  37. package/rules/shared/builtin-errors.js +1 -1
  38. package/rules/template-indent.js +1 -1
  39. package/rules/text-encoding-identifier-case.js +7 -8
  40. package/rules/utils/global-reference-tracker.js +1 -1
  41. package/rules/utils/index.js +2 -1
  42. package/rules/utils/is-number.js +1 -0
  43. package/rules/utils/is-unresolved-variable.js +14 -0
  44. package/rules/utils/needs-semicolon.js +1 -0
  45. package/rules/utils/rule.js +20 -18
  46. package/rules/utils/string-cases.js +2 -0
  47. package/rules/utils/is-shadowed.js +0 -31
  48. package/rules/utils/lodash.js +0 -1567
package/index.js CHANGED
@@ -1,8 +1,11 @@
1
1
  import createDeprecatedRules from './rules/utils/create-deprecated-rules.js';
2
2
  import flatConfigBase from './configs/flat-config-base.js';
3
- import rules from './rules/index.js';
3
+ import * as rawRules from './rules/index.js';
4
+ import {createRules} from './rules/utils/rule.js';
4
5
  import packageJson from './package.json' with {type: 'json'};
5
6
 
7
+ const rules = createRules(rawRules);
8
+
6
9
  const deprecatedRules = createDeprecatedRules({
7
10
  // {ruleId: {message: string, replacedBy: string[]}}
8
11
  'no-instanceof-array': {
@@ -58,7 +61,7 @@ const unicorn = {
58
61
  version: packageJson.version,
59
62
  },
60
63
  rules: {
61
- ...rules,
64
+ ...createRules(rules),
62
65
  ...deprecatedRules,
63
66
  },
64
67
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eslint-plugin-unicorn",
3
- "version": "59.0.0",
3
+ "version": "60.0.0",
4
4
  "description": "More than 100 powerful ESLint rules",
5
5
  "license": "MIT",
6
6
  "repository": "sindresorhus/eslint-plugin-unicorn",
@@ -17,19 +17,18 @@
17
17
  },
18
18
  "sideEffects": false,
19
19
  "engines": {
20
- "node": "^18.20.0 || ^20.10.0 || >=21.0.0"
20
+ "node": "^20.10.0 || >=21.0.0"
21
21
  },
22
22
  "scripts": {
23
- "bundle-lodash": "echo export {defaultsDeep, camelCase, kebabCase, snakeCase, upperFirst, lowerFirst} from 'lodash-es'; | npx esbuild --bundle --outfile=rules/utils/lodash.js --format=esm",
24
23
  "create-rule": "node ./scripts/create-rule.js && npm run create-rules-index-file && npm run fix:eslint-docs",
25
24
  "create-rules-index-file": "node ./scripts/create-rules-index-file.js",
26
- "fix": "run-p --continue-on-error fix:*",
27
- "fix:eslint-docs": "eslint-doc-generator workaround-for-eslint-doc-generator",
25
+ "fix": "run-p --continue-on-error \"fix:*\"",
26
+ "fix:eslint-docs": "eslint-doc-generator",
28
27
  "fix:js": "npm run lint:js -- --fix",
29
28
  "fix:markdown": "npm run lint:markdown -- --fix",
30
29
  "fix:snapshots": "ava --update-snapshots",
31
30
  "integration": "node ./test/integration/test.js",
32
- "lint": "run-p --continue-on-error lint:*",
31
+ "lint": "run-p --continue-on-error \"lint:*\"",
33
32
  "lint:eslint-docs": "npm run fix:eslint-docs -- --check",
34
33
  "lint:js": "eslint",
35
34
  "lint:markdown": "markdownlint \"**/*.md\"",
@@ -37,7 +36,7 @@
37
36
  "rename-rule": "node ./scripts/rename-rule.js && npm run create-rules-index-file && npm run fix:eslint-docs",
38
37
  "run-rules-on-codebase": "eslint --config=./eslint.dogfooding.config.js",
39
38
  "smoke": "eslint-remote-tester --config ./test/smoke/eslint-remote-tester.config.js",
40
- "test": "npm-run-all --continue-on-error lint test:*",
39
+ "test": "npm-run-all --continue-on-error lint \"test:*\"",
41
40
  "test:js": "c8 ava"
42
41
  },
43
42
  "files": [
@@ -57,60 +56,60 @@
57
56
  "xo"
58
57
  ],
59
58
  "dependencies": {
60
- "@babel/helper-validator-identifier": "^7.25.9",
61
- "@eslint-community/eslint-utils": "^4.5.1",
62
- "@eslint/plugin-kit": "^0.2.7",
63
- "ci-info": "^4.2.0",
59
+ "@babel/helper-validator-identifier": "^7.27.1",
60
+ "@eslint-community/eslint-utils": "^4.7.0",
61
+ "@eslint/plugin-kit": "^0.3.3",
62
+ "change-case": "^5.4.4",
63
+ "ci-info": "^4.3.0",
64
64
  "clean-regexp": "^1.0.0",
65
- "core-js-compat": "^3.41.0",
65
+ "core-js-compat": "^3.44.0",
66
66
  "esquery": "^1.6.0",
67
67
  "find-up-simple": "^1.0.1",
68
- "globals": "^16.0.0",
68
+ "globals": "^16.3.0",
69
69
  "indent-string": "^5.0.0",
70
70
  "is-builtin-module": "^5.0.0",
71
71
  "jsesc": "^3.1.0",
72
72
  "pluralize": "^8.0.0",
73
73
  "regexp-tree": "^0.1.27",
74
74
  "regjsparser": "^0.12.0",
75
- "semver": "^7.7.1",
75
+ "semver": "^7.7.2",
76
76
  "strip-indent": "^4.0.0"
77
77
  },
78
78
  "devDependencies": {
79
- "@babel/code-frame": "^7.26.2",
80
- "@babel/core": "^7.26.10",
81
- "@babel/eslint-parser": "^7.26.10",
82
- "@eslint/eslintrc": "^3.3.0",
79
+ "@babel/code-frame": "^7.27.1",
80
+ "@babel/core": "^7.28.0",
81
+ "@babel/eslint-parser": "^7.28.0",
82
+ "@eslint/eslintrc": "^3.3.1",
83
83
  "@lubien/fixture-beta-package": "^1.0.0-beta.1",
84
- "@typescript-eslint/parser": "^8.26.1",
85
- "ava": "^6.2.0",
84
+ "@typescript-eslint/parser": "^8.37.0",
85
+ "ava": "^6.4.1",
86
86
  "c8": "^10.1.3",
87
87
  "enquirer": "^2.4.1",
88
- "eslint": "^9.22.0",
88
+ "eslint": "^9.29.0",
89
89
  "eslint-ava-rule-tester": "^5.0.1",
90
- "eslint-config-xo": "^0.46.0",
91
- "eslint-doc-generator": "^2.1.2",
92
- "eslint-plugin-eslint-plugin": "^6.4.0",
93
- "eslint-plugin-jsdoc": "^50.6.8",
94
- "eslint-remote-tester": "^4.0.1",
95
- "eslint-remote-tester-repositories": "^2.0.1",
96
- "espree": "^10.3.0",
97
- "listr2": "^8.2.5",
90
+ "eslint-config-xo": "^0.47.0",
91
+ "eslint-doc-generator": "^2.2.2",
92
+ "eslint-plugin-eslint-plugin": "^6.5.0",
93
+ "eslint-plugin-jsdoc": "^51.4.1",
94
+ "eslint-remote-tester": "^4.0.2",
95
+ "eslint-remote-tester-repositories": "^2.0.2",
96
+ "espree": "^10.4.0",
97
+ "listr2": "^9.0.1",
98
98
  "lodash-es": "^4.17.21",
99
- "markdownlint-cli": "^0.44.0",
100
- "memoize": "^10.1.0",
101
- "nano-spawn": "^0.2.0",
102
- "node-style-text": "^0.0.7",
103
- "npm-package-json-lint": "^8.0.0",
104
- "npm-run-all2": "^7.0.2",
99
+ "markdownlint-cli": "^0.45.0",
100
+ "nano-spawn": "^1.0.2",
101
+ "node-style-text": "^1.0.0",
102
+ "npm-package-json-lint": "^9.0.0",
103
+ "npm-run-all2": "^8.0.4",
105
104
  "open-editor": "^5.1.0",
106
105
  "outdent": "^0.8.0",
107
106
  "pretty-ms": "^9.2.0",
108
- "typescript": "^5.8.2",
109
- "vue-eslint-parser": "^10.1.1",
110
- "yaml": "^2.7.0"
107
+ "typescript": "^5.8.3",
108
+ "vue-eslint-parser": "^10.2.0",
109
+ "yaml": "^2.8.0"
111
110
  },
112
111
  "peerDependencies": {
113
- "eslint": ">=9.22.0"
112
+ "eslint": ">=9.29.0"
114
113
  },
115
114
  "ava": {
116
115
  "files": [
package/readme.md CHANGED
@@ -60,7 +60,7 @@ export default [
60
60
  | [catch-error-name](docs/rules/catch-error-name.md) | Enforce a specific parameter name in catch clauses. | ✅ | 🔧 | |
61
61
  | [consistent-assert](docs/rules/consistent-assert.md) | Enforce consistent assertion style with `node:assert`. | ✅ | 🔧 | |
62
62
  | [consistent-date-clone](docs/rules/consistent-date-clone.md) | Prefer passing `Date` directly to the constructor when cloning. | ✅ | 🔧 | |
63
- | [consistent-destructuring](docs/rules/consistent-destructuring.md) | Use destructured variables over properties. | | 🔧 | 💡 |
63
+ | [consistent-destructuring](docs/rules/consistent-destructuring.md) | Use destructured variables over properties. | | | 💡 |
64
64
  | [consistent-empty-array-spread](docs/rules/consistent-empty-array-spread.md) | Prefer consistent types when spreading a ternary in an array literal. | ✅ | 🔧 | |
65
65
  | [consistent-existence-index-check](docs/rules/consistent-existence-index-check.md) | Enforce consistent style for element existence checks with `indexOf()`, `lastIndexOf()`, `findIndex()`, and `findLastIndex()`. | ✅ | 🔧 | |
66
66
  | [consistent-function-scoping](docs/rules/consistent-function-scoping.md) | Move function definitions to the highest possible scope. | ✅ | | |
@@ -80,6 +80,7 @@ export default [
80
80
  | [no-array-for-each](docs/rules/no-array-for-each.md) | Prefer `for…of` over the `forEach` method. | ✅ | 🔧 | 💡 |
81
81
  | [no-array-method-this-argument](docs/rules/no-array-method-this-argument.md) | Disallow using the `this` argument in array methods. | ✅ | 🔧 | 💡 |
82
82
  | [no-array-reduce](docs/rules/no-array-reduce.md) | Disallow `Array#reduce()` and `Array#reduceRight()`. | ✅ | | |
83
+ | [no-array-reverse](docs/rules/no-array-reverse.md) | Prefer `Array#toReversed()` over `Array#reverse()`. | ✅ | | 💡 |
83
84
  | [no-await-expression-member](docs/rules/no-await-expression-member.md) | Disallow member access from await expression. | ✅ | 🔧 | |
84
85
  | [no-await-in-promise-methods](docs/rules/no-await-in-promise-methods.md) | Disallow using `await` in `Promise` method parameters. | ✅ | | 💡 |
85
86
  | [no-console-spaces](docs/rules/no-console-spaces.md) | Do not use leading/trailing space between `console.log` parameters. | ✅ | 🔧 | |
@@ -115,6 +116,7 @@ export default [
115
116
  | [no-unreadable-array-destructuring](docs/rules/no-unreadable-array-destructuring.md) | Disallow unreadable array destructuring. | ✅ | 🔧 | |
116
117
  | [no-unreadable-iife](docs/rules/no-unreadable-iife.md) | Disallow unreadable IIFEs. | ✅ | | |
117
118
  | [no-unused-properties](docs/rules/no-unused-properties.md) | Disallow unused object properties. | | | |
119
+ | [no-useless-error-capture-stack-trace](docs/rules/no-useless-error-capture-stack-trace.md) | Disallow unnecessary `Error.captureStackTrace(…)`. | ✅ | 🔧 | |
118
120
  | [no-useless-fallback-in-spread](docs/rules/no-useless-fallback-in-spread.md) | Disallow useless fallback when spreading in object literals. | ✅ | 🔧 | |
119
121
  | [no-useless-length-check](docs/rules/no-useless-length-check.md) | Disallow useless array length check. | ✅ | 🔧 | |
120
122
  | [no-useless-promise-resolve-reject](docs/rules/no-useless-promise-resolve-reject.md) | Disallow returning/yielding `Promise.resolve/reject()` in async functions or promise callbacks | ✅ | 🔧 | |
@@ -132,9 +134,10 @@ export default [
132
134
  | [prefer-array-some](docs/rules/prefer-array-some.md) | Prefer `.some(…)` over `.filter(…).length` check and `.{find,findLast,findIndex,findLastIndex}(…)`. | ✅ | 🔧 | 💡 |
133
135
  | [prefer-at](docs/rules/prefer-at.md) | Prefer `.at()` method for index access and `String#charAt()`. | ✅ | 🔧 | 💡 |
134
136
  | [prefer-blob-reading-methods](docs/rules/prefer-blob-reading-methods.md) | Prefer `Blob#arrayBuffer()` over `FileReader#readAsArrayBuffer(…)` and `Blob#text()` over `FileReader#readAsText(…)`. | ✅ | | |
137
+ | [prefer-class-fields](docs/rules/prefer-class-fields.md) | Prefer class field declarations over `this` assignments in constructors. | ✅ | 🔧 | 💡 |
135
138
  | [prefer-code-point](docs/rules/prefer-code-point.md) | Prefer `String#codePointAt(…)` over `String#charCodeAt(…)` and `String.fromCodePoint(…)` over `String.fromCharCode(…)`. | ✅ | | 💡 |
136
139
  | [prefer-date-now](docs/rules/prefer-date-now.md) | Prefer `Date.now()` to get the number of milliseconds since the Unix Epoch. | ✅ | 🔧 | |
137
- | [prefer-default-parameters](docs/rules/prefer-default-parameters.md) | Prefer default parameters over reassignment. | ✅ | 🔧 | 💡 |
140
+ | [prefer-default-parameters](docs/rules/prefer-default-parameters.md) | Prefer default parameters over reassignment. | ✅ | | 💡 |
138
141
  | [prefer-dom-node-append](docs/rules/prefer-dom-node-append.md) | Prefer `Node#append()` over `Node#appendChild()`. | ✅ | 🔧 | |
139
142
  | [prefer-dom-node-dataset](docs/rules/prefer-dom-node-dataset.md) | Prefer using `.dataset` on DOM elements over calling attribute methods. | ✅ | 🔧 | |
140
143
  | [prefer-dom-node-remove](docs/rules/prefer-dom-node-remove.md) | Prefer `childNode.remove()` over `parentNode.removeChild(childNode)`. | ✅ | 🔧 | 💡 |
@@ -179,6 +182,7 @@ export default [
179
182
  | [prevent-abbreviations](docs/rules/prevent-abbreviations.md) | Prevent abbreviations. | ✅ | 🔧 | |
180
183
  | [relative-url-style](docs/rules/relative-url-style.md) | Enforce consistent relative URL style. | ✅ | 🔧 | 💡 |
181
184
  | [require-array-join-separator](docs/rules/require-array-join-separator.md) | Enforce using the separator argument with `Array#join()`. | ✅ | 🔧 | |
185
+ | [require-module-specifiers](docs/rules/require-module-specifiers.md) | Require non-empty specifier list in import and export statements. | ✅ | 🔧 | 💡 |
182
186
  | [require-number-to-fixed-digits-argument](docs/rules/require-number-to-fixed-digits-argument.md) | Enforce using the digits argument with `Number#toFixed()`. | ✅ | 🔧 | |
183
187
  | [require-post-message-target-origin](docs/rules/require-post-message-target-origin.md) | Enforce using the `targetOrigin` argument with `window.postMessage()`. | | | 💡 |
184
188
  | [string-content](docs/rules/string-content.md) | Enforce better string content. | | 🔧 | 💡 |
@@ -11,6 +11,7 @@
11
11
  } | string | string[]
12
12
  } CallOrNewExpressionCheckOptions
13
13
  */
14
+ // eslint-disable-next-line complexity
14
15
  function create(node, options, types) {
15
16
  if (!types.includes(node?.type)) {
16
17
  return false;
@@ -1,3 +1,4 @@
1
+ /* eslint-disable complexity */
1
2
  /**
2
3
  @param {
3
4
  {
@@ -1,6 +1,6 @@
1
1
  import {isRegExp} from 'node:util/types';
2
2
  import {findVariable} from '@eslint-community/eslint-utils';
3
- import {getAvailableVariableName} from './utils/index.js';
3
+ import {getAvailableVariableName, upperFirst} from './utils/index.js';
4
4
  import {renameVariable} from './fix/index.js';
5
5
  import {isMethodCall} from './ast/index.js';
6
6
 
@@ -47,7 +47,7 @@ const create = context => {
47
47
  name === expectedName
48
48
  || ignore.some(regexp => regexp.test(name))
49
49
  || name.endsWith(expectedName)
50
- || name.endsWith(expectedName.charAt(0).toUpperCase() + expectedName.slice(1));
50
+ || name.endsWith(upperFirst(expectedName));
51
51
 
52
52
  return {
53
53
  Identifier(node) {
@@ -157,7 +157,6 @@ const config = {
157
157
  description: 'Use destructured variables over properties.',
158
158
  recommended: false,
159
159
  },
160
- fixable: 'code',
161
160
  hasSuggestions: true,
162
161
  messages: {
163
162
  [MESSAGE_ID]: 'Use destructured variables over properties.',
@@ -1,4 +1,4 @@
1
- import {upperFirst} from './utils/lodash.js';
1
+ import {upperFirst} from './utils/index.js';
2
2
 
3
3
  const MESSAGE_ID_INVALID_EXPORT = 'invalidExport';
4
4
  const messages = {
@@ -1,5 +1,4 @@
1
1
  import {getStaticValue} from '@eslint-community/eslint-utils';
2
- import isShadowed from './utils/is-shadowed.js';
3
2
  import {isCallOrNewExpression} from './ast/index.js';
4
3
  import builtinErrors from './shared/builtin-errors.js';
5
4
 
@@ -12,23 +11,28 @@ const messages = {
12
11
  [MESSAGE_ID_NOT_STRING]: 'Error message should be a string.',
13
12
  };
14
13
 
14
+ const messageArgumentIndexes = new Map([
15
+ ['AggregateError', 1],
16
+ ['SuppressedError', 2],
17
+ ]);
18
+
15
19
  /** @param {import('eslint').Rule.RuleContext} context */
16
20
  const create = context => {
17
21
  context.on(['CallExpression', 'NewExpression'], expression => {
18
- if (!isCallOrNewExpression(expression, {
19
- names: builtinErrors,
20
- optional: false,
21
- })) {
22
- return;
23
- }
24
-
25
- const scope = context.sourceCode.getScope(expression);
26
- if (isShadowed(scope, expression.callee)) {
22
+ if (!(
23
+ isCallOrNewExpression(expression, {
24
+ names: builtinErrors,
25
+ optional: false,
26
+ })
27
+ && context.sourceCode.isGlobalReference(expression.callee)
28
+ )) {
27
29
  return;
28
30
  }
29
31
 
30
32
  const constructorName = expression.callee.name;
31
- const messageArgumentIndex = constructorName === 'AggregateError' ? 1 : 0;
33
+ const messageArgumentIndex = messageArgumentIndexes.has(constructorName)
34
+ ? messageArgumentIndexes.get(constructorName)
35
+ : 0;
32
36
  const callArguments = expression.arguments;
33
37
 
34
38
  // If message is `SpreadElement` or there is `SpreadElement` before message
@@ -54,7 +58,7 @@ const create = context => {
54
58
  };
55
59
  }
56
60
 
57
- const staticResult = getStaticValue(node, scope);
61
+ const staticResult = getStaticValue(node, context.sourceCode.getScope(node));
58
62
 
59
63
  // We don't know the value of `message`
60
64
  if (!staticResult) {
@@ -317,6 +317,7 @@ const create = context => {
317
317
  });
318
318
  const rules = baseRule.create(fakeContext);
319
319
 
320
+ // eslint-disable-next-line complexity
320
321
  function processComment(comment) {
321
322
  if (ignoreRegexes.some(ignore => ignore.test(comment.value))) {
322
323
  return;
@@ -4,8 +4,8 @@ import {
4
4
  camelCase,
5
5
  kebabCase,
6
6
  snakeCase,
7
- upperFirst,
8
- } from './utils/lodash.js';
7
+ pascalCase,
8
+ } from 'change-case';
9
9
  import cartesianProductSamples from './utils/cartesian-product-samples.js';
10
10
 
11
11
  const MESSAGE_ID = 'filename-case';
@@ -15,35 +15,10 @@ const messages = {
15
15
  [MESSAGE_ID_EXTENSION]: 'File extension `{{extension}}` is not in lowercase. Rename it to `{{filename}}`.',
16
16
  };
17
17
 
18
- const pascalCase = string => upperFirst(camelCase(string));
19
- const numberRegex = /\d+/;
20
- const PLACEHOLDER = '\uFFFF\uFFFF\uFFFF';
21
- const PLACEHOLDER_REGEX = new RegExp(PLACEHOLDER, 'i');
22
18
  const isIgnoredChar = char => !/^[a-z\d-_]$/i.test(char);
23
19
  const ignoredByDefault = new Set(['index.js', 'index.mjs', 'index.cjs', 'index.ts', 'index.tsx', 'index.vue']);
24
20
  const isLowerCase = string => string === string.toLowerCase();
25
21
 
26
- function ignoreNumbers(caseFunction) {
27
- return string => {
28
- const stack = [];
29
- let execResult = numberRegex.exec(string);
30
-
31
- while (execResult) {
32
- stack.push(execResult[0]);
33
- string = string.replace(execResult[0], PLACEHOLDER);
34
- execResult = numberRegex.exec(string);
35
- }
36
-
37
- let withCase = caseFunction(string);
38
-
39
- while (stack.length > 0) {
40
- withCase = withCase.replace(PLACEHOLDER_REGEX, stack.shift());
41
- }
42
-
43
- return withCase;
44
- };
45
- }
46
-
47
22
  const cases = {
48
23
  camelCase: {
49
24
  fn: camelCase,
@@ -172,7 +147,7 @@ const create = context => {
172
147
  return new RegExp(item, 'u');
173
148
  });
174
149
  const multipleFileExtensions = options.multipleFileExtensions !== false;
175
- const chosenCasesFunctions = chosenCases.map(case_ => ignoreNumbers(cases[case_].fn));
150
+ const chosenCasesFunctions = chosenCases.map(case_ => cases[case_].fn);
176
151
  const filenameWithExtension = context.physicalFilename;
177
152
 
178
153
  if (filenameWithExtension === '<input>' || filenameWithExtension === '<text>') {
@@ -1,5 +1,6 @@
1
1
  import {getParentheses} from '../utils/parentheses.js';
2
2
 
3
+ // eslint-disable-next-line max-params
3
4
  export default function * replaceNodeOrTokenAndSpacesBefore(nodeOrToken, replacement, fixer, sourceCode, tokenStore = sourceCode) {
4
5
  const tokens = getParentheses(nodeOrToken, tokenStore);
5
6
 
@@ -1,5 +1,4 @@
1
1
  import {getStringIfConstant} from '@eslint-community/eslint-utils';
2
- import {defaultsDeep} from './utils/lodash.js';
3
2
  import {isCallExpression} from './ast/index.js';
4
3
 
5
4
  const MESSAGE_ID = 'importStyle';
@@ -141,7 +140,10 @@ const create = context => {
141
140
  ] = context.options;
142
141
 
143
142
  styles = extendDefaultStyles
144
- ? defaultsDeep({}, styles, defaultStyles)
143
+ ? Object.fromEntries(
144
+ [...Object.keys(defaultStyles), ...Object.keys(styles)]
145
+ .map(name => [name, styles[name] === false ? {} : {...defaultStyles[name], ...styles[name]}]),
146
+ )
145
147
  : styles;
146
148
 
147
149
  styles = new Map(
@@ -153,6 +155,7 @@ const create = context => {
153
155
 
154
156
  const {sourceCode} = context;
155
157
 
158
+ // eslint-disable-next-line max-params
156
159
  const report = (node, moduleName, actualImportStyles, allowedImportStyles, isRequire = false) => {
157
160
  if (!allowedImportStyles || allowedImportStyles.size === 0) {
158
161
  return;