@@ -220,10 +220,39 @@ export default function vitePluginRsc(
220220 } ,
221221 } ,
222222 } ,
223+ // TODO: buildApp hook on v7
223224 builder : {
224225 sharedPlugins : true ,
225226 sharedConfigBuild : true ,
226227 async buildApp ( builder ) {
228+ if ( ! builder . environments . ssr ?. config . build . rollupOptions . input ) {
229+ isScanBuild = true
230+ builder . environments . rsc ! . config . build . write = false
231+ builder . environments . client ! . config . build . write = false
232+ await builder . build ( builder . environments . rsc ! )
233+ await builder . build ( builder . environments . client ! )
234+ isScanBuild = false
235+ builder . environments . rsc ! . config . build . write = true
236+ builder . environments . client ! . config . build . write = true
237+ await builder . build ( builder . environments . rsc ! )
238+ // sort for stable build
239+ clientReferenceMetaMap = sortObject ( clientReferenceMetaMap )
240+ serverResourcesMetaMap = sortObject ( serverResourcesMetaMap )
241+ await builder . build ( builder . environments . client ! )
242+
243+ const assetsManifestCode = `export default ${ JSON . stringify (
244+ buildAssetsManifest ,
245+ null ,
246+ 2 ,
247+ ) } `
248+ const manifestPath = path . join (
249+ builder . environments ! . rsc ! . config . build ! . outDir ! ,
250+ BUILD_ASSETS_MANIFEST_NAME ,
251+ )
252+ fs . writeFileSync ( manifestPath , assetsManifestCode )
253+ return
254+ }
255+
227256 isScanBuild = true
228257 builder . environments . rsc ! . config . build . write = false
229258 await builder . build ( builder . environments . rsc ! )
@@ -636,6 +665,7 @@ export default function vitePluginRsc(
636665 return
637666 } ,
638667 writeBundle ( ) {
668+ // TODO: this doesn't happen when no-ssr build
639669 if ( this . environment . name === 'ssr' ) {
640670 // output client manifest to non-client build directly.
641671 // this makes server build to be self-contained and deploy-able for cloudflare.
0 commit comments