47 lines
1.6 KiB
Plaintext
47 lines
1.6 KiB
Plaintext
import { escapeHTML, isHTMLString, markHTMLString } from "../escape.js";
|
|
import { isAstroComponentInstance, isRenderTemplateResult } from "./astro/index.js";
|
|
import { isRenderInstance } from "./common.js";
|
|
import { SlotString } from "./slot.js";
|
|
import { renderToBufferDestination } from "./util.js";
|
|
async function renderChild(destination, child) {
|
|
child = await child;
|
|
if (child instanceof SlotString) {
|
|
destination.write(child);
|
|
} else if (isHTMLString(child)) {
|
|
destination.write(child);
|
|
} else if (Array.isArray(child)) {
|
|
const childRenders = child.map((c) => {
|
|
return renderToBufferDestination((bufferDestination) => {
|
|
return renderChild(bufferDestination, c);
|
|
});
|
|
});
|
|
for (const childRender of childRenders) {
|
|
if (!childRender)
|
|
continue;
|
|
await childRender.renderToFinalDestination(destination);
|
|
}
|
|
} else if (typeof child === "function") {
|
|
await renderChild(destination, child());
|
|
} else if (typeof child === "string") {
|
|
destination.write(markHTMLString(escapeHTML(child)));
|
|
} else if (!child && child !== 0) {
|
|
} else if (isRenderInstance(child)) {
|
|
await child.render(destination);
|
|
} else if (isRenderTemplateResult(child)) {
|
|
await child.render(destination);
|
|
} else if (isAstroComponentInstance(child)) {
|
|
await child.render(destination);
|
|
} else if (ArrayBuffer.isView(child)) {
|
|
destination.write(child);
|
|
} else if (typeof child === "object" && (Symbol.asyncIterator in child || Symbol.iterator in child)) {
|
|
for await (const value of child) {
|
|
await renderChild(destination, value);
|
|
}
|
|
} else {
|
|
destination.write(child);
|
|
}
|
|
}
|
|
export {
|
|
renderChild
|
|
};
|