55 lines
1.6 KiB
Plaintext
55 lines
1.6 KiB
Plaintext
|
import { markHTMLString } from "../../escape.js";
|
||
|
import { isPromise } from "../../util.js";
|
||
|
import { renderChild } from "../any.js";
|
||
|
import { renderToBufferDestination } from "../util.js";
|
||
|
const renderTemplateResultSym = Symbol.for("astro.renderTemplateResult");
|
||
|
class RenderTemplateResult {
|
||
|
[renderTemplateResultSym] = true;
|
||
|
htmlParts;
|
||
|
expressions;
|
||
|
error;
|
||
|
constructor(htmlParts, expressions) {
|
||
|
this.htmlParts = htmlParts;
|
||
|
this.error = void 0;
|
||
|
this.expressions = expressions.map((expression) => {
|
||
|
if (isPromise(expression)) {
|
||
|
return Promise.resolve(expression).catch((err) => {
|
||
|
if (!this.error) {
|
||
|
this.error = err;
|
||
|
throw err;
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
return expression;
|
||
|
});
|
||
|
}
|
||
|
async render(destination) {
|
||
|
const expRenders = this.expressions.map((exp) => {
|
||
|
return renderToBufferDestination((bufferDestination) => {
|
||
|
if (exp || exp === 0) {
|
||
|
return renderChild(bufferDestination, exp);
|
||
|
}
|
||
|
});
|
||
|
});
|
||
|
for (let i = 0; i < this.htmlParts.length; i++) {
|
||
|
const html = this.htmlParts[i];
|
||
|
const expRender = expRenders[i];
|
||
|
destination.write(markHTMLString(html));
|
||
|
if (expRender) {
|
||
|
await expRender.renderToFinalDestination(destination);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
function isRenderTemplateResult(obj) {
|
||
|
return typeof obj === "object" && !!obj[renderTemplateResultSym];
|
||
|
}
|
||
|
function renderTemplate(htmlParts, ...expressions) {
|
||
|
return new RenderTemplateResult(htmlParts, expressions);
|
||
|
}
|
||
|
export {
|
||
|
RenderTemplateResult,
|
||
|
isRenderTemplateResult,
|
||
|
renderTemplate
|
||
|
};
|