diff --git a/packages/nuxt/src/module.ts b/packages/nuxt/src/module.ts index 64a7e17d4..72e843555 100644 --- a/packages/nuxt/src/module.ts +++ b/packages/nuxt/src/module.ts @@ -27,7 +27,9 @@ interface ModuleOptions { /** * `@hey-api/openapi-ts` configuration options. */ - config: Omit & Partial>; + config: + | (Omit & Partial>) + | (Omit & Partial>)[]; } export default defineNuxtModule({ @@ -44,74 +46,80 @@ export default defineNuxtModule({ nuxt.options.build.transpile.push('@hey-api/client-nuxt'); - const config = defu(options.config, { - output: { - path: path.join(nuxt.options.buildDir, 'client'), - }, - plugins: (options.config.plugins || []).some( - (plugin: Required['plugins'][number]) => { - const pluginName = typeof plugin === 'string' ? plugin : plugin.name; - return pluginName === '@hey-api/client-nuxt'; + const optionsConfigs = Array.isArray(options.config) + ? options.config + : [options.config]; + + for (const optionsConfig of optionsConfigs) { + const config = defu(optionsConfig, { + output: { + path: path.join(nuxt.options.buildDir, 'client'), }, - ) - ? [] - : ['@hey-api/client-nuxt'], - } satisfies Partial) as UserConfig; + plugins: (optionsConfig.plugins || []).some( + (plugin: Required['plugins'][number]) => { + const pluginName = typeof plugin === 'string' ? plugin : plugin.name; + return pluginName === '@hey-api/client-nuxt'; + }, + ) + ? [] + : ['@hey-api/client-nuxt'], + } satisfies Partial) as UserConfig; - if (nuxt.options._prepare) { - config.watch = false; - } + if (nuxt.options._prepare) { + config.watch = false; + } - const folder = path.resolve( - nuxt.options.rootDir, - typeof config.output === 'string' ? config.output : config.output.path, - ); + const folder = path.resolve( + nuxt.options.rootDir, + typeof config.output === 'string' ? config.output : config.output.path, + ); - nuxt.options.alias[options.alias!] = folder; + nuxt.options.alias[options.alias!] = folder; - nuxt.hooks.hookOnce('app:templates', async () => { - await createClient(config); - }); + nuxt.hooks.hookOnce('app:templates', async () => { + await createClient(config); + }); - // auto-import enabled - if (options.autoImport) { - await createClient(config); - const typeImports = new Set(); - const valueImports = new Set(); - const files = findExports( - fs.readFileSync(path.join(folder, 'index.ts'), 'utf-8'), - ); - for (const file of files) { - if (!file.specifier || !/^\.{1,2}\//.test(file.specifier)) { - continue; - } - const filePath = await findPath(path.resolve(folder, file.specifier)); - if (!filePath) { - continue; - } - const blob = fs.readFileSync(filePath, 'utf-8'); - for (const { names } of findTypeExports(blob)) { - for (const name of names) { - typeImports.add(name); + // auto-import enabled + if (options.autoImport) { + await createClient(config); + const typeImports = new Set(); + const valueImports = new Set(); + const files = findExports( + fs.readFileSync(path.join(folder, 'index.ts'), 'utf-8'), + ); + for (const file of files) { + if (!file.specifier || !/^\.{1,2}\//.test(file.specifier)) { + continue; } - } - for (const { names } of findExports(blob)) { - for (const name of names) { - valueImports.add(name); + const filePath = await findPath(path.resolve(folder, file.specifier)); + if (!filePath) { + continue; + } + const blob = fs.readFileSync(filePath, 'utf-8'); + for (const { names } of findTypeExports(blob)) { + for (const name of names) { + typeImports.add(name); + } + } + for (const { names } of findExports(blob)) { + for (const name of names) { + valueImports.add(name); + } } } - } - const imports = [ - ...[...typeImports].map((name) => ({ name, type: true })), - ...valueImports, - ]; + const imports = [ + ...[...typeImports].map((name) => ({ name, type: true })), + ...valueImports, + ]; - if (imports.length && options.alias) { - addImportsSources({ - from: options.alias, - imports, - }); + if (imports.length && options.alias) { + addImportsSources({ + from: options.alias, + imports, + }); + } } } },