html.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. var __defProp = Object.defineProperty;
  2. var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
  3. var __getOwnPropNames = Object.getOwnPropertyNames;
  4. var __hasOwnProp = Object.prototype.hasOwnProperty;
  5. var __export = (target, all) => {
  6. for (var name in all)
  7. __defProp(target, name, { get: all[name], enumerable: true });
  8. };
  9. var __copyProps = (to, from, except, desc) => {
  10. if (from && typeof from === "object" || typeof from === "function") {
  11. for (let key of __getOwnPropNames(from))
  12. if (!__hasOwnProp.call(to, key) && key !== except)
  13. __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
  14. }
  15. return to;
  16. };
  17. var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
  18. var html_exports = {};
  19. __export(html_exports, {
  20. HtmlEscapedCallbackPhase: () => HtmlEscapedCallbackPhase,
  21. escapeToBuffer: () => escapeToBuffer,
  22. raw: () => raw,
  23. resolveCallback: () => resolveCallback,
  24. resolveCallbackSync: () => resolveCallbackSync,
  25. stringBufferToString: () => stringBufferToString
  26. });
  27. module.exports = __toCommonJS(html_exports);
  28. const HtmlEscapedCallbackPhase = {
  29. Stringify: 1,
  30. BeforeStream: 2,
  31. Stream: 3
  32. };
  33. const raw = (value, callbacks) => {
  34. const escapedString = new String(value);
  35. escapedString.isEscaped = true;
  36. escapedString.callbacks = callbacks;
  37. return escapedString;
  38. };
  39. const escapeRe = /[&<>'"]/;
  40. const stringBufferToString = async (buffer, callbacks) => {
  41. let str = "";
  42. callbacks ||= [];
  43. const resolvedBuffer = await Promise.all(buffer);
  44. for (let i = resolvedBuffer.length - 1; ; i--) {
  45. str += resolvedBuffer[i];
  46. i--;
  47. if (i < 0) {
  48. break;
  49. }
  50. let r = resolvedBuffer[i];
  51. if (typeof r === "object") {
  52. callbacks.push(...r.callbacks || []);
  53. }
  54. const isEscaped = r.isEscaped;
  55. r = await (typeof r === "object" ? r.toString() : r);
  56. if (typeof r === "object") {
  57. callbacks.push(...r.callbacks || []);
  58. }
  59. if (r.isEscaped ?? isEscaped) {
  60. str += r;
  61. } else {
  62. const buf = [str];
  63. escapeToBuffer(r, buf);
  64. str = buf[0];
  65. }
  66. }
  67. return raw(str, callbacks);
  68. };
  69. const escapeToBuffer = (str, buffer) => {
  70. const match = str.search(escapeRe);
  71. if (match === -1) {
  72. buffer[0] += str;
  73. return;
  74. }
  75. let escape;
  76. let index;
  77. let lastIndex = 0;
  78. for (index = match; index < str.length; index++) {
  79. switch (str.charCodeAt(index)) {
  80. case 34:
  81. escape = "&quot;";
  82. break;
  83. case 39:
  84. escape = "&#39;";
  85. break;
  86. case 38:
  87. escape = "&amp;";
  88. break;
  89. case 60:
  90. escape = "&lt;";
  91. break;
  92. case 62:
  93. escape = "&gt;";
  94. break;
  95. default:
  96. continue;
  97. }
  98. buffer[0] += str.substring(lastIndex, index) + escape;
  99. lastIndex = index + 1;
  100. }
  101. buffer[0] += str.substring(lastIndex, index);
  102. };
  103. const resolveCallbackSync = (str) => {
  104. const callbacks = str.callbacks;
  105. if (!callbacks?.length) {
  106. return str;
  107. }
  108. const buffer = [str];
  109. const context = {};
  110. callbacks.forEach((c) => c({ phase: HtmlEscapedCallbackPhase.Stringify, buffer, context }));
  111. return buffer[0];
  112. };
  113. const resolveCallback = async (str, phase, preserveCallbacks, context, buffer) => {
  114. if (typeof str === "object" && !(str instanceof String)) {
  115. if (!(str instanceof Promise)) {
  116. str = str.toString();
  117. }
  118. if (str instanceof Promise) {
  119. str = await str;
  120. }
  121. }
  122. const callbacks = str.callbacks;
  123. if (!callbacks?.length) {
  124. return Promise.resolve(str);
  125. }
  126. if (buffer) {
  127. buffer[0] += str;
  128. } else {
  129. buffer = [str];
  130. }
  131. const resStr = Promise.all(callbacks.map((c) => c({ phase, buffer, context }))).then(
  132. (res) => Promise.all(
  133. res.filter(Boolean).map((str2) => resolveCallback(str2, phase, false, context, buffer))
  134. ).then(() => buffer[0])
  135. );
  136. if (preserveCallbacks) {
  137. return raw(await resStr, callbacks);
  138. } else {
  139. return resStr;
  140. }
  141. };
  142. // Annotate the CommonJS export names for ESM import in node:
  143. 0 && (module.exports = {
  144. HtmlEscapedCallbackPhase,
  145. escapeToBuffer,
  146. raw,
  147. resolveCallback,
  148. resolveCallbackSync,
  149. stringBufferToString
  150. });