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.
- package/index.d.ts +5 -5
- package/index.js +5 -9
- package/package.json +6 -8
- package/readme.md +2 -1
- package/rules/ast/index.js +1 -0
- package/rules/ast/is-empty-object-expression.js +5 -0
- package/rules/better-regex.js +88 -89
- package/rules/catch-error-name.js +54 -60
- package/rules/consistent-assert.js +6 -4
- package/rules/consistent-date-clone.js +4 -4
- package/rules/consistent-destructuring.js +93 -94
- package/rules/consistent-empty-array-spread.js +8 -12
- package/rules/consistent-existence-index-check.js +4 -5
- package/rules/consistent-function-scoping.js +1 -1
- package/rules/custom-error-definition.js +10 -2
- package/rules/expiring-todo-comments.js +8 -8
- package/rules/explicit-length-check.js +73 -60
- package/rules/filename-case.js +39 -41
- package/rules/fix/fix-space-around-keywords.js +1 -1
- package/rules/fix/remove-argument.js +1 -1
- package/rules/fix/remove-method-call.js +1 -1
- package/rules/fix/remove-parentheses.js +1 -1
- package/rules/fix/replace-argument.js +1 -1
- package/rules/fix/replace-member-expression-property.js +1 -1
- package/rules/fix/replace-node-or-token-and-spaces-before.js +1 -1
- package/rules/fix/switch-call-expression-to-new-expression.js +5 -3
- package/rules/fix/switch-new-expression-to-call-expression.js +6 -4
- package/rules/import-style.js +4 -0
- package/rules/index.js +1 -0
- package/rules/isolated-functions.js +202 -0
- package/rules/no-abusive-eslint-disable.js +13 -27
- package/rules/no-accessor-recursion.js +17 -20
- package/rules/no-anonymous-default-export.js +9 -5
- package/rules/no-array-callback-reference.js +5 -5
- package/rules/no-array-for-each.js +13 -10
- package/rules/no-array-method-this-argument.js +7 -4
- package/rules/no-array-reduce.js +16 -18
- package/rules/no-await-in-promise-methods.js +4 -4
- package/rules/no-console-spaces.js +33 -35
- package/rules/no-document-cookie.js +3 -1
- package/rules/no-empty-file.js +17 -19
- package/rules/no-for-loop.js +181 -103
- package/rules/no-hex-escape.js +7 -6
- package/rules/no-immediate-mutation.js +3 -3
- package/rules/no-instanceof-builtins.js +48 -51
- package/rules/no-invalid-remove-event-listener.js +4 -4
- package/rules/no-keyword-prefix.js +45 -47
- package/rules/no-lonely-if.js +7 -6
- package/rules/no-magic-array-flat-depth.js +4 -4
- package/rules/no-named-default.js +7 -6
- package/rules/no-negated-condition.js +9 -6
- package/rules/no-negation-in-equality-check.js +5 -5
- package/rules/no-nested-ternary.js +6 -6
- package/rules/no-new-array.js +10 -9
- package/rules/no-new-buffer.js +21 -23
- package/rules/no-null.js +91 -96
- package/rules/no-object-as-default-parameter.js +4 -4
- package/rules/no-process-exit.js +1 -1
- package/rules/no-single-promise-in-promise-methods.js +7 -9
- package/rules/no-typeof-undefined.js +76 -85
- package/rules/no-unnecessary-array-splice-count.js +3 -1
- package/rules/no-unnecessary-await.js +6 -8
- package/rules/no-unnecessary-polyfills.js +50 -46
- package/rules/no-unnecessary-slice-end.js +3 -1
- package/rules/no-unreadable-array-destructuring.js +45 -45
- package/rules/no-unreadable-iife.js +5 -7
- package/rules/no-unused-properties.js +9 -11
- package/rules/no-useless-collection-argument.js +45 -15
- package/rules/no-useless-fallback-in-spread.js +8 -7
- package/rules/no-useless-length-check.js +64 -63
- package/rules/no-useless-spread.js +11 -10
- package/rules/no-useless-switch-case.js +4 -4
- package/rules/no-useless-undefined.js +2 -6
- package/rules/no-zero-fractions.js +11 -9
- package/rules/number-literal-case.js +4 -4
- package/rules/numeric-separators-style.js +36 -57
- package/rules/prefer-add-event-listener.js +104 -104
- package/rules/prefer-array-find.js +1 -6
- package/rules/prefer-array-flat-map.js +4 -4
- package/rules/prefer-array-flat.js +28 -33
- package/rules/prefer-at.js +1 -5
- package/rules/prefer-bigint-literals.js +59 -11
- package/rules/prefer-blob-reading-methods.js +4 -4
- package/rules/prefer-class-fields.js +87 -89
- package/rules/prefer-code-point.js +7 -6
- package/rules/prefer-date-now.js +13 -10
- package/rules/prefer-dom-node-append.js +4 -4
- package/rules/prefer-dom-node-dataset.js +4 -4
- package/rules/prefer-dom-node-remove.js +67 -69
- package/rules/prefer-dom-node-text-content.js +7 -6
- package/rules/prefer-event-target.js +4 -4
- package/rules/prefer-export-from.js +70 -69
- package/rules/prefer-global-this.js +4 -4
- package/rules/prefer-json-parse-buffer.js +4 -4
- package/rules/prefer-keyboard-event-key.js +6 -6
- package/rules/prefer-logical-operator-over-ternary.js +36 -35
- package/rules/prefer-math-min-max.js +4 -5
- package/rules/prefer-modern-math-apis.js +62 -63
- package/rules/prefer-negative-index.js +6 -9
- package/rules/prefer-node-protocol.js +5 -10
- package/rules/prefer-number-properties.js +1 -5
- package/rules/prefer-object-from-entries.js +44 -49
- package/rules/prefer-optional-catch-binding.js +4 -4
- package/rules/prefer-prototype-methods.js +7 -5
- package/rules/prefer-query-selector.js +4 -4
- package/rules/prefer-reflect-apply.js +4 -4
- package/rules/prefer-regexp-test.js +4 -4
- package/rules/prefer-response-static-json.js +7 -8
- package/rules/prefer-set-has.js +23 -9
- package/rules/prefer-set-size.js +55 -35
- package/rules/prefer-single-call.js +71 -78
- package/rules/prefer-spread.js +30 -0
- package/rules/prefer-string-raw.js +5 -1
- package/rules/prefer-string-replace-all.js +4 -4
- package/rules/prefer-string-slice.js +11 -11
- package/rules/prefer-string-starts-ends-with.js +113 -111
- package/rules/prefer-string-trim-start-end.js +4 -4
- package/rules/prefer-structured-clone.js +2 -5
- package/rules/prefer-switch.js +39 -41
- package/rules/prefer-ternary.js +76 -78
- package/rules/prefer-top-level-await.js +65 -67
- package/rules/prefer-type-error.js +4 -4
- package/rules/prevent-abbreviations.js +48 -50
- package/rules/relative-url-style.js +5 -9
- package/rules/require-array-join-separator.js +4 -4
- package/rules/require-module-attributes.js +2 -2
- package/rules/require-number-to-fixed-digits-argument.js +4 -4
- package/rules/require-post-message-target-origin.js +33 -35
- package/rules/rule/index.js +1 -1
- package/rules/rule/to-eslint-create.js +5 -7
- package/rules/shared/is-jest-inline-snapshot.js +18 -0
- package/rules/shared/negative-index.js +4 -2
- package/rules/shared/no-array-mutate-rule.js +48 -49
- package/rules/shared/simple-array-search-rule.js +4 -4
- package/rules/string-content.js +2 -5
- package/rules/switch-case-braces.js +47 -49
- package/rules/template-indent.js +24 -50
- package/rules/throw-new-error.js +4 -4
- package/rules/utils/array-or-object-prototype-property.js +7 -11
- package/rules/utils/create-deprecated-rules.js +9 -2
- package/rules/utils/eslint-directive.js +21 -0
- package/rules/utils/index.js +15 -3
- package/rules/utils/parentheses/get-parent-syntax-opening-parenthesis.js +80 -0
- package/rules/utils/parentheses/iterate-surrounding-parentheses.js +82 -0
- package/rules/utils/parentheses/parentheses.js +81 -0
- 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.
|
|
6
|
-
unopinionated: Linter.
|
|
7
|
-
all: Linter.
|
|
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.
|
|
10
|
+
'flat/all': Linter.Config;
|
|
11
11
|
|
|
12
12
|
/** @deprecated Use `recommended` instead. The `flat/` prefix is no longer needed. */
|
|
13
|
-
'flat/recommended': Linter.
|
|
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 {
|
|
4
|
+
import {toEslintRules} from './rules/rule/index.js';
|
|
5
5
|
import packageJson from './package.json' with {type: 'json'};
|
|
6
6
|
|
|
7
|
-
const rules =
|
|
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
|
-
...
|
|
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
|
-
|
|
87
|
-
...unicorn,
|
|
88
|
-
configs,
|
|
89
|
-
};
|
|
85
|
+
unicorn.configs = configs;
|
|
90
86
|
|
|
91
|
-
export default
|
|
87
|
+
export default unicorn;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "eslint-plugin-unicorn",
|
|
3
|
-
"version": "
|
|
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.
|
|
85
|
-
"@typescript-eslint/types": "^8.
|
|
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": "^
|
|
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": "^
|
|
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. | ✅ ☑️ | 🔧 | |
|
package/rules/ast/index.js
CHANGED
|
@@ -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';
|
package/rules/better-regex.js
CHANGED
|
@@ -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
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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:
|
|
42
|
+
messageId: MESSAGE_ID_PARSE_ERROR,
|
|
58
43
|
data: {
|
|
59
44
|
original,
|
|
60
|
-
|
|
45
|
+
error: error.message,
|
|
61
46
|
},
|
|
62
47
|
};
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
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
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
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
|
-
*
|
|
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
|
|
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 = {
|