From 0533157821e9f77a21a81931f15d19c37050960a Mon Sep 17 00:00:00 2001 From: Marcos Candeia Date: Thu, 21 Sep 2023 15:27:58 -0300 Subject: [PATCH] Defer page resolve (#71) * Defer page resolve Signed-off-by: Marcos Candeia * Fix router redirects Signed-off-by: Marcos Candeia * Update deco version Signed-off-by: Marcos Candeia --------- Signed-off-by: Marcos Candeia --- import_map.json | 2 +- website/handlers/fresh.ts | 25 +++++++++++++++++++++++-- website/handlers/router.ts | 7 +++++-- 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/import_map.json b/import_map.json index cd1a36dfc..39ad5b712 100644 --- a/import_map.json +++ b/import_map.json @@ -9,6 +9,6 @@ "std/": "https://deno.land/std@0.190.0/", "partytown/": "https://deno.land/x/partytown@0.3.4/", "deco-sites/std/": "https://denopkg.com/deco-sites/std@1.22.9/", - "deco/": "https://deno.land/x/deco@1.36.20/" + "deco/": "https://deno.land/x/deco@1.37.0/" } } diff --git a/website/handlers/fresh.ts b/website/handlers/fresh.ts index 9f4ae7b9e..9c482ba24 100644 --- a/website/handlers/fresh.ts +++ b/website/handlers/fresh.ts @@ -1,5 +1,10 @@ import { HandlerContext } from "$fresh/server.ts"; import { Page } from "deco/blocks/page.ts"; +import { + asResolved, + BaseContext, + isDeferred, +} from "deco/engine/core/resolver.ts"; import { DecoState } from "deco/types.ts"; import { allowCorsFor } from "deco/utils/http.ts"; import { ConnInfo } from "std/http/server.ts"; @@ -21,15 +26,22 @@ export const isFreshCtx = ( * @title Fresh Page * @description Renders a fresh page. */ -export default function Fresh(page: FreshConfig) { +export default function Fresh(freshConfig: FreshConfig) { return async (req: Request, ctx: ConnInfo) => { + if (req.method === "HEAD") { + return new Response(null, { status: 200 }); + } + const page = + isDeferred(freshConfig.page) + ? await freshConfig.page({ context: ctx }) + : freshConfig.page; const url = new URL(req.url); if (url.searchParams.get("asJson") !== null) { return Response.json(page, { headers: allowCorsFor(req) }); } if (isFreshCtx(ctx)) { return await ctx.render({ - ...page, + page, routerInfo: { flags: ctx.state.flags, pagePath: ctx.state.pathTemplate, @@ -41,3 +53,12 @@ export default function Fresh(page: FreshConfig) { }); }; } + +export const onBeforeResolveProps = ( + props: FreshConfig, +) => { + if (props?.page) { + return { ...props, page: asResolved(props.page, true) }; + } + return props; +}; diff --git a/website/handlers/router.ts b/website/handlers/router.ts index 0fae66c98..da15b1e4d 100644 --- a/website/handlers/router.ts +++ b/website/handlers/router.ts @@ -80,9 +80,12 @@ export const router = ( ctx, ); }; - if (url.pathname && url.pathname in hrefRoutes) { + + const handler = hrefRoutes[`${url.pathname}${url.search || ""}`] ?? + hrefRoutes[url.pathname]; + if (handler) { return route( - hrefRoutes[url.pathname], + handler, `${url.pathname}${url.search || ""}`, ); }