From 950bdc3dcac0faf5b375bca9df9b0d64b7ac7698 Mon Sep 17 00:00:00 2001 From: Benjamin Toby Date: Fri, 27 Mar 2026 05:22:31 +0100 Subject: [PATCH] Add error logs for server functions. Add cache dynamic function. --- .../generate-web-page-get-cache-page.d.ts | 10 ++++ .../generate-web-page-get-cache-page.js | 29 ++++++++++ ...web-page-response-from-component-return.js | 22 ++++---- .../server/web-pages/grab-page-server-res.js | 3 + dist/types/index.d.ts | 15 ++++- package.json | 2 +- .../generate-web-page-get-cache-page.tsx | 56 +++++++++++++++++++ ...eb-page-response-from-component-return.tsx | 25 ++++----- .../server/web-pages/grab-page-server-res.tsx | 9 ++- src/types/index.ts | 18 +++++- 10 files changed, 157 insertions(+), 32 deletions(-) create mode 100644 dist/functions/server/web-pages/generate-web-page-get-cache-page.d.ts create mode 100644 dist/functions/server/web-pages/generate-web-page-get-cache-page.js create mode 100644 src/functions/server/web-pages/generate-web-page-get-cache-page.tsx diff --git a/dist/functions/server/web-pages/generate-web-page-get-cache-page.d.ts b/dist/functions/server/web-pages/generate-web-page-get-cache-page.d.ts new file mode 100644 index 0000000..8a953a3 --- /dev/null +++ b/dist/functions/server/web-pages/generate-web-page-get-cache-page.d.ts @@ -0,0 +1,10 @@ +import type { BunextPageModule, BunextPageModuleServerReturn, BunxRouteParams } from "../../../types"; +type Params = { + html: string; + module: BunextPageModule; + root_module?: BunextPageModule; + routeParams?: BunxRouteParams; + serverRes?: BunextPageModuleServerReturn; +}; +export default function generateWebPageGetCachePage({ module, routeParams, serverRes, root_module, html, }: Params): Promise; +export {}; diff --git a/dist/functions/server/web-pages/generate-web-page-get-cache-page.js b/dist/functions/server/web-pages/generate-web-page-get-cache-page.js new file mode 100644 index 0000000..ed10b67 --- /dev/null +++ b/dist/functions/server/web-pages/generate-web-page-get-cache-page.js @@ -0,0 +1,29 @@ +import _ from "lodash"; +import { log } from "../../../utils/log"; +import writeCache from "../../cache/write-cache"; +export default async function generateWebPageGetCachePage({ module, routeParams, serverRes, root_module, html, }) { + const config = _.merge(root_module?.config, module.config); + const cache_page = config?.cachePage || serverRes?.cachePage || false; + const expiry_seconds = config?.cacheExpiry || serverRes?.cacheExpiry; + if (cache_page && routeParams?.url) { + try { + const is_cache = typeof cache_page == "boolean" + ? cache_page + : await cache_page({ ctx: routeParams, serverRes }); + if (!is_cache) { + return false; + } + const key = routeParams.url.pathname + (routeParams.url.search || ""); + writeCache({ + key, + value: html, + paradigm: "html", + expiry_seconds, + }); + } + catch (error) { + log.error(`Error writing Cache => ${error.message}\n`, error); + } + } + return true; +} diff --git a/dist/functions/server/web-pages/generate-web-page-response-from-component-return.js b/dist/functions/server/web-pages/generate-web-page-response-from-component-return.js index ee45b5d..a6497c9 100644 --- a/dist/functions/server/web-pages/generate-web-page-response-from-component-return.js +++ b/dist/functions/server/web-pages/generate-web-page-response-from-component-return.js @@ -1,9 +1,10 @@ import _ from "lodash"; import isDevelopment from "../../../utils/is-development"; import { log } from "../../../utils/log"; -import writeCache from "../../cache/write-cache"; import genWebHTML from "./generate-web-html"; +import generateWebPageGetCachePage from "./generate-web-page-get-cache-page"; export default async function generateWebPageResponseFromComponentReturn({ component, module, bundledMap, routeParams, serverRes, debug, root_module, }) { + const is_dev = isDevelopment(); const html = await genWebHTML({ component, pageProps: serverRes, @@ -28,7 +29,7 @@ export default async function generateWebPageResponseFromComponentReturn({ compo ...serverRes?.responseOptions?.headers, }, }; - if (isDevelopment()) { + if (is_dev) { res_opts.headers = { ...res_opts.headers, "Cache-Control": "no-cache, no-store, must-revalidate", @@ -36,16 +37,13 @@ export default async function generateWebPageResponseFromComponentReturn({ compo Expires: "0", }; } - const config = _.merge(root_module?.config, module.config); - const cache_page = config?.cachePage || serverRes?.cachePage || false; - const expiry_seconds = config?.cacheExpiry || serverRes?.cacheExpiry; - if (cache_page && routeParams?.url) { - const key = routeParams.url.pathname + (routeParams.url.search || ""); - writeCache({ - key, - value: html, - paradigm: "html", - expiry_seconds, + if (!is_dev) { + await generateWebPageGetCachePage({ + html, + module, + root_module, + routeParams, + serverRes, }); } const res = new Response(html, res_opts); diff --git a/dist/functions/server/web-pages/grab-page-server-res.js b/dist/functions/server/web-pages/grab-page-server-res.js index 83c2fc7..f2a33f1 100644 --- a/dist/functions/server/web-pages/grab-page-server-res.js +++ b/dist/functions/server/web-pages/grab-page-server-res.js @@ -1,4 +1,5 @@ import _ from "lodash"; +import { log } from "../../../utils/log"; export default async function grabPageServerRes({ url, query, routeParams, server_function, }) { const default_props = { url: url @@ -37,8 +38,10 @@ export default async function grabPageServerRes({ url, query, routeParams, serve }; } catch (error) { + log.error(`Page ${url?.pathname} Server Error => ${error.message}\n`, error); return { ...default_props, + error: error.message, }; } } diff --git a/dist/types/index.d.ts b/dist/types/index.d.ts index b0669ff..3f5695a 100644 --- a/dist/types/index.d.ts +++ b/dist/types/index.d.ts @@ -188,7 +188,10 @@ export type BunextPageServerFn = (ctx: Omit) => Promise>; export type BunextRouteConfig = { - cachePage?: boolean; + /** + * Whether to cache the current page + */ + cachePage?: BunextCachePageType; /** * Expiry time of the cache in seconds */ @@ -207,13 +210,21 @@ export type BunextPageModuleServerReturn; + serverRes?: BunextPageModuleServerReturn; +}) => Promise | boolean); export type BunextPageProps; +}; + +export default async function generateWebPageGetCachePage({ + module, + routeParams, + serverRes, + root_module, + html, +}: Params) { + const config = _.merge(root_module?.config, module.config); + + const cache_page = config?.cachePage || serverRes?.cachePage || false; + const expiry_seconds = config?.cacheExpiry || serverRes?.cacheExpiry; + + if (cache_page && routeParams?.url) { + try { + const is_cache = + typeof cache_page == "boolean" + ? cache_page + : await cache_page({ ctx: routeParams, serverRes }); + + if (!is_cache) { + return false; + } + + const key = + routeParams.url.pathname + (routeParams.url.search || ""); + + writeCache({ + key, + value: html, + paradigm: "html", + expiry_seconds, + }); + } catch (error: any) { + log.error(`Error writing Cache => ${error.message}\n`, error); + } + } + + return true; +} diff --git a/src/functions/server/web-pages/generate-web-page-response-from-component-return.tsx b/src/functions/server/web-pages/generate-web-page-response-from-component-return.tsx index 4806e6a..f8d50d3 100644 --- a/src/functions/server/web-pages/generate-web-page-response-from-component-return.tsx +++ b/src/functions/server/web-pages/generate-web-page-response-from-component-return.tsx @@ -2,8 +2,8 @@ import _ from "lodash"; import type { GrabPageComponentRes } from "../../../types"; import isDevelopment from "../../../utils/is-development"; import { log } from "../../../utils/log"; -import writeCache from "../../cache/write-cache"; import genWebHTML from "./generate-web-html"; +import generateWebPageGetCachePage from "./generate-web-page-get-cache-page"; export default async function generateWebPageResponseFromComponentReturn({ component, @@ -14,6 +14,8 @@ export default async function generateWebPageResponseFromComponentReturn({ debug, root_module, }: GrabPageComponentRes) { + const is_dev = isDevelopment(); + const html = await genWebHTML({ component, pageProps: serverRes, @@ -45,7 +47,7 @@ export default async function generateWebPageResponseFromComponentReturn({ }, }; - if (isDevelopment()) { + if (is_dev) { res_opts.headers = { ...res_opts.headers, "Cache-Control": "no-cache, no-store, must-revalidate", @@ -54,18 +56,13 @@ export default async function generateWebPageResponseFromComponentReturn({ }; } - const config = _.merge(root_module?.config, module.config); - - const cache_page = config?.cachePage || serverRes?.cachePage || false; - const expiry_seconds = config?.cacheExpiry || serverRes?.cacheExpiry; - - if (cache_page && routeParams?.url) { - const key = routeParams.url.pathname + (routeParams.url.search || ""); - writeCache({ - key, - value: html, - paradigm: "html", - expiry_seconds, + if (!is_dev) { + await generateWebPageGetCachePage({ + html, + module, + root_module, + routeParams, + serverRes, }); } diff --git a/src/functions/server/web-pages/grab-page-server-res.tsx b/src/functions/server/web-pages/grab-page-server-res.tsx index 7681df2..9f499c6 100644 --- a/src/functions/server/web-pages/grab-page-server-res.tsx +++ b/src/functions/server/web-pages/grab-page-server-res.tsx @@ -6,6 +6,7 @@ import type { GrabPageComponentRes, } from "../../../types"; import _ from "lodash"; +import { log } from "../../../utils/log"; type Params = { url?: URL; @@ -56,9 +57,15 @@ export default async function grabPageServerRes({ return { ...default_props, }; - } catch (error) { + } catch (error: any) { + log.error( + `Page ${url?.pathname} Server Error => ${error.message}\n`, + error, + ); + return { ...default_props, + error: error.message, }; } } diff --git a/src/types/index.ts b/src/types/index.ts index 32bd52e..e89c196 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -222,7 +222,10 @@ export type BunextPageServerFn< ) => Promise>; export type BunextRouteConfig = { - cachePage?: boolean; + /** + * Whether to cache the current page + */ + cachePage?: BunextCachePageType; /** * Expiry time of the cache in seconds */ @@ -237,14 +240,25 @@ export type BunextPageModuleServerReturn< query?: Q; redirect?: BunextPageModuleServerRedirect; responseOptions?: ResponseInit; - cachePage?: boolean; + /** + * Whether to cache the current page + */ + cachePage?: BunextCachePageType; /** * Expiry time of the cache in seconds */ cacheExpiry?: number; url?: BunextPageModuleServerReturnURLObject; + error?: string; }; +export type BunextCachePageType = + | boolean + | ((params: { + ctx: Omit; + serverRes?: BunextPageModuleServerReturn; + }) => Promise | boolean); + export type BunextPageProps< T extends { [k: string]: any } = { [k: string]: any }, Q extends { [k: string]: any } = { [k: string]: any },