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
package/rules/radix.cjs
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
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/radix.js
|
|
3
|
+
/**
|
|
4
|
+
* @fileoverview Rule to flag use of parseInt without a radix argument
|
|
5
|
+
* @author James Allardice
|
|
6
|
+
*/
|
|
7
|
+
var require_radix = /* @__PURE__ */ require_chunk.t(((exports, module) => {
|
|
8
|
+
let astUtils = require_ast_utils$1.t(), MODE_ALWAYS = "always", validRadixValues = new Set(Array.from({ length: 35 }, (_, index) => index + 2));
|
|
9
|
+
/**
|
|
10
|
+
* Checks whether a given variable is shadowed or not.
|
|
11
|
+
* @param {eslint-scope.Variable} variable A variable to check.
|
|
12
|
+
* @returns {boolean} `true` if the variable is shadowed.
|
|
13
|
+
*/
|
|
14
|
+
function isShadowed(variable) {
|
|
15
|
+
return variable.defs.length >= 1;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Checks whether a given node is a MemberExpression of `parseInt` method or not.
|
|
19
|
+
* @param {ASTNode} node A node to check.
|
|
20
|
+
* @returns {boolean} `true` if the node is a MemberExpression of `parseInt`
|
|
21
|
+
* method.
|
|
22
|
+
*/
|
|
23
|
+
function isParseIntMethod(node) {
|
|
24
|
+
return node.type === "MemberExpression" && !node.computed && node.property.type === "Identifier" && node.property.name === "parseInt";
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Checks whether a given node is a valid value of radix or not.
|
|
28
|
+
*
|
|
29
|
+
* The following values are invalid.
|
|
30
|
+
*
|
|
31
|
+
* - A literal except integers between 2 and 36.
|
|
32
|
+
* - undefined.
|
|
33
|
+
* @param {ASTNode} radix A node of radix to check.
|
|
34
|
+
* @returns {boolean} `true` if the node is valid.
|
|
35
|
+
*/
|
|
36
|
+
function isValidRadix(radix) {
|
|
37
|
+
return !(radix.type === "Literal" && !validRadixValues.has(radix.value) || radix.type === "Identifier" && radix.name === "undefined");
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Checks whether a given node is a default value of radix or not.
|
|
41
|
+
* @param {ASTNode} radix A node of radix to check.
|
|
42
|
+
* @returns {boolean} `true` if the node is the literal node of `10`.
|
|
43
|
+
*/
|
|
44
|
+
function isDefaultRadix(radix) {
|
|
45
|
+
return radix.type === "Literal" && radix.value === 10;
|
|
46
|
+
}
|
|
47
|
+
/** @type {import('../types').Rule.RuleModule} */
|
|
48
|
+
module.exports = {
|
|
49
|
+
meta: {
|
|
50
|
+
type: "suggestion",
|
|
51
|
+
defaultOptions: [MODE_ALWAYS],
|
|
52
|
+
docs: {
|
|
53
|
+
description: "Enforce the consistent use of the radix argument when using `parseInt()`",
|
|
54
|
+
recommended: !1,
|
|
55
|
+
url: "https://eslint.org/docs/latest/rules/radix"
|
|
56
|
+
},
|
|
57
|
+
hasSuggestions: !0,
|
|
58
|
+
schema: [{ enum: ["always", "as-needed"] }],
|
|
59
|
+
messages: {
|
|
60
|
+
missingParameters: "Missing parameters.",
|
|
61
|
+
redundantRadix: "Redundant radix parameter.",
|
|
62
|
+
missingRadix: "Missing radix parameter.",
|
|
63
|
+
invalidRadix: "Invalid radix parameter, must be an integer between 2 and 36.",
|
|
64
|
+
addRadixParameter10: "Add radix parameter `10` for parsing decimal numbers."
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
create(context) {
|
|
68
|
+
let [mode] = context.options, sourceCode = context.sourceCode;
|
|
69
|
+
/**
|
|
70
|
+
* Checks the arguments of a given CallExpression node and reports it if it
|
|
71
|
+
* offends this rule.
|
|
72
|
+
* @param {ASTNode} node A CallExpression node to check.
|
|
73
|
+
* @returns {void}
|
|
74
|
+
*/
|
|
75
|
+
function checkArguments(node) {
|
|
76
|
+
let args = node.arguments;
|
|
77
|
+
switch (args.length) {
|
|
78
|
+
case 0:
|
|
79
|
+
context.report({
|
|
80
|
+
node,
|
|
81
|
+
messageId: "missingParameters"
|
|
82
|
+
});
|
|
83
|
+
break;
|
|
84
|
+
case 1:
|
|
85
|
+
mode === MODE_ALWAYS && context.report({
|
|
86
|
+
node,
|
|
87
|
+
messageId: "missingRadix",
|
|
88
|
+
suggest: [{
|
|
89
|
+
messageId: "addRadixParameter10",
|
|
90
|
+
fix(fixer) {
|
|
91
|
+
let tokens = sourceCode.getTokens(node), lastToken = tokens.at(-1), secondToLastToken = tokens.at(-2), hasTrailingComma = secondToLastToken.type === "Punctuator" && secondToLastToken.value === ",";
|
|
92
|
+
return fixer.insertTextBefore(lastToken, hasTrailingComma ? " 10," : ", 10");
|
|
93
|
+
}
|
|
94
|
+
}]
|
|
95
|
+
});
|
|
96
|
+
break;
|
|
97
|
+
default:
|
|
98
|
+
mode === "as-needed" && isDefaultRadix(args[1]) ? context.report({
|
|
99
|
+
node,
|
|
100
|
+
messageId: "redundantRadix"
|
|
101
|
+
}) : isValidRadix(args[1]) || context.report({
|
|
102
|
+
node,
|
|
103
|
+
messageId: "invalidRadix"
|
|
104
|
+
});
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return { "Program:exit"(node) {
|
|
109
|
+
let scope = sourceCode.getScope(node), variable;
|
|
110
|
+
variable = astUtils.getVariableByName(scope, "parseInt"), variable && !isShadowed(variable) && variable.references.forEach((reference) => {
|
|
111
|
+
let idNode = reference.identifier;
|
|
112
|
+
astUtils.isCallee(idNode) && checkArguments(idNode.parent);
|
|
113
|
+
}), variable = astUtils.getVariableByName(scope, "Number"), variable && !isShadowed(variable) && variable.references.forEach((reference) => {
|
|
114
|
+
let parentNode = reference.identifier.parent, maybeCallee = parentNode.parent.type === "ChainExpression" ? parentNode.parent : parentNode;
|
|
115
|
+
isParseIntMethod(parentNode) && astUtils.isCallee(maybeCallee) && checkArguments(maybeCallee.parent);
|
|
116
|
+
});
|
|
117
|
+
} };
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
}));
|
|
121
|
+
//#endregion
|
|
122
|
+
//#region src-js/generated/plugin-eslint/rules/radix.cjs
|
|
123
|
+
module.exports = require_radix().create;
|
|
124
|
+
//#endregion
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
//#region ../../node_modules/.pnpm/eslint@9.39.3_jiti@2.6.1/node_modules/eslint/lib/rules/require-atomic-updates.js
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview disallow assignments that can lead to race conditions due to usage of `await` or `yield`
|
|
4
|
+
* @author Teddy Katz
|
|
5
|
+
* @author Toru Nagashima
|
|
6
|
+
*/
|
|
7
|
+
var require_require_atomic_updates = /* @__PURE__ */ require("../common/chunk.cjs").t(((exports, module) => {
|
|
8
|
+
/**
|
|
9
|
+
* Make the map from identifiers to each reference.
|
|
10
|
+
* @param {escope.Scope} scope The scope to get references.
|
|
11
|
+
* @param {Map<Identifier, escope.Reference>} [outReferenceMap] The map from identifier nodes to each reference object.
|
|
12
|
+
* @returns {Map<Identifier, escope.Reference>} `referenceMap`.
|
|
13
|
+
*/
|
|
14
|
+
function createReferenceMap(scope, outReferenceMap = /* @__PURE__ */ new Map()) {
|
|
15
|
+
for (let reference of scope.references) reference.resolved !== null && outReferenceMap.set(reference.identifier, reference);
|
|
16
|
+
for (let childScope of scope.childScopes) childScope.type !== "function" && createReferenceMap(childScope, outReferenceMap);
|
|
17
|
+
return outReferenceMap;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Get `reference.writeExpr` of a given reference.
|
|
21
|
+
* If it's the read reference of MemberExpression in LHS, returns RHS in order to address `a.b = await a`
|
|
22
|
+
* @param {escope.Reference} reference The reference to get.
|
|
23
|
+
* @returns {Expression|null} The `reference.writeExpr`.
|
|
24
|
+
*/
|
|
25
|
+
function getWriteExpr(reference) {
|
|
26
|
+
if (reference.writeExpr) return reference.writeExpr;
|
|
27
|
+
let node = reference.identifier;
|
|
28
|
+
for (; node;) {
|
|
29
|
+
let t = node.parent.type;
|
|
30
|
+
if (t === "AssignmentExpression" && node.parent.left === node) return node.parent.right;
|
|
31
|
+
if (t === "MemberExpression" && node.parent.object === node) {
|
|
32
|
+
node = node.parent;
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Checks if an expression is a variable that can only be observed within the given function.
|
|
41
|
+
* @param {Variable|null} variable The variable to check
|
|
42
|
+
* @param {boolean} isMemberAccess If `true` then this is a member access.
|
|
43
|
+
* @returns {boolean} `true` if the variable is local to the given function, and is never referenced in a closure.
|
|
44
|
+
*/
|
|
45
|
+
function isLocalVariableWithoutEscape(variable, isMemberAccess) {
|
|
46
|
+
if (!variable || isMemberAccess && variable.defs.some((d) => d.type === "Parameter")) return !1;
|
|
47
|
+
let functionScope = variable.scope.variableScope;
|
|
48
|
+
return variable.references.every((reference) => reference.from.variableScope === functionScope);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Represents segment information.
|
|
52
|
+
*/
|
|
53
|
+
var SegmentInfo = class {
|
|
54
|
+
constructor() {
|
|
55
|
+
this.info = /* @__PURE__ */ new WeakMap();
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Initialize the segment information.
|
|
59
|
+
* @param {PathSegment} segment The segment to initialize.
|
|
60
|
+
* @returns {void}
|
|
61
|
+
*/
|
|
62
|
+
initialize(segment) {
|
|
63
|
+
let outdatedReadVariables = /* @__PURE__ */ new Set(), freshReadVariables = /* @__PURE__ */ new Set();
|
|
64
|
+
for (let prevSegment of segment.prevSegments) {
|
|
65
|
+
let info = this.info.get(prevSegment);
|
|
66
|
+
info && (info.outdatedReadVariables.forEach(Set.prototype.add, outdatedReadVariables), info.freshReadVariables.forEach(Set.prototype.add, freshReadVariables));
|
|
67
|
+
}
|
|
68
|
+
this.info.set(segment, {
|
|
69
|
+
outdatedReadVariables,
|
|
70
|
+
freshReadVariables
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Mark a given variable as read on given segments.
|
|
75
|
+
* @param {PathSegment[]} segments The segments that it read the variable on.
|
|
76
|
+
* @param {Variable} variable The variable to be read.
|
|
77
|
+
* @returns {void}
|
|
78
|
+
*/
|
|
79
|
+
markAsRead(segments, variable) {
|
|
80
|
+
for (let segment of segments) {
|
|
81
|
+
let info = this.info.get(segment);
|
|
82
|
+
info && (info.freshReadVariables.add(variable), info.outdatedReadVariables.delete(variable));
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Move `freshReadVariables` to `outdatedReadVariables`.
|
|
87
|
+
* @param {PathSegment[]} segments The segments to process.
|
|
88
|
+
* @returns {void}
|
|
89
|
+
*/
|
|
90
|
+
makeOutdated(segments) {
|
|
91
|
+
for (let segment of segments) {
|
|
92
|
+
let info = this.info.get(segment);
|
|
93
|
+
info && (info.freshReadVariables.forEach(Set.prototype.add, info.outdatedReadVariables), info.freshReadVariables.clear());
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Check if a given variable is outdated on the current segments.
|
|
98
|
+
* @param {PathSegment[]} segments The current segments.
|
|
99
|
+
* @param {Variable} variable The variable to check.
|
|
100
|
+
* @returns {boolean} `true` if the variable is outdated on the segments.
|
|
101
|
+
*/
|
|
102
|
+
isOutdated(segments, variable) {
|
|
103
|
+
for (let segment of segments) {
|
|
104
|
+
let info = this.info.get(segment);
|
|
105
|
+
if (info && info.outdatedReadVariables.has(variable)) return !0;
|
|
106
|
+
}
|
|
107
|
+
return !1;
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
/** @type {import('../types').Rule.RuleModule} */
|
|
111
|
+
module.exports = {
|
|
112
|
+
meta: {
|
|
113
|
+
type: "problem",
|
|
114
|
+
defaultOptions: [{ allowProperties: !1 }],
|
|
115
|
+
docs: {
|
|
116
|
+
description: "Disallow assignments that can lead to race conditions due to usage of `await` or `yield`",
|
|
117
|
+
recommended: !1,
|
|
118
|
+
url: "https://eslint.org/docs/latest/rules/require-atomic-updates"
|
|
119
|
+
},
|
|
120
|
+
fixable: null,
|
|
121
|
+
schema: [{
|
|
122
|
+
type: "object",
|
|
123
|
+
properties: { allowProperties: { type: "boolean" } },
|
|
124
|
+
additionalProperties: !1
|
|
125
|
+
}],
|
|
126
|
+
messages: {
|
|
127
|
+
nonAtomicUpdate: "Possible race condition: `{{value}}` might be reassigned based on an outdated value of `{{value}}`.",
|
|
128
|
+
nonAtomicObjectUpdate: "Possible race condition: `{{value}}` might be assigned based on an outdated state of `{{object}}`."
|
|
129
|
+
}
|
|
130
|
+
},
|
|
131
|
+
create(context) {
|
|
132
|
+
let [{ allowProperties }] = context.options, sourceCode = context.sourceCode, assignmentReferences = /* @__PURE__ */ new Map(), segmentInfo = new SegmentInfo(), stack = null;
|
|
133
|
+
return {
|
|
134
|
+
onCodePathStart(codePath, node) {
|
|
135
|
+
let scope = sourceCode.getScope(node), shouldVerify = scope.type === "function" && (scope.block.async || scope.block.generator);
|
|
136
|
+
stack = {
|
|
137
|
+
upper: stack,
|
|
138
|
+
codePath,
|
|
139
|
+
referenceMap: shouldVerify ? createReferenceMap(scope) : null,
|
|
140
|
+
currentSegments: /* @__PURE__ */ new Set()
|
|
141
|
+
};
|
|
142
|
+
},
|
|
143
|
+
onCodePathEnd() {
|
|
144
|
+
stack = stack.upper;
|
|
145
|
+
},
|
|
146
|
+
onCodePathSegmentStart(segment) {
|
|
147
|
+
segmentInfo.initialize(segment), stack.currentSegments.add(segment);
|
|
148
|
+
},
|
|
149
|
+
onUnreachableCodePathSegmentStart(segment) {
|
|
150
|
+
stack.currentSegments.add(segment);
|
|
151
|
+
},
|
|
152
|
+
onUnreachableCodePathSegmentEnd(segment) {
|
|
153
|
+
stack.currentSegments.delete(segment);
|
|
154
|
+
},
|
|
155
|
+
onCodePathSegmentEnd(segment) {
|
|
156
|
+
stack.currentSegments.delete(segment);
|
|
157
|
+
},
|
|
158
|
+
Identifier(node) {
|
|
159
|
+
let { referenceMap } = stack, reference = referenceMap && referenceMap.get(node);
|
|
160
|
+
if (!reference) return;
|
|
161
|
+
let variable = reference.resolved, writeExpr = getWriteExpr(reference), isMemberAccess = reference.identifier.parent.type === "MemberExpression";
|
|
162
|
+
if (reference.isRead() && !(writeExpr && writeExpr.parent.operator === "=") && segmentInfo.markAsRead(stack.currentSegments, variable), writeExpr && writeExpr.parent.right === writeExpr && !isLocalVariableWithoutEscape(variable, isMemberAccess)) {
|
|
163
|
+
let refs = assignmentReferences.get(writeExpr);
|
|
164
|
+
refs || (refs = [], assignmentReferences.set(writeExpr, refs)), refs.push(reference);
|
|
165
|
+
}
|
|
166
|
+
},
|
|
167
|
+
":expression:exit"(node) {
|
|
168
|
+
if (!stack.referenceMap) return;
|
|
169
|
+
(node.type === "AwaitExpression" || node.type === "YieldExpression") && segmentInfo.makeOutdated(stack.currentSegments);
|
|
170
|
+
let references = assignmentReferences.get(node);
|
|
171
|
+
if (references) {
|
|
172
|
+
assignmentReferences.delete(node);
|
|
173
|
+
for (let reference of references) {
|
|
174
|
+
let variable = reference.resolved;
|
|
175
|
+
segmentInfo.isOutdated(stack.currentSegments, variable) && (node.parent.left === reference.identifier ? context.report({
|
|
176
|
+
node: node.parent,
|
|
177
|
+
messageId: "nonAtomicUpdate",
|
|
178
|
+
data: { value: variable.name }
|
|
179
|
+
}) : allowProperties || context.report({
|
|
180
|
+
node: node.parent,
|
|
181
|
+
messageId: "nonAtomicObjectUpdate",
|
|
182
|
+
data: {
|
|
183
|
+
value: sourceCode.getText(node.parent.left),
|
|
184
|
+
object: variable.name
|
|
185
|
+
}
|
|
186
|
+
}));
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
}));
|
|
194
|
+
//#endregion
|
|
195
|
+
//#region src-js/generated/plugin-eslint/rules/require-atomic-updates.cjs
|
|
196
|
+
module.exports = require_require_atomic_updates().create;
|
|
197
|
+
//#endregion
|
|
@@ -0,0 +1,90 @@
|
|
|
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/require-await.js
|
|
3
|
+
/**
|
|
4
|
+
* @fileoverview Rule to disallow async functions which have no `await` expression.
|
|
5
|
+
* @author Toru Nagashima
|
|
6
|
+
*/
|
|
7
|
+
var require_require_await = /* @__PURE__ */ require_chunk.t(((exports, module) => {
|
|
8
|
+
let astUtils = require_ast_utils$1.t();
|
|
9
|
+
/**
|
|
10
|
+
* Capitalize the 1st letter of the given text.
|
|
11
|
+
* @param {string} text The text to capitalize.
|
|
12
|
+
* @returns {string} The text that the 1st letter was capitalized.
|
|
13
|
+
*/
|
|
14
|
+
function capitalizeFirstLetter(text) {
|
|
15
|
+
return text[0].toUpperCase() + text.slice(1);
|
|
16
|
+
}
|
|
17
|
+
/** @type {import('../types').Rule.RuleModule} */
|
|
18
|
+
module.exports = {
|
|
19
|
+
meta: {
|
|
20
|
+
type: "suggestion",
|
|
21
|
+
docs: {
|
|
22
|
+
description: "Disallow async functions which have no `await` expression",
|
|
23
|
+
recommended: !1,
|
|
24
|
+
url: "https://eslint.org/docs/latest/rules/require-await"
|
|
25
|
+
},
|
|
26
|
+
schema: [],
|
|
27
|
+
messages: {
|
|
28
|
+
missingAwait: "{{name}} has no 'await' expression.",
|
|
29
|
+
removeAsync: "Remove 'async'."
|
|
30
|
+
},
|
|
31
|
+
hasSuggestions: !0
|
|
32
|
+
},
|
|
33
|
+
create(context) {
|
|
34
|
+
let sourceCode = context.sourceCode, scopeInfo = null;
|
|
35
|
+
/**
|
|
36
|
+
* Push the scope info object to the stack.
|
|
37
|
+
* @returns {void}
|
|
38
|
+
*/
|
|
39
|
+
function enterFunction() {
|
|
40
|
+
scopeInfo = {
|
|
41
|
+
upper: scopeInfo,
|
|
42
|
+
hasAwait: !1
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Pop the top scope info object from the stack.
|
|
47
|
+
* Also, it reports the function if needed.
|
|
48
|
+
* @param {ASTNode} node The node to report.
|
|
49
|
+
* @returns {void}
|
|
50
|
+
*/
|
|
51
|
+
function exitFunction(node) {
|
|
52
|
+
if (!node.generator && node.async && !scopeInfo.hasAwait && !astUtils.isEmptyFunction(node)) {
|
|
53
|
+
let nodeWithAsyncKeyword = node.parent.type === "MethodDefinition" && node.parent.value === node || node.parent.type === "Property" && node.parent.method && node.parent.value === node ? node.parent : node, asyncToken = sourceCode.getFirstToken(nodeWithAsyncKeyword, (token) => token.value === "async"), asyncRange = [asyncToken.range[0], sourceCode.getTokenAfter(asyncToken, { includeComments: !0 }).range[0]], nextToken = sourceCode.getTokenAfter(asyncToken), addSemiColon = nextToken.type === "Punctuator" && (nextToken.value === "[" || nextToken.value === "(") && (nodeWithAsyncKeyword.type === "MethodDefinition" || astUtils.isStartOfExpressionStatement(nodeWithAsyncKeyword)) && astUtils.needsPrecedingSemicolon(sourceCode, nodeWithAsyncKeyword);
|
|
54
|
+
context.report({
|
|
55
|
+
node,
|
|
56
|
+
loc: astUtils.getFunctionHeadLoc(node, sourceCode),
|
|
57
|
+
messageId: "missingAwait",
|
|
58
|
+
data: { name: capitalizeFirstLetter(astUtils.getFunctionNameWithKind(node)) },
|
|
59
|
+
suggest: [{
|
|
60
|
+
messageId: "removeAsync",
|
|
61
|
+
fix: (fixer) => fixer.replaceTextRange(asyncRange, addSemiColon ? ";" : "")
|
|
62
|
+
}]
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
scopeInfo = scopeInfo.upper;
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
FunctionDeclaration: enterFunction,
|
|
69
|
+
FunctionExpression: enterFunction,
|
|
70
|
+
ArrowFunctionExpression: enterFunction,
|
|
71
|
+
"FunctionDeclaration:exit": exitFunction,
|
|
72
|
+
"FunctionExpression:exit": exitFunction,
|
|
73
|
+
"ArrowFunctionExpression:exit": exitFunction,
|
|
74
|
+
AwaitExpression() {
|
|
75
|
+
scopeInfo && (scopeInfo.hasAwait = !0);
|
|
76
|
+
},
|
|
77
|
+
ForOfStatement(node) {
|
|
78
|
+
scopeInfo && node.await && (scopeInfo.hasAwait = !0);
|
|
79
|
+
},
|
|
80
|
+
VariableDeclaration(node) {
|
|
81
|
+
scopeInfo && node.kind === "await using" && (scopeInfo.hasAwait = !0);
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
}));
|
|
87
|
+
//#endregion
|
|
88
|
+
//#region src-js/generated/plugin-eslint/rules/require-await.cjs
|
|
89
|
+
module.exports = require_require_await().create;
|
|
90
|
+
//#endregion
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
const require_chunk = require("../common/chunk.cjs"), require_ast_utils$1 = require("../common/ast-utils.cjs"), require_eslint_utils$1 = require("../common/eslint-utils.cjs");
|
|
2
|
+
require("../common/regexpp.cjs");
|
|
3
|
+
const require_regular_expressions$1 = require("../common/regular-expressions.cjs");
|
|
4
|
+
//#region ../../node_modules/.pnpm/eslint@9.39.3_jiti@2.6.1/node_modules/eslint/lib/rules/require-unicode-regexp.js
|
|
5
|
+
/**
|
|
6
|
+
* @fileoverview Rule to enforce the use of `u` or `v` flag on regular expressions.
|
|
7
|
+
* @author Toru Nagashima
|
|
8
|
+
*/
|
|
9
|
+
var require_require_unicode_regexp = /* @__PURE__ */ require_chunk.t(((exports, module) => {
|
|
10
|
+
let { CALL, CONSTRUCT, ReferenceTracker, getStringIfConstant } = require_eslint_utils$1.t(), astUtils = require_ast_utils$1.t(), { isValidWithUnicodeFlag } = require_regular_expressions$1.t();
|
|
11
|
+
/**
|
|
12
|
+
* Checks whether the flag configuration should be treated as a missing flag.
|
|
13
|
+
* @param {"u"|"v"|undefined} requireFlag A particular flag to require
|
|
14
|
+
* @param {string} flags The regex flags
|
|
15
|
+
* @returns {boolean} Whether the flag configuration results in a missing flag.
|
|
16
|
+
*/
|
|
17
|
+
function checkFlags(requireFlag, flags) {
|
|
18
|
+
let missingFlag;
|
|
19
|
+
return missingFlag = requireFlag === "v" ? !flags.includes("v") : requireFlag === "u" ? !flags.includes("u") : !flags.includes("u") && !flags.includes("v"), missingFlag;
|
|
20
|
+
}
|
|
21
|
+
/** @type {import('../types').Rule.RuleModule} */
|
|
22
|
+
module.exports = {
|
|
23
|
+
meta: {
|
|
24
|
+
type: "suggestion",
|
|
25
|
+
defaultOptions: [{}],
|
|
26
|
+
docs: {
|
|
27
|
+
description: "Enforce the use of `u` or `v` flag on regular expressions",
|
|
28
|
+
recommended: !1,
|
|
29
|
+
url: "https://eslint.org/docs/latest/rules/require-unicode-regexp"
|
|
30
|
+
},
|
|
31
|
+
hasSuggestions: !0,
|
|
32
|
+
messages: {
|
|
33
|
+
addUFlag: "Add the 'u' flag.",
|
|
34
|
+
addVFlag: "Add the 'v' flag.",
|
|
35
|
+
requireUFlag: "Use the 'u' flag.",
|
|
36
|
+
requireVFlag: "Use the 'v' flag."
|
|
37
|
+
},
|
|
38
|
+
schema: [{
|
|
39
|
+
type: "object",
|
|
40
|
+
properties: { requireFlag: { enum: ["u", "v"] } },
|
|
41
|
+
additionalProperties: !1
|
|
42
|
+
}]
|
|
43
|
+
},
|
|
44
|
+
create(context) {
|
|
45
|
+
let sourceCode = context.sourceCode, [{ requireFlag }] = context.options;
|
|
46
|
+
return {
|
|
47
|
+
"Literal[regex]"(node) {
|
|
48
|
+
checkFlags(requireFlag, node.regex.flags || "") && context.report({
|
|
49
|
+
messageId: requireFlag === "v" ? "requireVFlag" : "requireUFlag",
|
|
50
|
+
node,
|
|
51
|
+
suggest: isValidWithUnicodeFlag(context.languageOptions.ecmaVersion, node.regex.pattern, requireFlag) ? [{
|
|
52
|
+
fix(fixer) {
|
|
53
|
+
let replaceFlag = requireFlag ?? "u", regex = sourceCode.getText(node), slashPos = regex.lastIndexOf("/");
|
|
54
|
+
if (requireFlag) {
|
|
55
|
+
let flag = requireFlag === "u" ? "v" : "u";
|
|
56
|
+
if (regex.includes(flag, slashPos)) return fixer.replaceText(node, regex.slice(0, slashPos) + regex.slice(slashPos).replace(flag, requireFlag));
|
|
57
|
+
}
|
|
58
|
+
return fixer.insertTextAfter(node, replaceFlag);
|
|
59
|
+
},
|
|
60
|
+
messageId: requireFlag === "v" ? "addVFlag" : "addUFlag"
|
|
61
|
+
}] : null
|
|
62
|
+
});
|
|
63
|
+
},
|
|
64
|
+
Program(node) {
|
|
65
|
+
let scope = sourceCode.getScope(node), tracker = new ReferenceTracker(scope), trackMap = { RegExp: {
|
|
66
|
+
[CALL]: !0,
|
|
67
|
+
[CONSTRUCT]: !0
|
|
68
|
+
} };
|
|
69
|
+
for (let { node: refNode } of tracker.iterateGlobalReferences(trackMap)) {
|
|
70
|
+
let [patternNode, flagsNode] = refNode.arguments;
|
|
71
|
+
if (patternNode && patternNode.type === "SpreadElement") continue;
|
|
72
|
+
let pattern = getStringIfConstant(patternNode, scope), flags = getStringIfConstant(flagsNode, scope), missingFlag = !flagsNode;
|
|
73
|
+
typeof flags == "string" && (missingFlag = checkFlags(requireFlag, flags)), missingFlag && context.report({
|
|
74
|
+
messageId: requireFlag === "v" ? "requireVFlag" : "requireUFlag",
|
|
75
|
+
node: refNode,
|
|
76
|
+
suggest: typeof pattern == "string" && isValidWithUnicodeFlag(context.languageOptions.ecmaVersion, pattern, requireFlag) ? [{
|
|
77
|
+
fix(fixer) {
|
|
78
|
+
let replaceFlag = requireFlag ?? "u";
|
|
79
|
+
if (flagsNode) {
|
|
80
|
+
if (flagsNode.type === "Literal" && typeof flagsNode.value == "string" || flagsNode.type === "TemplateLiteral") {
|
|
81
|
+
let flagsNodeText = sourceCode.getText(flagsNode), flag = requireFlag === "u" ? "v" : "u";
|
|
82
|
+
return flags.includes(flag) ? flagsNode.type === "Literal" && flagsNode.raw.includes("\\") || flagsNode.type === "TemplateLiteral" && (flagsNode.expressions.length || flagsNode.quasis.some(({ value: { raw } }) => raw.includes("\\"))) ? null : fixer.replaceText(flagsNode, flagsNodeText.replace(flag, replaceFlag)) : fixer.replaceText(flagsNode, [flagsNodeText.slice(0, flagsNodeText.length - 1), flagsNodeText.slice(flagsNodeText.length - 1)].join(replaceFlag));
|
|
83
|
+
}
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
let penultimateToken = sourceCode.getLastToken(refNode, { skip: 1 });
|
|
87
|
+
return fixer.insertTextAfter(penultimateToken, astUtils.isCommaToken(penultimateToken) ? ` "${replaceFlag}",` : `, "${replaceFlag}"`);
|
|
88
|
+
},
|
|
89
|
+
messageId: requireFlag === "v" ? "addVFlag" : "addUFlag"
|
|
90
|
+
}] : null
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
}));
|
|
98
|
+
//#endregion
|
|
99
|
+
//#region src-js/generated/plugin-eslint/rules/require-unicode-regexp.cjs
|
|
100
|
+
module.exports = require_require_unicode_regexp().create;
|
|
101
|
+
//#endregion
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
//#region ../../node_modules/.pnpm/eslint@9.39.3_jiti@2.6.1/node_modules/eslint/lib/rules/require-yield.js
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview Rule to flag the generator functions that does not have yield.
|
|
4
|
+
* @author Toru Nagashima
|
|
5
|
+
*/
|
|
6
|
+
var require_require_yield = /* @__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: "Require generator functions to contain `yield`",
|
|
13
|
+
recommended: !0,
|
|
14
|
+
url: "https://eslint.org/docs/latest/rules/require-yield"
|
|
15
|
+
},
|
|
16
|
+
schema: [],
|
|
17
|
+
messages: { missingYield: "This generator function does not have 'yield'." }
|
|
18
|
+
},
|
|
19
|
+
create(context) {
|
|
20
|
+
let stack = [];
|
|
21
|
+
/**
|
|
22
|
+
* If the node is a generator function, start counting `yield` keywords.
|
|
23
|
+
* @param {Node} node A function node to check.
|
|
24
|
+
* @returns {void}
|
|
25
|
+
*/
|
|
26
|
+
function beginChecking(node) {
|
|
27
|
+
node.generator && stack.push(0);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* If the node is a generator function, end counting `yield` keywords, then
|
|
31
|
+
* reports result.
|
|
32
|
+
* @param {Node} node A function node to check.
|
|
33
|
+
* @returns {void}
|
|
34
|
+
*/
|
|
35
|
+
function endChecking(node) {
|
|
36
|
+
node.generator && stack.pop() === 0 && node.body.body.length > 0 && context.report({
|
|
37
|
+
node,
|
|
38
|
+
messageId: "missingYield"
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
FunctionDeclaration: beginChecking,
|
|
43
|
+
"FunctionDeclaration:exit": endChecking,
|
|
44
|
+
FunctionExpression: beginChecking,
|
|
45
|
+
"FunctionExpression:exit": endChecking,
|
|
46
|
+
YieldExpression() {
|
|
47
|
+
stack.length > 0 && (stack[stack.length - 1] += 1);
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
}));
|
|
53
|
+
//#endregion
|
|
54
|
+
//#region src-js/generated/plugin-eslint/rules/require-yield.cjs
|
|
55
|
+
module.exports = require_require_yield().create;
|
|
56
|
+
//#endregion
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
//#region ../../node_modules/.pnpm/eslint@9.39.3_jiti@2.6.1/node_modules/eslint/lib/rules/rest-spread-spacing.js
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview Enforce spacing between rest and spread operators and their expressions.
|
|
4
|
+
* @author Kai Cataldo
|
|
5
|
+
* @deprecated in ESLint v8.53.0
|
|
6
|
+
*/
|
|
7
|
+
var require_rest_spread_spacing = /* @__PURE__ */ require("../common/chunk.cjs").t(((exports, module) => {
|
|
8
|
+
/** @type {import('../types').Rule.RuleModule} */
|
|
9
|
+
module.exports = {
|
|
10
|
+
meta: {
|
|
11
|
+
deprecated: {
|
|
12
|
+
message: "Formatting rules are being moved out of ESLint core.",
|
|
13
|
+
url: "https://eslint.org/blog/2023/10/deprecating-formatting-rules/",
|
|
14
|
+
deprecatedSince: "8.53.0",
|
|
15
|
+
availableUntil: "11.0.0",
|
|
16
|
+
replacedBy: [{
|
|
17
|
+
message: "ESLint Stylistic now maintains deprecated stylistic core rules.",
|
|
18
|
+
url: "https://eslint.style/guide/migration",
|
|
19
|
+
plugin: {
|
|
20
|
+
name: "@stylistic/eslint-plugin",
|
|
21
|
+
url: "https://eslint.style"
|
|
22
|
+
},
|
|
23
|
+
rule: {
|
|
24
|
+
name: "rest-spread-spacing",
|
|
25
|
+
url: "https://eslint.style/rules/rest-spread-spacing"
|
|
26
|
+
}
|
|
27
|
+
}]
|
|
28
|
+
},
|
|
29
|
+
type: "layout",
|
|
30
|
+
docs: {
|
|
31
|
+
description: "Enforce spacing between rest and spread operators and their expressions",
|
|
32
|
+
recommended: !1,
|
|
33
|
+
url: "https://eslint.org/docs/latest/rules/rest-spread-spacing"
|
|
34
|
+
},
|
|
35
|
+
fixable: "whitespace",
|
|
36
|
+
schema: [{ enum: ["always", "never"] }],
|
|
37
|
+
messages: {
|
|
38
|
+
unexpectedWhitespace: "Unexpected whitespace after {{type}} operator.",
|
|
39
|
+
expectedWhitespace: "Expected whitespace after {{type}} operator."
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
create(context) {
|
|
43
|
+
let sourceCode = context.sourceCode, alwaysSpace = context.options[0] === "always";
|
|
44
|
+
/**
|
|
45
|
+
* Checks whitespace between rest/spread operators and their expressions
|
|
46
|
+
* @param {ASTNode} node The node to check
|
|
47
|
+
* @returns {void}
|
|
48
|
+
*/
|
|
49
|
+
function checkWhiteSpace(node) {
|
|
50
|
+
let operator = sourceCode.getFirstToken(node), nextToken = sourceCode.getTokenAfter(operator), hasWhitespace = sourceCode.isSpaceBetweenTokens(operator, nextToken), type;
|
|
51
|
+
switch (node.type) {
|
|
52
|
+
case "SpreadElement":
|
|
53
|
+
type = "spread", node.parent.type === "ObjectExpression" && (type += " property");
|
|
54
|
+
break;
|
|
55
|
+
case "RestElement":
|
|
56
|
+
type = "rest", node.parent.type === "ObjectPattern" && (type += " property");
|
|
57
|
+
break;
|
|
58
|
+
case "ExperimentalSpreadProperty":
|
|
59
|
+
type = "spread property";
|
|
60
|
+
break;
|
|
61
|
+
case "ExperimentalRestProperty":
|
|
62
|
+
type = "rest property";
|
|
63
|
+
break;
|
|
64
|
+
default: return;
|
|
65
|
+
}
|
|
66
|
+
alwaysSpace && !hasWhitespace ? context.report({
|
|
67
|
+
node,
|
|
68
|
+
loc: operator.loc,
|
|
69
|
+
messageId: "expectedWhitespace",
|
|
70
|
+
data: { type },
|
|
71
|
+
fix(fixer) {
|
|
72
|
+
return fixer.replaceTextRange([operator.range[1], nextToken.range[0]], " ");
|
|
73
|
+
}
|
|
74
|
+
}) : !alwaysSpace && hasWhitespace && context.report({
|
|
75
|
+
node,
|
|
76
|
+
loc: {
|
|
77
|
+
start: operator.loc.end,
|
|
78
|
+
end: nextToken.loc.start
|
|
79
|
+
},
|
|
80
|
+
messageId: "unexpectedWhitespace",
|
|
81
|
+
data: { type },
|
|
82
|
+
fix(fixer) {
|
|
83
|
+
return fixer.removeRange([operator.range[1], nextToken.range[0]]);
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
SpreadElement: checkWhiteSpace,
|
|
89
|
+
RestElement: checkWhiteSpace,
|
|
90
|
+
ExperimentalSpreadProperty: checkWhiteSpace,
|
|
91
|
+
ExperimentalRestProperty: checkWhiteSpace
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
}));
|
|
96
|
+
//#endregion
|
|
97
|
+
//#region src-js/generated/plugin-eslint/rules/rest-spread-spacing.cjs
|
|
98
|
+
module.exports = require_rest_spread_spacing().create;
|
|
99
|
+
//#endregion
|