@paroicms/server
Version:
The ParoiCMS server
69 lines • 3.53 kB
JavaScript
import { getDocumentTypeByName } from "@paroicms/internal-anywhere-lib";
import { makeCacheDependencyKey } from "../../common/text-cache.js";
import { renderLiquidTemplate } from "../../liquidjs-tools/liquidjs-rendering/render-liquidjs.js";
import { createRenderingContext } from "../../liquidjs-tools/liquidjs-rendering/rendering-context.js";
import { makeRegularTemplatePayload } from "../../rendering-payload/make-public-payload.js";
import { getUrlOfDocument } from "../page-route/make-url.js";
import { findParentParsedRouteWithDocument, } from "../page-route/page-route-parser.js";
import { fetchRawDocPayload } from "../page-route/raw-document-payload.js";
import { createPluginRenderedDocument } from "./serve-document-helpers.js";
export async function generateDocumentHtml(siteContext, httpContext, options, tracker) {
const { parsedRoute, cacheKeyWithQuery, cacheKeyWithPath } = options;
if (parsedRoute.redirectTo === "parent") {
const parentRoute = findParentParsedRouteWithDocument(parsedRoute);
const docValues = parentRoute ? await fetchRawDocPayload(siteContext, parentRoute) : undefined;
if (docValues && parentRoute) {
const { url, dependencyKeys } = await getUrlOfDocument(siteContext, tracker, {
language: parentRoute.language,
nodeId: docValues.nodeId,
}, { returnUrlDependencyKeys: true });
return { status: 301, url, dependencyKeys };
}
return { status: 404 };
}
const docValues = await fetchRawDocPayload(siteContext, parsedRoute);
if (!docValues)
return { status: 404 };
const { url: docUrl, dependencyKeys: urlDependencyKeys } = await getUrlOfDocument(siteContext, tracker, {
language: parsedRoute.language,
nodeId: docValues.nodeId,
}, { returnUrlDependencyKeys: true });
const frontendAppPath = parsedRoute.frontendAppPath && parsedRoute.frontendAppPath !== "/"
? parsedRoute.frontendAppPath
: "";
const urlQuery = extractUrlQueryAsString(httpContext.req.relativeUrl) ?? "";
const canonicalUrl = `${docUrl}${frontendAppPath}${urlQuery}`;
if (canonicalUrl !== httpContext.req.relativeUrl) {
return { status: 301, url: canonicalUrl, dependencyKeys: urlDependencyKeys };
}
const documentType = getDocumentTypeByName(siteContext.siteSchema, docValues.type);
const cacheKey = documentType.useUrlQuery ? cacheKeyWithQuery : cacheKeyWithPath;
const renderingContext = await createRenderingContext(siteContext, {
cacheKey,
language: parsedRoute.language,
tracker,
dependencyKey: makeCacheDependencyKey({ documentId: docValues }),
mainDocument: createPluginRenderedDocument(docValues, { url: docUrl }),
});
const html = await renderLiquidTemplate(renderingContext, {
templateNames: [...documentType.templateNames, "default"],
payload: makeRegularTemplatePayload(renderingContext, docValues, {
url: docUrl,
urlQuery: httpContext.req.query,
frontendAppPath: parsedRoute.frontendAppPath,
}),
});
const dependencyKeys = renderingContext.getDependencyKeys();
await renderingContext.close();
return {
status: 200,
html,
dependencyKeys,
cacheKey,
};
}
function extractUrlQueryAsString(relativeUrl) {
const result = relativeUrl.match(/\?(.*)$/);
return result ? `?${result[1]}` : undefined;
}
//# sourceMappingURL=serve-document.js.map