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 importFresh from "../../../utils/import-fresh"; import grabRedirectResponse from "../../../utils/grab-redirect-response"; import NotFoundError from "../../../utils/not-found-error"; export default async function grabPageModules({ file_path, debug, url, query, routeParams, skip_server_res, }) { const { serverRes } = skip_server_res ? {} : await grabPageCombinedServerRes({ file_path, debug, query, routeParams, url, }); if (serverRes?.redirect?.destination) { return await grabRedirectResponse({ serverRes, routeParams }); } // Rendered as the 404 page by grabPageComponent's error path if (serverRes?.not_found) { throw new NotFoundError(`Page ${url?.pathname || file_path} not found`); } 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 importFresh(root_file_path)); const module = page_module || (await importFresh(file_path)); if (debug) { log.info(`module:`, module); } if (debug) { log.info(`component:`, component); } return { component, serverRes, module, root_module, }; }