Skip to content

Commit 6bbc357

Browse files
committedMar 27, 2024
feat: allow flexible rules customization
1 parent b018319 commit 6bbc357

File tree

14 files changed

+97
-55
lines changed

14 files changed

+97
-55
lines changed
 

Diff for: ‎docs/content/1.packages/0.module.md

+25
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,31 @@ export default defineNuxtConfig({
129129

130130
Learn more about all the available options in the [ESLint Stylistic documentation](https://eslint.style/guide/config-presets#configuration-factory).
131131

132+
### Config Customizations
133+
134+
`withNuxt()` returns a chainable [`FlatConfigPipeline` instance](https://github.com/antfu/eslint-flat-config-utils#pipe) from [`eslint-flat-config-utils`](https://github.com/antfu/eslint-flat-config-utils) which allows you to manipulate the ESLint flat config with ease.
135+
136+
```ts [eslint.config.mjs]
137+
import withNuxt from './.nuxt/eslint.config.mjs'
138+
139+
export default withNuxt(
140+
// ...Custom flat configs append after nuxt's configs
141+
)
142+
.prepend(
143+
// ...Prepend some flat configs in front
144+
)
145+
// Override some rules in a specific config, based on their name
146+
.override('nuxt:typescript', {
147+
rules: {
148+
// ...Override rules, for example:
149+
'@typescript-eslint/ban-types': 'off'
150+
}
151+
})
152+
// ...you can chain more operations as needed
153+
```
154+
155+
You can learn more about the options available with the types can JSDocs of the instance.
156+
132157
### Dev Server Checker
133158

134159
Usually you don't need this setting as most IDEs are capable of running ESLint directly to inform you of issues. It's also possible to set up a [pre-commit hook with `lint-staged`](https://github.com/lint-staged/lint-staged) to guard your codebase before committing.

Diff for: ‎eslint.config.js

+21-22
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,31 @@
11
// @ts-check
2-
import { createConfigForNuxt, defineFlatConfigs } from '@nuxt/eslint-config/flat'
2+
import { createConfigForNuxt } from '@nuxt/eslint-config/flat'
33

4-
export default defineFlatConfigs(
4+
export default createConfigForNuxt({
5+
features: {
6+
stylistic: true,
7+
},
8+
dirs: {
9+
src: 'playground',
10+
pages: [
11+
'playground/pages',
12+
'docs/pages',
13+
],
14+
layouts: [
15+
'playground/layouts',
16+
'docs/layouts',
17+
],
18+
components: [
19+
'playground/components',
20+
'docs/components',
21+
],
22+
},
23+
}).append(
524
{
625
ignores: [
726
'packages-legacy/**',
827
],
928
},
10-
createConfigForNuxt({
11-
features: {
12-
stylistic: true,
13-
},
14-
dirs: {
15-
src: 'playground',
16-
pages: [
17-
'playground/pages',
18-
'docs/pages',
19-
],
20-
layouts: [
21-
'playground/layouts',
22-
'docs/layouts',
23-
],
24-
components: [
25-
'playground/components',
26-
'docs/components',
27-
],
28-
},
29-
}),
3029
{
3130
files: ['docs/**/*.vue'],
3231
rules: {

Diff for: ‎packages/eslint-config/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
"eslint-plugin-vue": "^9.24.0",
3737
"globals": "^15.0.0",
3838
"pathe": "^1.1.2",
39+
"eslint-flat-config-utils": "^0.1.0",
3940
"vue-eslint-parser": "^9.4.2"
4041
},
4142
"devDependencies": {

Diff for: ‎packages/eslint-config/src/flat/configs/base.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import { FlatConfig } from '../types'
1+
import type { FlatConfigItem } from 'eslint-flat-config-utils'
22

3-
export default function base(): FlatConfig[] {
3+
export default function base(): FlatConfigItem[] {
44
return [
55
{
66
ignores: [

Diff for: ‎packages/eslint-config/src/flat/configs/disables.ts

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import { join } from 'pathe'
22
import { GLOB_EXTS } from '../constants'
3-
import type { FlatConfig, NuxtESLintConfigOptions } from '../types'
3+
import type { NuxtESLintConfigOptions } from '../types'
4+
import { FlatConfigItem } from 'eslint-flat-config-utils'
45

5-
export default function disables(options: NuxtESLintConfigOptions): FlatConfig[] {
6+
export default function disables(options: NuxtESLintConfigOptions): FlatConfigItem[] {
67
const dirs = options.dirs ?? {}
78
const nestedGlobPattern = `**/*.${GLOB_EXTS}`
89

@@ -21,7 +22,7 @@ export default function disables(options: NuxtESLintConfigOptions): FlatConfig[]
2122
...(dirs.components?.map(componentsDir => join(componentsDir, '*', nestedGlobPattern)) || []),
2223
]
2324

24-
const configs: FlatConfig[] = []
25+
const configs: FlatConfigItem[] = []
2526

2627
if (fileRoutes.length) {
2728
configs.push({

Diff for: ‎packages/eslint-config/src/flat/configs/javascript.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
// @ts-expect-error missing types
22
import pluginESLint from '@eslint/js'
3-
import type { Linter } from 'eslint'
3+
import { FlatConfigItem } from 'eslint-flat-config-utils'
44
import globals from 'globals'
55

6-
export default function javascript(): Linter.FlatConfig[] {
6+
export default function javascript(): FlatConfigItem[] {
77
return [
88
{
99
name: 'nuxt:javascript',

Diff for: ‎packages/eslint-config/src/flat/configs/nuxt.ts

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
import { join } from 'pathe'
2-
import type { FlatConfig, NuxtESLintConfigOptions } from '../types'
2+
import type { NuxtESLintConfigOptions } from '../types'
33
import nuxtPlugin from '@nuxt/eslint-plugin'
44
import { GLOB_EXTS } from '../constants'
5+
import { FlatConfigItem } from 'eslint-flat-config-utils'
56

6-
export default function nuxt(options: NuxtESLintConfigOptions): FlatConfig[] {
7+
export default function nuxt(options: NuxtESLintConfigOptions): FlatConfigItem[] {
78
const dirs = options.dirs ?? {}
89

910
const fileSingleRoot = [
1011
...(dirs.layouts?.map(layoutsDir => join(layoutsDir, `**/*.${GLOB_EXTS}`)) || []),
1112
...(dirs.pages?.map(pagesDir => join(pagesDir, `**/*.${GLOB_EXTS}`)) || []),
1213
]
1314

14-
const configs: FlatConfig[] = [
15+
const configs: FlatConfigItem[] = [
1516
{
1617
name: 'nuxt:rules',
1718
plugins: {

Diff for: ‎packages/eslint-config/src/flat/configs/typescript.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import * as parserTs from '@typescript-eslint/parser'
22
import pluginTs from '@typescript-eslint/eslint-plugin'
3-
import { FlatConfig } from '../types'
3+
import { FlatConfigItem } from 'eslint-flat-config-utils'
44

5-
export default function typescript(): FlatConfig[] {
5+
export default function typescript(): FlatConfigItem[] {
66
return [
77
{
88
name: 'nuxt:setup:typescript',

Diff for: ‎packages/eslint-config/src/flat/configs/vue.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@ import * as parserTs from '@typescript-eslint/parser'
33

44
// @ts-expect-error missing types
55
import pluginVue from 'eslint-plugin-vue'
6-
import { FlatConfig, NuxtESLintConfigOptions } from '../types'
6+
import { NuxtESLintConfigOptions } from '../types'
77
import { removeUndefined } from '../utils'
8+
import { FlatConfigItem } from 'eslint-flat-config-utils'
89

9-
export default function vue(options: NuxtESLintConfigOptions): FlatConfig[] {
10+
export default function vue(options: NuxtESLintConfigOptions): FlatConfigItem[] {
1011
return [
1112
{
1213
name: 'nuxt:setup-vue',

Diff for: ‎packages/eslint-config/src/flat/index.ts

+19-12
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
import type { Awaitable, FlatConfig, NuxtESLintConfigOptions } from './types'
1+
import type { Awaitable, NuxtESLintConfigOptions } from './types'
22
import disables from './configs/disables'
33
import nuxt from './configs/nuxt'
44
import base from './configs/base'
55
import javascript from './configs/javascript'
66
import typescript from './configs/typescript'
77
import vue from './configs/vue'
88
import stylistic from './configs/stylistic'
9+
import { pipe, FlatConfigPipeline, FlatConfigItem } from 'eslint-flat-config-utils'
910

1011
export * from './types'
1112

@@ -15,7 +16,7 @@ export * from './types'
1516
* This function takes flat config item, or an array of them as rest arguments.
1617
* It also automatically resolves the promise if the config item is a promise.
1718
*/
18-
export async function defineFlatConfigs(...configs: Awaitable<FlatConfig | FlatConfig[]>[]): Promise<FlatConfig[]> {
19+
export async function defineFlatConfigs(...configs: Awaitable<FlatConfigItem | FlatConfigItem[]>[]): Promise<FlatConfigItem[]> {
1920
const resolved = await Promise.all(configs)
2021
return resolved.flat()
2122
}
@@ -27,22 +28,28 @@ export async function defineFlatConfigs(...configs: Awaitable<FlatConfig | FlatC
2728
*
2829
* @see https://eslint.nuxt.com/packages/module
2930
*/
30-
export async function createConfigForNuxt(options: NuxtESLintConfigOptions = {}): Promise<FlatConfig[]> {
31-
const items: FlatConfig[] = []
31+
export function createConfigForNuxt(options: NuxtESLintConfigOptions = {}): FlatConfigPipeline<FlatConfigItem> {
32+
const pipeline = pipe()
3233

3334
if (options.features?.standalone !== false) {
34-
items.push(...base())
35-
items.push(...javascript())
36-
items.push(...typescript())
37-
items.push(...vue(options))
35+
pipeline.append(
36+
base(),
37+
javascript(),
38+
typescript(),
39+
vue(options),
40+
)
3841
}
3942

4043
if (options.features?.stylistic) {
41-
items.push(stylistic(options.features.stylistic === true ? {} : options.features.stylistic))
44+
pipeline.append(
45+
stylistic(options.features.stylistic === true ? {} : options.features.stylistic),
46+
)
4247
}
4348

44-
items.push(...nuxt(options))
45-
items.push(...disables(options))
49+
pipeline.append(
50+
nuxt(options),
51+
disables(options),
52+
)
4653

47-
return items
54+
return pipeline
4855
}

Diff for: ‎packages/eslint-config/src/flat/types.ts

-5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import { StylisticCustomizeOptions } from '@stylistic/eslint-plugin'
2-
import type { Linter } from 'eslint'
32

43
export interface NuxtESLintFeaturesOptions {
54
/**
@@ -76,8 +75,4 @@ export interface NuxtESLintConfigOptions {
7675
}
7776
}
7877

79-
export interface FlatConfig extends Linter.FlatConfig {
80-
name?: string
81-
}
82-
8378
export type Awaitable<T> = T | Promise<T>

Diff for: ‎packages/module/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
"@nuxt/eslint-plugin": "workspace:*",
4949
"@nuxt/kit": "^3.11.1",
5050
"chokidar": "^3.6.0",
51+
"eslint-flat-config-utils": "^0.1.0",
5152
"eslint-flat-config-viewer": "^0.1.14",
5253
"get-port-please": "^3.1.2",
5354
"pathe": "^1.1.2",

Diff for: ‎packages/module/src/config-addons/globals.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import type { Nuxt } from '@nuxt/schema'
22
import type { Unimport } from 'unimport'
33
import type { ESLintConfigGenAddon } from '../types'
4-
import type { FlatConfig } from '@nuxt/eslint-config/flat'
4+
import type { FlatConfigItem } from 'eslint-flat-config-utils'
55

66
export function createAddonGlobals(nuxt: Nuxt): ESLintConfigGenAddon {
77
let unimport: Unimport
@@ -16,7 +16,7 @@ export function createAddonGlobals(nuxt: Nuxt): ESLintConfigGenAddon {
1616
return {
1717
configs: [
1818
'// Set globals from imports registry\n'
19-
+ JSON.stringify(<FlatConfig>{
19+
+ JSON.stringify(<FlatConfigItem>{
2020
name: 'nuxt:import-globals',
2121
languageOptions: {
2222
globals: Object.fromEntries((await unimport.getImports()).map(i => [i.as || i.name, 'readonly'])),

Diff for: ‎pnpm-lock.yaml

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

0 commit comments

Comments
 (0)
Please sign in to comment.