// src/utils/html.ts var HtmlEscapedCallbackPhase = { Stringify: 1, BeforeStream: 2, Stream: 3 }; var raw = (value, callbacks) => { const escapedString = new String(value); escapedString.isEscaped = true; escapedString.callbacks = callbacks; return escapedString; }; var escapeRe = /[&<>'"]/; var stringBufferToString = async (buffer) => { let str = ""; const callbacks = []; for (let i = buffer.length - 1; ; i--) { str += buffer[i]; i--; if (i < 0) { break; } let r = await buffer[i]; if (typeof r === "object") { callbacks.push(...r.callbacks || []); } const isEscaped = r.isEscaped; r = await (typeof r === "object" ? r.toString() : r); if (typeof r === "object") { callbacks.push(...r.callbacks || []); } if (r.isEscaped ?? isEscaped) { str += r; } else { const buf = [str]; escapeToBuffer(r, buf); str = buf[0]; } } return raw(str, callbacks); }; var escapeToBuffer = (str, buffer) => { const match = str.search(escapeRe); if (match === -1) { buffer[0] += str; return; } let escape; let index; let lastIndex = 0; for (index = match; index < str.length; index++) { switch (str.charCodeAt(index)) { case 34: escape = """; break; case 39: escape = "'"; break; case 38: escape = "&"; break; case 60: escape = "<"; break; case 62: escape = ">"; break; default: continue; } buffer[0] += str.substring(lastIndex, index) + escape; lastIndex = index + 1; } buffer[0] += str.substring(lastIndex, index); }; var resolveCallback = async (str, phase, preserveCallbacks, context, buffer) => { const callbacks = str.callbacks; if (!callbacks?.length) { return Promise.resolve(str); } if (buffer) { buffer[0] += str; } else { buffer = [str]; } const resStr = Promise.all(callbacks.map((c) => c({ phase, buffer, context }))).then( (res) => Promise.all( res.filter(Boolean).map((str2) => resolveCallback(str2, phase, false, context, buffer)) ).then(() => buffer[0]) ); if (preserveCallbacks) { return raw(await resStr, callbacks); } else { return resStr; } }; export { HtmlEscapedCallbackPhase, escapeToBuffer, raw, resolveCallback, stringBufferToString };