mirror of
https://github.com/vercel-labs/scriptc.git
synced 2026-11-08 08:44:37 +08:00
16 lines
787 B
TypeScript
16 lines
787 B
TypeScript
// Renders elements to HTML-like text.
|
|
import type { Element } from "#jsx/jsx-runtime";
|
|
|
|
export function render(value: unknown): string {
|
|
if (value === null || value === undefined || typeof value === "boolean") return "";
|
|
if (typeof value === "string" || typeof value === "number") return String(value);
|
|
if (Array.isArray(value)) return value.map(render).join("");
|
|
const element = value as Element;
|
|
const { children, ...rest } = element.props;
|
|
const inner = render(children);
|
|
if (element.type === "#fragment") return inner;
|
|
let attributes = element.key === undefined ? "" : ` key="${element.key}"`;
|
|
for (const [name, item] of Object.entries(rest)) attributes += ` ${name}=${JSON.stringify(item)}`;
|
|
return `<${element.type}${attributes}>${inner}</${element.type}>`;
|
|
}
|