Files
SnowLuma/.pnpm-store/v11/files/2a/ae1ea32e61947d1c5ca1a62cf102bf37172303d1b9d3701e3573bb71dab6cfea50228c822c368ac3eaafa431c8f896ef1fcc3ab3858854c260a830e121b344
T
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

144 lines
4.3 KiB
Plaintext

import { f as createRule, g as import_ast_utils, j as getSwitchCaseColonToken, z as isKeywordToken } from "../utils.js";
var space_before_blocks_default = createRule({
name: "space-before-blocks",
meta: {
type: "layout",
docs: { description: "Enforce consistent spacing before blocks" },
fixable: "whitespace",
schema: [{ oneOf: [{
type: "string",
enum: ["always", "never"]
}, {
type: "object",
properties: {
keywords: {
type: "string",
enum: [
"always",
"never",
"off"
]
},
functions: {
type: "string",
enum: [
"always",
"never",
"off"
]
},
classes: {
type: "string",
enum: [
"always",
"never",
"off"
]
},
modules: {
type: "string",
enum: [
"always",
"never",
"off"
]
}
},
additionalProperties: false
}] }],
defaultOptions: ["always"],
messages: {
unexpectedSpace: "Unexpected space before opening brace.",
missingSpace: "Missing space before opening brace."
}
},
create(context, [config]) {
const sourceCode = context.sourceCode;
let alwaysFunctions = true;
let alwaysKeywords = true;
let alwaysClasses = true;
let alwaysModules = true;
let neverFunctions = false;
let neverKeywords = false;
let neverClasses = false;
let neverModules = false;
if (typeof config === "object") {
alwaysFunctions = config.functions === "always";
alwaysKeywords = config.keywords === "always";
alwaysClasses = config.classes === "always";
alwaysModules = config.modules === "always";
neverFunctions = config.functions === "never";
neverKeywords = config.keywords === "never";
neverClasses = config.classes === "never";
neverModules = config.modules === "never";
} else if (config === "never") {
alwaysFunctions = false;
alwaysKeywords = false;
alwaysClasses = false;
alwaysModules = false;
neverFunctions = true;
neverKeywords = true;
neverClasses = true;
neverModules = true;
}
function isFunctionBody(node) {
if (!("parent" in node)) return false;
const parent = node.parent;
return node.type === "BlockStatement" && (0, import_ast_utils.isFunction)(parent) && parent.body === node;
}
function isConflicted(precedingToken, node) {
return (0, import_ast_utils.isArrowToken)(precedingToken) || isKeywordToken(precedingToken) && !isFunctionBody(node) || (0, import_ast_utils.isColonToken)(precedingToken) && "parent" in node && node.parent && node.parent.type === "SwitchCase" && precedingToken === getSwitchCaseColonToken(node.parent, sourceCode);
}
function checkPrecedingSpace(node) {
const precedingToken = sourceCode.getTokenBefore(node);
if (precedingToken && !isConflicted(precedingToken, node) && (0, import_ast_utils.isTokenOnSameLine)(precedingToken, node)) {
const hasSpace = sourceCode.isSpaceBetween(precedingToken, node);
let requireSpace;
let requireNoSpace;
if (isFunctionBody(node)) {
requireSpace = alwaysFunctions;
requireNoSpace = neverFunctions;
} else if (node.type === "ClassBody" || node.type === "TSEnumBody" || node.type === "TSInterfaceBody") {
requireSpace = alwaysClasses;
requireNoSpace = neverClasses;
} else if (node.type === "TSModuleBlock") {
requireSpace = alwaysModules;
requireNoSpace = neverModules;
} else {
requireSpace = alwaysKeywords;
requireNoSpace = neverKeywords;
}
if (requireSpace && !hasSpace) context.report({
node,
messageId: "missingSpace",
fix(fixer) {
return fixer.insertTextBefore(node, " ");
}
});
else if (requireNoSpace && hasSpace) context.report({
node,
messageId: "unexpectedSpace",
fix(fixer) {
return fixer.removeRange([precedingToken.range[1], node.range[0]]);
}
});
}
}
return {
BlockStatement: checkPrecedingSpace,
ClassBody: checkPrecedingSpace,
SwitchStatement(node) {
const cases = node.cases;
let openingBrace;
if (cases.length > 0) openingBrace = sourceCode.getTokenBefore(cases[0]);
else openingBrace = sourceCode.getLastToken(node, 1);
checkPrecedingSpace(openingBrace);
},
TSEnumBody: checkPrecedingSpace,
TSInterfaceBody: checkPrecedingSpace,
TSModuleBlock: checkPrecedingSpace
};
}
});
export { space_before_blocks_default as t };