UNPKG

6.54 kBJavaScriptView Raw
1"use strict";
2var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3 if (k2 === undefined) k2 = k;
4 Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5}) : (function(o, m, k, k2) {
6 if (k2 === undefined) k2 = k;
7 o[k2] = m[k];
8}));
9var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10 Object.defineProperty(o, "default", { enumerable: true, value: v });
11}) : function(o, v) {
12 o["default"] = v;
13});
14var __importStar = (this && this.__importStar) || function (mod) {
15 if (mod && mod.__esModule) return mod;
16 var result = {};
17 if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18 __setModuleDefault(result, mod);
19 return result;
20};
21Object.defineProperty(exports, "__esModule", { value: true });
22const utils_1 = require("@typescript-eslint/utils");
23const getESLintCoreRule_1 = require("../util/getESLintCoreRule");
24const util = __importStar(require("../util"));
25const baseRule = (0, getESLintCoreRule_1.getESLintCoreRule)('space-infix-ops');
26const UNIONS = ['|', '&'];
27exports.default = util.createRule({
28 name: 'space-infix-ops',
29 meta: {
30 type: 'layout',
31 docs: {
32 description: 'This rule is aimed at ensuring there are spaces around infix operators.',
33 recommended: false,
34 extendsBaseRule: true,
35 },
36 fixable: baseRule.meta.fixable,
37 hasSuggestions: baseRule.meta.hasSuggestions,
38 schema: baseRule.meta.schema,
39 messages: Object.assign({
40 // @ts-expect-error -- we report on this messageId so we need to ensure it's there in case ESLint changes in future
41 missingSpace: "Operator '{{operator}}' must be spaced." }, baseRule.meta.messages),
42 },
43 defaultOptions: [
44 {
45 int32Hint: false,
46 },
47 ],
48 create(context) {
49 const rules = baseRule.create(context);
50 const sourceCode = context.getSourceCode();
51 const report = (node, operator) => {
52 context.report({
53 node: node,
54 loc: operator.loc,
55 messageId: 'missingSpace',
56 data: {
57 operator: operator.value,
58 },
59 fix(fixer) {
60 const previousToken = sourceCode.getTokenBefore(operator);
61 const afterToken = sourceCode.getTokenAfter(operator);
62 let fixString = '';
63 if (operator.range[0] - previousToken.range[1] === 0) {
64 fixString = ' ';
65 }
66 fixString += operator.value;
67 if (afterToken.range[0] - operator.range[1] === 0) {
68 fixString += ' ';
69 }
70 return fixer.replaceText(operator, fixString);
71 },
72 });
73 };
74 function isSpaceChar(token) {
75 return token.type === utils_1.AST_TOKEN_TYPES.Punctuator && token.value === '=';
76 }
77 function checkAndReportAssignmentSpace(node, leftNode, rightNode) {
78 if (!rightNode) {
79 return;
80 }
81 const operator = sourceCode.getFirstTokenBetween(leftNode, rightNode, isSpaceChar);
82 const prev = sourceCode.getTokenBefore(operator);
83 const next = sourceCode.getTokenAfter(operator);
84 if (!sourceCode.isSpaceBetween(prev, operator) ||
85 !sourceCode.isSpaceBetween(operator, next)) {
86 report(node, operator);
87 }
88 }
89 /**
90 * Check if it has an assignment char and report if it's faulty
91 * @param node The node to report
92 */
93 function checkForEnumAssignmentSpace(node) {
94 if (!node.initializer) {
95 return;
96 }
97 const leftNode = sourceCode.getTokenByRangeStart(node.id.range[0]);
98 const rightNode = sourceCode.getTokenByRangeStart(node.initializer.range[0]);
99 checkAndReportAssignmentSpace(node, leftNode, rightNode);
100 }
101 /**
102 * Check if it has an assignment char and report if it's faulty
103 * @param node The node to report
104 */
105 function checkForPropertyDefinitionAssignmentSpace(node) {
106 var _a, _b;
107 const leftNode = sourceCode.getTokenByRangeStart((_b = (_a = node.typeAnnotation) === null || _a === void 0 ? void 0 : _a.range[0]) !== null && _b !== void 0 ? _b : node.range[0]);
108 const rightNode = node.value
109 ? sourceCode.getTokenByRangeStart(node.value.range[0])
110 : undefined;
111 checkAndReportAssignmentSpace(node, leftNode, rightNode);
112 }
113 /**
114 * Check if it is missing spaces between type annotations chaining
115 * @param typeAnnotation TypeAnnotations list
116 */
117 function checkForTypeAnnotationSpace(typeAnnotation) {
118 const types = typeAnnotation.types;
119 types.forEach(type => {
120 const operator = sourceCode.getTokenBefore(type);
121 if (operator != null && UNIONS.includes(operator.value)) {
122 const prev = sourceCode.getTokenBefore(operator);
123 const next = sourceCode.getTokenAfter(operator);
124 if (!sourceCode.isSpaceBetween(prev, operator) ||
125 !sourceCode.isSpaceBetween(operator, next)) {
126 report(typeAnnotation, operator);
127 }
128 }
129 });
130 }
131 /**
132 * Check if it has an assignment char and report if it's faulty
133 * @param node The node to report
134 */
135 function checkForTypeAliasAssignment(node) {
136 const leftNode = sourceCode.getTokenByRangeStart(node.id.range[0]);
137 const rightNode = sourceCode.getTokenByRangeStart(node.typeAnnotation.range[0]);
138 checkAndReportAssignmentSpace(node, leftNode, rightNode);
139 }
140 return Object.assign(Object.assign({}, rules), { TSEnumMember: checkForEnumAssignmentSpace, PropertyDefinition: checkForPropertyDefinitionAssignmentSpace, TSTypeAliasDeclaration: checkForTypeAliasAssignment, TSUnionType: checkForTypeAnnotationSpace, TSIntersectionType: checkForTypeAnnotationSpace });
141 },
142});
143//# sourceMappingURL=space-infix-ops.js.map
\No newline at end of file