@unhead/shared 2.0.0-alpha.8 → 2.0.0

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/dist/index.cjs DELETED
@@ -1,668 +0,0 @@
1
- 'use strict';
2
-
3
- const packrup = require('packrup');
4
-
5
- const SelfClosingTags = /* @__PURE__ */ new Set(["meta", "link", "base"]);
6
- const DupeableTags = /* @__PURE__ */ new Set(["link", "style", "script", "noscript"]);
7
- const TagsWithInnerContent = /* @__PURE__ */ new Set(["title", "titleTemplate", "script", "style", "noscript"]);
8
- const HasElementTags = /* @__PURE__ */ new Set([
9
- "base",
10
- "meta",
11
- "link",
12
- "style",
13
- "script",
14
- "noscript"
15
- ]);
16
- const ValidHeadTags = /* @__PURE__ */ new Set([
17
- "title",
18
- "titleTemplate",
19
- "templateParams",
20
- "base",
21
- "htmlAttrs",
22
- "bodyAttrs",
23
- "meta",
24
- "link",
25
- "style",
26
- "script",
27
- "noscript"
28
- ]);
29
- const UniqueTags = /* @__PURE__ */ new Set(["base", "title", "titleTemplate", "bodyAttrs", "htmlAttrs", "templateParams"]);
30
- const TagConfigKeys = /* @__PURE__ */ new Set(["key", "tagPosition", "tagPriority", "tagDuplicateStrategy", "innerHTML", "textContent", "processTemplateParams"]);
31
- const IsBrowser = typeof window !== "undefined";
32
- const composableNames = [
33
- "useHead",
34
- "useSeoMeta",
35
- "useHeadSafe",
36
- "useServerHead",
37
- "useServerSeoMeta",
38
- "useServerHeadSafe"
39
- ];
40
- const NetworkEvents = /* @__PURE__ */ new Set(["onload", "onerror", "onabort", "onprogress", "onloadstart"]);
41
- const ScriptNetworkEvents = /* @__PURE__ */ new Set(["onload", "onerror"]);
42
-
43
- function defineHeadPlugin(plugin) {
44
- return plugin;
45
- }
46
-
47
- function hashCode(s) {
48
- let h = 9;
49
- for (let i = 0; i < s.length; )
50
- h = Math.imul(h ^ s.charCodeAt(i++), 9 ** 9);
51
- return ((h ^ h >>> 9) + 65536).toString(16).substring(1, 8).toLowerCase();
52
- }
53
- function hashTag(tag) {
54
- if (tag._h) {
55
- return tag._h;
56
- }
57
- if (tag._d) {
58
- return hashCode(tag._d);
59
- }
60
- let content = `${tag.tag}:${tag.textContent || tag.innerHTML || ""}:`;
61
- for (const key in tag.props) {
62
- content += `${key}:${String(tag.props[key])},`;
63
- }
64
- return hashCode(content);
65
- }
66
-
67
- const p = (p2) => ({ keyValue: p2, metaKey: "property" });
68
- const k = (p2) => ({ keyValue: p2 });
69
- const MetaPackingSchema = {
70
- appleItunesApp: {
71
- unpack: {
72
- entrySeparator: ", ",
73
- resolve({ key, value }) {
74
- return `${fixKeyCase(key)}=${value}`;
75
- }
76
- }
77
- },
78
- articleExpirationTime: p("article:expiration_time"),
79
- articleModifiedTime: p("article:modified_time"),
80
- articlePublishedTime: p("article:published_time"),
81
- bookReleaseDate: p("book:release_date"),
82
- charset: {
83
- metaKey: "charset"
84
- },
85
- contentSecurityPolicy: {
86
- unpack: {
87
- entrySeparator: "; ",
88
- resolve({ key, value }) {
89
- return `${fixKeyCase(key)} ${value}`;
90
- }
91
- },
92
- metaKey: "http-equiv"
93
- },
94
- contentType: {
95
- metaKey: "http-equiv"
96
- },
97
- defaultStyle: {
98
- metaKey: "http-equiv"
99
- },
100
- fbAppId: p("fb:app_id"),
101
- msapplicationConfig: k("msapplication-Config"),
102
- msapplicationTileColor: k("msapplication-TileColor"),
103
- msapplicationTileImage: k("msapplication-TileImage"),
104
- ogAudioSecureUrl: p("og:audio:secure_url"),
105
- ogAudioUrl: p("og:audio"),
106
- ogImageSecureUrl: p("og:image:secure_url"),
107
- ogImageUrl: p("og:image"),
108
- ogSiteName: p("og:site_name"),
109
- ogVideoSecureUrl: p("og:video:secure_url"),
110
- ogVideoUrl: p("og:video"),
111
- profileFirstName: p("profile:first_name"),
112
- profileLastName: p("profile:last_name"),
113
- profileUsername: p("profile:username"),
114
- refresh: {
115
- metaKey: "http-equiv",
116
- unpack: {
117
- entrySeparator: ";",
118
- resolve({ key, value }) {
119
- if (key === "seconds")
120
- return `${value}`;
121
- }
122
- }
123
- },
124
- robots: {
125
- unpack: {
126
- entrySeparator: ", ",
127
- resolve({ key, value }) {
128
- if (typeof value === "boolean")
129
- return `${fixKeyCase(key)}`;
130
- else
131
- return `${fixKeyCase(key)}:${value}`;
132
- }
133
- }
134
- },
135
- xUaCompatible: {
136
- metaKey: "http-equiv"
137
- }
138
- };
139
- const openGraphNamespaces = /* @__PURE__ */ new Set([
140
- "og",
141
- "book",
142
- "article",
143
- "profile"
144
- ]);
145
- function resolveMetaKeyType(key) {
146
- const fKey = fixKeyCase(key);
147
- const prefixIndex = fKey.indexOf(":");
148
- if (openGraphNamespaces.has(fKey.substring(0, prefixIndex)))
149
- return "property";
150
- return MetaPackingSchema[key]?.metaKey || "name";
151
- }
152
- function resolveMetaKeyValue(key) {
153
- return MetaPackingSchema[key]?.keyValue || fixKeyCase(key);
154
- }
155
- function fixKeyCase(key) {
156
- const updated = key.replace(/([A-Z])/g, "-$1").toLowerCase();
157
- const prefixIndex = updated.indexOf("-");
158
- const fKey = updated.substring(0, prefixIndex);
159
- if (fKey === "twitter" || openGraphNamespaces.has(fKey))
160
- return key.replace(/([A-Z])/g, ":$1").toLowerCase();
161
- return updated;
162
- }
163
- function changeKeyCasingDeep(input) {
164
- if (Array.isArray(input)) {
165
- return input.map((entry) => changeKeyCasingDeep(entry));
166
- }
167
- if (typeof input !== "object" || Array.isArray(input))
168
- return input;
169
- const output = {};
170
- for (const key in input) {
171
- if (!Object.prototype.hasOwnProperty.call(input, key)) {
172
- continue;
173
- }
174
- output[fixKeyCase(key)] = changeKeyCasingDeep(input[key]);
175
- }
176
- return output;
177
- }
178
- function resolvePackedMetaObjectValue(value, key) {
179
- const definition = MetaPackingSchema[key];
180
- if (key === "refresh")
181
- return `${value.seconds};url=${value.url}`;
182
- return packrup.unpackToString(
183
- changeKeyCasingDeep(value),
184
- {
185
- keyValueSeparator: "=",
186
- entrySeparator: ", ",
187
- resolve({ value: value2, key: key2 }) {
188
- if (value2 === null)
189
- return "";
190
- if (typeof value2 === "boolean")
191
- return `${key2}`;
192
- },
193
- ...definition?.unpack
194
- }
195
- );
196
- }
197
- const ObjectArrayEntries = /* @__PURE__ */ new Set(["og:image", "og:video", "og:audio", "twitter:image"]);
198
- function sanitize(input) {
199
- const out = {};
200
- for (const k2 in input) {
201
- if (!Object.prototype.hasOwnProperty.call(input, k2)) {
202
- continue;
203
- }
204
- const v = input[k2];
205
- if (String(v) !== "false" && k2)
206
- out[k2] = v;
207
- }
208
- return out;
209
- }
210
- function handleObjectEntry(key, v) {
211
- const value = sanitize(v);
212
- const fKey = fixKeyCase(key);
213
- const attr = resolveMetaKeyType(fKey);
214
- if (ObjectArrayEntries.has(fKey)) {
215
- const input = {};
216
- for (const k2 in value) {
217
- if (!Object.prototype.hasOwnProperty.call(value, k2)) {
218
- continue;
219
- }
220
- input[`${key}${k2 === "url" ? "" : `${k2[0].toUpperCase()}${k2.slice(1)}`}`] = value[k2];
221
- }
222
- return unpackMeta(input).sort((a, b) => (a[attr]?.length || 0) - (b[attr]?.length || 0));
223
- }
224
- return [{ [attr]: fKey, ...value }];
225
- }
226
- function unpackMeta(input) {
227
- const extras = [];
228
- const primitives = {};
229
- for (const key in input) {
230
- if (!Object.prototype.hasOwnProperty.call(input, key)) {
231
- continue;
232
- }
233
- const value = input[key];
234
- if (!Array.isArray(value)) {
235
- if (typeof value === "object" && value) {
236
- if (ObjectArrayEntries.has(fixKeyCase(key))) {
237
- extras.push(...handleObjectEntry(key, value));
238
- continue;
239
- }
240
- primitives[key] = sanitize(value);
241
- } else {
242
- primitives[key] = value;
243
- }
244
- continue;
245
- }
246
- for (const v of value) {
247
- extras.push(...typeof v === "string" ? unpackMeta({ [key]: v }) : handleObjectEntry(key, v));
248
- }
249
- }
250
- const meta = packrup.unpackToArray(primitives, {
251
- key({ key }) {
252
- return resolveMetaKeyType(key);
253
- },
254
- value({ key }) {
255
- return key === "charset" ? "charset" : "content";
256
- },
257
- resolveKeyData({ key }) {
258
- return resolveMetaKeyValue(key);
259
- },
260
- resolveValueData({ value, key }) {
261
- if (value === null)
262
- return "_null";
263
- if (typeof value === "object")
264
- return resolvePackedMetaObjectValue(value, key);
265
- return typeof value === "number" ? value.toString() : value;
266
- }
267
- });
268
- return [...extras, ...meta].map((m) => {
269
- if (m.content === "_null")
270
- m.content = null;
271
- return m;
272
- });
273
- }
274
- function packMeta(inputs) {
275
- const mappedPackingSchema = Object.entries(MetaPackingSchema).map(([key, value]) => [key, value.keyValue]);
276
- return packrup.packArray(inputs, {
277
- key: ["name", "property", "httpEquiv", "http-equiv", "charset"],
278
- value: ["content", "charset"],
279
- resolveKey(k2) {
280
- let key = mappedPackingSchema.filter((sk) => sk[1] === k2)?.[0]?.[0] || k2;
281
- const replacer = (_, letter) => letter?.toUpperCase();
282
- key = key.replace(/:([a-z])/g, replacer).replace(/-([a-z])/g, replacer);
283
- return key;
284
- }
285
- });
286
- }
287
-
288
- const allowedMetaProperties = ["name", "property", "http-equiv"];
289
- function tagDedupeKey(tag) {
290
- const { props, tag: tagName } = tag;
291
- if (UniqueTags.has(tagName))
292
- return tagName;
293
- if (tagName === "link" && props.rel === "canonical")
294
- return "canonical";
295
- if (props.charset)
296
- return "charset";
297
- if (props.id) {
298
- return `${tagName}:id:${props.id}`;
299
- }
300
- for (const n of allowedMetaProperties) {
301
- if (props[n] !== undefined) {
302
- return `${tagName}:${n}:${props[n]}`;
303
- }
304
- }
305
- return false;
306
- }
307
-
308
- function normaliseTag(tagName, input, e, normalizedProps) {
309
- const props = normalizedProps || normaliseProps(
310
- // explicitly check for an object
311
- typeof input === "object" && typeof input !== "function" ? { ...input } : { [tagName === "script" || tagName === "noscript" || tagName === "style" ? "innerHTML" : "textContent"]: input },
312
- tagName === "templateParams" || tagName === "titleTemplate"
313
- );
314
- const tag = {
315
- tag: tagName,
316
- props
317
- };
318
- for (const k of TagConfigKeys) {
319
- const val = tag.props[k] !== undefined ? tag.props[k] : e[k];
320
- if (val !== undefined) {
321
- if (!(k === "innerHTML" || k === "textContent") || TagsWithInnerContent.has(tag.tag)) {
322
- tag[k] = val;
323
- }
324
- delete tag.props[k];
325
- }
326
- }
327
- if (tag.key && DupeableTags.has(tag.tag)) {
328
- tag.props["data-hid"] = tag._h = hashCode(tag.key);
329
- }
330
- const generatedKey = tagDedupeKey(tag);
331
- if (generatedKey && !generatedKey.startsWith("meta:og:") && !generatedKey.startsWith("meta:twitter:")) {
332
- delete tag.key;
333
- }
334
- const dedupe = generatedKey || (tag.key ? `${tag.tag}:${tag.key}` : false);
335
- if (dedupe)
336
- tag._d = dedupe;
337
- if (tag.tag === "script") {
338
- if (typeof tag.innerHTML === "object") {
339
- tag.innerHTML = JSON.stringify(tag.innerHTML);
340
- tag.props.type = tag.props.type || "application/json";
341
- }
342
- }
343
- return Array.isArray(tag.props.content) ? tag.props.content.map((v) => ({ ...tag, props: { ...tag.props, content: v } })) : tag;
344
- }
345
- function normaliseStyleClassProps(key, v) {
346
- const sep = key === "class" ? " " : ";";
347
- if (v && typeof v === "object" && !Array.isArray(v)) {
348
- v = Object.entries(v).filter(([, v2]) => v2).map(([k, v2]) => key === "style" ? `${k}:${v2}` : k);
349
- }
350
- return String(Array.isArray(v) ? v.join(sep) : v)?.split(sep).filter((c) => Boolean(c.trim())).join(sep);
351
- }
352
- function normaliseProps(props, virtual = false) {
353
- for (const k in props) {
354
- if (k === "class" || k === "style") {
355
- props[k] = normaliseStyleClassProps(k, props[k]);
356
- continue;
357
- }
358
- if (!virtual && !TagConfigKeys.has(k)) {
359
- if (typeof props[k] === "function" && !String(k).startsWith("on")) {
360
- props[k] = props[k]();
361
- }
362
- const v = String(props[k]);
363
- const isDataKey = k.startsWith("data-");
364
- if (v === "true" || v === "") {
365
- props[k] = isDataKey ? "true" : true;
366
- } else if (!props[k]) {
367
- if (isDataKey && v === "false")
368
- props[k] = "false";
369
- else
370
- delete props[k];
371
- }
372
- }
373
- }
374
- return props;
375
- }
376
- const TagEntityBits = 10;
377
- function normaliseEntryTags(e) {
378
- const tags = [];
379
- const input = e.resolvedInput;
380
- for (const k in input) {
381
- if (!Object.prototype.hasOwnProperty.call(input, k)) {
382
- continue;
383
- }
384
- const v = input[k];
385
- if (v === undefined || !ValidHeadTags.has(k)) {
386
- continue;
387
- }
388
- if (Array.isArray(v)) {
389
- for (const props of v) {
390
- tags.push(normaliseTag(k, props, e));
391
- }
392
- continue;
393
- } else if (typeof v === "function" && k !== "titleTemplate") {
394
- input[k] = v();
395
- continue;
396
- }
397
- tags.push(normaliseTag(k, v, e));
398
- }
399
- return tags.flat().map((t, i) => {
400
- t._e = e._i;
401
- e.mode && (t._m = e.mode);
402
- t._p = (e._i << TagEntityBits) + i;
403
- return t;
404
- });
405
- }
406
-
407
- const WhitelistAttributes = {
408
- htmlAttrs: ["id", "class", "lang", "dir"],
409
- bodyAttrs: ["id", "class"],
410
- meta: ["id", "name", "property", "charset", "content"],
411
- noscript: ["id", "textContent"],
412
- script: ["id", "type", "textContent"],
413
- link: ["id", "color", "crossorigin", "fetchpriority", "href", "hreflang", "imagesrcset", "imagesizes", "integrity", "media", "referrerpolicy", "rel", "sizes", "type"]
414
- };
415
- function acceptDataAttrs(value) {
416
- const filtered = {};
417
- Object.keys(value || {}).filter((a) => a.startsWith("data-")).forEach((a) => {
418
- filtered[a] = value[a];
419
- });
420
- return filtered;
421
- }
422
- function whitelistSafeInput(input) {
423
- const filtered = {};
424
- Object.keys(input).forEach((key) => {
425
- const tagValue = input[key];
426
- if (!tagValue)
427
- return;
428
- switch (key) {
429
- // always safe
430
- case "title":
431
- case "titleTemplate":
432
- case "templateParams":
433
- filtered[key] = tagValue;
434
- break;
435
- case "htmlAttrs":
436
- case "bodyAttrs":
437
- filtered[key] = acceptDataAttrs(tagValue);
438
- WhitelistAttributes[key].forEach((a) => {
439
- if (tagValue[a])
440
- filtered[key][a] = tagValue[a];
441
- });
442
- break;
443
- // meta is safe, except for http-equiv
444
- case "meta":
445
- if (Array.isArray(tagValue)) {
446
- filtered[key] = tagValue.map((meta) => {
447
- const safeMeta = acceptDataAttrs(meta);
448
- WhitelistAttributes.meta.forEach((key2) => {
449
- if (meta[key2])
450
- safeMeta[key2] = meta[key2];
451
- });
452
- return safeMeta;
453
- }).filter((meta) => Object.keys(meta).length > 0);
454
- }
455
- break;
456
- // link tags we don't allow stylesheets, scripts, preloading, prerendering, prefetching, etc
457
- case "link":
458
- if (Array.isArray(tagValue)) {
459
- filtered[key] = tagValue.map((meta) => {
460
- const link = acceptDataAttrs(meta);
461
- WhitelistAttributes.link.forEach((key2) => {
462
- const val = meta[key2];
463
- if (key2 === "rel" && (val === "stylesheet" || val === "canonical" || val === "modulepreload" || val === "prerender" || val === "preload" || val === "prefetch"))
464
- return;
465
- if (key2 === "href") {
466
- if (val.includes("javascript:") || val.includes("data:"))
467
- return;
468
- link[key2] = val;
469
- } else if (val) {
470
- link[key2] = val;
471
- }
472
- });
473
- return link;
474
- }).filter((link) => Object.keys(link).length > 1 && !!link.rel);
475
- }
476
- break;
477
- case "noscript":
478
- if (Array.isArray(tagValue)) {
479
- filtered[key] = tagValue.map((meta) => {
480
- const noscript = acceptDataAttrs(meta);
481
- WhitelistAttributes.noscript.forEach((key2) => {
482
- if (meta[key2])
483
- noscript[key2] = meta[key2];
484
- });
485
- return noscript;
486
- }).filter((meta) => Object.keys(meta).length > 0);
487
- }
488
- break;
489
- // we only allow JSON in scripts
490
- case "script":
491
- if (Array.isArray(tagValue)) {
492
- filtered[key] = tagValue.map((script) => {
493
- const safeScript = acceptDataAttrs(script);
494
- WhitelistAttributes.script.forEach((s) => {
495
- if (script[s]) {
496
- if (s === "textContent") {
497
- try {
498
- const jsonVal = typeof script[s] === "string" ? JSON.parse(script[s]) : script[s];
499
- safeScript[s] = JSON.stringify(jsonVal, null, 0);
500
- } catch {
501
- }
502
- } else {
503
- safeScript[s] = script[s];
504
- }
505
- }
506
- });
507
- return safeScript;
508
- }).filter((meta) => Object.keys(meta).length > 0);
509
- }
510
- break;
511
- }
512
- });
513
- return filtered;
514
- }
515
-
516
- const TAG_WEIGHTS = {
517
- // tags
518
- base: -10,
519
- title: 10
520
- };
521
- const TAG_ALIASES = {
522
- // relative scores to their default values
523
- critical: -80,
524
- high: -10,
525
- low: 20
526
- };
527
- const SortModifiers = [{ prefix: "before:", offset: -1 }, { prefix: "after:", offset: 1 }];
528
- const importRe = /@import/;
529
- const isTruthy = (val) => val === "" || val === true;
530
- function tagWeight(head, tag) {
531
- const priority = tag.tagPriority;
532
- if (typeof priority === "number")
533
- return priority;
534
- const isScript = tag.tag === "script";
535
- const isLink = tag.tag === "link";
536
- const isStyle = tag.tag === "style";
537
- let weight = 100;
538
- if (tag.tag === "meta") {
539
- if (tag.props["http-equiv"] === "content-security-policy")
540
- weight = -30;
541
- else if (tag.props.charset)
542
- weight = -20;
543
- else if (tag.props.name === "viewport")
544
- weight = -15;
545
- } else if (isLink && tag.props.rel === "preconnect") {
546
- weight = 20;
547
- } else if (tag.tag in TAG_WEIGHTS) {
548
- weight = TAG_WEIGHTS[tag.tag];
549
- }
550
- if (priority && priority in TAG_ALIASES) {
551
- return weight + TAG_ALIASES[priority];
552
- }
553
- if (tag.tagPosition && tag.tagPosition !== "head") {
554
- return weight;
555
- }
556
- if (!head.ssr || head.resolvedOptions.disableCapoSorting) {
557
- return weight;
558
- }
559
- if (isScript && isTruthy(tag.props.async)) {
560
- weight = 30;
561
- } else if (isStyle && tag.innerHTML && importRe.test(tag.innerHTML)) {
562
- weight = 40;
563
- } else if (isScript && tag.props.src && !isTruthy(tag.props.defer) && !isTruthy(tag.props.async) && tag.props.type !== "module" && !tag.props.type?.endsWith("json")) {
564
- weight = 50;
565
- } else if (isLink && tag.props.rel === "stylesheet" || tag.tag === "style") {
566
- weight = 60;
567
- } else if (isLink && (tag.props.rel === "preload" || tag.props.rel === "modulepreload")) {
568
- weight = 70;
569
- } else if (isScript && isTruthy(tag.props.defer) && tag.props.src && !isTruthy(tag.props.async)) {
570
- weight = 80;
571
- } else if (isLink && (tag.props.rel === "prefetch" || tag.props.rel === "dns-prefetch" || tag.props.rel === "prerender")) {
572
- weight = 90;
573
- }
574
- return weight;
575
- }
576
-
577
- const sepSub = "%separator";
578
- function sub(p, token, isJson = false) {
579
- let val;
580
- if (token === "s" || token === "pageTitle") {
581
- val = p.pageTitle;
582
- } else if (token.includes(".")) {
583
- const dotIndex = token.indexOf(".");
584
- val = p[token.substring(0, dotIndex)]?.[token.substring(dotIndex + 1)];
585
- } else {
586
- val = p[token];
587
- }
588
- if (val !== undefined) {
589
- return isJson ? (val || "").replace(/"/g, '\\"') : val || "";
590
- }
591
- return undefined;
592
- }
593
- const sepSubRe = new RegExp(`${sepSub}(?:\\s*${sepSub})*`, "g");
594
- function processTemplateParams(s, p, sep, isJson = false) {
595
- if (typeof s !== "string" || !s.includes("%"))
596
- return s;
597
- let decoded = s;
598
- try {
599
- decoded = decodeURI(s);
600
- } catch {
601
- }
602
- const tokens = decoded.match(/%\w+(?:\.\w+)?/g);
603
- if (!tokens) {
604
- return s;
605
- }
606
- const hasSepSub = s.includes(sepSub);
607
- s = s.replace(/%\w+(?:\.\w+)?/g, (token) => {
608
- if (token === sepSub || !tokens.includes(token)) {
609
- return token;
610
- }
611
- const re = sub(p, token.slice(1), isJson);
612
- return re !== undefined ? re : token;
613
- }).trim();
614
- if (hasSepSub) {
615
- if (s.endsWith(sepSub))
616
- s = s.slice(0, -sepSub.length);
617
- if (s.startsWith(sepSub))
618
- s = s.slice(sepSub.length);
619
- s = s.replace(sepSubRe, sep).trim();
620
- }
621
- return s;
622
- }
623
-
624
- function resolveTitleTemplate(template, title) {
625
- if (template == null)
626
- return title || null;
627
- if (typeof template === "function")
628
- return template(title);
629
- return template;
630
- }
631
-
632
- function asArray(value) {
633
- return Array.isArray(value) ? value : [value];
634
- }
635
-
636
- exports.DupeableTags = DupeableTags;
637
- exports.HasElementTags = HasElementTags;
638
- exports.IsBrowser = IsBrowser;
639
- exports.NetworkEvents = NetworkEvents;
640
- exports.ScriptNetworkEvents = ScriptNetworkEvents;
641
- exports.SelfClosingTags = SelfClosingTags;
642
- exports.SortModifiers = SortModifiers;
643
- exports.TAG_ALIASES = TAG_ALIASES;
644
- exports.TAG_WEIGHTS = TAG_WEIGHTS;
645
- exports.TagConfigKeys = TagConfigKeys;
646
- exports.TagEntityBits = TagEntityBits;
647
- exports.TagsWithInnerContent = TagsWithInnerContent;
648
- exports.UniqueTags = UniqueTags;
649
- exports.ValidHeadTags = ValidHeadTags;
650
- exports.asArray = asArray;
651
- exports.composableNames = composableNames;
652
- exports.defineHeadPlugin = defineHeadPlugin;
653
- exports.hashCode = hashCode;
654
- exports.hashTag = hashTag;
655
- exports.normaliseEntryTags = normaliseEntryTags;
656
- exports.normaliseProps = normaliseProps;
657
- exports.normaliseStyleClassProps = normaliseStyleClassProps;
658
- exports.normaliseTag = normaliseTag;
659
- exports.packMeta = packMeta;
660
- exports.processTemplateParams = processTemplateParams;
661
- exports.resolveMetaKeyType = resolveMetaKeyType;
662
- exports.resolveMetaKeyValue = resolveMetaKeyValue;
663
- exports.resolvePackedMetaObjectValue = resolvePackedMetaObjectValue;
664
- exports.resolveTitleTemplate = resolveTitleTemplate;
665
- exports.tagDedupeKey = tagDedupeKey;
666
- exports.tagWeight = tagWeight;
667
- exports.unpackMeta = unpackMeta;
668
- exports.whitelistSafeInput = whitelistSafeInput;