eslint-plugin-unicorn 69.0.0 → 71.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/package.json +26 -25
- package/readme.md +15 -1
- package/rules/ast/call-or-new-expression.js +2 -8
- package/rules/ast/is-member-expression.js +2 -8
- package/rules/comment-content.js +4 -4
- package/rules/consistent-boolean-name.js +727 -42
- package/rules/consistent-compound-words.js +1 -2
- package/rules/consistent-json-file-read.js +2 -5
- package/rules/dom-node-dataset.js +3 -7
- package/rules/escape-case.js +4 -4
- package/rules/expiring-todo-comments.js +25 -2
- package/rules/explicit-length-check.js +3 -3
- package/rules/filename-case.js +4 -4
- package/rules/fix/{add-parenthesizes-to-return-or-throw-expression.js → add-parentheses-to-return-or-throw-expression.js} +1 -1
- package/rules/fix/index.js +1 -1
- package/rules/fix/remove-argument.js +34 -8
- package/rules/fix/remove-statement.js +1 -3
- package/rules/fix/switch-new-expression-to-call-expression.js +2 -2
- package/rules/id-match.js +2 -2
- package/rules/index.js +10 -0
- package/rules/isolated-functions.js +203 -19
- package/rules/name-replacements.js +1 -2
- package/rules/no-anonymous-default-export.js +1 -3
- package/rules/no-array-callback-reference.js +2 -10
- package/rules/no-async-promise-finally.js +111 -0
- package/rules/no-chained-comparison.js +1 -1
- package/rules/no-collection-bracket-access.js +27 -4
- package/rules/no-computed-property-existence-check.js +1 -4
- package/rules/no-declarations-before-early-exit.js +6 -5
- package/rules/no-error-property-assignment.js +3 -3
- package/rules/no-for-loop.js +4 -4
- package/rules/no-keyword-prefix.js +2 -2
- package/rules/no-manually-wrapped-comments.js +5 -1
- package/rules/no-mismatched-map-key.js +13 -20
- package/rules/no-named-default.js +2 -5
- package/rules/no-negated-array-predicate.js +6 -13
- package/rules/no-negated-comparison.js +31 -71
- package/rules/no-negated-condition.js +2 -2
- package/rules/no-negation-in-equality-check.js +4 -7
- package/rules/no-non-function-verb-prefix.js +25 -2
- package/rules/no-process-exit.js +6 -6
- package/rules/no-return-array-push.js +9 -2
- package/rules/no-static-only-class.js +2 -8
- package/rules/no-thenable.js +9 -15
- package/rules/no-typeof-undefined.js +2 -2
- package/rules/no-undeclared-class-members.js +1 -5
- package/rules/no-unnecessary-array-flat-map.js +308 -0
- package/rules/no-unnecessary-await.js +2 -2
- package/rules/no-unnecessary-fetch-options.js +624 -0
- package/rules/no-unnecessary-global-this.js +5 -9
- package/rules/no-unsafe-promise-all-settled-values.js +865 -0
- package/rules/no-unused-properties.js +0 -1
- package/rules/no-useless-coercion.js +1 -2
- package/rules/no-useless-else.js +32 -1
- package/rules/no-useless-iterator-to-array.js +42 -16
- package/rules/no-useless-spread.js +2 -2
- package/rules/no-useless-undefined.js +2 -2
- package/rules/prefer-abort-signal-any.js +1391 -0
- package/rules/prefer-array-find.js +2 -5
- package/rules/prefer-array-flat-map.js +6 -11
- package/rules/prefer-array-from-range.js +98 -0
- package/rules/prefer-bigint-literals.js +1 -0
- package/rules/prefer-block-statement-over-iife.js +159 -0
- package/rules/prefer-boolean-return.js +20 -3
- package/rules/prefer-continue.js +6 -2
- package/rules/prefer-default-parameters.js +2 -2
- package/rules/prefer-early-return.js +3 -1
- package/rules/prefer-else-if.js +5 -9
- package/rules/prefer-group-by.js +576 -0
- package/rules/prefer-has-check.js +6 -3
- package/rules/prefer-https.js +3 -3
- package/rules/prefer-identifier-import-export-specifiers.js +1 -3
- package/rules/prefer-iterator-helpers.js +196 -0
- package/rules/prefer-minimal-ternary.js +4 -4
- package/rules/prefer-number-coercion.js +1 -1
- package/rules/prefer-object-define-properties.js +1 -3
- package/rules/prefer-object-iterable-methods.js +57 -14
- package/rules/prefer-observer-apis.js +2 -5
- package/rules/prefer-private-class-fields.js +1 -3
- package/rules/prefer-simple-sort-comparator.js +6 -6
- package/rules/prefer-simplified-conditions.js +584 -0
- package/rules/prefer-single-object-destructuring.js +2 -5
- package/rules/prefer-single-replace.js +2 -2
- package/rules/prefer-spread.js +25 -32
- package/rules/prefer-string-pad-start-end.js +1 -6
- package/rules/prefer-string-raw.js +2 -2
- package/rules/prefer-string-repeat.js +16 -9
- package/rules/prefer-string-replace-all.js +1 -1
- package/rules/prefer-ternary.js +5 -5
- package/rules/prefer-toggle-attribute.js +3 -3
- package/rules/prefer-top-level-await.js +6 -1
- package/rules/prefer-uint8array-base64.js +3 -1
- package/rules/require-proxy-trap-boolean-return.js +2 -2
- package/rules/rule/to-eslint-create.js +1 -2
- package/rules/rule/to-eslint-listener.js +1 -3
- package/rules/rule/to-eslint-problem.js +1 -3
- package/rules/rule/to-eslint-rule-fixer.js +1 -3
- package/rules/rule/to-eslint-rule.js +1 -3
- package/rules/rule/to-eslint-rules.js +1 -3
- package/rules/rule/unicorn-context.js +1 -3
- package/rules/rule/unicorn-listeners.js +1 -3
- package/rules/shared/array-range.js +66 -0
- package/rules/shared/iterator-helpers.js +43 -1
- package/rules/shared/no-array-mutate-rule.js +1 -3
- package/rules/shared/regexp-escape.js +4 -4
- package/rules/utils/can-tokens-be-adjacent.js +95 -0
- package/rules/utils/comparison.js +65 -0
- package/rules/utils/escape-string.js +2 -8
- package/rules/utils/get-available-variable-name.js +2 -13
- package/rules/utils/get-precedence.js +112 -0
- package/rules/utils/get-token-store.js +1 -3
- package/rules/utils/global-reference-tracker.js +3 -6
- package/rules/utils/index.js +4 -0
- package/rules/utils/is-boolean.js +103 -30
- package/rules/utils/is-identifier-name.js +5 -0
- package/rules/utils/is-promise-type.js +1 -3
- package/rules/utils/is-react-hook-name.js +5 -0
- package/rules/utils/parentheses/get-parent-syntax-opening-parenthesis.js +1 -3
- package/rules/utils/parentheses/iterate-surrounding-parentheses.js +1 -1
- package/rules/utils/should-add-parentheses-to-await-expression-argument.js +4 -9
- package/rules/utils/should-add-parentheses-to-call-expression-callee.js +6 -12
- package/rules/utils/should-add-parentheses-to-unary-expression.js +7 -14
- package/rules/utils/to-location.js +1 -3
- package/rules/utils/track-branch-exits.js +8 -7
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import helperValidatorIdentifier from '@babel/helper-validator-identifier';
|
|
2
1
|
import {
|
|
3
2
|
getAvailableVariableName,
|
|
4
3
|
getScopes,
|
|
5
4
|
isShorthandPropertyValue,
|
|
6
5
|
lowerFirst,
|
|
7
6
|
upperFirst,
|
|
7
|
+
isIdentifierName,
|
|
8
8
|
} from './utils/index.js';
|
|
9
9
|
import {
|
|
10
10
|
isClassVariable,
|
|
@@ -17,7 +17,6 @@ import {renameVariable} from './fix/index.js';
|
|
|
17
17
|
|
|
18
18
|
const MESSAGE_ID_ERROR = 'consistent-compound-words/error';
|
|
19
19
|
const MESSAGE_ID_RENAME = 'consistent-compound-words/rename';
|
|
20
|
-
const {isIdentifierName} = helperValidatorIdentifier;
|
|
21
20
|
|
|
22
21
|
const messages = {
|
|
23
22
|
[MESSAGE_ID_ERROR]: 'Prefer `{{replacement}}` over `{{name}}`.',
|
|
@@ -113,15 +113,12 @@ function isBufferEncoding(node, scope) {
|
|
|
113
113
|
|
|
114
114
|
function isJsonReadFileCall(node, scope) {
|
|
115
115
|
if (
|
|
116
|
-
!(
|
|
117
|
-
node
|
|
116
|
+
!(node
|
|
118
117
|
&& node.type === 'CallExpression'
|
|
119
118
|
&& !node.optional
|
|
120
119
|
&& (node.arguments.length === 1 || node.arguments.length === 2)
|
|
121
120
|
&& node.arguments.every(node => node.type !== 'SpreadElement')
|
|
122
|
-
&& node.callee.type === 'MemberExpression'
|
|
123
|
-
&& !node.callee.optional
|
|
124
|
-
)
|
|
121
|
+
&& node.callee.type === 'MemberExpression') || node.callee.optional
|
|
125
122
|
) {
|
|
126
123
|
return false;
|
|
127
124
|
}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import helperValidatorIdentifier from '@babel/helper-validator-identifier';
|
|
2
1
|
import {findVariable} from '@eslint-community/eslint-utils';
|
|
3
2
|
import {
|
|
4
3
|
escapeString,
|
|
@@ -12,6 +11,7 @@ import {
|
|
|
12
11
|
needsSemicolon,
|
|
13
12
|
shouldAddParenthesesToMemberExpressionObject,
|
|
14
13
|
wouldRemoveComments,
|
|
14
|
+
isIdentifierName,
|
|
15
15
|
} from './utils/index.js';
|
|
16
16
|
import {removeStatement} from './fix/index.js';
|
|
17
17
|
import {
|
|
@@ -21,7 +21,6 @@ import {
|
|
|
21
21
|
isExpressionStatement,
|
|
22
22
|
} from './ast/index.js';
|
|
23
23
|
|
|
24
|
-
const {isIdentifierName} = helperValidatorIdentifier;
|
|
25
24
|
const MESSAGE_ID = 'prefer-dataset';
|
|
26
25
|
const INVERSE_MESSAGE_ID = 'prefer-attributes';
|
|
27
26
|
const messages = {
|
|
@@ -106,11 +105,8 @@ function getDatasetVariableReadMembers(variable) {
|
|
|
106
105
|
|
|
107
106
|
const {identifier} = reference;
|
|
108
107
|
const member = identifier.parent;
|
|
109
|
-
if (!(
|
|
110
|
-
member.
|
|
111
|
-
&& member.object === identifier
|
|
112
|
-
&& !member.optional
|
|
113
|
-
)) {
|
|
108
|
+
if (!(member.type === 'MemberExpression'
|
|
109
|
+
&& member.object === identifier) || member.optional) {
|
|
114
110
|
return;
|
|
115
111
|
}
|
|
116
112
|
|
package/rules/escape-case.js
CHANGED
|
@@ -24,14 +24,14 @@ const getProblem = ({node, original, regex = escapeCase, lowercase, fix}) => {
|
|
|
24
24
|
|
|
25
25
|
/** @param {import('eslint').Rule.RuleContext} context */
|
|
26
26
|
const create = context => {
|
|
27
|
-
const
|
|
27
|
+
const isLowercase = context.options[0] === 'lowercase';
|
|
28
28
|
|
|
29
29
|
context.on('Literal', node => {
|
|
30
30
|
if (isStringLiteral(node)) {
|
|
31
31
|
return getProblem({
|
|
32
32
|
node,
|
|
33
33
|
original: node.raw,
|
|
34
|
-
lowercase,
|
|
34
|
+
lowercase: isLowercase,
|
|
35
35
|
});
|
|
36
36
|
}
|
|
37
37
|
});
|
|
@@ -42,7 +42,7 @@ const create = context => {
|
|
|
42
42
|
node,
|
|
43
43
|
original: node.raw,
|
|
44
44
|
regex: escapePatternCase,
|
|
45
|
-
lowercase,
|
|
45
|
+
lowercase: isLowercase,
|
|
46
46
|
});
|
|
47
47
|
}
|
|
48
48
|
});
|
|
@@ -55,7 +55,7 @@ const create = context => {
|
|
|
55
55
|
return getProblem({
|
|
56
56
|
node,
|
|
57
57
|
original: node.value.raw,
|
|
58
|
-
lowercase,
|
|
58
|
+
lowercase: isLowercase,
|
|
59
59
|
fix: (fixer, fixed) => replaceTemplateElement(node, fixed, context, fixer),
|
|
60
60
|
});
|
|
61
61
|
});
|
|
@@ -23,6 +23,7 @@ const MESSAGE_ID_HAVE_PACKAGE = 'unicorn/havePackage';
|
|
|
23
23
|
const MESSAGE_ID_DONT_HAVE_PACKAGE = 'unicorn/dontHavePackage';
|
|
24
24
|
const MESSAGE_ID_VERSION_MATCHES = 'unicorn/versionMatches';
|
|
25
25
|
const MESSAGE_ID_PEER_VERSION_MATCHES = 'unicorn/peerVersionMatches';
|
|
26
|
+
const MESSAGE_ID_UNSUPPORTED_CATALOG_PROTOCOL = 'unicorn/unsupportedCatalogProtocol';
|
|
26
27
|
const MESSAGE_ID_ENGINE_MATCHES = 'unicorn/engineMatches';
|
|
27
28
|
const MESSAGE_ID_REMOVE_WHITESPACE = 'unicorn/removeWhitespaces';
|
|
28
29
|
const MESSAGE_ID_MISSING_AT_SYMBOL = 'unicorn/missingAtSymbol';
|
|
@@ -46,6 +47,8 @@ const messages = {
|
|
|
46
47
|
'Due since package version matched: {{comparison}}. {{message}}',
|
|
47
48
|
[MESSAGE_ID_PEER_VERSION_MATCHES]:
|
|
48
49
|
'Due since peer dependency version matched: {{comparison}}. {{message}}',
|
|
50
|
+
[MESSAGE_ID_UNSUPPORTED_CATALOG_PROTOCOL]:
|
|
51
|
+
'Cannot check {{dependencyType}} version because {{package}} uses the unsupported `catalog:` protocol. {{message}}',
|
|
49
52
|
[MESSAGE_ID_ENGINE_MATCHES]:
|
|
50
53
|
'Due since Node.js version matched: {{comparison}}. {{message}}',
|
|
51
54
|
[MESSAGE_ID_REMOVE_WHITESPACE]:
|
|
@@ -188,8 +191,8 @@ function getPackageHelpers(dirname) {
|
|
|
188
191
|
|
|
189
192
|
// Check if have to skip colon
|
|
190
193
|
// @example "TODO [...]: message here"
|
|
191
|
-
const
|
|
192
|
-
if (
|
|
194
|
+
const isDropColon = afterArguments[0] === ':';
|
|
195
|
+
if (isDropColon) {
|
|
193
196
|
return afterArguments.slice(1).trim();
|
|
194
197
|
}
|
|
195
198
|
|
|
@@ -284,6 +287,10 @@ function getRangeFloor(range) {
|
|
|
284
287
|
return semver.validRange(range) ? semver.minVersion(range) : undefined;
|
|
285
288
|
}
|
|
286
289
|
|
|
290
|
+
function isCatalogProtocol(rawVersion) {
|
|
291
|
+
return typeof rawVersion === 'string' && rawVersion.startsWith('catalog:');
|
|
292
|
+
}
|
|
293
|
+
|
|
287
294
|
const DEFAULT_OPTIONS = {
|
|
288
295
|
terms: ['todo', 'fixme', 'xxx'],
|
|
289
296
|
ignore: [],
|
|
@@ -480,6 +487,14 @@ const create = context => {
|
|
|
480
487
|
continue;
|
|
481
488
|
}
|
|
482
489
|
|
|
490
|
+
if (isCatalogProtocol(targetPackageRawVersion)) {
|
|
491
|
+
report(MESSAGE_ID_UNSUPPORTED_CATALOG_PROTOCOL, {
|
|
492
|
+
dependencyType: 'dependency',
|
|
493
|
+
package: dependency.name,
|
|
494
|
+
});
|
|
495
|
+
continue;
|
|
496
|
+
}
|
|
497
|
+
|
|
483
498
|
const targetPackageVersion = tryToCoerceVersion(targetPackageRawVersion);
|
|
484
499
|
|
|
485
500
|
/* c8 ignore start */
|
|
@@ -505,6 +520,14 @@ const create = context => {
|
|
|
505
520
|
continue;
|
|
506
521
|
}
|
|
507
522
|
|
|
523
|
+
if (isCatalogProtocol(targetPeerRawVersion)) {
|
|
524
|
+
report(MESSAGE_ID_UNSUPPORTED_CATALOG_PROTOCOL, {
|
|
525
|
+
dependencyType: 'peer dependency',
|
|
526
|
+
package: peerDependency.name,
|
|
527
|
+
});
|
|
528
|
+
continue;
|
|
529
|
+
}
|
|
530
|
+
|
|
508
531
|
const targetPeerVersion = getRangeFloor(targetPeerRawVersion);
|
|
509
532
|
|
|
510
533
|
if (targetPeerVersion && satisfiesRange(targetPeerVersion, peerDependency.condition, peerDependency.version)) {
|
|
@@ -250,7 +250,7 @@ function create(context) {
|
|
|
250
250
|
}
|
|
251
251
|
|
|
252
252
|
let node;
|
|
253
|
-
let
|
|
253
|
+
let isAutoFix = true;
|
|
254
254
|
let {isZeroLengthCheck, node: lengthCheckNode} = getLengthCheckNode(lengthNode);
|
|
255
255
|
if (lengthCheckNode) {
|
|
256
256
|
const {isNegative, node: ancestor} = getBooleanAncestor(lengthCheckNode, context);
|
|
@@ -266,7 +266,7 @@ function create(context) {
|
|
|
266
266
|
} else if (isLogicalExpression(lengthNode.parent) && lengthNode.parent.operator === '&&') {
|
|
267
267
|
isZeroLengthCheck = isNegative;
|
|
268
268
|
node = lengthNode;
|
|
269
|
-
|
|
269
|
+
isAutoFix = false;
|
|
270
270
|
}
|
|
271
271
|
}
|
|
272
272
|
|
|
@@ -287,7 +287,7 @@ function create(context) {
|
|
|
287
287
|
node,
|
|
288
288
|
isZeroLengthCheck,
|
|
289
289
|
lengthNode,
|
|
290
|
-
autoFix:
|
|
290
|
+
autoFix: isAutoFix && !isUnsafeNegationInBinaryExpression,
|
|
291
291
|
shouldSuggest: !isUnsafeNegationInBinaryExpression,
|
|
292
292
|
});
|
|
293
293
|
}
|
package/rules/filename-case.js
CHANGED
|
@@ -280,8 +280,8 @@ const create = context => {
|
|
|
280
280
|
|
|
281
281
|
return new RegExp(item, 'u');
|
|
282
282
|
});
|
|
283
|
-
const
|
|
284
|
-
const
|
|
283
|
+
const isMultipleFileExtensions = options.multipleFileExtensions !== false;
|
|
284
|
+
const isCheckDirectories = options.checkDirectories !== false;
|
|
285
285
|
const chosenCasesFunctions = chosenCases.map(case_ => cases[case_].fn);
|
|
286
286
|
|
|
287
287
|
onRoot(context, () => {
|
|
@@ -292,13 +292,13 @@ const create = context => {
|
|
|
292
292
|
filename,
|
|
293
293
|
middle,
|
|
294
294
|
extension,
|
|
295
|
-
} = getFilenameParts(basenameWithExtension, {multipleFileExtensions});
|
|
295
|
+
} = getFilenameParts(basenameWithExtension, {multipleFileExtensions: isMultipleFileExtensions});
|
|
296
296
|
|
|
297
297
|
if (pathSegments.some(segment => ignore.some(regexp => regexp.test(segment)))) {
|
|
298
298
|
return;
|
|
299
299
|
}
|
|
300
300
|
|
|
301
|
-
if (
|
|
301
|
+
if (isCheckDirectories) {
|
|
302
302
|
for (const directory of pathSegments.slice(0, -1)) {
|
|
303
303
|
const report = getInvalidDirectoryReport(directory, chosenCases, chosenCasesFunctions);
|
|
304
304
|
|
|
@@ -11,7 +11,7 @@ import {isSemicolonToken} from '@eslint-community/eslint-utils';
|
|
|
11
11
|
@param {ESLint.Rule.RuleContext} context - The ESLint rule context object.
|
|
12
12
|
@returns {ESLint.Rule.ReportFixer}
|
|
13
13
|
*/
|
|
14
|
-
export default function *
|
|
14
|
+
export default function * addParenthesesToReturnOrThrowExpression(fixer, node, context) {
|
|
15
15
|
if (node.type !== 'ReturnStatement' && node.type !== 'ThrowStatement') {
|
|
16
16
|
return;
|
|
17
17
|
}
|
package/rules/fix/index.js
CHANGED
|
@@ -21,4 +21,4 @@ export {default as replaceReferenceIdentifier} from './replace-reference-identif
|
|
|
21
21
|
export {default as replaceNodeOrTokenAndSpacesBefore} from './replace-node-or-token-and-spaces-before.js';
|
|
22
22
|
export {default as fixSpaceAroundKeyword} from './fix-space-around-keywords.js';
|
|
23
23
|
export {default as replaceStringRaw} from './replace-string-raw.js';
|
|
24
|
-
export {default as
|
|
24
|
+
export {default as addParenthesesToReturnOrThrowExpression} from './add-parentheses-to-return-or-throw-expression.js';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import {isCommaToken} from '@eslint-community/eslint-utils';
|
|
2
|
-
import {getParentheses} from '../utils/index.js';
|
|
2
|
+
import {getParentheses, hasCommentInRange} from '../utils/index.js';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
@import {TSESTree as ESTree} from '@typescript-eslint/types';
|
|
@@ -22,17 +22,22 @@ function getArgumentRemovalRange(node, context) {
|
|
|
22
22
|
let [start] = sourceCode.getRange(firstToken);
|
|
23
23
|
let [, end] = sourceCode.getRange(lastToken);
|
|
24
24
|
|
|
25
|
-
if (index !== 0) {
|
|
26
|
-
const commaToken = sourceCode.getTokenBefore(firstToken);
|
|
27
|
-
[start] = sourceCode.getRange(commaToken);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
// If the removed argument is the only argument, the trailing comma must be removed too
|
|
31
25
|
if (callOrNewExpression.arguments.length === 1) {
|
|
26
|
+
// The only argument: also drop a dangling trailing comma if present (`fn(a,)`).
|
|
32
27
|
const tokenAfter = sourceCode.getTokenAfter(lastToken);
|
|
33
28
|
if (isCommaToken(tokenAfter)) {
|
|
34
29
|
[, end] = sourceCode.getRange(tokenAfter);
|
|
35
30
|
}
|
|
31
|
+
} else if (index === 0) {
|
|
32
|
+
// First of several: remove it through the following comma and the gap after it, so
|
|
33
|
+
// `fn(a, b)` becomes `fn(b)` rather than `fn( b)`.
|
|
34
|
+
const commaToken = sourceCode.getTokenAfter(lastToken);
|
|
35
|
+
const tokenAfterComma = sourceCode.getTokenAfter(commaToken, {includeComments: true});
|
|
36
|
+
[end] = sourceCode.getRange(tokenAfterComma);
|
|
37
|
+
} else {
|
|
38
|
+
// Otherwise remove the comma that precedes it.
|
|
39
|
+
const commaToken = sourceCode.getTokenBefore(firstToken);
|
|
40
|
+
[start] = sourceCode.getRange(commaToken);
|
|
36
41
|
}
|
|
37
42
|
|
|
38
43
|
return [start, end];
|
|
@@ -45,7 +50,28 @@ function getArgumentRemovalRange(node, context) {
|
|
|
45
50
|
@returns {ESLint.Rule.Fix}
|
|
46
51
|
*/
|
|
47
52
|
export default function removeArgument(fixer, node, context) {
|
|
48
|
-
|
|
53
|
+
const removalRange = getArgumentRemovalRange(node, context);
|
|
54
|
+
const callOrNewExpression = node.parent;
|
|
55
|
+
const index = callOrNewExpression.arguments.indexOf(node);
|
|
56
|
+
|
|
57
|
+
if (
|
|
58
|
+
index === 0
|
|
59
|
+
&& callOrNewExpression.arguments.length > 1
|
|
60
|
+
&& hasCommentInRange(context, removalRange)
|
|
61
|
+
) {
|
|
62
|
+
const {sourceCode} = context;
|
|
63
|
+
const parentheses = getParentheses(node, context);
|
|
64
|
+
const lastToken = parentheses.at(-1) || node;
|
|
65
|
+
const [, argumentEnd] = sourceCode.getRange(lastToken);
|
|
66
|
+
const commaToken = sourceCode.getTokenAfter(lastToken);
|
|
67
|
+
const [commaStart, commaEnd] = sourceCode.getRange(commaToken);
|
|
68
|
+
const rangeText = sourceCode.text.slice(...removalRange);
|
|
69
|
+
const replacement = rangeText.slice(argumentEnd - removalRange[0], commaStart - removalRange[0]) + rangeText.slice(commaEnd - removalRange[0]);
|
|
70
|
+
|
|
71
|
+
return fixer.replaceTextRange(removalRange, replacement);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return fixer.removeRange(removalRange);
|
|
49
75
|
}
|
|
50
76
|
|
|
51
77
|
export {
|
|
@@ -3,7 +3,7 @@ import {isSemicolonToken} from '@eslint-community/eslint-utils';
|
|
|
3
3
|
const isWhitespaceOnly = text => /^\s*$/.test(text);
|
|
4
4
|
|
|
5
5
|
// Removes a statement node along with its surrounding whitespace, while preserving comments.
|
|
6
|
-
function removeStatement(statement, context, fixer, preserveSemiColon = false) {
|
|
6
|
+
export default function removeStatement(statement, context, fixer, preserveSemiColon = false) {
|
|
7
7
|
const {sourceCode} = context;
|
|
8
8
|
const {lines} = sourceCode;
|
|
9
9
|
let endToken = statement;
|
|
@@ -44,5 +44,3 @@ function removeStatement(statement, context, fixer, preserveSemiColon = false) {
|
|
|
44
44
|
|
|
45
45
|
return fixer.removeRange([start, end]);
|
|
46
46
|
}
|
|
47
|
-
|
|
48
|
-
export default removeStatement;
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
isParenthesized,
|
|
4
4
|
isOnSameLine,
|
|
5
5
|
} from '../utils/index.js';
|
|
6
|
-
import
|
|
6
|
+
import addParenthesesToReturnOrThrowExpression from './add-parentheses-to-return-or-throw-expression.js';
|
|
7
7
|
import removeSpaceAfter from './remove-spaces-after.js';
|
|
8
8
|
|
|
9
9
|
/**
|
|
@@ -39,6 +39,6 @@ export default function * switchNewExpressionToCallExpression(newExpression, con
|
|
|
39
39
|
if (!isOnSameLine(newToken, newExpression.callee, context) && !isParenthesized(newExpression, context)) {
|
|
40
40
|
// Ideally, we should use first parenthesis of the `callee`, and should check spaces after the `new` token
|
|
41
41
|
// But adding extra parentheses is harmless, no need to be too complicated
|
|
42
|
-
yield
|
|
42
|
+
yield addParenthesesToReturnOrThrowExpression(fixer, newExpression.parent, context);
|
|
43
43
|
}
|
|
44
44
|
}
|
package/rules/id-match.js
CHANGED
|
@@ -26,11 +26,11 @@ const shouldIgnoreNamedSpecifierReport = (problem, checkNamedSpecifiers) =>
|
|
|
26
26
|
@param {import('eslint').Rule.RuleContext} context
|
|
27
27
|
*/
|
|
28
28
|
const create = context => {
|
|
29
|
-
const
|
|
29
|
+
const isCheckNamedSpecifiers = context.options[1]?.checkNamedSpecifiers !== false;
|
|
30
30
|
const fakeContext = Object.create(context, {
|
|
31
31
|
report: {
|
|
32
32
|
value(problem) {
|
|
33
|
-
if (shouldIgnoreNamedSpecifierReport(problem,
|
|
33
|
+
if (shouldIgnoreNamedSpecifierReport(problem, isCheckNamedSpecifiers)) {
|
|
34
34
|
return;
|
|
35
35
|
}
|
|
36
36
|
|
package/rules/index.js
CHANGED
|
@@ -53,6 +53,7 @@ export {default as 'no-array-sort-for-min-max'} from './no-array-sort-for-min-ma
|
|
|
53
53
|
export {default as 'no-array-sort'} from './no-array-sort.js';
|
|
54
54
|
export {default as 'no-array-splice'} from './no-array-splice.js';
|
|
55
55
|
export {default as 'no-asterisk-prefix-in-documentation-comments'} from './no-asterisk-prefix-in-documentation-comments.js';
|
|
56
|
+
export {default as 'no-async-promise-finally'} from './no-async-promise-finally.js';
|
|
56
57
|
export {default as 'no-await-expression-member'} from './no-await-expression-member.js';
|
|
57
58
|
export {default as 'no-await-in-promise-methods'} from './no-await-in-promise-methods.js';
|
|
58
59
|
export {default as 'no-blob-to-file'} from './no-blob-to-file.js';
|
|
@@ -129,9 +130,11 @@ export {default as 'no-typeof-undefined'} from './no-typeof-undefined.js';
|
|
|
129
130
|
export {default as 'no-uncalled-method'} from './no-uncalled-method.js';
|
|
130
131
|
export {default as 'no-undeclared-class-members'} from './no-undeclared-class-members.js';
|
|
131
132
|
export {default as 'no-unnecessary-array-flat-depth'} from './no-unnecessary-array-flat-depth.js';
|
|
133
|
+
export {default as 'no-unnecessary-array-flat-map'} from './no-unnecessary-array-flat-map.js';
|
|
132
134
|
export {default as 'no-unnecessary-array-splice-count'} from './no-unnecessary-array-splice-count.js';
|
|
133
135
|
export {default as 'no-unnecessary-await'} from './no-unnecessary-await.js';
|
|
134
136
|
export {default as 'no-unnecessary-boolean-comparison'} from './no-unnecessary-boolean-comparison.js';
|
|
137
|
+
export {default as 'no-unnecessary-fetch-options'} from './no-unnecessary-fetch-options.js';
|
|
135
138
|
export {default as 'no-unnecessary-global-this'} from './no-unnecessary-global-this.js';
|
|
136
139
|
export {default as 'no-unnecessary-nested-ternary'} from './no-unnecessary-nested-ternary.js';
|
|
137
140
|
export {default as 'no-unnecessary-polyfills'} from './no-unnecessary-polyfills.js';
|
|
@@ -144,6 +147,7 @@ export {default as 'no-unreadable-new-expression'} from './no-unreadable-new-exp
|
|
|
144
147
|
export {default as 'no-unreadable-object-destructuring'} from './no-unreadable-object-destructuring.js';
|
|
145
148
|
export {default as 'no-unsafe-buffer-conversion'} from './no-unsafe-buffer-conversion.js';
|
|
146
149
|
export {default as 'no-unsafe-dom-html'} from './no-unsafe-dom-html.js';
|
|
150
|
+
export {default as 'no-unsafe-promise-all-settled-values'} from './no-unsafe-promise-all-settled-values.js';
|
|
147
151
|
export {default as 'no-unsafe-property-key'} from './no-unsafe-property-key.js';
|
|
148
152
|
export {default as 'no-unsafe-string-replacement'} from './no-unsafe-string-replacement.js';
|
|
149
153
|
export {default as 'no-unused-array-method-return'} from './no-unused-array-method-return.js';
|
|
@@ -173,6 +177,7 @@ export {default as 'no-zero-fractions'} from './no-zero-fractions.js';
|
|
|
173
177
|
export {default as 'number-literal-case'} from './number-literal-case.js';
|
|
174
178
|
export {default as 'numeric-separators-style'} from './numeric-separators-style.js';
|
|
175
179
|
export {default as 'operator-assignment'} from './operator-assignment.js';
|
|
180
|
+
export {default as 'prefer-abort-signal-any'} from './prefer-abort-signal-any.js';
|
|
176
181
|
export {default as 'prefer-abort-signal-timeout'} from './prefer-abort-signal-timeout.js';
|
|
177
182
|
export {default as 'prefer-add-event-listener-options'} from './prefer-add-event-listener-options.js';
|
|
178
183
|
export {default as 'prefer-add-event-listener'} from './prefer-add-event-listener.js';
|
|
@@ -182,6 +187,7 @@ export {default as 'prefer-array-flat-map'} from './prefer-array-flat-map.js';
|
|
|
182
187
|
export {default as 'prefer-array-flat'} from './prefer-array-flat.js';
|
|
183
188
|
export {default as 'prefer-array-from-async'} from './prefer-array-from-async.js';
|
|
184
189
|
export {default as 'prefer-array-from-map'} from './prefer-array-from-map.js';
|
|
190
|
+
export {default as 'prefer-array-from-range'} from './prefer-array-from-range.js';
|
|
185
191
|
export {default as 'prefer-array-index-of'} from './prefer-array-index-of.js';
|
|
186
192
|
export {default as 'prefer-array-iterable-methods'} from './prefer-array-iterable-methods.js';
|
|
187
193
|
export {default as 'prefer-array-last-methods'} from './prefer-array-last-methods.js';
|
|
@@ -191,6 +197,7 @@ export {default as 'prefer-at'} from './prefer-at.js';
|
|
|
191
197
|
export {default as 'prefer-await'} from './prefer-await.js';
|
|
192
198
|
export {default as 'prefer-bigint-literals'} from './prefer-bigint-literals.js';
|
|
193
199
|
export {default as 'prefer-blob-reading-methods'} from './prefer-blob-reading-methods.js';
|
|
200
|
+
export {default as 'prefer-block-statement-over-iife'} from './prefer-block-statement-over-iife.js';
|
|
194
201
|
export {default as 'prefer-boolean-return'} from './prefer-boolean-return.js';
|
|
195
202
|
export {default as 'prefer-class-fields'} from './prefer-class-fields.js';
|
|
196
203
|
export {default as 'prefer-classlist-toggle'} from './prefer-classlist-toggle.js';
|
|
@@ -214,6 +221,7 @@ export {default as 'prefer-flat-math-min-max'} from './prefer-flat-math-min-max.
|
|
|
214
221
|
export {default as 'prefer-get-or-insert-computed'} from './prefer-get-or-insert-computed.js';
|
|
215
222
|
export {default as 'prefer-global-number-constants'} from './prefer-global-number-constants.js';
|
|
216
223
|
export {default as 'prefer-global-this'} from './prefer-global-this.js';
|
|
224
|
+
export {default as 'prefer-group-by'} from './prefer-group-by.js';
|
|
217
225
|
export {default as 'prefer-has-check'} from './prefer-has-check.js';
|
|
218
226
|
export {default as 'prefer-hoisting-branch-code'} from './prefer-hoisting-branch-code.js';
|
|
219
227
|
export {default as 'prefer-https'} from './prefer-https.js';
|
|
@@ -223,6 +231,7 @@ export {default as 'prefer-includes-over-repeated-comparisons'} from './prefer-i
|
|
|
223
231
|
export {default as 'prefer-includes'} from './prefer-includes.js';
|
|
224
232
|
export {default as 'prefer-iterable-in-constructor'} from './prefer-iterable-in-constructor.js';
|
|
225
233
|
export {default as 'prefer-iterator-concat'} from './prefer-iterator-concat.js';
|
|
234
|
+
export {default as 'prefer-iterator-helpers'} from './prefer-iterator-helpers.js';
|
|
226
235
|
export {default as 'prefer-iterator-to-array-at-end'} from './prefer-iterator-to-array-at-end.js';
|
|
227
236
|
export {default as 'prefer-iterator-to-array'} from './prefer-iterator-to-array.js';
|
|
228
237
|
export {default as 'prefer-keyboard-event-key'} from './prefer-keyboard-event-key.js';
|
|
@@ -267,6 +276,7 @@ export {default as 'prefer-set-size'} from './prefer-set-size.js';
|
|
|
267
276
|
export {default as 'prefer-short-arrow-method'} from './prefer-short-arrow-method.js';
|
|
268
277
|
export {default as 'prefer-simple-condition-first'} from './prefer-simple-condition-first.js';
|
|
269
278
|
export {default as 'prefer-simple-sort-comparator'} from './prefer-simple-sort-comparator.js';
|
|
279
|
+
export {default as 'prefer-simplified-conditions'} from './prefer-simplified-conditions.js';
|
|
270
280
|
export {default as 'prefer-single-array-predicate'} from './prefer-single-array-predicate.js';
|
|
271
281
|
export {default as 'prefer-single-call'} from './prefer-single-call.js';
|
|
272
282
|
export {default as 'prefer-single-object-destructuring'} from './prefer-single-object-destructuring.js';
|