oxlint-plugin-eslint 1.52.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/LICENSE +22 -0
- package/README.md +36 -0
- package/common/ast-utils.cjs +5843 -0
- package/common/chunk.cjs +9 -0
- package/common/eslint-utils.cjs +1633 -0
- package/common/fix-tracker.cjs +89 -0
- package/common/ignore.cjs +123 -0
- package/common/keywords.cjs +15 -0
- package/common/regexpp.cjs +1720 -0
- package/common/regular-expressions.cjs +40 -0
- package/common/string-utils.cjs +39 -0
- package/index.js +7477 -0
- package/package.json +34 -0
- package/rules/accessor-pairs.cjs +233 -0
- package/rules/array-bracket-newline.cjs +172 -0
- package/rules/array-bracket-spacing.cjs +184 -0
- package/rules/array-callback-return.cjs +262 -0
- package/rules/array-element-newline.cjs +178 -0
- package/rules/arrow-body-style.cjs +135 -0
- package/rules/arrow-parens.cjs +130 -0
- package/rules/arrow-spacing.cjs +129 -0
- package/rules/block-scoped-var.cjs +101 -0
- package/rules/block-spacing.cjs +125 -0
- package/rules/brace-style.cjs +141 -0
- package/rules/callback-return.cjs +117 -0
- package/rules/camelcase.cjs +194 -0
- package/rules/capitalized-comments.cjs +168 -0
- package/rules/class-methods-use-this.cjs +155 -0
- package/rules/comma-dangle.cjs +274 -0
- package/rules/comma-spacing.cjs +111 -0
- package/rules/comma-style.cjs +180 -0
- package/rules/complexity.cjs +100 -0
- package/rules/computed-property-spacing.cjs +155 -0
- package/rules/consistent-return.cjs +113 -0
- package/rules/consistent-this.cjs +109 -0
- package/rules/constructor-super.cjs +207 -0
- package/rules/curly.cjs +173 -0
- package/rules/default-case-last.cjs +36 -0
- package/rules/default-case.cjs +50 -0
- package/rules/default-param-last.cjs +61 -0
- package/rules/dot-location.cjs +87 -0
- package/rules/dot-notation.cjs +77 -0
- package/rules/eol-last.cjs +91 -0
- package/rules/eqeqeq.cjs +127 -0
- package/rules/for-direction.cjs +94 -0
- package/rules/func-call-spacing.cjs +127 -0
- package/rules/func-name-matching.cjs +138 -0
- package/rules/func-names.cjs +121 -0
- package/rules/func-style.cjs +103 -0
- package/rules/function-call-argument-newline.cjs +109 -0
- package/rules/function-paren-newline.cjs +173 -0
- package/rules/generator-star-spacing.cjs +174 -0
- package/rules/getter-return.cjs +129 -0
- package/rules/global-require.cjs +84 -0
- package/rules/grouped-accessor-pairs.cjs +146 -0
- package/rules/guard-for-in.cjs +39 -0
- package/rules/handle-callback-err.cjs +86 -0
- package/rules/id-blacklist.cjs +135 -0
- package/rules/id-denylist.cjs +126 -0
- package/rules/id-length.cjs +119 -0
- package/rules/id-match.cjs +139 -0
- package/rules/implicit-arrow-linebreak.cjs +76 -0
- package/rules/indent-legacy.cjs +520 -0
- package/rules/indent.cjs +842 -0
- package/rules/init-declarations.cjs +88 -0
- package/rules/jsx-quotes.cjs +84 -0
- package/rules/key-spacing.cjs +399 -0
- package/rules/keyword-spacing.cjs +464 -0
- package/rules/line-comment-position.cjs +75 -0
- package/rules/linebreak-style.cjs +89 -0
- package/rules/lines-around-comment.cjs +290 -0
- package/rules/lines-around-directive.cjs +129 -0
- package/rules/lines-between-class-members.cjs +212 -0
- package/rules/logical-assignment-operators.cjs +305 -0
- package/rules/max-classes-per-file.cjs +61 -0
- package/rules/max-depth.cjs +117 -0
- package/rules/max-len.cjs +256 -0
- package/rules/max-lines-per-function.cjs +116 -0
- package/rules/max-lines.cjs +109 -0
- package/rules/max-nested-callbacks.cjs +78 -0
- package/rules/max-params.cjs +78 -0
- package/rules/max-statements-per-line.cjs +147 -0
- package/rules/max-statements.cjs +119 -0
- package/rules/multiline-comment-style.cjs +319 -0
- package/rules/multiline-ternary.cjs +106 -0
- package/rules/new-cap.cjs +139 -0
- package/rules/new-parens.cjs +70 -0
- package/rules/newline-after-var.cjs +159 -0
- package/rules/newline-before-return.cjs +128 -0
- package/rules/newline-per-chained-call.cjs +100 -0
- package/rules/no-alert.cjs +84 -0
- package/rules/no-array-constructor.cjs +91 -0
- package/rules/no-async-promise-executor.cjs +33 -0
- package/rules/no-await-in-loop.cjs +75 -0
- package/rules/no-bitwise.cjs +106 -0
- package/rules/no-buffer-constructor.cjs +51 -0
- package/rules/no-caller.cjs +34 -0
- package/rules/no-case-declarations.cjs +56 -0
- package/rules/no-catch-shadow.cjs +57 -0
- package/rules/no-class-assign.cjs +55 -0
- package/rules/no-compare-neg-zero.cjs +52 -0
- package/rules/no-cond-assign.cjs +104 -0
- package/rules/no-confusing-arrow.cjs +87 -0
- package/rules/no-console.cjs +138 -0
- package/rules/no-const-assign.cjs +50 -0
- package/rules/no-constant-binary-expression.cjs +284 -0
- package/rules/no-constant-condition.cjs +119 -0
- package/rules/no-constructor-return.cjs +43 -0
- package/rules/no-continue.cjs +33 -0
- package/rules/no-control-regex.cjs +74 -0
- package/rules/no-debugger.cjs +33 -0
- package/rules/no-delete-var.cjs +32 -0
- package/rules/no-div-regex.cjs +39 -0
- package/rules/no-dupe-args.cjs +61 -0
- package/rules/no-dupe-class-members.cjs +77 -0
- package/rules/no-dupe-else-if.cjs +74 -0
- package/rules/no-dupe-keys.cjs +88 -0
- package/rules/no-duplicate-case.cjs +49 -0
- package/rules/no-duplicate-imports.cjs +166 -0
- package/rules/no-else-return.cjs +182 -0
- package/rules/no-empty-character-class.cjs +47 -0
- package/rules/no-empty-function.cjs +141 -0
- package/rules/no-empty-pattern.cjs +50 -0
- package/rules/no-empty-static-block.cjs +50 -0
- package/rules/no-empty.cjs +78 -0
- package/rules/no-eq-null.cjs +34 -0
- package/rules/no-eval.cjs +165 -0
- package/rules/no-ex-assign.cjs +45 -0
- package/rules/no-extend-native.cjs +103 -0
- package/rules/no-extra-bind.cjs +127 -0
- package/rules/no-extra-boolean-cast.cjs +159 -0
- package/rules/no-extra-label.cjs +116 -0
- package/rules/no-extra-parens.cjs +665 -0
- package/rules/no-extra-semi.cjs +103 -0
- package/rules/no-fallthrough.cjs +136 -0
- package/rules/no-floating-decimal.cjs +66 -0
- package/rules/no-func-assign.cjs +63 -0
- package/rules/no-global-assign.cjs +62 -0
- package/rules/no-implicit-coercion.cjs +219 -0
- package/rules/no-implicit-globals.cjs +77 -0
- package/rules/no-implied-eval.cjs +87 -0
- package/rules/no-import-assign.cjs +123 -0
- package/rules/no-inline-comments.cjs +57 -0
- package/rules/no-inner-declarations.cjs +82 -0
- package/rules/no-invalid-regexp.cjs +130 -0
- package/rules/no-invalid-this.cjs +90 -0
- package/rules/no-irregular-whitespace.cjs +157 -0
- package/rules/no-iterator.cjs +34 -0
- package/rules/no-label-var.cjs +46 -0
- package/rules/no-labels.cjs +106 -0
- package/rules/no-lone-blocks.cjs +75 -0
- package/rules/no-lonely-if.cjs +42 -0
- package/rules/no-loop-func.cjs +143 -0
- package/rules/no-loss-of-precision.cjs +160 -0
- package/rules/no-magic-numbers.cjs +222 -0
- package/rules/no-misleading-character-class.cjs +500 -0
- package/rules/no-mixed-operators.cjs +197 -0
- package/rules/no-mixed-requires.cjs +117 -0
- package/rules/no-mixed-spaces-and-tabs.cjs +87 -0
- package/rules/no-multi-assign.cjs +38 -0
- package/rules/no-multi-spaces.cjs +95 -0
- package/rules/no-multi-str.cjs +44 -0
- package/rules/no-multiple-empty-lines.cjs +112 -0
- package/rules/no-native-reassign.cjs +72 -0
- package/rules/no-negated-condition.cjs +77 -0
- package/rules/no-negated-in-lhs.cjs +43 -0
- package/rules/no-nested-ternary.cjs +33 -0
- package/rules/no-new-func.cjs +50 -0
- package/rules/no-new-native-nonconstructor.cjs +42 -0
- package/rules/no-new-object.cjs +47 -0
- package/rules/no-new-require.cjs +50 -0
- package/rules/no-new-symbol.cjs +48 -0
- package/rules/no-new-wrappers.cjs +44 -0
- package/rules/no-new.cjs +33 -0
- package/rules/no-nonoctal-decimal-escape.cjs +80 -0
- package/rules/no-obj-calls.cjs +64 -0
- package/rules/no-object-constructor.cjs +69 -0
- package/rules/no-octal-escape.cjs +35 -0
- package/rules/no-octal.cjs +32 -0
- package/rules/no-param-reassign.cjs +135 -0
- package/rules/no-path-concat.cjs +52 -0
- package/rules/no-plusplus.cjs +64 -0
- package/rules/no-process-env.cjs +51 -0
- package/rules/no-process-exit.cjs +50 -0
- package/rules/no-promise-executor-return.cjs +131 -0
- package/rules/no-proto.cjs +34 -0
- package/rules/no-prototype-builtins.cjs +85 -0
- package/rules/no-redeclare.cjs +103 -0
- package/rules/no-regex-spaces.cjs +115 -0
- package/rules/no-restricted-exports.cjs +117 -0
- package/rules/no-restricted-globals.cjs +147 -0
- package/rules/no-restricted-imports.cjs +421 -0
- package/rules/no-restricted-modules.cjs +144 -0
- package/rules/no-restricted-properties.cjs +123 -0
- package/rules/no-restricted-syntax.cjs +49 -0
- package/rules/no-return-assign.cjs +45 -0
- package/rules/no-return-await.cjs +88 -0
- package/rules/no-script-url.cjs +49 -0
- package/rules/no-self-assign.cjs +88 -0
- package/rules/no-self-compare.cjs +53 -0
- package/rules/no-sequences.cjs +81 -0
- package/rules/no-setter-return.cjs +110 -0
- package/rules/no-shadow-restricted-names.cjs +60 -0
- package/rules/no-shadow.cjs +302 -0
- package/rules/no-spaced-func.cjs +69 -0
- package/rules/no-sparse-arrays.cjs +40 -0
- package/rules/no-sync.cjs +58 -0
- package/rules/no-tabs.cjs +73 -0
- package/rules/no-template-curly-in-string.cjs +33 -0
- package/rules/no-ternary.cjs +33 -0
- package/rules/no-this-before-super.cjs +177 -0
- package/rules/no-throw-literal.cjs +40 -0
- package/rules/no-trailing-spaces.cjs +123 -0
- package/rules/no-unassigned-vars.cjs +54 -0
- package/rules/no-undef-init.cjs +46 -0
- package/rules/no-undef.cjs +51 -0
- package/rules/no-undefined.cjs +58 -0
- package/rules/no-underscore-dangle.cjs +211 -0
- package/rules/no-unexpected-multiline.cjs +76 -0
- package/rules/no-unmodified-loop-condition.cjs +849 -0
- package/rules/no-unneeded-ternary.cjs +112 -0
- package/rules/no-unreachable-loop.cjs +128 -0
- package/rules/no-unreachable.cjs +195 -0
- package/rules/no-unsafe-finally.cjs +67 -0
- package/rules/no-unsafe-negation.cjs +86 -0
- package/rules/no-unsafe-optional-chaining.cjs +164 -0
- package/rules/no-unused-expressions.cjs +163 -0
- package/rules/no-unused-labels.cjs +97 -0
- package/rules/no-unused-private-class-members.cjs +69 -0
- package/rules/no-unused-vars.cjs +639 -0
- package/rules/no-use-before-define.cjs +245 -0
- package/rules/no-useless-assignment.cjs +250 -0
- package/rules/no-useless-backreference.cjs +137 -0
- package/rules/no-useless-call.cjs +57 -0
- package/rules/no-useless-catch.cjs +38 -0
- package/rules/no-useless-computed-key.cjs +106 -0
- package/rules/no-useless-concat.cjs +78 -0
- package/rules/no-useless-constructor.cjs +152 -0
- package/rules/no-useless-escape.cjs +164 -0
- package/rules/no-useless-rename.cjs +94 -0
- package/rules/no-useless-return.cjs +229 -0
- package/rules/no-var.cjs +235 -0
- package/rules/no-void.cjs +39 -0
- package/rules/no-warning-comments.cjs +112 -0
- package/rules/no-whitespace-before-property.cjs +72 -0
- package/rules/no-with.cjs +32 -0
- package/rules/nonblock-statement-body-position.cjs +107 -0
- package/rules/object-curly-newline.cjs +194 -0
- package/rules/object-curly-spacing.cjs +225 -0
- package/rules/object-property-newline.cjs +81 -0
- package/rules/object-shorthand.cjs +284 -0
- package/rules/one-var-declaration-per-line.cjs +75 -0
- package/rules/one-var.cjs +378 -0
- package/rules/operator-assignment.cjs +146 -0
- package/rules/operator-linebreak.cjs +150 -0
- package/rules/padded-blocks.cjs +192 -0
- package/rules/padding-line-between-statements.cjs +377 -0
- package/rules/prefer-arrow-callback.cjs +185 -0
- package/rules/prefer-const.cjs +240 -0
- package/rules/prefer-destructuring.cjs +188 -0
- package/rules/prefer-exponentiation-operator.cjs +100 -0
- package/rules/prefer-named-capture-group.cjs +111 -0
- package/rules/prefer-numeric-literals.cjs +75 -0
- package/rules/prefer-object-has-own.cjs +54 -0
- package/rules/prefer-object-spread.cjs +170 -0
- package/rules/prefer-promise-reject-errors.cjs +62 -0
- package/rules/prefer-reflect.cjs +100 -0
- package/rules/prefer-regex-literals.cjs +256 -0
- package/rules/prefer-rest-params.cjs +80 -0
- package/rules/prefer-spread.cjs +57 -0
- package/rules/prefer-template.cjs +147 -0
- package/rules/preserve-caught-error.cjs +196 -0
- package/rules/quote-props.cjs +224 -0
- package/rules/quotes.cjs +187 -0
- package/rules/radix.cjs +124 -0
- package/rules/require-atomic-updates.cjs +197 -0
- package/rules/require-await.cjs +90 -0
- package/rules/require-unicode-regexp.cjs +101 -0
- package/rules/require-yield.cjs +56 -0
- package/rules/rest-spread-spacing.cjs +99 -0
- package/rules/semi-spacing.cjs +215 -0
- package/rules/semi-style.cjs +116 -0
- package/rules/semi.cjs +239 -0
- package/rules/sort-imports.cjs +140 -0
- package/rules/sort-keys.cjs +165 -0
- package/rules/sort-vars.cjs +50 -0
- package/rules/space-before-blocks.cjs +132 -0
- package/rules/space-before-function-paren.cjs +126 -0
- package/rules/space-in-parens.cjs +175 -0
- package/rules/space-infix-ops.cjs +133 -0
- package/rules/space-unary-ops.cjs +237 -0
- package/rules/spaced-comment.cjs +233 -0
- package/rules/strict.cjs +206 -0
- package/rules/switch-colon-spacing.cjs +114 -0
- package/rules/symbol-description.cjs +49 -0
- package/rules/template-curly-spacing.cjs +112 -0
- package/rules/template-tag-spacing.cjs +82 -0
- package/rules/unicode-bom.cjs +52 -0
- package/rules/use-isnan.cjs +144 -0
- package/rules/valid-typeof.cjs +104 -0
- package/rules/vars-on-top.cjs +94 -0
- package/rules/wrap-iife.cjs +131 -0
- package/rules/wrap-regex.cjs +57 -0
- package/rules/yield-star-spacing.cjs +115 -0
- package/rules/yoda.cjs +185 -0
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
const require_chunk = require("../common/chunk.cjs"), require_ast_utils$1 = require("../common/ast-utils.cjs");
|
|
2
|
+
//#region ../../node_modules/.pnpm/eslint@9.39.3_jiti@2.6.1/node_modules/eslint/lib/rules/logical-assignment-operators.js
|
|
3
|
+
/**
|
|
4
|
+
* @fileoverview Rule to replace assignment expressions with logical operator assignment
|
|
5
|
+
* @author Daniel Martens
|
|
6
|
+
*/
|
|
7
|
+
var require_logical_assignment_operators = /* @__PURE__ */ require_chunk.t(((exports, module) => {
|
|
8
|
+
let astUtils = require_ast_utils$1.t(), baseTypes = new Set([
|
|
9
|
+
"Identifier",
|
|
10
|
+
"Super",
|
|
11
|
+
"ThisExpression"
|
|
12
|
+
]);
|
|
13
|
+
/**
|
|
14
|
+
* Returns true iff either "undefined" or a void expression (eg. "void 0")
|
|
15
|
+
* @param {ASTNode} expression Expression to check
|
|
16
|
+
* @param {import('eslint-scope').Scope} scope Scope of the expression
|
|
17
|
+
* @returns {boolean} True iff "undefined" or "void ..."
|
|
18
|
+
*/
|
|
19
|
+
function isUndefined(expression, scope) {
|
|
20
|
+
return expression.type === "Identifier" && expression.name === "undefined" ? astUtils.isReferenceToGlobalVariable(scope, expression) : expression.type === "UnaryExpression" && expression.operator === "void" && expression.argument.type === "Literal" && expression.argument.value === 0;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Returns true iff the reference is either an identifier or member expression
|
|
24
|
+
* @param {ASTNode} expression Expression to check
|
|
25
|
+
* @returns {boolean} True for identifiers and member expressions
|
|
26
|
+
*/
|
|
27
|
+
function isReference(expression) {
|
|
28
|
+
return expression.type === "Identifier" && expression.name !== "undefined" || expression.type === "MemberExpression";
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Returns true iff the expression checks for nullish with loose equals.
|
|
32
|
+
* Examples: value == null, value == void 0
|
|
33
|
+
* @param {ASTNode} expression Test condition
|
|
34
|
+
* @param {import('eslint-scope').Scope} scope Scope of the expression
|
|
35
|
+
* @returns {boolean} True iff implicit nullish comparison
|
|
36
|
+
*/
|
|
37
|
+
function isImplicitNullishComparison(expression, scope) {
|
|
38
|
+
if (expression.type !== "BinaryExpression" || expression.operator !== "==") return !1;
|
|
39
|
+
let reference = isReference(expression.left) ? "left" : "right", nullish = reference === "left" ? "right" : "left";
|
|
40
|
+
return isReference(expression[reference]) && (astUtils.isNullLiteral(expression[nullish]) || isUndefined(expression[nullish], scope));
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Condition with two equal comparisons.
|
|
44
|
+
* @param {ASTNode} expression Condition
|
|
45
|
+
* @returns {boolean} True iff matches ? === ? || ? === ?
|
|
46
|
+
*/
|
|
47
|
+
function isDoubleComparison(expression) {
|
|
48
|
+
return expression.type === "LogicalExpression" && expression.operator === "||" && expression.left.type === "BinaryExpression" && expression.left.operator === "===" && expression.right.type === "BinaryExpression" && expression.right.operator === "===";
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Returns true iff the expression checks for undefined and null.
|
|
52
|
+
* Example: value === null || value === undefined
|
|
53
|
+
* @param {ASTNode} expression Test condition
|
|
54
|
+
* @param {import('eslint-scope').Scope} scope Scope of the expression
|
|
55
|
+
* @returns {boolean} True iff explicit nullish comparison
|
|
56
|
+
*/
|
|
57
|
+
function isExplicitNullishComparison(expression, scope) {
|
|
58
|
+
if (!isDoubleComparison(expression)) return !1;
|
|
59
|
+
let leftReference = isReference(expression.left.left) ? "left" : "right", leftNullish = leftReference === "left" ? "right" : "left", rightReference = isReference(expression.right.left) ? "left" : "right", rightNullish = rightReference === "left" ? "right" : "left";
|
|
60
|
+
return astUtils.isSameReference(expression.left[leftReference], expression.right[rightReference]) && (astUtils.isNullLiteral(expression.left[leftNullish]) && isUndefined(expression.right[rightNullish], scope) || isUndefined(expression.left[leftNullish], scope) && astUtils.isNullLiteral(expression.right[rightNullish]));
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Returns true for Boolean(arg) calls
|
|
64
|
+
* @param {ASTNode} expression Test condition
|
|
65
|
+
* @param {import('eslint-scope').Scope} scope Scope of the expression
|
|
66
|
+
* @returns {boolean} Whether the expression is a boolean cast
|
|
67
|
+
*/
|
|
68
|
+
function isBooleanCast(expression, scope) {
|
|
69
|
+
return expression.type === "CallExpression" && expression.callee.name === "Boolean" && expression.arguments.length === 1 && astUtils.isReferenceToGlobalVariable(scope, expression.callee);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Returns true for:
|
|
73
|
+
* truthiness checks: value, Boolean(value), !!value
|
|
74
|
+
* falsiness checks: !value, !Boolean(value)
|
|
75
|
+
* nullish checks: value == null, value === undefined || value === null
|
|
76
|
+
* @param {ASTNode} expression Test condition
|
|
77
|
+
* @param {import('eslint-scope').Scope} scope Scope of the expression
|
|
78
|
+
* @returns {?{ reference: ASTNode, operator: '??'|'||'|'&&'}} Null if not a known existence
|
|
79
|
+
*/
|
|
80
|
+
function getExistence(expression, scope) {
|
|
81
|
+
let isNegated = expression.type === "UnaryExpression" && expression.operator === "!", base = isNegated ? expression.argument : expression;
|
|
82
|
+
switch (!0) {
|
|
83
|
+
case isReference(base): return {
|
|
84
|
+
reference: base,
|
|
85
|
+
operator: isNegated ? "||" : "&&"
|
|
86
|
+
};
|
|
87
|
+
case base.type === "UnaryExpression" && base.operator === "!" && isReference(base.argument): return {
|
|
88
|
+
reference: base.argument,
|
|
89
|
+
operator: "&&"
|
|
90
|
+
};
|
|
91
|
+
case isBooleanCast(base, scope) && isReference(base.arguments[0]): return {
|
|
92
|
+
reference: base.arguments[0],
|
|
93
|
+
operator: isNegated ? "||" : "&&"
|
|
94
|
+
};
|
|
95
|
+
case isImplicitNullishComparison(expression, scope): return {
|
|
96
|
+
reference: isReference(expression.left) ? expression.left : expression.right,
|
|
97
|
+
operator: "??"
|
|
98
|
+
};
|
|
99
|
+
case isExplicitNullishComparison(expression, scope): return {
|
|
100
|
+
reference: isReference(expression.left.left) ? expression.left.left : expression.left.right,
|
|
101
|
+
operator: "??"
|
|
102
|
+
};
|
|
103
|
+
default: return null;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Returns true iff the node is inside a with block
|
|
108
|
+
* @param {ASTNode} node Node to check
|
|
109
|
+
* @returns {boolean} True iff passed node is inside a with block
|
|
110
|
+
*/
|
|
111
|
+
function isInsideWithBlock(node) {
|
|
112
|
+
return node.type === "Program" ? !1 : node.parent.type === "WithStatement" && node.parent.body === node ? !0 : isInsideWithBlock(node.parent);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Gets the leftmost operand of a consecutive logical expression.
|
|
116
|
+
* @param {SourceCode} sourceCode The ESLint source code object
|
|
117
|
+
* @param {LogicalExpression} node LogicalExpression
|
|
118
|
+
* @returns {Expression} Leftmost operand
|
|
119
|
+
*/
|
|
120
|
+
function getLeftmostOperand(sourceCode, node) {
|
|
121
|
+
let left = node.left;
|
|
122
|
+
for (; left.type === "LogicalExpression" && left.operator === node.operator;) {
|
|
123
|
+
if (astUtils.isParenthesised(sourceCode, left)) return left;
|
|
124
|
+
left = left.left;
|
|
125
|
+
}
|
|
126
|
+
return left;
|
|
127
|
+
}
|
|
128
|
+
/** @type {import('../types').Rule.RuleModule} */
|
|
129
|
+
module.exports = {
|
|
130
|
+
meta: {
|
|
131
|
+
type: "suggestion",
|
|
132
|
+
docs: {
|
|
133
|
+
description: "Require or disallow logical assignment operator shorthand",
|
|
134
|
+
recommended: !1,
|
|
135
|
+
frozen: !0,
|
|
136
|
+
url: "https://eslint.org/docs/latest/rules/logical-assignment-operators"
|
|
137
|
+
},
|
|
138
|
+
schema: {
|
|
139
|
+
type: "array",
|
|
140
|
+
oneOf: [{
|
|
141
|
+
items: [{ const: "always" }, {
|
|
142
|
+
type: "object",
|
|
143
|
+
properties: { enforceForIfStatements: { type: "boolean" } },
|
|
144
|
+
additionalProperties: !1
|
|
145
|
+
}],
|
|
146
|
+
minItems: 0,
|
|
147
|
+
maxItems: 2
|
|
148
|
+
}, {
|
|
149
|
+
items: [{ const: "never" }],
|
|
150
|
+
minItems: 1,
|
|
151
|
+
maxItems: 1
|
|
152
|
+
}]
|
|
153
|
+
},
|
|
154
|
+
fixable: "code",
|
|
155
|
+
hasSuggestions: !0,
|
|
156
|
+
messages: {
|
|
157
|
+
assignment: "Assignment (=) can be replaced with operator assignment ({{operator}}).",
|
|
158
|
+
useLogicalOperator: "Convert this assignment to use the operator {{ operator }}.",
|
|
159
|
+
logical: "Logical expression can be replaced with an assignment ({{ operator }}).",
|
|
160
|
+
convertLogical: "Replace this logical expression with an assignment with the operator {{ operator }}.",
|
|
161
|
+
if: "'if' statement can be replaced with a logical operator assignment with operator {{ operator }}.",
|
|
162
|
+
convertIf: "Replace this 'if' statement with a logical assignment with operator {{ operator }}.",
|
|
163
|
+
unexpected: "Unexpected logical operator assignment ({{operator}}) shorthand.",
|
|
164
|
+
separate: "Separate the logical assignment into an assignment with a logical operator."
|
|
165
|
+
}
|
|
166
|
+
},
|
|
167
|
+
create(context) {
|
|
168
|
+
let mode = context.options[0] === "never" ? "never" : "always", checkIf = mode === "always" && context.options.length > 1 && context.options[1].enforceForIfStatements, sourceCode = context.sourceCode, isStrict = sourceCode.getScope(sourceCode.ast).isStrict;
|
|
169
|
+
/**
|
|
170
|
+
* Returns false if the access could be a getter
|
|
171
|
+
* @param {ASTNode} node Assignment expression
|
|
172
|
+
* @returns {boolean} True iff the fix is safe
|
|
173
|
+
*/
|
|
174
|
+
function cannotBeGetter(node) {
|
|
175
|
+
return node.type === "Identifier" && (isStrict || !isInsideWithBlock(node));
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Check whether only a single property is accessed
|
|
179
|
+
* @param {ASTNode} node reference
|
|
180
|
+
* @returns {boolean} True iff a single property is accessed
|
|
181
|
+
*/
|
|
182
|
+
function accessesSingleProperty(node) {
|
|
183
|
+
return !isStrict && isInsideWithBlock(node) ? node.type === "Identifier" : node.type === "MemberExpression" && baseTypes.has(node.object.type) && (!node.computed || node.property.type !== "MemberExpression" && node.property.type !== "ChainExpression");
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Adds a fixer or suggestion whether on the fix is safe.
|
|
187
|
+
* @param {{ messageId: string, node: ASTNode }} descriptor Report descriptor without fix or suggest
|
|
188
|
+
* @param {{ messageId: string, fix: Function }} suggestion Adds the fix or the whole suggestion as only element in "suggest" to suggestion
|
|
189
|
+
* @param {boolean} shouldBeFixed Fix iff the condition is true
|
|
190
|
+
* @returns {Object} Descriptor with either an added fix or suggestion
|
|
191
|
+
*/
|
|
192
|
+
function createConditionalFixer(descriptor, suggestion, shouldBeFixed) {
|
|
193
|
+
return shouldBeFixed ? {
|
|
194
|
+
...descriptor,
|
|
195
|
+
fix: suggestion.fix
|
|
196
|
+
} : {
|
|
197
|
+
...descriptor,
|
|
198
|
+
suggest: [suggestion]
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Returns the operator token for assignments and binary expressions
|
|
203
|
+
* @param {ASTNode} node AssignmentExpression or BinaryExpression
|
|
204
|
+
* @returns {import('eslint').AST.Token} Operator token between the left and right expression
|
|
205
|
+
*/
|
|
206
|
+
function getOperatorToken(node) {
|
|
207
|
+
return sourceCode.getFirstTokenBetween(node.left, node.right, (token) => token.value === node.operator);
|
|
208
|
+
}
|
|
209
|
+
return mode === "never" ? { AssignmentExpression(assignment) {
|
|
210
|
+
if (!astUtils.isLogicalAssignmentOperator(assignment.operator)) return;
|
|
211
|
+
let descriptor = {
|
|
212
|
+
messageId: "unexpected",
|
|
213
|
+
node: assignment,
|
|
214
|
+
data: { operator: assignment.operator }
|
|
215
|
+
};
|
|
216
|
+
context.report(createConditionalFixer(descriptor, {
|
|
217
|
+
messageId: "separate",
|
|
218
|
+
*fix(ruleFixer) {
|
|
219
|
+
if (sourceCode.getCommentsInside(assignment).length > 0) return;
|
|
220
|
+
let operatorToken = getOperatorToken(assignment);
|
|
221
|
+
yield ruleFixer.replaceText(operatorToken, "=");
|
|
222
|
+
let assignmentText = sourceCode.getText(assignment.left), operator = assignment.operator.slice(0, -1);
|
|
223
|
+
yield ruleFixer.insertTextAfter(operatorToken, ` ${assignmentText} ${operator}`);
|
|
224
|
+
let precedence = astUtils.getPrecedence(assignment.right) <= astUtils.getPrecedence({
|
|
225
|
+
type: "LogicalExpression",
|
|
226
|
+
operator
|
|
227
|
+
}), mixed = assignment.operator === "??=" && astUtils.isLogicalExpression(assignment.right);
|
|
228
|
+
!astUtils.isParenthesised(sourceCode, assignment.right) && (precedence || mixed) && (yield ruleFixer.insertTextBefore(assignment.right, "("), yield ruleFixer.insertTextAfter(assignment.right, ")"));
|
|
229
|
+
}
|
|
230
|
+
}, cannotBeGetter(assignment.left)));
|
|
231
|
+
} } : {
|
|
232
|
+
"AssignmentExpression[operator='='][right.type='LogicalExpression']"(assignment) {
|
|
233
|
+
let leftOperand = getLeftmostOperand(sourceCode, assignment.right);
|
|
234
|
+
if (!astUtils.isSameReference(assignment.left, leftOperand)) return;
|
|
235
|
+
let descriptor = {
|
|
236
|
+
messageId: "assignment",
|
|
237
|
+
node: assignment,
|
|
238
|
+
data: { operator: `${assignment.right.operator}=` }
|
|
239
|
+
}, suggestion = {
|
|
240
|
+
messageId: "useLogicalOperator",
|
|
241
|
+
data: { operator: `${assignment.right.operator}=` },
|
|
242
|
+
*fix(ruleFixer) {
|
|
243
|
+
if (sourceCode.getCommentsInside(assignment).length > 0) return;
|
|
244
|
+
let assignmentOperatorToken = getOperatorToken(assignment);
|
|
245
|
+
yield ruleFixer.insertTextBefore(assignmentOperatorToken, assignment.right.operator);
|
|
246
|
+
let logicalOperatorToken = getOperatorToken(leftOperand.parent), firstRightOperandToken = sourceCode.getTokenAfter(logicalOperatorToken);
|
|
247
|
+
yield ruleFixer.removeRange([leftOperand.parent.range[0], firstRightOperandToken.range[0]]);
|
|
248
|
+
}
|
|
249
|
+
};
|
|
250
|
+
context.report(createConditionalFixer(descriptor, suggestion, cannotBeGetter(assignment.left)));
|
|
251
|
+
},
|
|
252
|
+
"LogicalExpression[right.type=\"AssignmentExpression\"][right.operator=\"=\"]"(logical) {
|
|
253
|
+
if (isReference(logical.left) && astUtils.isSameReference(logical.left, logical.right.left)) {
|
|
254
|
+
let descriptor = {
|
|
255
|
+
messageId: "logical",
|
|
256
|
+
node: logical,
|
|
257
|
+
data: { operator: `${logical.operator}=` }
|
|
258
|
+
}, suggestion = {
|
|
259
|
+
messageId: "convertLogical",
|
|
260
|
+
data: { operator: `${logical.operator}=` },
|
|
261
|
+
*fix(ruleFixer) {
|
|
262
|
+
if (sourceCode.getCommentsInside(logical).length > 0) return;
|
|
263
|
+
let parentPrecedence = astUtils.getPrecedence(logical.parent), requiresOuterParenthesis = logical.parent.type !== "ExpressionStatement" && (parentPrecedence === -1 || astUtils.getPrecedence({ type: "AssignmentExpression" }) < parentPrecedence);
|
|
264
|
+
!astUtils.isParenthesised(sourceCode, logical) && requiresOuterParenthesis && (yield ruleFixer.insertTextBefore(logical, "("), yield ruleFixer.insertTextAfter(logical, ")")), yield ruleFixer.removeRange([logical.range[0], logical.right.range[0]]), yield ruleFixer.removeRange([logical.right.range[1], logical.range[1]]);
|
|
265
|
+
let operatorToken = getOperatorToken(logical.right);
|
|
266
|
+
yield ruleFixer.insertTextBefore(operatorToken, logical.operator);
|
|
267
|
+
}
|
|
268
|
+
}, fix = cannotBeGetter(logical.left) || accessesSingleProperty(logical.left);
|
|
269
|
+
context.report(createConditionalFixer(descriptor, suggestion, fix));
|
|
270
|
+
}
|
|
271
|
+
},
|
|
272
|
+
"IfStatement[alternate=null]"(ifNode) {
|
|
273
|
+
if (!checkIf) return;
|
|
274
|
+
let hasBody = ifNode.consequent.type === "BlockStatement";
|
|
275
|
+
if (hasBody && ifNode.consequent.body.length !== 1) return;
|
|
276
|
+
let body = hasBody ? ifNode.consequent.body[0] : ifNode.consequent, scope = sourceCode.getScope(ifNode), existence = getExistence(ifNode.test, scope);
|
|
277
|
+
if (body.type === "ExpressionStatement" && body.expression.type === "AssignmentExpression" && body.expression.operator === "=" && existence !== null && astUtils.isSameReference(existence.reference, body.expression.left)) {
|
|
278
|
+
let descriptor = {
|
|
279
|
+
messageId: "if",
|
|
280
|
+
node: ifNode,
|
|
281
|
+
data: { operator: `${existence.operator}=` }
|
|
282
|
+
}, suggestion = {
|
|
283
|
+
messageId: "convertIf",
|
|
284
|
+
data: { operator: `${existence.operator}=` },
|
|
285
|
+
*fix(ruleFixer) {
|
|
286
|
+
if (sourceCode.getCommentsInside(ifNode).length > 0) return;
|
|
287
|
+
let firstBodyToken = sourceCode.getFirstToken(body), prevToken = sourceCode.getTokenBefore(ifNode);
|
|
288
|
+
if (prevToken !== null && prevToken.value !== ";" && prevToken.value !== "{" && firstBodyToken.type !== "Identifier" && firstBodyToken.type !== "Keyword") return;
|
|
289
|
+
let operatorToken = getOperatorToken(body.expression);
|
|
290
|
+
yield ruleFixer.insertTextBefore(operatorToken, existence.operator), yield ruleFixer.removeRange([ifNode.range[0], body.range[0]]), yield ruleFixer.removeRange([body.range[1], ifNode.range[1]]);
|
|
291
|
+
let nextToken = sourceCode.getTokenAfter(body.expression);
|
|
292
|
+
hasBody && nextToken !== null && nextToken.value !== ";" && (yield ruleFixer.insertTextAfter(ifNode, ";"));
|
|
293
|
+
}
|
|
294
|
+
}, shouldBeFixed = cannotBeGetter(existence.reference) || ifNode.test.type !== "LogicalExpression" && accessesSingleProperty(existence.reference);
|
|
295
|
+
context.report(createConditionalFixer(descriptor, suggestion, shouldBeFixed));
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
};
|
|
301
|
+
}));
|
|
302
|
+
//#endregion
|
|
303
|
+
//#region src-js/generated/plugin-eslint/rules/logical-assignment-operators.cjs
|
|
304
|
+
module.exports = require_logical_assignment_operators().create;
|
|
305
|
+
//#endregion
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
//#region ../../node_modules/.pnpm/eslint@9.39.3_jiti@2.6.1/node_modules/eslint/lib/rules/max-classes-per-file.js
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview Enforce a maximum number of classes per file
|
|
4
|
+
* @author James Garbutt <https://github.com/43081j>
|
|
5
|
+
*/
|
|
6
|
+
var require_max_classes_per_file = /* @__PURE__ */ require("../common/chunk.cjs").t(((exports, module) => {
|
|
7
|
+
/** @type {import('../types').Rule.RuleModule} */
|
|
8
|
+
module.exports = {
|
|
9
|
+
meta: {
|
|
10
|
+
type: "suggestion",
|
|
11
|
+
docs: {
|
|
12
|
+
description: "Enforce a maximum number of classes per file",
|
|
13
|
+
recommended: !1,
|
|
14
|
+
url: "https://eslint.org/docs/latest/rules/max-classes-per-file"
|
|
15
|
+
},
|
|
16
|
+
schema: [{ oneOf: [{
|
|
17
|
+
type: "integer",
|
|
18
|
+
minimum: 1
|
|
19
|
+
}, {
|
|
20
|
+
type: "object",
|
|
21
|
+
properties: {
|
|
22
|
+
ignoreExpressions: { type: "boolean" },
|
|
23
|
+
max: {
|
|
24
|
+
type: "integer",
|
|
25
|
+
minimum: 1
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
additionalProperties: !1
|
|
29
|
+
}] }],
|
|
30
|
+
messages: { maximumExceeded: "File has too many classes ({{ classCount }}). Maximum allowed is {{ max }}." }
|
|
31
|
+
},
|
|
32
|
+
create(context) {
|
|
33
|
+
let [option = {}] = context.options, [ignoreExpressions, max] = typeof option == "number" ? [!1, option || 1] : [option.ignoreExpressions, option.max || 1], classCount = 0;
|
|
34
|
+
return {
|
|
35
|
+
Program() {
|
|
36
|
+
classCount = 0;
|
|
37
|
+
},
|
|
38
|
+
"Program:exit"(node) {
|
|
39
|
+
classCount > max && context.report({
|
|
40
|
+
node,
|
|
41
|
+
messageId: "maximumExceeded",
|
|
42
|
+
data: {
|
|
43
|
+
classCount,
|
|
44
|
+
max
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
},
|
|
48
|
+
ClassDeclaration() {
|
|
49
|
+
classCount++;
|
|
50
|
+
},
|
|
51
|
+
ClassExpression() {
|
|
52
|
+
ignoreExpressions || classCount++;
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
}));
|
|
58
|
+
//#endregion
|
|
59
|
+
//#region src-js/generated/plugin-eslint/rules/max-classes-per-file.cjs
|
|
60
|
+
module.exports = require_max_classes_per_file().create;
|
|
61
|
+
//#endregion
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
//#region ../../node_modules/.pnpm/eslint@9.39.3_jiti@2.6.1/node_modules/eslint/lib/rules/max-depth.js
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview A rule to set the maximum depth block can be nested in a function.
|
|
4
|
+
* @author Ian Christian Myers
|
|
5
|
+
*/
|
|
6
|
+
var require_max_depth = /* @__PURE__ */ require("../common/chunk.cjs").t(((exports, module) => {
|
|
7
|
+
/** @type {import('../types').Rule.RuleModule} */
|
|
8
|
+
module.exports = {
|
|
9
|
+
meta: {
|
|
10
|
+
type: "suggestion",
|
|
11
|
+
docs: {
|
|
12
|
+
description: "Enforce a maximum depth that blocks can be nested",
|
|
13
|
+
recommended: !1,
|
|
14
|
+
url: "https://eslint.org/docs/latest/rules/max-depth"
|
|
15
|
+
},
|
|
16
|
+
schema: [{ oneOf: [{
|
|
17
|
+
type: "integer",
|
|
18
|
+
minimum: 0
|
|
19
|
+
}, {
|
|
20
|
+
type: "object",
|
|
21
|
+
properties: {
|
|
22
|
+
maximum: {
|
|
23
|
+
type: "integer",
|
|
24
|
+
minimum: 0
|
|
25
|
+
},
|
|
26
|
+
max: {
|
|
27
|
+
type: "integer",
|
|
28
|
+
minimum: 0
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
additionalProperties: !1
|
|
32
|
+
}] }],
|
|
33
|
+
messages: { tooDeeply: "Blocks are nested too deeply ({{depth}}). Maximum allowed is {{maxDepth}}." }
|
|
34
|
+
},
|
|
35
|
+
create(context) {
|
|
36
|
+
let functionStack = [], option = context.options[0], maxDepth = 4;
|
|
37
|
+
typeof option == "object" && (Object.hasOwn(option, "maximum") || Object.hasOwn(option, "max")) && (maxDepth = option.maximum || option.max), typeof option == "number" && (maxDepth = option);
|
|
38
|
+
/**
|
|
39
|
+
* When parsing a new function, store it in our function stack
|
|
40
|
+
* @returns {void}
|
|
41
|
+
* @private
|
|
42
|
+
*/
|
|
43
|
+
function startFunction() {
|
|
44
|
+
functionStack.push(0);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* When parsing is done then pop out the reference
|
|
48
|
+
* @returns {void}
|
|
49
|
+
* @private
|
|
50
|
+
*/
|
|
51
|
+
function endFunction() {
|
|
52
|
+
functionStack.pop();
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Save the block and Evaluate the node
|
|
56
|
+
* @param {ASTNode} node node to evaluate
|
|
57
|
+
* @returns {void}
|
|
58
|
+
* @private
|
|
59
|
+
*/
|
|
60
|
+
function pushBlock(node) {
|
|
61
|
+
let len = ++functionStack[functionStack.length - 1];
|
|
62
|
+
len > maxDepth && context.report({
|
|
63
|
+
node,
|
|
64
|
+
messageId: "tooDeeply",
|
|
65
|
+
data: {
|
|
66
|
+
depth: len,
|
|
67
|
+
maxDepth
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Pop the saved block
|
|
73
|
+
* @returns {void}
|
|
74
|
+
* @private
|
|
75
|
+
*/
|
|
76
|
+
function popBlock() {
|
|
77
|
+
functionStack[functionStack.length - 1]--;
|
|
78
|
+
}
|
|
79
|
+
return {
|
|
80
|
+
Program: startFunction,
|
|
81
|
+
FunctionDeclaration: startFunction,
|
|
82
|
+
FunctionExpression: startFunction,
|
|
83
|
+
ArrowFunctionExpression: startFunction,
|
|
84
|
+
StaticBlock: startFunction,
|
|
85
|
+
IfStatement(node) {
|
|
86
|
+
node.parent.type !== "IfStatement" && pushBlock(node);
|
|
87
|
+
},
|
|
88
|
+
SwitchStatement: pushBlock,
|
|
89
|
+
TryStatement: pushBlock,
|
|
90
|
+
DoWhileStatement: pushBlock,
|
|
91
|
+
WhileStatement: pushBlock,
|
|
92
|
+
WithStatement: pushBlock,
|
|
93
|
+
ForStatement: pushBlock,
|
|
94
|
+
ForInStatement: pushBlock,
|
|
95
|
+
ForOfStatement: pushBlock,
|
|
96
|
+
"IfStatement:exit": popBlock,
|
|
97
|
+
"SwitchStatement:exit": popBlock,
|
|
98
|
+
"TryStatement:exit": popBlock,
|
|
99
|
+
"DoWhileStatement:exit": popBlock,
|
|
100
|
+
"WhileStatement:exit": popBlock,
|
|
101
|
+
"WithStatement:exit": popBlock,
|
|
102
|
+
"ForStatement:exit": popBlock,
|
|
103
|
+
"ForInStatement:exit": popBlock,
|
|
104
|
+
"ForOfStatement:exit": popBlock,
|
|
105
|
+
"FunctionDeclaration:exit": endFunction,
|
|
106
|
+
"FunctionExpression:exit": endFunction,
|
|
107
|
+
"ArrowFunctionExpression:exit": endFunction,
|
|
108
|
+
"StaticBlock:exit": endFunction,
|
|
109
|
+
"Program:exit": endFunction
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
}));
|
|
114
|
+
//#endregion
|
|
115
|
+
//#region src-js/generated/plugin-eslint/rules/max-depth.cjs
|
|
116
|
+
module.exports = require_max_depth().create;
|
|
117
|
+
//#endregion
|