PC-mj/.output/server/node_modules/unhead/dist/shared/unhead.BaPU1zLf.mjs
2025-03-11 13:57:38 +08:00

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 };