@@ -16,6 +16,7 @@ import {
1616 getEnvRunner ,
1717 createNitroEnvironment ,
1818 createServiceEnvironments ,
19+ createServiceEnvironment ,
1920} from "./env.ts" ;
2021import { configureViteDevServer } from "./dev.ts" ;
2122import { runtimeDir } from "nitro/meta" ;
@@ -115,6 +116,54 @@ function nitroEnv(ctx: NitroPluginContext): VitePlugin {
115116 ) ;
116117 config . build ! . emptyOutDir = false ;
117118 config . build ! . outDir = useNitro ( ctx ) . options . output . publicDir ;
119+ return ;
120+ }
121+
122+ // Skip if already registered as a service
123+ if ( name === "nitro" || ctx . services [ name ] ) {
124+ return ;
125+ }
126+
127+ // Auto-register server consumer environments as services
128+ const entry = getEntry (
129+ config . build ?. rolldownOptions ?. input ||
130+ config . build ?. rollupOptions ?. input
131+ ) ;
132+ if ( typeof entry !== "string" ) {
133+ return ;
134+ }
135+
136+ // Resolve and register as a service
137+ const resolvedEntry =
138+ resolveModulePath ( entry , {
139+ from : [ ctx . nitro ! . options . rootDir , ...ctx . nitro ! . options . scanDirs ] ,
140+ extensions : DEFAULT_EXTENSIONS ,
141+ suffixes : [ "" , "/index" ] ,
142+ try : true ,
143+ } ) || entry ;
144+
145+ ctx . services [ name ] = { entry : resolvedEntry } ;
146+ debug (
147+ `[env] Auto-detected service "${ name } " with entry: ${ resolvedEntry } `
148+ ) ;
149+
150+ // Return service environment configuration to merge
151+ return createServiceEnvironment ( ctx , name , { entry : resolvedEntry } ) ;
152+ } ,
153+
154+ configResolved ( ) {
155+ // Setup default SSR renderer after all environments are configured
156+ if (
157+ ! ctx . nitro ! . options . renderer ?. handler &&
158+ ! ctx . nitro ! . options . renderer ?. template &&
159+ ctx . services . ssr ?. entry
160+ ) {
161+ ctx . nitro ! . options . renderer ??= { } ;
162+ ctx . nitro ! . options . renderer . handler = resolve (
163+ runtimeDir ,
164+ "internal/vite/ssr-renderer"
165+ ) ;
166+ ctx . nitro ! . routing . sync ( ) ;
118167 }
119168 } ,
120169 } ;
@@ -369,20 +418,6 @@ async function setupNitroContext(
369418 ctx . nitro . options . serverEntry = false ;
370419 }
371420
372- // Default SSR renderer
373- if (
374- ! ctx . nitro . options . renderer ?. handler &&
375- ! ctx . nitro . options . renderer ?. template &&
376- ctx . services . ssr ?. entry
377- ) {
378- ctx . nitro . options . renderer ??= { } ;
379- ctx . nitro . options . renderer . handler = resolve (
380- runtimeDir ,
381- "internal/vite/ssr-renderer"
382- ) ;
383- ctx . nitro ! . routing . sync ( ) ;
384- }
385-
386421 // Determine default Vite dist directory
387422 const publicDistDir = ( ctx . _publicDistDir =
388423 userConfig . build ?. outDir ||
0 commit comments