@paroicms/server
Version:
The ParoiCMS server
65 lines • 2.22 kB
JavaScript
import { isObj } from "@paroicms/public-anywhere-lib";
import { minify } from "html-minifier-terser";
import { PLUGIN_HEAD_TAGS_PLACEHOLDER } from "../../rendered-site/liquidjs-filters/head-tags-filter.js";
import RenderTag from "../render-clone/render.js";
export async function renderLiquidTemplate(renderingContext, { templateNames, payload }) {
const { siteContext } = renderingContext;
let html;
let usedTemplate;
for (const templateName of templateNames) {
try {
html = await siteContext.liquidEngine.renderFile(templateName, {
...payload,
get page() {
siteContext.logger.warn("'page' is deprecated, use 'doc' instead");
return payload.doc;
},
[RenderTag.passThroughSymbol]: renderingContext,
});
if (html) {
html = postProcessHtml(renderingContext, html);
}
usedTemplate = templateName;
break;
}
catch (err) {
if (isObj(err) && err.code === "ENOENT")
continue;
throw err;
}
}
if (!html)
throw new Error(`missing template '${templateNames[0]}'`);
try {
return await minify(html, {
collapseWhitespace: true,
removeComments: true,
});
}
catch {
siteContext.logger.warn(`[${siteContext.fqdn}] invalid HTML generated by '${usedTemplate}'`);
}
return html;
}
function postProcessHtml(renderingContext, html) {
return html.replace(PLUGIN_HEAD_TAGS_PLACEHOLDER, () => {
const { siteContext } = renderingContext;
const headTags = [];
for (const handler of siteContext.headTagsHandlers) {
const tags = handler({
state: renderingContext.pluginRenderState,
html,
});
if (!tags)
continue;
if (Array.isArray(tags)) {
headTags.push(...tags);
}
else {
headTags.push(tags);
}
}
return headTags.join("\n");
});
}
//# sourceMappingURL=render-liquidjs.js.map