import { U as UniqueTags, T as TagsWithInnerContent, M as MetaTagsArrayable, a as TagConfigKeys, D as DupeableTags } from './unhead.yem5I2v_.mjs'; const allowedMetaProperties = ["name", "property", "http-equiv"]; function isMetaArrayDupeKey(v) { const k = v.split(":")[1]; return MetaTagsArrayable.has(k); } function dedupeKey(tag) { const { props, tag: name } = tag; if (UniqueTags.has(name)) return name; if (name === "link" && props.rel === "canonical") return "canonical"; if (props.charset) return "charset"; if (tag.tag === "meta") { for (const n of allowedMetaProperties) { if (props[n] !== void 0) { return `${name}:${props[n]}`; } } } if (tag.key) { return `${name}:key:${tag.key}`; } if (props.id) { return `${name}:id:${props.id}`; } if (TagsWithInnerContent.has(name)) { const v = tag.textContent || tag.innerHTML; if (v) { return `${name}:content:${v}`; } } } function hashTag(tag) { const dedupe = tag._h || tag._d; if (dedupe) return dedupe; const inner = tag.textContent || tag.innerHTML; if (inner) return inner; return `${tag.tag}:${Object.entries(tag.props).map(([k, v]) => `${k}:${String(v)}`).join(",")}`; } function walkResolver(val, resolve, key) { const type = typeof val; if (type === "function") { if (!key || key !== "titleTemplate" && !(key[0] === "o" && key[1] === "n")) { val = val(); } } let v; if (resolve) { v = resolve(key, val); } if (Array.isArray(v)) { return v.map((r) => walkResolver(r, resolve)); } if (v?.constructor === Object) { const next = {}; for (const key2 of Object.keys(v)) { next[key2] = walkResolver(v[key2], resolve, key2); } return next; } return v; } function normalizeStyleClassProps(key, value) { const store = key === "style" ? /* @__PURE__ */ new Map() : /* @__PURE__ */ new Set(); function processValue(rawValue) { const value2 = rawValue.trim(); if (!value2) return; if (key === "style") { const [k, ...v] = value2.split(":").map((s) => s.trim()); if (k && v.length) store.set(k, v.join(":")); } else { value2.split(" ").filter(Boolean).forEach((c) => store.add(c)); } } if (typeof value === "string") { key === "style" ? value.split(";").forEach(processValue) : processValue(value); } else if (Array.isArray(value)) { value.forEach((item) => processValue(item)); } else if (value && typeof value === "object") { Object.entries(value).forEach(([k, v]) => { if (v && v !== "false") { key === "style" ? store.set(k.trim(), v) : processValue(k); } }); } return store; } function normalizeProps(tag, input) { tag.props = tag.props || {}; if (!input) { return tag; } Object.entries(input).forEach(([key, value]) => { if (value === null) { tag.props[key] = null; return; } if (key === "class" || key === "style") { tag.props[key] = normalizeStyleClassProps(key, value); return; } if (TagConfigKeys.has(key)) { if (["textContent", "innerHTML"].includes(key) && typeof value === "object") { let type = input.type; if (!input.type) { type = "application/json"; } if (!type?.endsWith("json") && type !== "speculationrules") { return; } input.type = type; tag.props.type = type; tag[key] = JSON.stringify(value); } else { tag[key] = value; } return; } const strValue = String(value); const isDataKey = key.startsWith("data-"); if (strValue === "true" || strValue === "") { tag.props[key] = isDataKey ? "true" : true; } else if (!value && isDataKey && strValue === "false") { tag.props[key] = "false"; } else if (value !== void 0) { tag.props[key] = value; } }); return tag; } function normalizeTag(tagName, _input) { const input = typeof _input === "object" && typeof _input !== "function" ? _input : { [tagName === "script" || tagName === "noscript" || tagName === "style" ? "innerHTML" : "textContent"]: _input }; const tag = normalizeProps({ tag: tagName, props: {} }, input); if (tag.key && DupeableTags.has(tag.tag)) { tag.props["data-hid"] = tag._h = tag.key; } if (tag.tag === "script" && typeof tag.innerHTML === "object") { tag.innerHTML = JSON.stringify(tag.innerHTML); tag.props.type = tag.props.type || "application/json"; } return Array.isArray(tag.props.content) ? tag.props.content.map((v) => ({ ...tag, props: { ...tag.props, content: v } })) : tag; } function normalizeEntryToTags(input, propResolvers) { if (!input) { return []; } if (typeof input === "function") { input = input(); } const resolvers = (key, val) => { for (let i = 0; i < propResolvers.length; i++) { val = propResolvers[i](key, val); } return val; }; input = resolvers(void 0, input); const tags = []; input = walkResolver(input, resolvers); Object.entries(input || {}).forEach(([key, value]) => { if (value === void 0) return; for (const v of Array.isArray(value) ? value : [value]) tags.push(normalizeTag(key, v)); }); return tags.flat(); } export { normalizeProps as a, dedupeKey as d, hashTag as h, isMetaArrayDupeKey as i, normalizeEntryToTags as n, walkResolver as w };