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
142 lines
4.6 KiB
Plaintext
142 lines
4.6 KiB
Plaintext
import { f as createRule, g as import_ast_utils, m as AST_NODE_TYPES } from "../utils.js";
|
|
var semi_spacing_default = createRule({
|
|
name: "semi-spacing",
|
|
meta: {
|
|
type: "layout",
|
|
docs: { description: "Enforce consistent spacing before and after semicolons" },
|
|
fixable: "whitespace",
|
|
schema: [{
|
|
type: "object",
|
|
properties: {
|
|
before: { type: "boolean" },
|
|
after: { type: "boolean" }
|
|
},
|
|
additionalProperties: false
|
|
}],
|
|
defaultOptions: [{
|
|
before: false,
|
|
after: true
|
|
}],
|
|
messages: {
|
|
unexpectedWhitespaceBefore: "Unexpected whitespace before semicolon.",
|
|
unexpectedWhitespaceAfter: "Unexpected whitespace after semicolon.",
|
|
missingWhitespaceBefore: "Missing whitespace before semicolon.",
|
|
missingWhitespaceAfter: "Missing whitespace after semicolon."
|
|
}
|
|
},
|
|
create(context, [config]) {
|
|
const { before: requireSpaceBefore, after: requireSpaceAfter } = config;
|
|
const sourceCode = context.sourceCode;
|
|
function hasLeadingSpace(token) {
|
|
const tokenBefore = sourceCode.getTokenBefore(token);
|
|
return tokenBefore && (0, import_ast_utils.isTokenOnSameLine)(tokenBefore, token) && sourceCode.isSpaceBetween(tokenBefore, token);
|
|
}
|
|
function hasTrailingSpace(token) {
|
|
const tokenAfter = sourceCode.getTokenAfter(token);
|
|
return tokenAfter && (0, import_ast_utils.isTokenOnSameLine)(token, tokenAfter) && sourceCode.isSpaceBetween(token, tokenAfter);
|
|
}
|
|
function isLastTokenInCurrentLine(token) {
|
|
const tokenAfter = sourceCode.getTokenAfter(token);
|
|
return !(tokenAfter && (0, import_ast_utils.isTokenOnSameLine)(token, tokenAfter));
|
|
}
|
|
function isFirstTokenInCurrentLine(token) {
|
|
const tokenBefore = sourceCode.getTokenBefore(token);
|
|
return !(tokenBefore && (0, import_ast_utils.isTokenOnSameLine)(token, tokenBefore));
|
|
}
|
|
function isBeforeClosingParen(token) {
|
|
const nextToken = sourceCode.getTokenAfter(token);
|
|
return nextToken && (0, import_ast_utils.isClosingBraceToken)(nextToken) || (0, import_ast_utils.isClosingParenToken)(nextToken);
|
|
}
|
|
function checkSemicolonSpacing(token, node) {
|
|
if ((0, import_ast_utils.isSemicolonToken)(token)) {
|
|
if (hasLeadingSpace(token)) {
|
|
if (!requireSpaceBefore) {
|
|
const tokenBefore = sourceCode.getTokenBefore(token);
|
|
const loc = {
|
|
start: tokenBefore.loc.end,
|
|
end: token.loc.start
|
|
};
|
|
context.report({
|
|
node,
|
|
loc,
|
|
messageId: "unexpectedWhitespaceBefore",
|
|
fix(fixer) {
|
|
return fixer.removeRange([tokenBefore.range[1], token.range[0]]);
|
|
}
|
|
});
|
|
}
|
|
} else if (requireSpaceBefore) {
|
|
const loc = token.loc;
|
|
context.report({
|
|
node,
|
|
loc,
|
|
messageId: "missingWhitespaceBefore",
|
|
fix(fixer) {
|
|
return fixer.insertTextBefore(token, " ");
|
|
}
|
|
});
|
|
}
|
|
if (!isFirstTokenInCurrentLine(token) && !isLastTokenInCurrentLine(token) && !isBeforeClosingParen(token)) {
|
|
if (hasTrailingSpace(token)) {
|
|
if (!requireSpaceAfter) {
|
|
const tokenAfter = sourceCode.getTokenAfter(token);
|
|
const loc = {
|
|
start: token.loc.end,
|
|
end: tokenAfter.loc.start
|
|
};
|
|
context.report({
|
|
node,
|
|
loc,
|
|
messageId: "unexpectedWhitespaceAfter",
|
|
fix(fixer) {
|
|
return fixer.removeRange([token.range[1], tokenAfter.range[0]]);
|
|
}
|
|
});
|
|
}
|
|
} else if (requireSpaceAfter) {
|
|
const loc = token.loc;
|
|
context.report({
|
|
node,
|
|
loc,
|
|
messageId: "missingWhitespaceAfter",
|
|
fix(fixer) {
|
|
return fixer.insertTextAfter(token, " ");
|
|
}
|
|
});
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function checkNode(node) {
|
|
checkSemicolonSpacing(sourceCode.getLastToken(node), node);
|
|
}
|
|
return {
|
|
VariableDeclaration: checkNode,
|
|
ExpressionStatement: checkNode,
|
|
BreakStatement: checkNode,
|
|
ContinueStatement: checkNode,
|
|
DebuggerStatement: checkNode,
|
|
DoWhileStatement: checkNode,
|
|
ReturnStatement: checkNode,
|
|
ThrowStatement: checkNode,
|
|
ImportDeclaration: checkNode,
|
|
ExportNamedDeclaration: checkNode,
|
|
ExportAllDeclaration: checkNode,
|
|
ExportDefaultDeclaration: checkNode,
|
|
ForStatement(node) {
|
|
if (node.init) checkSemicolonSpacing(sourceCode.getTokenAfter(node.init), node);
|
|
if (node.test) checkSemicolonSpacing(sourceCode.getTokenAfter(node.test), node);
|
|
},
|
|
PropertyDefinition: checkNode,
|
|
AccessorProperty: checkNode,
|
|
TSDeclareFunction: checkNode,
|
|
TSTypeAliasDeclaration: checkNode,
|
|
TSTypeAnnotation(node) {
|
|
const excludeNodeTypes = new Set([AST_NODE_TYPES.TSDeclareFunction]);
|
|
if (node.parent && !excludeNodeTypes.has(node.parent.type)) checkNode(node.parent);
|
|
}
|
|
};
|
|
}
|
|
});
|
|
export { semi_spacing_default as t };
|