waku 0.22.3 → 0.22.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -114,25 +114,17 @@ export function rscHmrPlugin() {
114
114
  `);
115
115
  }
116
116
  },
117
- handleHotUpdate ({ file }) {
117
+ handleHotUpdate ({ file, server }) {
118
118
  if (file.endsWith('/pages.gen.ts')) {
119
119
  // auto generated file by fsRouterTypegenPlugin
120
120
  return [];
121
121
  }
122
- const moduleLoading = globalThis.__WAKU_CLIENT_MODULE_LOADING__;
123
- const moduleCache = globalThis.__WAKU_CLIENT_MODULE_CACHE__;
124
- if (!moduleLoading || !moduleCache) {
125
- return;
126
- }
127
- if (file.startsWith(viteServer.config.root + '/')) {
128
- file = file.slice(viteServer.config.root.length + 1);
129
- }
130
- const id = filePathToFileURL(file);
131
- if (moduleLoading.has(id)) {
132
- moduleLoading.set(id, viteServer.ssrLoadModule(file).then((m)=>{
133
- // XXX There can be a race condition, but it should be very rare.
134
- moduleCache.set(id, m);
135
- }));
122
+ handleModuleUpdate(file, server);
123
+ const module = server.moduleGraph.getModuleById(file);
124
+ if (module?.file?.endsWith('.module.css')) {
125
+ module.importers.forEach((importer)=>{
126
+ handleModuleUpdate(importer.file, server);
127
+ });
136
128
  }
137
129
  }
138
130
  };
@@ -213,5 +205,20 @@ export function hotUpdate(vite, payload) {
213
205
  moduleImport(vite, payload.data);
214
206
  }
215
207
  }
208
+ function handleModuleUpdate(filePath, viteServer) {
209
+ const moduleLoading = globalThis.__WAKU_CLIENT_MODULE_LOADING__;
210
+ const moduleCache = globalThis.__WAKU_CLIENT_MODULE_CACHE__;
211
+ if (!moduleLoading || !moduleCache) {
212
+ return;
213
+ }
214
+ const normalizedPath = filePath.startsWith(viteServer.config.root + '/') ? filePath.slice(viteServer.config.root.length + 1) : filePath;
215
+ const id = filePathToFileURL(normalizedPath);
216
+ if (moduleLoading.has(id)) {
217
+ moduleLoading.set(id, viteServer.ssrLoadModule(normalizedPath).then((m)=>{
218
+ // XXX There can be a race condition, but it should be very rare.
219
+ moduleCache.set(id, m);
220
+ }));
221
+ }
222
+ }
216
223
 
217
224
  //# sourceMappingURL=vite-plugin-rsc-hmr.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/plugins/vite-plugin-rsc-hmr.ts"],"sourcesContent":["import type {\n HMRBroadcaster,\n HtmlTagDescriptor,\n Plugin,\n TransformResult,\n ViteDevServer,\n} from 'vite';\n\nimport {\n joinPath,\n fileURLToFilePath,\n decodeFilePathFromAbsolute,\n filePathToFileURL,\n} from '../utils/path.js';\n\ntype ModuleImportResult = TransformResult & {\n id: string;\n // non-transformed result of `TransformResult.code`\n source: string;\n css?: boolean;\n};\n\nconst injectingHmrCode = `\nimport { createHotContext as __vite__createHotContext } from \"/@vite/client\";\nimport.meta.hot = __vite__createHotContext(import.meta.url);\n\nif (import.meta.hot && !globalThis.__WAKU_HMR_CONFIGURED__) {\n globalThis.__WAKU_HMR_CONFIGURED__ = true;\n import.meta.hot.on('vite:afterUpdate', (data) => {\n if (data.type === 'update') {\n for (const update of data.updates) {\n if (\n update.type === 'js-update' &&\n globalThis.__WAKU_CLIENT_MODULE_LOADING__.has(update.path)\n ) {\n globalThis.__WAKU_CLIENT_MODULE_LOADING__.set(update.path,\n globalThis.__WAKU_CLIENT_IMPORT__(update.path + '?t=' + update.timestamp).then((m) => {\n globalThis.__WAKU_CLIENT_MODULE_CACHE__.set(update.path, m);\n })\n );\n }\n }\n }\n });\n import.meta.hot.on('rsc-reload', () => {\n globalThis.__WAKU_RSC_RELOAD_LISTENERS__?.forEach((l) => l());\n });\n import.meta.hot.on('hot-import', (data) => import(/* @vite-ignore */ data));\n import.meta.hot.on('module-import', (data) => {\n // remove element with the same 'waku-module-id'\n let script = document.querySelector('script[waku-module-id=\"' + data.id + '\"]');\n let style = document.querySelector('style[waku-module-id=\"' + data.id + '\"]');\n script?.remove();\n const code = data.code;\n script = document.createElement('script');\n script.type = 'module';\n script.text = code;\n script.setAttribute('waku-module-id', data.id);\n document.head.appendChild(script);\n // avoid HMR flash by first applying the new and removing the old styles \n if (style) {\n queueMicrotask(() => style.parentElement?.removeChild(style));\n }\n });\n import.meta.hot.on('vite:invalidate', () => {\n // FIXME is there a better solution?\n location.reload();\n });\n}\n`;\n\nexport function rscHmrPlugin(): Plugin {\n const wakuMinimalClientDist = decodeFilePathFromAbsolute(\n joinPath(fileURLToFilePath(import.meta.url), '../../../minimal/client.js'),\n );\n const wakuRouterClientDist = decodeFilePathFromAbsolute(\n joinPath(fileURLToFilePath(import.meta.url), '../../../router/client.js'),\n );\n let viteServer: ViteDevServer;\n return {\n name: 'rsc-hmr-plugin',\n enforce: 'post',\n configureServer(server) {\n viteServer = server;\n },\n async transformIndexHtml() {\n return [\n ...(await generateInitialScripts(viteServer)),\n {\n tag: 'script',\n attrs: { type: 'module', async: true },\n children: injectingHmrCode,\n injectTo: 'head',\n },\n ];\n },\n async transform(code, id) {\n if (id.startsWith(wakuMinimalClientDist)) {\n // FIXME this is fragile. Can we do it better?\n return code.replace(\n /\\nexport const fetchRsc = \\(.*?\\)=>\\{/,\n (m) =>\n m +\n `\n{\n const refetchRsc = () => {\n delete fetchCache[ENTRY];\n const data = fetchRsc(rscPath, rscParams, fetchCache);\n fetchCache[SET_ELEMENTS](() => data);\n };\n globalThis.__WAKU_RSC_RELOAD_LISTENERS__ ||= [];\n const index = globalThis.__WAKU_RSC_RELOAD_LISTENERS__.indexOf(globalThis.__WAKU_REFETCH_RSC__);\n if (index !== -1) {\n globalThis.__WAKU_RSC_RELOAD_LISTENERS__.splice(index, 1, refetchRsc);\n } else {\n globalThis.__WAKU_RSC_RELOAD_LISTENERS__.push(refetchRsc);\n }\n globalThis.__WAKU_REFETCH_RSC__ = refetchRsc;\n}\n`,\n );\n } else if (id.startsWith(wakuRouterClientDist)) {\n // FIXME this is fragile. Can we do it better?\n return code.replace(\n /\\nconst InnerRouter = \\(.*?\\)=>\\{/,\n (m) =>\n m +\n `\n{\n const refetchRoute = () => {\n staticPathSet.clear();\n routerData[2].clear(); // cacheIdSet\n const rscPath = encodeRoutePath(route.path);\n const rscParams = createRscParams(route.query, []);\n refetch(rscPath, rscParams);\n };\n globalThis.__WAKU_RSC_RELOAD_LISTENERS__ ||= [];\n const index = globalThis.__WAKU_RSC_RELOAD_LISTENERS__.indexOf(globalThis.__WAKU_REFETCH_ROUTE__);\n if (index !== -1) {\n globalThis.__WAKU_RSC_RELOAD_LISTENERS__.splice(index, 1, refetchRoute);\n } else {\n globalThis.__WAKU_RSC_RELOAD_LISTENERS__.unshift(refetchRoute);\n }\n globalThis.__WAKU_REFETCH_ROUTE__ = refetchRoute;\n}\n`,\n );\n }\n },\n handleHotUpdate({ file }) {\n if (file.endsWith('/pages.gen.ts')) {\n // auto generated file by fsRouterTypegenPlugin\n return [];\n }\n const moduleLoading = (globalThis as any).__WAKU_CLIENT_MODULE_LOADING__;\n const moduleCache = (globalThis as any).__WAKU_CLIENT_MODULE_CACHE__;\n if (!moduleLoading || !moduleCache) {\n return;\n }\n if (file.startsWith(viteServer.config.root + '/')) {\n file = file.slice(viteServer.config.root.length + 1);\n }\n const id = filePathToFileURL(file);\n if (moduleLoading.has(id)) {\n moduleLoading.set(\n id,\n viteServer.ssrLoadModule(file).then((m) => {\n // XXX There can be a race condition, but it should be very rare.\n moduleCache.set(id, m);\n }),\n );\n }\n },\n };\n}\n\nconst pendingMap = new WeakMap<ReturnType<typeof viteHot>, Set<string>>();\n\nfunction viteHot(viteServer: ViteDevServer): HMRBroadcaster {\n return viteServer.hot ?? viteServer.ws;\n}\n\nfunction hotImport(viteServer: ViteDevServer, source: string) {\n const hot = viteHot(viteServer);\n let sourceSet = pendingMap.get(hot);\n if (!sourceSet) {\n sourceSet = new Set();\n pendingMap.set(hot, sourceSet);\n hot.on('connection', () => {\n for (const source of sourceSet!) {\n hot.send({\n type: 'custom',\n event: 'hot-import',\n data: source,\n });\n }\n });\n }\n sourceSet.add(source);\n hot.send({ type: 'custom', event: 'hot-import', data: source });\n}\n\nconst modulePendingMap = new WeakMap<\n ReturnType<typeof viteHot>,\n Map<string, ModuleImportResult>\n>();\n\nfunction moduleImport(viteServer: ViteDevServer, result: ModuleImportResult) {\n const hot = viteHot(viteServer);\n let sources = modulePendingMap.get(hot);\n if (!sources) {\n sources = new Map();\n modulePendingMap.set(hot, sources);\n }\n sources.set(result.id, result);\n hot.send({ type: 'custom', event: 'module-import', data: result });\n}\n\nasync function generateInitialScripts(\n viteServer: ViteDevServer,\n): Promise<HtmlTagDescriptor[]> {\n const hot = viteHot(viteServer);\n const sources = modulePendingMap.get(hot);\n\n if (!sources) {\n return [];\n }\n\n const scripts: HtmlTagDescriptor[] = [];\n\n for (const result of sources.values()) {\n scripts.push({\n tag: 'script',\n attrs: {\n type: 'module',\n async: true,\n blocking: 'render',\n 'waku-module-id': result.id,\n },\n children: result.code,\n injectTo: 'head',\n });\n }\n return scripts;\n}\n\nexport type HotUpdatePayload =\n | { type: 'full-reload' }\n | { type: 'custom'; event: 'rsc-reload' }\n | { type: 'custom'; event: 'hot-import'; data: string }\n | { type: 'custom'; event: 'module-import'; data: ModuleImportResult };\n\nexport function hotUpdate(vite: ViteDevServer, payload: HotUpdatePayload) {\n const hot = viteHot(vite);\n if (payload.type === 'full-reload') {\n hot.send(payload);\n } else if (payload.event === 'rsc-reload') {\n hot.send(payload);\n } else if (payload.event === 'hot-import') {\n hotImport(vite, payload.data);\n } else if (payload.event === 'module-import') {\n moduleImport(vite, payload.data);\n }\n}\n"],"names":["joinPath","fileURLToFilePath","decodeFilePathFromAbsolute","filePathToFileURL","injectingHmrCode","rscHmrPlugin","wakuMinimalClientDist","url","wakuRouterClientDist","viteServer","name","enforce","configureServer","server","transformIndexHtml","generateInitialScripts","tag","attrs","type","async","children","injectTo","transform","code","id","startsWith","replace","m","handleHotUpdate","file","endsWith","moduleLoading","globalThis","__WAKU_CLIENT_MODULE_LOADING__","moduleCache","__WAKU_CLIENT_MODULE_CACHE__","config","root","slice","length","has","set","ssrLoadModule","then","pendingMap","WeakMap","viteHot","hot","ws","hotImport","source","sourceSet","get","Set","on","send","event","data","add","modulePendingMap","moduleImport","result","sources","Map","scripts","values","push","blocking","hotUpdate","vite","payload"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/lib/plugins/vite-plugin-rsc-hmr.ts"],"sourcesContent":["import type {\n NormalizedHotChannel,\n HtmlTagDescriptor,\n Plugin,\n TransformResult,\n ViteDevServer,\n} from 'vite';\n\nimport {\n joinPath,\n fileURLToFilePath,\n decodeFilePathFromAbsolute,\n filePathToFileURL,\n} from '../utils/path.js';\n\ntype ModuleImportResult = TransformResult & {\n id: string;\n // non-transformed result of `TransformResult.code`\n source: string;\n css?: boolean;\n};\n\nconst injectingHmrCode = `\nimport { createHotContext as __vite__createHotContext } from \"/@vite/client\";\nimport.meta.hot = __vite__createHotContext(import.meta.url);\n\nif (import.meta.hot && !globalThis.__WAKU_HMR_CONFIGURED__) {\n globalThis.__WAKU_HMR_CONFIGURED__ = true;\n import.meta.hot.on('vite:afterUpdate', (data) => {\n if (data.type === 'update') {\n for (const update of data.updates) {\n if (\n update.type === 'js-update' &&\n globalThis.__WAKU_CLIENT_MODULE_LOADING__.has(update.path)\n ) {\n globalThis.__WAKU_CLIENT_MODULE_LOADING__.set(update.path,\n globalThis.__WAKU_CLIENT_IMPORT__(update.path + '?t=' + update.timestamp).then((m) => {\n globalThis.__WAKU_CLIENT_MODULE_CACHE__.set(update.path, m);\n })\n );\n }\n }\n }\n });\n import.meta.hot.on('rsc-reload', () => {\n globalThis.__WAKU_RSC_RELOAD_LISTENERS__?.forEach((l) => l());\n });\n import.meta.hot.on('hot-import', (data) => import(/* @vite-ignore */ data));\n import.meta.hot.on('module-import', (data) => {\n // remove element with the same 'waku-module-id'\n let script = document.querySelector('script[waku-module-id=\"' + data.id + '\"]');\n let style = document.querySelector('style[waku-module-id=\"' + data.id + '\"]');\n script?.remove();\n const code = data.code;\n script = document.createElement('script');\n script.type = 'module';\n script.text = code;\n script.setAttribute('waku-module-id', data.id);\n document.head.appendChild(script);\n // avoid HMR flash by first applying the new and removing the old styles \n if (style) {\n queueMicrotask(() => style.parentElement?.removeChild(style));\n }\n });\n import.meta.hot.on('vite:invalidate', () => {\n // FIXME is there a better solution?\n location.reload();\n });\n}\n`;\n\nexport function rscHmrPlugin(): Plugin {\n const wakuMinimalClientDist = decodeFilePathFromAbsolute(\n joinPath(fileURLToFilePath(import.meta.url), '../../../minimal/client.js'),\n );\n const wakuRouterClientDist = decodeFilePathFromAbsolute(\n joinPath(fileURLToFilePath(import.meta.url), '../../../router/client.js'),\n );\n let viteServer: ViteDevServer;\n return {\n name: 'rsc-hmr-plugin',\n enforce: 'post',\n configureServer(server) {\n viteServer = server;\n },\n async transformIndexHtml() {\n return [\n ...(await generateInitialScripts(viteServer)),\n {\n tag: 'script',\n attrs: { type: 'module', async: true },\n children: injectingHmrCode,\n injectTo: 'head',\n },\n ];\n },\n async transform(code, id) {\n if (id.startsWith(wakuMinimalClientDist)) {\n // FIXME this is fragile. Can we do it better?\n return code.replace(\n /\\nexport const fetchRsc = \\(.*?\\)=>\\{/,\n (m) =>\n m +\n `\n{\n const refetchRsc = () => {\n delete fetchCache[ENTRY];\n const data = fetchRsc(rscPath, rscParams, fetchCache);\n fetchCache[SET_ELEMENTS](() => data);\n };\n globalThis.__WAKU_RSC_RELOAD_LISTENERS__ ||= [];\n const index = globalThis.__WAKU_RSC_RELOAD_LISTENERS__.indexOf(globalThis.__WAKU_REFETCH_RSC__);\n if (index !== -1) {\n globalThis.__WAKU_RSC_RELOAD_LISTENERS__.splice(index, 1, refetchRsc);\n } else {\n globalThis.__WAKU_RSC_RELOAD_LISTENERS__.push(refetchRsc);\n }\n globalThis.__WAKU_REFETCH_RSC__ = refetchRsc;\n}\n`,\n );\n } else if (id.startsWith(wakuRouterClientDist)) {\n // FIXME this is fragile. Can we do it better?\n return code.replace(\n /\\nconst InnerRouter = \\(.*?\\)=>\\{/,\n (m) =>\n m +\n `\n{\n const refetchRoute = () => {\n staticPathSet.clear();\n routerData[2].clear(); // cacheIdSet\n const rscPath = encodeRoutePath(route.path);\n const rscParams = createRscParams(route.query, []);\n refetch(rscPath, rscParams);\n };\n globalThis.__WAKU_RSC_RELOAD_LISTENERS__ ||= [];\n const index = globalThis.__WAKU_RSC_RELOAD_LISTENERS__.indexOf(globalThis.__WAKU_REFETCH_ROUTE__);\n if (index !== -1) {\n globalThis.__WAKU_RSC_RELOAD_LISTENERS__.splice(index, 1, refetchRoute);\n } else {\n globalThis.__WAKU_RSC_RELOAD_LISTENERS__.unshift(refetchRoute);\n }\n globalThis.__WAKU_REFETCH_ROUTE__ = refetchRoute;\n}\n`,\n );\n }\n },\n handleHotUpdate({ file, server }) {\n if (file.endsWith('/pages.gen.ts')) {\n // auto generated file by fsRouterTypegenPlugin\n return [];\n }\n\n handleModuleUpdate(file, server);\n const module = server.moduleGraph.getModuleById(file);\n if (module?.file?.endsWith('.module.css')) {\n module.importers.forEach((importer) => {\n handleModuleUpdate(importer.file!, server);\n });\n }\n },\n };\n}\n\nconst pendingMap = new WeakMap<ReturnType<typeof viteHot>, Set<string>>();\n\nfunction viteHot(viteServer: ViteDevServer): NormalizedHotChannel {\n return viteServer.hot ?? viteServer.ws;\n}\n\nfunction hotImport(viteServer: ViteDevServer, source: string) {\n const hot = viteHot(viteServer);\n let sourceSet = pendingMap.get(hot);\n if (!sourceSet) {\n sourceSet = new Set();\n pendingMap.set(hot, sourceSet);\n hot.on('connection', () => {\n for (const source of sourceSet!) {\n hot.send({\n type: 'custom',\n event: 'hot-import',\n data: source,\n });\n }\n });\n }\n sourceSet.add(source);\n hot.send({ type: 'custom', event: 'hot-import', data: source });\n}\n\nconst modulePendingMap = new WeakMap<\n ReturnType<typeof viteHot>,\n Map<string, ModuleImportResult>\n>();\n\nfunction moduleImport(viteServer: ViteDevServer, result: ModuleImportResult) {\n const hot = viteHot(viteServer);\n let sources = modulePendingMap.get(hot);\n if (!sources) {\n sources = new Map();\n modulePendingMap.set(hot, sources);\n }\n sources.set(result.id, result);\n hot.send({ type: 'custom', event: 'module-import', data: result });\n}\n\nasync function generateInitialScripts(\n viteServer: ViteDevServer,\n): Promise<HtmlTagDescriptor[]> {\n const hot = viteHot(viteServer);\n const sources = modulePendingMap.get(hot);\n\n if (!sources) {\n return [];\n }\n\n const scripts: HtmlTagDescriptor[] = [];\n\n for (const result of sources.values()) {\n scripts.push({\n tag: 'script',\n attrs: {\n type: 'module',\n async: true,\n blocking: 'render',\n 'waku-module-id': result.id,\n },\n children: result.code,\n injectTo: 'head',\n });\n }\n return scripts;\n}\n\nexport type HotUpdatePayload =\n | { type: 'full-reload' }\n | { type: 'custom'; event: 'rsc-reload' }\n | { type: 'custom'; event: 'hot-import'; data: string }\n | { type: 'custom'; event: 'module-import'; data: ModuleImportResult };\n\nexport function hotUpdate(vite: ViteDevServer, payload: HotUpdatePayload) {\n const hot = viteHot(vite);\n if (payload.type === 'full-reload') {\n hot.send(payload);\n } else if (payload.event === 'rsc-reload') {\n hot.send(payload);\n } else if (payload.event === 'hot-import') {\n hotImport(vite, payload.data);\n } else if (payload.event === 'module-import') {\n moduleImport(vite, payload.data);\n }\n}\n\nfunction handleModuleUpdate(filePath: string, viteServer: ViteDevServer) {\n const moduleLoading = (globalThis as any).__WAKU_CLIENT_MODULE_LOADING__;\n const moduleCache = (globalThis as any).__WAKU_CLIENT_MODULE_CACHE__;\n if (!moduleLoading || !moduleCache) {\n return;\n }\n\n const normalizedPath = filePath.startsWith(viteServer.config.root + '/')\n ? filePath.slice(viteServer.config.root.length + 1)\n : filePath;\n const id = filePathToFileURL(normalizedPath);\n if (moduleLoading.has(id)) {\n moduleLoading.set(\n id,\n viteServer.ssrLoadModule(normalizedPath).then((m) => {\n // XXX There can be a race condition, but it should be very rare.\n moduleCache.set(id, m);\n }),\n );\n }\n}\n"],"names":["joinPath","fileURLToFilePath","decodeFilePathFromAbsolute","filePathToFileURL","injectingHmrCode","rscHmrPlugin","wakuMinimalClientDist","url","wakuRouterClientDist","viteServer","name","enforce","configureServer","server","transformIndexHtml","generateInitialScripts","tag","attrs","type","async","children","injectTo","transform","code","id","startsWith","replace","m","handleHotUpdate","file","endsWith","handleModuleUpdate","module","moduleGraph","getModuleById","importers","forEach","importer","pendingMap","WeakMap","viteHot","hot","ws","hotImport","source","sourceSet","get","Set","set","on","send","event","data","add","modulePendingMap","moduleImport","result","sources","Map","scripts","values","push","blocking","hotUpdate","vite","payload","filePath","moduleLoading","globalThis","__WAKU_CLIENT_MODULE_LOADING__","moduleCache","__WAKU_CLIENT_MODULE_CACHE__","normalizedPath","config","root","slice","length","has","ssrLoadModule","then"],"mappings":"AAQA,SACEA,QAAQ,EACRC,iBAAiB,EACjBC,0BAA0B,EAC1BC,iBAAiB,QACZ,mBAAmB;AAS1B,MAAMC,mBAAmB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+C1B,CAAC;AAED,OAAO,SAASC;IACd,MAAMC,wBAAwBJ,2BAC5BF,SAASC,kBAAkB,YAAYM,GAAG,GAAG;IAE/C,MAAMC,uBAAuBN,2BAC3BF,SAASC,kBAAkB,YAAYM,GAAG,GAAG;IAE/C,IAAIE;IACJ,OAAO;QACLC,MAAM;QACNC,SAAS;QACTC,iBAAgBC,MAAM;YACpBJ,aAAaI;QACf;QACA,MAAMC;YACJ,OAAO;mBACD,MAAMC,uBAAuBN;gBACjC;oBACEO,KAAK;oBACLC,OAAO;wBAAEC,MAAM;wBAAUC,OAAO;oBAAK;oBACrCC,UAAUhB;oBACViB,UAAU;gBACZ;aACD;QACH;QACA,MAAMC,WAAUC,IAAI,EAAEC,EAAE;YACtB,IAAIA,GAAGC,UAAU,CAACnB,wBAAwB;gBACxC,8CAA8C;gBAC9C,OAAOiB,KAAKG,OAAO,CACjB,yCACA,CAACC,IACCA,IACA,CAAC;;;;;;;;;;;;;;;;AAgBb,CAAC;YAEK,OAAO,IAAIH,GAAGC,UAAU,CAACjB,uBAAuB;gBAC9C,8CAA8C;gBAC9C,OAAOe,KAAKG,OAAO,CACjB,qCACA,CAACC,IACCA,IACA,CAAC;;;;;;;;;;;;;;;;;;AAkBb,CAAC;YAEK;QACF;QACAC,iBAAgB,EAAEC,IAAI,EAAEhB,MAAM,EAAE;YAC9B,IAAIgB,KAAKC,QAAQ,CAAC,kBAAkB;gBAClC,+CAA+C;gBAC/C,OAAO,EAAE;YACX;YAEAC,mBAAmBF,MAAMhB;YACzB,MAAMmB,SAASnB,OAAOoB,WAAW,CAACC,aAAa,CAACL;YAChD,IAAIG,QAAQH,MAAMC,SAAS,gBAAgB;gBACzCE,OAAOG,SAAS,CAACC,OAAO,CAAC,CAACC;oBACxBN,mBAAmBM,SAASR,IAAI,EAAGhB;gBACrC;YACF;QACF;IACF;AACF;AAEA,MAAMyB,aAAa,IAAIC;AAEvB,SAASC,QAAQ/B,UAAyB;IACxC,OAAOA,WAAWgC,GAAG,IAAIhC,WAAWiC,EAAE;AACxC;AAEA,SAASC,UAAUlC,UAAyB,EAAEmC,MAAc;IAC1D,MAAMH,MAAMD,QAAQ/B;IACpB,IAAIoC,YAAYP,WAAWQ,GAAG,CAACL;IAC/B,IAAI,CAACI,WAAW;QACdA,YAAY,IAAIE;QAChBT,WAAWU,GAAG,CAACP,KAAKI;QACpBJ,IAAIQ,EAAE,CAAC,cAAc;YACnB,KAAK,MAAML,UAAUC,UAAY;gBAC/BJ,IAAIS,IAAI,CAAC;oBACPhC,MAAM;oBACNiC,OAAO;oBACPC,MAAMR;gBACR;YACF;QACF;IACF;IACAC,UAAUQ,GAAG,CAACT;IACdH,IAAIS,IAAI,CAAC;QAAEhC,MAAM;QAAUiC,OAAO;QAAcC,MAAMR;IAAO;AAC/D;AAEA,MAAMU,mBAAmB,IAAIf;AAK7B,SAASgB,aAAa9C,UAAyB,EAAE+C,MAA0B;IACzE,MAAMf,MAAMD,QAAQ/B;IACpB,IAAIgD,UAAUH,iBAAiBR,GAAG,CAACL;IACnC,IAAI,CAACgB,SAAS;QACZA,UAAU,IAAIC;QACdJ,iBAAiBN,GAAG,CAACP,KAAKgB;IAC5B;IACAA,QAAQT,GAAG,CAACQ,OAAOhC,EAAE,EAAEgC;IACvBf,IAAIS,IAAI,CAAC;QAAEhC,MAAM;QAAUiC,OAAO;QAAiBC,MAAMI;IAAO;AAClE;AAEA,eAAezC,uBACbN,UAAyB;IAEzB,MAAMgC,MAAMD,QAAQ/B;IACpB,MAAMgD,UAAUH,iBAAiBR,GAAG,CAACL;IAErC,IAAI,CAACgB,SAAS;QACZ,OAAO,EAAE;IACX;IAEA,MAAME,UAA+B,EAAE;IAEvC,KAAK,MAAMH,UAAUC,QAAQG,MAAM,GAAI;QACrCD,QAAQE,IAAI,CAAC;YACX7C,KAAK;YACLC,OAAO;gBACLC,MAAM;gBACNC,OAAO;gBACP2C,UAAU;gBACV,kBAAkBN,OAAOhC,EAAE;YAC7B;YACAJ,UAAUoC,OAAOjC,IAAI;YACrBF,UAAU;QACZ;IACF;IACA,OAAOsC;AACT;AAQA,OAAO,SAASI,UAAUC,IAAmB,EAAEC,OAAyB;IACtE,MAAMxB,MAAMD,QAAQwB;IACpB,IAAIC,QAAQ/C,IAAI,KAAK,eAAe;QAClCuB,IAAIS,IAAI,CAACe;IACX,OAAO,IAAIA,QAAQd,KAAK,KAAK,cAAc;QACzCV,IAAIS,IAAI,CAACe;IACX,OAAO,IAAIA,QAAQd,KAAK,KAAK,cAAc;QACzCR,UAAUqB,MAAMC,QAAQb,IAAI;IAC9B,OAAO,IAAIa,QAAQd,KAAK,KAAK,iBAAiB;QAC5CI,aAAaS,MAAMC,QAAQb,IAAI;IACjC;AACF;AAEA,SAASrB,mBAAmBmC,QAAgB,EAAEzD,UAAyB;IACrE,MAAM0D,gBAAgB,AAACC,WAAmBC,8BAA8B;IACxE,MAAMC,cAAc,AAACF,WAAmBG,4BAA4B;IACpE,IAAI,CAACJ,iBAAiB,CAACG,aAAa;QAClC;IACF;IAEA,MAAME,iBAAiBN,SAASzC,UAAU,CAAChB,WAAWgE,MAAM,CAACC,IAAI,GAAG,OAChER,SAASS,KAAK,CAAClE,WAAWgE,MAAM,CAACC,IAAI,CAACE,MAAM,GAAG,KAC/CV;IACJ,MAAM1C,KAAKrB,kBAAkBqE;IAC7B,IAAIL,cAAcU,GAAG,CAACrD,KAAK;QACzB2C,cAAcnB,GAAG,CACfxB,IACAf,WAAWqE,aAAa,CAACN,gBAAgBO,IAAI,CAAC,CAACpD;YAC7C,iEAAiE;YACjE2C,YAAYtB,GAAG,CAACxB,IAAIG;QACtB;IAEJ;AACF"}
@@ -88,9 +88,12 @@ const defaultFetchCache = {};
88
88
  return value;
89
89
  };
90
90
  const prefetchedParams = new WeakMap();
91
- const fetchRscInternal = (url, rscParams, fetchCache)=>{
91
+ const prefetchedTemporaryReferences = new WeakMap();
92
+ const fetchRscInternal = (url, rscParams, temporaryReferences, fetchCache)=>{
92
93
  const enhanceFetch = fetchCache[ENHANCE_FETCH] || ((f)=>f);
93
- return rscParams === undefined ? enhanceFetch(fetch)(url) : rscParams instanceof URLSearchParams ? enhanceFetch(fetch)(url + '?' + rscParams) : encodeReply(rscParams).then((body)=>enhanceFetch(fetch)(url, {
94
+ return rscParams === undefined ? enhanceFetch(fetch)(url) : rscParams instanceof URLSearchParams ? enhanceFetch(fetch)(url + '?' + rscParams) : encodeReply(rscParams, {
95
+ temporaryReferences
96
+ }).then((body)=>enhanceFetch(fetch)(url, {
94
97
  method: 'POST',
95
98
  body
96
99
  }));
@@ -101,15 +104,17 @@ export const fetchRsc = (rscPath, rscParams, fetchCache = defaultFetchCache)=>{
101
104
  return entry[2];
102
105
  }
103
106
  const enhanceCreateData = fetchCache[ENHANCE_CREATE_DATA] || ((d)=>d);
104
- const createData = (responsePromise)=>createFromFetch(checkStatus(responsePromise), {
105
- callServer: (funcId, args)=>unstable_callServerRsc(funcId, args, fetchCache)
106
- });
107
107
  const prefetched = globalThis.__WAKU_PREFETCHED__ ||= {};
108
108
  const url = BASE_RSC_PATH + encodeRscPath(rscPath);
109
109
  const hasValidPrefetchedResponse = !!prefetched[url] && // HACK .has() is for the initial hydration
110
110
  // It's limited and may result in a wrong result. FIXME
111
111
  (!prefetchedParams.has(prefetched[url]) || prefetchedParams.get(prefetched[url]) === rscParams);
112
- const responsePromise = hasValidPrefetchedResponse ? prefetched[url] : fetchRscInternal(url, rscParams, fetchCache);
112
+ const temporaryReferences = prefetchedTemporaryReferences.get(prefetched[url]) || createTemporaryReferenceSet();
113
+ const createData = (responsePromise)=>createFromFetch(checkStatus(responsePromise), {
114
+ callServer: (funcId, args)=>unstable_callServerRsc(funcId, args, fetchCache),
115
+ temporaryReferences
116
+ });
117
+ const responsePromise = hasValidPrefetchedResponse ? prefetched[url] : fetchRscInternal(url, rscParams, temporaryReferences, fetchCache);
113
118
  delete prefetched[url];
114
119
  const data = enhanceCreateData(createData)(responsePromise);
115
120
  fetchCache[ENTRY] = [
@@ -123,8 +128,10 @@ export const prefetchRsc = (rscPath, rscParams, fetchCache = defaultFetchCache)=
123
128
  const prefetched = globalThis.__WAKU_PREFETCHED__ ||= {};
124
129
  const url = BASE_RSC_PATH + encodeRscPath(rscPath);
125
130
  if (!(url in prefetched)) {
126
- prefetched[url] = fetchRscInternal(url, rscParams, fetchCache);
131
+ const temporaryReferences = createTemporaryReferenceSet();
132
+ prefetched[url] = fetchRscInternal(url, rscParams, temporaryReferences, fetchCache);
127
133
  prefetchedParams.set(prefetched[url], rscParams);
134
+ prefetchedTemporaryReferences.set(prefetched[url], temporaryReferences);
128
135
  }
129
136
  };
130
137
  const RefetchContext = createContext(()=>{
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/minimal/client.ts"],"sourcesContent":["/// <reference types=\"react/canary\" />\n'use client';\n\nimport {\n createContext,\n createElement,\n memo,\n use,\n useCallback,\n useEffect,\n useState,\n Component,\n} from 'react';\nimport type { ReactNode } from 'react';\nimport RSDWClient from 'react-server-dom-webpack/client';\n\nimport { createCustomError } from '../lib/utils/custom-errors.js';\nimport { encodeRscPath, encodeFuncId } from '../lib/renderers/utils.js';\n\nconst { createFromFetch, encodeReply, createTemporaryReferenceSet } =\n RSDWClient;\n\ndeclare global {\n interface ImportMeta {\n readonly env: Record<string, string>;\n }\n}\n\nconst DEFAULT_HTML_HEAD = [\n createElement('meta', { charSet: 'utf-8' }),\n createElement('meta', {\n name: 'viewport',\n content: 'width=device-width, initial-scale=1',\n }),\n createElement('meta', { name: 'generator', content: 'Waku' }),\n];\n\nconst BASE_RSC_PATH = `${import.meta.env?.WAKU_CONFIG_BASE_PATH}${\n import.meta.env?.WAKU_CONFIG_RSC_BASE\n}/`;\n\nconst checkStatus = async (\n responsePromise: Promise<Response>,\n): Promise<Response> => {\n const response = await responsePromise;\n if (!response.ok) {\n const location = response.headers.get('location');\n const err = createCustomError(\n (await response.text()) || response.statusText,\n {\n status: response.status,\n ...(location && { location }),\n },\n );\n throw err;\n }\n return response;\n};\n\ntype Elements = Record<string, unknown>;\n\n// HACK I'm not super happy with this hack\nconst erroredElementsPromiseMap = new WeakMap<\n Promise<Elements>,\n Promise<Elements>\n>();\n\nconst getCached = <T>(c: () => T, m: WeakMap<object, T>, k: object): T =>\n (m.has(k) ? m : m.set(k, c())).get(k) as T;\nconst cache1 = new WeakMap();\nconst mergeElementsPromise = (\n a: Promise<Elements>,\n b: Promise<Elements>,\n): Promise<Elements> => {\n const getResult = () => {\n const p = Promise.all([erroredElementsPromiseMap.get(a) || a, b])\n .then(([a, b]) => {\n const nextElements = { ...a, ...b };\n delete nextElements._value;\n return nextElements;\n })\n .catch((err) => {\n erroredElementsPromiseMap.set(p, a);\n throw err;\n });\n return p;\n };\n const cache2 = getCached(() => new WeakMap(), cache1, a);\n return getCached(getResult, cache2, b);\n};\n\ntype SetElements = (\n updater: (prev: Promise<Elements>) => Promise<Elements>,\n) => void;\ntype EnhanceFetch = (fetchFn: typeof fetch) => typeof fetch;\ntype EnhanceCreateData = (\n createData: (responsePromise: Promise<Response>) => Promise<Elements>,\n) => (responsePromise: Promise<Response>) => Promise<Elements>;\n\nconst ENTRY = 'e';\nconst SET_ELEMENTS = 's';\nconst ENHANCE_FETCH = 'f';\nconst ENHANCE_CREATE_DATA = 'd';\n\ntype FetchCache = {\n [ENTRY]?: [\n rscPath: string,\n rscParams: unknown,\n elementsPromise: Promise<Elements>,\n ];\n [SET_ELEMENTS]?: SetElements;\n [ENHANCE_FETCH]?: EnhanceFetch | undefined;\n [ENHANCE_CREATE_DATA]?: EnhanceCreateData | undefined;\n};\n\nconst defaultFetchCache: FetchCache = {};\n\n/**\n * callServer callback\n * This is not a public API.\n */\nexport const unstable_callServerRsc = async (\n funcId: string,\n args: unknown[],\n fetchCache = defaultFetchCache,\n) => {\n const enhanceFetch = fetchCache[ENHANCE_FETCH] || ((f) => f);\n const enhanceCreateData = fetchCache[ENHANCE_CREATE_DATA] || ((d) => d);\n const temporaryReferences = createTemporaryReferenceSet();\n const createData = (responsePromise: Promise<Response>) =>\n createFromFetch<Elements>(checkStatus(responsePromise), {\n callServer: (funcId: string, args: unknown[]) =>\n unstable_callServerRsc(funcId, args, fetchCache),\n temporaryReferences,\n });\n const url = BASE_RSC_PATH + encodeRscPath(encodeFuncId(funcId));\n const responsePromise =\n args.length === 1 && args[0] instanceof URLSearchParams\n ? enhanceFetch(fetch)(url + '?' + args[0])\n : encodeReply(args, { temporaryReferences }).then((body) =>\n enhanceFetch(fetch)(url, { method: 'POST', body }),\n );\n const data = enhanceCreateData(createData)(responsePromise);\n const value = (await data)._value;\n // FIXME this causes rerenders even if data is empty\n fetchCache[SET_ELEMENTS]?.((prev) => mergeElementsPromise(prev, data));\n return value;\n};\n\nconst prefetchedParams = new WeakMap<Promise<unknown>, unknown>();\n\nconst fetchRscInternal = (\n url: string,\n rscParams: unknown,\n fetchCache: FetchCache,\n) => {\n const enhanceFetch = fetchCache[ENHANCE_FETCH] || ((f) => f);\n return rscParams === undefined\n ? enhanceFetch(fetch)(url)\n : rscParams instanceof URLSearchParams\n ? enhanceFetch(fetch)(url + '?' + rscParams)\n : encodeReply(rscParams).then((body) =>\n enhanceFetch(fetch)(url, { method: 'POST', body }),\n );\n};\n\nexport const fetchRsc = (\n rscPath: string,\n rscParams?: unknown,\n fetchCache = defaultFetchCache,\n): Promise<Elements> => {\n const entry = fetchCache[ENTRY];\n if (entry && entry[0] === rscPath && entry[1] === rscParams) {\n return entry[2];\n }\n const enhanceCreateData = fetchCache[ENHANCE_CREATE_DATA] || ((d) => d);\n const createData = (responsePromise: Promise<Response>) =>\n createFromFetch<Elements>(checkStatus(responsePromise), {\n callServer: (funcId: string, args: unknown[]) =>\n unstable_callServerRsc(funcId, args, fetchCache),\n });\n const prefetched = ((globalThis as any).__WAKU_PREFETCHED__ ||= {});\n const url = BASE_RSC_PATH + encodeRscPath(rscPath);\n const hasValidPrefetchedResponse =\n !!prefetched[url] &&\n // HACK .has() is for the initial hydration\n // It's limited and may result in a wrong result. FIXME\n (!prefetchedParams.has(prefetched[url]) ||\n prefetchedParams.get(prefetched[url]) === rscParams);\n const responsePromise = hasValidPrefetchedResponse\n ? prefetched[url]\n : fetchRscInternal(url, rscParams, fetchCache);\n delete prefetched[url];\n const data = enhanceCreateData(createData)(responsePromise);\n fetchCache[ENTRY] = [rscPath, rscParams, data];\n return data;\n};\n\nexport const prefetchRsc = (\n rscPath: string,\n rscParams?: unknown,\n fetchCache = defaultFetchCache,\n): void => {\n const prefetched = ((globalThis as any).__WAKU_PREFETCHED__ ||= {});\n const url = BASE_RSC_PATH + encodeRscPath(rscPath);\n if (!(url in prefetched)) {\n prefetched[url] = fetchRscInternal(url, rscParams, fetchCache);\n prefetchedParams.set(prefetched[url], rscParams);\n }\n};\n\nconst RefetchContext = createContext<\n (rscPath: string, rscParams?: unknown) => void\n>(() => {\n throw new Error('Missing Root component');\n});\nconst ElementsContext = createContext<Promise<Elements> | null>(null);\n\nexport const Root = ({\n initialRscPath,\n initialRscParams,\n fetchCache = defaultFetchCache,\n unstable_enhanceFetch,\n unstable_enhanceCreateData,\n children,\n}: {\n initialRscPath?: string;\n initialRscParams?: unknown;\n fetchCache?: FetchCache;\n unstable_enhanceFetch?: EnhanceFetch;\n unstable_enhanceCreateData?: EnhanceCreateData;\n children: ReactNode;\n}) => {\n fetchCache[ENHANCE_FETCH] = unstable_enhanceFetch;\n fetchCache[ENHANCE_CREATE_DATA] = unstable_enhanceCreateData;\n const [elements, setElements] = useState(() =>\n fetchRsc(initialRscPath || '', initialRscParams, fetchCache),\n );\n useEffect(() => {\n fetchCache[SET_ELEMENTS] = setElements;\n }, [fetchCache]);\n const refetch = useCallback(\n (rscPath: string, rscParams?: unknown) => {\n // clear cache entry before fetching\n delete fetchCache[ENTRY];\n const data = fetchRsc(rscPath, rscParams, fetchCache);\n setElements((prev) => mergeElementsPromise(prev, data));\n },\n [fetchCache],\n );\n return createElement(\n RefetchContext.Provider,\n { value: refetch },\n createElement(\n ElementsContext.Provider,\n { value: elements },\n ...DEFAULT_HTML_HEAD,\n children,\n ),\n );\n};\n\nexport const useRefetch = () => use(RefetchContext);\n\nconst ChildrenContext = createContext<ReactNode>(undefined);\nconst ChildrenContextProvider = memo(ChildrenContext.Provider);\nconst ErrorContext = createContext<\n [error: unknown, reset: () => void] | undefined\n>(undefined);\nconst ErrorContextProvider = memo(ErrorContext.Provider);\n\nexport const Children = () => use(ChildrenContext);\n\nexport const ThrowError_UNSTABLE = () => {\n const errAndReset = use(ErrorContext);\n if (errAndReset) {\n throw errAndReset[0];\n }\n return null;\n};\n\nexport const useResetError_UNSTABLE = () => {\n const errAndReset = use(ErrorContext);\n if (errAndReset) {\n return errAndReset[1];\n }\n};\n\nexport const useElement = (id: string) => {\n const elementsPromise = use(ElementsContext);\n if (!elementsPromise) {\n throw new Error('Missing Root component');\n }\n const elements = use(elementsPromise);\n if (id in elements && elements[id] == undefined) {\n throw new Error('Element cannot be undefined, use null instead: ' + id);\n }\n return elements[id];\n};\n\nconst InnerSlot = ({\n id,\n children,\n setValidElement,\n unstable_fallback,\n}: {\n id: string;\n children?: ReactNode;\n setValidElement?: (element: ReactNode) => void;\n unstable_fallback?: ReactNode;\n}) => {\n const element = useElement(id);\n const isValidElement = element !== undefined;\n useEffect(() => {\n if (isValidElement && setValidElement) {\n // FIXME is there `isReactNode` type checker?\n setValidElement(element as ReactNode);\n }\n }, [isValidElement, element, setValidElement]);\n if (!isValidElement) {\n if (unstable_fallback) {\n return unstable_fallback;\n }\n throw new Error('Invalid element: ' + id);\n }\n return createElement(\n ChildrenContextProvider,\n { value: children },\n // FIXME is there `isReactNode` type checker?\n element as ReactNode,\n );\n};\n\nclass GeneralErrorHandler extends Component<\n { children?: ReactNode; errorHandler: ReactNode },\n { error: unknown | null }\n> {\n constructor(props: { children?: ReactNode; errorHandler: ReactNode }) {\n super(props);\n this.state = { error: null };\n this.reset = this.reset.bind(this);\n }\n static getDerivedStateFromError(error: unknown) {\n return { error };\n }\n reset() {\n this.setState({ error: null });\n }\n render() {\n const { error } = this.state;\n if (error !== null) {\n if (this.props.errorHandler) {\n return createElement(\n ErrorContextProvider,\n { value: [error, this.reset] },\n this.props.errorHandler,\n );\n }\n throw error;\n }\n return this.props.children;\n }\n}\n\n/**\n * Slot component\n * This is used under the Root component.\n * Slot id is the key of elements returned by the server.\n *\n * If the server returns this\n * ```\n * { 'foo': <div>foo</div>, 'bar': <div>bar</div> }\n * ```\n * then you can use this component like this\n * ```\n * <Root><Slot id=\"foo\" /><Slot id=\"bar\" /></Root>\n * ```\n */\nexport const Slot = ({\n id,\n children,\n unstable_handleError,\n unstable_fallback,\n}: {\n id: string;\n children?: ReactNode;\n unstable_handleError?: ReactNode;\n unstable_fallback?: ReactNode;\n}) => {\n const [errorHandler, setErrorHandler] = useState<ReactNode>();\n const setValidElement = useCallback(\n (element: ReactNode) =>\n setErrorHandler(\n createElement(\n ChildrenContextProvider,\n { value: unstable_handleError },\n element,\n ),\n ),\n [unstable_handleError],\n );\n if (unstable_handleError !== undefined) {\n return createElement(\n GeneralErrorHandler,\n { errorHandler },\n createElement(InnerSlot, { id, setValidElement }, children),\n );\n }\n return createElement(InnerSlot, { id, unstable_fallback }, children);\n};\n\n/**\n * ServerRoot for SSR\n * This is not a public API.\n */\nexport const INTERNAL_ServerRoot = ({\n elementsPromise,\n children,\n}: {\n elementsPromise: Promise<Elements>;\n children: ReactNode;\n}) =>\n createElement(\n ElementsContext.Provider,\n { value: elementsPromise },\n ...DEFAULT_HTML_HEAD,\n children,\n );\n"],"names":["createContext","createElement","memo","use","useCallback","useEffect","useState","Component","RSDWClient","createCustomError","encodeRscPath","encodeFuncId","createFromFetch","encodeReply","createTemporaryReferenceSet","DEFAULT_HTML_HEAD","charSet","name","content","BASE_RSC_PATH","env","WAKU_CONFIG_BASE_PATH","WAKU_CONFIG_RSC_BASE","checkStatus","responsePromise","response","ok","location","headers","get","err","text","statusText","status","erroredElementsPromiseMap","WeakMap","getCached","c","m","k","has","set","cache1","mergeElementsPromise","a","b","getResult","p","Promise","all","then","nextElements","_value","catch","cache2","ENTRY","SET_ELEMENTS","ENHANCE_FETCH","ENHANCE_CREATE_DATA","defaultFetchCache","unstable_callServerRsc","funcId","args","fetchCache","enhanceFetch","f","enhanceCreateData","d","temporaryReferences","createData","callServer","url","length","URLSearchParams","fetch","body","method","data","value","prev","prefetchedParams","fetchRscInternal","rscParams","undefined","fetchRsc","rscPath","entry","prefetched","globalThis","__WAKU_PREFETCHED__","hasValidPrefetchedResponse","prefetchRsc","RefetchContext","Error","ElementsContext","Root","initialRscPath","initialRscParams","unstable_enhanceFetch","unstable_enhanceCreateData","children","elements","setElements","refetch","Provider","useRefetch","ChildrenContext","ChildrenContextProvider","ErrorContext","ErrorContextProvider","Children","ThrowError_UNSTABLE","errAndReset","useResetError_UNSTABLE","useElement","id","elementsPromise","InnerSlot","setValidElement","unstable_fallback","element","isValidElement","GeneralErrorHandler","constructor","props","state","error","reset","bind","getDerivedStateFromError","setState","render","errorHandler","Slot","unstable_handleError","setErrorHandler","INTERNAL_ServerRoot"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/minimal/client.ts"],"sourcesContent":["/// <reference types=\"react/canary\" />\n'use client';\n\nimport {\n createContext,\n createElement,\n memo,\n use,\n useCallback,\n useEffect,\n useState,\n Component,\n} from 'react';\nimport type { ReactNode } from 'react';\nimport RSDWClient from 'react-server-dom-webpack/client';\n\nimport { createCustomError } from '../lib/utils/custom-errors.js';\nimport { encodeRscPath, encodeFuncId } from '../lib/renderers/utils.js';\n\nconst { createFromFetch, encodeReply, createTemporaryReferenceSet } =\n RSDWClient;\n\ndeclare global {\n interface ImportMeta {\n readonly env: Record<string, string>;\n }\n}\n\nconst DEFAULT_HTML_HEAD = [\n createElement('meta', { charSet: 'utf-8' }),\n createElement('meta', {\n name: 'viewport',\n content: 'width=device-width, initial-scale=1',\n }),\n createElement('meta', { name: 'generator', content: 'Waku' }),\n];\n\nconst BASE_RSC_PATH = `${import.meta.env?.WAKU_CONFIG_BASE_PATH}${\n import.meta.env?.WAKU_CONFIG_RSC_BASE\n}/`;\n\nconst checkStatus = async (\n responsePromise: Promise<Response>,\n): Promise<Response> => {\n const response = await responsePromise;\n if (!response.ok) {\n const location = response.headers.get('location');\n const err = createCustomError(\n (await response.text()) || response.statusText,\n {\n status: response.status,\n ...(location && { location }),\n },\n );\n throw err;\n }\n return response;\n};\n\ntype Elements = Record<string, unknown>;\n\n// HACK I'm not super happy with this hack\nconst erroredElementsPromiseMap = new WeakMap<\n Promise<Elements>,\n Promise<Elements>\n>();\n\nconst getCached = <T>(c: () => T, m: WeakMap<object, T>, k: object): T =>\n (m.has(k) ? m : m.set(k, c())).get(k) as T;\nconst cache1 = new WeakMap();\nconst mergeElementsPromise = (\n a: Promise<Elements>,\n b: Promise<Elements>,\n): Promise<Elements> => {\n const getResult = () => {\n const p = Promise.all([erroredElementsPromiseMap.get(a) || a, b])\n .then(([a, b]) => {\n const nextElements = { ...a, ...b };\n delete nextElements._value;\n return nextElements;\n })\n .catch((err) => {\n erroredElementsPromiseMap.set(p, a);\n throw err;\n });\n return p;\n };\n const cache2 = getCached(() => new WeakMap(), cache1, a);\n return getCached(getResult, cache2, b);\n};\n\ntype SetElements = (\n updater: (prev: Promise<Elements>) => Promise<Elements>,\n) => void;\ntype EnhanceFetch = (fetchFn: typeof fetch) => typeof fetch;\ntype EnhanceCreateData = (\n createData: (responsePromise: Promise<Response>) => Promise<Elements>,\n) => (responsePromise: Promise<Response>) => Promise<Elements>;\n\nconst ENTRY = 'e';\nconst SET_ELEMENTS = 's';\nconst ENHANCE_FETCH = 'f';\nconst ENHANCE_CREATE_DATA = 'd';\n\ntype FetchCache = {\n [ENTRY]?: [\n rscPath: string,\n rscParams: unknown,\n elementsPromise: Promise<Elements>,\n ];\n [SET_ELEMENTS]?: SetElements;\n [ENHANCE_FETCH]?: EnhanceFetch | undefined;\n [ENHANCE_CREATE_DATA]?: EnhanceCreateData | undefined;\n};\n\nconst defaultFetchCache: FetchCache = {};\n\n/**\n * callServer callback\n * This is not a public API.\n */\nexport const unstable_callServerRsc = async (\n funcId: string,\n args: unknown[],\n fetchCache = defaultFetchCache,\n) => {\n const enhanceFetch = fetchCache[ENHANCE_FETCH] || ((f) => f);\n const enhanceCreateData = fetchCache[ENHANCE_CREATE_DATA] || ((d) => d);\n const temporaryReferences = createTemporaryReferenceSet();\n const createData = (responsePromise: Promise<Response>) =>\n createFromFetch<Elements>(checkStatus(responsePromise), {\n callServer: (funcId: string, args: unknown[]) =>\n unstable_callServerRsc(funcId, args, fetchCache),\n temporaryReferences,\n });\n const url = BASE_RSC_PATH + encodeRscPath(encodeFuncId(funcId));\n const responsePromise =\n args.length === 1 && args[0] instanceof URLSearchParams\n ? enhanceFetch(fetch)(url + '?' + args[0])\n : encodeReply(args, { temporaryReferences }).then((body) =>\n enhanceFetch(fetch)(url, { method: 'POST', body }),\n );\n const data = enhanceCreateData(createData)(responsePromise);\n const value = (await data)._value;\n // FIXME this causes rerenders even if data is empty\n fetchCache[SET_ELEMENTS]?.((prev) => mergeElementsPromise(prev, data));\n return value;\n};\n\nconst prefetchedParams = new WeakMap<Promise<unknown>, unknown>();\nconst prefetchedTemporaryReferences = new WeakMap<\n Promise<unknown>,\n ReturnType<typeof createTemporaryReferenceSet>\n>();\n\nconst fetchRscInternal = (\n url: string,\n rscParams: unknown,\n temporaryReferences: ReturnType<typeof createTemporaryReferenceSet>,\n fetchCache: FetchCache,\n) => {\n const enhanceFetch = fetchCache[ENHANCE_FETCH] || ((f) => f);\n return rscParams === undefined\n ? enhanceFetch(fetch)(url)\n : rscParams instanceof URLSearchParams\n ? enhanceFetch(fetch)(url + '?' + rscParams)\n : encodeReply(rscParams, { temporaryReferences }).then((body) =>\n enhanceFetch(fetch)(url, { method: 'POST', body }),\n );\n};\n\nexport const fetchRsc = (\n rscPath: string,\n rscParams?: unknown,\n fetchCache = defaultFetchCache,\n): Promise<Elements> => {\n const entry = fetchCache[ENTRY];\n if (entry && entry[0] === rscPath && entry[1] === rscParams) {\n return entry[2];\n }\n const enhanceCreateData = fetchCache[ENHANCE_CREATE_DATA] || ((d) => d);\n const prefetched = ((globalThis as any).__WAKU_PREFETCHED__ ||= {});\n const url = BASE_RSC_PATH + encodeRscPath(rscPath);\n const hasValidPrefetchedResponse =\n !!prefetched[url] &&\n // HACK .has() is for the initial hydration\n // It's limited and may result in a wrong result. FIXME\n (!prefetchedParams.has(prefetched[url]) ||\n prefetchedParams.get(prefetched[url]) === rscParams);\n const temporaryReferences =\n prefetchedTemporaryReferences.get(prefetched[url]) ||\n createTemporaryReferenceSet();\n const createData = (responsePromise: Promise<Response>) =>\n createFromFetch<Elements>(checkStatus(responsePromise), {\n callServer: (funcId: string, args: unknown[]) =>\n unstable_callServerRsc(funcId, args, fetchCache),\n temporaryReferences,\n });\n const responsePromise = hasValidPrefetchedResponse\n ? prefetched[url]\n : fetchRscInternal(url, rscParams, temporaryReferences, fetchCache);\n delete prefetched[url];\n const data = enhanceCreateData(createData)(responsePromise);\n fetchCache[ENTRY] = [rscPath, rscParams, data];\n return data;\n};\n\nexport const prefetchRsc = (\n rscPath: string,\n rscParams?: unknown,\n fetchCache = defaultFetchCache,\n): void => {\n const prefetched = ((globalThis as any).__WAKU_PREFETCHED__ ||= {});\n const url = BASE_RSC_PATH + encodeRscPath(rscPath);\n if (!(url in prefetched)) {\n const temporaryReferences = createTemporaryReferenceSet();\n prefetched[url] = fetchRscInternal(\n url,\n rscParams,\n temporaryReferences,\n fetchCache,\n );\n prefetchedParams.set(prefetched[url], rscParams);\n prefetchedTemporaryReferences.set(prefetched[url], temporaryReferences);\n }\n};\n\nconst RefetchContext = createContext<\n (rscPath: string, rscParams?: unknown) => void\n>(() => {\n throw new Error('Missing Root component');\n});\nconst ElementsContext = createContext<Promise<Elements> | null>(null);\n\nexport const Root = ({\n initialRscPath,\n initialRscParams,\n fetchCache = defaultFetchCache,\n unstable_enhanceFetch,\n unstable_enhanceCreateData,\n children,\n}: {\n initialRscPath?: string;\n initialRscParams?: unknown;\n fetchCache?: FetchCache;\n unstable_enhanceFetch?: EnhanceFetch;\n unstable_enhanceCreateData?: EnhanceCreateData;\n children: ReactNode;\n}) => {\n fetchCache[ENHANCE_FETCH] = unstable_enhanceFetch;\n fetchCache[ENHANCE_CREATE_DATA] = unstable_enhanceCreateData;\n const [elements, setElements] = useState(() =>\n fetchRsc(initialRscPath || '', initialRscParams, fetchCache),\n );\n useEffect(() => {\n fetchCache[SET_ELEMENTS] = setElements;\n }, [fetchCache]);\n const refetch = useCallback(\n (rscPath: string, rscParams?: unknown) => {\n // clear cache entry before fetching\n delete fetchCache[ENTRY];\n const data = fetchRsc(rscPath, rscParams, fetchCache);\n setElements((prev) => mergeElementsPromise(prev, data));\n },\n [fetchCache],\n );\n return createElement(\n RefetchContext.Provider,\n { value: refetch },\n createElement(\n ElementsContext.Provider,\n { value: elements },\n ...DEFAULT_HTML_HEAD,\n children,\n ),\n );\n};\n\nexport const useRefetch = () => use(RefetchContext);\n\nconst ChildrenContext = createContext<ReactNode>(undefined);\nconst ChildrenContextProvider = memo(ChildrenContext.Provider);\nconst ErrorContext = createContext<\n [error: unknown, reset: () => void] | undefined\n>(undefined);\nconst ErrorContextProvider = memo(ErrorContext.Provider);\n\nexport const Children = () => use(ChildrenContext);\n\nexport const ThrowError_UNSTABLE = () => {\n const errAndReset = use(ErrorContext);\n if (errAndReset) {\n throw errAndReset[0];\n }\n return null;\n};\n\nexport const useResetError_UNSTABLE = () => {\n const errAndReset = use(ErrorContext);\n if (errAndReset) {\n return errAndReset[1];\n }\n};\n\nexport const useElement = (id: string) => {\n const elementsPromise = use(ElementsContext);\n if (!elementsPromise) {\n throw new Error('Missing Root component');\n }\n const elements = use(elementsPromise);\n if (id in elements && elements[id] == undefined) {\n throw new Error('Element cannot be undefined, use null instead: ' + id);\n }\n return elements[id];\n};\n\nconst InnerSlot = ({\n id,\n children,\n setValidElement,\n unstable_fallback,\n}: {\n id: string;\n children?: ReactNode;\n setValidElement?: (element: ReactNode) => void;\n unstable_fallback?: ReactNode;\n}) => {\n const element = useElement(id);\n const isValidElement = element !== undefined;\n useEffect(() => {\n if (isValidElement && setValidElement) {\n // FIXME is there `isReactNode` type checker?\n setValidElement(element as ReactNode);\n }\n }, [isValidElement, element, setValidElement]);\n if (!isValidElement) {\n if (unstable_fallback) {\n return unstable_fallback;\n }\n throw new Error('Invalid element: ' + id);\n }\n return createElement(\n ChildrenContextProvider,\n { value: children },\n // FIXME is there `isReactNode` type checker?\n element as ReactNode,\n );\n};\n\nclass GeneralErrorHandler extends Component<\n { children?: ReactNode; errorHandler: ReactNode },\n { error: unknown | null }\n> {\n constructor(props: { children?: ReactNode; errorHandler: ReactNode }) {\n super(props);\n this.state = { error: null };\n this.reset = this.reset.bind(this);\n }\n static getDerivedStateFromError(error: unknown) {\n return { error };\n }\n reset() {\n this.setState({ error: null });\n }\n render() {\n const { error } = this.state;\n if (error !== null) {\n if (this.props.errorHandler) {\n return createElement(\n ErrorContextProvider,\n { value: [error, this.reset] },\n this.props.errorHandler,\n );\n }\n throw error;\n }\n return this.props.children;\n }\n}\n\n/**\n * Slot component\n * This is used under the Root component.\n * Slot id is the key of elements returned by the server.\n *\n * If the server returns this\n * ```\n * { 'foo': <div>foo</div>, 'bar': <div>bar</div> }\n * ```\n * then you can use this component like this\n * ```\n * <Root><Slot id=\"foo\" /><Slot id=\"bar\" /></Root>\n * ```\n */\nexport const Slot = ({\n id,\n children,\n unstable_handleError,\n unstable_fallback,\n}: {\n id: string;\n children?: ReactNode;\n unstable_handleError?: ReactNode;\n unstable_fallback?: ReactNode;\n}) => {\n const [errorHandler, setErrorHandler] = useState<ReactNode>();\n const setValidElement = useCallback(\n (element: ReactNode) =>\n setErrorHandler(\n createElement(\n ChildrenContextProvider,\n { value: unstable_handleError },\n element,\n ),\n ),\n [unstable_handleError],\n );\n if (unstable_handleError !== undefined) {\n return createElement(\n GeneralErrorHandler,\n { errorHandler },\n createElement(InnerSlot, { id, setValidElement }, children),\n );\n }\n return createElement(InnerSlot, { id, unstable_fallback }, children);\n};\n\n/**\n * ServerRoot for SSR\n * This is not a public API.\n */\nexport const INTERNAL_ServerRoot = ({\n elementsPromise,\n children,\n}: {\n elementsPromise: Promise<Elements>;\n children: ReactNode;\n}) =>\n createElement(\n ElementsContext.Provider,\n { value: elementsPromise },\n ...DEFAULT_HTML_HEAD,\n children,\n );\n"],"names":["createContext","createElement","memo","use","useCallback","useEffect","useState","Component","RSDWClient","createCustomError","encodeRscPath","encodeFuncId","createFromFetch","encodeReply","createTemporaryReferenceSet","DEFAULT_HTML_HEAD","charSet","name","content","BASE_RSC_PATH","env","WAKU_CONFIG_BASE_PATH","WAKU_CONFIG_RSC_BASE","checkStatus","responsePromise","response","ok","location","headers","get","err","text","statusText","status","erroredElementsPromiseMap","WeakMap","getCached","c","m","k","has","set","cache1","mergeElementsPromise","a","b","getResult","p","Promise","all","then","nextElements","_value","catch","cache2","ENTRY","SET_ELEMENTS","ENHANCE_FETCH","ENHANCE_CREATE_DATA","defaultFetchCache","unstable_callServerRsc","funcId","args","fetchCache","enhanceFetch","f","enhanceCreateData","d","temporaryReferences","createData","callServer","url","length","URLSearchParams","fetch","body","method","data","value","prev","prefetchedParams","prefetchedTemporaryReferences","fetchRscInternal","rscParams","undefined","fetchRsc","rscPath","entry","prefetched","globalThis","__WAKU_PREFETCHED__","hasValidPrefetchedResponse","prefetchRsc","RefetchContext","Error","ElementsContext","Root","initialRscPath","initialRscParams","unstable_enhanceFetch","unstable_enhanceCreateData","children","elements","setElements","refetch","Provider","useRefetch","ChildrenContext","ChildrenContextProvider","ErrorContext","ErrorContextProvider","Children","ThrowError_UNSTABLE","errAndReset","useResetError_UNSTABLE","useElement","id","elementsPromise","InnerSlot","setValidElement","unstable_fallback","element","isValidElement","GeneralErrorHandler","constructor","props","state","error","reset","bind","getDerivedStateFromError","setState","render","errorHandler","Slot","unstable_handleError","setErrorHandler","INTERNAL_ServerRoot"],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import type { ReactNode } from 'react';
2
2
  import type { PathSpec } from '../lib/utils/path.js';
3
+ export declare function unstable_getRscParams(): unknown;
3
4
  export declare function unstable_rerenderRoute(pathname: string, query?: string): void;
4
5
  export declare function unstable_notFound(): never;
5
6
  export declare function unstable_redirect(location: string, status?: 307 | 308): never;
@@ -9,16 +9,37 @@ import { stringToStream } from '../lib/utils/stream.js';
9
9
  import { createCustomError, getErrorInfo } from '../lib/utils/custom-errors.js';
10
10
  const isStringArray = (x)=>Array.isArray(x) && x.every((y)=>typeof y === 'string');
11
11
  const parseRscParams = (rscParams)=>{
12
- if (!(rscParams instanceof URLSearchParams)) {
12
+ if (rscParams instanceof URLSearchParams) {
13
13
  return {
14
- query: ''
14
+ query: rscParams.get('query') || ''
15
+ };
16
+ }
17
+ if (typeof rscParams?.query === 'string') {
18
+ return {
19
+ query: rscParams.query
15
20
  };
16
21
  }
17
- const query = rscParams.get('query') || '';
18
22
  return {
19
- query
23
+ query: ''
20
24
  };
21
25
  };
26
+ const RSC_PARAMS_SYMBOL = Symbol('RSC_PARAMS');
27
+ const setRscParams = (rscParams)=>{
28
+ try {
29
+ const context = getContext();
30
+ context[RSC_PARAMS_SYMBOL] = rscParams;
31
+ } catch {
32
+ // ignore
33
+ }
34
+ };
35
+ export function unstable_getRscParams() {
36
+ try {
37
+ const context = getContext();
38
+ return context[RSC_PARAMS_SYMBOL];
39
+ } catch {
40
+ return undefined;
41
+ }
42
+ }
22
43
  const RERENDER_SYMBOL = Symbol('RERENDER');
23
44
  const setRerender = (rerender)=>{
24
45
  try {
@@ -121,6 +142,7 @@ export function unstable_defineRouter(fns) {
121
142
  return pathConfig.some(({ specs: { is404 } })=>is404);
122
143
  };
123
144
  const getEntries = async (rscPath, rscParams, headers)=>{
145
+ setRscParams(rscParams);
124
146
  const pathname = decodeRoutePath(rscPath);
125
147
  const pathConfigItem = await getPathConfigItem(pathname);
126
148
  if (!pathConfigItem) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/router/define-router.ts"],"sourcesContent":["import { createElement } from 'react';\nimport type { ReactNode } from 'react';\n\nimport {\n unstable_getPlatformData,\n unstable_setPlatformData,\n unstable_createAsyncIterable as createAsyncIterable,\n} from '../server.js';\nimport { unstable_defineEntries as defineEntries } from '../minimal/server.js';\nimport {\n encodeRoutePath,\n decodeRoutePath,\n ROUTE_ID,\n IS_STATIC_ID,\n HAS404_ID,\n SKIP_HEADER,\n} from './common.js';\nimport { getPathMapping, path2regexp } from '../lib/utils/path.js';\nimport type { PathSpec } from '../lib/utils/path.js';\nimport { INTERNAL_ServerRouter } from './client.js';\nimport { getContext } from '../middleware/context.js';\nimport { stringToStream } from '../lib/utils/stream.js';\nimport { createCustomError, getErrorInfo } from '../lib/utils/custom-errors.js';\n\nconst isStringArray = (x: unknown): x is string[] =>\n Array.isArray(x) && x.every((y) => typeof y === 'string');\n\nconst parseRscParams = (\n rscParams: unknown,\n): {\n query: string;\n} => {\n if (!(rscParams instanceof URLSearchParams)) {\n return { query: '' };\n }\n const query = rscParams.get('query') || '';\n return { query };\n};\n\nconst RERENDER_SYMBOL = Symbol('RERENDER');\ntype Rerender = (rscPath: string, rscParams?: unknown) => void;\n\nconst setRerender = (rerender: Rerender) => {\n try {\n const context = getContext();\n (context as unknown as Record<typeof RERENDER_SYMBOL, Rerender>)[\n RERENDER_SYMBOL\n ] = rerender;\n } catch {\n // ignore\n }\n};\n\nconst getRerender = (): Rerender => {\n const context = getContext();\n return (context as unknown as Record<typeof RERENDER_SYMBOL, Rerender>)[\n RERENDER_SYMBOL\n ];\n};\n\nconst pathSpec2pathname = (pathSpec: PathSpec) => {\n if (pathSpec.some(({ type }) => type !== 'literal')) {\n return undefined;\n }\n return '/' + pathSpec.map(({ name }) => name!).join('/');\n};\n\nexport function unstable_rerenderRoute(pathname: string, query?: string) {\n const rscPath = encodeRoutePath(pathname);\n getRerender()(rscPath, query && new URLSearchParams({ query }));\n}\n\nexport function unstable_notFound(): never {\n throw createCustomError('Not Found', { status: 404 });\n}\n\nexport function unstable_redirect(\n location: string,\n status: 307 | 308 = 307,\n): never {\n throw createCustomError('Redirect', { status, location });\n}\n\ntype SlotId = string;\n\nconst ROUTE_SLOT_ID_PREFIX = 'route:';\n\nexport function unstable_defineRouter(fns: {\n getRouteConfig: () => Promise<\n Iterable<{\n path: PathSpec;\n pathPattern?: PathSpec;\n rootElement: { isStatic?: boolean };\n routeElement: { isStatic?: boolean };\n elements: Record<SlotId, { isStatic?: boolean }>;\n noSsr?: boolean;\n }>\n >;\n handleRoute: (\n path: string,\n options: {\n query?: string;\n },\n ) => Promise<{\n rootElement: ReactNode;\n routeElement: ReactNode;\n elements: Record<SlotId, unknown>;\n }>;\n getApiConfig?: () => Promise<\n Iterable<{\n path: PathSpec;\n isStatic?: boolean;\n }>\n >;\n handleApi?: (\n path: string,\n options: {\n url: URL;\n body: ReadableStream | null;\n headers: Readonly<Record<string, string>>;\n method: string;\n },\n ) => Promise<{\n body?: ReadableStream;\n headers?: Record<string, string | string[]>;\n status?: number;\n }>;\n}) {\n type MyPathConfig = {\n pathSpec: PathSpec;\n pathname: string | undefined;\n pattern: string;\n specs: {\n rootElementIsStatic?: true;\n routeElementIsStatic?: true;\n staticElementIds?: SlotId[];\n isStatic?: true;\n noSsr?: true;\n is404?: true;\n isApi?: true;\n };\n }[];\n let cachedPathConfig: MyPathConfig | undefined;\n const getMyPathConfig = async (): Promise<MyPathConfig> => {\n const pathConfig = await unstable_getPlatformData(\n 'defineRouterPathConfigs',\n );\n if (pathConfig) {\n return pathConfig as MyPathConfig;\n }\n if (!cachedPathConfig) {\n cachedPathConfig = [\n ...Array.from(await fns.getRouteConfig()).map((item) => {\n const is404 =\n item.path.length === 1 &&\n item.path[0]!.type === 'literal' &&\n item.path[0]!.name === '404';\n const isStatic =\n !!item.rootElement.isStatic &&\n !!item.routeElement.isStatic &&\n Object.values(item.elements).every((x) => x.isStatic);\n return {\n pathSpec: item.path,\n pathname: pathSpec2pathname(item.path),\n pattern: path2regexp(item.pathPattern || item.path),\n specs: {\n ...(item.rootElement.isStatic\n ? { rootElementIsStatic: true as const }\n : {}),\n ...(item.routeElement.isStatic\n ? { routeElementIsStatic: true as const }\n : {}),\n staticElementIds: Object.entries(item.elements).flatMap(\n ([id, { isStatic }]) => (isStatic ? [id] : []),\n ),\n ...(isStatic ? { isStatic: true as const } : {}),\n ...(is404 ? { is404: true as const } : {}),\n ...(item.noSsr ? { noSsr: true as const } : {}),\n },\n };\n }),\n ...Array.from((await fns.getApiConfig?.()) || []).map((item) => {\n return {\n pathSpec: item.path,\n pathname: pathSpec2pathname(item.path),\n pattern: path2regexp(item.path),\n specs: {\n ...(item.isStatic ? { isStatic: true as const } : {}),\n isApi: true as const,\n },\n };\n }),\n ];\n }\n return cachedPathConfig;\n };\n const getPathConfigItem = async (pathname: string) => {\n const pathConfig = await getMyPathConfig();\n const found = pathConfig.find(({ pathSpec }) =>\n getPathMapping(pathSpec, pathname),\n );\n return found;\n };\n const has404 = async () => {\n const pathConfig = await getMyPathConfig();\n return pathConfig.some(({ specs: { is404 } }) => is404);\n };\n const getEntries = async (\n rscPath: string,\n rscParams: unknown,\n headers: Readonly<Record<string, string>>,\n ) => {\n const pathname = decodeRoutePath(rscPath);\n const pathConfigItem = await getPathConfigItem(pathname);\n if (!pathConfigItem) {\n return null;\n }\n let skipParam: unknown;\n try {\n skipParam = JSON.parse(headers[SKIP_HEADER.toLowerCase()] || '');\n } catch {\n // ignore\n }\n const skipIdSet = new Set(isStringArray(skipParam) ? skipParam : []);\n const { query } = parseRscParams(rscParams);\n const { rootElement, routeElement, elements } = await fns.handleRoute(\n pathname,\n pathConfigItem.specs.isStatic ? {} : { query },\n );\n if (\n Object.keys(elements).some((id) => id.startsWith(ROUTE_SLOT_ID_PREFIX))\n ) {\n throw new Error('Element ID cannot start with \"route:\"');\n }\n const entries = {\n ...elements,\n };\n for (const id of pathConfigItem.specs.staticElementIds || []) {\n if (skipIdSet.has(id)) {\n delete entries[id];\n }\n }\n if (!pathConfigItem.specs.rootElementIsStatic || !skipIdSet.has('root')) {\n entries.root = rootElement;\n }\n const decodedPathname = decodeURIComponent(pathname);\n const routeId = ROUTE_SLOT_ID_PREFIX + decodedPathname;\n if (!pathConfigItem.specs.routeElementIsStatic || !skipIdSet.has(routeId)) {\n entries[routeId] = routeElement;\n }\n entries[ROUTE_ID] = [decodedPathname, query];\n entries[IS_STATIC_ID] = !!pathConfigItem.specs.isStatic;\n if (await has404()) {\n entries[HAS404_ID] = true;\n }\n return entries;\n };\n\n type HandleRequest = Parameters<typeof defineEntries>[0]['handleRequest'];\n type HandleBuild = Parameters<typeof defineEntries>[0]['handleBuild'];\n type BuildConfig =\n NonNullable<ReturnType<HandleBuild>> extends AsyncIterable<infer T>\n ? T\n : never;\n\n const handleRequest: HandleRequest = async (\n input,\n { renderRsc, renderHtml },\n ) => {\n if (input.type === 'component') {\n const entries = await getEntries(\n input.rscPath,\n input.rscParams,\n input.req.headers,\n );\n if (!entries) {\n return null;\n }\n return renderRsc(entries);\n }\n if (input.type === 'function') {\n let elementsPromise: Promise<Record<string, unknown>> = Promise.resolve(\n {},\n );\n let rendered = false;\n const rerender = async (rscPath: string, rscParams?: unknown) => {\n if (rendered) {\n throw new Error('already rendered');\n }\n elementsPromise = Promise.all([\n elementsPromise,\n getEntries(rscPath, rscParams, input.req.headers),\n ]).then(([oldElements, newElements]) => {\n if (newElements === null) {\n console.warn('getEntries returned null');\n }\n return {\n ...oldElements,\n ...newElements,\n };\n });\n };\n setRerender(rerender);\n const value = await input.fn(...input.args);\n rendered = true;\n return renderRsc({ ...(await elementsPromise), _value: value });\n }\n const pathConfigItem = await getPathConfigItem(input.pathname);\n if (pathConfigItem?.specs?.isApi && fns.handleApi) {\n return fns.handleApi(input.pathname, {\n url: input.req.url,\n body: input.req.body,\n headers: input.req.headers,\n method: input.req.method,\n });\n }\n if (input.type === 'action' || input.type === 'custom') {\n const renderIt = async (\n pathname: string,\n query: string,\n httpstatus = 200,\n ) => {\n const rscPath = encodeRoutePath(pathname);\n const rscParams = new URLSearchParams({ query });\n const entries = await getEntries(rscPath, rscParams, input.req.headers);\n if (!entries) {\n return null;\n }\n const html = createElement(INTERNAL_ServerRouter, {\n route: { path: pathname, query, hash: '' },\n httpstatus,\n });\n const actionResult =\n input.type === 'action' ? await input.fn() : undefined;\n return renderHtml(entries, html, { rscPath, actionResult });\n };\n const query = input.req.url.searchParams.toString();\n if (pathConfigItem?.specs?.noSsr) {\n return null;\n }\n try {\n if (pathConfigItem) {\n return await renderIt(input.pathname, query);\n }\n } catch (e) {\n const info = getErrorInfo(e);\n if (info?.status !== 404) {\n throw e;\n }\n }\n if (await has404()) {\n return { ...(await renderIt('/404', '', 404)), status: 404 };\n } else {\n return null;\n }\n }\n };\n\n type Tasks = Array<() => Promise<BuildConfig>>;\n const handleBuild: HandleBuild = ({\n renderRsc,\n renderHtml,\n rscPath2pathname,\n unstable_generatePrefetchCode,\n unstable_collectClientModules,\n }) =>\n createAsyncIterable(async (): Promise<Tasks> => {\n const tasks: Tasks = [];\n const pathConfig = await getMyPathConfig();\n\n for (const { pathname, specs } of pathConfig) {\n const { handleApi } = fns;\n if (pathname && specs.isStatic && specs.isApi && handleApi) {\n tasks.push(async () => ({\n type: 'file',\n pathname,\n body: handleApi(pathname, {\n url: new URL(pathname, 'http://localhost:3000'),\n body: null,\n headers: {},\n method: 'GET',\n }).then(({ body }) => body || stringToStream('')),\n }));\n }\n }\n\n const path2moduleIds: Record<string, string[]> = {};\n const moduleIdsForPrefetch = new WeakMap<PathSpec, Set<string>>();\n // FIXME this approach keeps all entries in memory during the loop\n const entriesCache = new Map<string, Record<string, unknown>>();\n await Promise.all(\n pathConfig.map(async ({ pathSpec, pathname, pattern, specs }) => {\n if (specs.isApi) {\n return;\n }\n const moduleIds = new Set<string>();\n moduleIdsForPrefetch.set(pathSpec, moduleIds);\n if (!pathname) {\n return;\n }\n const rscPath = encodeRoutePath(pathname);\n const entries = await getEntries(rscPath, undefined, {});\n if (entries) {\n entriesCache.set(pathname, entries);\n path2moduleIds[pattern] =\n await unstable_collectClientModules(entries);\n if (specs.isStatic) {\n tasks.push(async () => ({\n type: 'file',\n pathname: rscPath2pathname(rscPath),\n body: renderRsc(entries, {\n moduleIdCallback: (id) => moduleIds.add(id),\n }),\n }));\n }\n }\n }),\n );\n\n const getRouterPrefetchCode = () => `\nglobalThis.__WAKU_ROUTER_PREFETCH__ = (path) => {\n const path2ids = ${JSON.stringify(path2moduleIds)};\n const pattern = Object.keys(path2ids).find((key) => new RegExp(key).test(path));\n if (pattern && path2ids[pattern]) {\n for (const id of path2ids[pattern] || []) {\n import(id);\n }\n }\n};`;\n\n for (const { pathSpec, pathname, specs } of pathConfig) {\n if (specs.isApi) {\n continue;\n }\n tasks.push(async () => {\n const moduleIds = moduleIdsForPrefetch.get(pathSpec)!;\n if (pathname) {\n const rscPath = encodeRoutePath(pathname);\n const code =\n unstable_generatePrefetchCode([rscPath], moduleIds) +\n getRouterPrefetchCode();\n const entries = entriesCache.get(pathname);\n if (specs.isStatic && entries) {\n const html = createElement(INTERNAL_ServerRouter, {\n route: { path: pathname, query: '', hash: '' },\n httpstatus: specs.is404 ? 404 : 200,\n });\n return {\n type: 'file',\n pathname,\n body: renderHtml(entries, html, {\n rscPath,\n htmlHead: `<script type=\"module\" async>${code}</script>`,\n }).then(({ body }) => body),\n };\n }\n }\n const code =\n unstable_generatePrefetchCode([], moduleIds) +\n getRouterPrefetchCode();\n return {\n type: 'htmlHead',\n pathSpec,\n head: `<script type=\"module\" async>${code}</script>`,\n };\n });\n }\n\n await unstable_setPlatformData(\n 'defineRouterPathConfigs',\n pathConfig,\n true,\n );\n return tasks;\n });\n\n return defineEntries({ handleRequest, handleBuild });\n}\n"],"names":["createElement","unstable_getPlatformData","unstable_setPlatformData","unstable_createAsyncIterable","createAsyncIterable","unstable_defineEntries","defineEntries","encodeRoutePath","decodeRoutePath","ROUTE_ID","IS_STATIC_ID","HAS404_ID","SKIP_HEADER","getPathMapping","path2regexp","INTERNAL_ServerRouter","getContext","stringToStream","createCustomError","getErrorInfo","isStringArray","x","Array","isArray","every","y","parseRscParams","rscParams","URLSearchParams","query","get","RERENDER_SYMBOL","Symbol","setRerender","rerender","context","getRerender","pathSpec2pathname","pathSpec","some","type","undefined","map","name","join","unstable_rerenderRoute","pathname","rscPath","unstable_notFound","status","unstable_redirect","location","ROUTE_SLOT_ID_PREFIX","unstable_defineRouter","fns","cachedPathConfig","getMyPathConfig","pathConfig","from","getRouteConfig","item","is404","path","length","isStatic","rootElement","routeElement","Object","values","elements","pattern","pathPattern","specs","rootElementIsStatic","routeElementIsStatic","staticElementIds","entries","flatMap","id","noSsr","getApiConfig","isApi","getPathConfigItem","found","find","has404","getEntries","headers","pathConfigItem","skipParam","JSON","parse","toLowerCase","skipIdSet","Set","handleRoute","keys","startsWith","Error","has","root","decodedPathname","decodeURIComponent","routeId","handleRequest","input","renderRsc","renderHtml","req","elementsPromise","Promise","resolve","rendered","all","then","oldElements","newElements","console","warn","value","fn","args","_value","handleApi","url","body","method","renderIt","httpstatus","html","route","hash","actionResult","searchParams","toString","e","info","handleBuild","rscPath2pathname","unstable_generatePrefetchCode","unstable_collectClientModules","tasks","push","URL","path2moduleIds","moduleIdsForPrefetch","WeakMap","entriesCache","Map","moduleIds","set","moduleIdCallback","add","getRouterPrefetchCode","stringify","code","htmlHead","head"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/router/define-router.ts"],"sourcesContent":["import { createElement } from 'react';\nimport type { ReactNode } from 'react';\n\nimport {\n unstable_getPlatformData,\n unstable_setPlatformData,\n unstable_createAsyncIterable as createAsyncIterable,\n} from '../server.js';\nimport { unstable_defineEntries as defineEntries } from '../minimal/server.js';\nimport {\n encodeRoutePath,\n decodeRoutePath,\n ROUTE_ID,\n IS_STATIC_ID,\n HAS404_ID,\n SKIP_HEADER,\n} from './common.js';\nimport { getPathMapping, path2regexp } from '../lib/utils/path.js';\nimport type { PathSpec } from '../lib/utils/path.js';\nimport { INTERNAL_ServerRouter } from './client.js';\nimport { getContext } from '../middleware/context.js';\nimport { stringToStream } from '../lib/utils/stream.js';\nimport { createCustomError, getErrorInfo } from '../lib/utils/custom-errors.js';\n\nconst isStringArray = (x: unknown): x is string[] =>\n Array.isArray(x) && x.every((y) => typeof y === 'string');\n\nconst parseRscParams = (\n rscParams: unknown,\n): {\n query: string;\n} => {\n if (rscParams instanceof URLSearchParams) {\n return { query: rscParams.get('query') || '' };\n }\n if (\n typeof (rscParams as { query?: undefined } | undefined)?.query === 'string'\n ) {\n return { query: (rscParams as { query: string }).query };\n }\n return { query: '' };\n};\n\nconst RSC_PARAMS_SYMBOL = Symbol('RSC_PARAMS');\n\nconst setRscParams = (rscParams: unknown) => {\n try {\n const context = getContext();\n (context as unknown as Record<typeof RSC_PARAMS_SYMBOL, unknown>)[\n RSC_PARAMS_SYMBOL\n ] = rscParams;\n } catch {\n // ignore\n }\n};\n\nexport function unstable_getRscParams(): unknown {\n try {\n const context = getContext();\n return (context as unknown as Record<typeof RSC_PARAMS_SYMBOL, Rerender>)[\n RSC_PARAMS_SYMBOL\n ];\n } catch {\n return undefined;\n }\n}\n\nconst RERENDER_SYMBOL = Symbol('RERENDER');\ntype Rerender = (rscPath: string, rscParams?: unknown) => void;\n\nconst setRerender = (rerender: Rerender) => {\n try {\n const context = getContext();\n (context as unknown as Record<typeof RERENDER_SYMBOL, Rerender>)[\n RERENDER_SYMBOL\n ] = rerender;\n } catch {\n // ignore\n }\n};\n\nconst getRerender = (): Rerender => {\n const context = getContext();\n return (context as unknown as Record<typeof RERENDER_SYMBOL, Rerender>)[\n RERENDER_SYMBOL\n ];\n};\n\nconst pathSpec2pathname = (pathSpec: PathSpec) => {\n if (pathSpec.some(({ type }) => type !== 'literal')) {\n return undefined;\n }\n return '/' + pathSpec.map(({ name }) => name!).join('/');\n};\n\nexport function unstable_rerenderRoute(pathname: string, query?: string) {\n const rscPath = encodeRoutePath(pathname);\n getRerender()(rscPath, query && new URLSearchParams({ query }));\n}\n\nexport function unstable_notFound(): never {\n throw createCustomError('Not Found', { status: 404 });\n}\n\nexport function unstable_redirect(\n location: string,\n status: 307 | 308 = 307,\n): never {\n throw createCustomError('Redirect', { status, location });\n}\n\ntype SlotId = string;\n\nconst ROUTE_SLOT_ID_PREFIX = 'route:';\n\nexport function unstable_defineRouter(fns: {\n getRouteConfig: () => Promise<\n Iterable<{\n path: PathSpec;\n pathPattern?: PathSpec;\n rootElement: { isStatic?: boolean };\n routeElement: { isStatic?: boolean };\n elements: Record<SlotId, { isStatic?: boolean }>;\n noSsr?: boolean;\n }>\n >;\n handleRoute: (\n path: string,\n options: {\n query?: string;\n },\n ) => Promise<{\n rootElement: ReactNode;\n routeElement: ReactNode;\n elements: Record<SlotId, unknown>;\n }>;\n getApiConfig?: () => Promise<\n Iterable<{\n path: PathSpec;\n isStatic?: boolean;\n }>\n >;\n handleApi?: (\n path: string,\n options: {\n url: URL;\n body: ReadableStream | null;\n headers: Readonly<Record<string, string>>;\n method: string;\n },\n ) => Promise<{\n body?: ReadableStream;\n headers?: Record<string, string | string[]>;\n status?: number;\n }>;\n}) {\n type MyPathConfig = {\n pathSpec: PathSpec;\n pathname: string | undefined;\n pattern: string;\n specs: {\n rootElementIsStatic?: true;\n routeElementIsStatic?: true;\n staticElementIds?: SlotId[];\n isStatic?: true;\n noSsr?: true;\n is404?: true;\n isApi?: true;\n };\n }[];\n let cachedPathConfig: MyPathConfig | undefined;\n const getMyPathConfig = async (): Promise<MyPathConfig> => {\n const pathConfig = await unstable_getPlatformData(\n 'defineRouterPathConfigs',\n );\n if (pathConfig) {\n return pathConfig as MyPathConfig;\n }\n if (!cachedPathConfig) {\n cachedPathConfig = [\n ...Array.from(await fns.getRouteConfig()).map((item) => {\n const is404 =\n item.path.length === 1 &&\n item.path[0]!.type === 'literal' &&\n item.path[0]!.name === '404';\n const isStatic =\n !!item.rootElement.isStatic &&\n !!item.routeElement.isStatic &&\n Object.values(item.elements).every((x) => x.isStatic);\n return {\n pathSpec: item.path,\n pathname: pathSpec2pathname(item.path),\n pattern: path2regexp(item.pathPattern || item.path),\n specs: {\n ...(item.rootElement.isStatic\n ? { rootElementIsStatic: true as const }\n : {}),\n ...(item.routeElement.isStatic\n ? { routeElementIsStatic: true as const }\n : {}),\n staticElementIds: Object.entries(item.elements).flatMap(\n ([id, { isStatic }]) => (isStatic ? [id] : []),\n ),\n ...(isStatic ? { isStatic: true as const } : {}),\n ...(is404 ? { is404: true as const } : {}),\n ...(item.noSsr ? { noSsr: true as const } : {}),\n },\n };\n }),\n ...Array.from((await fns.getApiConfig?.()) || []).map((item) => {\n return {\n pathSpec: item.path,\n pathname: pathSpec2pathname(item.path),\n pattern: path2regexp(item.path),\n specs: {\n ...(item.isStatic ? { isStatic: true as const } : {}),\n isApi: true as const,\n },\n };\n }),\n ];\n }\n return cachedPathConfig;\n };\n const getPathConfigItem = async (pathname: string) => {\n const pathConfig = await getMyPathConfig();\n const found = pathConfig.find(({ pathSpec }) =>\n getPathMapping(pathSpec, pathname),\n );\n return found;\n };\n const has404 = async () => {\n const pathConfig = await getMyPathConfig();\n return pathConfig.some(({ specs: { is404 } }) => is404);\n };\n const getEntries = async (\n rscPath: string,\n rscParams: unknown,\n headers: Readonly<Record<string, string>>,\n ) => {\n setRscParams(rscParams);\n const pathname = decodeRoutePath(rscPath);\n const pathConfigItem = await getPathConfigItem(pathname);\n if (!pathConfigItem) {\n return null;\n }\n let skipParam: unknown;\n try {\n skipParam = JSON.parse(headers[SKIP_HEADER.toLowerCase()] || '');\n } catch {\n // ignore\n }\n const skipIdSet = new Set(isStringArray(skipParam) ? skipParam : []);\n const { query } = parseRscParams(rscParams);\n const { rootElement, routeElement, elements } = await fns.handleRoute(\n pathname,\n pathConfigItem.specs.isStatic ? {} : { query },\n );\n if (\n Object.keys(elements).some((id) => id.startsWith(ROUTE_SLOT_ID_PREFIX))\n ) {\n throw new Error('Element ID cannot start with \"route:\"');\n }\n const entries = {\n ...elements,\n };\n for (const id of pathConfigItem.specs.staticElementIds || []) {\n if (skipIdSet.has(id)) {\n delete entries[id];\n }\n }\n if (!pathConfigItem.specs.rootElementIsStatic || !skipIdSet.has('root')) {\n entries.root = rootElement;\n }\n const decodedPathname = decodeURIComponent(pathname);\n const routeId = ROUTE_SLOT_ID_PREFIX + decodedPathname;\n if (!pathConfigItem.specs.routeElementIsStatic || !skipIdSet.has(routeId)) {\n entries[routeId] = routeElement;\n }\n entries[ROUTE_ID] = [decodedPathname, query];\n entries[IS_STATIC_ID] = !!pathConfigItem.specs.isStatic;\n if (await has404()) {\n entries[HAS404_ID] = true;\n }\n return entries;\n };\n\n type HandleRequest = Parameters<typeof defineEntries>[0]['handleRequest'];\n type HandleBuild = Parameters<typeof defineEntries>[0]['handleBuild'];\n type BuildConfig =\n NonNullable<ReturnType<HandleBuild>> extends AsyncIterable<infer T>\n ? T\n : never;\n\n const handleRequest: HandleRequest = async (\n input,\n { renderRsc, renderHtml },\n ) => {\n if (input.type === 'component') {\n const entries = await getEntries(\n input.rscPath,\n input.rscParams,\n input.req.headers,\n );\n if (!entries) {\n return null;\n }\n return renderRsc(entries);\n }\n if (input.type === 'function') {\n let elementsPromise: Promise<Record<string, unknown>> = Promise.resolve(\n {},\n );\n let rendered = false;\n const rerender = async (rscPath: string, rscParams?: unknown) => {\n if (rendered) {\n throw new Error('already rendered');\n }\n elementsPromise = Promise.all([\n elementsPromise,\n getEntries(rscPath, rscParams, input.req.headers),\n ]).then(([oldElements, newElements]) => {\n if (newElements === null) {\n console.warn('getEntries returned null');\n }\n return {\n ...oldElements,\n ...newElements,\n };\n });\n };\n setRerender(rerender);\n const value = await input.fn(...input.args);\n rendered = true;\n return renderRsc({ ...(await elementsPromise), _value: value });\n }\n const pathConfigItem = await getPathConfigItem(input.pathname);\n if (pathConfigItem?.specs?.isApi && fns.handleApi) {\n return fns.handleApi(input.pathname, {\n url: input.req.url,\n body: input.req.body,\n headers: input.req.headers,\n method: input.req.method,\n });\n }\n if (input.type === 'action' || input.type === 'custom') {\n const renderIt = async (\n pathname: string,\n query: string,\n httpstatus = 200,\n ) => {\n const rscPath = encodeRoutePath(pathname);\n const rscParams = new URLSearchParams({ query });\n const entries = await getEntries(rscPath, rscParams, input.req.headers);\n if (!entries) {\n return null;\n }\n const html = createElement(INTERNAL_ServerRouter, {\n route: { path: pathname, query, hash: '' },\n httpstatus,\n });\n const actionResult =\n input.type === 'action' ? await input.fn() : undefined;\n return renderHtml(entries, html, { rscPath, actionResult });\n };\n const query = input.req.url.searchParams.toString();\n if (pathConfigItem?.specs?.noSsr) {\n return null;\n }\n try {\n if (pathConfigItem) {\n return await renderIt(input.pathname, query);\n }\n } catch (e) {\n const info = getErrorInfo(e);\n if (info?.status !== 404) {\n throw e;\n }\n }\n if (await has404()) {\n return { ...(await renderIt('/404', '', 404)), status: 404 };\n } else {\n return null;\n }\n }\n };\n\n type Tasks = Array<() => Promise<BuildConfig>>;\n const handleBuild: HandleBuild = ({\n renderRsc,\n renderHtml,\n rscPath2pathname,\n unstable_generatePrefetchCode,\n unstable_collectClientModules,\n }) =>\n createAsyncIterable(async (): Promise<Tasks> => {\n const tasks: Tasks = [];\n const pathConfig = await getMyPathConfig();\n\n for (const { pathname, specs } of pathConfig) {\n const { handleApi } = fns;\n if (pathname && specs.isStatic && specs.isApi && handleApi) {\n tasks.push(async () => ({\n type: 'file',\n pathname,\n body: handleApi(pathname, {\n url: new URL(pathname, 'http://localhost:3000'),\n body: null,\n headers: {},\n method: 'GET',\n }).then(({ body }) => body || stringToStream('')),\n }));\n }\n }\n\n const path2moduleIds: Record<string, string[]> = {};\n const moduleIdsForPrefetch = new WeakMap<PathSpec, Set<string>>();\n // FIXME this approach keeps all entries in memory during the loop\n const entriesCache = new Map<string, Record<string, unknown>>();\n await Promise.all(\n pathConfig.map(async ({ pathSpec, pathname, pattern, specs }) => {\n if (specs.isApi) {\n return;\n }\n const moduleIds = new Set<string>();\n moduleIdsForPrefetch.set(pathSpec, moduleIds);\n if (!pathname) {\n return;\n }\n const rscPath = encodeRoutePath(pathname);\n const entries = await getEntries(rscPath, undefined, {});\n if (entries) {\n entriesCache.set(pathname, entries);\n path2moduleIds[pattern] =\n await unstable_collectClientModules(entries);\n if (specs.isStatic) {\n tasks.push(async () => ({\n type: 'file',\n pathname: rscPath2pathname(rscPath),\n body: renderRsc(entries, {\n moduleIdCallback: (id) => moduleIds.add(id),\n }),\n }));\n }\n }\n }),\n );\n\n const getRouterPrefetchCode = () => `\nglobalThis.__WAKU_ROUTER_PREFETCH__ = (path) => {\n const path2ids = ${JSON.stringify(path2moduleIds)};\n const pattern = Object.keys(path2ids).find((key) => new RegExp(key).test(path));\n if (pattern && path2ids[pattern]) {\n for (const id of path2ids[pattern] || []) {\n import(id);\n }\n }\n};`;\n\n for (const { pathSpec, pathname, specs } of pathConfig) {\n if (specs.isApi) {\n continue;\n }\n tasks.push(async () => {\n const moduleIds = moduleIdsForPrefetch.get(pathSpec)!;\n if (pathname) {\n const rscPath = encodeRoutePath(pathname);\n const code =\n unstable_generatePrefetchCode([rscPath], moduleIds) +\n getRouterPrefetchCode();\n const entries = entriesCache.get(pathname);\n if (specs.isStatic && entries) {\n const html = createElement(INTERNAL_ServerRouter, {\n route: { path: pathname, query: '', hash: '' },\n httpstatus: specs.is404 ? 404 : 200,\n });\n return {\n type: 'file',\n pathname,\n body: renderHtml(entries, html, {\n rscPath,\n htmlHead: `<script type=\"module\" async>${code}</script>`,\n }).then(({ body }) => body),\n };\n }\n }\n const code =\n unstable_generatePrefetchCode([], moduleIds) +\n getRouterPrefetchCode();\n return {\n type: 'htmlHead',\n pathSpec,\n head: `<script type=\"module\" async>${code}</script>`,\n };\n });\n }\n\n await unstable_setPlatformData(\n 'defineRouterPathConfigs',\n pathConfig,\n true,\n );\n return tasks;\n });\n\n return defineEntries({ handleRequest, handleBuild });\n}\n"],"names":["createElement","unstable_getPlatformData","unstable_setPlatformData","unstable_createAsyncIterable","createAsyncIterable","unstable_defineEntries","defineEntries","encodeRoutePath","decodeRoutePath","ROUTE_ID","IS_STATIC_ID","HAS404_ID","SKIP_HEADER","getPathMapping","path2regexp","INTERNAL_ServerRouter","getContext","stringToStream","createCustomError","getErrorInfo","isStringArray","x","Array","isArray","every","y","parseRscParams","rscParams","URLSearchParams","query","get","RSC_PARAMS_SYMBOL","Symbol","setRscParams","context","unstable_getRscParams","undefined","RERENDER_SYMBOL","setRerender","rerender","getRerender","pathSpec2pathname","pathSpec","some","type","map","name","join","unstable_rerenderRoute","pathname","rscPath","unstable_notFound","status","unstable_redirect","location","ROUTE_SLOT_ID_PREFIX","unstable_defineRouter","fns","cachedPathConfig","getMyPathConfig","pathConfig","from","getRouteConfig","item","is404","path","length","isStatic","rootElement","routeElement","Object","values","elements","pattern","pathPattern","specs","rootElementIsStatic","routeElementIsStatic","staticElementIds","entries","flatMap","id","noSsr","getApiConfig","isApi","getPathConfigItem","found","find","has404","getEntries","headers","pathConfigItem","skipParam","JSON","parse","toLowerCase","skipIdSet","Set","handleRoute","keys","startsWith","Error","has","root","decodedPathname","decodeURIComponent","routeId","handleRequest","input","renderRsc","renderHtml","req","elementsPromise","Promise","resolve","rendered","all","then","oldElements","newElements","console","warn","value","fn","args","_value","handleApi","url","body","method","renderIt","httpstatus","html","route","hash","actionResult","searchParams","toString","e","info","handleBuild","rscPath2pathname","unstable_generatePrefetchCode","unstable_collectClientModules","tasks","push","URL","path2moduleIds","moduleIdsForPrefetch","WeakMap","entriesCache","Map","moduleIds","set","moduleIdCallback","add","getRouterPrefetchCode","stringify","code","htmlHead","head"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- export { unstable_defineRouter, unstable_rerenderRoute, unstable_notFound, unstable_redirect, } from './define-router.js';
1
+ export { unstable_defineRouter, unstable_getRscParams, unstable_rerenderRoute, unstable_notFound, unstable_redirect, } from './define-router.js';
2
2
  export { createPages } from './create-pages.js';
3
3
  export { unstable_fsRouter } from './fs-router.js';
@@ -1,4 +1,4 @@
1
- export { unstable_defineRouter, unstable_rerenderRoute, unstable_notFound, unstable_redirect } from './define-router.js';
1
+ export { unstable_defineRouter, unstable_getRscParams, unstable_rerenderRoute, unstable_notFound, unstable_redirect } from './define-router.js';
2
2
  export { createPages } from './create-pages.js';
3
3
  export { unstable_fsRouter } from './fs-router.js';
4
4
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/router/server.ts"],"sourcesContent":["export {\n unstable_defineRouter,\n unstable_rerenderRoute,\n unstable_notFound,\n unstable_redirect,\n} from './define-router.js';\nexport { createPages } from './create-pages.js';\nexport { unstable_fsRouter } from './fs-router.js';\n"],"names":["unstable_defineRouter","unstable_rerenderRoute","unstable_notFound","unstable_redirect","createPages","unstable_fsRouter"],"mappings":"AAAA,SACEA,qBAAqB,EACrBC,sBAAsB,EACtBC,iBAAiB,EACjBC,iBAAiB,QACZ,qBAAqB;AAC5B,SAASC,WAAW,QAAQ,oBAAoB;AAChD,SAASC,iBAAiB,QAAQ,iBAAiB"}
1
+ {"version":3,"sources":["../../src/router/server.ts"],"sourcesContent":["export {\n unstable_defineRouter,\n unstable_getRscParams,\n unstable_rerenderRoute,\n unstable_notFound,\n unstable_redirect,\n} from './define-router.js';\nexport { createPages } from './create-pages.js';\nexport { unstable_fsRouter } from './fs-router.js';\n"],"names":["unstable_defineRouter","unstable_getRscParams","unstable_rerenderRoute","unstable_notFound","unstable_redirect","createPages","unstable_fsRouter"],"mappings":"AAAA,SACEA,qBAAqB,EACrBC,qBAAqB,EACrBC,sBAAsB,EACtBC,iBAAiB,EACjBC,iBAAiB,QACZ,qBAAqB;AAC5B,SAASC,WAAW,QAAQ,oBAAoB;AAChD,SAASC,iBAAiB,QAAQ,iBAAiB"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "waku",
3
3
  "description": "⛩️ The minimal React framework",
4
- "version": "0.22.3",
4
+ "version": "0.22.4",
5
5
  "type": "module",
6
6
  "author": "Daishi Kato",
7
7
  "homepage": "https://waku.gg",
@@ -80,7 +80,7 @@
80
80
  "dependencies": {
81
81
  "@hono/node-server": "1.14.1",
82
82
  "@swc/core": "1.11.21",
83
- "@vitejs/plugin-react": "4.4.0",
83
+ "@vitejs/plugin-react": "4.4.1",
84
84
  "dotenv": "16.5.0",
85
85
  "hono": "4.7.7",
86
86
  "rollup": "4.40.0",
@@ -94,7 +94,7 @@
94
94
  "react-dom": "19.1.0",
95
95
  "react-server-dom-webpack": "19.1.0",
96
96
  "ts-expect": "^1.3.0",
97
- "vitest": "^3.1.1"
97
+ "vitest": "^3.1.2"
98
98
  },
99
99
  "peerDependencies": {
100
100
  "react": "~19.1.0",