Files
SnowLuma/.pnpm-store/v11/files/4b/e7305ea36b7824f573219a82730fcd27c50862bdfdb924bcf7bb8fb2e77179a252de7f5cf6665a2d4525044594cd720d53a0f2a2def356145554e2df2a2d31
TanTan 2a69b23b47
Dev Build / cleanup (push) Waiting to run
Dev Build / typecheck (push) Waiting to run
docs: 仓库链接指向本镜像仓库
2026-11-13 09:27:07 +08:00

87 lines
2.9 KiB
Plaintext

import { V as isNodeFirstInLine, f as createRule } from "../utils.js";
var jsx_indent_props_default = createRule({
name: "jsx-indent-props",
meta: {
type: "layout",
docs: { description: "Enforce props indentation in JSX" },
fixable: "code",
schema: [{ anyOf: [
{
type: "string",
enum: ["tab", "first"]
},
{ type: "integer" },
{
type: "object",
properties: {
indentMode: { anyOf: [{
type: "string",
enum: ["tab", "first"]
}, { type: "integer" }] },
ignoreTernaryOperator: { type: "boolean" }
},
additionalProperties: false
}
] }],
defaultOptions: [4],
messages: { wrongIndent: "Expected indentation of {{needed}} {{type}} {{characters}} but found {{gotten}}." }
},
create(context, [options]) {
const extraColumnStart = 0;
const line = {
isUsingOperator: false,
currentOperator: false
};
const { indentMode = 4, ignoreTernaryOperator = false } = typeof options === "object" ? options : { indentMode: options };
const indentType = indentMode === "tab" ? "tab" : "space";
const indentSize = indentMode === "first" ? "first" : indentMode === "tab" ? 1 : indentMode;
function getNodeIndent(node) {
let src = context.sourceCode.getText(node, node.loc.start.column + extraColumnStart);
src = src.split("\n")[0];
let regExp;
if (indentType === "space") regExp = /^ +/;
else regExp = /^\t+/;
const indent = regExp.exec(src);
const useOperator = /^[ \t]*:/.test(src) || /^[ \t]*\?/.test(src);
const useBracket = /</.test(src);
line.currentOperator = false;
if (useOperator) {
line.isUsingOperator = true;
line.currentOperator = true;
} else if (useBracket) line.isUsingOperator = false;
return indent ? indent[0].length : 0;
}
function checkNodesIndent(nodes, indent) {
let nestedIndent = indent;
nodes.forEach((node) => {
const nodeIndent = getNodeIndent(node);
if (line.isUsingOperator && !line.currentOperator && indentSize !== "first" && !ignoreTernaryOperator) {
nestedIndent += indentSize;
line.isUsingOperator = false;
}
if (node.type !== "ArrayExpression" && node.type !== "ObjectExpression" && nodeIndent !== nestedIndent && isNodeFirstInLine(context, node)) context.report({
node,
messageId: "wrongIndent",
data: {
needed: nestedIndent,
type: indentType,
characters: nestedIndent === 1 ? "character" : "characters",
gotten: nodeIndent
},
fix(fixer) {
return fixer.replaceTextRange([node.range[0] - node.loc.start.column, node.range[0]], new Array(nestedIndent + 1).join(indentType === "space" ? " " : " "));
}
});
});
}
return { JSXOpeningElement(node) {
if (!node.attributes.length) return;
let propIndent;
if (indentSize === "first") propIndent = node.attributes[0].loc.start.column;
else propIndent = getNodeIndent(node) + indentSize;
checkNodesIndent(node.attributes, propIndent);
} };
}
});
export { jsx_indent_props_default as t };