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 +170 -1
- package/dist/lib/plugins/vite-plugin-deploy-vercel.js +1 -1
- package/dist/lib/plugins/vite-plugin-deploy-vercel.js.map +1 -1
- package/dist/lib/plugins/vite-plugin-rsc-rsdw.js +2 -7
- package/dist/lib/plugins/vite-plugin-rsc-rsdw.js.map +1 -1
- package/dist/lib/renderers/rsc.js +14 -5
- package/dist/lib/renderers/rsc.js.map +1 -1
- package/dist/lib/utils/vite-loader.js +2 -1
- package/dist/lib/utils/vite-loader.js.map +1 -1
- package/dist/minimal/client.js +7 -3
- package/dist/minimal/client.js.map +1 -1
- package/dist/router/client.d.ts +1 -3
- package/dist/router/create-pages.d.ts +18 -1
- package/dist/router/create-pages.js +184 -55
- package/dist/router/create-pages.js.map +1 -1
- package/dist/router/fs-router.js +27 -5
- package/dist/router/fs-router.js.map +1 -1
- package/package.json +5 -5
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
|
|
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)!
|
|
@@ -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: '
|
|
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
|
|
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
|
|
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';\
|
|
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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"}
|
|
@@ -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","
|
|
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"}
|
package/dist/minimal/client.js
CHANGED
|
@@ -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
|
|
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":"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"}
|
package/dist/router/client.d.ts
CHANGED
|
@@ -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 {};
|