build: update npm install command to use --legacy-peer-deps
This change modifies the build scripts to use --legacy-peer-deps flag when installing npm dependencies to resolve potential peer dependency conflicts during the build process. The change is applied to both bash (build.sh) and batch (build.bat) build scripts.
This commit is contained in:
+92
-280
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* @fileoverview Rule to enforce the use of `u` or `v` flag on regular expressions.
|
||||
* @fileoverview Rule to enforce the use of `u` flag on RegExp.
|
||||
* @author Toru Nagashima
|
||||
*/
|
||||
|
||||
@@ -10,308 +10,120 @@
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
const {
|
||||
CALL,
|
||||
CONSTRUCT,
|
||||
ReferenceTracker,
|
||||
getStringIfConstant,
|
||||
CALL,
|
||||
CONSTRUCT,
|
||||
ReferenceTracker,
|
||||
getStringIfConstant
|
||||
} = require("@eslint-community/eslint-utils");
|
||||
const astUtils = require("./utils/ast-utils.js");
|
||||
const { isValidWithUnicodeFlag } = require("./utils/regular-expressions");
|
||||
|
||||
/**
|
||||
* Checks whether the flag configuration should be treated as a missing flag.
|
||||
* @param {"u"|"v"|undefined} requireFlag A particular flag to require
|
||||
* @param {string} flags The regex flags
|
||||
* @returns {boolean} Whether the flag configuration results in a missing flag.
|
||||
*/
|
||||
function checkFlags(requireFlag, flags) {
|
||||
let missingFlag;
|
||||
|
||||
if (requireFlag === "v") {
|
||||
missingFlag = !flags.includes("v");
|
||||
} else if (requireFlag === "u") {
|
||||
missingFlag = !flags.includes("u");
|
||||
} else {
|
||||
missingFlag = !flags.includes("u") && !flags.includes("v");
|
||||
}
|
||||
|
||||
return missingFlag;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Rule Definition
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
/** @type {import('../types').Rule.RuleModule} */
|
||||
/** @type {import('../shared/types').Rule} */
|
||||
module.exports = {
|
||||
meta: {
|
||||
type: "suggestion",
|
||||
meta: {
|
||||
type: "suggestion",
|
||||
|
||||
defaultOptions: [{}],
|
||||
docs: {
|
||||
description: "Enforce the use of `u` or `v` flag on RegExp",
|
||||
recommended: false,
|
||||
url: "https://eslint.org/docs/latest/rules/require-unicode-regexp"
|
||||
},
|
||||
|
||||
docs: {
|
||||
description:
|
||||
"Enforce the use of `u` or `v` flag on regular expressions",
|
||||
recommended: false,
|
||||
url: "https://eslint.org/docs/latest/rules/require-unicode-regexp",
|
||||
},
|
||||
hasSuggestions: true,
|
||||
|
||||
hasSuggestions: true,
|
||||
messages: {
|
||||
addUFlag: "Add the 'u' flag.",
|
||||
requireUFlag: "Use the 'u' flag."
|
||||
},
|
||||
|
||||
messages: {
|
||||
addUFlag: "Add the 'u' flag.",
|
||||
addVFlag: "Add the 'v' flag.",
|
||||
requireUFlag: "Use the 'u' flag.",
|
||||
requireVFlag: "Use the 'v' flag.",
|
||||
},
|
||||
schema: []
|
||||
},
|
||||
|
||||
schema: [
|
||||
{
|
||||
type: "object",
|
||||
properties: {
|
||||
requireFlag: {
|
||||
enum: ["u", "v"],
|
||||
},
|
||||
},
|
||||
additionalProperties: false,
|
||||
},
|
||||
],
|
||||
},
|
||||
create(context) {
|
||||
|
||||
create(context) {
|
||||
const sourceCode = context.sourceCode;
|
||||
const sourceCode = context.sourceCode;
|
||||
|
||||
const [{ requireFlag }] = context.options;
|
||||
return {
|
||||
"Literal[regex]"(node) {
|
||||
const flags = node.regex.flags || "";
|
||||
|
||||
return {
|
||||
"Literal[regex]"(node) {
|
||||
const flags = node.regex.flags || "";
|
||||
if (!flags.includes("u") && !flags.includes("v")) {
|
||||
context.report({
|
||||
messageId: "requireUFlag",
|
||||
node,
|
||||
suggest: isValidWithUnicodeFlag(context.languageOptions.ecmaVersion, node.regex.pattern)
|
||||
? [
|
||||
{
|
||||
fix(fixer) {
|
||||
return fixer.insertTextAfter(node, "u");
|
||||
},
|
||||
messageId: "addUFlag"
|
||||
}
|
||||
]
|
||||
: null
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
const missingFlag = checkFlags(requireFlag, flags);
|
||||
Program(node) {
|
||||
const scope = sourceCode.getScope(node);
|
||||
const tracker = new ReferenceTracker(scope);
|
||||
const trackMap = {
|
||||
RegExp: { [CALL]: true, [CONSTRUCT]: true }
|
||||
};
|
||||
|
||||
if (missingFlag) {
|
||||
context.report({
|
||||
messageId:
|
||||
requireFlag === "v"
|
||||
? "requireVFlag"
|
||||
: "requireUFlag",
|
||||
node,
|
||||
suggest: isValidWithUnicodeFlag(
|
||||
context.languageOptions.ecmaVersion,
|
||||
node.regex.pattern,
|
||||
requireFlag,
|
||||
)
|
||||
? [
|
||||
{
|
||||
fix(fixer) {
|
||||
const replaceFlag =
|
||||
requireFlag ?? "u";
|
||||
const regex =
|
||||
sourceCode.getText(node);
|
||||
const slashPos =
|
||||
regex.lastIndexOf("/");
|
||||
for (const { node: refNode } of tracker.iterateGlobalReferences(trackMap)) {
|
||||
const [patternNode, flagsNode] = refNode.arguments;
|
||||
|
||||
if (requireFlag) {
|
||||
const flag =
|
||||
requireFlag === "u"
|
||||
? "v"
|
||||
: "u";
|
||||
if (patternNode && patternNode.type === "SpreadElement") {
|
||||
continue;
|
||||
}
|
||||
const pattern = getStringIfConstant(patternNode, scope);
|
||||
const flags = getStringIfConstant(flagsNode, scope);
|
||||
|
||||
if (
|
||||
regex.includes(
|
||||
flag,
|
||||
slashPos,
|
||||
)
|
||||
) {
|
||||
return fixer.replaceText(
|
||||
node,
|
||||
regex.slice(
|
||||
0,
|
||||
slashPos,
|
||||
) +
|
||||
regex
|
||||
.slice(slashPos)
|
||||
.replace(
|
||||
flag,
|
||||
requireFlag,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
if (!flagsNode || (typeof flags === "string" && !flags.includes("u") && !flags.includes("v"))) {
|
||||
context.report({
|
||||
messageId: "requireUFlag",
|
||||
node: refNode,
|
||||
suggest: typeof pattern === "string" && isValidWithUnicodeFlag(context.languageOptions.ecmaVersion, pattern)
|
||||
? [
|
||||
{
|
||||
fix(fixer) {
|
||||
if (flagsNode) {
|
||||
if ((flagsNode.type === "Literal" && typeof flagsNode.value === "string") || flagsNode.type === "TemplateLiteral") {
|
||||
const flagsNodeText = sourceCode.getText(flagsNode);
|
||||
|
||||
return fixer.insertTextAfter(
|
||||
node,
|
||||
replaceFlag,
|
||||
);
|
||||
},
|
||||
messageId:
|
||||
requireFlag === "v"
|
||||
? "addVFlag"
|
||||
: "addUFlag",
|
||||
},
|
||||
]
|
||||
: null,
|
||||
});
|
||||
}
|
||||
},
|
||||
return fixer.replaceText(flagsNode, [
|
||||
flagsNodeText.slice(0, flagsNodeText.length - 1),
|
||||
flagsNodeText.slice(flagsNodeText.length - 1)
|
||||
].join("u"));
|
||||
}
|
||||
|
||||
Program(node) {
|
||||
const scope = sourceCode.getScope(node);
|
||||
const tracker = new ReferenceTracker(scope);
|
||||
const trackMap = {
|
||||
RegExp: { [CALL]: true, [CONSTRUCT]: true },
|
||||
};
|
||||
// We intentionally don't suggest concatenating + "u" to non-literals
|
||||
return null;
|
||||
}
|
||||
|
||||
for (const { node: refNode } of tracker.iterateGlobalReferences(
|
||||
trackMap,
|
||||
)) {
|
||||
const [patternNode, flagsNode] = refNode.arguments;
|
||||
const penultimateToken = sourceCode.getLastToken(refNode, { skip: 1 }); // skip closing parenthesis
|
||||
|
||||
if (patternNode && patternNode.type === "SpreadElement") {
|
||||
continue;
|
||||
}
|
||||
const pattern = getStringIfConstant(patternNode, scope);
|
||||
const flags = getStringIfConstant(flagsNode, scope);
|
||||
|
||||
let missingFlag = !flagsNode;
|
||||
|
||||
if (typeof flags === "string") {
|
||||
missingFlag = checkFlags(requireFlag, flags);
|
||||
}
|
||||
|
||||
if (missingFlag) {
|
||||
context.report({
|
||||
messageId:
|
||||
requireFlag === "v"
|
||||
? "requireVFlag"
|
||||
: "requireUFlag",
|
||||
node: refNode,
|
||||
suggest:
|
||||
typeof pattern === "string" &&
|
||||
isValidWithUnicodeFlag(
|
||||
context.languageOptions.ecmaVersion,
|
||||
pattern,
|
||||
requireFlag,
|
||||
)
|
||||
? [
|
||||
{
|
||||
fix(fixer) {
|
||||
const replaceFlag =
|
||||
requireFlag ?? "u";
|
||||
|
||||
if (flagsNode) {
|
||||
if (
|
||||
(flagsNode.type ===
|
||||
"Literal" &&
|
||||
typeof flagsNode.value ===
|
||||
"string") ||
|
||||
flagsNode.type ===
|
||||
"TemplateLiteral"
|
||||
) {
|
||||
const flagsNodeText =
|
||||
sourceCode.getText(
|
||||
flagsNode,
|
||||
);
|
||||
const flag =
|
||||
requireFlag ===
|
||||
"u"
|
||||
? "v"
|
||||
: "u";
|
||||
|
||||
if (
|
||||
flags.includes(
|
||||
flag,
|
||||
)
|
||||
) {
|
||||
// Avoid replacing "u" in escapes like `\uXXXX`
|
||||
if (
|
||||
flagsNode.type ===
|
||||
"Literal" &&
|
||||
flagsNode.raw.includes(
|
||||
"\\",
|
||||
)
|
||||
) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Avoid replacing "u" in expressions like "`${regularFlags}g`"
|
||||
if (
|
||||
flagsNode.type ===
|
||||
"TemplateLiteral" &&
|
||||
(flagsNode
|
||||
.expressions
|
||||
.length ||
|
||||
flagsNode.quasis.some(
|
||||
({
|
||||
value: {
|
||||
raw,
|
||||
},
|
||||
}) =>
|
||||
raw.includes(
|
||||
"\\",
|
||||
),
|
||||
))
|
||||
) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return fixer.replaceText(
|
||||
flagsNode,
|
||||
flagsNodeText.replace(
|
||||
flag,
|
||||
replaceFlag,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
return fixer.replaceText(
|
||||
flagsNode,
|
||||
[
|
||||
flagsNodeText.slice(
|
||||
0,
|
||||
flagsNodeText.length -
|
||||
1,
|
||||
),
|
||||
flagsNodeText.slice(
|
||||
flagsNodeText.length -
|
||||
1,
|
||||
),
|
||||
].join(
|
||||
replaceFlag,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
// We intentionally don't suggest concatenating + "u" to non-literals
|
||||
return null;
|
||||
}
|
||||
|
||||
const penultimateToken =
|
||||
sourceCode.getLastToken(
|
||||
refNode,
|
||||
{ skip: 1 },
|
||||
); // skip closing parenthesis
|
||||
|
||||
return fixer.insertTextAfter(
|
||||
penultimateToken,
|
||||
astUtils.isCommaToken(
|
||||
penultimateToken,
|
||||
)
|
||||
? ` "${replaceFlag}",`
|
||||
: `, "${replaceFlag}"`,
|
||||
);
|
||||
},
|
||||
messageId:
|
||||
requireFlag === "v"
|
||||
? "addVFlag"
|
||||
: "addUFlag",
|
||||
},
|
||||
]
|
||||
: null,
|
||||
});
|
||||
}
|
||||
}
|
||||
},
|
||||
};
|
||||
},
|
||||
return fixer.insertTextAfter(
|
||||
penultimateToken,
|
||||
astUtils.isCommaToken(penultimateToken)
|
||||
? ' "u",'
|
||||
: ', "u"'
|
||||
);
|
||||
},
|
||||
messageId: "addUFlag"
|
||||
}
|
||||
]
|
||||
: null
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user