87 lines
2.8 KiB
Plaintext
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 };
|