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
112 lines
4.5 KiB
Plaintext
112 lines
4.5 KiB
Plaintext
import { f as createRule, g as import_ast_utils, h as AST_TOKEN_TYPES, m as AST_NODE_TYPES } from "../utils.js";
|
|
const UNIONS = ["|", "&"];
|
|
var space_infix_ops_default = createRule({
|
|
name: "space-infix-ops",
|
|
meta: {
|
|
type: "layout",
|
|
docs: { description: "Require spacing around infix operators" },
|
|
fixable: "whitespace",
|
|
schema: [{
|
|
type: "object",
|
|
properties: {
|
|
int32Hint: { type: "boolean" },
|
|
ignoreTypes: { type: "boolean" }
|
|
},
|
|
additionalProperties: false
|
|
}],
|
|
defaultOptions: [{
|
|
int32Hint: false,
|
|
ignoreTypes: false
|
|
}],
|
|
messages: { missingSpace: "Operator '{{operator}}' must be spaced." }
|
|
},
|
|
create(context, [options]) {
|
|
const { int32Hint, ignoreTypes } = options;
|
|
const sourceCode = context.sourceCode;
|
|
function report(node, operator) {
|
|
context.report({
|
|
node,
|
|
loc: operator.loc,
|
|
messageId: "missingSpace",
|
|
data: { operator: operator.value },
|
|
fix(fixer) {
|
|
const previousToken = sourceCode.getTokenBefore(operator);
|
|
const afterToken = sourceCode.getTokenAfter(operator);
|
|
let fixString = "";
|
|
if (operator.range[0] - previousToken.range[1] === 0) fixString = " ";
|
|
fixString += operator.value;
|
|
if (afterToken.range[0] - operator.range[1] === 0) fixString += " ";
|
|
return fixer.replaceText(operator, fixString);
|
|
}
|
|
});
|
|
}
|
|
function getFirstNonSpacedToken(left, right, op) {
|
|
const operator = sourceCode.getFirstTokenBetween(left, right, (token) => token.value === op);
|
|
const prev = sourceCode.getTokenBefore(operator);
|
|
const next = sourceCode.getTokenAfter(operator);
|
|
if (!sourceCode.isSpaceBetween(prev, operator) || !sourceCode.isSpaceBetween(operator, next)) return operator;
|
|
return null;
|
|
}
|
|
function checkBinary(node) {
|
|
const leftNode = "typeAnnotation" in node.left && node.left.typeAnnotation ? node.left.typeAnnotation : node.left;
|
|
const rightNode = node.right;
|
|
const nonSpacedNode = getFirstNonSpacedToken(leftNode, rightNode, "operator" in node && node.operator ? node.operator : "=");
|
|
if (nonSpacedNode) {
|
|
if (!(int32Hint && sourceCode.getText(node).endsWith("|0"))) report(node, nonSpacedNode);
|
|
}
|
|
}
|
|
function isSpaceChar(token) {
|
|
return token.type === AST_TOKEN_TYPES.Punctuator && /^[=?:]$/.test(token.value);
|
|
}
|
|
function checkAndReportAssignmentSpace(node, leftNode, rightNode) {
|
|
if (!rightNode || !leftNode) return;
|
|
const operator = sourceCode.getFirstTokenBetween(leftNode, rightNode, isSpaceChar);
|
|
const prev = sourceCode.getTokenBefore(operator);
|
|
const next = sourceCode.getTokenAfter(operator);
|
|
if (!sourceCode.isSpaceBetween(prev, operator) || !sourceCode.isSpaceBetween(operator, next)) report(node, operator);
|
|
}
|
|
function checkPropertyAssignment(node) {
|
|
checkAndReportAssignmentSpace(node, node.optional && !node.typeAnnotation ? sourceCode.getTokenAfter(node.key) : node.typeAnnotation ?? node.key, node.value);
|
|
}
|
|
function checkTSBinary(typeAnnotation) {
|
|
typeAnnotation.types.forEach((type) => {
|
|
const skipFunctionParenthesis = type.type === AST_NODE_TYPES.TSFunctionType ? import_ast_utils.isNotOpeningParenToken : 0;
|
|
const operator = sourceCode.getTokenBefore(type, skipFunctionParenthesis);
|
|
if (!ignoreTypes && operator != null && UNIONS.includes(operator.value)) {
|
|
const prev = sourceCode.getTokenBefore(operator);
|
|
const next = sourceCode.getTokenAfter(operator);
|
|
if (!sourceCode.isSpaceBetween(prev, operator) || !sourceCode.isSpaceBetween(operator, next)) report(typeAnnotation, operator);
|
|
}
|
|
});
|
|
}
|
|
return {
|
|
AssignmentExpression: checkBinary,
|
|
AssignmentPattern: checkBinary,
|
|
BinaryExpression: checkBinary,
|
|
LogicalExpression: checkBinary,
|
|
ConditionalExpression(node) {
|
|
checkAndReportAssignmentSpace(node, node.test, node.consequent);
|
|
checkAndReportAssignmentSpace(node, node.consequent, node.alternate);
|
|
},
|
|
VariableDeclarator(node) {
|
|
checkAndReportAssignmentSpace(node, node.id.typeAnnotation ?? node.id, node.init);
|
|
},
|
|
PropertyDefinition: checkPropertyAssignment,
|
|
AccessorProperty: checkPropertyAssignment,
|
|
TSEnumMember(node) {
|
|
checkAndReportAssignmentSpace(node, node.id, node.initializer);
|
|
},
|
|
TSTypeAliasDeclaration(node) {
|
|
checkAndReportAssignmentSpace(node, node.typeParameters ?? node.id, node.typeAnnotation);
|
|
},
|
|
TSUnionType: checkTSBinary,
|
|
TSIntersectionType: checkTSBinary,
|
|
TSConditionalType(node) {
|
|
checkAndReportAssignmentSpace(node, node.extendsType, node.trueType);
|
|
checkAndReportAssignmentSpace(node, node.trueType, node.falseType);
|
|
}
|
|
};
|
|
}
|
|
});
|
|
export { space_infix_ops_default as t };
|