Skip to content

Commit 588494c

Browse files
committedOct 31, 2022
feat: format for generics spacing
1 parent 3c12076 commit 588494c

File tree

7 files changed

+117
-71
lines changed

7 files changed

+117
-71
lines changed
 

‎packages/eslint-plugin-antfu/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
"@typescript-eslint/utils": "^5.36.1"
2020
},
2121
"devDependencies": {
22+
"@types/node": "^18.11.8",
2223
"unbuild": "^0.8.10",
2324
"vitest": "^0.22.1"
2425
}

‎packages/eslint-plugin-antfu/src/index.ts

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import genericSpacing from './rules/generic-spacing'
12
import ifNewline from './rules/if-newline'
23
import importDedupe from './rules/import-dedupe'
34
import preferInlineTypeImport from './rules/prefer-inline-type-import'
@@ -7,5 +8,6 @@ export default {
78
'if-newline': ifNewline,
89
'import-dedupe': importDedupe,
910
'prefer-inline-type-import': preferInlineTypeImport,
11+
'generic-spacing': genericSpacing,
1012
},
1113
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import { RuleTester } from '@typescript-eslint/utils/dist/ts-eslint'
2+
import { it } from 'vitest'
3+
import rule, { RULE_NAME } from './generic-spacing'
4+
5+
const valids = [
6+
'type Foo<T = true> = T',
7+
`
8+
type Foo<
9+
T = true,
10+
K = false
11+
> = T`,
12+
]
13+
const invalids = [
14+
['type Foo<T=true> = T', 'type Foo<T = true> = T'],
15+
['type Foo<T,K> = T', 'type Foo<T, K> = T'],
16+
['type Foo<T=false,K=1|2> = T', 'type Foo<T = false, K = 1|2> = T', 3],
17+
] as const
18+
19+
it('runs', () => {
20+
const ruleTester: RuleTester = new RuleTester({
21+
parser: require.resolve('@typescript-eslint/parser'),
22+
})
23+
24+
ruleTester.run(RULE_NAME, rule, {
25+
valid: valids,
26+
invalid: invalids.map(i => ({
27+
code: i[0],
28+
output: i[1].trim(),
29+
errors: Array.from({ length: i[2] || 1 }, () => ({ messageId: 'genericSpacingMismatch' })),
30+
})),
31+
})
32+
})
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import { createEslintRule } from '../utils'
2+
3+
export const RULE_NAME = 'generic-spacing'
4+
export type MessageIds = 'genericSpacingMismatch'
5+
export type Options = []
6+
7+
export default createEslintRule<Options, MessageIds>({
8+
name: RULE_NAME,
9+
meta: {
10+
type: 'suggestion',
11+
docs: {
12+
description: 'Spaces around generic type parameters',
13+
recommended: 'error',
14+
},
15+
fixable: 'code',
16+
schema: [],
17+
messages: {
18+
genericSpacingMismatch: 'Generic spaces mismatch',
19+
},
20+
},
21+
defaultOptions: [],
22+
create: (context) => {
23+
const sourceCode = context.getSourceCode()
24+
return {
25+
TSTypeParameterDeclaration: (node) => {
26+
const params = node.params
27+
for (let i = 1; i < params.length; i++) {
28+
const prev = params[i - 1]
29+
const current = params[i]
30+
const from = prev.range[1]
31+
const to = current.range[0]
32+
const span = sourceCode.text.slice(from, to)
33+
if (span !== ', ' && !span.match(/,\n/)) {
34+
context.report({
35+
*fix(fixer) {
36+
yield fixer.replaceTextRange([from, to], ', ')
37+
},
38+
loc: {
39+
start: prev.loc.end,
40+
end: current.loc.start,
41+
},
42+
messageId: 'genericSpacingMismatch',
43+
node,
44+
})
45+
}
46+
}
47+
},
48+
TSTypeParameter: (node) => {
49+
if (!node.default)
50+
return
51+
const from = node.name.range[1]
52+
const to = node.default.range[0]
53+
if (sourceCode.text.slice(from, to) !== ' = ') {
54+
context.report({
55+
*fix(fixer) {
56+
yield fixer.replaceTextRange([from, to], ' = ')
57+
},
58+
loc: {
59+
start: node.name.loc.end,
60+
end: node.default.loc.start,
61+
},
62+
messageId: 'genericSpacingMismatch',
63+
node,
64+
})
65+
}
66+
},
67+
}
68+
},
69+
})

‎packages/typescript/index.js

+3
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,9 @@ module.exports = {
106106
'lines-between-class-members': 'off',
107107
'@typescript-eslint/lines-between-class-members': ['error', 'always', { exceptAfterSingleLine: true }],
108108

109+
// antfu
110+
'antfu/generic-spacing': 'error',
111+
109112
// The following rule overrides require a parser service, aka. require a `typescript.json` path.
110113
// This needs to be done individually for each project, and it slows down linting significantly.
111114
// 'no-throw-literal': 'off',

‎pnpm-lock.yaml

+6-70
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎tsconfig.json

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
{
22
"compilerOptions": {
3-
"baseUrl": "."
3+
"baseUrl": ".",
4+
"target": "es2020",
5+
"module": "es2020",
6+
"moduleResolution": "node"
47
},
58
"include": [
69
"./packages/**/*.ts"

0 commit comments

Comments
 (0)
Please sign in to comment.