Skip to content

Commit ee98b29

Browse files
authoredMar 19, 2024··
feat(module): generate configuration for globals (#336)
1 parent 16e85a8 commit ee98b29

File tree

3 files changed

+62
-14
lines changed

3 files changed

+62
-14
lines changed
 
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import type { Nuxt } from '@nuxt/schema'
2+
import type { Unimport } from 'unimport'
3+
import type { ESLintConfigGenAddon } from '../types'
4+
import type { FlatConfig } from '@nuxt/eslint-config/flat'
5+
6+
export function createAddonGlobals(nuxt: Nuxt): ESLintConfigGenAddon {
7+
let unimport: Unimport
8+
9+
nuxt.hook('imports:context', (context) => {
10+
unimport = context
11+
})
12+
13+
return async () => ({
14+
configs: [
15+
'// Set globals from imports registry\n'
16+
+ JSON.stringify(<FlatConfig>{
17+
name: 'nuxt:import-globals',
18+
languageOptions: {
19+
globals: Object.fromEntries((await unimport.getImports()).map(i => [i.as || i.name, 'readonly'])),
20+
},
21+
}),
22+
],
23+
})
24+
}

‎packages/module/src/modules/config.ts

+23-10
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,21 @@ import type { Import } from 'unimport'
44
import type { Nuxt } from '@nuxt/schema'
55
import { relative, resolve } from 'pathe'
66
import { getPort } from 'get-port-please'
7-
import type { ESLintPluginAddon } from '../types'
7+
import type { ESLintConfigGenAddon } from '../types'
88
import type { NuxtESLintConfigOptions } from '@nuxt/eslint-config/flat'
99
import { ConfigGenOptions, ModuleOptions } from '../module'
10+
import { createAddonGlobals } from '../config-addons/globals'
1011

11-
export function setupConfigGen(options: ModuleOptions, nuxt: Nuxt) {
12-
const addons: ESLintPluginAddon[] = []
12+
export async function setupConfigGen(options: ModuleOptions, nuxt: Nuxt) {
13+
const addons: ESLintConfigGenAddon[] = [
14+
createAddonGlobals(nuxt),
15+
]
1316

1417
// TODO: hook to add more addons
18+
// nuxt.hook('app:resolve', async () => {
19+
// await nuxt.callHook('eslint:config:addons', addons)
20+
// })
21+
1522
addTemplate({
1623
filename: 'eslint.config.mjs',
1724
write: true,
@@ -23,9 +30,9 @@ export function setupConfigGen(options: ModuleOptions, nuxt: Nuxt) {
2330
setupDevToolsIntegration(nuxt)
2431
}
2532

26-
function generateESLintConfig(options: ModuleOptions, nuxt: Nuxt, addons: ESLintPluginAddon[]) {
33+
async function generateESLintConfig(options: ModuleOptions, nuxt: Nuxt, addons: ESLintConfigGenAddon[]) {
2734
const importLines: Import[] = []
28-
const configLines: string[] = []
35+
const configItems: string[] = []
2936

3037
const config: ConfigGenOptions = {
3138
standalone: true,
@@ -46,22 +53,27 @@ function generateESLintConfig(options: ModuleOptions, nuxt: Nuxt, addons: ESLint
4653
dirs: getDirs(nuxt),
4754
}
4855

49-
configLines.push(`...createConfigForNuxt(\n${JSON.stringify(basicOptions, null, 2)}\n),`)
56+
configItems.push(`// Nuxt Configs\n...createConfigForNuxt(${JSON.stringify(basicOptions, null, 2)})`)
5057

51-
for (const mod of addons) {
52-
importLines.push(...mod.imports)
53-
configLines.push(...mod.configs)
58+
for (const addon of addons) {
59+
const resolved = await addon()
60+
if (resolved?.imports)
61+
importLines.push(...resolved.imports)
62+
if (resolved?.configs)
63+
configItems.push(...resolved.configs)
5464
}
5565

5666
return [
5767
'// ESLint config generated by Nuxt',
5868
stringifyImports(importLines, false),
69+
'',
5970
`export default [`,
60-
...configLines,
71+
configItems.join(',\n\n'),
6172
`]`,
6273
'',
6374
].join('\n')
6475
}
76+
6577
function setupDevToolsIntegration(nuxt: Nuxt) {
6678
let viewerProcess: ReturnType<typeof import('@nuxt/devtools-kit')['startSubprocess']> | undefined
6779
let viewerPort: number | undefined
@@ -124,6 +136,7 @@ function setupDevToolsIntegration(nuxt: Nuxt) {
124136
})
125137
})
126138
}
139+
127140
function getDirs(nuxt: Nuxt): NuxtESLintConfigOptions['dirs'] {
128141
const dirs: Required<NuxtESLintConfigOptions['dirs']> = {
129142
pages: [],

‎packages/module/src/types.ts

+15-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import type { Import } from 'unimport'
22
import type { ESLintPluginOptions as ViteCheckerOptions } from 'vite-plugin-eslint2'
33
import type { Options as WebpackCheckerOptions } from 'eslint-webpack-plugin'
4-
import { NuxtESLintFeaturesOptions } from '@nuxt/eslint-config/flat'
4+
import { FlatConfig, NuxtESLintFeaturesOptions } from '@nuxt/eslint-config/flat'
5+
import { Nuxt } from '@nuxt/schema'
56

67
export interface ConfigGenOptions extends NuxtESLintFeaturesOptions {}
78

@@ -91,7 +92,17 @@ export interface ModuleOptions {
9192
checker?: CheckerOptions | boolean
9293
}
9394

94-
export interface ESLintPluginAddon {
95-
imports: Import[]
96-
configs: string[]
95+
export interface ESLintConfigGenAddonResult {
96+
/**
97+
* Imports statements to add to the generated ESLint config
98+
*/
99+
imports?: Import[]
100+
/**
101+
* Flat config items, should be stringified
102+
*/
103+
configs?: string[]
97104
}
105+
106+
export type Awaitable<T> = T | Promise<T>
107+
108+
export type ESLintConfigGenAddon = () => Awaitable<ESLintConfigGenAddonResult | void>

0 commit comments

Comments
 (0)
Please sign in to comment.