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.
- package/index.js +5 -2
- package/package.json +38 -39
- package/readme.md +6 -2
- package/rules/ast/call-or-new-expression.js +1 -0
- package/rules/ast/is-member-expression.js +1 -0
- package/rules/catch-error-name.js +2 -2
- package/rules/consistent-destructuring.js +0 -1
- package/rules/custom-error-definition.js +1 -1
- package/rules/error-message.js +16 -12
- package/rules/expiring-todo-comments.js +1 -0
- package/rules/filename-case.js +3 -28
- package/rules/fix/replace-node-or-token-and-spaces-before.js +1 -0
- package/rules/import-style.js +5 -2
- package/rules/index.js +134 -266
- package/rules/no-anonymous-default-export.js +2 -2
- package/rules/no-array-callback-reference.js +0 -1
- package/rules/no-array-reverse.js +109 -0
- package/rules/no-nested-ternary.js +2 -2
- package/rules/no-typeof-undefined.js +2 -2
- package/rules/no-unnecessary-array-flat-depth.js +0 -1
- package/rules/no-unnecessary-await.js +5 -1
- package/rules/no-unnecessary-polyfills.js +1 -1
- package/rules/no-useless-error-capture-stack-trace.js +146 -0
- package/rules/prefer-at.js +22 -23
- package/rules/prefer-class-fields.js +158 -0
- package/rules/prefer-default-parameters.js +0 -1
- package/rules/prefer-math-min-max.js +1 -0
- package/rules/prefer-modern-dom-apis.js +3 -1
- package/rules/prefer-module.js +10 -12
- package/rules/prefer-set-has.js +8 -15
- package/rules/prefer-single-call.js +1 -1
- package/rules/prefer-string-raw.js +4 -18
- package/rules/prefer-string-replace-all.js +37 -4
- package/rules/prefer-ternary.js +1 -0
- package/rules/prevent-abbreviations.js +7 -3
- package/rules/require-module-specifiers.js +158 -0
- package/rules/shared/builtin-errors.js +1 -1
- package/rules/template-indent.js +1 -1
- package/rules/text-encoding-identifier-case.js +7 -8
- package/rules/utils/global-reference-tracker.js +1 -1
- package/rules/utils/index.js +2 -1
- package/rules/utils/is-number.js +1 -0
- package/rules/utils/is-unresolved-variable.js +14 -0
- package/rules/utils/needs-semicolon.js +1 -0
- package/rules/utils/rule.js +20 -18
- package/rules/utils/string-cases.js +2 -0
- package/rules/utils/is-shadowed.js +0 -31
- 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
|
|
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": "
|
|
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": "^
|
|
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
|
|
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.
|
|
61
|
-
"@eslint-community/eslint-utils": "^4.
|
|
62
|
-
"@eslint/plugin-kit": "^0.
|
|
63
|
-
"
|
|
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.
|
|
65
|
+
"core-js-compat": "^3.44.0",
|
|
66
66
|
"esquery": "^1.6.0",
|
|
67
67
|
"find-up-simple": "^1.0.1",
|
|
68
|
-
"globals": "^16.
|
|
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.
|
|
75
|
+
"semver": "^7.7.2",
|
|
76
76
|
"strip-indent": "^4.0.0"
|
|
77
77
|
},
|
|
78
78
|
"devDependencies": {
|
|
79
|
-
"@babel/code-frame": "^7.
|
|
80
|
-
"@babel/core": "^7.
|
|
81
|
-
"@babel/eslint-parser": "^7.
|
|
82
|
-
"@eslint/eslintrc": "^3.3.
|
|
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.
|
|
85
|
-
"ava": "^6.
|
|
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.
|
|
88
|
+
"eslint": "^9.29.0",
|
|
89
89
|
"eslint-ava-rule-tester": "^5.0.1",
|
|
90
|
-
"eslint-config-xo": "^0.
|
|
91
|
-
"eslint-doc-generator": "^2.
|
|
92
|
-
"eslint-plugin-eslint-plugin": "^6.
|
|
93
|
-
"eslint-plugin-jsdoc": "^
|
|
94
|
-
"eslint-remote-tester": "^4.0.
|
|
95
|
-
"eslint-remote-tester-repositories": "^2.0.
|
|
96
|
-
"espree": "^10.
|
|
97
|
-
"listr2": "^
|
|
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.
|
|
100
|
-
"
|
|
101
|
-
"
|
|
102
|
-
"
|
|
103
|
-
"npm-
|
|
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.
|
|
109
|
-
"vue-eslint-parser": "^10.
|
|
110
|
-
"yaml": "^2.
|
|
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.
|
|
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. | | 🔧 | 💡 |
|
|
@@ -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(
|
|
50
|
+
|| name.endsWith(upperFirst(expectedName));
|
|
51
51
|
|
|
52
52
|
return {
|
|
53
53
|
Identifier(node) {
|
package/rules/error-message.js
CHANGED
|
@@ -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 (!
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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
|
|
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,
|
|
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) {
|
package/rules/filename-case.js
CHANGED
|
@@ -4,8 +4,8 @@ import {
|
|
|
4
4
|
camelCase,
|
|
5
5
|
kebabCase,
|
|
6
6
|
snakeCase,
|
|
7
|
-
|
|
8
|
-
} from '
|
|
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_ =>
|
|
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
|
|
package/rules/import-style.js
CHANGED
|
@@ -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
|
-
?
|
|
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;
|