Files
bunext/src/functions/server/web-pages/grab-page-modules.tsx
T
2026-10-14 12:30:41 +01:00

100 lines
2.6 KiB
TypeScript

import type {
BunextPageModule,
BunextPageModuleServerReturn,
BunextRootModule,
BunxRouteParams,
} from "../../../types";
import grabPageBundledReactComponent from "./grab-page-bundled-react-component";
import _ from "lodash";
import { log } from "../../../utils/log";
import grabRootFilePath from "./grab-root-file-path";
import grabPageCombinedServerRes from "./grab-page-combined-server-res";
import type { FC } from "react";
type Params = {
file_path: string;
debug?: boolean;
url?: URL;
query?: any;
routeParams?: BunxRouteParams;
skip_server_res?: boolean;
};
type Return = {
component: FC;
serverRes: BunextPageModuleServerReturn | undefined;
module: BunextPageModule;
root_module: BunextPageModule | undefined;
};
export default async function grabPageModules({
file_path,
debug,
url,
query,
routeParams,
skip_server_res,
}: Params): Promise<Return | Response> {
const now = Date.now();
const { serverRes } = skip_server_res
? {}
: await grabPageCombinedServerRes({
file_path,
debug,
query,
routeParams,
url,
});
if (serverRes?.redirect?.destination) {
return Response.redirect(
serverRes.redirect.destination,
serverRes.redirect.permanent
? 301
: serverRes.redirect.status_code || 302,
);
}
const {
component,
page_module,
root_module: bundled_root_module,
} =
(await grabPageBundledReactComponent({
file_path,
})) || {};
if (!component) {
throw new Error(`Couldn't grab page component`);
}
// Prefer the page/root exports re-exported by the SSR bundle. Importing
// the raw source with Bun's loader only cache-busts the page file itself:
// its transitive imports stay in Bun's module registry, so a component
// that failed to resolve once (e.g. imported before it was created)
// keeps failing until the server restarts.
const { root_file_path } = grabRootFilePath();
const root_module: BunextRootModule | undefined = !root_file_path
? undefined
: bundled_root_module || (await import(`${root_file_path}?t=${now}`));
const module: BunextPageModule =
page_module || (await import(`${file_path}?t=${now}`));
if (debug) {
log.info(`module:`, module);
}
if (debug) {
log.info(`component:`, component);
}
return {
component,
serverRes,
module,
root_module,
};
}