Skip to content

Commit 234e92c

Browse files
authored
feat!: convert all configs to async, support on-demand import (#323)
1 parent da2129f commit 234e92c

23 files changed

+153
-105
lines changed

README.md

+16-15
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,7 @@ We don't recommend using this style in general usages, as there are shared optio
223223
```js
224224
// eslint.config.js
225225
import {
226+
combine,
226227
comments,
227228
ignores,
228229
imports,
@@ -240,21 +241,21 @@ import {
240241
yaml,
241242
} from '@antfu/eslint-config'
242243

243-
export default [
244-
...ignores(),
245-
...javascript(/* Options */),
246-
...comments(),
247-
...node(),
248-
...jsdoc(),
249-
...imports(),
250-
...unicorn(),
251-
...typescript(/* Options */),
252-
...stylistic(),
253-
...vue(),
254-
...jsonc(),
255-
...yaml(),
256-
...markdown(),
257-
]
244+
export default combine(
245+
ignores(),
246+
javascript(/* Options */),
247+
comments(),
248+
node(),
249+
jsdoc(),
250+
imports(),
251+
unicorn(),
252+
typescript(/* Options */),
253+
stylistic(),
254+
vue(),
255+
jsonc(),
256+
yaml(),
257+
markdown(),
258+
)
258259
```
259260

260261
</details>

src/configs/comments.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import type { ConfigItem } from '../types'
1+
import type { FlatConfigItem } from '../types'
22
import { pluginComments } from '../plugins'
33

4-
export function comments(): ConfigItem[] {
4+
export async function comments(): Promise<FlatConfigItem[]> {
55
return [
66
{
77
name: 'antfu:eslint-comments',

src/configs/ignores.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import type { ConfigItem } from '../types'
1+
import type { FlatConfigItem } from '../types'
22
import { GLOB_EXCLUDE } from '../globs'
33

4-
export function ignores(): ConfigItem[] {
4+
export async function ignores(): Promise<FlatConfigItem[]> {
55
return [
66
{
77
ignores: GLOB_EXCLUDE,

src/configs/imports.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import type { ConfigItem, OptionsStylistic } from '../types'
1+
import type { FlatConfigItem, OptionsStylistic } from '../types'
22
import { pluginAntfu, pluginImport } from '../plugins'
33

4-
export function imports(options: OptionsStylistic = {}): ConfigItem[] {
4+
export async function imports(options: OptionsStylistic = {}): Promise<FlatConfigItem[]> {
55
const {
66
stylistic = true,
77
} = options

src/configs/javascript.ts

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
import globals from 'globals'
2-
import type { ConfigItem, OptionsIsInEditor, OptionsOverrides } from '../types'
2+
import type { FlatConfigItem, OptionsIsInEditor, OptionsOverrides } from '../types'
33
import { pluginAntfu, pluginUnusedImports } from '../plugins'
44
import { GLOB_SRC, GLOB_SRC_EXT } from '../globs'
55

6-
export function javascript(options: OptionsIsInEditor & OptionsOverrides = {}): ConfigItem[] {
6+
export async function javascript(
7+
options: OptionsIsInEditor & OptionsOverrides = {},
8+
): Promise<FlatConfigItem[]> {
79
const {
810
isInEditor = false,
911
overrides = {},
1012
} = options
11-
1213
return [
1314
{
1415
languageOptions: {

src/configs/jsdoc.ts

+5-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import type { ConfigItem, OptionsStylistic } from '../types'
2-
import { pluginJsdoc } from '../plugins'
1+
import { interopDefault } from 'src'
2+
import type { FlatConfigItem, OptionsStylistic } from '../types'
33

4-
export function jsdoc(options: OptionsStylistic = {}): ConfigItem[] {
4+
export async function jsdoc(options: OptionsStylistic = {}): Promise<FlatConfigItem[]> {
55
const {
66
stylistic = true,
77
} = options
@@ -10,7 +10,8 @@ export function jsdoc(options: OptionsStylistic = {}): ConfigItem[] {
1010
{
1111
name: 'antfu:jsdoc',
1212
plugins: {
13-
jsdoc: pluginJsdoc,
13+
// @ts-expect-error missing types
14+
jsdoc: await interopDefault(import('eslint-plugin-jsdoc')),
1415
},
1516
rules: {
1617
'jsdoc/check-access': 'warn',

src/configs/jsonc.ts

+11-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import type { ConfigItem, OptionsOverrides, OptionsStylistic } from '../types'
1+
import type { FlatConfigItem, OptionsOverrides, OptionsStylistic } from '../types'
22
import { GLOB_JSON, GLOB_JSON5, GLOB_JSONC } from '../globs'
3-
import { parserJsonc, pluginJsonc } from '../plugins'
3+
import { interopDefault } from '../utils'
44

5-
export function jsonc(options: OptionsStylistic & OptionsOverrides = {}): ConfigItem[] {
5+
export async function jsonc(options: OptionsStylistic & OptionsOverrides = {}): Promise<FlatConfigItem[]> {
66
const {
77
overrides = {},
88
stylistic = true,
@@ -12,6 +12,14 @@ export function jsonc(options: OptionsStylistic & OptionsOverrides = {}): Config
1212
indent = 2,
1313
} = typeof stylistic === 'boolean' ? {} : stylistic
1414

15+
const [
16+
pluginJsonc,
17+
parserJsonc,
18+
] = await Promise.all([
19+
interopDefault(import('eslint-plugin-jsonc')),
20+
interopDefault(import('jsonc-eslint-parser')),
21+
] as const)
22+
1523
return [
1624
{
1725
name: 'antfu:jsonc:setup',

src/configs/markdown.ts

+5-4
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import type { ConfigItem, OptionsComponentExts, OptionsOverrides } from '../types'
1+
import type { FlatConfigItem, OptionsComponentExts, OptionsOverrides } from '../types'
22
import { GLOB_MARKDOWN, GLOB_MARKDOWN_CODE } from '../globs'
3-
import { pluginMarkdown } from '../plugins'
3+
import { interopDefault } from '../utils'
44

5-
export function markdown(options: OptionsComponentExts & OptionsOverrides = {}): ConfigItem[] {
5+
export async function markdown(options: OptionsComponentExts & OptionsOverrides = {}): Promise<FlatConfigItem[]> {
66
const {
77
componentExts = [],
88
overrides = {},
@@ -12,7 +12,8 @@ export function markdown(options: OptionsComponentExts & OptionsOverrides = {}):
1212
{
1313
name: 'antfu:markdown:setup',
1414
plugins: {
15-
markdown: pluginMarkdown,
15+
// @ts-expect-error missing types
16+
markdown: await interopDefault(import('eslint-plugin-markdown')),
1617
},
1718
},
1819
{

src/configs/node.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import type { ConfigItem } from '../types'
1+
import type { FlatConfigItem } from '../types'
22
import { pluginNode } from '../plugins'
33

4-
export function node(): ConfigItem[] {
4+
export async function node(): Promise<FlatConfigItem[]> {
55
return [
66
{
77
name: 'antfu:node',

src/configs/perfectionist.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
import type { ConfigItem } from '../types'
1+
import type { FlatConfigItem } from '../types'
22
import { pluginPerfectionist } from '../plugins'
33

44
/**
55
* Optional perfectionist plugin for props and items sorting.
66
*
77
* @see https://github.com/azat-io/eslint-plugin-perfectionist
88
*/
9-
export function perfectionist(): ConfigItem[] {
9+
export async function perfectionist(): Promise<FlatConfigItem[]> {
1010
return [
1111
{
1212
name: 'antfu:perfectionist',

src/configs/sort.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
import type { ConfigItem } from '../types'
1+
import type { FlatConfigItem } from '../types'
22

33
/**
44
* Sort package.json
55
*
66
* Requires `jsonc` config
77
*/
8-
export function sortPackageJson(): ConfigItem[] {
8+
export async function sortPackageJson(): Promise<FlatConfigItem[]> {
99
return [
1010
{
1111
files: ['**/package.json'],
@@ -100,7 +100,7 @@ export function sortPackageJson(): ConfigItem[] {
100100
* Requires `jsonc` config
101101
*/
102102

103-
export function sortTsconfig(): ConfigItem[] {
103+
export function sortTsconfig(): FlatConfigItem[] {
104104
return [
105105
{
106106
files: ['**/tsconfig.json', '**/tsconfig.*.json'],

src/configs/stylistic.ts

+6-3
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
1-
import type { ConfigItem, StylisticConfig } from '../types'
2-
import { pluginAntfu, pluginStylistic } from '../plugins'
1+
import { interopDefault } from 'src'
2+
import type { FlatConfigItem, StylisticConfig } from '../types'
3+
import { pluginAntfu } from '../plugins'
34

4-
export function stylistic(options: StylisticConfig = {}): ConfigItem[] {
5+
export async function stylistic(options: StylisticConfig = {}): Promise<FlatConfigItem[]> {
56
const {
67
indent = 2,
78
jsx = true,
89
quotes = 'single',
910
semi = false,
1011
} = options
1112

13+
const pluginStylistic = await interopDefault(import('@stylistic/eslint-plugin'))
14+
1215
const config = pluginStylistic.configs.customize({
1316
flat: true,
1417
indent,

src/configs/test.ts

+12-3
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,22 @@
1-
import type { ConfigItem, OptionsIsInEditor, OptionsOverrides } from '../types'
2-
import { pluginNoOnlyTests, pluginVitest } from '../plugins'
1+
import { interopDefault } from 'src'
2+
import type { FlatConfigItem, OptionsIsInEditor, OptionsOverrides } from '../types'
33
import { GLOB_TESTS } from '../globs'
44

5-
export function test(options: OptionsIsInEditor & OptionsOverrides = {}): ConfigItem[] {
5+
export async function test(options: OptionsIsInEditor & OptionsOverrides = {}): Promise<FlatConfigItem[]> {
66
const {
77
isInEditor = false,
88
overrides = {},
99
} = options
1010

11+
const [
12+
pluginVitest,
13+
pluginNoOnlyTests,
14+
] = await Promise.all([
15+
interopDefault(import('eslint-plugin-vitest')),
16+
// @ts-expect-error missing types
17+
interopDefault(import('eslint-plugin-no-only-tests')),
18+
] as const)
19+
1120
return [
1221
{
1322
name: 'antfu:test:setup',

src/configs/typescript.ts

+14-7
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
import process from 'node:process'
2-
import type { ConfigItem, OptionsComponentExts, OptionsOverrides, OptionsTypeScriptParserOptions, OptionsTypeScriptWithTypes } from '../types'
2+
import type { FlatConfigItem, OptionsComponentExts, OptionsOverrides, OptionsTypeScriptParserOptions, OptionsTypeScriptWithTypes } from '../types'
33
import { GLOB_SRC } from '../globs'
4-
import { parserTs, pluginAntfu, pluginImport, pluginTs } from '../plugins'
5-
import { renameRules, toArray } from '../utils'
4+
import { pluginAntfu } from '../plugins'
5+
import { interopDefault, renameRules, toArray } from '../utils'
66

7-
export function typescript(
7+
export async function typescript(
88
options?: OptionsComponentExts & OptionsOverrides & OptionsTypeScriptWithTypes & OptionsTypeScriptParserOptions,
9-
): ConfigItem[] {
9+
): Promise<FlatConfigItem[]> {
1010
const {
1111
componentExts = [],
1212
overrides = {},
1313
parserOptions = {},
1414
} = options ?? {}
1515

16-
const typeAwareRules: ConfigItem['rules'] = {
16+
const typeAwareRules: FlatConfigItem['rules'] = {
1717
'dot-notation': 'off',
1818
'no-implied-eval': 'off',
1919
'no-throw-literal': 'off',
@@ -39,13 +39,20 @@ export function typescript(
3939
? toArray(options.tsconfigPath)
4040
: undefined
4141

42+
const [
43+
pluginTs,
44+
parserTs,
45+
] = await Promise.all([
46+
interopDefault(import('@typescript-eslint/eslint-plugin')),
47+
interopDefault(import('@typescript-eslint/parser')),
48+
] as const)
49+
4250
return [
4351
{
4452
// Install the plugins without globs, so they can be configured separately.
4553
name: 'antfu:typescript:setup',
4654
plugins: {
4755
antfu: pluginAntfu,
48-
import: pluginImport,
4956
ts: pluginTs as any,
5057
},
5158
},

src/configs/unicorn.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import type { ConfigItem } from '../types'
1+
import type { FlatConfigItem } from '../types'
22
import { pluginUnicorn } from '../plugins'
33

4-
export function unicorn(): ConfigItem[] {
4+
export async function unicorn(): Promise<FlatConfigItem[]> {
55
return [
66
{
77
name: 'antfu:unicorn',

src/configs/vue.ts

+16-5
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
import type { ConfigItem, OptionsHasTypeScript, OptionsOverrides, OptionsStylistic } from '../types'
1+
import { interopDefault } from 'src'
2+
import type { FlatConfigItem, OptionsHasTypeScript, OptionsOverrides, OptionsStylistic } from '../types'
23
import { GLOB_VUE } from '../globs'
3-
import { parserTs, parserVue, pluginVue } from '../plugins'
44

5-
export function vue(
5+
export async function vue(
66
options: OptionsHasTypeScript & OptionsOverrides & OptionsStylistic = {},
7-
): ConfigItem[] {
7+
): Promise<FlatConfigItem[]> {
88
const {
99
overrides = {},
1010
stylistic = true,
@@ -14,6 +14,15 @@ export function vue(
1414
indent = 2,
1515
} = typeof stylistic === 'boolean' ? {} : stylistic
1616

17+
const [
18+
pluginVue,
19+
parserVue,
20+
] = await Promise.all([
21+
// @ts-expect-error missing types
22+
interopDefault(import('eslint-plugin-vue')),
23+
interopDefault(import('vue-eslint-parser')),
24+
] as const)
25+
1726
return [
1827
{
1928
name: 'antfu:vue:setup',
@@ -30,7 +39,9 @@ export function vue(
3039
jsx: true,
3140
},
3241
extraFileExtensions: ['.vue'],
33-
parser: options.typescript ? parserTs as any : null,
42+
parser: options.typescript
43+
? await interopDefault(import('@typescript-eslint/parser')) as any
44+
: null,
3445
sourceType: 'module',
3546
},
3647
},

src/configs/yaml.ts

+13-5
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
import type { ConfigItem, OptionsOverrides, OptionsStylistic } from '../types'
1+
import type { FlatConfigItem, OptionsOverrides, OptionsStylistic } from '../types'
22
import { GLOB_YAML } from '../globs'
3-
import { parserYaml, pluginYaml } from '../plugins'
3+
import { interopDefault } from '../utils'
44

5-
export function yaml(
5+
export async function yaml(
66
options: OptionsOverrides & OptionsStylistic = {},
7-
): ConfigItem[] {
7+
): Promise<FlatConfigItem[]> {
88
const {
99
overrides = {},
1010
stylistic = true,
@@ -15,11 +15,19 @@ export function yaml(
1515
quotes = 'single',
1616
} = typeof stylistic === 'boolean' ? {} : stylistic
1717

18+
const [
19+
pluginYaml,
20+
parserYaml,
21+
] = await Promise.all([
22+
interopDefault(import('eslint-plugin-yml')),
23+
interopDefault(import('yaml-eslint-parser')),
24+
] as const)
25+
1826
return [
1927
{
2028
name: 'antfu:yaml:setup',
2129
plugins: {
22-
yaml: pluginYaml as any,
30+
yaml: pluginYaml,
2331
},
2432
},
2533
{

0 commit comments

Comments
 (0)