@so1ve/eslint-plugin 0.36.1 → 0.37.1

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 CHANGED
@@ -4,16 +4,16 @@ const utils = require('@typescript-eslint/utils');
4
4
 
5
5
  const createEslintRule = utils.ESLintUtils.RuleCreator((ruleName) => ruleName);
6
6
 
7
- const RULE_NAME$5 = "generic-spacing";
7
+ const RULE_NAME$6 = "generic-spacing";
8
8
  const genericSpacing = createEslintRule({
9
- name: RULE_NAME$5,
9
+ name: RULE_NAME$6,
10
10
  meta: {
11
- type: "suggestion",
11
+ type: "layout",
12
12
  docs: {
13
13
  description: "Spaces around generic type parameters",
14
14
  recommended: "error"
15
15
  },
16
- fixable: "code",
16
+ fixable: "whitespace",
17
17
  schema: [],
18
18
  messages: {
19
19
  genericSpacingMismatch: "Generic spaces mismatch"
@@ -22,6 +22,7 @@ const genericSpacing = createEslintRule({
22
22
  defaultOptions: [],
23
23
  create: (context) => {
24
24
  const sourceCode = context.getSourceCode();
25
+ const text = sourceCode.getText();
25
26
  return {
26
27
  TSTypeParameterDeclaration: (node) => {
27
28
  const params = node.params;
@@ -37,12 +38,12 @@ const genericSpacing = createEslintRule({
37
38
  node,
38
39
  loc: {
39
40
  start: {
40
- line: param.loc.end.line,
41
- column: param.loc.end.column - 1 - preSpace.length
41
+ line: param.loc.start.line,
42
+ column: param.loc.start.column + 1 - preSpace.length
42
43
  },
43
44
  end: {
44
- line: param.loc.end.line,
45
- column: param.loc.end.column - 1
45
+ line: param.loc.start.line,
46
+ column: param.loc.start.column - 1
46
47
  }
47
48
  },
48
49
  messageId: "genericSpacingMismatch",
@@ -165,14 +166,91 @@ const genericSpacing = createEslintRule({
165
166
  });
166
167
  }
167
168
  }
169
+ },
170
+ TSTypeParameterInstantiation: (node) => {
171
+ const params = node.params;
172
+ for (let i = 0; i < params.length; i++) {
173
+ const param = params[i];
174
+ const pre = sourceCode.text.slice(0, param.range[0]);
175
+ const preSpace = pre.match(/(\s+)$/)?.[0];
176
+ const preComma = pre.match(/(,)\s+$/)?.[0];
177
+ const post = sourceCode.text.slice(param.range[1]);
178
+ const postSpace = post.match(/^(\s*)/)?.[0];
179
+ if (preSpace && preSpace.length && !preComma) {
180
+ context.report({
181
+ node,
182
+ loc: {
183
+ start: {
184
+ line: param.loc.start.line,
185
+ column: param.loc.start.column + 1 - preSpace.length
186
+ },
187
+ end: {
188
+ line: param.loc.start.line,
189
+ column: param.loc.start.column - 1
190
+ }
191
+ },
192
+ messageId: "genericSpacingMismatch",
193
+ *fix(fixer) {
194
+ yield fixer.replaceTextRange([param.range[0] - preSpace.length, param.range[0]], "");
195
+ }
196
+ });
197
+ }
198
+ if (postSpace && postSpace.length) {
199
+ context.report({
200
+ loc: {
201
+ start: {
202
+ line: param.loc.end.line,
203
+ column: param.loc.end.column
204
+ },
205
+ end: {
206
+ line: param.loc.end.line,
207
+ column: param.loc.end.column + postSpace.length
208
+ }
209
+ },
210
+ node,
211
+ messageId: "genericSpacingMismatch",
212
+ *fix(fixer) {
213
+ yield fixer.replaceTextRange([param.range[1], param.range[1] + postSpace.length], "");
214
+ }
215
+ });
216
+ }
217
+ }
218
+ },
219
+ TSInterfaceDeclaration: (node) => {
220
+ if (!node.extends || !node.typeParameters) {
221
+ return;
222
+ }
223
+ const { typeParameters } = node;
224
+ const extendsKeywordStart = typeParameters.range[1];
225
+ const extendsKeywordEnd = node.extends[0].range[0];
226
+ const extendsText = text.slice(extendsKeywordStart, extendsKeywordEnd);
227
+ if (!/^\s+/.test(extendsText)) {
228
+ context.report({
229
+ loc: {
230
+ start: {
231
+ line: typeParameters.loc.end.line,
232
+ column: typeParameters.loc.end.column
233
+ },
234
+ end: {
235
+ line: typeParameters.loc.end.line,
236
+ column: typeParameters.loc.end.column + 7
237
+ }
238
+ },
239
+ node,
240
+ messageId: "genericSpacingMismatch",
241
+ *fix(fixer) {
242
+ yield fixer.replaceTextRange([extendsKeywordStart, extendsKeywordEnd - 8], " ");
243
+ }
244
+ });
245
+ }
168
246
  }
169
247
  };
170
248
  }
171
249
  });
172
250
 
173
- const RULE_NAME$4 = "import-dedupe";
251
+ const RULE_NAME$5 = "import-dedupe";
174
252
  const importDedupe = createEslintRule({
175
- name: RULE_NAME$4,
253
+ name: RULE_NAME$5,
176
254
  meta: {
177
255
  type: "problem",
178
256
  docs: {
@@ -220,16 +298,16 @@ const importDedupe = createEslintRule({
220
298
  }
221
299
  });
222
300
 
223
- const RULE_NAME$3 = "space-between-generic-and-paren";
301
+ const RULE_NAME$4 = "space-between-generic-and-paren";
224
302
  const spaceBetweenGenericAndParen = createEslintRule({
225
- name: RULE_NAME$3,
303
+ name: RULE_NAME$4,
226
304
  meta: {
227
- type: "suggestion",
305
+ type: "layout",
228
306
  docs: {
229
307
  description: "Spaces between generic type parameters and paren",
230
308
  recommended: "error"
231
309
  },
232
- fixable: "code",
310
+ fixable: "whitespace",
233
311
  schema: [],
234
312
  messages: {
235
313
  noSpaceBetweenGenericAndParen: "Expected no space between generic type parameters and paren"
@@ -296,16 +374,16 @@ const spaceBetweenGenericAndParen = createEslintRule({
296
374
  }
297
375
  });
298
376
 
299
- const RULE_NAME$2 = "space-in-empty-block";
377
+ const RULE_NAME$3 = "space-in-empty-block";
300
378
  const spaceInEmptyBlock = createEslintRule({
301
- name: RULE_NAME$2,
379
+ name: RULE_NAME$3,
302
380
  meta: {
303
- type: "suggestion",
381
+ type: "layout",
304
382
  docs: {
305
383
  description: "Disallow spaces in empty block",
306
384
  recommended: "error"
307
385
  },
308
- fixable: "code",
386
+ fixable: "whitespace",
309
387
  schema: [],
310
388
  messages: {
311
389
  noSpaceInEmptyBlock: "Expected no space in empty block"
@@ -316,7 +394,7 @@ const spaceInEmptyBlock = createEslintRule({
316
394
  const sourceCode = context.getSourceCode();
317
395
  return {
318
396
  BlockStatement: (node) => {
319
- if (node.body.length) {
397
+ if (node.body.length || sourceCode.getCommentsInside(node).length) {
320
398
  return;
321
399
  }
322
400
  const spaceStartRange = node.range[1] - 2;
@@ -363,16 +441,16 @@ const spaceInEmptyBlock = createEslintRule({
363
441
  }
364
442
  });
365
443
 
366
- const RULE_NAME$1 = "semi-spacing";
444
+ const RULE_NAME$2 = "semi-spacing";
367
445
  const semiSpacing = createEslintRule({
368
- name: RULE_NAME$1,
446
+ name: RULE_NAME$2,
369
447
  meta: {
370
- type: "suggestion",
448
+ type: "layout",
371
449
  docs: {
372
450
  description: "Semicolon spacing",
373
451
  recommended: "error"
374
452
  },
375
- fixable: "code",
453
+ fixable: "whitespace",
376
454
  schema: [],
377
455
  messages: {
378
456
  noSpaceBeforeSemi: "Expected no space before semicolon"
@@ -412,11 +490,11 @@ const semiSpacing = createEslintRule({
412
490
  }
413
491
  });
414
492
 
415
- const RULE_NAME = "no-inline-type-import";
493
+ const RULE_NAME$1 = "no-inline-type-import";
416
494
  const noInlineTypeImport = createEslintRule({
417
- name: RULE_NAME,
495
+ name: RULE_NAME$1,
418
496
  meta: {
419
- type: "suggestion",
497
+ type: "layout",
420
498
  docs: {
421
499
  description: "Disallow inline type import",
422
500
  recommended: "error"
@@ -461,6 +539,131 @@ import { ${valueSpecifiersText} } from "${node.source.value}";`);
461
539
  }
462
540
  });
463
541
 
542
+ const RULE_NAME = "space-before-function-paren";
543
+ const spaceBeforeFunctionParen = createEslintRule({
544
+ name: RULE_NAME,
545
+ meta: {
546
+ type: "layout",
547
+ docs: {
548
+ description: "Enforce consistent spacing before function parenthesis",
549
+ recommended: "error",
550
+ extendsBaseRule: true
551
+ },
552
+ fixable: "whitespace",
553
+ schema: [],
554
+ messages: {
555
+ spaceBeforeFunctionParenMismatch: "Space before function paren mismatch"
556
+ }
557
+ },
558
+ defaultOptions: [],
559
+ create: (context) => {
560
+ const sourceCode = context.getSourceCode();
561
+ return {
562
+ FunctionDeclaration: (node) => {
563
+ console.log(node);
564
+ const pre = sourceCode.text.slice(0, node.range[0]);
565
+ const preSpace = pre.match(/(\s+)$/)?.[0];
566
+ if (!preSpace || !preSpace.length) {
567
+ context.report({
568
+ node,
569
+ loc: {
570
+ start: node.loc.start,
571
+ end: {
572
+ line: node.loc.start.line,
573
+ column: node.loc.start.column + 1
574
+ }
575
+ },
576
+ messageId: "spaceBeforeFunctionParenMismatch",
577
+ *fix(fixer) {
578
+ yield fixer.insertTextBefore(node, " ");
579
+ }
580
+ });
581
+ }
582
+ },
583
+ FunctionExpression: (node) => {
584
+ const pre = sourceCode.text.slice(0, node.range[0]);
585
+ const preSpace = pre.match(/(\s+)$/)?.[0];
586
+ if (!preSpace || !preSpace.length) {
587
+ context.report({
588
+ node,
589
+ loc: {
590
+ start: node.loc.start,
591
+ end: {
592
+ line: node.loc.start.line,
593
+ column: node.loc.start.column + 1
594
+ }
595
+ },
596
+ messageId: "spaceBeforeFunctionParenMismatch",
597
+ *fix(fixer) {
598
+ yield fixer.insertTextBefore(node, " ");
599
+ }
600
+ });
601
+ }
602
+ },
603
+ ArrowFunctionExpression: (node) => {
604
+ const pre = sourceCode.text.slice(0, node.range[0]);
605
+ const preSpace = pre.match(/(\s+)$/)?.[0];
606
+ if (!preSpace || !preSpace.length) {
607
+ context.report({
608
+ node,
609
+ loc: {
610
+ start: node.loc.start,
611
+ end: {
612
+ line: node.loc.start.line,
613
+ column: node.loc.start.column + 1
614
+ }
615
+ },
616
+ messageId: "spaceBeforeFunctionParenMismatch",
617
+ *fix(fixer) {
618
+ yield fixer.insertTextBefore(node, " ");
619
+ }
620
+ });
621
+ }
622
+ },
623
+ TSDeclareFunction: (node) => {
624
+ const pre = sourceCode.text.slice(0, node.range[0]);
625
+ const preSpace = pre.match(/(\s+)$/)?.[0];
626
+ if (!preSpace || !preSpace.length) {
627
+ context.report({
628
+ node,
629
+ loc: {
630
+ start: node.loc.start,
631
+ end: {
632
+ line: node.loc.start.line,
633
+ column: node.loc.start.column + 1
634
+ }
635
+ },
636
+ messageId: "spaceBeforeFunctionParenMismatch",
637
+ *fix(fixer) {
638
+ yield fixer.insertTextBefore(node, " ");
639
+ }
640
+ });
641
+ }
642
+ },
643
+ TSTypeReference: (node) => {
644
+ const pre = sourceCode.text.slice(0, node.range[0]);
645
+ const preSpace = pre.match(/(\s+)$/)?.[0];
646
+ if (!preSpace || !preSpace.length) {
647
+ context.report({
648
+ node,
649
+ loc: {
650
+ start: node.loc.start,
651
+ end: {
652
+ line: node.loc.start.line,
653
+ column: node.loc.start.column + 1
654
+ }
655
+ },
656
+ messageId: "spaceBeforeFunctionParenMismatch",
657
+ *fix(fixer) {
658
+ yield fixer.insertTextBefore(node, " ");
659
+ }
660
+ });
661
+ }
662
+ }
663
+ };
664
+ }
665
+ });
666
+
464
667
  const index = {
465
668
  rules: {
466
669
  "import-dedupe": importDedupe,
@@ -468,7 +671,8 @@ const index = {
468
671
  "space-between-generic-and-paren": spaceBetweenGenericAndParen,
469
672
  "space-in-empty-block": spaceInEmptyBlock,
470
673
  "semi-spacing": semiSpacing,
471
- "no-inline-type-import": noInlineTypeImport
674
+ "no-inline-type-import": noInlineTypeImport,
675
+ "space-before-function-paren": spaceBeforeFunctionParen
472
676
  }
473
677
  };
474
678
 
package/dist/index.d.ts CHANGED
@@ -8,6 +8,7 @@ declare const _default: {
8
8
  "space-in-empty-block": _typescript_eslint_utils_dist_ts_eslint_Rule.RuleModule<"noSpaceInEmptyBlock", [], _typescript_eslint_utils_dist_ts_eslint_Rule.RuleListener>;
9
9
  "semi-spacing": _typescript_eslint_utils_dist_ts_eslint_Rule.RuleModule<"noSpaceBeforeSemi", [], _typescript_eslint_utils_dist_ts_eslint_Rule.RuleListener>;
10
10
  "no-inline-type-import": _typescript_eslint_utils_dist_ts_eslint_Rule.RuleModule<"noInlineTypeImport", [], _typescript_eslint_utils_dist_ts_eslint_Rule.RuleListener>;
11
+ "space-before-function-paren": _typescript_eslint_utils_dist_ts_eslint_Rule.RuleModule<"spaceBeforeFunctionParenMismatch", [], _typescript_eslint_utils_dist_ts_eslint_Rule.RuleListener>;
11
12
  };
12
13
  };
13
14
 
package/dist/index.mjs CHANGED
@@ -2,16 +2,16 @@ import { ESLintUtils } from '@typescript-eslint/utils';
2
2
 
3
3
  const createEslintRule = ESLintUtils.RuleCreator((ruleName) => ruleName);
4
4
 
5
- const RULE_NAME$5 = "generic-spacing";
5
+ const RULE_NAME$6 = "generic-spacing";
6
6
  const genericSpacing = createEslintRule({
7
- name: RULE_NAME$5,
7
+ name: RULE_NAME$6,
8
8
  meta: {
9
- type: "suggestion",
9
+ type: "layout",
10
10
  docs: {
11
11
  description: "Spaces around generic type parameters",
12
12
  recommended: "error"
13
13
  },
14
- fixable: "code",
14
+ fixable: "whitespace",
15
15
  schema: [],
16
16
  messages: {
17
17
  genericSpacingMismatch: "Generic spaces mismatch"
@@ -20,6 +20,7 @@ const genericSpacing = createEslintRule({
20
20
  defaultOptions: [],
21
21
  create: (context) => {
22
22
  const sourceCode = context.getSourceCode();
23
+ const text = sourceCode.getText();
23
24
  return {
24
25
  TSTypeParameterDeclaration: (node) => {
25
26
  const params = node.params;
@@ -35,12 +36,12 @@ const genericSpacing = createEslintRule({
35
36
  node,
36
37
  loc: {
37
38
  start: {
38
- line: param.loc.end.line,
39
- column: param.loc.end.column - 1 - preSpace.length
39
+ line: param.loc.start.line,
40
+ column: param.loc.start.column + 1 - preSpace.length
40
41
  },
41
42
  end: {
42
- line: param.loc.end.line,
43
- column: param.loc.end.column - 1
43
+ line: param.loc.start.line,
44
+ column: param.loc.start.column - 1
44
45
  }
45
46
  },
46
47
  messageId: "genericSpacingMismatch",
@@ -163,14 +164,91 @@ const genericSpacing = createEslintRule({
163
164
  });
164
165
  }
165
166
  }
167
+ },
168
+ TSTypeParameterInstantiation: (node) => {
169
+ const params = node.params;
170
+ for (let i = 0; i < params.length; i++) {
171
+ const param = params[i];
172
+ const pre = sourceCode.text.slice(0, param.range[0]);
173
+ const preSpace = pre.match(/(\s+)$/)?.[0];
174
+ const preComma = pre.match(/(,)\s+$/)?.[0];
175
+ const post = sourceCode.text.slice(param.range[1]);
176
+ const postSpace = post.match(/^(\s*)/)?.[0];
177
+ if (preSpace && preSpace.length && !preComma) {
178
+ context.report({
179
+ node,
180
+ loc: {
181
+ start: {
182
+ line: param.loc.start.line,
183
+ column: param.loc.start.column + 1 - preSpace.length
184
+ },
185
+ end: {
186
+ line: param.loc.start.line,
187
+ column: param.loc.start.column - 1
188
+ }
189
+ },
190
+ messageId: "genericSpacingMismatch",
191
+ *fix(fixer) {
192
+ yield fixer.replaceTextRange([param.range[0] - preSpace.length, param.range[0]], "");
193
+ }
194
+ });
195
+ }
196
+ if (postSpace && postSpace.length) {
197
+ context.report({
198
+ loc: {
199
+ start: {
200
+ line: param.loc.end.line,
201
+ column: param.loc.end.column
202
+ },
203
+ end: {
204
+ line: param.loc.end.line,
205
+ column: param.loc.end.column + postSpace.length
206
+ }
207
+ },
208
+ node,
209
+ messageId: "genericSpacingMismatch",
210
+ *fix(fixer) {
211
+ yield fixer.replaceTextRange([param.range[1], param.range[1] + postSpace.length], "");
212
+ }
213
+ });
214
+ }
215
+ }
216
+ },
217
+ TSInterfaceDeclaration: (node) => {
218
+ if (!node.extends || !node.typeParameters) {
219
+ return;
220
+ }
221
+ const { typeParameters } = node;
222
+ const extendsKeywordStart = typeParameters.range[1];
223
+ const extendsKeywordEnd = node.extends[0].range[0];
224
+ const extendsText = text.slice(extendsKeywordStart, extendsKeywordEnd);
225
+ if (!/^\s+/.test(extendsText)) {
226
+ context.report({
227
+ loc: {
228
+ start: {
229
+ line: typeParameters.loc.end.line,
230
+ column: typeParameters.loc.end.column
231
+ },
232
+ end: {
233
+ line: typeParameters.loc.end.line,
234
+ column: typeParameters.loc.end.column + 7
235
+ }
236
+ },
237
+ node,
238
+ messageId: "genericSpacingMismatch",
239
+ *fix(fixer) {
240
+ yield fixer.replaceTextRange([extendsKeywordStart, extendsKeywordEnd - 8], " ");
241
+ }
242
+ });
243
+ }
166
244
  }
167
245
  };
168
246
  }
169
247
  });
170
248
 
171
- const RULE_NAME$4 = "import-dedupe";
249
+ const RULE_NAME$5 = "import-dedupe";
172
250
  const importDedupe = createEslintRule({
173
- name: RULE_NAME$4,
251
+ name: RULE_NAME$5,
174
252
  meta: {
175
253
  type: "problem",
176
254
  docs: {
@@ -218,16 +296,16 @@ const importDedupe = createEslintRule({
218
296
  }
219
297
  });
220
298
 
221
- const RULE_NAME$3 = "space-between-generic-and-paren";
299
+ const RULE_NAME$4 = "space-between-generic-and-paren";
222
300
  const spaceBetweenGenericAndParen = createEslintRule({
223
- name: RULE_NAME$3,
301
+ name: RULE_NAME$4,
224
302
  meta: {
225
- type: "suggestion",
303
+ type: "layout",
226
304
  docs: {
227
305
  description: "Spaces between generic type parameters and paren",
228
306
  recommended: "error"
229
307
  },
230
- fixable: "code",
308
+ fixable: "whitespace",
231
309
  schema: [],
232
310
  messages: {
233
311
  noSpaceBetweenGenericAndParen: "Expected no space between generic type parameters and paren"
@@ -294,16 +372,16 @@ const spaceBetweenGenericAndParen = createEslintRule({
294
372
  }
295
373
  });
296
374
 
297
- const RULE_NAME$2 = "space-in-empty-block";
375
+ const RULE_NAME$3 = "space-in-empty-block";
298
376
  const spaceInEmptyBlock = createEslintRule({
299
- name: RULE_NAME$2,
377
+ name: RULE_NAME$3,
300
378
  meta: {
301
- type: "suggestion",
379
+ type: "layout",
302
380
  docs: {
303
381
  description: "Disallow spaces in empty block",
304
382
  recommended: "error"
305
383
  },
306
- fixable: "code",
384
+ fixable: "whitespace",
307
385
  schema: [],
308
386
  messages: {
309
387
  noSpaceInEmptyBlock: "Expected no space in empty block"
@@ -314,7 +392,7 @@ const spaceInEmptyBlock = createEslintRule({
314
392
  const sourceCode = context.getSourceCode();
315
393
  return {
316
394
  BlockStatement: (node) => {
317
- if (node.body.length) {
395
+ if (node.body.length || sourceCode.getCommentsInside(node).length) {
318
396
  return;
319
397
  }
320
398
  const spaceStartRange = node.range[1] - 2;
@@ -361,16 +439,16 @@ const spaceInEmptyBlock = createEslintRule({
361
439
  }
362
440
  });
363
441
 
364
- const RULE_NAME$1 = "semi-spacing";
442
+ const RULE_NAME$2 = "semi-spacing";
365
443
  const semiSpacing = createEslintRule({
366
- name: RULE_NAME$1,
444
+ name: RULE_NAME$2,
367
445
  meta: {
368
- type: "suggestion",
446
+ type: "layout",
369
447
  docs: {
370
448
  description: "Semicolon spacing",
371
449
  recommended: "error"
372
450
  },
373
- fixable: "code",
451
+ fixable: "whitespace",
374
452
  schema: [],
375
453
  messages: {
376
454
  noSpaceBeforeSemi: "Expected no space before semicolon"
@@ -410,11 +488,11 @@ const semiSpacing = createEslintRule({
410
488
  }
411
489
  });
412
490
 
413
- const RULE_NAME = "no-inline-type-import";
491
+ const RULE_NAME$1 = "no-inline-type-import";
414
492
  const noInlineTypeImport = createEslintRule({
415
- name: RULE_NAME,
493
+ name: RULE_NAME$1,
416
494
  meta: {
417
- type: "suggestion",
495
+ type: "layout",
418
496
  docs: {
419
497
  description: "Disallow inline type import",
420
498
  recommended: "error"
@@ -459,6 +537,131 @@ import { ${valueSpecifiersText} } from "${node.source.value}";`);
459
537
  }
460
538
  });
461
539
 
540
+ const RULE_NAME = "space-before-function-paren";
541
+ const spaceBeforeFunctionParen = createEslintRule({
542
+ name: RULE_NAME,
543
+ meta: {
544
+ type: "layout",
545
+ docs: {
546
+ description: "Enforce consistent spacing before function parenthesis",
547
+ recommended: "error",
548
+ extendsBaseRule: true
549
+ },
550
+ fixable: "whitespace",
551
+ schema: [],
552
+ messages: {
553
+ spaceBeforeFunctionParenMismatch: "Space before function paren mismatch"
554
+ }
555
+ },
556
+ defaultOptions: [],
557
+ create: (context) => {
558
+ const sourceCode = context.getSourceCode();
559
+ return {
560
+ FunctionDeclaration: (node) => {
561
+ console.log(node);
562
+ const pre = sourceCode.text.slice(0, node.range[0]);
563
+ const preSpace = pre.match(/(\s+)$/)?.[0];
564
+ if (!preSpace || !preSpace.length) {
565
+ context.report({
566
+ node,
567
+ loc: {
568
+ start: node.loc.start,
569
+ end: {
570
+ line: node.loc.start.line,
571
+ column: node.loc.start.column + 1
572
+ }
573
+ },
574
+ messageId: "spaceBeforeFunctionParenMismatch",
575
+ *fix(fixer) {
576
+ yield fixer.insertTextBefore(node, " ");
577
+ }
578
+ });
579
+ }
580
+ },
581
+ FunctionExpression: (node) => {
582
+ const pre = sourceCode.text.slice(0, node.range[0]);
583
+ const preSpace = pre.match(/(\s+)$/)?.[0];
584
+ if (!preSpace || !preSpace.length) {
585
+ context.report({
586
+ node,
587
+ loc: {
588
+ start: node.loc.start,
589
+ end: {
590
+ line: node.loc.start.line,
591
+ column: node.loc.start.column + 1
592
+ }
593
+ },
594
+ messageId: "spaceBeforeFunctionParenMismatch",
595
+ *fix(fixer) {
596
+ yield fixer.insertTextBefore(node, " ");
597
+ }
598
+ });
599
+ }
600
+ },
601
+ ArrowFunctionExpression: (node) => {
602
+ const pre = sourceCode.text.slice(0, node.range[0]);
603
+ const preSpace = pre.match(/(\s+)$/)?.[0];
604
+ if (!preSpace || !preSpace.length) {
605
+ context.report({
606
+ node,
607
+ loc: {
608
+ start: node.loc.start,
609
+ end: {
610
+ line: node.loc.start.line,
611
+ column: node.loc.start.column + 1
612
+ }
613
+ },
614
+ messageId: "spaceBeforeFunctionParenMismatch",
615
+ *fix(fixer) {
616
+ yield fixer.insertTextBefore(node, " ");
617
+ }
618
+ });
619
+ }
620
+ },
621
+ TSDeclareFunction: (node) => {
622
+ const pre = sourceCode.text.slice(0, node.range[0]);
623
+ const preSpace = pre.match(/(\s+)$/)?.[0];
624
+ if (!preSpace || !preSpace.length) {
625
+ context.report({
626
+ node,
627
+ loc: {
628
+ start: node.loc.start,
629
+ end: {
630
+ line: node.loc.start.line,
631
+ column: node.loc.start.column + 1
632
+ }
633
+ },
634
+ messageId: "spaceBeforeFunctionParenMismatch",
635
+ *fix(fixer) {
636
+ yield fixer.insertTextBefore(node, " ");
637
+ }
638
+ });
639
+ }
640
+ },
641
+ TSTypeReference: (node) => {
642
+ const pre = sourceCode.text.slice(0, node.range[0]);
643
+ const preSpace = pre.match(/(\s+)$/)?.[0];
644
+ if (!preSpace || !preSpace.length) {
645
+ context.report({
646
+ node,
647
+ loc: {
648
+ start: node.loc.start,
649
+ end: {
650
+ line: node.loc.start.line,
651
+ column: node.loc.start.column + 1
652
+ }
653
+ },
654
+ messageId: "spaceBeforeFunctionParenMismatch",
655
+ *fix(fixer) {
656
+ yield fixer.insertTextBefore(node, " ");
657
+ }
658
+ });
659
+ }
660
+ }
661
+ };
662
+ }
663
+ });
664
+
462
665
  const index = {
463
666
  rules: {
464
667
  "import-dedupe": importDedupe,
@@ -466,7 +669,8 @@ const index = {
466
669
  "space-between-generic-and-paren": spaceBetweenGenericAndParen,
467
670
  "space-in-empty-block": spaceInEmptyBlock,
468
671
  "semi-spacing": semiSpacing,
469
- "no-inline-type-import": noInlineTypeImport
672
+ "no-inline-type-import": noInlineTypeImport,
673
+ "space-before-function-paren": spaceBeforeFunctionParen
470
674
  }
471
675
  };
472
676
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@so1ve/eslint-plugin",
3
- "version": "0.36.1",
3
+ "version": "0.37.1",
4
4
  "author": "Anthony Fu <anthonyfu117@hotmail.com> (https://github.com/antfu/)",
5
5
  "contributors": [
6
6
  {