UNPKG

hono

Version:

Web framework built on Web Standards

176 lines (175 loc) 4.84 kB
// src/jsx/utils.ts var normalizeElementKeyMap = /* @__PURE__ */ new Map([ ["className", "class"], ["htmlFor", "for"], ["crossOrigin", "crossorigin"], ["httpEquiv", "http-equiv"], ["itemProp", "itemprop"], ["fetchPriority", "fetchpriority"], ["noModule", "nomodule"], ["formAction", "formaction"] ]); var normalizeIntrinsicElementKey = (key) => normalizeElementKeyMap.get(key) || key; var invalidAttributeNameCharRe = /[\s"'<>/=`\\\x00-\x1f\x7f-\x9f]/; var validAttributeNameCache = /* @__PURE__ */ new Set(); var validAttributeNameCacheMax = 1024; var invalidTagNameCharRe = /^[!?]|[\s"'<>/=`\\\x00-\x1f\x7f-\x9f]/; var validTagNameCache = /* @__PURE__ */ new Set(); var validTagNameCacheMax = 256; var cacheValidName = (cache, max, name) => { if (cache.size >= max) { cache.clear(); } cache.add(name); }; var isValidTagName = (name) => { if (validTagNameCache.has(name)) { return true; } if (typeof name !== "string") { return false; } if (name.length === 0) { return true; } if (invalidTagNameCharRe.test(name)) { return false; } cacheValidName(validTagNameCache, validTagNameCacheMax, name); return true; }; var isValidAttributeName = (name) => { if (validAttributeNameCache.has(name)) { return true; } const len = name.length; if (len === 0) { return false; } for (let i = 0; i < len; i++) { const c = name.charCodeAt(i); if (!(c >= 97 && c <= 122 || // a-z c >= 65 && c <= 90 || // A-Z c >= 48 && c <= 57 || // 0-9 c === 45 || // - c === 95 || // _ c === 46 || // . c === 58)) { if (!invalidAttributeNameCharRe.test(name)) { cacheValidName(validAttributeNameCache, validAttributeNameCacheMax, name); return true; } else { return false; } } } cacheValidName(validAttributeNameCache, validAttributeNameCacheMax, name); return true; }; var invalidStylePropertyNameCharRe = /[\s"'():;\\/\[\]{}\x00-\x1f\x7f-\x9f]/; var validStylePropertyNameCache = /* @__PURE__ */ new Set(); var validStylePropertyNameCacheMax = 1024; var isValidStylePropertyName = (name) => { if (validStylePropertyNameCache.has(name)) { return true; } const len = name.length; if (len === 0) { return false; } for (let i = 0; i < len; i++) { const c = name.charCodeAt(i); if (!(c >= 97 && c <= 122 || // a-z c >= 65 && c <= 90 || // A-Z c >= 48 && c <= 57 || // 0-9 c === 45 || // - c === 95)) { if (!invalidStylePropertyNameCharRe.test(name)) { cacheValidName(validStylePropertyNameCache, validStylePropertyNameCacheMax, name); return true; } else { return false; } } } cacheValidName(validStylePropertyNameCache, validStylePropertyNameCacheMax, name); return true; }; var unsafeStyleValueCharRe = /[;"'\\/\[\](){}]/; var hasUnsafeStyleValue = (value) => { if (!unsafeStyleValueCharRe.test(value)) { return false; } let quote = 0; const blockStack = []; for (let i = 0, len = value.length; i < len; i++) { const c = value.charCodeAt(i); if (c === 92) { if (i === len - 1) { return true; } i++; } else if (quote !== 0) { if (c === 10 || c === 12 || c === 13) { return true; } if (c === quote) { quote = 0; } } else if (c === 47 && value.charCodeAt(i + 1) === 42) { const end = value.indexOf("*/", i + 2); if (end === -1) { return true; } i = end + 1; } else if (c === 34 || c === 39) { quote = c; } else if (c === 40) { blockStack.push(41); } else if (c === 91) { blockStack.push(93); } else if (c === 123 || c === 125) { return true; } else if (c === 41 || c === 93) { if (blockStack[blockStack.length - 1] !== c) { return true; } blockStack.pop(); } else if (c === 59 && blockStack.length === 0) { return true; } } return quote !== 0 || blockStack.length !== 0; }; var styleObjectForEach = (style, fn) => { for (const [k, v] of Object.entries(style)) { const key = k[0] === "-" || !/[A-Z]/.test(k) ? k : k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`); if (!isValidStylePropertyName(key)) { continue; } if (v == null) { fn(key, null); continue; } let value; if (typeof v === "number") { value = !key.match( /^(?:a|border-im|column(?:-c|s)|flex(?:$|-[^b])|grid-(?:ar|[^a])|font-w|li|or|sca|st|ta|wido|z)|ty$/ ) ? `${v}px` : `${v}`; } else if (typeof v === "string") { if (hasUnsafeStyleValue(v)) { continue; } value = v; } else { continue; } fn(key, value); } }; export { isValidAttributeName, isValidTagName, normalizeIntrinsicElementKey, styleObjectForEach };