waku 0.22.0 → 0.22.2

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.
package/README.md CHANGED
@@ -781,7 +781,172 @@ Data should be fetched on the server when possible for the best user experience,
781
781
 
782
782
  ## Mutations
783
783
 
784
- Data mutations can be performed via [server actions](https://react.dev/reference/rsc/server-actions) or API endpoints (coming soon).
784
+ Data mutations can be performed via [server actions](https://react.dev/reference/rsc/server-actions) or API endpoints.
785
+
786
+ ### API endpoints
787
+
788
+ Create API routes by making a new file in the special `./src/pages/api` directory and exporting one or more functions named after the HTTP methods that you want it to support: `GET`, `HEAD`, `POST`, `PUT`, `DELETE`, `CONNECT`, `OPTIONS`, `TRACE`, or `PATCH`. The name of the file determines the route it will be served from. Each function receives a standard [Request](https://developer.mozilla.org/en-US/docs/Web/API/Request) object and returns a standard [Response](https://developer.mozilla.org/en-US/docs/Web/API/Response) object.
789
+
790
+ ```ts
791
+ // ./src/pages/api/contact.ts
792
+ import emailClient from 'some-email';
793
+
794
+ const client = new emailClient(process.env.EMAIL_API_TOKEN!);
795
+
796
+ export const POST = async (request: Request): Promise<Response> => {
797
+ const body = await request.json();
798
+
799
+ if (!body.message) {
800
+ return Response.json({ message: 'Invalid' }, { status: 400 });
801
+ }
802
+
803
+ try {
804
+ await client.sendEmail({
805
+ From: 'noreply@example.com',
806
+ To: 'someone@example.com',
807
+ Subject: 'Contact form submission',
808
+ Body: body.message,
809
+ });
810
+
811
+ return Response.json({ message: 'Success' }, { status: 200 });
812
+ } catch (error) {
813
+ return Response.json({ message: 'Failure' }, { status: 500 });
814
+ }
815
+ };
816
+ ```
817
+
818
+ Alternatively, you may export a default function as a "catch-all" handler that responds to all request methods.
819
+
820
+ ```ts
821
+ // ./src/pages/api/other-endpoint.ts
822
+ export default function handler(request: Request): Response {
823
+ return Response.json(
824
+ { message: 'Default handler ' + request.method },
825
+ { status: 200 },
826
+ );
827
+ }
828
+ ```
829
+
830
+ #### Calling API routes
831
+
832
+ API routes are accessible at paths that match their file location. For example a file at `./src/pages/api/contact.ts` is available at `/api/contact`. You can call these endpoints from your client components using the standard [Fetch](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API) method.
833
+
834
+ ```tsx
835
+ 'use client';
836
+
837
+ import { useState } from 'react';
838
+
839
+ export const ContactForm = () => {
840
+ const [message, setMessage] = useState('');
841
+ const [status, setStatus] = useState('idle');
842
+
843
+ const handleSubmit = async (event) => {
844
+ event.preventDefault();
845
+ setStatus('sending');
846
+
847
+ try {
848
+ const response = await fetch('/api/contact', {
849
+ method: 'POST',
850
+ headers: {
851
+ 'Content-Type': 'application/json',
852
+ },
853
+ body: JSON.stringify({ message }),
854
+ });
855
+
856
+ const data = await response.json();
857
+
858
+ if (response.status === 200) {
859
+ setStatus('success');
860
+ setMessage('');
861
+ } else {
862
+ setStatus('error');
863
+ console.error('Error:', data.message);
864
+ }
865
+ } catch (error) {
866
+ setStatus('error');
867
+ console.error('Error:', error);
868
+ }
869
+ };
870
+
871
+ return (
872
+ <form onSubmit={handleSubmit}>
873
+ <textarea
874
+ value={message}
875
+ onChange={(event) => setMessage(event.target.value)}
876
+ placeholder="Your message..."
877
+ required
878
+ />
879
+ <button type="submit" disabled={status === 'sending'}>
880
+ {status === 'sending' ? 'Sending...' : 'Send Message'}
881
+ </button>
882
+ {status === 'success' && <p>Message sent!</p>}
883
+ {status === 'error' && <p>Failed. Please try again.</p>}
884
+ </form>
885
+ );
886
+ };
887
+ ```
888
+
889
+ #### Configuring API routes
890
+
891
+ API routes are dynamic by default, but if you’re using them to create a static resource such as an XML document, you can export a `getConfig` function that returns a config object with the render property set to `'static'`.
892
+
893
+ ```ts
894
+ // ./src/pages/api/rss.xml.ts
895
+
896
+ export const GET = async () => {
897
+ const rssFeed = generateRSSFeed(items);
898
+
899
+ return new Response(rssFeed, {
900
+ headers: {
901
+ 'Content-Type': 'application/rss+xml',
902
+ },
903
+ });
904
+ };
905
+
906
+ export const getConfig = async () => {
907
+ return {
908
+ render: 'static',
909
+ } as const;
910
+ };
911
+
912
+ const items = [
913
+ {
914
+ title: `Announcing API routes`,
915
+ description: `Easily add public API endpoints to your Waku projects.`
916
+ pubDate: `Tue, 1 Apr 2025 00:00:00 GMT`,
917
+ link: `https://waku.gg/blog/api-routes`,
918
+ },
919
+ // ...
920
+ ];
921
+
922
+ const generateRSSFeed = (items) => {
923
+ const itemsXML = items
924
+ .map(
925
+ (item) => `
926
+ <item>
927
+ <title>${item.title}</title>
928
+ <link>${item.link}</link>
929
+ <pubDate>${item.pubDate}</pubDate>
930
+ <description>${item.description}</description>
931
+ </item>
932
+ `,
933
+ )
934
+ .join('');
935
+
936
+ return `
937
+ <?xml version="1.0" encoding="UTF-8" ?>
938
+ <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
939
+ <channel>
940
+ <atom:link href="https://waku.gg/api/rss.xml" rel="self" type="application/rss+xml" />
941
+ <title>Waku</title>
942
+ <link>https://waku.gg</link>
943
+ <description>The minimal React framework</description>
944
+ ${itemsXML}
945
+ </channel>
946
+ </rss>
947
+ `;
948
+ };
949
+ ```
785
950
 
786
951
  ### Server actions
787
952
 
@@ -1080,3 +1245,7 @@ Please join our friendly [GitHub discussions](https://github.com/wakujs/waku/dis
1080
1245
  ## Roadmap
1081
1246
 
1082
1247
  Waku is in active development and we’re seeking additional contributors. Check out our [roadmap](https://github.com/wakujs/waku/issues/24) for more information.
1248
+
1249
+ ## Contributing
1250
+
1251
+ If you would like to contribute, please see [CONTRIBUTING.md](https://github.com/wakujs/waku/blob/main/CONTRIBUTING.md)!
@@ -98,7 +98,7 @@ export function deployVercelPlugin(opts) {
98
98
  });
99
99
  }
100
100
  const vcConfigJson = {
101
- runtime: 'nodejs20.x',
101
+ runtime: 'nodejs22.x',
102
102
  handler: `${opts.distDir}/${SERVE_JS}`,
103
103
  launcherType: 'Nodejs'
104
104
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/plugins/vite-plugin-deploy-vercel.ts"],"sourcesContent":["import path from 'node:path';\nimport { cpSync, existsSync, mkdirSync, writeFileSync } from 'node:fs';\nimport type { Plugin } from 'vite';\n\nimport { emitPlatformData } from '../builder/platform-data.js';\nimport {\n unstable_getBuildOptions,\n unstable_builderConstants,\n} from '../../server.js';\n\nconst { SRC_ENTRIES, DIST_PUBLIC } = unstable_builderConstants;\nconst SERVE_JS = 'serve-vercel.js';\n\nconst getServeJsContent = (\n distDir: string,\n distPublic: string,\n srcEntriesFile: string,\n honoEnhancerFile: string | undefined,\n) => `\nimport path from 'node:path';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { serverEngine, importHono, importHonoNodeServer } from 'waku/unstable_hono';\n\nconst { Hono } = await importHono();\nconst { getRequestListener } = await importHonoNodeServer();\n\nconst distDir = '${distDir}';\nconst publicDir = '${distPublic}';\nconst loadEntries = () => import('${srcEntriesFile}');\nconst loadHonoEnhancer = async () => {\n ${\n honoEnhancerFile\n ? `return (await import('${honoEnhancerFile}')).default;`\n : `return (fn) => fn;`\n }\n};\n\nconst createApp = (app) => {\n app.use(serverEngine({ cmd: 'start', loadEntries, env: process.env, unstable_onError: new Set() }));\n app.notFound((c) => {\n // FIXME better implementation using node stream?\n const file = path.join(distDir, publicDir, '404.html');\n if (existsSync(file)) {\n return c.html(readFileSync(file, 'utf8'), 404);\n }\n return c.text('404 Not Found', 404);\n });\n return app;\n}\n\nconst honoEnhancer = await loadHonoEnhancer();\nconst app = honoEnhancer(createApp)(new Hono());\n\nexport default getRequestListener(app.fetch);\n`;\n\nexport function deployVercelPlugin(opts: {\n srcDir: string;\n distDir: string;\n basePath: string;\n rscBase: string;\n privateDir: string;\n unstable_honoEnhancer: string | undefined;\n}): Plugin {\n const buildOptions = unstable_getBuildOptions();\n let rootDir: string;\n let entriesFile: string;\n let honoEnhancerFile: string | undefined;\n return {\n name: 'deploy-vercel-plugin',\n config(viteConfig) {\n const { deploy, unstable_phase } = buildOptions;\n if (\n unstable_phase !== 'buildServerBundle' ||\n (deploy !== 'vercel-serverless' && deploy !== 'vercel-static')\n ) {\n return;\n }\n const { input } = viteConfig.build?.rollupOptions ?? {};\n if (input && !(typeof input === 'string') && !(input instanceof Array)) {\n input[SERVE_JS.replace(/\\.js$/, '')] = `${opts.srcDir}/${SERVE_JS}`;\n }\n },\n configResolved(config) {\n rootDir = config.root;\n entriesFile = `${rootDir}/${opts.srcDir}/${SRC_ENTRIES}`;\n if (opts.unstable_honoEnhancer) {\n honoEnhancerFile = `${rootDir}/${opts.unstable_honoEnhancer}`;\n }\n },\n resolveId(source) {\n if (source === `${opts.srcDir}/${SERVE_JS}`) {\n return source;\n }\n },\n load(id) {\n if (id === `${opts.srcDir}/${SERVE_JS}`) {\n return getServeJsContent(\n opts.distDir,\n DIST_PUBLIC,\n entriesFile,\n honoEnhancerFile,\n );\n }\n },\n async closeBundle() {\n const { deploy, unstable_phase } = buildOptions;\n if (\n unstable_phase !== 'buildDeploy' ||\n (deploy !== 'vercel-serverless' && deploy !== 'vercel-static')\n ) {\n return;\n }\n\n const publicDir = path.join(rootDir, opts.distDir, DIST_PUBLIC);\n const outputDir = path.resolve('.vercel', 'output');\n cpSync(publicDir, path.join(outputDir, 'static'), { recursive: true });\n\n if (deploy === 'vercel-serverless') {\n // for serverless function\n const serverlessDir = path.join(\n outputDir,\n 'functions',\n opts.rscBase + '.func',\n );\n mkdirSync(path.join(serverlessDir, opts.distDir), {\n recursive: true,\n });\n cpSync(\n path.join(rootDir, opts.distDir),\n path.join(serverlessDir, opts.distDir),\n { recursive: true },\n );\n await emitPlatformData(path.join(serverlessDir, opts.distDir));\n if (existsSync(path.join(rootDir, opts.privateDir))) {\n cpSync(\n path.join(rootDir, opts.privateDir),\n path.join(serverlessDir, opts.privateDir),\n { recursive: true, dereference: true },\n );\n }\n const vcConfigJson = {\n runtime: 'nodejs20.x',\n handler: `${opts.distDir}/${SERVE_JS}`,\n launcherType: 'Nodejs',\n };\n writeFileSync(\n path.join(serverlessDir, '.vc-config.json'),\n JSON.stringify(vcConfigJson, null, 2),\n );\n writeFileSync(\n path.join(serverlessDir, 'package.json'),\n JSON.stringify({ type: 'module' }, null, 2),\n );\n }\n\n const routes =\n deploy === 'vercel-serverless'\n ? [\n { handle: 'filesystem' },\n {\n src: opts.basePath + '(.*)',\n dest: opts.basePath + opts.rscBase + '/',\n },\n ]\n : undefined;\n const configJson = { version: 3, routes };\n mkdirSync(outputDir, { recursive: true });\n writeFileSync(\n path.join(outputDir, 'config.json'),\n JSON.stringify(configJson, null, 2),\n );\n },\n };\n}\n"],"names":["path","cpSync","existsSync","mkdirSync","writeFileSync","emitPlatformData","unstable_getBuildOptions","unstable_builderConstants","SRC_ENTRIES","DIST_PUBLIC","SERVE_JS","getServeJsContent","distDir","distPublic","srcEntriesFile","honoEnhancerFile","deployVercelPlugin","opts","buildOptions","rootDir","entriesFile","name","config","viteConfig","deploy","unstable_phase","input","build","rollupOptions","Array","replace","srcDir","configResolved","root","unstable_honoEnhancer","resolveId","source","load","id","closeBundle","publicDir","join","outputDir","resolve","recursive","serverlessDir","rscBase","privateDir","dereference","vcConfigJson","runtime","handler","launcherType","JSON","stringify","type","routes","handle","src","basePath","dest","undefined","configJson","version"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/lib/plugins/vite-plugin-deploy-vercel.ts"],"sourcesContent":["import path from 'node:path';\nimport { cpSync, existsSync, mkdirSync, writeFileSync } from 'node:fs';\nimport type { Plugin } from 'vite';\n\nimport { emitPlatformData } from '../builder/platform-data.js';\nimport {\n unstable_getBuildOptions,\n unstable_builderConstants,\n} from '../../server.js';\n\nconst { SRC_ENTRIES, DIST_PUBLIC } = unstable_builderConstants;\nconst SERVE_JS = 'serve-vercel.js';\n\nconst getServeJsContent = (\n distDir: string,\n distPublic: string,\n srcEntriesFile: string,\n honoEnhancerFile: string | undefined,\n) => `\nimport path from 'node:path';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { serverEngine, importHono, importHonoNodeServer } from 'waku/unstable_hono';\n\nconst { Hono } = await importHono();\nconst { getRequestListener } = await importHonoNodeServer();\n\nconst distDir = '${distDir}';\nconst publicDir = '${distPublic}';\nconst loadEntries = () => import('${srcEntriesFile}');\nconst loadHonoEnhancer = async () => {\n ${\n honoEnhancerFile\n ? `return (await import('${honoEnhancerFile}')).default;`\n : `return (fn) => fn;`\n }\n};\n\nconst createApp = (app) => {\n app.use(serverEngine({ cmd: 'start', loadEntries, env: process.env, unstable_onError: new Set() }));\n app.notFound((c) => {\n // FIXME better implementation using node stream?\n const file = path.join(distDir, publicDir, '404.html');\n if (existsSync(file)) {\n return c.html(readFileSync(file, 'utf8'), 404);\n }\n return c.text('404 Not Found', 404);\n });\n return app;\n}\n\nconst honoEnhancer = await loadHonoEnhancer();\nconst app = honoEnhancer(createApp)(new Hono());\n\nexport default getRequestListener(app.fetch);\n`;\n\nexport function deployVercelPlugin(opts: {\n srcDir: string;\n distDir: string;\n basePath: string;\n rscBase: string;\n privateDir: string;\n unstable_honoEnhancer: string | undefined;\n}): Plugin {\n const buildOptions = unstable_getBuildOptions();\n let rootDir: string;\n let entriesFile: string;\n let honoEnhancerFile: string | undefined;\n return {\n name: 'deploy-vercel-plugin',\n config(viteConfig) {\n const { deploy, unstable_phase } = buildOptions;\n if (\n unstable_phase !== 'buildServerBundle' ||\n (deploy !== 'vercel-serverless' && deploy !== 'vercel-static')\n ) {\n return;\n }\n const { input } = viteConfig.build?.rollupOptions ?? {};\n if (input && !(typeof input === 'string') && !(input instanceof Array)) {\n input[SERVE_JS.replace(/\\.js$/, '')] = `${opts.srcDir}/${SERVE_JS}`;\n }\n },\n configResolved(config) {\n rootDir = config.root;\n entriesFile = `${rootDir}/${opts.srcDir}/${SRC_ENTRIES}`;\n if (opts.unstable_honoEnhancer) {\n honoEnhancerFile = `${rootDir}/${opts.unstable_honoEnhancer}`;\n }\n },\n resolveId(source) {\n if (source === `${opts.srcDir}/${SERVE_JS}`) {\n return source;\n }\n },\n load(id) {\n if (id === `${opts.srcDir}/${SERVE_JS}`) {\n return getServeJsContent(\n opts.distDir,\n DIST_PUBLIC,\n entriesFile,\n honoEnhancerFile,\n );\n }\n },\n async closeBundle() {\n const { deploy, unstable_phase } = buildOptions;\n if (\n unstable_phase !== 'buildDeploy' ||\n (deploy !== 'vercel-serverless' && deploy !== 'vercel-static')\n ) {\n return;\n }\n\n const publicDir = path.join(rootDir, opts.distDir, DIST_PUBLIC);\n const outputDir = path.resolve('.vercel', 'output');\n cpSync(publicDir, path.join(outputDir, 'static'), { recursive: true });\n\n if (deploy === 'vercel-serverless') {\n // for serverless function\n const serverlessDir = path.join(\n outputDir,\n 'functions',\n opts.rscBase + '.func',\n );\n mkdirSync(path.join(serverlessDir, opts.distDir), {\n recursive: true,\n });\n cpSync(\n path.join(rootDir, opts.distDir),\n path.join(serverlessDir, opts.distDir),\n { recursive: true },\n );\n await emitPlatformData(path.join(serverlessDir, opts.distDir));\n if (existsSync(path.join(rootDir, opts.privateDir))) {\n cpSync(\n path.join(rootDir, opts.privateDir),\n path.join(serverlessDir, opts.privateDir),\n { recursive: true, dereference: true },\n );\n }\n const vcConfigJson = {\n runtime: 'nodejs22.x',\n handler: `${opts.distDir}/${SERVE_JS}`,\n launcherType: 'Nodejs',\n };\n writeFileSync(\n path.join(serverlessDir, '.vc-config.json'),\n JSON.stringify(vcConfigJson, null, 2),\n );\n writeFileSync(\n path.join(serverlessDir, 'package.json'),\n JSON.stringify({ type: 'module' }, null, 2),\n );\n }\n\n const routes =\n deploy === 'vercel-serverless'\n ? [\n { handle: 'filesystem' },\n {\n src: opts.basePath + '(.*)',\n dest: opts.basePath + opts.rscBase + '/',\n },\n ]\n : undefined;\n const configJson = { version: 3, routes };\n mkdirSync(outputDir, { recursive: true });\n writeFileSync(\n path.join(outputDir, 'config.json'),\n JSON.stringify(configJson, null, 2),\n );\n },\n };\n}\n"],"names":["path","cpSync","existsSync","mkdirSync","writeFileSync","emitPlatformData","unstable_getBuildOptions","unstable_builderConstants","SRC_ENTRIES","DIST_PUBLIC","SERVE_JS","getServeJsContent","distDir","distPublic","srcEntriesFile","honoEnhancerFile","deployVercelPlugin","opts","buildOptions","rootDir","entriesFile","name","config","viteConfig","deploy","unstable_phase","input","build","rollupOptions","Array","replace","srcDir","configResolved","root","unstable_honoEnhancer","resolveId","source","load","id","closeBundle","publicDir","join","outputDir","resolve","recursive","serverlessDir","rscBase","privateDir","dereference","vcConfigJson","runtime","handler","launcherType","JSON","stringify","type","routes","handle","src","basePath","dest","undefined","configJson","version"],"mappings":"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"}
@@ -1,4 +1,3 @@
1
- import * as swc from '@swc/core';
2
1
  const patchRsdw = (code, type)=>{
3
2
  code = code.replace(/__webpack_(\w+)__/g, (_, p1)=>`__WAKU_${type}_${p1.toUpperCase()}__`);
4
3
  const index = code.indexOf('function requireAsyncModule(id)');
@@ -57,9 +56,7 @@ export function rscRsdwPlugin() {
57
56
  '/react-server-dom-webpack-server.edge.development.js',
58
57
  '/react-server-dom-webpack_server__edge.js'
59
58
  ].some((suffix)=>file.endsWith(suffix))) {
60
- return swc.transformSync(patchRsdw(code, 'SERVER'), {
61
- sourceMaps: true
62
- });
59
+ return patchRsdw(code, 'SERVER');
63
60
  }
64
61
  if ([
65
62
  '/react-server-dom-webpack-client.edge.production.js',
@@ -69,9 +66,7 @@ export function rscRsdwPlugin() {
69
66
  '/react-server-dom-webpack_client.js',
70
67
  '/react-server-dom-webpack_client__edge.js'
71
68
  ].some((suffix)=>file.endsWith(suffix))) {
72
- return swc.transformSync(patchRsdw(code, 'CLIENT'), {
73
- sourceMaps: true
74
- });
69
+ return patchRsdw(code, 'CLIENT');
75
70
  }
76
71
  if (code.includes('function requireAsyncModule(id)')) {
77
72
  throw new Error('rscRsdwPlugin: Untransformed file: ' + file);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/plugins/vite-plugin-rsc-rsdw.ts"],"sourcesContent":["import type { Plugin } from 'vite';\nimport * as swc from '@swc/core';\n\nconst patchRsdw = (code: string, type: 'SERVER' | 'CLIENT') => {\n code = code.replace(\n /__webpack_(\\w+)__/g,\n (_, p1) => `__WAKU_${type}_${p1.toUpperCase()}__`,\n );\n const index = code.indexOf('function requireAsyncModule(id)');\n if (index === -1) {\n throw new Error('rscRsdwPlugin: Unexpected code structure');\n }\n\n return code.replaceAll(\n 'function requireAsyncModule(id)',\n `\nglobalThis.__WAKU_${type}_MODULE_LOADING__ ||= new Map();\nglobalThis.__WAKU_${type}_MODULE_CACHE__ ||= new Map();\nglobalThis.__WAKU_${type}_CHUNK_LOAD__ ||= (id) => {\n if (!globalThis.__WAKU_${type}_MODULE_LOADING__.has(id)) {\n globalThis.__WAKU_${type}_MODULE_LOADING__.set(\n id,\n globalThis.__WAKU_${type}_IMPORT__(id).then((m) => {\n globalThis.__WAKU_${type}_MODULE_CACHE__.set(id, m);\n })\n );\n }\n return globalThis.__WAKU_${type}_MODULE_LOADING__.get(id);\n};\nglobalThis.__WAKU_${type}_REQUIRE__ ||= (id) => globalThis.__WAKU_${type}_MODULE_CACHE__.get(id);\nfunction requireAsyncModule(id)\n`,\n );\n};\n\nexport function rscRsdwPlugin(): Plugin {\n let mode: string;\n return {\n name: 'rsc-rsdw-plugin',\n enforce: 'pre',\n config(_config, env) {\n mode = env.mode;\n },\n async resolveId(id, importer, options) {\n if (id === 'react-server-dom-webpack/client.edge') {\n const resolved = await this.resolve(id, importer, options);\n if (resolved) {\n id = resolved.id;\n }\n }\n if (id.endsWith('/react-server-dom-webpack/client.edge.js')) {\n id =\n id.slice(0, -'/client.edge.js'.length) +\n `/cjs/react-server-dom-webpack-client.edge.${mode === 'production' ? 'production' : 'development'}.js`;\n return this.resolve(id, importer, options);\n }\n },\n transform(code, id) {\n const [file, opt] = id.split('?');\n if (\n ['commonjs-exports', 'commonjs-proxy', 'commonjs-entry'].includes(opt!)\n ) {\n return;\n }\n if (\n [\n '/react-server-dom-webpack-server.edge.production.js',\n '/react-server-dom-webpack-server.edge.development.js',\n '/react-server-dom-webpack_server__edge.js',\n ].some((suffix) => file!.endsWith(suffix))\n ) {\n return swc.transformSync(patchRsdw(code, 'SERVER'), {\n sourceMaps: true,\n });\n }\n if (\n [\n '/react-server-dom-webpack-client.edge.production.js',\n '/react-server-dom-webpack-client.edge.development.js',\n '/react-server-dom-webpack-client.browser.production.js',\n '/react-server-dom-webpack-client.browser.development.js',\n '/react-server-dom-webpack_client.js',\n '/react-server-dom-webpack_client__edge.js',\n ].some((suffix) => file!.endsWith(suffix))\n ) {\n return swc.transformSync(patchRsdw(code, 'CLIENT'), {\n sourceMaps: true,\n });\n }\n if (code.includes('function requireAsyncModule(id)')) {\n throw new Error('rscRsdwPlugin: Untransformed file: ' + file);\n }\n },\n };\n}\n"],"names":["swc","patchRsdw","code","type","replace","_","p1","toUpperCase","index","indexOf","Error","replaceAll","rscRsdwPlugin","mode","name","enforce","config","_config","env","resolveId","id","importer","options","resolved","resolve","endsWith","slice","length","transform","file","opt","split","includes","some","suffix","transformSync","sourceMaps"],"mappings":"AACA,YAAYA,SAAS,YAAY;AAEjC,MAAMC,YAAY,CAACC,MAAcC;IAC/BD,OAAOA,KAAKE,OAAO,CACjB,sBACA,CAACC,GAAGC,KAAO,CAAC,OAAO,EAAEH,KAAK,CAAC,EAAEG,GAAGC,WAAW,GAAG,EAAE,CAAC;IAEnD,MAAMC,QAAQN,KAAKO,OAAO,CAAC;IAC3B,IAAID,UAAU,CAAC,GAAG;QAChB,MAAM,IAAIE,MAAM;IAClB;IAEA,OAAOR,KAAKS,UAAU,CACpB,mCACA,CAAC;kBACa,EAAER,KAAK;kBACP,EAAEA,KAAK;kBACP,EAAEA,KAAK;yBACA,EAAEA,KAAK;sBACV,EAAEA,KAAK;;wBAEL,EAAEA,KAAK;0BACL,EAAEA,KAAK;;;;2BAIN,EAAEA,KAAK;;kBAEhB,EAAEA,KAAK,yCAAyC,EAAEA,KAAK;;AAEzE,CAAC;AAED;AAEA,OAAO,SAASS;IACd,IAAIC;IACJ,OAAO;QACLC,MAAM;QACNC,SAAS;QACTC,QAAOC,OAAO,EAAEC,GAAG;YACjBL,OAAOK,IAAIL,IAAI;QACjB;QACA,MAAMM,WAAUC,EAAE,EAAEC,QAAQ,EAAEC,OAAO;YACnC,IAAIF,OAAO,wCAAwC;gBACjD,MAAMG,WAAW,MAAM,IAAI,CAACC,OAAO,CAACJ,IAAIC,UAAUC;gBAClD,IAAIC,UAAU;oBACZH,KAAKG,SAASH,EAAE;gBAClB;YACF;YACA,IAAIA,GAAGK,QAAQ,CAAC,6CAA6C;gBAC3DL,KACEA,GAAGM,KAAK,CAAC,GAAG,CAAC,kBAAkBC,MAAM,IACrC,CAAC,0CAA0C,EAAEd,SAAS,eAAe,eAAe,cAAc,GAAG,CAAC;gBACxG,OAAO,IAAI,CAACW,OAAO,CAACJ,IAAIC,UAAUC;YACpC;QACF;QACAM,WAAU1B,IAAI,EAAEkB,EAAE;YAChB,MAAM,CAACS,MAAMC,IAAI,GAAGV,GAAGW,KAAK,CAAC;YAC7B,IACE;gBAAC;gBAAoB;gBAAkB;aAAiB,CAACC,QAAQ,CAACF,MAClE;gBACA;YACF;YACA,IACE;gBACE;gBACA;gBACA;aACD,CAACG,IAAI,CAAC,CAACC,SAAWL,KAAMJ,QAAQ,CAACS,UAClC;gBACA,OAAOlC,IAAImC,aAAa,CAAClC,UAAUC,MAAM,WAAW;oBAClDkC,YAAY;gBACd;YACF;YACA,IACE;gBACE;gBACA;gBACA;gBACA;gBACA;gBACA;aACD,CAACH,IAAI,CAAC,CAACC,SAAWL,KAAMJ,QAAQ,CAACS,UAClC;gBACA,OAAOlC,IAAImC,aAAa,CAAClC,UAAUC,MAAM,WAAW;oBAClDkC,YAAY;gBACd;YACF;YACA,IAAIlC,KAAK8B,QAAQ,CAAC,oCAAoC;gBACpD,MAAM,IAAItB,MAAM,wCAAwCmB;YAC1D;QACF;IACF;AACF"}
1
+ {"version":3,"sources":["../../../src/lib/plugins/vite-plugin-rsc-rsdw.ts"],"sourcesContent":["import type { Plugin } from 'vite';\n\nconst patchRsdw = (code: string, type: 'SERVER' | 'CLIENT') => {\n code = code.replace(\n /__webpack_(\\w+)__/g,\n (_, p1) => `__WAKU_${type}_${p1.toUpperCase()}__`,\n );\n const index = code.indexOf('function requireAsyncModule(id)');\n if (index === -1) {\n throw new Error('rscRsdwPlugin: Unexpected code structure');\n }\n\n return code.replaceAll(\n 'function requireAsyncModule(id)',\n `\nglobalThis.__WAKU_${type}_MODULE_LOADING__ ||= new Map();\nglobalThis.__WAKU_${type}_MODULE_CACHE__ ||= new Map();\nglobalThis.__WAKU_${type}_CHUNK_LOAD__ ||= (id) => {\n if (!globalThis.__WAKU_${type}_MODULE_LOADING__.has(id)) {\n globalThis.__WAKU_${type}_MODULE_LOADING__.set(\n id,\n globalThis.__WAKU_${type}_IMPORT__(id).then((m) => {\n globalThis.__WAKU_${type}_MODULE_CACHE__.set(id, m);\n })\n );\n }\n return globalThis.__WAKU_${type}_MODULE_LOADING__.get(id);\n};\nglobalThis.__WAKU_${type}_REQUIRE__ ||= (id) => globalThis.__WAKU_${type}_MODULE_CACHE__.get(id);\nfunction requireAsyncModule(id)\n`,\n );\n};\n\nexport function rscRsdwPlugin(): Plugin {\n let mode: string;\n return {\n name: 'rsc-rsdw-plugin',\n enforce: 'pre',\n config(_config, env) {\n mode = env.mode;\n },\n async resolveId(id, importer, options) {\n if (id === 'react-server-dom-webpack/client.edge') {\n const resolved = await this.resolve(id, importer, options);\n if (resolved) {\n id = resolved.id;\n }\n }\n if (id.endsWith('/react-server-dom-webpack/client.edge.js')) {\n id =\n id.slice(0, -'/client.edge.js'.length) +\n `/cjs/react-server-dom-webpack-client.edge.${mode === 'production' ? 'production' : 'development'}.js`;\n return this.resolve(id, importer, options);\n }\n },\n transform(code, id) {\n const [file, opt] = id.split('?');\n if (\n ['commonjs-exports', 'commonjs-proxy', 'commonjs-entry'].includes(opt!)\n ) {\n return;\n }\n if (\n [\n '/react-server-dom-webpack-server.edge.production.js',\n '/react-server-dom-webpack-server.edge.development.js',\n '/react-server-dom-webpack_server__edge.js',\n ].some((suffix) => file!.endsWith(suffix))\n ) {\n return patchRsdw(code, 'SERVER');\n }\n if (\n [\n '/react-server-dom-webpack-client.edge.production.js',\n '/react-server-dom-webpack-client.edge.development.js',\n '/react-server-dom-webpack-client.browser.production.js',\n '/react-server-dom-webpack-client.browser.development.js',\n '/react-server-dom-webpack_client.js',\n '/react-server-dom-webpack_client__edge.js',\n ].some((suffix) => file!.endsWith(suffix))\n ) {\n return patchRsdw(code, 'CLIENT');\n }\n if (code.includes('function requireAsyncModule(id)')) {\n throw new Error('rscRsdwPlugin: Untransformed file: ' + file);\n }\n },\n };\n}\n"],"names":["patchRsdw","code","type","replace","_","p1","toUpperCase","index","indexOf","Error","replaceAll","rscRsdwPlugin","mode","name","enforce","config","_config","env","resolveId","id","importer","options","resolved","resolve","endsWith","slice","length","transform","file","opt","split","includes","some","suffix"],"mappings":"AAEA,MAAMA,YAAY,CAACC,MAAcC;IAC/BD,OAAOA,KAAKE,OAAO,CACjB,sBACA,CAACC,GAAGC,KAAO,CAAC,OAAO,EAAEH,KAAK,CAAC,EAAEG,GAAGC,WAAW,GAAG,EAAE,CAAC;IAEnD,MAAMC,QAAQN,KAAKO,OAAO,CAAC;IAC3B,IAAID,UAAU,CAAC,GAAG;QAChB,MAAM,IAAIE,MAAM;IAClB;IAEA,OAAOR,KAAKS,UAAU,CACpB,mCACA,CAAC;kBACa,EAAER,KAAK;kBACP,EAAEA,KAAK;kBACP,EAAEA,KAAK;yBACA,EAAEA,KAAK;sBACV,EAAEA,KAAK;;wBAEL,EAAEA,KAAK;0BACL,EAAEA,KAAK;;;;2BAIN,EAAEA,KAAK;;kBAEhB,EAAEA,KAAK,yCAAyC,EAAEA,KAAK;;AAEzE,CAAC;AAED;AAEA,OAAO,SAASS;IACd,IAAIC;IACJ,OAAO;QACLC,MAAM;QACNC,SAAS;QACTC,QAAOC,OAAO,EAAEC,GAAG;YACjBL,OAAOK,IAAIL,IAAI;QACjB;QACA,MAAMM,WAAUC,EAAE,EAAEC,QAAQ,EAAEC,OAAO;YACnC,IAAIF,OAAO,wCAAwC;gBACjD,MAAMG,WAAW,MAAM,IAAI,CAACC,OAAO,CAACJ,IAAIC,UAAUC;gBAClD,IAAIC,UAAU;oBACZH,KAAKG,SAASH,EAAE;gBAClB;YACF;YACA,IAAIA,GAAGK,QAAQ,CAAC,6CAA6C;gBAC3DL,KACEA,GAAGM,KAAK,CAAC,GAAG,CAAC,kBAAkBC,MAAM,IACrC,CAAC,0CAA0C,EAAEd,SAAS,eAAe,eAAe,cAAc,GAAG,CAAC;gBACxG,OAAO,IAAI,CAACW,OAAO,CAACJ,IAAIC,UAAUC;YACpC;QACF;QACAM,WAAU1B,IAAI,EAAEkB,EAAE;YAChB,MAAM,CAACS,MAAMC,IAAI,GAAGV,GAAGW,KAAK,CAAC;YAC7B,IACE;gBAAC;gBAAoB;gBAAkB;aAAiB,CAACC,QAAQ,CAACF,MAClE;gBACA;YACF;YACA,IACE;gBACE;gBACA;gBACA;aACD,CAACG,IAAI,CAAC,CAACC,SAAWL,KAAMJ,QAAQ,CAACS,UAClC;gBACA,OAAOjC,UAAUC,MAAM;YACzB;YACA,IACE;gBACE;gBACA;gBACA;gBACA;gBACA;gBACA;aACD,CAAC+B,IAAI,CAAC,CAACC,SAAWL,KAAMJ,QAAQ,CAACS,UAClC;gBACA,OAAOjC,UAAUC,MAAM;YACzB;YACA,IAAIA,KAAK8B,QAAQ,CAAC,oCAAoC;gBACpD,MAAM,IAAItB,MAAM,wCAAwCmB;YAC1D;QACF;IACF;AACF"}
@@ -4,6 +4,7 @@ import { bufferToString, parseFormData } from '../utils/buffer.js';
4
4
  const resolveClientEntryForPrd = (id, config)=>{
5
5
  return config.basePath + id + '.js';
6
6
  };
7
+ const temporaryReferencesMap = new WeakMap();
7
8
  export async function renderRsc(config, ctx, elements, onError, moduleIdCallback) {
8
9
  const modules = ctx.unstable_modules;
9
10
  if (!modules) {
@@ -33,7 +34,8 @@ export async function renderRsc(config, ctx, elements, onError, moduleIdCallback
33
34
  // This is not correct according to the type though.
34
35
  return err.digest;
35
36
  }
36
- }
37
+ },
38
+ temporaryReferences: temporaryReferencesMap.get(ctx)
37
39
  });
38
40
  }
39
41
  export function renderRscElement(config, ctx, element, onError) {
@@ -64,7 +66,8 @@ export function renderRscElement(config, ctx, element, onError) {
64
66
  // This is not correct according to the type though.
65
67
  return err.digest;
66
68
  }
67
- }
69
+ },
70
+ temporaryReferences: temporaryReferencesMap.get(ctx)
68
71
  });
69
72
  }
70
73
  export async function collectClientModules(config, rsdwServer, elements) {
@@ -105,7 +108,7 @@ export async function decodeBody(ctx) {
105
108
  if (!modules) {
106
109
  throw new Error('handler middleware required (missing modules)');
107
110
  }
108
- const { default: { decodeReply } } = modules.rsdwServer;
111
+ const { default: { decodeReply, createTemporaryReferenceSet } } = modules.rsdwServer;
109
112
  const serverBundlerConfig = new Proxy({}, {
110
113
  get (_target, encodedId) {
111
114
  const [fileId, name] = encodedId.split('#');
@@ -122,15 +125,21 @@ export async function decodeBody(ctx) {
122
125
  });
123
126
  let decodedBody = ctx.req.url.searchParams;
124
127
  if (ctx.req.body) {
128
+ const temporaryReferences = createTemporaryReferenceSet();
129
+ temporaryReferencesMap.set(ctx, temporaryReferences);
125
130
  const bodyBuf = await streamToArrayBuffer(ctx.req.body);
126
131
  const contentType = ctx.req.headers['content-type'];
127
132
  if (typeof contentType === 'string' && contentType.startsWith('multipart/form-data')) {
128
133
  // XXX This doesn't support streaming unlike busboy
129
134
  const formData = await parseFormData(bodyBuf, contentType);
130
- decodedBody = await decodeReply(formData, serverBundlerConfig);
135
+ decodedBody = await decodeReply(formData, serverBundlerConfig, {
136
+ temporaryReferences
137
+ });
131
138
  } else if (bodyBuf.byteLength > 0) {
132
139
  const bodyStr = bufferToString(bodyBuf);
133
- decodedBody = await decodeReply(bodyStr, serverBundlerConfig);
140
+ decodedBody = await decodeReply(bodyStr, serverBundlerConfig, {
141
+ temporaryReferences
142
+ });
134
143
  }
135
144
  }
136
145
  return decodedBody;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/renderers/rsc.ts"],"sourcesContent":["import type { ReactNode } from 'react';\nimport type { default as RSDWServerType } from 'react-server-dom-webpack/server.edge';\n\nimport type { ConfigPrd } from '../config.js';\n// TODO move types somewhere\nimport type { HandlerContext, ErrorCallback } from '../middleware/types.js';\nimport { filePathToFileURL } from '../utils/path.js';\nimport { streamToArrayBuffer } from '../utils/stream.js';\nimport { bufferToString, parseFormData } from '../utils/buffer.js';\n\nconst resolveClientEntryForPrd = (id: string, config: { basePath: string }) => {\n return config.basePath + id + '.js';\n};\n\nexport async function renderRsc(\n config: ConfigPrd,\n ctx: Pick<HandlerContext, 'unstable_modules' | 'unstable_devServer'>,\n elements: Record<string, unknown>,\n onError: Set<ErrorCallback>,\n moduleIdCallback?: (id: string) => void,\n): Promise<ReadableStream> {\n const modules = ctx.unstable_modules;\n if (!modules) {\n throw new Error('handler middleware required (missing modules)');\n }\n const {\n default: { renderToReadableStream },\n } = modules.rsdwServer as { default: typeof RSDWServerType };\n const resolveClientEntry = ctx.unstable_devServer\n ? ctx.unstable_devServer.resolveClientEntry\n : resolveClientEntryForPrd;\n const clientBundlerConfig = new Proxy(\n {},\n {\n get(_target, encodedId: string) {\n const [file, name] = encodedId.split('#') as [string, string];\n const id = resolveClientEntry(file, config);\n moduleIdCallback?.(id);\n return { id, chunks: [id], name, async: true };\n },\n },\n );\n return renderToReadableStream(elements, clientBundlerConfig, {\n onError: (err: unknown) => {\n onError.forEach((fn) => fn(err, ctx as HandlerContext, 'rsc'));\n if (typeof (err as any)?.digest === 'string') {\n // This is not correct according to the type though.\n return (err as { digest: string }).digest;\n }\n },\n });\n}\n\nexport function renderRscElement(\n config: ConfigPrd,\n ctx: Pick<HandlerContext, 'unstable_modules' | 'unstable_devServer'>,\n element: ReactNode,\n onError: Set<ErrorCallback>,\n): ReadableStream {\n const modules = ctx.unstable_modules;\n if (!modules) {\n throw new Error('handler middleware required (missing modules)');\n }\n const {\n default: { renderToReadableStream },\n } = modules.rsdwServer as { default: typeof RSDWServerType };\n const resolveClientEntry = ctx.unstable_devServer\n ? ctx.unstable_devServer.resolveClientEntry\n : resolveClientEntryForPrd;\n const clientBundlerConfig = new Proxy(\n {},\n {\n get(_target, encodedId: string) {\n const [file, name] = encodedId.split('#') as [string, string];\n const id = resolveClientEntry(file, config);\n return { id, chunks: [id], name, async: true };\n },\n },\n );\n return renderToReadableStream(element, clientBundlerConfig, {\n onError: (err: unknown) => {\n onError.forEach((fn) => fn(err, ctx as HandlerContext, 'rsc'));\n if (typeof (err as any)?.digest === 'string') {\n // This is not correct according to the type though.\n return (err as { digest: string }).digest;\n }\n },\n });\n}\n\nexport async function collectClientModules(\n config: ConfigPrd,\n rsdwServer: { default: typeof RSDWServerType },\n elements: Record<string, unknown>,\n): Promise<string[]> {\n const {\n default: { renderToReadableStream },\n } = rsdwServer;\n const idSet = new Set<string>();\n const clientBundlerConfig = new Proxy(\n {},\n {\n get(_target, encodedId: string) {\n const [file, name] = encodedId.split('#') as [string, string];\n const id = resolveClientEntryForPrd(file, config);\n idSet.add(id);\n return { id, chunks: [id], name, async: true };\n },\n },\n );\n const readable = renderToReadableStream(elements, clientBundlerConfig);\n await new Promise<void>((resolve, reject) => {\n const writable = new WritableStream({\n close() {\n resolve();\n },\n abort(reason) {\n reject(reason);\n },\n });\n readable.pipeTo(writable).catch(reject);\n });\n return Array.from(idSet);\n}\n\nexport async function decodeBody(\n ctx: Pick<HandlerContext, 'unstable_modules' | 'unstable_devServer' | 'req'>,\n): Promise<unknown> {\n const isDev = !!ctx.unstable_devServer;\n const modules = ctx.unstable_modules;\n if (!modules) {\n throw new Error('handler middleware required (missing modules)');\n }\n const {\n default: { decodeReply },\n } = modules.rsdwServer as { default: typeof RSDWServerType };\n const serverBundlerConfig = new Proxy(\n {},\n {\n get(_target, encodedId: string) {\n const [fileId, name] = encodedId.split('#') as [string, string];\n const id = isDev ? filePathToFileURL(fileId) : fileId + '.js';\n return { id, chunks: [id], name, async: true };\n },\n },\n );\n let decodedBody: unknown = ctx.req.url.searchParams;\n if (ctx.req.body) {\n const bodyBuf = await streamToArrayBuffer(ctx.req.body);\n const contentType = ctx.req.headers['content-type'];\n if (\n typeof contentType === 'string' &&\n contentType.startsWith('multipart/form-data')\n ) {\n // XXX This doesn't support streaming unlike busboy\n const formData = await parseFormData(bodyBuf, contentType);\n decodedBody = await decodeReply(formData, serverBundlerConfig);\n } else if (bodyBuf.byteLength > 0) {\n const bodyStr = bufferToString(bodyBuf);\n decodedBody = await decodeReply(bodyStr, serverBundlerConfig);\n }\n }\n return decodedBody;\n}\n\nconst EXTRACT_FORM_STATE_SYMBOL = Symbol('EXTRACT_FORM_STATE');\ntype ExtractFormState = (\n actionResult: unknown,\n) => ReturnType<(typeof RSDWServerType)['decodeFormState']>;\n\nconst setExtractFormState = (\n ctx: object,\n extractFormState: ExtractFormState,\n) => {\n (\n ctx as unknown as Record<typeof EXTRACT_FORM_STATE_SYMBOL, ExtractFormState>\n )[EXTRACT_FORM_STATE_SYMBOL] = extractFormState;\n};\n\nexport const getExtractFormState = (ctx: object): ExtractFormState => {\n const extractFormState = (\n ctx as unknown as Record<\n typeof EXTRACT_FORM_STATE_SYMBOL,\n ExtractFormState | undefined\n >\n )[EXTRACT_FORM_STATE_SYMBOL];\n if (!extractFormState) {\n throw new Error('extractFormState not set');\n }\n return extractFormState;\n};\n\nexport async function decodePostAction(\n ctx: Pick<HandlerContext, 'unstable_modules' | 'unstable_devServer' | 'req'>,\n): Promise<(() => Promise<unknown>) | null> {\n const isDev = !!ctx.unstable_devServer;\n const modules = ctx.unstable_modules;\n if (!modules) {\n throw new Error('handler middleware required (missing modules)');\n }\n const {\n default: { decodeAction, decodeFormState },\n } = modules.rsdwServer as { default: typeof RSDWServerType };\n if (ctx.req.body) {\n const contentType = ctx.req.headers['content-type'];\n if (\n typeof contentType === 'string' &&\n contentType.startsWith('multipart/form-data')\n ) {\n const [stream1, stream2] = ctx.req.body.tee();\n ctx.req.body = stream1;\n const bodyBuf = await streamToArrayBuffer(stream2);\n // XXX This doesn't support streaming unlike busboy\n const formData = await parseFormData(bodyBuf, contentType);\n if (\n Array.from(formData.keys()).every((key) => !key.startsWith('$ACTION_'))\n ) {\n // Assuming this is probably for api\n return null;\n }\n const serverBundlerConfig = new Proxy(\n {},\n {\n get(_target, encodedId: string) {\n const [fileId, name] = encodedId.split('#') as [string, string];\n const id = isDev ? filePathToFileURL(fileId) : fileId + '.js';\n return { id, chunks: [id], name, async: true };\n },\n },\n );\n setExtractFormState(ctx, (actionResult) =>\n decodeFormState(actionResult, formData, serverBundlerConfig),\n );\n return decodeAction(formData, serverBundlerConfig);\n }\n }\n return null;\n}\n"],"names":["filePathToFileURL","streamToArrayBuffer","bufferToString","parseFormData","resolveClientEntryForPrd","id","config","basePath","renderRsc","ctx","elements","onError","moduleIdCallback","modules","unstable_modules","Error","default","renderToReadableStream","rsdwServer","resolveClientEntry","unstable_devServer","clientBundlerConfig","Proxy","get","_target","encodedId","file","name","split","chunks","async","err","forEach","fn","digest","renderRscElement","element","collectClientModules","idSet","Set","add","readable","Promise","resolve","reject","writable","WritableStream","close","abort","reason","pipeTo","catch","Array","from","decodeBody","isDev","decodeReply","serverBundlerConfig","fileId","decodedBody","req","url","searchParams","body","bodyBuf","contentType","headers","startsWith","formData","byteLength","bodyStr","EXTRACT_FORM_STATE_SYMBOL","Symbol","setExtractFormState","extractFormState","getExtractFormState","decodePostAction","decodeAction","decodeFormState","stream1","stream2","tee","keys","every","key","actionResult"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/lib/renderers/rsc.ts"],"sourcesContent":["import type { ReactNode } from 'react';\nimport type {\n default as RSDWServerType,\n TemporaryReferenceSet,\n} from 'react-server-dom-webpack/server.edge';\n\nimport type { ConfigPrd } from '../config.js';\n// TODO move types somewhere\nimport type { HandlerContext, ErrorCallback } from '../middleware/types.js';\nimport { filePathToFileURL } from '../utils/path.js';\nimport { streamToArrayBuffer } from '../utils/stream.js';\nimport { bufferToString, parseFormData } from '../utils/buffer.js';\n\nconst resolveClientEntryForPrd = (id: string, config: { basePath: string }) => {\n return config.basePath + id + '.js';\n};\n\nconst temporaryReferencesMap = new WeakMap<\n Pick<HandlerContext, never>,\n TemporaryReferenceSet\n>();\n\nexport async function renderRsc(\n config: ConfigPrd,\n ctx: Pick<HandlerContext, 'unstable_modules' | 'unstable_devServer'>,\n elements: Record<string, unknown>,\n onError: Set<ErrorCallback>,\n moduleIdCallback?: (id: string) => void,\n): Promise<ReadableStream> {\n const modules = ctx.unstable_modules;\n if (!modules) {\n throw new Error('handler middleware required (missing modules)');\n }\n const {\n default: { renderToReadableStream },\n } = modules.rsdwServer as { default: typeof RSDWServerType };\n const resolveClientEntry = ctx.unstable_devServer\n ? ctx.unstable_devServer.resolveClientEntry\n : resolveClientEntryForPrd;\n const clientBundlerConfig = new Proxy(\n {},\n {\n get(_target, encodedId: string) {\n const [file, name] = encodedId.split('#') as [string, string];\n const id = resolveClientEntry(file, config);\n moduleIdCallback?.(id);\n return { id, chunks: [id], name, async: true };\n },\n },\n );\n return renderToReadableStream(elements, clientBundlerConfig, {\n onError: (err: unknown) => {\n onError.forEach((fn) => fn(err, ctx as HandlerContext, 'rsc'));\n if (typeof (err as any)?.digest === 'string') {\n // This is not correct according to the type though.\n return (err as { digest: string }).digest;\n }\n },\n temporaryReferences: temporaryReferencesMap.get(ctx),\n });\n}\n\nexport function renderRscElement(\n config: ConfigPrd,\n ctx: Pick<HandlerContext, 'unstable_modules' | 'unstable_devServer'>,\n element: ReactNode,\n onError: Set<ErrorCallback>,\n): ReadableStream {\n const modules = ctx.unstable_modules;\n if (!modules) {\n throw new Error('handler middleware required (missing modules)');\n }\n const {\n default: { renderToReadableStream },\n } = modules.rsdwServer as { default: typeof RSDWServerType };\n const resolveClientEntry = ctx.unstable_devServer\n ? ctx.unstable_devServer.resolveClientEntry\n : resolveClientEntryForPrd;\n const clientBundlerConfig = new Proxy(\n {},\n {\n get(_target, encodedId: string) {\n const [file, name] = encodedId.split('#') as [string, string];\n const id = resolveClientEntry(file, config);\n return { id, chunks: [id], name, async: true };\n },\n },\n );\n return renderToReadableStream(element, clientBundlerConfig, {\n onError: (err: unknown) => {\n onError.forEach((fn) => fn(err, ctx as HandlerContext, 'rsc'));\n if (typeof (err as any)?.digest === 'string') {\n // This is not correct according to the type though.\n return (err as { digest: string }).digest;\n }\n },\n temporaryReferences: temporaryReferencesMap.get(ctx),\n });\n}\n\nexport async function collectClientModules(\n config: ConfigPrd,\n rsdwServer: { default: typeof RSDWServerType },\n elements: Record<string, unknown>,\n): Promise<string[]> {\n const {\n default: { renderToReadableStream },\n } = rsdwServer;\n const idSet = new Set<string>();\n const clientBundlerConfig = new Proxy(\n {},\n {\n get(_target, encodedId: string) {\n const [file, name] = encodedId.split('#') as [string, string];\n const id = resolveClientEntryForPrd(file, config);\n idSet.add(id);\n return { id, chunks: [id], name, async: true };\n },\n },\n );\n const readable = renderToReadableStream(elements, clientBundlerConfig);\n await new Promise<void>((resolve, reject) => {\n const writable = new WritableStream({\n close() {\n resolve();\n },\n abort(reason) {\n reject(reason);\n },\n });\n readable.pipeTo(writable).catch(reject);\n });\n return Array.from(idSet);\n}\n\nexport async function decodeBody(\n ctx: Pick<HandlerContext, 'unstable_modules' | 'unstable_devServer' | 'req'>,\n): Promise<unknown> {\n const isDev = !!ctx.unstable_devServer;\n const modules = ctx.unstable_modules;\n if (!modules) {\n throw new Error('handler middleware required (missing modules)');\n }\n const {\n default: { decodeReply, createTemporaryReferenceSet },\n } = modules.rsdwServer as { default: typeof RSDWServerType };\n const serverBundlerConfig = new Proxy(\n {},\n {\n get(_target, encodedId: string) {\n const [fileId, name] = encodedId.split('#') as [string, string];\n const id = isDev ? filePathToFileURL(fileId) : fileId + '.js';\n return { id, chunks: [id], name, async: true };\n },\n },\n );\n let decodedBody: unknown = ctx.req.url.searchParams;\n if (ctx.req.body) {\n const temporaryReferences = createTemporaryReferenceSet();\n temporaryReferencesMap.set(ctx, temporaryReferences);\n const bodyBuf = await streamToArrayBuffer(ctx.req.body);\n const contentType = ctx.req.headers['content-type'];\n if (\n typeof contentType === 'string' &&\n contentType.startsWith('multipart/form-data')\n ) {\n // XXX This doesn't support streaming unlike busboy\n const formData = await parseFormData(bodyBuf, contentType);\n decodedBody = await decodeReply(formData, serverBundlerConfig, {\n temporaryReferences,\n });\n } else if (bodyBuf.byteLength > 0) {\n const bodyStr = bufferToString(bodyBuf);\n decodedBody = await decodeReply(bodyStr, serverBundlerConfig, {\n temporaryReferences,\n });\n }\n }\n return decodedBody;\n}\n\nconst EXTRACT_FORM_STATE_SYMBOL = Symbol('EXTRACT_FORM_STATE');\ntype ExtractFormState = (\n actionResult: unknown,\n) => ReturnType<(typeof RSDWServerType)['decodeFormState']>;\n\nconst setExtractFormState = (\n ctx: object,\n extractFormState: ExtractFormState,\n) => {\n (\n ctx as unknown as Record<typeof EXTRACT_FORM_STATE_SYMBOL, ExtractFormState>\n )[EXTRACT_FORM_STATE_SYMBOL] = extractFormState;\n};\n\nexport const getExtractFormState = (ctx: object): ExtractFormState => {\n const extractFormState = (\n ctx as unknown as Record<\n typeof EXTRACT_FORM_STATE_SYMBOL,\n ExtractFormState | undefined\n >\n )[EXTRACT_FORM_STATE_SYMBOL];\n if (!extractFormState) {\n throw new Error('extractFormState not set');\n }\n return extractFormState;\n};\n\nexport async function decodePostAction(\n ctx: Pick<HandlerContext, 'unstable_modules' | 'unstable_devServer' | 'req'>,\n): Promise<(() => Promise<unknown>) | null> {\n const isDev = !!ctx.unstable_devServer;\n const modules = ctx.unstable_modules;\n if (!modules) {\n throw new Error('handler middleware required (missing modules)');\n }\n const {\n default: { decodeAction, decodeFormState },\n } = modules.rsdwServer as { default: typeof RSDWServerType };\n if (ctx.req.body) {\n const contentType = ctx.req.headers['content-type'];\n if (\n typeof contentType === 'string' &&\n contentType.startsWith('multipart/form-data')\n ) {\n const [stream1, stream2] = ctx.req.body.tee();\n ctx.req.body = stream1;\n const bodyBuf = await streamToArrayBuffer(stream2);\n // XXX This doesn't support streaming unlike busboy\n const formData = await parseFormData(bodyBuf, contentType);\n if (\n Array.from(formData.keys()).every((key) => !key.startsWith('$ACTION_'))\n ) {\n // Assuming this is probably for api\n return null;\n }\n const serverBundlerConfig = new Proxy(\n {},\n {\n get(_target, encodedId: string) {\n const [fileId, name] = encodedId.split('#') as [string, string];\n const id = isDev ? filePathToFileURL(fileId) : fileId + '.js';\n return { id, chunks: [id], name, async: true };\n },\n },\n );\n setExtractFormState(ctx, (actionResult) =>\n decodeFormState(actionResult, formData, serverBundlerConfig),\n );\n return decodeAction(formData, serverBundlerConfig);\n }\n }\n return null;\n}\n"],"names":["filePathToFileURL","streamToArrayBuffer","bufferToString","parseFormData","resolveClientEntryForPrd","id","config","basePath","temporaryReferencesMap","WeakMap","renderRsc","ctx","elements","onError","moduleIdCallback","modules","unstable_modules","Error","default","renderToReadableStream","rsdwServer","resolveClientEntry","unstable_devServer","clientBundlerConfig","Proxy","get","_target","encodedId","file","name","split","chunks","async","err","forEach","fn","digest","temporaryReferences","renderRscElement","element","collectClientModules","idSet","Set","add","readable","Promise","resolve","reject","writable","WritableStream","close","abort","reason","pipeTo","catch","Array","from","decodeBody","isDev","decodeReply","createTemporaryReferenceSet","serverBundlerConfig","fileId","decodedBody","req","url","searchParams","body","set","bodyBuf","contentType","headers","startsWith","formData","byteLength","bodyStr","EXTRACT_FORM_STATE_SYMBOL","Symbol","setExtractFormState","extractFormState","getExtractFormState","decodePostAction","decodeAction","decodeFormState","stream1","stream2","tee","keys","every","key","actionResult"],"mappings":"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"}
@@ -8,7 +8,8 @@ export const loadServerModule = async (idOrFileURL)=>{
8
8
  const vite = await createViteServer({
9
9
  server: {
10
10
  middlewareMode: true,
11
- watch: null
11
+ watch: null,
12
+ ws: false
12
13
  },
13
14
  appType: 'custom',
14
15
  environments: {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/utils/vite-loader.ts"],"sourcesContent":["import { createServer as createViteServer } from 'vite';\nimport type { RunnableDevEnvironment } from 'vite';\n\nimport { fileURLToFilePath } from '../utils/path.js';\n\nexport const loadServerModule = async <T>(idOrFileURL: string): Promise<T> => {\n if (idOrFileURL === 'waku' || idOrFileURL.startsWith('waku/')) {\n // HACK `external: ['waku']` doesn't do the same\n return import(idOrFileURL) as T;\n }\n const vite = await createViteServer({\n server: { middlewareMode: true, watch: null },\n appType: 'custom',\n environments: {\n config: {\n resolve: { external: ['waku'] },\n },\n },\n });\n await vite.ws.close();\n await Promise.all(\n Object.values(vite.environments).map(\n (env) => env.name === 'config' || env.close(),\n ),\n );\n const mod = await (\n vite.environments.config as RunnableDevEnvironment\n ).runner.import(\n idOrFileURL.startsWith('file://')\n ? fileURLToFilePath(idOrFileURL)\n : idOrFileURL,\n );\n return mod as T;\n};\n"],"names":["createServer","createViteServer","fileURLToFilePath","loadServerModule","idOrFileURL","startsWith","vite","server","middlewareMode","watch","appType","environments","config","resolve","external","ws","close","Promise","all","Object","values","map","env","name","mod","runner","import"],"mappings":"AAAA,SAASA,gBAAgBC,gBAAgB,QAAQ,OAAO;AAGxD,SAASC,iBAAiB,QAAQ,mBAAmB;AAErD,OAAO,MAAMC,mBAAmB,OAAUC;IACxC,IAAIA,gBAAgB,UAAUA,YAAYC,UAAU,CAAC,UAAU;QAC7D,gDAAgD;QAChD,OAAO,MAAM,CAACD;IAChB;IACA,MAAME,OAAO,MAAML,iBAAiB;QAClCM,QAAQ;YAAEC,gBAAgB;YAAMC,OAAO;QAAK;QAC5CC,SAAS;QACTC,cAAc;YACZC,QAAQ;gBACNC,SAAS;oBAAEC,UAAU;wBAAC;qBAAO;gBAAC;YAChC;QACF;IACF;IACA,MAAMR,KAAKS,EAAE,CAACC,KAAK;IACnB,MAAMC,QAAQC,GAAG,CACfC,OAAOC,MAAM,CAACd,KAAKK,YAAY,EAAEU,GAAG,CAClC,CAACC,MAAQA,IAAIC,IAAI,KAAK,YAAYD,IAAIN,KAAK;IAG/C,MAAMQ,MAAM,MAAM,AAChBlB,KAAKK,YAAY,CAACC,MAAM,CACxBa,MAAM,CAACC,MAAM,CACbtB,YAAYC,UAAU,CAAC,aACnBH,kBAAkBE,eAClBA;IAEN,OAAOoB;AACT,EAAE"}
1
+ {"version":3,"sources":["../../../src/lib/utils/vite-loader.ts"],"sourcesContent":["import { createServer as createViteServer } from 'vite';\nimport type { RunnableDevEnvironment } from 'vite';\n\nimport { fileURLToFilePath } from '../utils/path.js';\n\nexport const loadServerModule = async <T>(idOrFileURL: string): Promise<T> => {\n if (idOrFileURL === 'waku' || idOrFileURL.startsWith('waku/')) {\n // HACK `external: ['waku']` doesn't do the same\n return import(idOrFileURL) as T;\n }\n const vite = await createViteServer({\n server: { middlewareMode: true, watch: null, ws: false },\n appType: 'custom',\n environments: {\n config: {\n resolve: { external: ['waku'] },\n },\n },\n });\n await vite.ws.close();\n await Promise.all(\n Object.values(vite.environments).map(\n (env) => env.name === 'config' || env.close(),\n ),\n );\n const mod = await (\n vite.environments.config as RunnableDevEnvironment\n ).runner.import(\n idOrFileURL.startsWith('file://')\n ? fileURLToFilePath(idOrFileURL)\n : idOrFileURL,\n );\n return mod as T;\n};\n"],"names":["createServer","createViteServer","fileURLToFilePath","loadServerModule","idOrFileURL","startsWith","vite","server","middlewareMode","watch","ws","appType","environments","config","resolve","external","close","Promise","all","Object","values","map","env","name","mod","runner","import"],"mappings":"AAAA,SAASA,gBAAgBC,gBAAgB,QAAQ,OAAO;AAGxD,SAASC,iBAAiB,QAAQ,mBAAmB;AAErD,OAAO,MAAMC,mBAAmB,OAAUC;IACxC,IAAIA,gBAAgB,UAAUA,YAAYC,UAAU,CAAC,UAAU;QAC7D,gDAAgD;QAChD,OAAO,MAAM,CAACD;IAChB;IACA,MAAME,OAAO,MAAML,iBAAiB;QAClCM,QAAQ;YAAEC,gBAAgB;YAAMC,OAAO;YAAMC,IAAI;QAAM;QACvDC,SAAS;QACTC,cAAc;YACZC,QAAQ;gBACNC,SAAS;oBAAEC,UAAU;wBAAC;qBAAO;gBAAC;YAChC;QACF;IACF;IACA,MAAMT,KAAKI,EAAE,CAACM,KAAK;IACnB,MAAMC,QAAQC,GAAG,CACfC,OAAOC,MAAM,CAACd,KAAKM,YAAY,EAAES,GAAG,CAClC,CAACC,MAAQA,IAAIC,IAAI,KAAK,YAAYD,IAAIN,KAAK;IAG/C,MAAMQ,MAAM,MAAM,AAChBlB,KAAKM,YAAY,CAACC,MAAM,CACxBY,MAAM,CAACC,MAAM,CACbtB,YAAYC,UAAU,CAAC,aACnBH,kBAAkBE,eAClBA;IAEN,OAAOoB;AACT,EAAE"}
@@ -4,7 +4,7 @@ import { createContext, createElement, memo, use, useCallback, useEffect, useSta
4
4
  import RSDWClient from 'react-server-dom-webpack/client';
5
5
  import { createCustomError } from '../lib/utils/custom-errors.js';
6
6
  import { encodeRscPath, encodeFuncId } from '../lib/renderers/utils.js';
7
- const { createFromFetch, encodeReply } = RSDWClient;
7
+ const { createFromFetch, encodeReply, createTemporaryReferenceSet } = RSDWClient;
8
8
  const DEFAULT_HTML_HEAD = [
9
9
  createElement('meta', {
10
10
  charSet: 'utf-8'
@@ -69,11 +69,15 @@ const defaultFetchCache = {};
69
69
  */ export const unstable_callServerRsc = async (funcId, args, fetchCache = defaultFetchCache)=>{
70
70
  const enhanceFetch = fetchCache[ENHANCE_FETCH] || ((f)=>f);
71
71
  const enhanceCreateData = fetchCache[ENHANCE_CREATE_DATA] || ((d)=>d);
72
+ const temporaryReferences = createTemporaryReferenceSet();
72
73
  const createData = (responsePromise)=>createFromFetch(checkStatus(responsePromise), {
73
- callServer: (funcId, args)=>unstable_callServerRsc(funcId, args, fetchCache)
74
+ callServer: (funcId, args)=>unstable_callServerRsc(funcId, args, fetchCache),
75
+ temporaryReferences
74
76
  });
75
77
  const url = BASE_RSC_PATH + encodeRscPath(encodeFuncId(funcId));
76
- const responsePromise = args.length === 1 && args[0] instanceof URLSearchParams ? enhanceFetch(fetch)(url + '?' + args[0]) : encodeReply(args).then((body)=>enhanceFetch(fetch)(url, {
78
+ const responsePromise = args.length === 1 && args[0] instanceof URLSearchParams ? enhanceFetch(fetch)(url + '?' + args[0]) : encodeReply(args, {
79
+ temporaryReferences
80
+ }).then((body)=>enhanceFetch(fetch)(url, {
77
81
  method: 'POST',
78
82
  body
79
83
  }));
@@ -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 } = 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 createData = (responsePromise: Promise<Response>) =>\n createFromFetch<Elements>(checkStatus(responsePromise), {\n callServer: (funcId: string, args: unknown[]) =>\n unstable_callServerRsc(funcId, args, fetchCache),\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).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","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","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>();\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":"AAAA,sCAAsC;AACtC;AAEA,SACEA,aAAa,EACbC,aAAa,EACbC,IAAI,EACJC,GAAG,EACHC,WAAW,EACXC,SAAS,EACTC,QAAQ,EACRC,SAAS,QACJ,QAAQ;AAEf,OAAOC,gBAAgB,kCAAkC;AAEzD,SAASC,iBAAiB,QAAQ,gCAAgC;AAClE,SAASC,aAAa,EAAEC,YAAY,QAAQ,4BAA4B;AAExE,MAAM,EAAEC,eAAe,EAAEC,WAAW,EAAEC,2BAA2B,EAAE,GACjEN;AAQF,MAAMO,oBAAoB;IACxBd,cAAc,QAAQ;QAAEe,SAAS;IAAQ;IACzCf,cAAc,QAAQ;QACpBgB,MAAM;QACNC,SAAS;IACX;IACAjB,cAAc,QAAQ;QAAEgB,MAAM;QAAaC,SAAS;IAAO;CAC5D;AAED,MAAMC,gBAAgB,GAAG,YAAYC,GAAG,EAAEC,wBACxC,YAAYD,GAAG,EAAEE,qBAClB,CAAC,CAAC;AAEH,MAAMC,cAAc,OAClBC;IAEA,MAAMC,WAAW,MAAMD;IACvB,IAAI,CAACC,SAASC,EAAE,EAAE;QAChB,MAAMC,WAAWF,SAASG,OAAO,CAACC,GAAG,CAAC;QACtC,MAAMC,MAAMrB,kBACV,AAAC,MAAMgB,SAASM,IAAI,MAAON,SAASO,UAAU,EAC9C;YACEC,QAAQR,SAASQ,MAAM;YACvB,GAAIN,YAAY;gBAAEA;YAAS,CAAC;QAC9B;QAEF,MAAMG;IACR;IACA,OAAOL;AACT;AAIA,0CAA0C;AAC1C,MAAMS,4BAA4B,IAAIC;AAKtC,MAAMC,YAAY,CAAIC,GAAYC,GAAuBC,IACvD,AAACD,CAAAA,EAAEE,GAAG,CAACD,KAAKD,IAAIA,EAAEG,GAAG,CAACF,GAAGF,IAAG,EAAGR,GAAG,CAACU;AACrC,MAAMG,SAAS,IAAIP;AACnB,MAAMQ,uBAAuB,CAC3BC,GACAC;IAEA,MAAMC,YAAY;QAChB,MAAMC,IAAIC,QAAQC,GAAG,CAAC;YAACf,0BAA0BL,GAAG,CAACe,MAAMA;YAAGC;SAAE,EAC7DK,IAAI,CAAC,CAAC,CAACN,GAAGC,EAAE;YACX,MAAMM,eAAe;gBAAE,GAAGP,CAAC;gBAAE,GAAGC,CAAC;YAAC;YAClC,OAAOM,aAAaC,MAAM;YAC1B,OAAOD;QACT,GACCE,KAAK,CAAC,CAACvB;YACNI,0BAA0BO,GAAG,CAACM,GAAGH;YACjC,MAAMd;QACR;QACF,OAAOiB;IACT;IACA,MAAMO,SAASlB,UAAU,IAAM,IAAID,WAAWO,QAAQE;IACtD,OAAOR,UAAUU,WAAWQ,QAAQT;AACtC;AAUA,MAAMU,QAAQ;AACd,MAAMC,eAAe;AACrB,MAAMC,gBAAgB;AACtB,MAAMC,sBAAsB;AAa5B,MAAMC,oBAAgC,CAAC;AAEvC;;;CAGC,GACD,OAAO,MAAMC,yBAAyB,OACpCC,QACAC,MACAC,aAAaJ,iBAAiB;IAE9B,MAAMK,eAAeD,UAAU,CAACN,cAAc,IAAK,CAAA,CAACQ,IAAMA,CAAAA;IAC1D,MAAMC,oBAAoBH,UAAU,CAACL,oBAAoB,IAAK,CAAA,CAACS,IAAMA,CAAAA;IACrE,MAAMC,sBAAsBtD;IAC5B,MAAMuD,aAAa,CAAC7C,kBAClBZ,gBAA0BW,YAAYC,kBAAkB;YACtD8C,YAAY,CAACT,QAAgBC,OAC3BF,uBAAuBC,QAAQC,MAAMC;YACvCK;QACF;IACF,MAAMG,MAAMpD,gBAAgBT,cAAcC,aAAakD;IACvD,MAAMrC,kBACJsC,KAAKU,MAAM,KAAK,KAAKV,IAAI,CAAC,EAAE,YAAYW,kBACpCT,aAAaU,OAAOH,MAAM,MAAMT,IAAI,CAAC,EAAE,IACvCjD,YAAYiD,MAAM;QAAEM;IAAoB,GAAGlB,IAAI,CAAC,CAACyB,OAC/CX,aAAaU,OAAOH,KAAK;YAAEK,QAAQ;YAAQD;QAAK;IAExD,MAAME,OAAOX,kBAAkBG,YAAY7C;IAC3C,MAAMsD,QAAQ,AAAC,CAAA,MAAMD,IAAG,EAAGzB,MAAM;IACjC,oDAAoD;IACpDW,UAAU,CAACP,aAAa,GAAG,CAACuB,OAASpC,qBAAqBoC,MAAMF;IAChE,OAAOC;AACT,EAAE;AAEF,MAAME,mBAAmB,IAAI7C;AAE7B,MAAM8C,mBAAmB,CACvBV,KACAW,WACAnB;IAEA,MAAMC,eAAeD,UAAU,CAACN,cAAc,IAAK,CAAA,CAACQ,IAAMA,CAAAA;IAC1D,OAAOiB,cAAcC,YACjBnB,aAAaU,OAAOH,OACpBW,qBAAqBT,kBACnBT,aAAaU,OAAOH,MAAM,MAAMW,aAChCrE,YAAYqE,WAAWhC,IAAI,CAAC,CAACyB,OAC3BX,aAAaU,OAAOH,KAAK;YAAEK,QAAQ;YAAQD;QAAK;AAE1D;AAEA,OAAO,MAAMS,WAAW,CACtBC,SACAH,WACAnB,aAAaJ,iBAAiB;IAE9B,MAAM2B,QAAQvB,UAAU,CAACR,MAAM;IAC/B,IAAI+B,SAASA,KAAK,CAAC,EAAE,KAAKD,WAAWC,KAAK,CAAC,EAAE,KAAKJ,WAAW;QAC3D,OAAOI,KAAK,CAAC,EAAE;IACjB;IACA,MAAMpB,oBAAoBH,UAAU,CAACL,oBAAoB,IAAK,CAAA,CAACS,IAAMA,CAAAA;IACrE,MAAME,aAAa,CAAC7C,kBAClBZ,gBAA0BW,YAAYC,kBAAkB;YACtD8C,YAAY,CAACT,QAAgBC,OAC3BF,uBAAuBC,QAAQC,MAAMC;QACzC;IACF,MAAMwB,aAAc,AAACC,WAAmBC,mBAAmB,KAAK,CAAC;IACjE,MAAMlB,MAAMpD,gBAAgBT,cAAc2E;IAC1C,MAAMK,6BACJ,CAAC,CAACH,UAAU,CAAChB,IAAI,IACjB,2CAA2C;IAC3C,uDAAuD;IACtD,CAAA,CAACS,iBAAiBxC,GAAG,CAAC+C,UAAU,CAAChB,IAAI,KACpCS,iBAAiBnD,GAAG,CAAC0D,UAAU,CAAChB,IAAI,MAAMW,SAAQ;IACtD,MAAM1D,kBAAkBkE,6BACpBH,UAAU,CAAChB,IAAI,GACfU,iBAAiBV,KAAKW,WAAWnB;IACrC,OAAOwB,UAAU,CAAChB,IAAI;IACtB,MAAMM,OAAOX,kBAAkBG,YAAY7C;IAC3CuC,UAAU,CAACR,MAAM,GAAG;QAAC8B;QAASH;QAAWL;KAAK;IAC9C,OAAOA;AACT,EAAE;AAEF,OAAO,MAAMc,cAAc,CACzBN,SACAH,WACAnB,aAAaJ,iBAAiB;IAE9B,MAAM4B,aAAc,AAACC,WAAmBC,mBAAmB,KAAK,CAAC;IACjE,MAAMlB,MAAMpD,gBAAgBT,cAAc2E;IAC1C,IAAI,CAAEd,CAAAA,OAAOgB,UAAS,GAAI;QACxBA,UAAU,CAAChB,IAAI,GAAGU,iBAAiBV,KAAKW,WAAWnB;QACnDiB,iBAAiBvC,GAAG,CAAC8C,UAAU,CAAChB,IAAI,EAAEW;IACxC;AACF,EAAE;AAEF,MAAMU,iBAAiB5F,cAErB;IACA,MAAM,IAAI6F,MAAM;AAClB;AACA,MAAMC,kBAAkB9F,cAAwC;AAEhE,OAAO,MAAM+F,OAAO,CAAC,EACnBC,cAAc,EACdC,gBAAgB,EAChBlC,aAAaJ,iBAAiB,EAC9BuC,qBAAqB,EACrBC,0BAA0B,EAC1BC,QAAQ,EAQT;IACCrC,UAAU,CAACN,cAAc,GAAGyC;IAC5BnC,UAAU,CAACL,oBAAoB,GAAGyC;IAClC,MAAM,CAACE,UAAUC,YAAY,GAAGhG,SAAS,IACvC8E,SAASY,kBAAkB,IAAIC,kBAAkBlC;IAEnD1D,UAAU;QACR0D,UAAU,CAACP,aAAa,GAAG8C;IAC7B,GAAG;QAACvC;KAAW;IACf,MAAMwC,UAAUnG,YACd,CAACiF,SAAiBH;QAChB,oCAAoC;QACpC,OAAOnB,UAAU,CAACR,MAAM;QACxB,MAAMsB,OAAOO,SAASC,SAASH,WAAWnB;QAC1CuC,YAAY,CAACvB,OAASpC,qBAAqBoC,MAAMF;IACnD,GACA;QAACd;KAAW;IAEd,OAAO9D,cACL2F,eAAeY,QAAQ,EACvB;QAAE1B,OAAOyB;IAAQ,GACjBtG,cACE6F,gBAAgBU,QAAQ,EACxB;QAAE1B,OAAOuB;IAAS,MACftF,mBACHqF;AAGN,EAAE;AAEF,OAAO,MAAMK,aAAa,IAAMtG,IAAIyF,gBAAgB;AAEpD,MAAMc,kBAAkB1G,cAAyBmF;AACjD,MAAMwB,0BAA0BzG,KAAKwG,gBAAgBF,QAAQ;AAC7D,MAAMI,eAAe5G,cAEnBmF;AACF,MAAM0B,uBAAuB3G,KAAK0G,aAAaJ,QAAQ;AAEvD,OAAO,MAAMM,WAAW,IAAM3G,IAAIuG,iBAAiB;AAEnD,OAAO,MAAMK,sBAAsB;IACjC,MAAMC,cAAc7G,IAAIyG;IACxB,IAAII,aAAa;QACf,MAAMA,WAAW,CAAC,EAAE;IACtB;IACA,OAAO;AACT,EAAE;AAEF,OAAO,MAAMC,yBAAyB;IACpC,MAAMD,cAAc7G,IAAIyG;IACxB,IAAII,aAAa;QACf,OAAOA,WAAW,CAAC,EAAE;IACvB;AACF,EAAE;AAEF,OAAO,MAAME,aAAa,CAACC;IACzB,MAAMC,kBAAkBjH,IAAI2F;IAC5B,IAAI,CAACsB,iBAAiB;QACpB,MAAM,IAAIvB,MAAM;IAClB;IACA,MAAMQ,WAAWlG,IAAIiH;IACrB,IAAID,MAAMd,YAAYA,QAAQ,CAACc,GAAG,IAAIhC,WAAW;QAC/C,MAAM,IAAIU,MAAM,oDAAoDsB;IACtE;IACA,OAAOd,QAAQ,CAACc,GAAG;AACrB,EAAE;AAEF,MAAME,YAAY,CAAC,EACjBF,EAAE,EACFf,QAAQ,EACRkB,eAAe,EACfC,iBAAiB,EAMlB;IACC,MAAMC,UAAUN,WAAWC;IAC3B,MAAMM,iBAAiBD,YAAYrC;IACnC9E,UAAU;QACR,IAAIoH,kBAAkBH,iBAAiB;YACrC,6CAA6C;YAC7CA,gBAAgBE;QAClB;IACF,GAAG;QAACC;QAAgBD;QAASF;KAAgB;IAC7C,IAAI,CAACG,gBAAgB;QACnB,IAAIF,mBAAmB;YACrB,OAAOA;QACT;QACA,MAAM,IAAI1B,MAAM,sBAAsBsB;IACxC;IACA,OAAOlH,cACL0G,yBACA;QAAE7B,OAAOsB;IAAS,GAClB,6CAA6C;IAC7CoB;AAEJ;AAEA,MAAME,4BAA4BnH;IAIhCoH,YAAYC,KAAwD,CAAE;QACpE,KAAK,CAACA;QACN,IAAI,CAACC,KAAK,GAAG;YAAEC,OAAO;QAAK;QAC3B,IAAI,CAACC,KAAK,GAAG,IAAI,CAACA,KAAK,CAACC,IAAI,CAAC,IAAI;IACnC;IACA,OAAOC,yBAAyBH,KAAc,EAAE;QAC9C,OAAO;YAAEA;QAAM;IACjB;IACAC,QAAQ;QACN,IAAI,CAACG,QAAQ,CAAC;YAAEJ,OAAO;QAAK;IAC9B;IACAK,SAAS;QACP,MAAM,EAAEL,KAAK,EAAE,GAAG,IAAI,CAACD,KAAK;QAC5B,IAAIC,UAAU,MAAM;YAClB,IAAI,IAAI,CAACF,KAAK,CAACQ,YAAY,EAAE;gBAC3B,OAAOnI,cACL4G,sBACA;oBAAE/B,OAAO;wBAACgD;wBAAO,IAAI,CAACC,KAAK;qBAAC;gBAAC,GAC7B,IAAI,CAACH,KAAK,CAACQ,YAAY;YAE3B;YACA,MAAMN;QACR;QACA,OAAO,IAAI,CAACF,KAAK,CAACxB,QAAQ;IAC5B;AACF;AAEA;;;;;;;;;;;;;CAaC,GACD,OAAO,MAAMiC,OAAO,CAAC,EACnBlB,EAAE,EACFf,QAAQ,EACRkC,oBAAoB,EACpBf,iBAAiB,EAMlB;IACC,MAAM,CAACa,cAAcG,gBAAgB,GAAGjI;IACxC,MAAMgH,kBAAkBlH,YACtB,CAACoH,UACCe,gBACEtI,cACE0G,yBACA;YAAE7B,OAAOwD;QAAqB,GAC9Bd,WAGN;QAACc;KAAqB;IAExB,IAAIA,yBAAyBnD,WAAW;QACtC,OAAOlF,cACLyH,qBACA;YAAEU;QAAa,GACfnI,cAAcoH,WAAW;YAAEF;YAAIG;QAAgB,GAAGlB;IAEtD;IACA,OAAOnG,cAAcoH,WAAW;QAAEF;QAAII;IAAkB,GAAGnB;AAC7D,EAAE;AAEF;;;CAGC,GACD,OAAO,MAAMoC,sBAAsB,CAAC,EAClCpB,eAAe,EACfhB,QAAQ,EAIT,GACCnG,cACE6F,gBAAgBU,QAAQ,EACxB;QAAE1B,OAAOsC;IAAgB,MACtBrG,mBACHqF,UACA"}
@@ -115,7 +115,5 @@ export declare function Router({ routerData, initialRoute, unstable_enhanceFetch
115
115
  */
116
116
  export declare function INTERNAL_ServerRouter({ route }: {
117
117
  route: RouteProps;
118
- }): import("react").FunctionComponentElement<{
119
- children?: ReactNode | undefined;
120
- }>;
118
+ }): import("react").FunctionComponentElement<import("react").FragmentProps>;
121
119
  export {};