astro-ghostcms/.pnpm-store/v3/files/c5/85ca6255a836a10637e594a60a0...

50 lines
1.7 KiB
Plaintext

import { renderComponentToString } from "./component.js";
import { isAstroComponentFactory } from "./astro/index.js";
import { renderToReadableStream, renderToString } from "./astro/render.js";
import { encoder } from "./common.js";
async function renderPage(result, componentFactory, props, children, streaming, route) {
if (!isAstroComponentFactory(componentFactory)) {
result._metadata.headInTree = result.componentMetadata.get(componentFactory.moduleId)?.containsHead ?? false;
const pageProps = { ...props ?? {}, "server:root": true };
const str = await renderComponentToString(
result,
componentFactory.name,
componentFactory,
pageProps,
{},
true,
route
);
const bytes = encoder.encode(str);
return new Response(bytes, {
headers: new Headers([
["Content-Type", "text/html; charset=utf-8"],
["Content-Length", bytes.byteLength.toString()]
])
});
}
result._metadata.headInTree = result.componentMetadata.get(componentFactory.moduleId)?.containsHead ?? false;
let body;
if (streaming) {
body = await renderToReadableStream(result, componentFactory, props, children, true, route);
} else {
body = await renderToString(result, componentFactory, props, children, true, route);
}
if (body instanceof Response)
return body;
const init = result.response;
const headers = new Headers(init.headers);
if (!streaming && typeof body === "string") {
body = encoder.encode(body);
headers.set("Content-Length", body.byteLength.toString());
}
if (route?.component.endsWith(".md")) {
headers.set("Content-Type", "text/html; charset=utf-8");
}
const response = new Response(body, { ...init, headers });
return response;
}
export {
renderPage
};