// src/jsx/components.ts
import { raw } from "../helper/html/index.js";
import { HtmlEscapedCallbackPhase, resolveCallback } from "../utils/html.js";
import { DOM_RENDERER } from "./constants.js";
import { ErrorBoundary as ErrorBoundaryDomRenderer } from "./dom/components.js";
var errorBoundaryCounter = 0;
var childrenToString = async (children) => {
try {
return children.flat().map((c) => c == null || typeof c === "boolean" ? "" : c.toString());
} catch (e) {
if (e instanceof Promise) {
await e;
return childrenToString(children);
} else {
throw e;
}
}
};
var ErrorBoundary = async ({ children, fallback, fallbackRender, onError }) => {
if (!children) {
return raw("");
}
if (!Array.isArray(children)) {
children = [children];
}
let fallbackStr;
const fallbackRes = (error) => {
onError?.(error);
return (fallbackStr || fallbackRender?.(error) || "").toString();
};
let resArray = [];
try {
resArray = children.map(
(c) => c == null || typeof c === "boolean" ? "" : c.toString()
);
} catch (e) {
fallbackStr = await fallback?.toString();
if (e instanceof Promise) {
resArray = [
e.then(() => childrenToString(children)).catch((e2) => fallbackRes(e2))
];
} else {
resArray = [fallbackRes(e)];
}
}
if (resArray.some((res) => res instanceof Promise)) {
fallbackStr ||= await fallback?.toString();
const index = errorBoundaryCounter++;
const replaceRe = RegExp(`(.*?)(.*?)()`);
const caught = false;
const catchCallback = ({ error, buffer }) => {
if (caught) {
return "";
}
const fallbackResString = fallbackRes(error);
if (buffer) {
buffer[0] = buffer[0].replace(replaceRe, fallbackResString);
}
return buffer ? "" : `${fallbackResString}