UNPKG

hono

Version:

Web framework built on Web Standards

143 lines (142 loc) 3.96 kB
"use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var html_exports = {}; __export(html_exports, { HtmlEscapedCallbackPhase: () => HtmlEscapedCallbackPhase, escapeToBuffer: () => escapeToBuffer, raw: () => raw, resolveCallback: () => resolveCallback, resolveCallbackSync: () => resolveCallbackSync, stringBufferToString: () => stringBufferToString }); module.exports = __toCommonJS(html_exports); const HtmlEscapedCallbackPhase = { Stringify: 1, BeforeStream: 2, Stream: 3 }; const raw = (value, callbacks) => { const escapedString = new String(value); escapedString.isEscaped = true; escapedString.callbacks = callbacks; return escapedString; }; const escapeRe = /[&<>'"]/; const stringBufferToString = async (buffer, callbacks) => { let str = ""; 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); }; const 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 = "&quot;"; break; case 39: escape = "&#39;"; break; case 38: escape = "&amp;"; break; case 60: escape = "&lt;"; break; case 62: escape = "&gt;"; break; default: continue; } buffer[0] += str.substring(lastIndex, index) + escape; lastIndex = index + 1; } buffer[0] += str.substring(lastIndex, index); }; const resolveCallbackSync = (str) => { const callbacks = str.callbacks; if (!callbacks?.length) { return str; } const buffer = [str]; const context = {}; callbacks.forEach((c) => c({ phase: HtmlEscapedCallbackPhase.Stringify, buffer, context })); return buffer[0]; }; const 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; } }; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { HtmlEscapedCallbackPhase, escapeToBuffer, raw, resolveCallback, resolveCallbackSync, stringBufferToString });