@highstate/designer 0.7.0 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.output/nitro.json +3 -3
- package/.output/public/_nuxt/1_b4y8eQ.js +1 -0
- package/.output/public/_nuxt/BjOhMR1f.js +242 -0
- package/.output/public/_nuxt/CPAAHz3G.js +1 -0
- package/.output/public/_nuxt/{TC7QuZux.js → CmGpyJTe.js} +1 -1
- package/.output/public/_nuxt/builds/latest.json +1 -1
- package/.output/public/_nuxt/builds/meta/d9ef4694-b71b-4675-9064-eba6ec8658b0.json +1 -0
- package/.output/public/_nuxt/{entry.DpeBhKHh.css → entry.Vs8IncyG.css} +1 -1
- package/.output/server/index.mjs +1876 -3051
- package/.output/server/index.mjs.map +1 -1
- package/.output/server/node_modules/@babel/parser/lib/index.js +129 -97
- package/.output/server/node_modules/@babel/parser/package.json +2 -2
- package/.output/server/node_modules/@trpc/server/dist/adapters/fetch/fetchRequestHandler.mjs +74 -0
- package/.output/server/node_modules/@trpc/server/dist/adapters/fetch/index.mjs +1 -0
- package/.output/server/node_modules/@trpc/server/dist/adapters/node-http/incomingMessageToRequest.mjs +119 -0
- package/.output/server/node_modules/@trpc/server/dist/adapters/node-http/index.mjs +2 -0
- package/.output/server/node_modules/@trpc/server/dist/adapters/node-http/nodeHTTPRequestHandler.mjs +92 -0
- package/.output/server/node_modules/@trpc/server/dist/adapters/node-http/writeResponse.mjs +79 -0
- package/.output/server/node_modules/@trpc/server/dist/index.mjs +1 -1
- package/.output/server/node_modules/@trpc/server/dist/unstable-core-do-not-import/middleware.mjs +1 -1
- package/.output/server/node_modules/@trpc/server/dist/unstable-core-do-not-import/parser.mjs +4 -3
- package/.output/server/node_modules/@trpc/server/dist/unstable-core-do-not-import/procedureBuilder.mjs +3 -0
- package/.output/server/node_modules/@trpc/server/dist/unstable-core-do-not-import/router.mjs +1 -1
- package/.output/server/node_modules/@trpc/server/package.json +6 -6
- package/.output/server/node_modules/unhead/dist/plugins.mjs +94 -0
- package/.output/server/node_modules/unhead/dist/server.mjs +220 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.C13swrCa.mjs +48 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.CApf5sj3.mjs +148 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.Cp0iF6eN.mjs +177 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.DQc16pHI.mjs +196 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.DZbvapt-.mjs +70 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.DeCxexjU.mjs +166 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.Txd0XTIP.mjs +172 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.yem5I2v_.mjs +38 -0
- package/.output/server/node_modules/unhead/dist/utils.mjs +5 -0
- package/.output/server/node_modules/unhead/package.json +66 -11
- package/.output/server/package.json +1 -1
- package/package.json +8 -8
- package/.output/public/_nuxt/B3Ns2-bM.js +0 -1
- package/.output/public/_nuxt/DToExo9V.js +0 -1
- package/.output/public/_nuxt/builds/meta/f64fe243-c5f1-4f5e-a593-05cf555884c2.json +0 -1
- package/.output/public/_nuxt/u3nCRAjk.js +0 -244
- package/.output/server/node_modules/@trpc/server/dist/http.mjs +0 -7
- package/.output/server/node_modules/@trpc/server/dist/unstable-core-do-not-import/http/contentTypeParsers.mjs +0 -12
- package/.output/server/node_modules/@unhead/dom/dist/index.mjs +0 -197
- package/.output/server/node_modules/@unhead/dom/package.json +0 -40
- package/.output/server/node_modules/@unhead/shared/dist/index.mjs +0 -641
- package/.output/server/node_modules/@unhead/shared/package.json +0 -45
- package/.output/server/node_modules/@unhead/ssr/dist/index.mjs +0 -95
- package/.output/server/node_modules/@unhead/ssr/package.json +0 -40
- package/.output/server/node_modules/node-mock-http/dist/_polyfill/buffer/node.mjs +0 -1
- package/.output/server/node_modules/node-mock-http/dist/_polyfill/events/node.mjs +0 -1
- package/.output/server/node_modules/node-mock-http/dist/index.mjs +0 -1
- package/.output/server/node_modules/node-mock-http/package.json +0 -63
- package/.output/server/node_modules/packrup/dist/index.mjs +0 -108
- package/.output/server/node_modules/packrup/package.json +0 -58
- package/.output/server/node_modules/unhead/dist/index.mjs +0 -748
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import { a as createUnhead } from './shared/unhead.Txd0XTIP.mjs';
|
|
2
|
+
import { T as TagsWithInnerContent, S as SelfClosingTags$1 } from './shared/unhead.yem5I2v_.mjs';
|
|
3
|
+
import 'hookable';
|
|
4
|
+
import './shared/unhead.Cp0iF6eN.mjs';
|
|
5
|
+
import './shared/unhead.DZbvapt-.mjs';
|
|
6
|
+
|
|
7
|
+
// @__NO_SIDE_EFFECTS__
|
|
8
|
+
function createHead(options = {}) {
|
|
9
|
+
const unhead = createUnhead({
|
|
10
|
+
...options,
|
|
11
|
+
// @ts-expect-error untyped
|
|
12
|
+
document: false,
|
|
13
|
+
propResolvers: [
|
|
14
|
+
...options.propResolvers || [],
|
|
15
|
+
(k, v) => {
|
|
16
|
+
if (k && k.startsWith("on") && typeof v === "function") {
|
|
17
|
+
return `this.dataset.${k}fired = true`;
|
|
18
|
+
}
|
|
19
|
+
return v;
|
|
20
|
+
}
|
|
21
|
+
],
|
|
22
|
+
init: [
|
|
23
|
+
options.disableDefaults ? void 0 : {
|
|
24
|
+
htmlAttrs: {
|
|
25
|
+
lang: "en"
|
|
26
|
+
},
|
|
27
|
+
meta: [
|
|
28
|
+
{
|
|
29
|
+
charset: "utf-8"
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
name: "viewport",
|
|
33
|
+
content: "width=device-width, initial-scale=1"
|
|
34
|
+
}
|
|
35
|
+
]
|
|
36
|
+
},
|
|
37
|
+
...options.init || []
|
|
38
|
+
]
|
|
39
|
+
});
|
|
40
|
+
unhead._ssrPayload = {};
|
|
41
|
+
unhead.use({
|
|
42
|
+
key: "server",
|
|
43
|
+
hooks: {
|
|
44
|
+
"tags:resolve": function(ctx) {
|
|
45
|
+
const title = ctx.tagMap.get("title");
|
|
46
|
+
const titleTemplate = ctx.tagMap.get("titleTemplate");
|
|
47
|
+
let payload = {
|
|
48
|
+
title: title?.mode === "server" ? unhead._title : void 0,
|
|
49
|
+
titleTemplate: titleTemplate?.mode === "server" ? unhead._titleTemplate : void 0
|
|
50
|
+
};
|
|
51
|
+
if (Object.keys(unhead._ssrPayload || {}).length > 0) {
|
|
52
|
+
payload = {
|
|
53
|
+
...unhead._ssrPayload,
|
|
54
|
+
...payload
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
if (Object.values(payload).some(Boolean)) {
|
|
58
|
+
ctx.tags.push({
|
|
59
|
+
tag: "script",
|
|
60
|
+
innerHTML: JSON.stringify(payload),
|
|
61
|
+
props: { id: "unhead:payload", type: "application/json" }
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
return unhead;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const Attrs = /(\w+)(?:=["']([^"']*)["'])?/g;
|
|
71
|
+
const HtmlTag = /<html[^>]*>/;
|
|
72
|
+
const BodyTag = /<body[^>]*>/;
|
|
73
|
+
const HeadContent = /<head[^>]*>(.*?)<\/head>/s;
|
|
74
|
+
const SelfClosingTags = /<(meta|link|base)[^>]*>/g;
|
|
75
|
+
const ClosingTags = /<(title|script|style)[^>]*>[\s\S]*?<\/\1>/g;
|
|
76
|
+
const NewLines = /(\n\s*)+/g;
|
|
77
|
+
function extractAttributes(tag) {
|
|
78
|
+
const inner = tag.match(/<([^>]*)>/)?.[1].split(" ").slice(1).join(" ");
|
|
79
|
+
if (!inner)
|
|
80
|
+
return {};
|
|
81
|
+
const attrs = inner.match(Attrs);
|
|
82
|
+
return attrs?.reduce((acc, attr) => {
|
|
83
|
+
const sep = attr.indexOf("=");
|
|
84
|
+
const key = sep > 0 ? attr.slice(0, sep) : attr;
|
|
85
|
+
const val = sep > 0 ? attr.slice(sep + 1).slice(1, -1) : true;
|
|
86
|
+
return { ...acc, [key]: val };
|
|
87
|
+
}, {}) || {};
|
|
88
|
+
}
|
|
89
|
+
function extractUnheadInputFromHtml(html) {
|
|
90
|
+
const input = {};
|
|
91
|
+
input.htmlAttrs = extractAttributes(html.match(HtmlTag)?.[0] || "");
|
|
92
|
+
html = html.replace(HtmlTag, "<html>");
|
|
93
|
+
input.bodyAttrs = extractAttributes(html.match(BodyTag)?.[0] || "");
|
|
94
|
+
html = html.replace(BodyTag, "<body>");
|
|
95
|
+
const innerHead = html.match(HeadContent)?.[1] || "";
|
|
96
|
+
innerHead.match(SelfClosingTags)?.forEach((s) => {
|
|
97
|
+
html = html.replace(s, "");
|
|
98
|
+
const tag = s.split(" ")[0].slice(1);
|
|
99
|
+
input[tag] = input[tag] || [];
|
|
100
|
+
input[tag].push(extractAttributes(s));
|
|
101
|
+
});
|
|
102
|
+
innerHead.match(ClosingTags)?.map((tag) => tag.trim()).filter(Boolean).forEach((tag) => {
|
|
103
|
+
html = html.replace(tag, "");
|
|
104
|
+
const type = tag.match(/<([a-z-]+)/)?.[1];
|
|
105
|
+
const res = extractAttributes(tag);
|
|
106
|
+
const innerContent = tag.match(/>([\s\S]*)</)?.[1];
|
|
107
|
+
if (innerContent) {
|
|
108
|
+
res[type !== "script" ? "textContent" : "innerHTML"] = innerContent;
|
|
109
|
+
}
|
|
110
|
+
if (type === "title") {
|
|
111
|
+
input.title = res;
|
|
112
|
+
} else {
|
|
113
|
+
input[type] = input[type] || [];
|
|
114
|
+
input[type].push(res);
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
html = html.replace(NewLines, "\n");
|
|
118
|
+
return { html, input };
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function encodeAttribute(value) {
|
|
122
|
+
return String(value).replace(/"/g, """);
|
|
123
|
+
}
|
|
124
|
+
function propsToString(props) {
|
|
125
|
+
let attrs = "";
|
|
126
|
+
for (const key in props) {
|
|
127
|
+
if (!Object.hasOwn(props, key))
|
|
128
|
+
continue;
|
|
129
|
+
let value = props[key];
|
|
130
|
+
if ((key === "class" || key === "style") && typeof value !== "string") {
|
|
131
|
+
value = key === "class" ? Array.from(value).join(" ") : Array.from(value).map(([k, v]) => `${k}:${v}`).join(";");
|
|
132
|
+
}
|
|
133
|
+
if (value !== false && value !== null) {
|
|
134
|
+
attrs += value === true ? ` ${key}` : ` ${key}="${encodeAttribute(value)}"`;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return attrs;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
function escapeHtml(str) {
|
|
141
|
+
return str.replace(/[&<>"'/]/g, (char) => {
|
|
142
|
+
switch (char) {
|
|
143
|
+
case "&":
|
|
144
|
+
return "&";
|
|
145
|
+
case "<":
|
|
146
|
+
return "<";
|
|
147
|
+
case ">":
|
|
148
|
+
return ">";
|
|
149
|
+
case '"':
|
|
150
|
+
return """;
|
|
151
|
+
case "'":
|
|
152
|
+
return "'";
|
|
153
|
+
case "/":
|
|
154
|
+
return "/";
|
|
155
|
+
default:
|
|
156
|
+
return char;
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
function tagToString(tag) {
|
|
161
|
+
const attrs = propsToString(tag.props);
|
|
162
|
+
const openTag = `<${tag.tag}${attrs}>`;
|
|
163
|
+
if (!TagsWithInnerContent.has(tag.tag))
|
|
164
|
+
return SelfClosingTags$1.has(tag.tag) ? openTag : `${openTag}</${tag.tag}>`;
|
|
165
|
+
let content = String(tag.innerHTML || "");
|
|
166
|
+
if (tag.textContent)
|
|
167
|
+
content = escapeHtml(String(tag.textContent));
|
|
168
|
+
return SelfClosingTags$1.has(tag.tag) ? openTag : `${openTag}${content}</${tag.tag}>`;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
function ssrRenderTags(tags, options) {
|
|
172
|
+
const schema = { htmlAttrs: {}, bodyAttrs: {}, tags: { head: "", bodyClose: "", bodyOpen: "" } };
|
|
173
|
+
const lineBreaks = !options?.omitLineBreaks ? "\n" : "";
|
|
174
|
+
for (const tag of tags) {
|
|
175
|
+
if (tag.tag === "htmlAttrs" || tag.tag === "bodyAttrs") {
|
|
176
|
+
Object.assign(schema[tag.tag], tag.props);
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
const s = tagToString(tag);
|
|
180
|
+
const tagPosition = tag.tagPosition || "head";
|
|
181
|
+
schema.tags[tagPosition] += schema.tags[tagPosition] ? `${lineBreaks}${s}` : s;
|
|
182
|
+
}
|
|
183
|
+
return {
|
|
184
|
+
headTags: schema.tags.head,
|
|
185
|
+
bodyTags: schema.tags.bodyClose,
|
|
186
|
+
bodyTagsOpen: schema.tags.bodyOpen,
|
|
187
|
+
htmlAttrs: propsToString(schema.htmlAttrs),
|
|
188
|
+
bodyAttrs: propsToString(schema.bodyAttrs)
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
async function renderSSRHead(head, options) {
|
|
193
|
+
const beforeRenderCtx = { shouldRender: true };
|
|
194
|
+
await head.hooks.callHook("ssr:beforeRender", beforeRenderCtx);
|
|
195
|
+
if (!beforeRenderCtx.shouldRender) {
|
|
196
|
+
return {
|
|
197
|
+
headTags: "",
|
|
198
|
+
bodyTags: "",
|
|
199
|
+
bodyTagsOpen: "",
|
|
200
|
+
htmlAttrs: "",
|
|
201
|
+
bodyAttrs: ""
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
const ctx = { tags: options?.resolvedTags || await head.resolveTags() };
|
|
205
|
+
await head.hooks.callHook("ssr:render", ctx);
|
|
206
|
+
const html = ssrRenderTags(ctx.tags, options);
|
|
207
|
+
const renderCtx = { tags: ctx.tags, html };
|
|
208
|
+
await head.hooks.callHook("ssr:rendered", renderCtx);
|
|
209
|
+
return renderCtx.html;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
async function transformHtmlTemplate(head, html, options) {
|
|
213
|
+
const { html: parsedHtml, input } = extractUnheadInputFromHtml(html);
|
|
214
|
+
head.push(input, { _index: 0 });
|
|
215
|
+
const headHtml = await renderSSRHead(head, options);
|
|
216
|
+
return parsedHtml.replace("<html>", `<html${headHtml.htmlAttrs}>`).replace("<body>", `<body>${headHtml.bodyTagsOpen ? `
|
|
217
|
+
${headHtml.bodyTagsOpen}` : ``}`).replace("<body>", `<body${headHtml.bodyAttrs}>`).replace("</head>", `${headHtml.headTags}</head>`).replace("</body>", `${headHtml.bodyTags}</body>`);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
export { createHead, escapeHtml, extractUnheadInputFromHtml, propsToString, renderSSRHead, ssrRenderTags, tagToString, transformHtmlTemplate };
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
const SepSub = "%separator";
|
|
2
|
+
const SepSubRE = new RegExp(`${SepSub}(?:\\s*${SepSub})*`, "g");
|
|
3
|
+
function sub(p, token, isJson = false) {
|
|
4
|
+
let val;
|
|
5
|
+
if (token === "s" || token === "pageTitle") {
|
|
6
|
+
val = p.pageTitle;
|
|
7
|
+
} else if (token.includes(".")) {
|
|
8
|
+
const dotIndex = token.indexOf(".");
|
|
9
|
+
val = p[token.substring(0, dotIndex)]?.[token.substring(dotIndex + 1)];
|
|
10
|
+
} else {
|
|
11
|
+
val = p[token];
|
|
12
|
+
}
|
|
13
|
+
if (val !== void 0) {
|
|
14
|
+
return isJson ? (val || "").replace(/\\/g, "\\\\").replace(/</g, "\\u003C").replace(/"/g, '\\"') : val || "";
|
|
15
|
+
}
|
|
16
|
+
return void 0;
|
|
17
|
+
}
|
|
18
|
+
function processTemplateParams(s, p, sep, isJson = false) {
|
|
19
|
+
if (typeof s !== "string" || !s.includes("%"))
|
|
20
|
+
return s;
|
|
21
|
+
let decoded = s;
|
|
22
|
+
try {
|
|
23
|
+
decoded = decodeURI(s);
|
|
24
|
+
} catch {
|
|
25
|
+
}
|
|
26
|
+
const tokens = decoded.match(/%\w+(?:\.\w+)?/g);
|
|
27
|
+
if (!tokens) {
|
|
28
|
+
return s;
|
|
29
|
+
}
|
|
30
|
+
const hasSepSub = s.includes(SepSub);
|
|
31
|
+
s = s.replace(/%\w+(?:\.\w+)?/g, (token) => {
|
|
32
|
+
if (token === SepSub || !tokens.includes(token)) {
|
|
33
|
+
return token;
|
|
34
|
+
}
|
|
35
|
+
const re = sub(p, token.slice(1), isJson);
|
|
36
|
+
return re !== void 0 ? re : token;
|
|
37
|
+
}).trim();
|
|
38
|
+
if (hasSepSub) {
|
|
39
|
+
if (s.endsWith(SepSub))
|
|
40
|
+
s = s.slice(0, -SepSub.length);
|
|
41
|
+
if (s.startsWith(SepSub))
|
|
42
|
+
s = s.slice(SepSub.length);
|
|
43
|
+
s = s.replace(SepSubRE, sep || "").trim();
|
|
44
|
+
}
|
|
45
|
+
return s;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export { processTemplateParams as p };
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { u as unpackMeta } from './unhead.DQc16pHI.mjs';
|
|
2
|
+
|
|
3
|
+
function defineHeadPlugin(plugin) {
|
|
4
|
+
return plugin;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
const FlatMetaPlugin = /* @__PURE__ */ defineHeadPlugin({
|
|
8
|
+
key: "flatMeta",
|
|
9
|
+
hooks: {
|
|
10
|
+
"entries:normalize": (ctx) => {
|
|
11
|
+
const tagsToAdd = [];
|
|
12
|
+
ctx.tags = ctx.tags.map((t) => {
|
|
13
|
+
if (t.tag !== "_flatMeta") {
|
|
14
|
+
return t;
|
|
15
|
+
}
|
|
16
|
+
tagsToAdd.push(unpackMeta(t.props).map((p) => ({
|
|
17
|
+
...t,
|
|
18
|
+
tag: "meta",
|
|
19
|
+
props: p
|
|
20
|
+
})));
|
|
21
|
+
return false;
|
|
22
|
+
}).filter(Boolean).concat(...tagsToAdd);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
const WhitelistAttributes = {
|
|
28
|
+
htmlAttrs: /* @__PURE__ */ new Set(["class", "style", "lang", "dir"]),
|
|
29
|
+
bodyAttrs: /* @__PURE__ */ new Set(["class", "style"]),
|
|
30
|
+
meta: /* @__PURE__ */ new Set(["name", "property", "charset", "content", "media"]),
|
|
31
|
+
noscript: /* @__PURE__ */ new Set(["textContent"]),
|
|
32
|
+
style: /* @__PURE__ */ new Set(["media", "textContent", "nonce", "title", "blocking"]),
|
|
33
|
+
script: /* @__PURE__ */ new Set(["type", "textContent", "nonce", "blocking"]),
|
|
34
|
+
link: /* @__PURE__ */ new Set(["color", "crossorigin", "fetchpriority", "href", "hreflang", "imagesrcset", "imagesizes", "integrity", "media", "referrerpolicy", "rel", "sizes", "type"])
|
|
35
|
+
};
|
|
36
|
+
function acceptDataAttrs(value) {
|
|
37
|
+
return Object.fromEntries(
|
|
38
|
+
Object.entries(value || {}).filter(([key]) => key === "id" || key.startsWith("data-"))
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
function makeTagSafe(tag) {
|
|
42
|
+
let next = {};
|
|
43
|
+
const { tag: type, props: prev } = tag;
|
|
44
|
+
switch (type) {
|
|
45
|
+
// always safe
|
|
46
|
+
case "title":
|
|
47
|
+
case "titleTemplate":
|
|
48
|
+
case "templateParams":
|
|
49
|
+
next = prev;
|
|
50
|
+
break;
|
|
51
|
+
case "htmlAttrs":
|
|
52
|
+
case "bodyAttrs":
|
|
53
|
+
WhitelistAttributes[type].forEach((attr) => {
|
|
54
|
+
if (prev[attr]) {
|
|
55
|
+
next[attr] = prev[attr];
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
break;
|
|
59
|
+
case "style":
|
|
60
|
+
next = acceptDataAttrs(prev);
|
|
61
|
+
WhitelistAttributes.style.forEach((key) => {
|
|
62
|
+
if (prev[key]) {
|
|
63
|
+
next[key] = prev[key];
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
break;
|
|
67
|
+
// meta is safe, except for http-equiv
|
|
68
|
+
case "meta":
|
|
69
|
+
WhitelistAttributes.meta.forEach((key) => {
|
|
70
|
+
if (prev[key]) {
|
|
71
|
+
next[key] = prev[key];
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
break;
|
|
75
|
+
// link tags we don't allow stylesheets, scripts, preloading, prerendering, prefetching, etc
|
|
76
|
+
case "link":
|
|
77
|
+
WhitelistAttributes.link.forEach((key) => {
|
|
78
|
+
const val = prev[key];
|
|
79
|
+
if (!val) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
if (key === "rel" && (val === "canonical" || val === "modulepreload" || val === "prerender" || val === "preload" || val === "prefetch")) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
if (key === "href") {
|
|
86
|
+
if (val.includes("javascript:") || val.includes("data:")) {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
next[key] = val;
|
|
90
|
+
} else if (val) {
|
|
91
|
+
next[key] = val;
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
if (!next.href && !next.imagesrcset || !next.rel) {
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
break;
|
|
98
|
+
case "noscript":
|
|
99
|
+
WhitelistAttributes.noscript.forEach((key) => {
|
|
100
|
+
if (prev[key]) {
|
|
101
|
+
next[key] = prev[key];
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
break;
|
|
105
|
+
// we only allow JSON in scripts
|
|
106
|
+
case "script":
|
|
107
|
+
if (!tag.textContent || !prev.type?.endsWith("json")) {
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
WhitelistAttributes.script.forEach((s) => {
|
|
111
|
+
if (prev[s] === "textContent") {
|
|
112
|
+
try {
|
|
113
|
+
const jsonVal = typeof prev[s] === "string" ? JSON.parse(prev[s]) : prev[s];
|
|
114
|
+
next[s] = JSON.stringify(jsonVal, null, 0);
|
|
115
|
+
} catch {
|
|
116
|
+
}
|
|
117
|
+
} else if (prev[s]) {
|
|
118
|
+
next[s] = prev[s];
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
if (!Object.keys(next).length && !tag.tag.endsWith("Attrs")) {
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
tag.props = { ...acceptDataAttrs(prev), ...next };
|
|
127
|
+
return tag;
|
|
128
|
+
}
|
|
129
|
+
const SafeInputPlugin = (
|
|
130
|
+
/* @PURE */
|
|
131
|
+
defineHeadPlugin({
|
|
132
|
+
key: "safe",
|
|
133
|
+
hooks: {
|
|
134
|
+
"entries:normalize": (ctx) => {
|
|
135
|
+
if (ctx.entry.options?._safe) {
|
|
136
|
+
ctx.tags = ctx.tags.reduce((acc, tag) => {
|
|
137
|
+
const safeTag = makeTagSafe(tag);
|
|
138
|
+
if (safeTag)
|
|
139
|
+
acc.push(safeTag);
|
|
140
|
+
return acc;
|
|
141
|
+
}, []);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
})
|
|
146
|
+
);
|
|
147
|
+
|
|
148
|
+
export { FlatMetaPlugin as F, SafeInputPlugin as S, defineHeadPlugin as d };
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { U as UniqueTags, T as TagsWithInnerContent, M as MetaTagsArrayable, a as TagConfigKeys, D as DupeableTags } from './unhead.yem5I2v_.mjs';
|
|
2
|
+
|
|
3
|
+
const allowedMetaProperties = ["name", "property", "http-equiv"];
|
|
4
|
+
function isMetaArrayDupeKey(v) {
|
|
5
|
+
const k = v.split(":")[1];
|
|
6
|
+
return MetaTagsArrayable.has(k);
|
|
7
|
+
}
|
|
8
|
+
function dedupeKey(tag) {
|
|
9
|
+
const { props, tag: name } = tag;
|
|
10
|
+
if (UniqueTags.has(name))
|
|
11
|
+
return name;
|
|
12
|
+
if (name === "link" && props.rel === "canonical")
|
|
13
|
+
return "canonical";
|
|
14
|
+
if (props.charset)
|
|
15
|
+
return "charset";
|
|
16
|
+
if (tag.tag === "meta") {
|
|
17
|
+
for (const n of allowedMetaProperties) {
|
|
18
|
+
if (props[n] !== void 0) {
|
|
19
|
+
return `${name}:${props[n]}`;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
if (tag.key) {
|
|
24
|
+
return `${name}:key:${tag.key}`;
|
|
25
|
+
}
|
|
26
|
+
if (props.id) {
|
|
27
|
+
return `${name}:id:${props.id}`;
|
|
28
|
+
}
|
|
29
|
+
if (TagsWithInnerContent.has(name)) {
|
|
30
|
+
const v = tag.textContent || tag.innerHTML;
|
|
31
|
+
if (v) {
|
|
32
|
+
return `${name}:content:${v}`;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
function hashTag(tag) {
|
|
37
|
+
const dedupe = tag._h || tag._d;
|
|
38
|
+
if (dedupe)
|
|
39
|
+
return dedupe;
|
|
40
|
+
const inner = tag.textContent || tag.innerHTML;
|
|
41
|
+
if (inner)
|
|
42
|
+
return inner;
|
|
43
|
+
return `${tag.tag}:${Object.entries(tag.props).map(([k, v]) => `${k}:${String(v)}`).join(",")}`;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function walkResolver(val, resolve, key) {
|
|
47
|
+
const type = typeof val;
|
|
48
|
+
if (type === "function") {
|
|
49
|
+
if (!key || key !== "titleTemplate" && !(key[0] === "o" && key[1] === "n")) {
|
|
50
|
+
val = val();
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
let v;
|
|
54
|
+
if (resolve) {
|
|
55
|
+
v = resolve(key, val);
|
|
56
|
+
}
|
|
57
|
+
if (Array.isArray(v)) {
|
|
58
|
+
return v.map((r) => walkResolver(r, resolve));
|
|
59
|
+
}
|
|
60
|
+
if (v?.constructor === Object) {
|
|
61
|
+
const next = {};
|
|
62
|
+
for (const key2 of Object.keys(v)) {
|
|
63
|
+
next[key2] = walkResolver(v[key2], resolve, key2);
|
|
64
|
+
}
|
|
65
|
+
return next;
|
|
66
|
+
}
|
|
67
|
+
return v;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function normalizeStyleClassProps(key, value) {
|
|
71
|
+
const store = key === "style" ? /* @__PURE__ */ new Map() : /* @__PURE__ */ new Set();
|
|
72
|
+
function processValue(rawValue) {
|
|
73
|
+
const value2 = rawValue.trim();
|
|
74
|
+
if (!value2)
|
|
75
|
+
return;
|
|
76
|
+
if (key === "style") {
|
|
77
|
+
const [k, ...v] = value2.split(":").map((s) => s.trim());
|
|
78
|
+
if (k && v.length)
|
|
79
|
+
store.set(k, v.join(":"));
|
|
80
|
+
} else {
|
|
81
|
+
value2.split(" ").filter(Boolean).forEach((c) => store.add(c));
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (typeof value === "string") {
|
|
85
|
+
key === "style" ? value.split(";").forEach(processValue) : processValue(value);
|
|
86
|
+
} else if (Array.isArray(value)) {
|
|
87
|
+
value.forEach((item) => processValue(item));
|
|
88
|
+
} else if (value && typeof value === "object") {
|
|
89
|
+
Object.entries(value).forEach(([k, v]) => {
|
|
90
|
+
if (v && v !== "false") {
|
|
91
|
+
key === "style" ? store.set(k.trim(), v) : processValue(k);
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
return store;
|
|
96
|
+
}
|
|
97
|
+
function normalizeProps(tag, input) {
|
|
98
|
+
tag.props = tag.props || {};
|
|
99
|
+
if (!input) {
|
|
100
|
+
return tag;
|
|
101
|
+
}
|
|
102
|
+
Object.entries(input).forEach(([key, value]) => {
|
|
103
|
+
if (value === null) {
|
|
104
|
+
tag.props[key] = null;
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
if (key === "class" || key === "style") {
|
|
108
|
+
tag.props[key] = normalizeStyleClassProps(key, value);
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
if (TagConfigKeys.has(key)) {
|
|
112
|
+
if (["textContent", "innerHTML"].includes(key) && typeof value === "object") {
|
|
113
|
+
let type = input.type;
|
|
114
|
+
if (!input.type) {
|
|
115
|
+
type = "application/json";
|
|
116
|
+
}
|
|
117
|
+
if (!type?.endsWith("json") && type !== "speculationrules") {
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
input.type = type;
|
|
121
|
+
tag.props.type = type;
|
|
122
|
+
tag[key] = JSON.stringify(value);
|
|
123
|
+
} else {
|
|
124
|
+
tag[key] = value;
|
|
125
|
+
}
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
const strValue = String(value);
|
|
129
|
+
const isDataKey = key.startsWith("data-");
|
|
130
|
+
if (strValue === "true" || strValue === "") {
|
|
131
|
+
tag.props[key] = isDataKey ? strValue : true;
|
|
132
|
+
} else if (!value && isDataKey && strValue === "false") {
|
|
133
|
+
tag.props[key] = "false";
|
|
134
|
+
} else if (value !== void 0) {
|
|
135
|
+
tag.props[key] = value;
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
return tag;
|
|
139
|
+
}
|
|
140
|
+
function normalizeTag(tagName, _input) {
|
|
141
|
+
const input = typeof _input === "object" && typeof _input !== "function" ? _input : { [tagName === "script" || tagName === "noscript" || tagName === "style" ? "innerHTML" : "textContent"]: _input };
|
|
142
|
+
const tag = normalizeProps({ tag: tagName, props: {} }, input);
|
|
143
|
+
if (tag.key && DupeableTags.has(tag.tag)) {
|
|
144
|
+
tag.props["data-hid"] = tag._h = tag.key;
|
|
145
|
+
}
|
|
146
|
+
if (tag.tag === "script" && typeof tag.innerHTML === "object") {
|
|
147
|
+
tag.innerHTML = JSON.stringify(tag.innerHTML);
|
|
148
|
+
tag.props.type = tag.props.type || "application/json";
|
|
149
|
+
}
|
|
150
|
+
return Array.isArray(tag.props.content) ? tag.props.content.map((v) => ({ ...tag, props: { ...tag.props, content: v } })) : tag;
|
|
151
|
+
}
|
|
152
|
+
function normalizeEntryToTags(input, propResolvers) {
|
|
153
|
+
if (!input) {
|
|
154
|
+
return [];
|
|
155
|
+
}
|
|
156
|
+
if (typeof input === "function") {
|
|
157
|
+
input = input();
|
|
158
|
+
}
|
|
159
|
+
const resolvers = (key, val) => {
|
|
160
|
+
for (let i = 0; i < propResolvers.length; i++) {
|
|
161
|
+
val = propResolvers[i](key, val);
|
|
162
|
+
}
|
|
163
|
+
return val;
|
|
164
|
+
};
|
|
165
|
+
input = resolvers(void 0, input);
|
|
166
|
+
const tags = [];
|
|
167
|
+
input = walkResolver(input, resolvers);
|
|
168
|
+
Object.entries(input || {}).forEach(([key, value]) => {
|
|
169
|
+
if (value === void 0)
|
|
170
|
+
return;
|
|
171
|
+
for (const v of Array.isArray(value) ? value : [value])
|
|
172
|
+
tags.push(normalizeTag(key, v));
|
|
173
|
+
});
|
|
174
|
+
return tags.flat();
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
export { normalizeProps as a, dedupeKey as d, hashTag as h, isMetaArrayDupeKey as i, normalizeEntryToTags as n, walkResolver as w };
|