@so1ve/eslint-plugin 0.56.0 → 0.57.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +5 -821
- package/dist/index.d.ts +0 -18
- package/dist/index.mjs +6 -809
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1,369 +1,12 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
const utils = require('@typescript-eslint/utils');
|
|
4
|
-
const reactivity = require('@vue/reactivity');
|
|
5
|
-
const util = require('@typescript-eslint/utils/dist/ast-utils');
|
|
6
|
-
|
|
7
|
-
function _interopNamespaceDefault(e) {
|
|
8
|
-
const n = Object.create(null);
|
|
9
|
-
if (e) {
|
|
10
|
-
for (const k in e) {
|
|
11
|
-
n[k] = e[k];
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
n.default = e;
|
|
15
|
-
return n;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
const util__namespace = /*#__PURE__*/_interopNamespaceDefault(util);
|
|
19
4
|
|
|
20
5
|
const createEslintRule = utils.ESLintUtils.RuleCreator((ruleName) => ruleName);
|
|
21
6
|
|
|
22
|
-
const RULE_NAME$
|
|
23
|
-
const arrayBracketSpacing = createEslintRule({
|
|
24
|
-
name: RULE_NAME$8,
|
|
25
|
-
meta: {
|
|
26
|
-
type: "layout",
|
|
27
|
-
docs: {
|
|
28
|
-
description: "Array bracket spacing",
|
|
29
|
-
recommended: "error"
|
|
30
|
-
},
|
|
31
|
-
fixable: "whitespace",
|
|
32
|
-
schema: [],
|
|
33
|
-
messages: {
|
|
34
|
-
arrayBracketSpacing: "Array bracket spacing mismatch"
|
|
35
|
-
}
|
|
36
|
-
},
|
|
37
|
-
defaultOptions: [],
|
|
38
|
-
create: (context) => {
|
|
39
|
-
const sourceCode = context.getSourceCode();
|
|
40
|
-
const text = sourceCode.getText();
|
|
41
|
-
const checkNode = (node) => {
|
|
42
|
-
const elements = node.type === utils.AST_NODE_TYPES.TSTupleType ? node.elementTypes : node.elements;
|
|
43
|
-
const firstElement = elements[0];
|
|
44
|
-
const lastElement = elements[elements.length - 1];
|
|
45
|
-
if (!firstElement) {
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
|
-
const leftToken = sourceCode.getTokenBefore(firstElement);
|
|
49
|
-
const rightToken = reactivity.ref(sourceCode.getTokenAfter(lastElement));
|
|
50
|
-
if (rightToken.value.value === ",") {
|
|
51
|
-
rightToken.value = sourceCode.getTokenAfter(rightToken.value);
|
|
52
|
-
}
|
|
53
|
-
const textBetweenFirstAndToken = reactivity.computed(() => text.slice(leftToken.range[1], firstElement.range[0]));
|
|
54
|
-
const isNewline = reactivity.computed(() => textBetweenFirstAndToken.value.includes("\n"));
|
|
55
|
-
const textBetweenLastAndToken = reactivity.computed(() => text.slice(lastElement.range[1], rightToken.value.range[0]));
|
|
56
|
-
const hasNewlineAfter = reactivity.computed(() => textBetweenLastAndToken.value.includes("\n"));
|
|
57
|
-
if (sourceCode.isSpaceBetween(leftToken, firstElement) && !isNewline.value) {
|
|
58
|
-
context.report({
|
|
59
|
-
node,
|
|
60
|
-
messageId: "arrayBracketSpacing",
|
|
61
|
-
*fix(fixer) {
|
|
62
|
-
yield fixer.removeRange([leftToken.range[1], firstElement.range[0]]);
|
|
63
|
-
}
|
|
64
|
-
});
|
|
65
|
-
}
|
|
66
|
-
if (sourceCode.isSpaceBetween(lastElement, rightToken.value)) {
|
|
67
|
-
if (!isNewline.value) {
|
|
68
|
-
context.report({
|
|
69
|
-
node,
|
|
70
|
-
messageId: "arrayBracketSpacing",
|
|
71
|
-
*fix(fixer) {
|
|
72
|
-
yield fixer.removeRange([lastElement.range[1], rightToken.value.range[0]]);
|
|
73
|
-
}
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
if (isNewline.value && !hasNewlineAfter.value) {
|
|
78
|
-
context.report({
|
|
79
|
-
node,
|
|
80
|
-
messageId: "arrayBracketSpacing",
|
|
81
|
-
*fix(fixer) {
|
|
82
|
-
yield fixer.replaceTextRange([lastElement.range[1], rightToken.value.range[0]], "\n");
|
|
83
|
-
}
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
};
|
|
87
|
-
return {
|
|
88
|
-
TSTupleType: checkNode,
|
|
89
|
-
ArrayExpression: checkNode
|
|
90
|
-
};
|
|
91
|
-
}
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
const RULE_NAME$7 = "generic-spacing";
|
|
95
|
-
const genericSpacing = createEslintRule({
|
|
96
|
-
name: RULE_NAME$7,
|
|
97
|
-
meta: {
|
|
98
|
-
type: "layout",
|
|
99
|
-
docs: {
|
|
100
|
-
description: "Spaces around generic type parameters",
|
|
101
|
-
recommended: "error"
|
|
102
|
-
},
|
|
103
|
-
fixable: "whitespace",
|
|
104
|
-
schema: [],
|
|
105
|
-
messages: {
|
|
106
|
-
genericSpacingMismatch: "Generic spaces mismatch"
|
|
107
|
-
}
|
|
108
|
-
},
|
|
109
|
-
defaultOptions: [],
|
|
110
|
-
create: (context) => {
|
|
111
|
-
const sourceCode = context.getSourceCode();
|
|
112
|
-
const text = sourceCode.getText();
|
|
113
|
-
return {
|
|
114
|
-
TSTypeParameterDeclaration: (node) => {
|
|
115
|
-
const params = node.params;
|
|
116
|
-
for (const param of params) {
|
|
117
|
-
const leftToken = sourceCode.getTokenBefore(param);
|
|
118
|
-
const rightToken = sourceCode.getTokenAfter(param);
|
|
119
|
-
const hasSpacingBeforeParam = sourceCode.isSpaceBetween(leftToken, param);
|
|
120
|
-
const hasSpacingAfterParam = sourceCode.isSpaceBetween(param, rightToken);
|
|
121
|
-
if (hasSpacingBeforeParam && param.loc.start.line === node.loc.start.line && leftToken.value === "<") {
|
|
122
|
-
context.report({
|
|
123
|
-
node,
|
|
124
|
-
loc: {
|
|
125
|
-
start: {
|
|
126
|
-
line: leftToken.loc.end.line,
|
|
127
|
-
column: leftToken.loc.end.column
|
|
128
|
-
},
|
|
129
|
-
end: {
|
|
130
|
-
line: param.loc.start.line,
|
|
131
|
-
column: param.loc.start.column - 1
|
|
132
|
-
}
|
|
133
|
-
},
|
|
134
|
-
messageId: "genericSpacingMismatch",
|
|
135
|
-
*fix(fixer) {
|
|
136
|
-
yield fixer.removeRange([leftToken.range[1], param.range[0]]);
|
|
137
|
-
}
|
|
138
|
-
});
|
|
139
|
-
}
|
|
140
|
-
if (hasSpacingAfterParam && param.loc.end.line === node.loc.end.line) {
|
|
141
|
-
context.report({
|
|
142
|
-
loc: {
|
|
143
|
-
start: {
|
|
144
|
-
line: param.loc.end.line,
|
|
145
|
-
column: param.loc.end.column
|
|
146
|
-
},
|
|
147
|
-
end: {
|
|
148
|
-
line: rightToken.loc.start.line,
|
|
149
|
-
column: rightToken.loc.start.column
|
|
150
|
-
}
|
|
151
|
-
},
|
|
152
|
-
node,
|
|
153
|
-
messageId: "genericSpacingMismatch",
|
|
154
|
-
*fix(fixer) {
|
|
155
|
-
yield fixer.removeRange([param.range[1], rightToken.range[0]]);
|
|
156
|
-
}
|
|
157
|
-
});
|
|
158
|
-
}
|
|
159
|
-
if (!hasSpacingBeforeParam && util__namespace.isCommaToken(leftToken)) {
|
|
160
|
-
context.report({
|
|
161
|
-
node,
|
|
162
|
-
loc: {
|
|
163
|
-
start: {
|
|
164
|
-
line: leftToken.loc.end.line,
|
|
165
|
-
column: leftToken.loc.end.column
|
|
166
|
-
},
|
|
167
|
-
end: {
|
|
168
|
-
line: param.loc.start.line,
|
|
169
|
-
column: param.loc.start.column - 1
|
|
170
|
-
}
|
|
171
|
-
},
|
|
172
|
-
messageId: "genericSpacingMismatch",
|
|
173
|
-
*fix(fixer) {
|
|
174
|
-
yield fixer.replaceTextRange([leftToken.range[1], param.range[0]], " ");
|
|
175
|
-
}
|
|
176
|
-
});
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
if (!["TSCallSignatureDeclaration", "ArrowFunctionExpression"].includes(node.parent.type)) {
|
|
180
|
-
const leftToken = sourceCode.getTokenBefore(node);
|
|
181
|
-
const hasSpacingBeforeNode = sourceCode.isSpaceBetween(leftToken, node);
|
|
182
|
-
const lastParam = params[params.length - 1];
|
|
183
|
-
const endBracket = sourceCode.getTokenAfter(lastParam);
|
|
184
|
-
const rightToken = sourceCode.getTokenAfter(endBracket, util__namespace.isOpeningParenToken);
|
|
185
|
-
if (!rightToken) {
|
|
186
|
-
return;
|
|
187
|
-
}
|
|
188
|
-
const hasSpacingAfterParam = sourceCode.isSpaceBetween(endBracket, rightToken);
|
|
189
|
-
if (hasSpacingBeforeNode && node.parent.type !== utils.AST_NODE_TYPES.TSFunctionType) {
|
|
190
|
-
context.report({
|
|
191
|
-
node,
|
|
192
|
-
loc: {
|
|
193
|
-
start: {
|
|
194
|
-
line: leftToken.loc.end.line,
|
|
195
|
-
column: leftToken.loc.end.column
|
|
196
|
-
},
|
|
197
|
-
end: {
|
|
198
|
-
line: node.loc.start.line,
|
|
199
|
-
column: node.loc.start.column
|
|
200
|
-
}
|
|
201
|
-
},
|
|
202
|
-
messageId: "genericSpacingMismatch",
|
|
203
|
-
*fix(fixer) {
|
|
204
|
-
yield fixer.removeRange([leftToken.range[1], node.range[0]]);
|
|
205
|
-
}
|
|
206
|
-
});
|
|
207
|
-
}
|
|
208
|
-
if (hasSpacingAfterParam && [utils.AST_NODE_TYPES.TSFunctionType, utils.AST_NODE_TYPES.FunctionDeclaration, utils.AST_NODE_TYPES.FunctionExpression].includes(node.parent.type)) {
|
|
209
|
-
context.report({
|
|
210
|
-
node,
|
|
211
|
-
loc: {
|
|
212
|
-
start: {
|
|
213
|
-
line: endBracket.loc.end.line,
|
|
214
|
-
column: endBracket.loc.end.column
|
|
215
|
-
},
|
|
216
|
-
end: {
|
|
217
|
-
line: rightToken.loc.start.line,
|
|
218
|
-
column: rightToken.loc.start.column
|
|
219
|
-
}
|
|
220
|
-
},
|
|
221
|
-
messageId: "genericSpacingMismatch",
|
|
222
|
-
*fix(fixer) {
|
|
223
|
-
yield fixer.removeRange([endBracket.range[1], rightToken.range[0]]);
|
|
224
|
-
}
|
|
225
|
-
});
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
},
|
|
229
|
-
// add space around = in type Foo<T = true>
|
|
230
|
-
TSTypeParameter: (node) => {
|
|
231
|
-
if (!node.default) {
|
|
232
|
-
return;
|
|
233
|
-
}
|
|
234
|
-
const endNode = node.constraint ?? node.name;
|
|
235
|
-
const from = endNode.range[1];
|
|
236
|
-
const to = node.default.range[0];
|
|
237
|
-
const spaceAndEqual = sourceCode.text.slice(from, to);
|
|
238
|
-
if (spaceAndEqual !== " = ") {
|
|
239
|
-
const preSpace = spaceAndEqual.match(/^(\s*)/)?.[0];
|
|
240
|
-
const postSpace = spaceAndEqual.match(/(\s*)$/)?.[0];
|
|
241
|
-
if (preSpace.length !== 1) {
|
|
242
|
-
context.report({
|
|
243
|
-
*fix(fixer) {
|
|
244
|
-
yield fixer.replaceTextRange([from, from + preSpace.length], " ");
|
|
245
|
-
},
|
|
246
|
-
loc: {
|
|
247
|
-
start: {
|
|
248
|
-
line: node.loc.start.line,
|
|
249
|
-
column: node.loc.start.column + 1
|
|
250
|
-
},
|
|
251
|
-
end: {
|
|
252
|
-
line: node.loc.end.line,
|
|
253
|
-
column: node.loc.end.column - 2 - postSpace.length
|
|
254
|
-
}
|
|
255
|
-
},
|
|
256
|
-
node,
|
|
257
|
-
messageId: "genericSpacingMismatch"
|
|
258
|
-
});
|
|
259
|
-
}
|
|
260
|
-
if (postSpace.length !== 1) {
|
|
261
|
-
context.report({
|
|
262
|
-
*fix(fixer) {
|
|
263
|
-
yield fixer.replaceTextRange([to - postSpace.length, to], " ");
|
|
264
|
-
},
|
|
265
|
-
loc: {
|
|
266
|
-
start: {
|
|
267
|
-
line: node.loc.start.line,
|
|
268
|
-
column: node.loc.start.column + 2 + preSpace.length
|
|
269
|
-
},
|
|
270
|
-
end: {
|
|
271
|
-
line: node.loc.end.line,
|
|
272
|
-
column: node.loc.end.column - 1
|
|
273
|
-
}
|
|
274
|
-
},
|
|
275
|
-
messageId: "genericSpacingMismatch"
|
|
276
|
-
});
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
},
|
|
280
|
-
// type T = Generic< any >
|
|
281
|
-
TSTypeParameterInstantiation: (node) => {
|
|
282
|
-
const params = node.params;
|
|
283
|
-
for (const param of params) {
|
|
284
|
-
const leftToken = sourceCode.getTokenBefore(param);
|
|
285
|
-
const rightToken = sourceCode.getTokenAfter(param);
|
|
286
|
-
const hasSpacingBeforeParam = leftToken.value === "<" ? sourceCode.isSpaceBetween(leftToken, param) : false;
|
|
287
|
-
const hasSpacingAfterParam = rightToken.value === ">" ? sourceCode.isSpaceBetween(param, rightToken) : false;
|
|
288
|
-
if (hasSpacingBeforeParam && leftToken.loc.end.line === param.loc.start.line) {
|
|
289
|
-
context.report({
|
|
290
|
-
node,
|
|
291
|
-
loc: {
|
|
292
|
-
start: {
|
|
293
|
-
line: leftToken.loc.end.line,
|
|
294
|
-
column: leftToken.loc.end.column
|
|
295
|
-
},
|
|
296
|
-
end: {
|
|
297
|
-
line: param.loc.start.line,
|
|
298
|
-
column: param.loc.start.column
|
|
299
|
-
}
|
|
300
|
-
},
|
|
301
|
-
messageId: "genericSpacingMismatch",
|
|
302
|
-
*fix(fixer) {
|
|
303
|
-
yield fixer.removeRange([leftToken.range[1], param.range[0]]);
|
|
304
|
-
}
|
|
305
|
-
});
|
|
306
|
-
}
|
|
307
|
-
if (hasSpacingAfterParam && param.loc.end.line === rightToken.loc.start.line) {
|
|
308
|
-
context.report({
|
|
309
|
-
node,
|
|
310
|
-
loc: {
|
|
311
|
-
start: {
|
|
312
|
-
line: param.loc.end.line,
|
|
313
|
-
column: param.loc.end.column
|
|
314
|
-
},
|
|
315
|
-
end: {
|
|
316
|
-
line: rightToken.loc.start.line,
|
|
317
|
-
column: rightToken.loc.start.column
|
|
318
|
-
}
|
|
319
|
-
},
|
|
320
|
-
messageId: "genericSpacingMismatch",
|
|
321
|
-
*fix(fixer) {
|
|
322
|
-
yield fixer.removeRange([param.range[1], rightToken.range[0]]);
|
|
323
|
-
}
|
|
324
|
-
});
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
},
|
|
328
|
-
// Add spaces before extends
|
|
329
|
-
// interface a {}
|
|
330
|
-
// interface A<B extends 1>extends a {}
|
|
331
|
-
// Fix to: interface A<B extends 1> extends a {}
|
|
332
|
-
TSInterfaceDeclaration: (node) => {
|
|
333
|
-
if (!node.extends || !node.typeParameters) {
|
|
334
|
-
return;
|
|
335
|
-
}
|
|
336
|
-
const { typeParameters } = node;
|
|
337
|
-
const extendsKeywordStart = typeParameters.range[1];
|
|
338
|
-
const extendsKeywordEnd = node.extends[0].range[0];
|
|
339
|
-
const extendsText = text.slice(extendsKeywordStart, extendsKeywordEnd);
|
|
340
|
-
if (!/^\s+/.test(extendsText)) {
|
|
341
|
-
context.report({
|
|
342
|
-
loc: {
|
|
343
|
-
start: {
|
|
344
|
-
line: typeParameters.loc.end.line,
|
|
345
|
-
column: typeParameters.loc.end.column
|
|
346
|
-
},
|
|
347
|
-
end: {
|
|
348
|
-
line: typeParameters.loc.end.line,
|
|
349
|
-
column: typeParameters.loc.end.column + 7
|
|
350
|
-
}
|
|
351
|
-
},
|
|
352
|
-
node,
|
|
353
|
-
messageId: "genericSpacingMismatch",
|
|
354
|
-
*fix(fixer) {
|
|
355
|
-
yield fixer.replaceTextRange([extendsKeywordStart, extendsKeywordEnd - 8], " ");
|
|
356
|
-
}
|
|
357
|
-
});
|
|
358
|
-
}
|
|
359
|
-
}
|
|
360
|
-
};
|
|
361
|
-
}
|
|
362
|
-
});
|
|
363
|
-
|
|
364
|
-
const RULE_NAME$6 = "import-dedupe";
|
|
7
|
+
const RULE_NAME$1 = "import-dedupe";
|
|
365
8
|
const importDedupe = createEslintRule({
|
|
366
|
-
name: RULE_NAME$
|
|
9
|
+
name: RULE_NAME$1,
|
|
367
10
|
meta: {
|
|
368
11
|
type: "problem",
|
|
369
12
|
docs: {
|
|
@@ -411,9 +54,9 @@ const importDedupe = createEslintRule({
|
|
|
411
54
|
}
|
|
412
55
|
});
|
|
413
56
|
|
|
414
|
-
const RULE_NAME
|
|
57
|
+
const RULE_NAME = "no-inline-type-import";
|
|
415
58
|
const noInlineTypeImport = createEslintRule({
|
|
416
|
-
name: RULE_NAME
|
|
59
|
+
name: RULE_NAME,
|
|
417
60
|
meta: {
|
|
418
61
|
type: "layout",
|
|
419
62
|
docs: {
|
|
@@ -463,469 +106,10 @@ import { ${valueSpecifiersText} } from "${node.source.value}";`
|
|
|
463
106
|
}
|
|
464
107
|
});
|
|
465
108
|
|
|
466
|
-
const RULE_NAME$4 = "no-space-before-paren";
|
|
467
|
-
const noSpaceBeforeParen = createEslintRule({
|
|
468
|
-
name: RULE_NAME$4,
|
|
469
|
-
meta: {
|
|
470
|
-
type: "layout",
|
|
471
|
-
docs: {
|
|
472
|
-
description: "Space before paren",
|
|
473
|
-
recommended: "error"
|
|
474
|
-
},
|
|
475
|
-
fixable: "whitespace",
|
|
476
|
-
schema: [],
|
|
477
|
-
messages: {
|
|
478
|
-
noSpaceBeforeParen: "Expected no space before paren"
|
|
479
|
-
}
|
|
480
|
-
},
|
|
481
|
-
defaultOptions: [],
|
|
482
|
-
create: (context) => {
|
|
483
|
-
const sourceCode = context.getSourceCode();
|
|
484
|
-
const text = sourceCode.getText();
|
|
485
|
-
return {
|
|
486
|
-
ImportExpression(node) {
|
|
487
|
-
const sourceRange = node.source.range;
|
|
488
|
-
const parenStart = sourceRange[0] - 1;
|
|
489
|
-
const importEnd = node.range[0] + 6;
|
|
490
|
-
const textBetweenImportAndParenRange = [importEnd, parenStart];
|
|
491
|
-
const textBetweenImportAndParen = text.slice(...textBetweenImportAndParenRange);
|
|
492
|
-
if (textBetweenImportAndParen.length > 0) {
|
|
493
|
-
context.report({
|
|
494
|
-
node,
|
|
495
|
-
messageId: "noSpaceBeforeParen",
|
|
496
|
-
*fix(fixer) {
|
|
497
|
-
yield fixer.removeRange(textBetweenImportAndParenRange);
|
|
498
|
-
}
|
|
499
|
-
});
|
|
500
|
-
}
|
|
501
|
-
},
|
|
502
|
-
CallExpression(node) {
|
|
503
|
-
let caller = "property" in node.callee ? node.callee.property : node.callee;
|
|
504
|
-
if (caller.type === utils.AST_NODE_TYPES.TSInstantiationExpression && "property" in caller.expression) {
|
|
505
|
-
caller = caller.expression.property;
|
|
506
|
-
}
|
|
507
|
-
const callerEnd = reactivity.ref(caller.range[1]);
|
|
508
|
-
const textAfterCaller = reactivity.computed(() => text.slice(callerEnd.value));
|
|
509
|
-
const parenStart = reactivity.ref(callerEnd.value + textAfterCaller.value.indexOf("("));
|
|
510
|
-
const textBetweenFunctionNameAndParenRange = reactivity.computed(
|
|
511
|
-
() => [callerEnd.value, parenStart.value]
|
|
512
|
-
);
|
|
513
|
-
const textBetweenFunctionNameAndParen = reactivity.computed(
|
|
514
|
-
() => text.slice(...textBetweenFunctionNameAndParenRange.value)
|
|
515
|
-
);
|
|
516
|
-
const hasGenerics = reactivity.computed(() => /^\s*</.test(textBetweenFunctionNameAndParen.value));
|
|
517
|
-
const hasIndex = reactivity.computed(() => textBetweenFunctionNameAndParen.value.startsWith("]"));
|
|
518
|
-
if (hasIndex.value) {
|
|
519
|
-
callerEnd.value += 1;
|
|
520
|
-
}
|
|
521
|
-
if (node.optional) {
|
|
522
|
-
parenStart.value = callerEnd.value + textAfterCaller.value.indexOf("(");
|
|
523
|
-
}
|
|
524
|
-
const spaces = /(\s*)$/.exec(textBetweenFunctionNameAndParen.value)[1];
|
|
525
|
-
if (!hasGenerics.value) {
|
|
526
|
-
if (spaces.length > 0 && textBetweenFunctionNameAndParen.value !== "?.") {
|
|
527
|
-
const textBeforeSpaces = textBetweenFunctionNameAndParen.value.slice(
|
|
528
|
-
0,
|
|
529
|
-
textBetweenFunctionNameAndParen.value.length - spaces.length
|
|
530
|
-
);
|
|
531
|
-
context.report({
|
|
532
|
-
node,
|
|
533
|
-
messageId: "noSpaceBeforeParen",
|
|
534
|
-
*fix(fixer) {
|
|
535
|
-
yield fixer.replaceTextRange(
|
|
536
|
-
textBetweenFunctionNameAndParenRange.value,
|
|
537
|
-
textBeforeSpaces + (node.optional ? "?." : "")
|
|
538
|
-
);
|
|
539
|
-
}
|
|
540
|
-
});
|
|
541
|
-
}
|
|
542
|
-
} else {
|
|
543
|
-
const preSpaces = /^(\s*)/.exec(textBetweenFunctionNameAndParen.value)[1];
|
|
544
|
-
const postSpaces = /(\s*)$/.exec(textBetweenFunctionNameAndParen.value)[1];
|
|
545
|
-
const spacesBeforeOptionalMark = /(\s*)\?\./.exec(textBetweenFunctionNameAndParen.value)?.[1] ?? "";
|
|
546
|
-
if (preSpaces.length > 0) {
|
|
547
|
-
context.report({
|
|
548
|
-
node,
|
|
549
|
-
messageId: "noSpaceBeforeParen",
|
|
550
|
-
*fix(fixer) {
|
|
551
|
-
yield fixer.removeRange([callerEnd.value, callerEnd.value + preSpaces.length]);
|
|
552
|
-
}
|
|
553
|
-
});
|
|
554
|
-
}
|
|
555
|
-
if (postSpaces.length > 0) {
|
|
556
|
-
context.report({
|
|
557
|
-
node,
|
|
558
|
-
messageId: "noSpaceBeforeParen",
|
|
559
|
-
*fix(fixer) {
|
|
560
|
-
yield fixer.removeRange([parenStart.value - postSpaces.length, parenStart.value]);
|
|
561
|
-
}
|
|
562
|
-
});
|
|
563
|
-
}
|
|
564
|
-
if (spacesBeforeOptionalMark.length > 0 && !textBetweenFunctionNameAndParen.value.endsWith(" ")) {
|
|
565
|
-
context.report({
|
|
566
|
-
node,
|
|
567
|
-
messageId: "noSpaceBeforeParen",
|
|
568
|
-
*fix(fixer) {
|
|
569
|
-
yield fixer.removeRange([parenStart.value - spacesBeforeOptionalMark.length - 2, parenStart.value - 2]);
|
|
570
|
-
}
|
|
571
|
-
});
|
|
572
|
-
}
|
|
573
|
-
}
|
|
574
|
-
},
|
|
575
|
-
NewExpression(node) {
|
|
576
|
-
const calleeEnd = node.callee.range[1];
|
|
577
|
-
const textAfterCallee = text.slice(calleeEnd);
|
|
578
|
-
const parenStart = calleeEnd + textAfterCallee.indexOf("(");
|
|
579
|
-
const textBetweenCalleeAndParenRange = [calleeEnd, parenStart];
|
|
580
|
-
const textBetweenCalleeAndParen = text.slice(...textBetweenCalleeAndParenRange);
|
|
581
|
-
const hasGenerics = /^\s*</.test(textBetweenCalleeAndParen);
|
|
582
|
-
if (!hasGenerics && textBetweenCalleeAndParen.length > 0) {
|
|
583
|
-
context.report({
|
|
584
|
-
node,
|
|
585
|
-
messageId: "noSpaceBeforeParen",
|
|
586
|
-
*fix(fixer) {
|
|
587
|
-
yield fixer.removeRange(textBetweenCalleeAndParenRange);
|
|
588
|
-
}
|
|
589
|
-
});
|
|
590
|
-
} else if (hasGenerics) {
|
|
591
|
-
const preSpaces = /^(\s*)/.exec(textBetweenCalleeAndParen)[1];
|
|
592
|
-
const postSpaces = /(\s*)$/.exec(textBetweenCalleeAndParen)[1];
|
|
593
|
-
if (preSpaces.length > 0) {
|
|
594
|
-
context.report({
|
|
595
|
-
node,
|
|
596
|
-
messageId: "noSpaceBeforeParen",
|
|
597
|
-
*fix(fixer) {
|
|
598
|
-
yield fixer.removeRange([calleeEnd, calleeEnd + preSpaces.length]);
|
|
599
|
-
}
|
|
600
|
-
});
|
|
601
|
-
}
|
|
602
|
-
if (postSpaces.length > 0) {
|
|
603
|
-
context.report({
|
|
604
|
-
node,
|
|
605
|
-
messageId: "noSpaceBeforeParen",
|
|
606
|
-
*fix(fixer) {
|
|
607
|
-
yield fixer.removeRange([parenStart - postSpaces.length, parenStart]);
|
|
608
|
-
}
|
|
609
|
-
});
|
|
610
|
-
}
|
|
611
|
-
}
|
|
612
|
-
}
|
|
613
|
-
};
|
|
614
|
-
}
|
|
615
|
-
});
|
|
616
|
-
|
|
617
|
-
const RULE_NAME$3 = "semi-spacing";
|
|
618
|
-
const semiSpacing = createEslintRule({
|
|
619
|
-
name: RULE_NAME$3,
|
|
620
|
-
meta: {
|
|
621
|
-
type: "layout",
|
|
622
|
-
docs: {
|
|
623
|
-
description: "Semicolon spacing in types",
|
|
624
|
-
recommended: "error"
|
|
625
|
-
},
|
|
626
|
-
fixable: "whitespace",
|
|
627
|
-
schema: [],
|
|
628
|
-
messages: {
|
|
629
|
-
noSpaceBeforeSemi: "Expected no space before semicolon"
|
|
630
|
-
}
|
|
631
|
-
},
|
|
632
|
-
defaultOptions: [],
|
|
633
|
-
create: (context) => {
|
|
634
|
-
const sourceCode = context.getSourceCode();
|
|
635
|
-
return {
|
|
636
|
-
TSTypeAliasDeclaration(node) {
|
|
637
|
-
const leftToken = node.typeAnnotation;
|
|
638
|
-
const rightToken = sourceCode.getTokenAfter(node.typeAnnotation);
|
|
639
|
-
if (!rightToken || rightToken.type !== utils.AST_TOKEN_TYPES.Punctuator || rightToken.value !== ";") {
|
|
640
|
-
return;
|
|
641
|
-
}
|
|
642
|
-
const hasSpacing = sourceCode.isSpaceBetween(leftToken, rightToken);
|
|
643
|
-
if (hasSpacing) {
|
|
644
|
-
context.report({
|
|
645
|
-
loc: {
|
|
646
|
-
start: {
|
|
647
|
-
line: leftToken.loc.end.line,
|
|
648
|
-
column: leftToken.loc.end.column
|
|
649
|
-
},
|
|
650
|
-
end: {
|
|
651
|
-
line: rightToken.loc.start.line,
|
|
652
|
-
column: rightToken.loc.start.column
|
|
653
|
-
}
|
|
654
|
-
},
|
|
655
|
-
node,
|
|
656
|
-
messageId: "noSpaceBeforeSemi",
|
|
657
|
-
*fix(fixer) {
|
|
658
|
-
yield fixer.removeRange([leftToken.range[1], rightToken.range[0]]);
|
|
659
|
-
}
|
|
660
|
-
});
|
|
661
|
-
}
|
|
662
|
-
}
|
|
663
|
-
};
|
|
664
|
-
}
|
|
665
|
-
});
|
|
666
|
-
|
|
667
|
-
const RULE_NAME$2 = "space-before-function-paren";
|
|
668
|
-
const spaceBeforeFunctionParen = createEslintRule({
|
|
669
|
-
name: RULE_NAME$2,
|
|
670
|
-
meta: {
|
|
671
|
-
type: "layout",
|
|
672
|
-
docs: {
|
|
673
|
-
description: "Enforce consistent spacing before function parenthesis",
|
|
674
|
-
recommended: false,
|
|
675
|
-
extendsBaseRule: true
|
|
676
|
-
},
|
|
677
|
-
fixable: "whitespace",
|
|
678
|
-
schema: [
|
|
679
|
-
{
|
|
680
|
-
oneOf: [
|
|
681
|
-
{
|
|
682
|
-
enum: ["always", "never"]
|
|
683
|
-
},
|
|
684
|
-
{
|
|
685
|
-
type: "object",
|
|
686
|
-
properties: {
|
|
687
|
-
anonymous: {
|
|
688
|
-
enum: ["always", "never", "ignore"]
|
|
689
|
-
},
|
|
690
|
-
named: {
|
|
691
|
-
enum: ["always", "never", "ignore"]
|
|
692
|
-
},
|
|
693
|
-
asyncArrow: {
|
|
694
|
-
enum: ["always", "never", "ignore"]
|
|
695
|
-
}
|
|
696
|
-
},
|
|
697
|
-
additionalProperties: false
|
|
698
|
-
}
|
|
699
|
-
]
|
|
700
|
-
}
|
|
701
|
-
],
|
|
702
|
-
messages: {
|
|
703
|
-
unexpected: "Unexpected space before function parentheses.",
|
|
704
|
-
missing: "Missing space before function parentheses."
|
|
705
|
-
}
|
|
706
|
-
},
|
|
707
|
-
defaultOptions: ["always"],
|
|
708
|
-
create(context, [firstOption]) {
|
|
709
|
-
const sourceCode = context.getSourceCode();
|
|
710
|
-
const baseConfig = typeof firstOption === "string" ? firstOption : "always";
|
|
711
|
-
const overrideConfig = typeof firstOption === "object" ? firstOption : {};
|
|
712
|
-
function isNamedFunction(node) {
|
|
713
|
-
if (node.id != null) {
|
|
714
|
-
return true;
|
|
715
|
-
}
|
|
716
|
-
const parent = node.parent;
|
|
717
|
-
return parent.type === utils.AST_NODE_TYPES.MethodDefinition || parent.type === utils.AST_NODE_TYPES.TSAbstractMethodDefinition || parent.type === utils.AST_NODE_TYPES.Property && (parent.kind === "get" || parent.kind === "set" || parent.method);
|
|
718
|
-
}
|
|
719
|
-
function getConfigForFunction(node) {
|
|
720
|
-
if (node.type === utils.AST_NODE_TYPES.ArrowFunctionExpression) {
|
|
721
|
-
if (node.async && util__namespace.isOpeningParenToken(sourceCode.getFirstToken(node, { skip: 1 }))) {
|
|
722
|
-
return overrideConfig.asyncArrow ?? baseConfig;
|
|
723
|
-
}
|
|
724
|
-
} else if (isNamedFunction(node)) {
|
|
725
|
-
return overrideConfig.named ?? baseConfig;
|
|
726
|
-
} else if (!node.generator) {
|
|
727
|
-
return overrideConfig.anonymous ?? baseConfig;
|
|
728
|
-
}
|
|
729
|
-
return "ignore";
|
|
730
|
-
}
|
|
731
|
-
function checkFunction(node) {
|
|
732
|
-
const functionConfig = getConfigForFunction(node);
|
|
733
|
-
if (functionConfig === "ignore") {
|
|
734
|
-
return;
|
|
735
|
-
}
|
|
736
|
-
let leftToken, rightToken;
|
|
737
|
-
if (node.typeParameters) {
|
|
738
|
-
leftToken = sourceCode.getLastToken(node.typeParameters);
|
|
739
|
-
rightToken = sourceCode.getTokenAfter(leftToken);
|
|
740
|
-
} else {
|
|
741
|
-
rightToken = sourceCode.getFirstToken(node, util__namespace.isOpeningParenToken);
|
|
742
|
-
leftToken = sourceCode.getTokenBefore(rightToken);
|
|
743
|
-
}
|
|
744
|
-
const hasSpacing = sourceCode.isSpaceBetween(leftToken, rightToken);
|
|
745
|
-
if (hasSpacing && functionConfig === "never") {
|
|
746
|
-
context.report({
|
|
747
|
-
node,
|
|
748
|
-
loc: {
|
|
749
|
-
start: leftToken.loc.end,
|
|
750
|
-
end: rightToken.loc.start
|
|
751
|
-
},
|
|
752
|
-
messageId: "unexpected",
|
|
753
|
-
fix: (fixer) => fixer.removeRange([leftToken.range[1], rightToken.range[0]])
|
|
754
|
-
});
|
|
755
|
-
} else if (!hasSpacing && functionConfig === "always" && !node.typeParameters) {
|
|
756
|
-
context.report({
|
|
757
|
-
node,
|
|
758
|
-
loc: rightToken.loc,
|
|
759
|
-
messageId: "missing",
|
|
760
|
-
fix: (fixer) => fixer.insertTextAfter(leftToken, " ")
|
|
761
|
-
});
|
|
762
|
-
}
|
|
763
|
-
}
|
|
764
|
-
return {
|
|
765
|
-
ArrowFunctionExpression: checkFunction,
|
|
766
|
-
FunctionDeclaration: checkFunction,
|
|
767
|
-
FunctionExpression: checkFunction,
|
|
768
|
-
TSEmptyBodyFunctionExpression: checkFunction,
|
|
769
|
-
TSDeclareFunction: checkFunction
|
|
770
|
-
};
|
|
771
|
-
}
|
|
772
|
-
});
|
|
773
|
-
|
|
774
|
-
const operatorOrAnyBracketOrKeywordRE = /^(\||&|\*|\+|\-|\/|%|<|>|<=|>=|==|!=|===|!==|\[|\(|\{|as|extends|implements|keyof|new|readonly|typeof|unique|unknown)/;
|
|
775
|
-
const RULE_NAME$1 = "space-between-generic-and-paren";
|
|
776
|
-
const spaceBetweenGenericAndParen = createEslintRule({
|
|
777
|
-
name: RULE_NAME$1,
|
|
778
|
-
meta: {
|
|
779
|
-
type: "layout",
|
|
780
|
-
docs: {
|
|
781
|
-
description: "Spaces between generic type parameters and paren",
|
|
782
|
-
recommended: "error"
|
|
783
|
-
},
|
|
784
|
-
fixable: "whitespace",
|
|
785
|
-
schema: [],
|
|
786
|
-
messages: {
|
|
787
|
-
noSpaceBetweenGenericAndParen: "Expected no space between generic type parameters and paren"
|
|
788
|
-
}
|
|
789
|
-
},
|
|
790
|
-
defaultOptions: [],
|
|
791
|
-
create: (context) => {
|
|
792
|
-
const sourceCode = context.getSourceCode();
|
|
793
|
-
const text = sourceCode.text;
|
|
794
|
-
return {
|
|
795
|
-
TSTypeParameter: (node) => {
|
|
796
|
-
const spaceStartRange = node.range[1] + 1;
|
|
797
|
-
const post = text.slice(spaceStartRange);
|
|
798
|
-
const postSpace = post.match(/^(\s*)/)?.[0];
|
|
799
|
-
const postEqual = post.slice(postSpace.length).match(/^(=)/)?.[0];
|
|
800
|
-
const postComma = text.slice(node.range[1]).match(/^(,)/)?.[0];
|
|
801
|
-
const postQuestionMark = text.slice(spaceStartRange + postSpace.length).match(/^(\?)/)?.[0];
|
|
802
|
-
const postOperatorOrAnyBracketOrKeyword = text.slice(spaceStartRange + postSpace.length).match(operatorOrAnyBracketOrKeywordRE)?.[0];
|
|
803
|
-
if (postSpace?.length && !postEqual && !postComma && !postQuestionMark && !postOperatorOrAnyBracketOrKeyword && node.parent.type !== utils.AST_NODE_TYPES.TSInferType) {
|
|
804
|
-
context.report({
|
|
805
|
-
loc: {
|
|
806
|
-
start: {
|
|
807
|
-
line: node.loc.end.line,
|
|
808
|
-
column: node.loc.end.column + 1
|
|
809
|
-
},
|
|
810
|
-
end: {
|
|
811
|
-
line: node.loc.end.line,
|
|
812
|
-
column: node.loc.end.column + 1 + postSpace.length
|
|
813
|
-
}
|
|
814
|
-
},
|
|
815
|
-
node,
|
|
816
|
-
messageId: "noSpaceBetweenGenericAndParen",
|
|
817
|
-
*fix(fixer) {
|
|
818
|
-
yield fixer.replaceTextRange([spaceStartRange, spaceStartRange + postSpace.length], "");
|
|
819
|
-
}
|
|
820
|
-
});
|
|
821
|
-
}
|
|
822
|
-
if (node.parent?.parent.type === utils.AST_NODE_TYPES.FunctionDeclaration) {
|
|
823
|
-
const spaceEndRange = node.range[0] - 1;
|
|
824
|
-
const pre = sourceCode.text.slice(0, spaceEndRange);
|
|
825
|
-
const preSpace = pre.match(/(\s+)$/)?.[0];
|
|
826
|
-
if (preSpace?.length) {
|
|
827
|
-
context.report({
|
|
828
|
-
loc: {
|
|
829
|
-
start: {
|
|
830
|
-
line: node.loc.start.line,
|
|
831
|
-
column: node.loc.start.column - preSpace.length
|
|
832
|
-
},
|
|
833
|
-
end: {
|
|
834
|
-
line: node.loc.start.line,
|
|
835
|
-
column: node.loc.start.column - 1
|
|
836
|
-
}
|
|
837
|
-
},
|
|
838
|
-
node,
|
|
839
|
-
messageId: "noSpaceBetweenGenericAndParen",
|
|
840
|
-
*fix(fixer) {
|
|
841
|
-
yield fixer.replaceTextRange([spaceEndRange - preSpace.length, spaceEndRange], "");
|
|
842
|
-
}
|
|
843
|
-
});
|
|
844
|
-
}
|
|
845
|
-
}
|
|
846
|
-
}
|
|
847
|
-
};
|
|
848
|
-
}
|
|
849
|
-
});
|
|
850
|
-
|
|
851
|
-
const RULE_NAME = "space-in-empty-block";
|
|
852
|
-
const spaceInEmptyBlock = createEslintRule({
|
|
853
|
-
name: RULE_NAME,
|
|
854
|
-
meta: {
|
|
855
|
-
type: "layout",
|
|
856
|
-
docs: {
|
|
857
|
-
description: "Disallow spaces in empty block",
|
|
858
|
-
recommended: "error"
|
|
859
|
-
},
|
|
860
|
-
fixable: "whitespace",
|
|
861
|
-
schema: [],
|
|
862
|
-
messages: {
|
|
863
|
-
noSpaceInEmptyBlock: "Expected no space in empty block"
|
|
864
|
-
}
|
|
865
|
-
},
|
|
866
|
-
defaultOptions: [],
|
|
867
|
-
create: (context) => {
|
|
868
|
-
const sourceCode = context.getSourceCode();
|
|
869
|
-
return {
|
|
870
|
-
BlockStatement: (node) => {
|
|
871
|
-
if (node.body.length || sourceCode.getCommentsInside(node).length) {
|
|
872
|
-
return;
|
|
873
|
-
}
|
|
874
|
-
const spaceStartRange = node.range[1] - 2;
|
|
875
|
-
const post = sourceCode.text.slice(spaceStartRange);
|
|
876
|
-
const postSpace = post.match(/^(\s*)/)?.[0];
|
|
877
|
-
if (postSpace?.length) {
|
|
878
|
-
context.report({
|
|
879
|
-
loc: {
|
|
880
|
-
start: node.loc.start,
|
|
881
|
-
end: {
|
|
882
|
-
line: node.loc.end.line,
|
|
883
|
-
column: node.loc.end.column - 1 + postSpace.length
|
|
884
|
-
}
|
|
885
|
-
},
|
|
886
|
-
messageId: "noSpaceInEmptyBlock",
|
|
887
|
-
*fix(fixer) {
|
|
888
|
-
yield fixer.replaceTextRange([node.range[0] + 1, spaceStartRange + postSpace.length], "");
|
|
889
|
-
}
|
|
890
|
-
});
|
|
891
|
-
}
|
|
892
|
-
const spaceEndRange = node.range[0] + 1;
|
|
893
|
-
const pre = sourceCode.text.slice(0, spaceEndRange);
|
|
894
|
-
const preSpace = pre.match(/(\s+)$/)?.[0];
|
|
895
|
-
if (preSpace?.length) {
|
|
896
|
-
context.report({
|
|
897
|
-
loc: {
|
|
898
|
-
start: {
|
|
899
|
-
line: node.loc.start.line,
|
|
900
|
-
column: node.loc.start.column - preSpace.length
|
|
901
|
-
},
|
|
902
|
-
end: {
|
|
903
|
-
line: node.loc.start.line,
|
|
904
|
-
column: node.loc.start.column
|
|
905
|
-
}
|
|
906
|
-
},
|
|
907
|
-
messageId: "noSpaceInEmptyBlock",
|
|
908
|
-
*fix(fixer) {
|
|
909
|
-
yield fixer.replaceTextRange([spaceEndRange - preSpace.length, spaceEndRange], "");
|
|
910
|
-
}
|
|
911
|
-
});
|
|
912
|
-
}
|
|
913
|
-
}
|
|
914
|
-
};
|
|
915
|
-
}
|
|
916
|
-
});
|
|
917
|
-
|
|
918
109
|
const index = {
|
|
919
110
|
rules: {
|
|
920
111
|
"import-dedupe": importDedupe,
|
|
921
|
-
"
|
|
922
|
-
"space-between-generic-and-paren": spaceBetweenGenericAndParen,
|
|
923
|
-
"space-in-empty-block": spaceInEmptyBlock,
|
|
924
|
-
"semi-spacing": semiSpacing,
|
|
925
|
-
"no-inline-type-import": noInlineTypeImport,
|
|
926
|
-
"no-space-before-paren": noSpaceBeforeParen,
|
|
927
|
-
"space-before-function-paren": spaceBeforeFunctionParen,
|
|
928
|
-
"array-bracket-spacing": arrayBracketSpacing
|
|
112
|
+
"no-inline-type-import": noInlineTypeImport
|
|
929
113
|
}
|
|
930
114
|
};
|
|
931
115
|
|