diff --git a/packages/kit/src/module/install.ts b/packages/kit/src/module/install.ts index 3adaa6916a..b0e7305921 100644 --- a/packages/kit/src/module/install.ts +++ b/packages/kit/src/module/install.ts @@ -87,6 +87,8 @@ export async function loadNuxtModuleInstance (nuxtModule: string | NuxtModule, n const jiti = createJiti(nuxt.options.rootDir, { alias: nuxt.options.alias }) + let resolvedNuxtModule: NuxtModule | undefined + let hadNonFunctionPath = false // Import if input is string if (typeof nuxtModule === 'string') { const paths = new Set() @@ -96,9 +98,9 @@ export async function loadNuxtModuleInstance (nuxtModule: string | NuxtModule, n nuxtModule = resolve(nuxt.options.rootDir, nuxtModule) } - paths.add(join(nuxtModule, 'nuxt')) - paths.add(join(nuxtModule, 'module')) paths.add(nuxtModule) + paths.add(join(nuxtModule, 'module')) + paths.add(join(nuxtModule, 'nuxt')) for (const path of paths) { try { @@ -108,9 +110,17 @@ export async function loadNuxtModuleInstance (nuxtModule: string | NuxtModule, n url: nuxt.options.modulesDir.map(m => directoryToURL(m.replace(/\/node_modules\/?$/, '/'))), extensions: nuxt.options.extensions, }) - - nuxtModule = await jiti.import(src, { default: true }) as NuxtModule resolvedModulePath = fileURLToPath(new URL(src)) + if (!existsSync(resolvedModulePath)) { + continue + } + const instance = await jiti.import(src, { default: true }) as NuxtModule + // ignore possible barrel exports + if (typeof instance !== 'function') { + hadNonFunctionPath = true + continue + } + resolvedNuxtModule = instance // nuxt-module-builder generates a module.json with metadata including the version const moduleMetadataPath = new URL('module.json', src) @@ -135,17 +145,20 @@ export async function loadNuxtModuleInstance (nuxtModule: string | NuxtModule, n throw error } } + } else { + resolvedNuxtModule = nuxtModule } - // Throw error if module could not be found - if (typeof nuxtModule === 'string') { - throw new TypeError(`Could not load \`${nuxtModule}\`. Is it installed?`) + if (!resolvedNuxtModule) { + // Module was resolvable but returned a non-function + if (hadNonFunctionPath) { + throw new TypeError(`Nuxt module should be a function: ${nuxtModule}.`) + } + // Throw error if module could not be found + if (typeof nuxtModule === 'string') { + throw new TypeError(`Could not load \`${nuxtModule}\`. Is it installed?`) + } } - // Throw error if input is not a function - if (typeof nuxtModule !== 'function') { - throw new TypeError('Nuxt module should be a function: ' + nuxtModule) - } - - return { nuxtModule, buildTimeModuleMeta, resolvedModulePath } as { nuxtModule: NuxtModule, buildTimeModuleMeta: ModuleMeta, resolvedModulePath?: string } + return { nuxtModule: resolvedNuxtModule, buildTimeModuleMeta, resolvedModulePath } as { nuxtModule: NuxtModule, buildTimeModuleMeta: ModuleMeta, resolvedModulePath?: string } }