import { group } from "mitata"; import { bench, run } from "mitata"; var bunEscapeHTML_ = globalThis.escapeHTML || Bun.escapeHTML; var bunEscapeHTML = function (str) { if (str.length === 1) { switch (str.charCodeAt(0)) { case 34: // " return """; case 38: // & return "&"; case 39: // ' return "'"; // modified from escape-html; used to be ''' case 60: // < return "<"; case 62: // > return ">"; default: return str; } } return bunEscapeHTML_(str); }; const matchHtmlRegExp = /["'&<>]/; /** * Escapes special characters and HTML entities in a given html string. * * @param {string} string HTML string to escape for later insertion * @return {string} * @public */ const FIXTURE = require("fs") .readFileSync(import.meta.dir + "/_fixture.txt", "utf8") .split("") .map((a) => { if (a.charCodeAt(0) > 127) { return "a"; } return a; }) .join(""); function reactEscapeHtml(string) { const str = "" + string; const match = matchHtmlRegExp.exec(str); if (!match) { return str; } let escape; let html = ""; let index; let lastIndex = 0; for (index = match.index; index < str.length; index++) { switch (str.charCodeAt(index)) { case 34: // " escape = """; break; case 38: // & escape = "&"; break; case 39: // ' escape = "'"; // modified from escape-html; used to be ''' break; case 60: // < escape = "<"; break; case 62: // > escape = ">"; break; default: continue; } if (lastIndex !== index) { html += str.substring(lastIndex, index); } lastIndex = index + 1; html += escape; } return lastIndex !== index ? html + str.substring(lastIndex, index) : html; } for (let input of [ // " ", // "", // "hello world", // "hello world", // "<", // ">", // `short value`, `nothing to escape `.repeat(99999), FIXTURE, ]) { group( { summary: true, name: `"` + input.substring(0, Math.min(input.length, 32)) + `"`, }, () => { bench(`react's escapeHTML`, () => reactEscapeHtml(input)); bench(`bun's escapeHTML`, () => bunEscapeHTML(input)); } ); } await run();