11import { memoize , tinyassert } from "@hiogawa/utils" ;
2- import type { BundlerConfig , ImportManifestEntry } from "../types" ;
2+ import type { BundlerConfig , ImportManifestEntry , ModuleMap } from "../types" ;
33import {
4+ SERVER_DECODE_CLIENT_PREFIX ,
45 SERVER_REFERENCE_PREFIX ,
56 createReferenceCacheTag ,
67 removeReferenceCacheTag ,
78 setInternalRequire ,
89} from "./shared" ;
910
11+ // @ts -ignore
12+ import * as ReactServer from "react-server-dom-webpack/server.edge" ;
13+
1014let init = false ;
1115let requireModule ! : ( id : string ) => unknown ;
1216
@@ -23,6 +27,24 @@ export function setRequireModule(options: {
2327 // need memoize to return stable promise from __webpack_require__
2428 ( globalThis as any ) . __vite_rsc_server_require__ = memoize ( requireModule ) ;
2529
30+ ( globalThis as any ) . __vite_rsc_server_decode_client__ = memoize (
31+ async ( raw : string ) => {
32+ // restore client reference on server for decoding.
33+ // learned from https://github.com/lazarv/react-server/blob/79e7acebc6f4a8c930ad8422e2a4a9fdacfcce9b/packages/react-server/server/module-loader.mjs#L19
34+ const { id, name } = JSON . parse ( raw ) ;
35+ const reference = ReactServer . registerClientReference (
36+ ( ) => {
37+ throw new Error (
38+ `Unexpectedly client reference export '${ name } ' is called on server` ,
39+ ) ;
40+ } ,
41+ removeReferenceCacheTag ( id ) ,
42+ name ,
43+ ) ;
44+ return { [ name ] : reference } ;
45+ } ,
46+ ) ;
47+
2648 setInternalRequire ( ) ;
2749}
2850
@@ -54,6 +76,29 @@ export function createServerManifest(): BundlerConfig {
5476 ) ;
5577}
5678
79+ export function createServerDecodeClientManifest ( ) : ModuleMap {
80+ return new Proxy (
81+ { } ,
82+ {
83+ get ( _target , id : string ) {
84+ return new Proxy (
85+ { } ,
86+ {
87+ get ( _target , name : string ) {
88+ return {
89+ id : SERVER_DECODE_CLIENT_PREFIX + JSON . stringify ( { id, name } ) ,
90+ name,
91+ chunks : [ ] ,
92+ async : true ,
93+ } ;
94+ } ,
95+ } ,
96+ ) ;
97+ } ,
98+ } ,
99+ ) ;
100+ }
101+
57102export function createClientManifest ( ) : BundlerConfig {
58103 const cacheTag = import . meta. env . DEV ? createReferenceCacheTag ( ) : "" ;
59104
0 commit comments