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,100 @@
|
|
|
1
|
+
//#region ../../node_modules/.pnpm/eslint@9.39.3_jiti@2.6.1/node_modules/eslint/lib/rules/prefer-reflect.js
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview Rule to suggest using "Reflect" api over Function/Object methods
|
|
4
|
+
* @author Keith Cirkel <http://keithcirkel.co.uk>
|
|
5
|
+
* @deprecated in ESLint v3.9.0
|
|
6
|
+
*/
|
|
7
|
+
var require_prefer_reflect = /* @__PURE__ */ require("../common/chunk.cjs").t(((exports, module) => {
|
|
8
|
+
/** @type {import('../types').Rule.RuleModule} */
|
|
9
|
+
module.exports = {
|
|
10
|
+
meta: {
|
|
11
|
+
type: "suggestion",
|
|
12
|
+
docs: {
|
|
13
|
+
description: "Require `Reflect` methods where applicable",
|
|
14
|
+
recommended: !1,
|
|
15
|
+
url: "https://eslint.org/docs/latest/rules/prefer-reflect"
|
|
16
|
+
},
|
|
17
|
+
deprecated: {
|
|
18
|
+
message: "The original intention of this rule was misguided.",
|
|
19
|
+
deprecatedSince: "3.9.0",
|
|
20
|
+
availableUntil: null,
|
|
21
|
+
replacedBy: []
|
|
22
|
+
},
|
|
23
|
+
schema: [{
|
|
24
|
+
type: "object",
|
|
25
|
+
properties: { exceptions: {
|
|
26
|
+
type: "array",
|
|
27
|
+
items: { enum: [
|
|
28
|
+
"apply",
|
|
29
|
+
"call",
|
|
30
|
+
"delete",
|
|
31
|
+
"defineProperty",
|
|
32
|
+
"getOwnPropertyDescriptor",
|
|
33
|
+
"getPrototypeOf",
|
|
34
|
+
"setPrototypeOf",
|
|
35
|
+
"isExtensible",
|
|
36
|
+
"getOwnPropertyNames",
|
|
37
|
+
"preventExtensions"
|
|
38
|
+
] },
|
|
39
|
+
uniqueItems: !0
|
|
40
|
+
} },
|
|
41
|
+
additionalProperties: !1
|
|
42
|
+
}],
|
|
43
|
+
messages: { preferReflect: "Avoid using {{existing}}, instead use {{substitute}}." }
|
|
44
|
+
},
|
|
45
|
+
create(context) {
|
|
46
|
+
let existingNames = {
|
|
47
|
+
apply: "Function.prototype.apply",
|
|
48
|
+
call: "Function.prototype.call",
|
|
49
|
+
defineProperty: "Object.defineProperty",
|
|
50
|
+
getOwnPropertyDescriptor: "Object.getOwnPropertyDescriptor",
|
|
51
|
+
getPrototypeOf: "Object.getPrototypeOf",
|
|
52
|
+
setPrototypeOf: "Object.setPrototypeOf",
|
|
53
|
+
isExtensible: "Object.isExtensible",
|
|
54
|
+
getOwnPropertyNames: "Object.getOwnPropertyNames",
|
|
55
|
+
preventExtensions: "Object.preventExtensions"
|
|
56
|
+
}, reflectSubstitutes = {
|
|
57
|
+
apply: "Reflect.apply",
|
|
58
|
+
call: "Reflect.apply",
|
|
59
|
+
defineProperty: "Reflect.defineProperty",
|
|
60
|
+
getOwnPropertyDescriptor: "Reflect.getOwnPropertyDescriptor",
|
|
61
|
+
getPrototypeOf: "Reflect.getPrototypeOf",
|
|
62
|
+
setPrototypeOf: "Reflect.setPrototypeOf",
|
|
63
|
+
isExtensible: "Reflect.isExtensible",
|
|
64
|
+
getOwnPropertyNames: "Reflect.getOwnPropertyNames",
|
|
65
|
+
preventExtensions: "Reflect.preventExtensions"
|
|
66
|
+
}, exceptions = (context.options[0] || {}).exceptions || [];
|
|
67
|
+
/**
|
|
68
|
+
* Reports the Reflect violation based on the `existing` and `substitute`
|
|
69
|
+
* @param {Object} node The node that violates the rule.
|
|
70
|
+
* @param {string} existing The existing method name that has been used.
|
|
71
|
+
* @param {string} substitute The Reflect substitute that should be used.
|
|
72
|
+
* @returns {void}
|
|
73
|
+
*/
|
|
74
|
+
function report(node, existing, substitute) {
|
|
75
|
+
context.report({
|
|
76
|
+
node,
|
|
77
|
+
messageId: "preferReflect",
|
|
78
|
+
data: {
|
|
79
|
+
existing,
|
|
80
|
+
substitute
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
return {
|
|
85
|
+
CallExpression(node) {
|
|
86
|
+
let methodName = (node.callee.property || {}).name, isReflectCall = (node.callee.object || {}).name === "Reflect", hasReflectSubstitute = Object.hasOwn(reflectSubstitutes, methodName), userConfiguredException = exceptions.includes(methodName);
|
|
87
|
+
hasReflectSubstitute && !isReflectCall && !userConfiguredException && report(node, existingNames[methodName], reflectSubstitutes[methodName]);
|
|
88
|
+
},
|
|
89
|
+
UnaryExpression(node) {
|
|
90
|
+
let isDeleteOperator = node.operator === "delete", targetsIdentifier = node.argument.type === "Identifier", userConfiguredException = exceptions.includes("delete");
|
|
91
|
+
isDeleteOperator && !targetsIdentifier && !userConfiguredException && report(node, "the delete keyword", "Reflect.deleteProperty");
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
}));
|
|
97
|
+
//#endregion
|
|
98
|
+
//#region src-js/generated/plugin-eslint/rules/prefer-reflect.cjs
|
|
99
|
+
module.exports = require_prefer_reflect().create;
|
|
100
|
+
//#endregion
|
|
@@ -0,0 +1,256 @@
|
|
|
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"), require_regexpp$1 = require("../common/regexpp.cjs"), require_regular_expressions$1 = require("../common/regular-expressions.cjs");
|
|
2
|
+
//#region ../../node_modules/.pnpm/eslint@9.39.3_jiti@2.6.1/node_modules/eslint/lib/rules/prefer-regex-literals.js
|
|
3
|
+
/**
|
|
4
|
+
* @fileoverview Rule to disallow use of the `RegExp` constructor in favor of regular expression literals
|
|
5
|
+
* @author Milos Djermanovic
|
|
6
|
+
*/
|
|
7
|
+
var require_prefer_regex_literals = /* @__PURE__ */ require_chunk.t(((exports, module) => {
|
|
8
|
+
let astUtils = require_ast_utils$1.t(), { CALL, CONSTRUCT, ReferenceTracker } = require_eslint_utils$1.t(), { RegExpValidator, visitRegExpAST, RegExpParser } = require_regexpp$1.t(), { canTokensBeAdjacent } = require_ast_utils$1.t(), { REGEXPP_LATEST_ECMA_VERSION } = require_regular_expressions$1.t();
|
|
9
|
+
/**
|
|
10
|
+
* Determines whether the given node is a string literal.
|
|
11
|
+
* @param {ASTNode} node Node to check.
|
|
12
|
+
* @returns {boolean} True if the node is a string literal.
|
|
13
|
+
*/
|
|
14
|
+
function isStringLiteral(node) {
|
|
15
|
+
return node.type === "Literal" && typeof node.value == "string";
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Determines whether the given node is a regex literal.
|
|
19
|
+
* @param {ASTNode} node Node to check.
|
|
20
|
+
* @returns {boolean} True if the node is a regex literal.
|
|
21
|
+
*/
|
|
22
|
+
function isRegexLiteral(node) {
|
|
23
|
+
return node.type === "Literal" && Object.hasOwn(node, "regex");
|
|
24
|
+
}
|
|
25
|
+
let validPrecedingTokens = new Set(/* @__PURE__ */ "();)[),)=)+)*)-)?)~)%)**)!)typeof)instanceof)&&)||)??)return)...)delete)void)in)<)>)<=)>=)==)===)!=)!==)<<)>>)>>>)&)|)^):){)=>)*=)<<=)>>=)>>>=)^=)|=)&=)??=)||=)&&=)**=)+=)-=)/=)%=)/)do)break)continue)debugger)case)throw".split(")"));
|
|
26
|
+
/** @type {import('../types').Rule.RuleModule} */
|
|
27
|
+
module.exports = {
|
|
28
|
+
meta: {
|
|
29
|
+
type: "suggestion",
|
|
30
|
+
defaultOptions: [{ disallowRedundantWrapping: !1 }],
|
|
31
|
+
docs: {
|
|
32
|
+
description: "Disallow use of the `RegExp` constructor in favor of regular expression literals",
|
|
33
|
+
recommended: !1,
|
|
34
|
+
url: "https://eslint.org/docs/latest/rules/prefer-regex-literals"
|
|
35
|
+
},
|
|
36
|
+
hasSuggestions: !0,
|
|
37
|
+
schema: [{
|
|
38
|
+
type: "object",
|
|
39
|
+
properties: { disallowRedundantWrapping: { type: "boolean" } },
|
|
40
|
+
additionalProperties: !1
|
|
41
|
+
}],
|
|
42
|
+
messages: {
|
|
43
|
+
unexpectedRegExp: "Use a regular expression literal instead of the 'RegExp' constructor.",
|
|
44
|
+
replaceWithLiteral: "Replace with an equivalent regular expression literal.",
|
|
45
|
+
replaceWithLiteralAndFlags: "Replace with an equivalent regular expression literal with flags '{{ flags }}'.",
|
|
46
|
+
replaceWithIntendedLiteralAndFlags: "Replace with a regular expression literal with flags '{{ flags }}'.",
|
|
47
|
+
unexpectedRedundantRegExp: "Regular expression literal is unnecessarily wrapped within a 'RegExp' constructor.",
|
|
48
|
+
unexpectedRedundantRegExpWithFlags: "Use regular expression literal with flags instead of the 'RegExp' constructor."
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
create(context) {
|
|
52
|
+
let [{ disallowRedundantWrapping }] = context.options, sourceCode = context.sourceCode;
|
|
53
|
+
/**
|
|
54
|
+
* Determines whether the given node is a String.raw`` tagged template expression
|
|
55
|
+
* with a static template literal.
|
|
56
|
+
* @param {ASTNode} node Node to check.
|
|
57
|
+
* @returns {boolean} True if the node is String.raw`` with a static template.
|
|
58
|
+
*/
|
|
59
|
+
function isStringRawTaggedStaticTemplateLiteral(node) {
|
|
60
|
+
return node.type === "TaggedTemplateExpression" && astUtils.isSpecificMemberAccess(node.tag, "String", "raw") && sourceCode.isGlobalReference(astUtils.skipChainExpression(node.tag).object) && astUtils.isStaticTemplateLiteral(node.quasi);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Gets the value of a string
|
|
64
|
+
* @param {ASTNode} node The node to get the string of.
|
|
65
|
+
* @returns {string|null} The value of the node.
|
|
66
|
+
*/
|
|
67
|
+
function getStringValue(node) {
|
|
68
|
+
return isStringLiteral(node) ? node.value : astUtils.isStaticTemplateLiteral(node) ? node.quasis[0].value.cooked : isStringRawTaggedStaticTemplateLiteral(node) ? node.quasi.quasis[0].value.raw : null;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Determines whether the given node is considered to be a static string by the logic of this rule.
|
|
72
|
+
* @param {ASTNode} node Node to check.
|
|
73
|
+
* @returns {boolean} True if the node is a static string.
|
|
74
|
+
*/
|
|
75
|
+
function isStaticString(node) {
|
|
76
|
+
return isStringLiteral(node) || astUtils.isStaticTemplateLiteral(node) || isStringRawTaggedStaticTemplateLiteral(node);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Determines whether the relevant arguments of the given are all static string literals.
|
|
80
|
+
* @param {ASTNode} node Node to check.
|
|
81
|
+
* @returns {boolean} True if all arguments are static strings.
|
|
82
|
+
*/
|
|
83
|
+
function hasOnlyStaticStringArguments(node) {
|
|
84
|
+
let args = node.arguments;
|
|
85
|
+
return !!((args.length === 1 || args.length === 2) && args.every(isStaticString));
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Determines whether the arguments of the given node indicate that a regex literal is unnecessarily wrapped.
|
|
89
|
+
* @param {ASTNode} node Node to check.
|
|
90
|
+
* @returns {boolean} True if the node already contains a regex literal argument.
|
|
91
|
+
*/
|
|
92
|
+
function isUnnecessarilyWrappedRegexLiteral(node) {
|
|
93
|
+
let args = node.arguments;
|
|
94
|
+
return !!(args.length === 1 && isRegexLiteral(args[0]) || args.length === 2 && isRegexLiteral(args[0]) && isStaticString(args[1]));
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Returns a ecmaVersion compatible for regexpp.
|
|
98
|
+
* @param {number} ecmaVersion The ecmaVersion to convert.
|
|
99
|
+
* @returns {import("@eslint-community/regexpp/ecma-versions").EcmaVersion} The resulting ecmaVersion compatible for regexpp.
|
|
100
|
+
*/
|
|
101
|
+
function getRegexppEcmaVersion(ecmaVersion) {
|
|
102
|
+
return ecmaVersion <= 5 ? 5 : Math.min(ecmaVersion, REGEXPP_LATEST_ECMA_VERSION);
|
|
103
|
+
}
|
|
104
|
+
let regexppEcmaVersion = getRegexppEcmaVersion(context.languageOptions.ecmaVersion);
|
|
105
|
+
/**
|
|
106
|
+
* Makes a character escaped or else returns null.
|
|
107
|
+
* @param {string} character The character to escape.
|
|
108
|
+
* @returns {string} The resulting escaped character.
|
|
109
|
+
*/
|
|
110
|
+
function resolveEscapes(character) {
|
|
111
|
+
switch (character) {
|
|
112
|
+
case "\n":
|
|
113
|
+
case "\\\n": return "\\n";
|
|
114
|
+
case "\r":
|
|
115
|
+
case "\\\r": return "\\r";
|
|
116
|
+
case " ":
|
|
117
|
+
case "\\ ": return "\\t";
|
|
118
|
+
case "\v":
|
|
119
|
+
case "\\\v": return "\\v";
|
|
120
|
+
case "\f":
|
|
121
|
+
case "\\\f": return "\\f";
|
|
122
|
+
case "/": return "\\/";
|
|
123
|
+
default: return null;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Checks whether the given regex and flags are valid for the ecma version or not.
|
|
128
|
+
* @param {string} pattern The regex pattern to check.
|
|
129
|
+
* @param {string | undefined} flags The regex flags to check.
|
|
130
|
+
* @returns {boolean} True if the given regex pattern and flags are valid for the ecma version.
|
|
131
|
+
*/
|
|
132
|
+
function isValidRegexForEcmaVersion(pattern, flags) {
|
|
133
|
+
let validator = new RegExpValidator({ ecmaVersion: regexppEcmaVersion });
|
|
134
|
+
try {
|
|
135
|
+
return validator.validatePattern(pattern, 0, pattern.length, {
|
|
136
|
+
unicode: flags ? flags.includes("u") : !1,
|
|
137
|
+
unicodeSets: flags ? flags.includes("v") : !1
|
|
138
|
+
}), flags && validator.validateFlags(flags), !0;
|
|
139
|
+
} catch {
|
|
140
|
+
return !1;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Checks whether two given regex flags contain the same flags or not.
|
|
145
|
+
* @param {string} flagsA The regex flags.
|
|
146
|
+
* @param {string} flagsB The regex flags.
|
|
147
|
+
* @returns {boolean} True if two regex flags contain same flags.
|
|
148
|
+
*/
|
|
149
|
+
function areFlagsEqual(flagsA, flagsB) {
|
|
150
|
+
return [...flagsA].sort().join("") === [...flagsB].sort().join("");
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Merges two regex flags.
|
|
154
|
+
* @param {string} flagsA The regex flags.
|
|
155
|
+
* @param {string} flagsB The regex flags.
|
|
156
|
+
* @returns {string} The merged regex flags.
|
|
157
|
+
*/
|
|
158
|
+
function mergeRegexFlags(flagsA, flagsB) {
|
|
159
|
+
return [...new Set([...flagsA, ...flagsB])].join("");
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Checks whether a give node can be fixed to the given regex pattern and flags.
|
|
163
|
+
* @param {ASTNode} node The node to check.
|
|
164
|
+
* @param {string} pattern The regex pattern to check.
|
|
165
|
+
* @param {string} flags The regex flags
|
|
166
|
+
* @returns {boolean} True if a node can be fixed to the given regex pattern and flags.
|
|
167
|
+
*/
|
|
168
|
+
function canFixTo(node, pattern, flags) {
|
|
169
|
+
let tokenBefore = sourceCode.getTokenBefore(node);
|
|
170
|
+
return sourceCode.getCommentsInside(node).length === 0 && (!tokenBefore || validPrecedingTokens.has(tokenBefore.value)) && isValidRegexForEcmaVersion(pattern, flags);
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Returns a safe output code considering the before and after tokens.
|
|
174
|
+
* @param {ASTNode} node The regex node.
|
|
175
|
+
* @param {string} newRegExpValue The new regex expression value.
|
|
176
|
+
* @returns {string} The output code.
|
|
177
|
+
*/
|
|
178
|
+
function getSafeOutput(node, newRegExpValue) {
|
|
179
|
+
let tokenBefore = sourceCode.getTokenBefore(node), tokenAfter = sourceCode.getTokenAfter(node);
|
|
180
|
+
return (tokenBefore && !canTokensBeAdjacent(tokenBefore, newRegExpValue) && tokenBefore.range[1] === node.range[0] ? " " : "") + newRegExpValue + (tokenAfter && !canTokensBeAdjacent(newRegExpValue, tokenAfter) && node.range[1] === tokenAfter.range[0] ? " " : "");
|
|
181
|
+
}
|
|
182
|
+
return { Program(node) {
|
|
183
|
+
let tracker = new ReferenceTracker(sourceCode.getScope(node)), traceMap = { RegExp: {
|
|
184
|
+
[CALL]: !0,
|
|
185
|
+
[CONSTRUCT]: !0
|
|
186
|
+
} };
|
|
187
|
+
for (let { node: refNode } of tracker.iterateGlobalReferences(traceMap)) if (disallowRedundantWrapping && isUnnecessarilyWrappedRegexLiteral(refNode)) {
|
|
188
|
+
let regexNode = refNode.arguments[0];
|
|
189
|
+
if (refNode.arguments.length === 2) {
|
|
190
|
+
let suggests = [], argFlags = getStringValue(refNode.arguments[1]) || "";
|
|
191
|
+
canFixTo(refNode, regexNode.regex.pattern, argFlags) && suggests.push({
|
|
192
|
+
messageId: "replaceWithLiteralAndFlags",
|
|
193
|
+
pattern: regexNode.regex.pattern,
|
|
194
|
+
flags: argFlags
|
|
195
|
+
});
|
|
196
|
+
let mergedFlags = mergeRegexFlags(regexNode.regex.flags || "", argFlags);
|
|
197
|
+
!areFlagsEqual(mergedFlags, argFlags) && canFixTo(refNode, regexNode.regex.pattern, mergedFlags) && suggests.push({
|
|
198
|
+
messageId: "replaceWithIntendedLiteralAndFlags",
|
|
199
|
+
pattern: regexNode.regex.pattern,
|
|
200
|
+
flags: mergedFlags
|
|
201
|
+
}), context.report({
|
|
202
|
+
node: refNode,
|
|
203
|
+
messageId: "unexpectedRedundantRegExpWithFlags",
|
|
204
|
+
suggest: suggests.map(({ flags, pattern, messageId }) => ({
|
|
205
|
+
messageId,
|
|
206
|
+
data: { flags },
|
|
207
|
+
fix(fixer) {
|
|
208
|
+
return fixer.replaceText(refNode, getSafeOutput(refNode, `/${pattern}/${flags}`));
|
|
209
|
+
}
|
|
210
|
+
}))
|
|
211
|
+
});
|
|
212
|
+
} else {
|
|
213
|
+
let outputs = [];
|
|
214
|
+
canFixTo(refNode, regexNode.regex.pattern, regexNode.regex.flags) && outputs.push(sourceCode.getText(regexNode)), context.report({
|
|
215
|
+
node: refNode,
|
|
216
|
+
messageId: "unexpectedRedundantRegExp",
|
|
217
|
+
suggest: outputs.map((output) => ({
|
|
218
|
+
messageId: "replaceWithLiteral",
|
|
219
|
+
fix(fixer) {
|
|
220
|
+
return fixer.replaceText(refNode, getSafeOutput(refNode, output));
|
|
221
|
+
}
|
|
222
|
+
}))
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
} else if (hasOnlyStaticStringArguments(refNode)) {
|
|
226
|
+
let regexContent = getStringValue(refNode.arguments[0]), noFix = !1, flags;
|
|
227
|
+
if (refNode.arguments[1] && (flags = getStringValue(refNode.arguments[1])), canFixTo(refNode, regexContent, flags) || (noFix = !0), /^[-\w\\[\](){} \t\r\n\v\f!@#$%^&*+=/~`.><?,'"|:;]*$/u.test(regexContent) || (noFix = !0), regexContent && !noFix) {
|
|
228
|
+
let charIncrease = 0;
|
|
229
|
+
visitRegExpAST(new RegExpParser({ ecmaVersion: regexppEcmaVersion }).parsePattern(regexContent, 0, regexContent.length, {
|
|
230
|
+
unicode: flags ? flags.includes("u") : !1,
|
|
231
|
+
unicodeSets: flags ? flags.includes("v") : !1
|
|
232
|
+
}), { onCharacterEnter(characterNode) {
|
|
233
|
+
let escaped = resolveEscapes(characterNode.raw);
|
|
234
|
+
escaped && (regexContent = regexContent.slice(0, characterNode.start + charIncrease) + escaped + regexContent.slice(characterNode.end + charIncrease), characterNode.raw.length === 1 && (charIncrease += 1));
|
|
235
|
+
} });
|
|
236
|
+
}
|
|
237
|
+
let newRegExpValue = `/${regexContent || "(?:)"}/${flags || ""}`;
|
|
238
|
+
context.report({
|
|
239
|
+
node: refNode,
|
|
240
|
+
messageId: "unexpectedRegExp",
|
|
241
|
+
suggest: noFix ? [] : [{
|
|
242
|
+
messageId: "replaceWithLiteral",
|
|
243
|
+
fix(fixer) {
|
|
244
|
+
return fixer.replaceText(refNode, getSafeOutput(refNode, newRegExpValue));
|
|
245
|
+
}
|
|
246
|
+
}]
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
} };
|
|
250
|
+
}
|
|
251
|
+
};
|
|
252
|
+
}));
|
|
253
|
+
//#endregion
|
|
254
|
+
//#region src-js/generated/plugin-eslint/rules/prefer-regex-literals.cjs
|
|
255
|
+
module.exports = require_prefer_regex_literals().create;
|
|
256
|
+
//#endregion
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
//#region ../../node_modules/.pnpm/eslint@9.39.3_jiti@2.6.1/node_modules/eslint/lib/rules/prefer-rest-params.js
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview Rule to
|
|
4
|
+
* @author Toru Nagashima
|
|
5
|
+
*/
|
|
6
|
+
var require_prefer_rest_params = /* @__PURE__ */ require("../common/chunk.cjs").t(((exports, module) => {
|
|
7
|
+
/**
|
|
8
|
+
* Gets the variable object of `arguments` which is defined implicitly.
|
|
9
|
+
* @param {eslint-scope.Scope} scope A scope to get.
|
|
10
|
+
* @returns {eslint-scope.Variable} The found variable object.
|
|
11
|
+
*/
|
|
12
|
+
function getVariableOfArguments(scope) {
|
|
13
|
+
let variables = scope.variables;
|
|
14
|
+
for (let i = 0; i < variables.length; ++i) {
|
|
15
|
+
let variable = variables[i];
|
|
16
|
+
if (variable.name === "arguments") return variable.identifiers.length === 0 ? variable : null;
|
|
17
|
+
}
|
|
18
|
+
/* c8 ignore next */
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Checks if the given reference is not normal member access.
|
|
23
|
+
*
|
|
24
|
+
* - arguments .... true // not member access
|
|
25
|
+
* - arguments[i] .... true // computed member access
|
|
26
|
+
* - arguments[0] .... true // computed member access
|
|
27
|
+
* - arguments.length .... false // normal member access
|
|
28
|
+
* @param {eslint-scope.Reference} reference The reference to check.
|
|
29
|
+
* @returns {boolean} `true` if the reference is not normal member access.
|
|
30
|
+
*/
|
|
31
|
+
function isNotNormalMemberAccess(reference) {
|
|
32
|
+
let id = reference.identifier, parent = id.parent;
|
|
33
|
+
return !(parent.type === "MemberExpression" && parent.object === id && !parent.computed);
|
|
34
|
+
}
|
|
35
|
+
/** @type {import('../types').Rule.RuleModule} */
|
|
36
|
+
module.exports = {
|
|
37
|
+
meta: {
|
|
38
|
+
type: "suggestion",
|
|
39
|
+
docs: {
|
|
40
|
+
description: "Require rest parameters instead of `arguments`",
|
|
41
|
+
recommended: !1,
|
|
42
|
+
url: "https://eslint.org/docs/latest/rules/prefer-rest-params"
|
|
43
|
+
},
|
|
44
|
+
schema: [],
|
|
45
|
+
messages: { preferRestParams: "Use the rest parameters instead of 'arguments'." }
|
|
46
|
+
},
|
|
47
|
+
create(context) {
|
|
48
|
+
let sourceCode = context.sourceCode;
|
|
49
|
+
/**
|
|
50
|
+
* Reports a given reference.
|
|
51
|
+
* @param {eslint-scope.Reference} reference A reference to report.
|
|
52
|
+
* @returns {void}
|
|
53
|
+
*/
|
|
54
|
+
function report(reference) {
|
|
55
|
+
context.report({
|
|
56
|
+
node: reference.identifier,
|
|
57
|
+
loc: reference.identifier.loc,
|
|
58
|
+
messageId: "preferRestParams"
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Reports references of the implicit `arguments` variable if exist.
|
|
63
|
+
* @param {ASTNode} node The node representing the function.
|
|
64
|
+
* @returns {void}
|
|
65
|
+
*/
|
|
66
|
+
function checkForArguments(node) {
|
|
67
|
+
let argumentsVar = getVariableOfArguments(sourceCode.getScope(node));
|
|
68
|
+
argumentsVar && argumentsVar.references.filter(isNotNormalMemberAccess).forEach(report);
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
"FunctionDeclaration:exit": checkForArguments,
|
|
72
|
+
"FunctionExpression:exit": checkForArguments
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
}));
|
|
77
|
+
//#endregion
|
|
78
|
+
//#region src-js/generated/plugin-eslint/rules/prefer-rest-params.cjs
|
|
79
|
+
module.exports = require_prefer_rest_params().create;
|
|
80
|
+
//#endregion
|
|
@@ -0,0 +1,57 @@
|
|
|
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/prefer-spread.js
|
|
3
|
+
/**
|
|
4
|
+
* @fileoverview A rule to suggest using of the spread operator instead of `.apply()`.
|
|
5
|
+
* @author Toru Nagashima
|
|
6
|
+
*/
|
|
7
|
+
var require_prefer_spread = /* @__PURE__ */ require_chunk.t(((exports, module) => {
|
|
8
|
+
let astUtils = require_ast_utils$1.t();
|
|
9
|
+
/**
|
|
10
|
+
* Checks whether or not a node is a `.apply()` for variadic.
|
|
11
|
+
* @param {ASTNode} node A CallExpression node to check.
|
|
12
|
+
* @returns {boolean} Whether or not the node is a `.apply()` for variadic.
|
|
13
|
+
*/
|
|
14
|
+
function isVariadicApplyCalling(node) {
|
|
15
|
+
return astUtils.isSpecificMemberAccess(node.callee, null, "apply") && node.arguments.length === 2 && node.arguments[1].type !== "ArrayExpression" && node.arguments[1].type !== "SpreadElement";
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Checks whether or not `thisArg` is not changed by `.apply()`.
|
|
19
|
+
* @param {ASTNode|null} expectedThis The node that is the owner of the applied function.
|
|
20
|
+
* @param {ASTNode} thisArg The node that is given to the first argument of the `.apply()`.
|
|
21
|
+
* @param {RuleContext} context The ESLint rule context object.
|
|
22
|
+
* @returns {boolean} Whether or not `thisArg` is not changed by `.apply()`.
|
|
23
|
+
*/
|
|
24
|
+
function isValidThisArg(expectedThis, thisArg, context) {
|
|
25
|
+
return expectedThis ? astUtils.equalTokens(expectedThis, thisArg, context) : astUtils.isNullOrUndefined(thisArg);
|
|
26
|
+
}
|
|
27
|
+
/** @type {import('../types').Rule.RuleModule} */
|
|
28
|
+
module.exports = {
|
|
29
|
+
meta: {
|
|
30
|
+
type: "suggestion",
|
|
31
|
+
docs: {
|
|
32
|
+
description: "Require spread operators instead of `.apply()`",
|
|
33
|
+
recommended: !1,
|
|
34
|
+
frozen: !0,
|
|
35
|
+
url: "https://eslint.org/docs/latest/rules/prefer-spread"
|
|
36
|
+
},
|
|
37
|
+
schema: [],
|
|
38
|
+
fixable: null,
|
|
39
|
+
messages: { preferSpread: "Use the spread operator instead of '.apply()'." }
|
|
40
|
+
},
|
|
41
|
+
create(context) {
|
|
42
|
+
let sourceCode = context.sourceCode;
|
|
43
|
+
return { CallExpression(node) {
|
|
44
|
+
if (!isVariadicApplyCalling(node)) return;
|
|
45
|
+
let applied = astUtils.skipChainExpression(astUtils.skipChainExpression(node.callee).object), expectedThis = applied.type === "MemberExpression" ? applied.object : null, thisArg = node.arguments[0];
|
|
46
|
+
isValidThisArg(expectedThis, thisArg, sourceCode) && context.report({
|
|
47
|
+
node,
|
|
48
|
+
messageId: "preferSpread"
|
|
49
|
+
});
|
|
50
|
+
} };
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
}));
|
|
54
|
+
//#endregion
|
|
55
|
+
//#region src-js/generated/plugin-eslint/rules/prefer-spread.cjs
|
|
56
|
+
module.exports = require_prefer_spread().create;
|
|
57
|
+
//#endregion
|
|
@@ -0,0 +1,147 @@
|
|
|
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/prefer-template.js
|
|
3
|
+
/**
|
|
4
|
+
* @fileoverview A rule to suggest using template literals instead of string concatenation.
|
|
5
|
+
* @author Toru Nagashima
|
|
6
|
+
*/
|
|
7
|
+
var require_prefer_template = /* @__PURE__ */ require_chunk.t(((exports, module) => {
|
|
8
|
+
let astUtils = require_ast_utils$1.t();
|
|
9
|
+
/**
|
|
10
|
+
* Checks whether or not a given node is a concatenation.
|
|
11
|
+
* @param {ASTNode} node A node to check.
|
|
12
|
+
* @returns {boolean} `true` if the node is a concatenation.
|
|
13
|
+
*/
|
|
14
|
+
function isConcatenation(node) {
|
|
15
|
+
return node.type === "BinaryExpression" && node.operator === "+";
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Gets the top binary expression node for concatenation in parents of a given node.
|
|
19
|
+
* @param {ASTNode} node A node to get.
|
|
20
|
+
* @returns {ASTNode} the top binary expression node in parents of a given node.
|
|
21
|
+
*/
|
|
22
|
+
function getTopConcatBinaryExpression(node) {
|
|
23
|
+
let currentNode = node;
|
|
24
|
+
for (; isConcatenation(currentNode.parent);) currentNode = currentNode.parent;
|
|
25
|
+
return currentNode;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Checks whether or not a node contains a string literal with an octal or non-octal decimal escape sequence
|
|
29
|
+
* @param {ASTNode} node A node to check
|
|
30
|
+
* @returns {boolean} `true` if at least one string literal within the node contains
|
|
31
|
+
* an octal or non-octal decimal escape sequence
|
|
32
|
+
*/
|
|
33
|
+
function hasOctalOrNonOctalDecimalEscapeSequence(node) {
|
|
34
|
+
return isConcatenation(node) ? hasOctalOrNonOctalDecimalEscapeSequence(node.left) || hasOctalOrNonOctalDecimalEscapeSequence(node.right) : node.type === "Literal" && typeof node.value == "string" ? astUtils.hasOctalOrNonOctalDecimalEscapeSequence(node.raw) : !1;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Checks whether or not a given binary expression has string literals.
|
|
38
|
+
* @param {ASTNode} node A node to check.
|
|
39
|
+
* @returns {boolean} `true` if the node has string literals.
|
|
40
|
+
*/
|
|
41
|
+
function hasStringLiteral(node) {
|
|
42
|
+
return isConcatenation(node) ? hasStringLiteral(node.right) || hasStringLiteral(node.left) : astUtils.isStringLiteral(node);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Checks whether or not a given binary expression has non string literals.
|
|
46
|
+
* @param {ASTNode} node A node to check.
|
|
47
|
+
* @returns {boolean} `true` if the node has non string literals.
|
|
48
|
+
*/
|
|
49
|
+
function hasNonStringLiteral(node) {
|
|
50
|
+
return isConcatenation(node) ? hasNonStringLiteral(node.right) || hasNonStringLiteral(node.left) : !astUtils.isStringLiteral(node);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Determines whether a given node will start with a template curly expression (`${}`) when being converted to a template literal.
|
|
54
|
+
* @param {ASTNode} node The node that will be fixed to a template literal
|
|
55
|
+
* @returns {boolean} `true` if the node will start with a template curly.
|
|
56
|
+
*/
|
|
57
|
+
function startsWithTemplateCurly(node) {
|
|
58
|
+
return node.type === "BinaryExpression" ? startsWithTemplateCurly(node.left) : node.type === "TemplateLiteral" ? node.expressions.length && node.quasis.length && node.quasis[0].range[0] === node.quasis[0].range[1] : node.type !== "Literal" || typeof node.value != "string";
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Determines whether a given node end with a template curly expression (`${}`) when being converted to a template literal.
|
|
62
|
+
* @param {ASTNode} node The node that will be fixed to a template literal
|
|
63
|
+
* @returns {boolean} `true` if the node will end with a template curly.
|
|
64
|
+
*/
|
|
65
|
+
function endsWithTemplateCurly(node) {
|
|
66
|
+
return node.type === "BinaryExpression" ? startsWithTemplateCurly(node.right) : node.type === "TemplateLiteral" ? node.expressions.length && node.quasis.length && node.quasis.at(-1).range[0] === node.quasis.at(-1).range[1] : node.type !== "Literal" || typeof node.value != "string";
|
|
67
|
+
}
|
|
68
|
+
/** @type {import('../types').Rule.RuleModule} */
|
|
69
|
+
module.exports = {
|
|
70
|
+
meta: {
|
|
71
|
+
type: "suggestion",
|
|
72
|
+
docs: {
|
|
73
|
+
description: "Require template literals instead of string concatenation",
|
|
74
|
+
recommended: !1,
|
|
75
|
+
frozen: !0,
|
|
76
|
+
url: "https://eslint.org/docs/latest/rules/prefer-template"
|
|
77
|
+
},
|
|
78
|
+
schema: [],
|
|
79
|
+
fixable: "code",
|
|
80
|
+
messages: { unexpectedStringConcatenation: "Unexpected string concatenation." }
|
|
81
|
+
},
|
|
82
|
+
create(context) {
|
|
83
|
+
let sourceCode = context.sourceCode, done = Object.create(null);
|
|
84
|
+
/**
|
|
85
|
+
* Gets the non-token text between two nodes, ignoring any other tokens that appear between the two tokens.
|
|
86
|
+
* @param {ASTNode} node1 The first node
|
|
87
|
+
* @param {ASTNode} node2 The second node
|
|
88
|
+
* @returns {string} The text between the nodes, excluding other tokens
|
|
89
|
+
*/
|
|
90
|
+
function getTextBetween(node1, node2) {
|
|
91
|
+
let allTokens = [node1].concat(sourceCode.getTokensBetween(node1, node2), node2), sourceText = sourceCode.getText();
|
|
92
|
+
return allTokens.slice(0, -1).reduce((accumulator, token, index) => accumulator + sourceText.slice(token.range[1], allTokens[index + 1].range[0]), "");
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Returns a template literal form of the given node.
|
|
96
|
+
* @param {ASTNode} currentNode A node that should be converted to a template literal
|
|
97
|
+
* @param {string} textBeforeNode Text that should appear before the node
|
|
98
|
+
* @param {string} textAfterNode Text that should appear after the node
|
|
99
|
+
* @returns {string} A string form of this node, represented as a template literal
|
|
100
|
+
*/
|
|
101
|
+
function getTemplateLiteral(currentNode, textBeforeNode, textAfterNode) {
|
|
102
|
+
if (currentNode.type === "Literal" && typeof currentNode.value == "string") return `\`${currentNode.raw.slice(1, -1).replace(/\\*(\$\{|`)/gu, (matched) => matched.lastIndexOf("\\") % 2 ? `\\${matched}` : matched).replace(RegExp(`\\\\${currentNode.raw[0]}`, "gu"), currentNode.raw[0])}\``;
|
|
103
|
+
if (currentNode.type === "TemplateLiteral") return sourceCode.getText(currentNode);
|
|
104
|
+
if (isConcatenation(currentNode) && hasStringLiteral(currentNode)) {
|
|
105
|
+
let plusSign = sourceCode.getFirstTokenBetween(currentNode.left, currentNode.right, (token) => token.value === "+"), textBeforePlus = getTextBetween(currentNode.left, plusSign), textAfterPlus = getTextBetween(plusSign, currentNode.right), leftEndsWithCurly = endsWithTemplateCurly(currentNode.left), rightStartsWithCurly = startsWithTemplateCurly(currentNode.right);
|
|
106
|
+
return leftEndsWithCurly ? getTemplateLiteral(currentNode.left, textBeforeNode, textBeforePlus + textAfterPlus).slice(0, -1) + getTemplateLiteral(currentNode.right, null, textAfterNode).slice(1) : rightStartsWithCurly ? getTemplateLiteral(currentNode.left, textBeforeNode, null).slice(0, -1) + getTemplateLiteral(currentNode.right, textBeforePlus + textAfterPlus, textAfterNode).slice(1) : `${getTemplateLiteral(currentNode.left, textBeforeNode, null)}${textBeforePlus}+${textAfterPlus}${getTemplateLiteral(currentNode.right, textAfterNode, null)}`;
|
|
107
|
+
}
|
|
108
|
+
return `\`\${${textBeforeNode || ""}${sourceCode.getText(currentNode)}${textAfterNode || ""}}\``;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Returns a fixer object that converts a non-string binary expression to a template literal
|
|
112
|
+
* @param {SourceCodeFixer} fixer The fixer object
|
|
113
|
+
* @param {ASTNode} node A node that should be converted to a template literal
|
|
114
|
+
* @returns {Object} A fix for this binary expression
|
|
115
|
+
*/
|
|
116
|
+
function fixNonStringBinaryExpression(fixer, node) {
|
|
117
|
+
let topBinaryExpr = getTopConcatBinaryExpression(node.parent);
|
|
118
|
+
return hasOctalOrNonOctalDecimalEscapeSequence(topBinaryExpr) ? null : fixer.replaceText(topBinaryExpr, getTemplateLiteral(topBinaryExpr, null, null));
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Reports if a given node is string concatenation with non string literals.
|
|
122
|
+
* @param {ASTNode} node A node to check.
|
|
123
|
+
* @returns {void}
|
|
124
|
+
*/
|
|
125
|
+
function checkForStringConcat(node) {
|
|
126
|
+
if (!astUtils.isStringLiteral(node) || !isConcatenation(node.parent)) return;
|
|
127
|
+
let topBinaryExpr = getTopConcatBinaryExpression(node.parent);
|
|
128
|
+
done[topBinaryExpr.range[0]] || (done[topBinaryExpr.range[0]] = !0, hasNonStringLiteral(topBinaryExpr) && context.report({
|
|
129
|
+
node: topBinaryExpr,
|
|
130
|
+
messageId: "unexpectedStringConcatenation",
|
|
131
|
+
fix: (fixer) => fixNonStringBinaryExpression(fixer, node)
|
|
132
|
+
}));
|
|
133
|
+
}
|
|
134
|
+
return {
|
|
135
|
+
Program() {
|
|
136
|
+
done = Object.create(null);
|
|
137
|
+
},
|
|
138
|
+
Literal: checkForStringConcat,
|
|
139
|
+
TemplateLiteral: checkForStringConcat
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
}));
|
|
144
|
+
//#endregion
|
|
145
|
+
//#region src-js/generated/plugin-eslint/rules/prefer-template.cjs
|
|
146
|
+
module.exports = require_prefer_template().create;
|
|
147
|
+
//#endregion
|