diff --git a/dist/functions/bundler/all-pages-esbuild-context-bundler.d.ts b/dist/functions/bundler/all-pages-esbuild-context-bundler.d.ts index 6ac7707..25597b5 100644 --- a/dist/functions/bundler/all-pages-esbuild-context-bundler.d.ts +++ b/dist/functions/bundler/all-pages-esbuild-context-bundler.d.ts @@ -1,6 +1,7 @@ +import type { BundlerCTXMap } from "../../types"; type Params = { post_build_fn?: (params: { - artifacts: any[]; + artifacts: BundlerCTXMap[]; }) => Promise | void; }; export default function allPagesESBuildContextBundler(params?: Params): Promise; diff --git a/dist/functions/bundler/build-on-start-error-handler.js b/dist/functions/bundler/build-on-start-error-handler.js index 7b2adc0..89c49aa 100644 --- a/dist/functions/bundler/build-on-start-error-handler.js +++ b/dist/functions/bundler/build-on-start-error-handler.js @@ -1,4 +1,3 @@ -import { log } from "../../utils/log"; export default async function buildOnstartErrorHandler(params) { // const error_msg = `Build Failed. Please check all your components and imports.`; // log.error(error_msg); diff --git a/dist/functions/bunext-init.js b/dist/functions/bunext-init.js index fc65285..32e4385 100644 --- a/dist/functions/bunext-init.js +++ b/dist/functions/bunext-init.js @@ -36,7 +36,9 @@ export default async function bunextInit() { if (is_dev) { log.build(`Building Modules ...`); await allPagesESBuildContextBundler({ - post_build_fn: serverPostBuildFn, + post_build_fn: () => { + serverPostBuildFn(); + }, }); watcherEsbuildCTX(); } diff --git a/dist/functions/server/full-rebuild.js b/dist/functions/server/full-rebuild.js index 9e9ddce..cead864 100644 --- a/dist/functions/server/full-rebuild.js +++ b/dist/functions/server/full-rebuild.js @@ -15,7 +15,9 @@ export default async function fullRebuild(params) { await global.SSR_BUNDLER_CTX?.dispose(); global.SSR_BUNDLER_CTX = undefined; allPagesESBuildContextBundler({ - post_build_fn: serverPostBuildFn, + post_build_fn: () => { + serverPostBuildFn(); + }, }); } catch (error) { diff --git a/dist/functions/server/server-post-build-fn.d.ts b/dist/functions/server/server-post-build-fn.d.ts index 001b52c..d3c94c9 100644 --- a/dist/functions/server/server-post-build-fn.d.ts +++ b/dist/functions/server/server-post-build-fn.d.ts @@ -1 +1,5 @@ -export default function serverPostBuildFn(): Promise; +type Params = { + reload_all_controllers?: boolean; +}; +export default function serverPostBuildFn(params?: Params): Promise; +export {}; diff --git a/dist/functions/server/server-post-build-fn.js b/dist/functions/server/server-post-build-fn.js index b3f379d..4cb25a4 100644 --- a/dist/functions/server/server-post-build-fn.js +++ b/dist/functions/server/server-post-build-fn.js @@ -1,29 +1,49 @@ import _ from "lodash"; import grabPageComponent from "./web-pages/grab-page-component"; -export default async function serverPostBuildFn() { +export default async function serverPostBuildFn(params) { if (!global.HMR_CONTROLLERS?.[0] || !global.BUNDLER_CTX_MAP) { return; } + const reload_payload = { reload: true }; + const reload_enqueue = `event: update\ndata: ${JSON.stringify(reload_payload)}\n\n`; for (let i = global.HMR_CONTROLLERS.length - 1; i >= 0; i--) { const controller = global.HMR_CONTROLLERS[i]; - if (!controller?.target_map?.local_path) { + if (!controller) { continue; } - if (global.IS_404_PAGE) { - controller.controller.enqueue(`event: update\ndata: ${JSON.stringify({ reload: true })}\n\n`); + if (!controller.target_map?.local_path) { + // if (global.IS_404_PAGE) { + // controller.controller.enqueue(reload_enqueue); + // } + // if (!global.HMR_CONTROLLERS[i].page_reloaded) { + // controller.controller.enqueue(reload_enqueue); + // global.HMR_CONTROLLERS[i].page_reloaded = true; + // } + continue; + } + if (params?.reload_all_controllers) { + controller.controller.enqueue(reload_enqueue); continue; } const target_artifact = global.BUNDLER_CTX_MAP[controller.target_map.local_path]; + if (!target_artifact.local_path) { + controller.controller.enqueue(reload_enqueue); + continue; + } const mock_req = target_artifact.req ? target_artifact.req.clone() : new Request(controller.page_url); - const { serverRes } = global.IS_SERVER_COMPONENT + const page_component = global.IS_SERVER_COMPONENT ? await grabPageComponent({ req: mock_req, return_server_res_only: true, is_hydration: true, }) : {}; + if (page_component instanceof Response) { + continue; + } + const { serverRes } = page_component; const final_artifact = { ..._.omit(controller, ["controller"]), target_map: target_artifact, @@ -37,7 +57,7 @@ export default async function serverPostBuildFn() { try { let final_data = {}; if (global.ROOT_FILE_UPDATED) { - final_data = { reload: true }; + final_data = reload_payload; } else { final_data = final_artifact; diff --git a/dist/functions/server/watcher-esbuild-ctx.js b/dist/functions/server/watcher-esbuild-ctx.js index 030cec9..1255cbc 100644 --- a/dist/functions/server/watcher-esbuild-ctx.js +++ b/dist/functions/server/watcher-esbuild-ctx.js @@ -15,6 +15,10 @@ export default async function watcherEsbuildCTX() { if (filename.match(/^\.\w+/)) { return; } + if (global.BUNDLER_CTX_DISPOSED) { + await fullRebuild({ msg: `Restarting Bundler ...` }); + global.BUNDLER_CTX_DISPOSED = false; + } if (filename.endsWith(AppData["BunextTmpFileExt"])) { return; } @@ -50,7 +54,7 @@ export default async function watcherEsbuildCTX() { if (filename.match(/.*\.server\.tsx?/)) { global.IS_SERVER_COMPONENT = true; } - if (global.BUNDLER_CTX && !global.BUNDLER_CTX_DISPOSED) { + if (global.BUNDLER_CTX) { try { await global.BUNDLER_CTX.rebuild(); } @@ -58,10 +62,6 @@ export default async function watcherEsbuildCTX() { console.log(`ESBUILD Rebuild Error =>`, error); } } - else { - await fullRebuild({ msg: `Restarting Bundler ...` }); - global.BUNDLER_CTX_DISPOSED = false; - } if (filename.match(/(404|500)\.tsx?/)) { for (let i = global.HMR_CONTROLLERS.length - 1; i >= 0; i--) { const controller = global.HMR_CONTROLLERS[i]; diff --git a/dist/functions/server/web-pages/grab-page-component.d.ts b/dist/functions/server/web-pages/grab-page-component.d.ts index 21cb457..342f9da 100644 --- a/dist/functions/server/web-pages/grab-page-component.d.ts +++ b/dist/functions/server/web-pages/grab-page-component.d.ts @@ -8,5 +8,5 @@ type Params = { skip_server_res?: boolean; is_hydration?: boolean; }; -export default function grabPageComponent(params: Params): Promise; +export default function grabPageComponent(params: Params): Promise; export {}; diff --git a/dist/functions/server/web-pages/grab-page-component.js b/dist/functions/server/web-pages/grab-page-component.js index 7046368..063ccc3 100644 --- a/dist/functions/server/web-pages/grab-page-component.js +++ b/dist/functions/server/web-pages/grab-page-component.js @@ -5,6 +5,7 @@ import { log } from "../../../utils/log"; import grabPageModules from "./grab-page-modules"; import grabPageCombinedServerRes from "./grab-page-combined-server-res"; import fullRebuild from "../full-rebuild"; +import serverPostBuildFn from "../server-post-build-fn"; class NotFoundError extends Error { status = 404; constructor(message) { @@ -41,7 +42,6 @@ export default async function grabPageComponent(params) { } const bundledMap = global.BUNDLER_CTX_MAP[file_path]; if (!bundledMap?.path) { - console.log(global.BUNDLER_CTX_MAP); const errMsg = `No Bundled File Path for this request path!`; log.error(errMsg); throw new Error(errMsg); @@ -62,7 +62,7 @@ export default async function grabPageComponent(params) { }); return { serverRes }; } - const { component, module, serverRes, root_module } = await grabPageModules({ + const page_modules = await grabPageModules({ file_path, debug, query: match?.query, @@ -70,7 +70,10 @@ export default async function grabPageComponent(params) { url, skip_server_res, }); - global.IS_404_PAGE = false; + if (page_modules instanceof Response) { + return page_modules; + } + const { component, module, serverRes, root_module } = page_modules; return { component, serverRes, @@ -94,8 +97,10 @@ export default async function grabPageComponent(params) { ...params, retry: true, }); - if (component_retried.success) { + if (component_retried instanceof Response || + component_retried.success) { global.REBUILD_RETRIES = 0; + await serverPostBuildFn(); return component_retried; } } diff --git a/dist/functions/server/web-pages/grab-page-error-component.d.ts b/dist/functions/server/web-pages/grab-page-error-component.d.ts index 26083a6..ca7beef 100644 --- a/dist/functions/server/web-pages/grab-page-error-component.d.ts +++ b/dist/functions/server/web-pages/grab-page-error-component.d.ts @@ -5,5 +5,5 @@ type Params = { is404?: boolean; url?: URL; }; -export default function grabPageErrorComponent({ error, routeParams, is404, url, }: Params): Promise; +export default function grabPageErrorComponent({ error, routeParams, is404, url, }: Params): Promise; export {}; diff --git a/dist/functions/server/web-pages/grab-page-error-component.js b/dist/functions/server/web-pages/grab-page-error-component.js index 517c589..3f5226f 100644 --- a/dist/functions/server/web-pages/grab-page-error-component.js +++ b/dist/functions/server/web-pages/grab-page-error-component.js @@ -31,12 +31,16 @@ export default async function grabPageErrorComponent({ error, routeParams, is404 } const file_path = match.filePath; const bundledMap = global.BUNDLER_CTX_MAP?.[file_path]; - const { component, module, serverRes, root_module } = await grabPageModules({ + const page_component = await grabPageModules({ file_path: file_path, query: match?.query, routeParams, url, }); + if (page_component instanceof Response) { + return page_component; + } + const { component, module, serverRes, root_module } = page_component; return { component, routeParams, diff --git a/dist/functions/server/web-pages/grab-page-modules.d.ts b/dist/functions/server/web-pages/grab-page-modules.d.ts index 8d0427b..b24e9a7 100644 --- a/dist/functions/server/web-pages/grab-page-modules.d.ts +++ b/dist/functions/server/web-pages/grab-page-modules.d.ts @@ -1,4 +1,5 @@ -import type { BunextPageModule, BunxRouteParams } from "../../../types"; +import type { BunextPageModule, BunextPageModuleServerReturn, BunxRouteParams } from "../../../types"; +import type { FC } from "react"; type Params = { file_path: string; debug?: boolean; @@ -7,10 +8,11 @@ type Params = { routeParams?: BunxRouteParams; skip_server_res?: boolean; }; -export default function grabPageModules({ file_path, debug, url, query, routeParams, skip_server_res, }: Params): Promise<{ - component: import("react").FC; - serverRes: import("../../../types").BunextPageModuleServerReturn | undefined; +type Return = { + component: FC; + serverRes: BunextPageModuleServerReturn | undefined; module: BunextPageModule; root_module: BunextPageModule | undefined; -}>; +}; +export default function grabPageModules({ file_path, debug, url, query, routeParams, skip_server_res, }: Params): Promise; export {}; diff --git a/dist/functions/server/web-pages/grab-page-modules.js b/dist/functions/server/web-pages/grab-page-modules.js index e76d08d..00ac734 100644 --- a/dist/functions/server/web-pages/grab-page-modules.js +++ b/dist/functions/server/web-pages/grab-page-modules.js @@ -5,14 +5,6 @@ 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 { root_file_path } = grabRootFilePath(); - const root_module = root_file_path - ? await import(`${root_file_path}?t=${now}`) - : undefined; - const module = await import(`${file_path}?t=${now}`); - if (debug) { - log.info(`module:`, module); - } const { serverRes } = skip_server_res ? {} : await grabPageCombinedServerRes({ @@ -22,6 +14,19 @@ export default async function grabPageModules({ file_path, debug, url, query, ro routeParams, url, }); + if (serverRes?.redirect?.destination) { + return Response.redirect(serverRes.redirect.destination, serverRes.redirect.permanent + ? 301 + : serverRes.redirect.status_code || 302); + } + const { root_file_path } = grabRootFilePath(); + const root_module = root_file_path + ? await import(`${root_file_path}?t=${now}`) + : undefined; + const module = await import(`${file_path}?t=${now}`); + if (debug) { + log.info(`module:`, module); + } const { component } = (await grabPageBundledReactComponent({ file_path, })) || {}; diff --git a/dist/functions/server/web-pages/handle-web-pages.js b/dist/functions/server/web-pages/handle-web-pages.js index fb25aad..332b439 100644 --- a/dist/functions/server/web-pages/handle-web-pages.js +++ b/dist/functions/server/web-pages/handle-web-pages.js @@ -23,6 +23,9 @@ export default async function handleWebPages({ req, }) { const componentRes = await grabPageComponent({ req, }); + if (componentRes instanceof Response) { + return componentRes; + } return await generateWebPageResponseFromComponentReturn({ ...componentRes, }); @@ -32,6 +35,9 @@ export default async function handleWebPages({ req, }) { const componentRes = await grabPageErrorComponent({ error, }); + if (componentRes instanceof Response) { + return componentRes; + } return await generateWebPageResponseFromComponentReturn(componentRes); } } diff --git a/dist/types/index.d.ts b/dist/types/index.d.ts index cc818df..ac26dfa 100644 --- a/dist/types/index.d.ts +++ b/dist/types/index.d.ts @@ -285,6 +285,7 @@ export type GlobalHMRControllerObject = { page_url: string; target_map?: BundlerCTXMap; page_props?: any; + page_reloaded?: boolean; }; export type BunextCacheFileMeta = { date_created: number; diff --git a/package.json b/package.json index 9c1a7ef..f37517d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@moduletrace/bunext", - "version": "1.0.76", + "version": "1.0.77", "main": "dist/index.js", "module": "index.ts", "dependencies": { diff --git a/src/functions/bundler/all-pages-esbuild-context-bundler.ts b/src/functions/bundler/all-pages-esbuild-context-bundler.ts index 52890e8..effaf0f 100644 --- a/src/functions/bundler/all-pages-esbuild-context-bundler.ts +++ b/src/functions/bundler/all-pages-esbuild-context-bundler.ts @@ -4,7 +4,7 @@ import grabDirNames from "../../utils/grab-dir-names"; import isDevelopment from "../../utils/is-development"; import tailwindEsbuildPlugin from "../server/web-pages/tailwind-esbuild-plugin"; import grabClientHydrationScript from "./grab-client-hydration-script"; -import type { PageFiles } from "../../types"; +import type { BundlerCTXMap, PageFiles } from "../../types"; import path from "path"; import virtualFilesPlugin from "./plugins/virtual-files-plugin"; import esbuildCTXArtifactTracker from "./plugins/esbuild-ctx-artifact-tracker"; @@ -12,7 +12,9 @@ import esbuildCTXArtifactTracker from "./plugins/esbuild-ctx-artifact-tracker"; const { HYDRATION_DST_DIR, BUNX_HYDRATION_SRC_DIR } = grabDirNames(); type Params = { - post_build_fn?: (params: { artifacts: any[] }) => Promise | void; + post_build_fn?: (params: { + artifacts: BundlerCTXMap[]; + }) => Promise | void; }; export default async function allPagesESBuildContextBundler(params?: Params) { diff --git a/src/functions/bundler/build-on-start-error-handler.ts b/src/functions/bundler/build-on-start-error-handler.ts index 04c7024..a864020 100644 --- a/src/functions/bundler/build-on-start-error-handler.ts +++ b/src/functions/bundler/build-on-start-error-handler.ts @@ -1,5 +1,3 @@ -import { log } from "../../utils/log"; - type Params = {}; export default async function buildOnstartErrorHandler(params?: Params) { diff --git a/src/functions/bunext-init.ts b/src/functions/bunext-init.ts index dc24186..d906c65 100644 --- a/src/functions/bunext-init.ts +++ b/src/functions/bunext-init.ts @@ -89,7 +89,9 @@ export default async function bunextInit() { if (is_dev) { log.build(`Building Modules ...`); await allPagesESBuildContextBundler({ - post_build_fn: serverPostBuildFn, + post_build_fn: () => { + serverPostBuildFn(); + }, }); watcherEsbuildCTX(); } else { diff --git a/src/functions/server/full-rebuild.ts b/src/functions/server/full-rebuild.ts index a99806a..0d26d5f 100644 --- a/src/functions/server/full-rebuild.ts +++ b/src/functions/server/full-rebuild.ts @@ -22,7 +22,9 @@ export default async function fullRebuild(params?: { msg?: string }) { global.SSR_BUNDLER_CTX = undefined; allPagesESBuildContextBundler({ - post_build_fn: serverPostBuildFn, + post_build_fn: () => { + serverPostBuildFn(); + }, }); } catch (error: any) { log.error(error); diff --git a/src/functions/server/server-post-build-fn.ts b/src/functions/server/server-post-build-fn.ts index 31ec242..d92474a 100644 --- a/src/functions/server/server-post-build-fn.ts +++ b/src/functions/server/server-post-build-fn.ts @@ -2,33 +2,54 @@ import _ from "lodash"; import type { GlobalHMRControllerObject } from "../../types"; import grabPageComponent from "./web-pages/grab-page-component"; -export default async function serverPostBuildFn() { +type Params = { + reload_all_controllers?: boolean; +}; + +export default async function serverPostBuildFn(params?: Params) { if (!global.HMR_CONTROLLERS?.[0] || !global.BUNDLER_CTX_MAP) { return; } + const reload_payload = { reload: true }; + const reload_enqueue = `event: update\ndata: ${JSON.stringify(reload_payload)}\n\n`; + for (let i = global.HMR_CONTROLLERS.length - 1; i >= 0; i--) { const controller = global.HMR_CONTROLLERS[i]; - if (!controller?.target_map?.local_path) { + if (!controller) { continue; } - if (global.IS_404_PAGE) { - controller.controller.enqueue( - `event: update\ndata: ${JSON.stringify({ reload: true })}\n\n`, - ); + if (!controller.target_map?.local_path) { + // if (global.IS_404_PAGE) { + // controller.controller.enqueue(reload_enqueue); + // } + // if (!global.HMR_CONTROLLERS[i].page_reloaded) { + // controller.controller.enqueue(reload_enqueue); + // global.HMR_CONTROLLERS[i].page_reloaded = true; + // } + continue; + } + + if (params?.reload_all_controllers) { + controller.controller.enqueue(reload_enqueue); continue; } const target_artifact = global.BUNDLER_CTX_MAP[controller.target_map.local_path]; + if (!target_artifact.local_path) { + controller.controller.enqueue(reload_enqueue); + continue; + } + const mock_req = target_artifact.req ? target_artifact.req.clone() : new Request(controller.page_url); - const { serverRes } = global.IS_SERVER_COMPONENT + const page_component = global.IS_SERVER_COMPONENT ? await grabPageComponent({ req: mock_req, return_server_res_only: true, @@ -36,6 +57,12 @@ export default async function serverPostBuildFn() { }) : {}; + if (page_component instanceof Response) { + continue; + } + + const { serverRes } = page_component; + const final_artifact: Omit = { ..._.omit(controller, ["controller"]), target_map: target_artifact, @@ -53,7 +80,7 @@ export default async function serverPostBuildFn() { let final_data: { [k: string]: any } = {}; if (global.ROOT_FILE_UPDATED) { - final_data = { reload: true }; + final_data = reload_payload; } else { final_data = final_artifact; } diff --git a/src/functions/server/watcher-esbuild-ctx.ts b/src/functions/server/watcher-esbuild-ctx.ts index 158621a..627b4e1 100644 --- a/src/functions/server/watcher-esbuild-ctx.ts +++ b/src/functions/server/watcher-esbuild-ctx.ts @@ -21,6 +21,11 @@ export default async function watcherEsbuildCTX() { return; } + if (global.BUNDLER_CTX_DISPOSED) { + await fullRebuild({ msg: `Restarting Bundler ...` }); + global.BUNDLER_CTX_DISPOSED = false; + } + if (filename.endsWith(AppData["BunextTmpFileExt"])) { return; } @@ -64,15 +69,12 @@ export default async function watcherEsbuildCTX() { global.IS_SERVER_COMPONENT = true; } - if (global.BUNDLER_CTX && !global.BUNDLER_CTX_DISPOSED) { + if (global.BUNDLER_CTX) { try { await global.BUNDLER_CTX.rebuild(); } catch (error) { console.log(`ESBUILD Rebuild Error =>`, error); } - } else { - await fullRebuild({ msg: `Restarting Bundler ...` }); - global.BUNDLER_CTX_DISPOSED = false; } if (filename.match(/(404|500)\.tsx?/)) { diff --git a/src/functions/server/web-pages/grab-page-component.tsx b/src/functions/server/web-pages/grab-page-component.tsx index 7e811f9..5799c6b 100644 --- a/src/functions/server/web-pages/grab-page-component.tsx +++ b/src/functions/server/web-pages/grab-page-component.tsx @@ -6,6 +6,7 @@ import { log } from "../../../utils/log"; import grabPageModules from "./grab-page-modules"; import grabPageCombinedServerRes from "./grab-page-combined-server-res"; import fullRebuild from "../full-rebuild"; +import serverPostBuildFn from "../server-post-build-fn"; class NotFoundError extends Error { status = 404; @@ -28,7 +29,7 @@ type Params = { export default async function grabPageComponent( params: Params, -): Promise { +): Promise { const { req, file_path: passed_file_path, @@ -77,7 +78,6 @@ export default async function grabPageComponent( const bundledMap = global.BUNDLER_CTX_MAP[file_path]; if (!bundledMap?.path) { - console.log(global.BUNDLER_CTX_MAP); const errMsg = `No Bundled File Path for this request path!`; log.error(errMsg); throw new Error(errMsg); @@ -103,17 +103,20 @@ export default async function grabPageComponent( return { serverRes }; } - const { component, module, serverRes, root_module } = - await grabPageModules({ - file_path, - debug, - query: match?.query, - routeParams, - url, - skip_server_res, - }); + const page_modules = await grabPageModules({ + file_path, + debug, + query: match?.query, + routeParams, + url, + skip_server_res, + }); - global.IS_404_PAGE = false; + if (page_modules instanceof Response) { + return page_modules; + } + + const { component, module, serverRes, root_module } = page_modules; return { component, @@ -141,8 +144,12 @@ export default async function grabPageComponent( retry: true, }); - if (component_retried.success) { + if ( + component_retried instanceof Response || + component_retried.success + ) { global.REBUILD_RETRIES = 0; + await serverPostBuildFn(); return component_retried; } } diff --git a/src/functions/server/web-pages/grab-page-error-component.tsx b/src/functions/server/web-pages/grab-page-error-component.tsx index 2af2f26..97cd334 100644 --- a/src/functions/server/web-pages/grab-page-error-component.tsx +++ b/src/functions/server/web-pages/grab-page-error-component.tsx @@ -20,7 +20,7 @@ export default async function grabPageErrorComponent({ routeParams, is404, url, -}: Params): Promise { +}: Params): Promise { const router = global.ROUTER; const { BUNX_ROOT_500_PRESET_COMPONENT, BUNX_ROOT_404_PRESET_COMPONENT } = @@ -61,13 +61,18 @@ export default async function grabPageErrorComponent({ const bundledMap = global.BUNDLER_CTX_MAP?.[file_path]; - const { component, module, serverRes, root_module } = - await grabPageModules({ - file_path: file_path, - query: match?.query, - routeParams, - url, - }); + const page_component = await grabPageModules({ + file_path: file_path, + query: match?.query, + routeParams, + url, + }); + + if (page_component instanceof Response) { + return page_component; + } + + const { component, module, serverRes, root_module } = page_component; return { component, diff --git a/src/functions/server/web-pages/grab-page-modules.tsx b/src/functions/server/web-pages/grab-page-modules.tsx index 1f536e8..1474030 100644 --- a/src/functions/server/web-pages/grab-page-modules.tsx +++ b/src/functions/server/web-pages/grab-page-modules.tsx @@ -1,5 +1,6 @@ import type { BunextPageModule, + BunextPageModuleServerReturn, BunextRootModule, BunxRouteParams, } from "../../../types"; @@ -8,6 +9,7 @@ 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; @@ -18,6 +20,13 @@ type Params = { 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, @@ -25,9 +34,28 @@ export default async function grabPageModules({ query, routeParams, skip_server_res, -}: Params) { +}: Params): Promise { 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 { root_file_path } = grabRootFilePath(); const root_module: BunextRootModule | undefined = root_file_path ? await import(`${root_file_path}?t=${now}`) @@ -39,16 +67,6 @@ export default async function grabPageModules({ log.info(`module:`, module); } - const { serverRes } = skip_server_res - ? {} - : await grabPageCombinedServerRes({ - file_path, - debug, - query, - routeParams, - url, - }); - const { component } = (await grabPageBundledReactComponent({ file_path, diff --git a/src/functions/server/web-pages/handle-web-pages.tsx b/src/functions/server/web-pages/handle-web-pages.tsx index 9e9027a..17b519c 100644 --- a/src/functions/server/web-pages/handle-web-pages.tsx +++ b/src/functions/server/web-pages/handle-web-pages.tsx @@ -35,6 +35,10 @@ export default async function handleWebPages({ req, }); + if (componentRes instanceof Response) { + return componentRes; + } + return await generateWebPageResponseFromComponentReturn({ ...componentRes, }); @@ -45,6 +49,10 @@ export default async function handleWebPages({ error, }); + if (componentRes instanceof Response) { + return componentRes; + } + return await generateWebPageResponseFromComponentReturn(componentRes); } } diff --git a/src/types/index.ts b/src/types/index.ts index 8205416..7f46aa7 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -324,6 +324,7 @@ export type GlobalHMRControllerObject = { page_url: string; target_map?: BundlerCTXMap; page_props?: any; + page_reloaded?: boolean; }; export type BunextCacheFileMeta = {