@@ -347,6 +347,20 @@ export default function vitePluginRsc(
347347 return
348348 }
349349
350+ // Check if RSC outDir is inside SSR outDir to avoid SSR build overwriting RSC output
351+ const rscOutDir = builder . environments . rsc ! . config . build . outDir
352+ const ssrOutDir = builder . environments . ssr ! . config . build . outDir
353+ const rscInsideSsr = path
354+ . normalize ( rscOutDir )
355+ . startsWith ( path . normalize ( ssrOutDir ) + path . sep )
356+
357+ const tempRscOutDir = path . join (
358+ builder . config . root ,
359+ 'node_modules' ,
360+ '.vite-rsc-temp' ,
361+ 'rsc' ,
362+ )
363+
350364 // rsc -> ssr -> rsc -> client -> ssr
351365 manager . isScanBuild = true
352366 builder . environments . rsc ! . config . build . write = false
@@ -360,11 +374,31 @@ export default function vitePluginRsc(
360374 builder . environments . ssr ! . config . build . write = true
361375 logStep ( '[3/5] build rsc environment...' )
362376 await builder . build ( builder . environments . rsc ! )
377+
378+ // Evacuate RSC output to temp before SSR build overwrites it
379+ if ( rscInsideSsr ) {
380+ if ( fs . existsSync ( tempRscOutDir ) ) {
381+ fs . rmSync ( tempRscOutDir , { recursive : true } )
382+ }
383+ fs . mkdirSync ( path . dirname ( tempRscOutDir ) , { recursive : true } )
384+ fs . renameSync ( rscOutDir , tempRscOutDir )
385+ }
386+
363387 manager . stabilize ( )
364388 logStep ( '[4/5] build client environment...' )
365389 await builder . build ( builder . environments . client ! )
366390 logStep ( '[5/5] build ssr environment...' )
367391 await builder . build ( builder . environments . ssr ! )
392+
393+ // Restore RSC output from temp after SSR build
394+ if ( rscInsideSsr ) {
395+ if ( fs . existsSync ( rscOutDir ) ) {
396+ fs . rmSync ( rscOutDir , { recursive : true } )
397+ }
398+ fs . mkdirSync ( path . dirname ( rscOutDir ) , { recursive : true } )
399+ fs . renameSync ( tempRscOutDir , rscOutDir )
400+ }
401+
368402 writeAssetsManifest ( [ 'ssr' , 'rsc' ] )
369403 }
370404
0 commit comments