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:
Luiz Costa
2025-11-18 10:23:55 -03:00
parent 20129a1ac7
commit ac4f232e5e
787 changed files with 82341 additions and 121690 deletions
+141 -127
View File
@@ -13,8 +13,8 @@ const { findVariable } = require("@eslint-community/eslint-utils");
const astUtils = require("./utils/ast-utils");
const WellKnownMutationFunctions = {
Object: /^(?:assign|definePropert(?:y|ies)|freeze|setPrototypeOf)$/u,
Reflect: /^(?:(?:define|delete)Property|set(?:PrototypeOf)?)$/u,
Object: /^(?:assign|definePropert(?:y|ies)|freeze|setPrototypeOf)$/u,
Reflect: /^(?:(?:define|delete)Property|set(?:PrototypeOf)?)$/u
};
/**
@@ -23,18 +23,27 @@ const WellKnownMutationFunctions = {
* @returns {boolean} `true` if the node is LHS.
*/
function isAssignmentLeft(node) {
const { parent } = node;
const { parent } = node;
return (
(parent.type === "AssignmentExpression" && parent.left === node) ||
// Destructuring assignments
parent.type === "ArrayPattern" ||
(parent.type === "Property" &&
parent.value === node &&
parent.parent.type === "ObjectPattern") ||
parent.type === "RestElement" ||
(parent.type === "AssignmentPattern" && parent.left === node)
);
return (
(
parent.type === "AssignmentExpression" &&
parent.left === node
) ||
// Destructuring assignments
parent.type === "ArrayPattern" ||
(
parent.type === "Property" &&
parent.value === node &&
parent.parent.type === "ObjectPattern"
) ||
parent.type === "RestElement" ||
(
parent.type === "AssignmentPattern" &&
parent.left === node
)
);
}
/**
@@ -43,17 +52,22 @@ function isAssignmentLeft(node) {
* @returns {boolean} `true` if the node is the operand of mutation unary operator.
*/
function isOperandOfMutationUnaryOperator(node) {
const argumentNode =
node.parent.type === "ChainExpression" ? node.parent : node;
const { parent } = argumentNode;
const argumentNode = node.parent.type === "ChainExpression"
? node.parent
: node;
const { parent } = argumentNode;
return (
(parent.type === "UpdateExpression" &&
parent.argument === argumentNode) ||
(parent.type === "UnaryExpression" &&
parent.operator === "delete" &&
parent.argument === argumentNode)
);
return (
(
parent.type === "UpdateExpression" &&
parent.argument === argumentNode
) ||
(
parent.type === "UnaryExpression" &&
parent.operator === "delete" &&
parent.argument === argumentNode
)
);
}
/**
@@ -62,12 +76,18 @@ function isOperandOfMutationUnaryOperator(node) {
* @returns {boolean} `true` if the node is the iteration variable.
*/
function isIterationVariable(node) {
const { parent } = node;
const { parent } = node;
return (
(parent.type === "ForInStatement" && parent.left === node) ||
(parent.type === "ForOfStatement" && parent.left === node)
);
return (
(
parent.type === "ForInStatement" &&
parent.left === node
) ||
(
parent.type === "ForOfStatement" &&
parent.left === node
)
);
}
/**
@@ -86,30 +106,22 @@ function isIterationVariable(node) {
* @returns {boolean} `true` if the node is at the first argument of a well-known mutation function.
*/
function isArgumentOfWellKnownMutationFunction(node, scope) {
const { parent } = node;
const { parent } = node;
if (parent.type !== "CallExpression" || parent.arguments[0] !== node) {
return false;
}
const callee = astUtils.skipChainExpression(parent.callee);
if (parent.type !== "CallExpression" || parent.arguments[0] !== node) {
return false;
}
const callee = astUtils.skipChainExpression(parent.callee);
if (
!astUtils.isSpecificMemberAccess(
callee,
"Object",
WellKnownMutationFunctions.Object,
) &&
!astUtils.isSpecificMemberAccess(
callee,
"Reflect",
WellKnownMutationFunctions.Reflect,
)
) {
return false;
}
const variable = findVariable(scope, callee.object);
if (
!astUtils.isSpecificMemberAccess(callee, "Object", WellKnownMutationFunctions.Object) &&
!astUtils.isSpecificMemberAccess(callee, "Reflect", WellKnownMutationFunctions.Reflect)
) {
return false;
}
const variable = findVariable(scope, callee.object);
return variable !== null && variable.scope.type === "global";
return variable !== null && variable.scope.type === "global";
}
/**
@@ -119,16 +131,20 @@ function isArgumentOfWellKnownMutationFunction(node, scope) {
* @returns {boolean} `true` if the member of `id` was updated.
*/
function isMemberWrite(id, scope) {
const { parent } = id;
const { parent } = id;
return (
(parent.type === "MemberExpression" &&
parent.object === id &&
(isAssignmentLeft(parent) ||
isOperandOfMutationUnaryOperator(parent) ||
isIterationVariable(parent))) ||
isArgumentOfWellKnownMutationFunction(id, scope)
);
return (
(
parent.type === "MemberExpression" &&
parent.object === id &&
(
isAssignmentLeft(parent) ||
isOperandOfMutationUnaryOperator(parent) ||
isIterationVariable(parent)
)
) ||
isArgumentOfWellKnownMutationFunction(id, scope)
);
}
/**
@@ -137,91 +153,89 @@ function isMemberWrite(id, scope) {
* @returns {ASTNode} The mutation node.
*/
function getWriteNode(id) {
let node = id.parent;
let node = id.parent;
while (
node &&
node.type !== "AssignmentExpression" &&
node.type !== "UpdateExpression" &&
node.type !== "UnaryExpression" &&
node.type !== "CallExpression" &&
node.type !== "ForInStatement" &&
node.type !== "ForOfStatement"
) {
node = node.parent;
}
while (
node &&
node.type !== "AssignmentExpression" &&
node.type !== "UpdateExpression" &&
node.type !== "UnaryExpression" &&
node.type !== "CallExpression" &&
node.type !== "ForInStatement" &&
node.type !== "ForOfStatement"
) {
node = node.parent;
}
return node || id;
return node || id;
}
//------------------------------------------------------------------------------
// Rule Definition
//------------------------------------------------------------------------------
/** @type {import('../types').Rule.RuleModule} */
/** @type {import('../shared/types').Rule} */
module.exports = {
meta: {
type: "problem",
meta: {
type: "problem",
docs: {
description: "Disallow assigning to imported bindings",
recommended: true,
url: "https://eslint.org/docs/latest/rules/no-import-assign",
},
docs: {
description: "Disallow assigning to imported bindings",
recommended: true,
url: "https://eslint.org/docs/latest/rules/no-import-assign"
},
schema: [],
schema: [],
messages: {
readonly: "'{{name}}' is read-only.",
readonlyMember: "The members of '{{name}}' are read-only.",
},
},
messages: {
readonly: "'{{name}}' is read-only.",
readonlyMember: "The members of '{{name}}' are read-only."
}
},
create(context) {
const sourceCode = context.sourceCode;
create(context) {
const sourceCode = context.sourceCode;
return {
ImportDeclaration(node) {
const scope = sourceCode.getScope(node);
return {
ImportDeclaration(node) {
const scope = sourceCode.getScope(node);
for (const variable of sourceCode.getDeclaredVariables(node)) {
const shouldCheckMembers = variable.defs.some(
d => d.node.type === "ImportNamespaceSpecifier",
);
let prevIdNode = null;
for (const variable of sourceCode.getDeclaredVariables(node)) {
const shouldCheckMembers = variable.defs.some(
d => d.node.type === "ImportNamespaceSpecifier"
);
let prevIdNode = null;
for (const reference of variable.references) {
const idNode = reference.identifier;
for (const reference of variable.references) {
const idNode = reference.identifier;
/*
* AssignmentPattern (e.g. `[a = 0] = b`) makes two write
* references for the same identifier. This should skip
* the one of the two in order to prevent redundant reports.
*/
if (idNode === prevIdNode) {
continue;
}
prevIdNode = idNode;
/*
* AssignmentPattern (e.g. `[a = 0] = b`) makes two write
* references for the same identifier. This should skip
* the one of the two in order to prevent redundant reports.
*/
if (idNode === prevIdNode) {
continue;
}
prevIdNode = idNode;
if (reference.isWrite()) {
context.report({
node: getWriteNode(idNode),
messageId: "readonly",
data: { name: idNode.name },
});
} else if (
shouldCheckMembers &&
isMemberWrite(idNode, scope)
) {
context.report({
node: getWriteNode(idNode),
messageId: "readonlyMember",
data: { name: idNode.name },
});
}
}
}
},
};
},
if (reference.isWrite()) {
context.report({
node: getWriteNode(idNode),
messageId: "readonly",
data: { name: idNode.name }
});
} else if (shouldCheckMembers && isMemberWrite(idNode, scope)) {
context.report({
node: getWriteNode(idNode),
messageId: "readonlyMember",
data: { name: idNode.name }
});
}
}
}
}
};
}
};