178 lines
5.3 KiB
JavaScript
178 lines
5.3 KiB
JavaScript
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 };
|