diff --git a/src/server/render.ts b/src/server/render.ts index b301da07b39..ea47243f6a3 100644 --- a/src/server/render.ts +++ b/src/server/render.ts @@ -226,7 +226,15 @@ export async function render( componentFn.displayName = (fn as any).displayName || fn.name; componentStack[i] = componentFn; } else { - componentStack[i] = fn; + componentStack[i] = () => { + return h(fn, { + ...props, + Component() { + return h(componentStack[i + 1], null); + }, + // deno-lint-ignore no-explicit-any + } as any); + }; } } diff --git a/tests/fixture_layouts_2/dev.ts b/tests/fixture_layouts_2/dev.ts new file mode 100644 index 00000000000..2d85d6c183c --- /dev/null +++ b/tests/fixture_layouts_2/dev.ts @@ -0,0 +1,5 @@ +#!/usr/bin/env -S deno run -A --watch=static/,routes/ + +import dev from "$fresh/dev.ts"; + +await dev(import.meta.url, "./main.ts"); diff --git a/tests/fixture_layouts_2/fresh.gen.ts b/tests/fixture_layouts_2/fresh.gen.ts new file mode 100644 index 00000000000..e956af3ce18 --- /dev/null +++ b/tests/fixture_layouts_2/fresh.gen.ts @@ -0,0 +1,19 @@ +// DO NOT EDIT. This file is generated by Fresh. +// This file SHOULD be checked into source version control. +// This file is automatically updated during development when running `dev.ts`. + +import * as $0 from "./routes/_app.tsx"; +import * as $1 from "./routes/_layout.tsx"; +import * as $2 from "./routes/index.tsx"; + +const manifest = { + routes: { + "./routes/_app.tsx": $0, + "./routes/_layout.tsx": $1, + "./routes/index.tsx": $2, + }, + islands: {}, + baseUrl: import.meta.url, +}; + +export default manifest; diff --git a/tests/fixture_layouts_2/main.ts b/tests/fixture_layouts_2/main.ts new file mode 100644 index 00000000000..0f15e8defa4 --- /dev/null +++ b/tests/fixture_layouts_2/main.ts @@ -0,0 +1,10 @@ +/// +/// +/// +/// +/// + +import { start } from "$fresh/server.ts"; +import manifest from "./fresh.gen.ts"; + +await start(manifest); diff --git a/tests/fixture_layouts_2/routes/_app.tsx b/tests/fixture_layouts_2/routes/_app.tsx new file mode 100644 index 00000000000..e749edd6061 --- /dev/null +++ b/tests/fixture_layouts_2/routes/_app.tsx @@ -0,0 +1,9 @@ +import { defineApp } from "$fresh/server.ts"; + +export default defineApp((req, { Component }) => { + return ( +
+ +
+ ); +}); diff --git a/tests/fixture_layouts_2/routes/_layout.tsx b/tests/fixture_layouts_2/routes/_layout.tsx new file mode 100644 index 00000000000..3fdf973385c --- /dev/null +++ b/tests/fixture_layouts_2/routes/_layout.tsx @@ -0,0 +1,11 @@ +import { LayoutProps } from "$fresh/server.ts"; + +export default function RootLayout( + { Component }: LayoutProps, +) { + return ( +
+ +
+ ); +} diff --git a/tests/fixture_layouts_2/routes/index.tsx b/tests/fixture_layouts_2/routes/index.tsx new file mode 100644 index 00000000000..13e0de19c47 --- /dev/null +++ b/tests/fixture_layouts_2/routes/index.tsx @@ -0,0 +1,7 @@ +export default function Home() { + return ( +
+ Home +
+ ); +} diff --git a/tests/layouts_test.ts b/tests/layouts_test.ts index 78c1174717d..838241ba931 100644 --- a/tests/layouts_test.ts +++ b/tests/layouts_test.ts @@ -191,3 +191,13 @@ Deno.test({ ); }, }); + +Deno.test("mix async app and layouts", async () => { + await withFakeServe( + "./tests/fixture_layouts_2/main.ts", + async (server) => { + const doc = await server.getHtml(`/`); + assertSelector(doc, ".app > .root-layout > .home-page"); + }, + ); +});