Skip to content
This repository was archived by the owner on Jul 6, 2025. It is now read-only.

Commit 8c89ee3

Browse files
committed
Fix data fetching
1 parent eec1a69 commit 8c89ee3

File tree

5 files changed

+43
-37
lines changed

5 files changed

+43
-37
lines changed

framework/core/route.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ export type RouteModule = {
77
params: Record<string, string>;
88
filename: string;
99
defaultExport?: unknown;
10+
withData?: boolean;
1011
data?: unknown;
1112
dataCacheTtl?: number;
1213
};

framework/react/context.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ export const RouterContext = createContext<RouterContextProps>({
1212
url: new URL("http://localhost/"),
1313
params: {},
1414
});
15+
RouterContext.displayName = "RouterContext";
1516

1617
export type HttpMethod = "get" | "post" | "put" | "patch" | "delete";
1718

@@ -47,6 +48,7 @@ export const DataContext = createContext<DataContextProps>({
4748
},
4849
reload: () => Promise.resolve(undefined),
4950
});
51+
DataContext.displayName = "DataContext";
5052

5153
export type ForwardPropsContextProps = {
5254
props: Record<string, unknown>;
@@ -55,3 +57,4 @@ export type ForwardPropsContextProps = {
5557
export const ForwardPropsContext = createContext<ForwardPropsContextProps>({
5658
props: {},
5759
});
60+
ForwardPropsContext.displayName = "ForwardPropsContext";

framework/react/error.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export class ErrorBoundary extends Component<ErrorBoundaryProps, { error: Error
2222
}
2323
}
2424

25-
export function Err({ status, statusText }: { status: number; statusText: string }) {
25+
export function Err({ status, message }: { status?: number; message: string }) {
2626
return createElement(
2727
"div",
2828
{
@@ -35,8 +35,8 @@ export function Err({ status, statusText }: { status: number; statusText: string
3535
fontSize: 16,
3636
},
3737
},
38-
createElement("strong", { style: { fontWeight: "500" } }, status),
39-
createElement("small", { style: { color: "#999", padding: "0 6px" } }, "-"),
40-
statusText,
38+
status && createElement("strong", { style: { fontWeight: "500" } }, status),
39+
status && createElement("small", { style: { color: "#999", padding: "0 6px" } }, "-"),
40+
message,
4141
);
4242
}

framework/react/router.ts

Lines changed: 31 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -151,12 +151,13 @@ export const Router: FC<RouterProps> = ({ ssrContext, suspense, createPortal })
151151
};
152152
const dataUrl = rmod.url.pathname + rmod.url.search;
153153
if (filename in routeModules) {
154-
rmod.defaultExport = routeModules[filename].defaultExport;
154+
Object.assign(rmod, routeModules[filename]);
155155
} else {
156-
const { defaultExport } = await importModule(meta);
157-
rmod.defaultExport = defaultExport;
156+
const { defaultExport, withData } = await importModule(meta);
157+
Object.assign(rmod, { defaultExport, withData });
158158
}
159159
if (!dataCache.has(dataUrl) && routeModules[filename]?.withData === true) {
160+
rmod.withData = true;
160161
await prefetchData(dataUrl);
161162
}
162163
return rmod;
@@ -207,7 +208,7 @@ export const Router: FC<RouterProps> = ({ ssrContext, suspense, createPortal })
207208
}, []);
208209

209210
if (modules.length === 0) {
210-
return createElement(Err, { status: 404, statusText: "page not found" });
211+
return createElement(Err, { status: 404, message: "page not found" });
211212
}
212213

213214
return createElement(
@@ -227,38 +228,37 @@ export const Router: FC<RouterProps> = ({ ssrContext, suspense, createPortal })
227228
const RouteRoot: FC<{ modules: RouteModule[]; dataCache: Map<string, RouteData>; ssrContext?: SSRContext }> = (
228229
{ modules, dataCache, ssrContext },
229230
) => {
230-
const { url, defaultExport } = modules[0];
231+
const { url, defaultExport, withData } = modules[0];
231232
const dataUrl = url.pathname + url.search;
232-
const errorHandler: FC<{ error: Error }> = ssrContext?.errorBoundaryHandler ?? global.__ERROR_BOUNDARY_HANDLER ??
233-
(({ error }) =>
234-
createElement(Err, {
235-
status: 500,
236-
statusText: error.message,
237-
}));
233+
const errorHandler: FC<{ error: Error }> = ssrContext?.errorBoundaryHandler ?? global.__ERROR_BOUNDARY_HANDLER ?? Err;
234+
const el = typeof defaultExport === "function"
235+
? createElement(
236+
defaultExport as FC,
237+
null,
238+
modules.length > 1 && createElement(
239+
RouteRoot,
240+
{ modules: modules.slice(1), dataCache, ssrContext },
241+
),
242+
)
243+
: createElement(Err, {
244+
status: 400,
245+
message: "missing default export as a valid React component",
246+
});
238247

239248
return createElement(
240249
ErrorBoundary,
241250
{ Handler: errorHandler },
242-
createElement(
243-
DataProvider,
244-
{
245-
dataCache,
246-
dataUrl: dataUrl,
247-
key: dataUrl,
248-
},
249-
typeof defaultExport === "function"
250-
? createElement(
251-
defaultExport as FC,
252-
null,
253-
modules.length > 1
254-
? createElement(RouteRoot, { modules: modules.slice(1), dataCache, ssrContext })
255-
: undefined,
256-
)
257-
: createElement(Err, {
258-
status: 400,
259-
statusText: "missing default export as a valid React component",
260-
}),
261-
),
251+
withData
252+
? createElement(
253+
DataProvider,
254+
{
255+
dataCache,
256+
dataUrl: dataUrl,
257+
key: dataUrl,
258+
},
259+
el,
260+
)
261+
: el,
262262
);
263263
};
264264

server/renderer.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -217,14 +217,15 @@ export default {
217217
element(el: Element) {
218218
headCollection.forEach((h) => util.isFilledString(h) && el.append(h, { html: true }));
219219
if (routeModules.length > 0) {
220-
const ssrModules = routeModules.map(({ url, params, filename, data, dataCacheTtl }) => {
220+
const ssrModules = routeModules.map(({ url, params, filename, withData, data, dataCacheTtl }) => {
221221
const suspense = typeof data === "function" ? true : undefined;
222222
return {
223223
url: url.pathname + url.search,
224224
params,
225225
filename,
226-
data: suspense ? undefined : data,
226+
withData,
227227
suspense,
228+
data: suspense ? undefined : data,
228229
dataCacheTtl,
229230
};
230231
});
@@ -408,6 +409,7 @@ async function initSSR(
408409
throw new FetchError(500, {}, "No response from data fetcher");
409410
}
410411
};
412+
rmod.withData = true;
411413
if (suspense) {
412414
rmod.data = fetchData;
413415
} else {

0 commit comments

Comments
 (0)