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"; export default async function grabPageModules({ file_path, debug, url, query, routeParams, skip_server_res, }) { 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 = !root_file_path ? undefined : bundled_root_module || (await import(`${root_file_path}?t=${now}`)); const module = 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, }; }