UNPKG

@astro-utils/forms

Version:

Server component for Astro (call server functions from client side with validation and state management)

45 lines (43 loc) 1.56 kB
import { escapeHTML, isHTMLString, markHTMLString } from "../escape.js"; import { isPromise } from "../util.js"; import { isAstroComponentInstance, isRenderTemplateResult } from "./astro/index.js"; import { isRenderInstance } from "./common.js"; import { SlotString } from "./slot.js"; async function renderChild(destination, child) { if (isPromise(child)) { child = await child; } if (child instanceof SlotString) { destination.write(child); } else if (isHTMLString(child)) { destination.write(child); } else if (Array.isArray(child)) { // CHANGED: Render children synchronously, one after another for (const c of child) { await renderChild(destination, c); } } else if (typeof child === "function") { await renderChild(destination, child()); } else if (typeof child === "string") { destination.write(markHTMLString(escapeHTML(child))); } else if (!child && child !== 0) { // do nothing, safe to ignore falsey values } 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 };