Files
SnowLuma/.pnpm-store/v11/files/44/0db255f880772696b2f94dc1174f18d583a93a24cb4eccf6f81e360c0cf216d0cbe241e8d1d254ba3cb2f13a0f974b95811d17f7e49a01c78034a1cb0e2aac
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

87 lines
2.8 KiB
Plaintext

import { f as createRule } from "../utils.js";
const PRESERVE_PREFIX_SPACE_BEFORE_GENERIC = new Set([
"TSCallSignatureDeclaration",
"ArrowFunctionExpression",
"TSFunctionType",
"TSConstructorType",
"FunctionExpression",
"ClassExpression"
]);
var type_generic_spacing_default = createRule({
name: "type-generic-spacing",
meta: {
type: "layout",
docs: { description: "Enforces consistent spacing inside TypeScript type generics" },
fixable: "whitespace",
schema: [],
messages: { genericSpacingMismatch: "Generic spaces mismatch" }
},
create: (context) => {
const sourceCode = context.sourceCode;
function removeSpaceBetween(left, right) {
const textBetween = sourceCode.text.slice(left.range[1], right.range[0]);
if (/\s/.test(textBetween) && !/^[\r\n]/.test(textBetween)) context.report({
loc: {
start: left.loc.end,
end: right.loc.start
},
messageId: "genericSpacingMismatch",
*fix(fixer) {
yield fixer.replaceTextRange([left.range[1], right.range[0]], "");
}
});
}
function checkBracketSpacing(openToken, closeToken) {
if (openToken) {
const firstToken = sourceCode.getTokenAfter(openToken);
if (firstToken) removeSpaceBetween(openToken, firstToken);
}
if (closeToken) {
const lastToken = sourceCode.getTokenBefore(closeToken);
if (lastToken) removeSpaceBetween(lastToken, closeToken);
}
}
return {
TSTypeParameterInstantiation: (node) => {
const params = node.params;
if (params.length === 0) return;
checkBracketSpacing(sourceCode.getTokenBefore(params[0]), sourceCode.getTokenAfter(params[params.length - 1]));
},
TSTypeParameterDeclaration: (node) => {
if (!PRESERVE_PREFIX_SPACE_BEFORE_GENERIC.has(node.parent.type)) {
const preSpace = sourceCode.text.slice(0, node.range[0]).match(/(\s+)$/)?.[0];
if (preSpace && preSpace.length) context.report({
node,
messageId: "genericSpacingMismatch",
*fix(fixer) {
yield fixer.replaceTextRange([node.range[0] - preSpace.length, node.range[0]], "");
}
});
}
const params = node.params;
if (params.length === 0) return;
checkBracketSpacing(sourceCode.getTokenBefore(params[0]), sourceCode.getTokenAfter(params[params.length - 1]));
},
TSTypeParameter: (node) => {
if (!node.default) return;
const endNode = node.constraint || node.name;
const from = endNode.range[1];
const to = node.default.range[0];
const span = sourceCode.text.slice(from, to);
if (!span.match(/(?:^|[^ ]) = (?:$|[^ ])/)) context.report({
*fix(fixer) {
yield fixer.replaceTextRange([from, to], span.replace(/\s*=\s*/, " = "));
},
loc: {
start: endNode.loc.end,
end: node.default.loc.start
},
messageId: "genericSpacingMismatch",
node
});
}
};
}
});
export { type_generic_spacing_default as t };