waku 0.21.3 → 0.21.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/client.d.ts +146 -62
- package/dist/client.js +5 -205
- package/dist/config.d.ts +3 -3
- package/dist/lib/builder/build.js +214 -31
- package/dist/lib/config.d.ts +2 -1
- package/dist/lib/config.js +2 -2
- package/dist/lib/hono/ctx.js +3 -2
- package/dist/lib/hono/engine.js +4 -6
- package/dist/lib/middleware/context.d.ts +8 -0
- package/dist/lib/middleware/context.js +37 -0
- package/dist/lib/middleware/dev-server-impl.js +16 -7
- package/dist/lib/middleware/fallback.js +2 -1
- package/dist/lib/middleware/handler.d.ts +2 -0
- package/dist/lib/middleware/handler.js +121 -0
- package/dist/lib/middleware/rsc.js +6 -6
- package/dist/lib/middleware/ssr.js +4 -4
- package/dist/lib/middleware/types.d.ts +13 -5
- package/dist/lib/plugins/vite-plugin-deploy-cloudflare.d.ts +0 -1
- package/dist/lib/plugins/vite-plugin-deploy-vercel.d.ts +1 -1
- package/dist/lib/plugins/vite-plugin-deploy-vercel.js +2 -2
- package/dist/lib/plugins/vite-plugin-fs-router-typegen.js +50 -31
- package/dist/lib/plugins/vite-plugin-rsc-analyze.js +4 -4
- package/dist/lib/plugins/vite-plugin-rsc-env.d.ts +1 -1
- package/dist/lib/plugins/vite-plugin-rsc-env.js +2 -2
- package/dist/lib/plugins/vite-plugin-rsc-hmr.js +4 -4
- package/dist/lib/plugins/vite-plugin-rsc-transform.js +32 -32
- package/dist/lib/renderers/html-renderer.d.ts +7 -6
- package/dist/lib/renderers/html-renderer.js +5 -4
- package/dist/lib/renderers/html.d.ts +6 -0
- package/dist/lib/renderers/html.js +205 -0
- package/dist/lib/renderers/rsc-renderer.d.ts +10 -10
- package/dist/lib/renderers/rsc-renderer.js +31 -31
- package/dist/lib/renderers/rsc.d.ts +10 -0
- package/dist/lib/renderers/rsc.js +121 -0
- package/dist/lib/renderers/utils.d.ts +5 -5
- package/dist/lib/renderers/utils.js +38 -31
- package/dist/lib/utils/stream.d.ts +1 -0
- package/dist/lib/utils/stream.js +18 -0
- package/dist/middleware/context.d.ts +2 -0
- package/dist/middleware/context.js +2 -0
- package/dist/middleware/handler.d.ts +1 -0
- package/dist/middleware/handler.js +1 -0
- package/dist/minimal/client.d.ts +80 -0
- package/dist/minimal/client.js +214 -0
- package/dist/minimal/server.d.ts +73 -0
- package/dist/minimal/server.js +10 -0
- package/dist/router/base-types.d.ts +1 -1
- package/dist/router/client.d.ts +15 -0
- package/dist/router/client.js +206 -19
- package/dist/router/common.d.ts +3 -2
- package/dist/router/common.js +23 -8
- package/dist/router/create-pages-utils/inferred-path-types.d.ts +17 -0
- package/dist/router/create-pages-utils/inferred-path-types.js +5 -1
- package/dist/router/create-pages.d.ts +11 -3
- package/dist/router/create-pages.js +35 -3
- package/dist/router/define-router.d.ts +19 -2
- package/dist/router/define-router.js +173 -30
- package/dist/router/fs-router.d.ts +3 -3
- package/dist/router/fs-router.js +9 -2
- package/dist/router/server.d.ts +1 -1
- package/dist/router/server.js +1 -1
- package/dist/server.d.ts +18 -54
- package/dist/server.js +18 -31
- package/package.json +18 -10
- package/dist/lib/middleware/headers.d.ts +0 -3
- package/dist/lib/middleware/headers.js +0 -7
- package/dist/middleware/headers.d.ts +0 -1
- package/dist/middleware/headers.js +0 -1
package/README.md
CHANGED
|
@@ -574,7 +574,7 @@ export default async function HomePage() {
|
|
|
574
574
|
return (
|
|
575
575
|
<>
|
|
576
576
|
<title>Waku</title>
|
|
577
|
-
<meta
|
|
577
|
+
<meta name="description" content="The minimal React framework" />
|
|
578
578
|
<h1>Waku</h1>
|
|
579
579
|
<div>Hello world!</div>
|
|
580
580
|
</>
|
|
@@ -607,7 +607,7 @@ const Head = async () => {
|
|
|
607
607
|
return (
|
|
608
608
|
<>
|
|
609
609
|
<title>{metadata.title}</title>
|
|
610
|
-
<meta
|
|
610
|
+
<meta name="description" content={metadata.description} />
|
|
611
611
|
</>
|
|
612
612
|
);
|
|
613
613
|
};
|
package/dist/client.d.ts
CHANGED
|
@@ -1,66 +1,150 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
interface ImportMeta {
|
|
5
|
-
readonly env: Record<string, string>;
|
|
6
|
-
}
|
|
7
|
-
}
|
|
8
|
-
type Elements = Promise<Record<string, ReactNode>> & {
|
|
9
|
-
prev?: Record<string, ReactNode> | undefined;
|
|
10
|
-
};
|
|
11
|
-
type SetElements = (updater: (prev: Elements) => Elements) => void;
|
|
12
|
-
type EnhanceCreateData = (createData: (responsePromise: Promise<Response>) => Promise<Record<string, ReactNode>>) => (responsePromise: Promise<Response>) => Promise<Record<string, ReactNode>>;
|
|
13
|
-
declare const ENTRY = "e";
|
|
14
|
-
declare const SET_ELEMENTS = "s";
|
|
15
|
-
declare const ENHANCE_CREATE_DATA = "d";
|
|
16
|
-
type FetchCache = {
|
|
17
|
-
[ENTRY]?: [input: string, params: unknown, elements: Elements];
|
|
18
|
-
[SET_ELEMENTS]?: SetElements;
|
|
19
|
-
[ENHANCE_CREATE_DATA]?: EnhanceCreateData | undefined;
|
|
20
|
-
};
|
|
21
|
-
/**
|
|
22
|
-
* callServer callback
|
|
23
|
-
* This is not a public API.
|
|
24
|
-
*/
|
|
25
|
-
export declare const callServerRSC: (actionId: string, args?: unknown[], fetchCache?: FetchCache) => Promise<bigint | import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>> | Iterable<ReactNode> | import("react").AwaitedReactNode>;
|
|
26
|
-
export declare const fetchRSC: (input: string, params?: unknown, fetchCache?: FetchCache) => Elements;
|
|
27
|
-
export declare const prefetchRSC: (input: string, params?: unknown) => void;
|
|
28
|
-
export declare const Root: ({ initialInput, initialParams, fetchCache, unstable_enhanceCreateData, children, }: {
|
|
29
|
-
initialInput?: string;
|
|
30
|
-
initialParams?: unknown;
|
|
31
|
-
fetchCache?: FetchCache;
|
|
32
|
-
unstable_enhanceCreateData?: EnhanceCreateData;
|
|
33
|
-
children: ReactNode;
|
|
34
|
-
}) => import("react").FunctionComponentElement<import("react").ProviderProps<(input: string, params?: unknown) => void>>;
|
|
35
|
-
export declare const useRefetch: () => (input: string, params?: unknown) => void;
|
|
36
|
-
type OuterSlotProps = {
|
|
37
|
-
elementsPromise: Elements;
|
|
38
|
-
shouldRenderPrev: ((err: unknown) => boolean) | undefined;
|
|
39
|
-
renderSlot: (elements: Record<string, ReactNode>) => ReactNode;
|
|
40
|
-
children?: ReactNode;
|
|
41
|
-
};
|
|
42
|
-
declare class OuterSlot extends Component<OuterSlotProps, {
|
|
43
|
-
error?: unknown;
|
|
44
|
-
}> {
|
|
45
|
-
constructor(props: OuterSlotProps);
|
|
46
|
-
static getDerivedStateFromError(error: unknown): {
|
|
47
|
-
error: unknown;
|
|
48
|
-
};
|
|
49
|
-
render(): ReactNode;
|
|
50
|
-
}
|
|
1
|
+
/** @deprecated */
|
|
2
|
+
export declare const Children: () => import("react").ReactNode;
|
|
3
|
+
/** @deprecated */
|
|
51
4
|
export declare const Slot: ({ id, children, fallback, unstable_shouldRenderPrev, }: {
|
|
52
5
|
id: string;
|
|
53
|
-
children?: ReactNode;
|
|
54
|
-
fallback?: ReactNode;
|
|
6
|
+
children?: import("react").ReactNode;
|
|
7
|
+
fallback?: import("react").ReactNode;
|
|
55
8
|
unstable_shouldRenderPrev?: (err: unknown) => boolean;
|
|
56
|
-
}) => import("react").CElement<
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
9
|
+
}) => import("react").CElement<{
|
|
10
|
+
elementsPromise: Promise<Record<string, import("react").ReactNode>> & {
|
|
11
|
+
prev?: Record<string, import("react").ReactNode> | undefined;
|
|
12
|
+
};
|
|
13
|
+
shouldRenderPrev: ((err: unknown) => boolean) | undefined;
|
|
14
|
+
renderSlot: (elements: Record<string, import("react").ReactNode>) => import("react").ReactNode;
|
|
15
|
+
children?: import("react").ReactNode;
|
|
16
|
+
}, {
|
|
17
|
+
render(): import("react").ReactNode;
|
|
18
|
+
context: unknown;
|
|
19
|
+
setState<K extends "error">(state: {
|
|
20
|
+
error?: unknown;
|
|
21
|
+
} | ((prevState: Readonly<{
|
|
22
|
+
error?: unknown;
|
|
23
|
+
}>, props: Readonly<{
|
|
24
|
+
elementsPromise: Promise<Record<string, import("react").ReactNode>> & {
|
|
25
|
+
prev?: Record<string, import("react").ReactNode> | undefined;
|
|
26
|
+
};
|
|
27
|
+
shouldRenderPrev: ((err: unknown) => boolean) | undefined;
|
|
28
|
+
renderSlot: (elements: Record<string, import("react").ReactNode>) => import("react").ReactNode;
|
|
29
|
+
children?: import("react").ReactNode;
|
|
30
|
+
}>) => {
|
|
31
|
+
error?: unknown;
|
|
32
|
+
} | Pick<{
|
|
33
|
+
error?: unknown;
|
|
34
|
+
}, K> | null) | Pick<{
|
|
35
|
+
error?: unknown;
|
|
36
|
+
}, K> | null, callback?: (() => void) | undefined): void;
|
|
37
|
+
forceUpdate(callback?: (() => void) | undefined): void;
|
|
38
|
+
readonly props: Readonly<{
|
|
39
|
+
elementsPromise: Promise<Record<string, import("react").ReactNode>> & {
|
|
40
|
+
prev?: Record<string, import("react").ReactNode> | undefined;
|
|
41
|
+
};
|
|
42
|
+
shouldRenderPrev: ((err: unknown) => boolean) | undefined;
|
|
43
|
+
renderSlot: (elements: Record<string, import("react").ReactNode>) => import("react").ReactNode;
|
|
44
|
+
children?: import("react").ReactNode;
|
|
45
|
+
}>;
|
|
46
|
+
state: Readonly<{
|
|
47
|
+
error?: unknown;
|
|
48
|
+
}>;
|
|
49
|
+
refs: {
|
|
50
|
+
[key: string]: import("react").ReactInstance;
|
|
51
|
+
};
|
|
52
|
+
componentDidMount?(): void;
|
|
53
|
+
shouldComponentUpdate?(nextProps: Readonly<{
|
|
54
|
+
elementsPromise: Promise<Record<string, import("react").ReactNode>> & {
|
|
55
|
+
prev?: Record<string, import("react").ReactNode> | undefined;
|
|
56
|
+
};
|
|
57
|
+
shouldRenderPrev: ((err: unknown) => boolean) | undefined;
|
|
58
|
+
renderSlot: (elements: Record<string, import("react").ReactNode>) => import("react").ReactNode;
|
|
59
|
+
children?: import("react").ReactNode;
|
|
60
|
+
}>, nextState: Readonly<{
|
|
61
|
+
error?: unknown;
|
|
62
|
+
}>, nextContext: any): boolean;
|
|
63
|
+
componentWillUnmount?(): void;
|
|
64
|
+
componentDidCatch?(error: Error, errorInfo: import("react").ErrorInfo): void;
|
|
65
|
+
getSnapshotBeforeUpdate?(prevProps: Readonly<{
|
|
66
|
+
elementsPromise: Promise<Record<string, import("react").ReactNode>> & {
|
|
67
|
+
prev?: Record<string, import("react").ReactNode> | undefined;
|
|
68
|
+
};
|
|
69
|
+
shouldRenderPrev: ((err: unknown) => boolean) | undefined;
|
|
70
|
+
renderSlot: (elements: Record<string, import("react").ReactNode>) => import("react").ReactNode;
|
|
71
|
+
children?: import("react").ReactNode;
|
|
72
|
+
}>, prevState: Readonly<{
|
|
73
|
+
error?: unknown;
|
|
74
|
+
}>): any;
|
|
75
|
+
componentDidUpdate?(prevProps: Readonly<{
|
|
76
|
+
elementsPromise: Promise<Record<string, import("react").ReactNode>> & {
|
|
77
|
+
prev?: Record<string, import("react").ReactNode> | undefined;
|
|
78
|
+
};
|
|
79
|
+
shouldRenderPrev: ((err: unknown) => boolean) | undefined;
|
|
80
|
+
renderSlot: (elements: Record<string, import("react").ReactNode>) => import("react").ReactNode;
|
|
81
|
+
children?: import("react").ReactNode;
|
|
82
|
+
}>, prevState: Readonly<{
|
|
83
|
+
error?: unknown;
|
|
84
|
+
}>, snapshot?: any): void;
|
|
85
|
+
componentWillMount?(): void;
|
|
86
|
+
UNSAFE_componentWillMount?(): void;
|
|
87
|
+
componentWillReceiveProps?(nextProps: Readonly<{
|
|
88
|
+
elementsPromise: Promise<Record<string, import("react").ReactNode>> & {
|
|
89
|
+
prev?: Record<string, import("react").ReactNode> | undefined;
|
|
90
|
+
};
|
|
91
|
+
shouldRenderPrev: ((err: unknown) => boolean) | undefined;
|
|
92
|
+
renderSlot: (elements: Record<string, import("react").ReactNode>) => import("react").ReactNode;
|
|
93
|
+
children?: import("react").ReactNode;
|
|
94
|
+
}>, nextContext: any): void;
|
|
95
|
+
UNSAFE_componentWillReceiveProps?(nextProps: Readonly<{
|
|
96
|
+
elementsPromise: Promise<Record<string, import("react").ReactNode>> & {
|
|
97
|
+
prev?: Record<string, import("react").ReactNode> | undefined;
|
|
98
|
+
};
|
|
99
|
+
shouldRenderPrev: ((err: unknown) => boolean) | undefined;
|
|
100
|
+
renderSlot: (elements: Record<string, import("react").ReactNode>) => import("react").ReactNode;
|
|
101
|
+
children?: import("react").ReactNode;
|
|
102
|
+
}>, nextContext: any): void;
|
|
103
|
+
componentWillUpdate?(nextProps: Readonly<{
|
|
104
|
+
elementsPromise: Promise<Record<string, import("react").ReactNode>> & {
|
|
105
|
+
prev?: Record<string, import("react").ReactNode> | undefined;
|
|
106
|
+
};
|
|
107
|
+
shouldRenderPrev: ((err: unknown) => boolean) | undefined;
|
|
108
|
+
renderSlot: (elements: Record<string, import("react").ReactNode>) => import("react").ReactNode;
|
|
109
|
+
children?: import("react").ReactNode;
|
|
110
|
+
}>, nextState: Readonly<{
|
|
111
|
+
error?: unknown;
|
|
112
|
+
}>, nextContext: any): void;
|
|
113
|
+
UNSAFE_componentWillUpdate?(nextProps: Readonly<{
|
|
114
|
+
elementsPromise: Promise<Record<string, import("react").ReactNode>> & {
|
|
115
|
+
prev?: Record<string, import("react").ReactNode> | undefined;
|
|
116
|
+
};
|
|
117
|
+
shouldRenderPrev: ((err: unknown) => boolean) | undefined;
|
|
118
|
+
renderSlot: (elements: Record<string, import("react").ReactNode>) => import("react").ReactNode;
|
|
119
|
+
children?: import("react").ReactNode;
|
|
120
|
+
}>, nextState: Readonly<{
|
|
121
|
+
error?: unknown;
|
|
122
|
+
}>, nextContext: any): void;
|
|
123
|
+
}>;
|
|
124
|
+
/** @deprecated */
|
|
125
|
+
export declare const Root: ({ initialRscPath, initialRscParams, fetchCache, unstable_enhanceCreateData, children, }: {
|
|
126
|
+
initialRscPath?: string;
|
|
127
|
+
initialRscParams?: unknown;
|
|
128
|
+
fetchCache?: {
|
|
129
|
+
e?: [rscPath: string, rscParams: unknown, elements: Promise<Record<string, import("react").ReactNode>> & {
|
|
130
|
+
prev?: Record<string, import("react").ReactNode> | undefined;
|
|
131
|
+
}];
|
|
132
|
+
s?: (updater: (prev: Promise<Record<string, import("react").ReactNode>> & {
|
|
133
|
+
prev?: Record<string, import("react").ReactNode> | undefined;
|
|
134
|
+
}) => Promise<Record<string, import("react").ReactNode>> & {
|
|
135
|
+
prev?: Record<string, import("react").ReactNode> | undefined;
|
|
136
|
+
}) => void;
|
|
137
|
+
d?: ((createData: (responsePromise: Promise<Response>) => Promise<Record<string, import("react").ReactNode>>) => (responsePromise: Promise<Response>) => Promise<Record<string, import("react").ReactNode>>) | undefined;
|
|
138
|
+
};
|
|
139
|
+
unstable_enhanceCreateData?: (createData: (responsePromise: Promise<Response>) => Promise<Record<string, import("react").ReactNode>>) => (responsePromise: Promise<Response>) => Promise<Record<string, import("react").ReactNode>>;
|
|
140
|
+
children: import("react").ReactNode;
|
|
141
|
+
}) => import("react").FunctionComponentElement<import("react").ProviderProps<(rscPath: string, rscParams?: unknown) => void>>;
|
|
142
|
+
/** @deprecated */
|
|
62
143
|
export declare const ServerRoot: ({ elements, children, }: {
|
|
63
|
-
elements:
|
|
64
|
-
|
|
65
|
-
}
|
|
66
|
-
|
|
144
|
+
elements: Promise<Record<string, import("react").ReactNode>> & {
|
|
145
|
+
prev?: Record<string, import("react").ReactNode> | undefined;
|
|
146
|
+
};
|
|
147
|
+
children: import("react").ReactNode;
|
|
148
|
+
}) => import("react").FunctionComponentElement<import("react").ProviderProps<(Promise<Record<string, import("react").ReactNode>> & {
|
|
149
|
+
prev?: Record<string, import("react").ReactNode> | undefined;
|
|
150
|
+
}) | null>>;
|
package/dist/client.js
CHANGED
|
@@ -1,205 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
const { createFromFetch, encodeReply } = RSDWClient;
|
|
7
|
-
const BASE_PATH = `${import.meta.env?.WAKU_CONFIG_BASE_PATH}${import.meta.env?.WAKU_CONFIG_RSC_PATH}/`;
|
|
8
|
-
const checkStatus = async (responsePromise)=>{
|
|
9
|
-
const response = await responsePromise;
|
|
10
|
-
if (!response.ok) {
|
|
11
|
-
const err = new Error(response.statusText);
|
|
12
|
-
err.statusCode = response.status;
|
|
13
|
-
throw err;
|
|
14
|
-
}
|
|
15
|
-
return response;
|
|
16
|
-
};
|
|
17
|
-
const getCached = (c, m, k)=>(m.has(k) ? m : m.set(k, c())).get(k);
|
|
18
|
-
const cache1 = new WeakMap();
|
|
19
|
-
const mergeElements = (a, b)=>{
|
|
20
|
-
const getResult = ()=>{
|
|
21
|
-
const promise = new Promise((resolve, reject)=>{
|
|
22
|
-
Promise.all([
|
|
23
|
-
a,
|
|
24
|
-
b
|
|
25
|
-
]).then(([a, b])=>{
|
|
26
|
-
const nextElements = {
|
|
27
|
-
...a,
|
|
28
|
-
...b
|
|
29
|
-
};
|
|
30
|
-
delete nextElements._value;
|
|
31
|
-
promise.prev = a;
|
|
32
|
-
resolve(nextElements);
|
|
33
|
-
}).catch((e)=>{
|
|
34
|
-
a.then((a)=>{
|
|
35
|
-
promise.prev = a;
|
|
36
|
-
reject(e);
|
|
37
|
-
}, ()=>{
|
|
38
|
-
promise.prev = a.prev;
|
|
39
|
-
reject(e);
|
|
40
|
-
});
|
|
41
|
-
});
|
|
42
|
-
});
|
|
43
|
-
return promise;
|
|
44
|
-
};
|
|
45
|
-
const cache2 = getCached(()=>new WeakMap(), cache1, a);
|
|
46
|
-
return getCached(getResult, cache2, b);
|
|
47
|
-
};
|
|
48
|
-
const ENTRY = 'e';
|
|
49
|
-
const SET_ELEMENTS = 's';
|
|
50
|
-
const ENHANCE_CREATE_DATA = 'd';
|
|
51
|
-
const defaultFetchCache = {};
|
|
52
|
-
/**
|
|
53
|
-
* callServer callback
|
|
54
|
-
* This is not a public API.
|
|
55
|
-
*/ export const callServerRSC = async (actionId, args, fetchCache = defaultFetchCache)=>{
|
|
56
|
-
const enhanceCreateData = fetchCache[ENHANCE_CREATE_DATA] || ((d)=>d);
|
|
57
|
-
const createData = (responsePromise)=>createFromFetch(checkStatus(responsePromise), {
|
|
58
|
-
callServer: (actionId, args)=>callServerRSC(actionId, args, fetchCache)
|
|
59
|
-
});
|
|
60
|
-
const url = BASE_PATH + encodeInput(encodeActionId(actionId));
|
|
61
|
-
const responsePromise = args === undefined ? fetch(url) : encodeReply(args).then((body)=>fetch(url, {
|
|
62
|
-
method: 'POST',
|
|
63
|
-
body
|
|
64
|
-
}));
|
|
65
|
-
const data = enhanceCreateData(createData)(responsePromise);
|
|
66
|
-
// FIXME this causes rerenders even if data is empty
|
|
67
|
-
fetchCache[SET_ELEMENTS]?.((prev)=>mergeElements(prev, data));
|
|
68
|
-
return (await data)._value;
|
|
69
|
-
};
|
|
70
|
-
const prefetchedParams = new WeakMap();
|
|
71
|
-
const fetchRSCInternal = (url, params)=>params === undefined ? fetch(url) : typeof params === 'string' ? fetch(url, {
|
|
72
|
-
headers: {
|
|
73
|
-
'X-Waku-Params': params
|
|
74
|
-
}
|
|
75
|
-
}) : encodeReply(params).then((body)=>fetch(url, {
|
|
76
|
-
method: 'POST',
|
|
77
|
-
body
|
|
78
|
-
}));
|
|
79
|
-
export const fetchRSC = (input, params, fetchCache = defaultFetchCache)=>{
|
|
80
|
-
const entry = fetchCache[ENTRY];
|
|
81
|
-
if (entry && entry[0] === input && entry[1] === params) {
|
|
82
|
-
return entry[2];
|
|
83
|
-
}
|
|
84
|
-
const enhanceCreateData = fetchCache[ENHANCE_CREATE_DATA] || ((d)=>d);
|
|
85
|
-
const createData = (responsePromise)=>createFromFetch(checkStatus(responsePromise), {
|
|
86
|
-
callServer: (actionId, args)=>callServerRSC(actionId, args, fetchCache)
|
|
87
|
-
});
|
|
88
|
-
const prefetched = globalThis.__WAKU_PREFETCHED__ ||= {};
|
|
89
|
-
const url = BASE_PATH + encodeInput(input);
|
|
90
|
-
const hasValidPrefetchedResponse = !!prefetched[url] && // HACK .has() is for the initial hydration
|
|
91
|
-
// It's limited and may result in a wrong result. FIXME
|
|
92
|
-
(!prefetchedParams.has(prefetched[url]) || prefetchedParams.get(prefetched[url]) === params);
|
|
93
|
-
const responsePromise = hasValidPrefetchedResponse ? prefetched[url] : fetchRSCInternal(url, params);
|
|
94
|
-
delete prefetched[url];
|
|
95
|
-
const data = enhanceCreateData(createData)(responsePromise);
|
|
96
|
-
// eslint-disable-next-line @typescript-eslint/no-floating-promises
|
|
97
|
-
fetchCache[ENTRY] = [
|
|
98
|
-
input,
|
|
99
|
-
params,
|
|
100
|
-
data
|
|
101
|
-
];
|
|
102
|
-
return data;
|
|
103
|
-
};
|
|
104
|
-
export const prefetchRSC = (input, params)=>{
|
|
105
|
-
const prefetched = globalThis.__WAKU_PREFETCHED__ ||= {};
|
|
106
|
-
const url = BASE_PATH + encodeInput(input);
|
|
107
|
-
if (!(url in prefetched)) {
|
|
108
|
-
prefetched[url] = fetchRSCInternal(url, params);
|
|
109
|
-
prefetchedParams.set(prefetched[url], params);
|
|
110
|
-
}
|
|
111
|
-
};
|
|
112
|
-
const RefetchContext = createContext(()=>{
|
|
113
|
-
throw new Error('Missing Root component');
|
|
114
|
-
});
|
|
115
|
-
const ElementsContext = createContext(null);
|
|
116
|
-
export const Root = ({ initialInput, initialParams, fetchCache = defaultFetchCache, unstable_enhanceCreateData, children })=>{
|
|
117
|
-
fetchCache[ENHANCE_CREATE_DATA] = unstable_enhanceCreateData;
|
|
118
|
-
const [elements, setElements] = useState(()=>fetchRSC(initialInput || '', initialParams, fetchCache));
|
|
119
|
-
useEffect(()=>{
|
|
120
|
-
fetchCache[SET_ELEMENTS] = setElements;
|
|
121
|
-
}, [
|
|
122
|
-
fetchCache,
|
|
123
|
-
setElements
|
|
124
|
-
]);
|
|
125
|
-
const refetch = useCallback((input, params)=>{
|
|
126
|
-
// clear cache entry before fetching
|
|
127
|
-
delete fetchCache[ENTRY];
|
|
128
|
-
const data = fetchRSC(input, params, fetchCache);
|
|
129
|
-
setElements((prev)=>mergeElements(prev, data));
|
|
130
|
-
}, [
|
|
131
|
-
fetchCache
|
|
132
|
-
]);
|
|
133
|
-
return createElement(RefetchContext.Provider, {
|
|
134
|
-
value: refetch
|
|
135
|
-
}, createElement(ElementsContext.Provider, {
|
|
136
|
-
value: elements
|
|
137
|
-
}, children));
|
|
138
|
-
};
|
|
139
|
-
export const useRefetch = ()=>use(RefetchContext);
|
|
140
|
-
const ChildrenContext = createContext(undefined);
|
|
141
|
-
const ChildrenContextProvider = memo(ChildrenContext.Provider);
|
|
142
|
-
class OuterSlot extends Component {
|
|
143
|
-
constructor(props){
|
|
144
|
-
super(props);
|
|
145
|
-
this.state = {};
|
|
146
|
-
}
|
|
147
|
-
static getDerivedStateFromError(error) {
|
|
148
|
-
return {
|
|
149
|
-
error
|
|
150
|
-
};
|
|
151
|
-
}
|
|
152
|
-
render() {
|
|
153
|
-
if ('error' in this.state) {
|
|
154
|
-
const e = this.state.error;
|
|
155
|
-
if (e instanceof Error && !('statusCode' in e)) {
|
|
156
|
-
// HACK we assume any error as Not Found,
|
|
157
|
-
// probably caused by history api fallback
|
|
158
|
-
e.statusCode = 404;
|
|
159
|
-
}
|
|
160
|
-
if (this.props.shouldRenderPrev?.(e) && this.props.elementsPromise.prev) {
|
|
161
|
-
const elements = this.props.elementsPromise.prev;
|
|
162
|
-
return this.props.renderSlot(elements);
|
|
163
|
-
} else {
|
|
164
|
-
throw e;
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
return this.props.children;
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
const InnerSlot = ({ elementsPromise, renderSlot })=>{
|
|
171
|
-
const elements = use(elementsPromise);
|
|
172
|
-
return renderSlot(elements);
|
|
173
|
-
};
|
|
174
|
-
export const Slot = ({ id, children, fallback, unstable_shouldRenderPrev })=>{
|
|
175
|
-
const elementsPromise = use(ElementsContext);
|
|
176
|
-
if (!elementsPromise) {
|
|
177
|
-
throw new Error('Missing Root component');
|
|
178
|
-
}
|
|
179
|
-
const renderSlot = (elements)=>{
|
|
180
|
-
if (!(id in elements)) {
|
|
181
|
-
if (fallback) {
|
|
182
|
-
return fallback;
|
|
183
|
-
}
|
|
184
|
-
throw new Error('Not found: ' + id);
|
|
185
|
-
}
|
|
186
|
-
return createElement(ChildrenContextProvider, {
|
|
187
|
-
value: children
|
|
188
|
-
}, elements[id]);
|
|
189
|
-
};
|
|
190
|
-
return createElement(OuterSlot, {
|
|
191
|
-
elementsPromise,
|
|
192
|
-
shouldRenderPrev: unstable_shouldRenderPrev,
|
|
193
|
-
renderSlot
|
|
194
|
-
}, createElement(InnerSlot, {
|
|
195
|
-
elementsPromise,
|
|
196
|
-
renderSlot
|
|
197
|
-
}));
|
|
198
|
-
};
|
|
199
|
-
export const Children = ()=>use(ChildrenContext);
|
|
200
|
-
/**
|
|
201
|
-
* ServerRoot for SSR
|
|
202
|
-
* This is not a public API.
|
|
203
|
-
*/ export const ServerRoot = ({ elements, children })=>createElement(ElementsContext.Provider, {
|
|
204
|
-
value: elements
|
|
205
|
-
}, children);
|
|
1
|
+
import { Children as ChildrenOrig, Slot as SlotOrig, Root as RootOrig, ServerRootInternal as ServerRootOrig } from './minimal/client.js';
|
|
2
|
+
/** @deprecated */ export const Children = ChildrenOrig;
|
|
3
|
+
/** @deprecated */ export const Slot = SlotOrig;
|
|
4
|
+
/** @deprecated */ export const Root = RootOrig;
|
|
5
|
+
/** @deprecated */ export const ServerRoot = ServerRootOrig;
|
package/dist/config.d.ts
CHANGED
|
@@ -31,16 +31,16 @@ export interface Config {
|
|
|
31
31
|
*/
|
|
32
32
|
privateDir?: string;
|
|
33
33
|
/**
|
|
34
|
-
*
|
|
34
|
+
* Bse path for HTTP requests to indicate RSC requests.
|
|
35
35
|
* Defaults to "RSC".
|
|
36
36
|
*/
|
|
37
|
-
|
|
37
|
+
rscBase?: string;
|
|
38
38
|
/**
|
|
39
39
|
* Middleware to use
|
|
40
40
|
* Defaults to:
|
|
41
41
|
* () => [
|
|
42
|
+
* import('waku/middleware/context'),
|
|
42
43
|
* import('waku/middleware/dev-server'),
|
|
43
|
-
* import('waku/middleware/headers'),
|
|
44
44
|
* import('waku/middleware/rsc'),
|
|
45
45
|
* import('waku/middleware/ssr'),
|
|
46
46
|
* ]
|