Files
SnowLuma/.pnpm-store/v11/files/ee/7395af6c13f9297dde92305c5fb9413ac25b8dc190d5a9d7f9e1bb4a029877f46060f2a4c6e8dab0bfea79f05399c6f750076de6f03f0df7f55302becfef83
TanTan 2a69b23b47
Dev Build / cleanup (push) Canceled after 0s
Dev Build / typecheck (push) Canceled after 0s
Dev Build / build (linux-arm64, ubuntu-24.04-arm, linux-arm64) (push) Canceled after 0s
Dev Build / build (linux-x64, ubuntu-latest, linux-x64) (push) Canceled after 0s
Dev Build / build (win-x64, windows-latest, win32-x64) (push) Canceled after 0s
Dev Build / dispatch-dev-docker (push) Canceled after 0s
docs: 仓库链接指向本镜像仓库
2026-11-13 09:27:07 +08:00

89 lines
3.3 KiB
Plaintext

import { K as isSingleLine, f as createRule } from "../utils.js";
var jsx_newline_default = createRule({
name: "jsx-newline",
package: "jsx",
meta: {
type: "layout",
docs: { description: "Require or prevent a new line after jsx elements and expressions." },
fixable: "code",
schema: [{
type: "object",
properties: {
prevent: { type: "boolean" },
allowMultilines: { type: "boolean" }
},
additionalProperties: false,
if: { properties: { allowMultilines: { const: true } } },
then: {
properties: { prevent: { const: true } },
required: ["prevent"]
}
}],
defaultOptions: [{
prevent: false,
allowMultilines: false
}],
messages: {
require: "JSX element should start in a new line",
prevent: "JSX element should not start in a new line",
allowMultilines: "Multiline JSX elements should start in a new line"
}
},
create(context, [configuration]) {
const { prevent, allowMultilines } = configuration;
const jsxElementParents = /* @__PURE__ */ new Set();
const sourceCode = context.sourceCode;
function isBlockCommentInCurlyBraces(element) {
const elementRawValue = sourceCode.getText(element);
return /^\s*\{\/\*/.test(elementRawValue);
}
function isNonBlockComment(element) {
return !isBlockCommentInCurlyBraces(element) && (element.type === "JSXElement" || element.type === "JSXExpressionContainer");
}
return {
"Program:exit": function() {
jsxElementParents.forEach((parent) => {
parent.children.forEach((element, index, elements) => {
if (element.type === "JSXElement" || element.type === "JSXExpressionContainer") {
const firstAdjacentSibling = elements[index + 1];
const secondAdjacentSibling = elements[index + 2];
if (!(firstAdjacentSibling && secondAdjacentSibling && (firstAdjacentSibling.type === "Literal" || firstAdjacentSibling.type === "JSXText"))) return;
const isWithoutNewLine = !/\n\s*\n/.test(firstAdjacentSibling.value);
if (isBlockCommentInCurlyBraces(element)) return;
const nextNonBlockComment = elements.slice(index + 2).find(isNonBlockComment);
if (allowMultilines && (!isSingleLine(element) || nextNonBlockComment && !isSingleLine(nextNonBlockComment))) {
if (!isWithoutNewLine) return;
const regex = /(\n)(?!.*\1)/g;
const replacement = "\n\n";
context.report({
messageId: "allowMultilines",
node: secondAdjacentSibling,
fix(fixer) {
return fixer.replaceText(firstAdjacentSibling, sourceCode.getText(firstAdjacentSibling).replace(regex, replacement));
}
});
return;
}
if (isWithoutNewLine === prevent) return;
const messageId = prevent ? "prevent" : "require";
const regex = prevent ? /(\n\n)(?!.*\1)/g : /(\n)(?!.*\1)/g;
const replacement = prevent ? "\n" : "\n\n";
context.report({
messageId,
node: secondAdjacentSibling,
fix(fixer) {
return fixer.replaceText(firstAdjacentSibling, sourceCode.getText(firstAdjacentSibling).replace(regex, replacement));
}
});
}
});
});
},
":matches(JSXElement, JSXFragment) > :matches(JSXElement, JSXExpressionContainer)": (node) => {
jsxElementParents.add(node.parent);
}
};
}
});
export { jsx_newline_default as t };