diff --git a/packages/nuxt/src/core/nitro.ts b/packages/nuxt/src/core/nitro.ts index d66578d243f..fccf8b6c9f1 100644 --- a/packages/nuxt/src/core/nitro.ts +++ b/packages/nuxt/src/core/nitro.ts @@ -19,7 +19,7 @@ export async function initNitro (nuxt: Nuxt & { _nitro?: Nitro }) { const nitroConfig: NitroConfig = defu(_nitroConfig, { rootDir: nuxt.options.rootDir, workspaceDir: nuxt.options.workspaceDir, - srcDir: join(nuxt.options.srcDir, 'server'), + srcDir: nuxt.options.serverDir, dev: nuxt.options.dev, preset: nuxt.options.dev ? 'nitro-dev' : undefined, buildDir: nuxt.options.buildDir, @@ -28,7 +28,7 @@ export async function initNitro (nuxt: Nuxt & { _nitro?: Nitro }) { projectRoot: nuxt.options.rootDir, filename: join(nuxt.options.rootDir, '.nuxt/stats', '{name}.html') }, - scanDirs: nuxt.options._layers.map(layer => layer.config.srcDir).filter(Boolean).map(dir => join(dir!, 'server')), + scanDirs: nuxt.options._layers.map(layer => (layer.config.serverDir || layer.config.srcDir) && resolve(layer.cwd, layer.config.serverDir || resolve(layer.config.srcDir, 'server'))).filter(Boolean), renderer: resolve(distDir, 'core/runtime/nitro/renderer'), errorHandler: resolve(distDir, 'core/runtime/nitro/error'), nodeModulesDirs: nuxt.options.modulesDir, diff --git a/packages/schema/src/config/_common.ts b/packages/schema/src/config/_common.ts index 098e1ceee75..344e5d0ede3 100644 --- a/packages/schema/src/config/_common.ts +++ b/packages/schema/src/config/_common.ts @@ -100,6 +100,18 @@ export default defineUntypedSchema({ $resolve: async (val, get) => resolve(await get('rootDir'), val || '.') }, + /** + * Define the server directory of your Nuxt application, where Nitro + * routes, middleware and plugins are kept. + * + * If a relative path is specified, it will be relative to your `rootDir`. + * + * @version 3 + */ + serverDir: { + $resolve: async (val, get) => resolve(await get('rootDir'), val || resolve(await get('srcDir'), 'server')) + }, + /** * Define the directory where your built Nuxt files will be placed. *