UNPKG

@paroicms/server

Version:
69 lines 3.53 kB
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