feat(nuxt): introduce `imports.scan` option (#26576)

This commit is contained in:
Anthony Fu 2024-04-09 15:03:42 +02:00 committed by GitHub
parent 0a1b72f9fd
commit 36c0137b7e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 46 additions and 28 deletions

View File

@ -17,6 +17,7 @@ export default defineNuxtModule<Partial<ImportsOptions>>({
}, },
defaults: { defaults: {
autoImport: true, autoImport: true,
scan: true,
presets: defaultPresets, presets: defaultPresets,
global: false, global: false,
imports: [], imports: [],
@ -51,7 +52,12 @@ export default defineNuxtModule<Partial<ImportsOptions>>({
// composables/ dirs from all layers // composables/ dirs from all layers
let composablesDirs: string[] = [] let composablesDirs: string[] = []
if (options.scan) {
for (const layer of nuxt.options._layers) { for (const layer of nuxt.options._layers) {
// Layer disabled scanning for itself
if (layer.config?.imports?.scan === false) {
continue
}
composablesDirs.push(resolve(layer.config.srcDir, 'composables')) composablesDirs.push(resolve(layer.config.srcDir, 'composables'))
composablesDirs.push(resolve(layer.config.srcDir, 'utils')) composablesDirs.push(resolve(layer.config.srcDir, 'utils'))
for (const dir of (layer.config.imports?.dirs ?? [])) { for (const dir of (layer.config.imports?.dirs ?? [])) {
@ -75,6 +81,7 @@ export default defineNuxtModule<Partial<ImportsOptions>>({
return nuxt.callHook('restart') return nuxt.callHook('restart')
} }
}) })
}
// Support for importing from '#imports' // Support for importing from '#imports'
addTemplate({ addTemplate({
@ -101,14 +108,18 @@ export default defineNuxtModule<Partial<ImportsOptions>>({
await ctx.modifyDynamicImports(async (imports) => { await ctx.modifyDynamicImports(async (imports) => {
// Clear old imports // Clear old imports
imports.length = 0 imports.length = 0
// Scan `composables/`
const composableImports = await scanDirExports(composablesDirs, { // Scan for `composables/` and `utils/` directories
if (options.scan) {
const scannedImports = await scanDirExports(composablesDirs, {
fileFilter: file => !isIgnored(file), fileFilter: file => !isIgnored(file),
}) })
for (const i of composableImports) { for (const i of scannedImports) {
i.priority = i.priority || priorities.find(([dir]) => i.from.startsWith(dir))?.[1] i.priority = i.priority || priorities.find(([dir]) => i.from.startsWith(dir))?.[1]
} }
imports.push(...composableImports) imports.push(...scannedImports)
}
// Modules extending // Modules extending
await nuxt.callHook('imports:extend', imports) await nuxt.callHook('imports:extend', imports)
return imports return imports
@ -127,7 +138,7 @@ export default defineNuxtModule<Partial<ImportsOptions>>({
// Watch composables/ directory // Watch composables/ directory
nuxt.hook('builder:watch', async (_, relativePath) => { nuxt.hook('builder:watch', async (_, relativePath) => {
const path = resolve(nuxt.options.srcDir, relativePath) const path = resolve(nuxt.options.srcDir, relativePath)
if (composablesDirs.some(dir => dir === path || path.startsWith(dir + '/'))) { if (options.scan && composablesDirs.some(dir => dir === path || path.startsWith(dir + '/'))) {
await regenerateImports() await regenerateImports()
} }
}) })

View File

@ -15,6 +15,13 @@ export interface ImportsOptions extends UnimportOptions {
*/ */
dirs?: string[] dirs?: string[]
/**
* Enabled scan for local directories for auto imports.
* When this is disabled, `dirs` options will be ignored.
* @default true
*/
scan?: boolean
/** /**
* Assign auto imported utilities to `globalThis` instead of using built time transformation. * Assign auto imported utilities to `globalThis` instead of using built time transformation.
* @default false * @default false