unhead 0.4.8 → 0.6.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 +60 -7
- package/dist/index.d.ts +7 -1
- package/dist/index.mjs +59 -8
- package/package.json +3 -3
package/dist/index.cjs
CHANGED
|
@@ -441,7 +441,7 @@ const PatchDomOnEntryUpdatesPlugin = (options) => {
|
|
|
441
441
|
};
|
|
442
442
|
|
|
443
443
|
const EventHandlersPlugin = () => {
|
|
444
|
-
const stripEventHandlers = (tag) => {
|
|
444
|
+
const stripEventHandlers = (mode, tag) => {
|
|
445
445
|
const props = {};
|
|
446
446
|
const eventHandlers = {};
|
|
447
447
|
Object.entries(tag.props).forEach(([key, value]) => {
|
|
@@ -450,37 +450,52 @@ const EventHandlersPlugin = () => {
|
|
|
450
450
|
else
|
|
451
451
|
props[key] = value;
|
|
452
452
|
});
|
|
453
|
-
|
|
453
|
+
let delayedSrc;
|
|
454
|
+
if (mode === "dom" && tag.tag === "script" && typeof props.src === "string" && typeof eventHandlers.onload !== "undefined") {
|
|
455
|
+
delayedSrc = props.src;
|
|
456
|
+
delete props.src;
|
|
457
|
+
}
|
|
458
|
+
return { props, eventHandlers, delayedSrc };
|
|
454
459
|
};
|
|
455
460
|
return defineHeadPlugin({
|
|
456
461
|
hooks: {
|
|
457
462
|
"ssr:render": function(ctx) {
|
|
458
463
|
ctx.tags = ctx.tags.map((tag) => {
|
|
459
|
-
tag.props = stripEventHandlers(tag).props;
|
|
464
|
+
tag.props = stripEventHandlers("ssr", tag).props;
|
|
460
465
|
return tag;
|
|
461
466
|
});
|
|
462
467
|
},
|
|
463
468
|
"dom:beforeRenderTag": function(ctx) {
|
|
464
|
-
const { props, eventHandlers } = stripEventHandlers(ctx.tag);
|
|
469
|
+
const { props, eventHandlers, delayedSrc } = stripEventHandlers("dom", ctx.tag);
|
|
465
470
|
if (!Object.keys(eventHandlers).length)
|
|
466
471
|
return;
|
|
467
472
|
ctx.tag.props = props;
|
|
468
473
|
ctx.tag._eventHandlers = eventHandlers;
|
|
474
|
+
ctx.tag._delayedSrc = delayedSrc;
|
|
469
475
|
},
|
|
470
476
|
"dom:renderTag": function(ctx) {
|
|
471
477
|
const $el = ctx.$el;
|
|
472
478
|
if (!ctx.tag._eventHandlers || !$el)
|
|
473
479
|
return;
|
|
480
|
+
const $eventListenerTarget = ctx.tag.tag === "bodyAttrs" && typeof window !== "undefined" ? window : $el;
|
|
474
481
|
Object.entries(ctx.tag._eventHandlers).forEach(([k, value]) => {
|
|
475
482
|
const sdeKey = `${ctx.tag._d || ctx.tag._p}:${k}`;
|
|
476
483
|
const eventName = k.slice(2).toLowerCase();
|
|
484
|
+
const eventDedupeKey = `data-h-${eventName}`;
|
|
485
|
+
delete ctx.queuedSideEffects[sdeKey];
|
|
486
|
+
if ($el.hasAttribute(eventDedupeKey))
|
|
487
|
+
return;
|
|
477
488
|
const handler = value;
|
|
478
|
-
$el
|
|
489
|
+
$el.setAttribute(eventDedupeKey, "");
|
|
490
|
+
$eventListenerTarget.addEventListener(eventName, handler);
|
|
479
491
|
ctx.entry._sde[sdeKey] = () => {
|
|
480
|
-
$
|
|
492
|
+
$eventListenerTarget.removeEventListener(eventName, handler);
|
|
493
|
+
$el.removeAttribute(eventDedupeKey);
|
|
481
494
|
};
|
|
482
|
-
delete ctx.queuedSideEffects[sdeKey];
|
|
483
495
|
});
|
|
496
|
+
if (ctx.tag._delayedSrc) {
|
|
497
|
+
$el.setAttribute("src", ctx.tag._delayedSrc);
|
|
498
|
+
}
|
|
484
499
|
}
|
|
485
500
|
}
|
|
486
501
|
});
|
|
@@ -675,6 +690,42 @@ function defineHeadPlugin(plugin) {
|
|
|
675
690
|
return plugin;
|
|
676
691
|
}
|
|
677
692
|
|
|
693
|
+
const coreComposableNames = [
|
|
694
|
+
"getActiveHead"
|
|
695
|
+
];
|
|
696
|
+
const composableNames = [
|
|
697
|
+
"useHead",
|
|
698
|
+
"useTagTitle",
|
|
699
|
+
"useTagBase",
|
|
700
|
+
"useTagMeta",
|
|
701
|
+
"useTagMetaFlat",
|
|
702
|
+
"useTagLink",
|
|
703
|
+
"useTagScript",
|
|
704
|
+
"useTagStyle",
|
|
705
|
+
"useTagNoscript",
|
|
706
|
+
"useHtmlAttrs",
|
|
707
|
+
"useBodyAttrs",
|
|
708
|
+
"useTitleTemplate",
|
|
709
|
+
"useServerHead",
|
|
710
|
+
"useServerTagTitle",
|
|
711
|
+
"useServerTagBase",
|
|
712
|
+
"useServerTagMeta",
|
|
713
|
+
"useServerTagMetaFlat",
|
|
714
|
+
"useServerTagLink",
|
|
715
|
+
"useServerTagScript",
|
|
716
|
+
"useServerTagStyle",
|
|
717
|
+
"useServerTagNoscript",
|
|
718
|
+
"useServerHtmlAttrs",
|
|
719
|
+
"useServerBodyAttrs",
|
|
720
|
+
"useServerTitleTemplate"
|
|
721
|
+
];
|
|
722
|
+
const unheadComposablesImports = [
|
|
723
|
+
{
|
|
724
|
+
from: "unhead",
|
|
725
|
+
imports: [...coreComposableNames, ...composableNames]
|
|
726
|
+
}
|
|
727
|
+
];
|
|
728
|
+
|
|
678
729
|
exports.DedupesTagsPlugin = DedupesTagsPlugin;
|
|
679
730
|
exports.DeprecatedTagAttrPlugin = DeprecatedTagAttrPlugin;
|
|
680
731
|
exports.EventHandlersPlugin = EventHandlersPlugin;
|
|
@@ -683,11 +734,13 @@ exports.ProvideTagHashPlugin = ProvideTagHashPlugin;
|
|
|
683
734
|
exports.SortTagsPlugin = SortTagsPlugin;
|
|
684
735
|
exports.TitleTemplatePlugin = TitleTemplatePlugin;
|
|
685
736
|
exports.asArray = asArray;
|
|
737
|
+
exports.composableNames = composableNames;
|
|
686
738
|
exports.createHead = createHead;
|
|
687
739
|
exports.defineHeadPlugin = defineHeadPlugin;
|
|
688
740
|
exports.getActiveHead = getActiveHead;
|
|
689
741
|
exports.normaliseEntryTags = normaliseEntryTags;
|
|
690
742
|
exports.setActiveHead = setActiveHead;
|
|
743
|
+
exports.unheadComposablesImports = unheadComposablesImports;
|
|
691
744
|
exports.useBodyAttrs = useBodyAttrs;
|
|
692
745
|
exports.useHead = useHead;
|
|
693
746
|
exports.useHtmlAttrs = useHtmlAttrs;
|
package/dist/index.d.ts
CHANGED
|
@@ -66,4 +66,10 @@ declare function defineHeadPlugin(plugin: HeadPlugin): HeadPlugin;
|
|
|
66
66
|
|
|
67
67
|
declare function normaliseEntryTags<T extends {} = Head>(e: HeadEntry<T>): HeadTag[];
|
|
68
68
|
|
|
69
|
-
|
|
69
|
+
declare const composableNames: string[];
|
|
70
|
+
declare const unheadComposablesImports: {
|
|
71
|
+
from: string;
|
|
72
|
+
imports: string[];
|
|
73
|
+
}[];
|
|
74
|
+
|
|
75
|
+
export { Arrayable, DedupesTagsPlugin, DedupesTagsPluginOptions, DeprecatedTagAttrPlugin, EventHandlersPlugin, PatchDomOnEntryUpdatesPlugin, ProvideTagHashPlugin, SortTagsPlugin, TitleTemplatePlugin, activeHead, asArray, composableNames, createHead, defineHeadPlugin, getActiveHead, normaliseEntryTags, setActiveHead, unheadComposablesImports, useBodyAttrs, useHead, useHtmlAttrs, useServerBodyAttrs, useServerHead, useServerHtmlAttrs, useServerTagBase, useServerTagLink, useServerTagMeta, useServerTagMetaFlat, useServerTagNoscript, useServerTagScript, useServerTagStyle, useServerTagTitle, useServerTitleTemplate, useTagBase, useTagLink, useTagMeta, useTagMetaFlat, useTagNoscript, useTagScript, useTagStyle, useTagTitle, useTitleTemplate };
|
package/dist/index.mjs
CHANGED
|
@@ -439,7 +439,7 @@ const PatchDomOnEntryUpdatesPlugin = (options) => {
|
|
|
439
439
|
};
|
|
440
440
|
|
|
441
441
|
const EventHandlersPlugin = () => {
|
|
442
|
-
const stripEventHandlers = (tag) => {
|
|
442
|
+
const stripEventHandlers = (mode, tag) => {
|
|
443
443
|
const props = {};
|
|
444
444
|
const eventHandlers = {};
|
|
445
445
|
Object.entries(tag.props).forEach(([key, value]) => {
|
|
@@ -448,37 +448,52 @@ const EventHandlersPlugin = () => {
|
|
|
448
448
|
else
|
|
449
449
|
props[key] = value;
|
|
450
450
|
});
|
|
451
|
-
|
|
451
|
+
let delayedSrc;
|
|
452
|
+
if (mode === "dom" && tag.tag === "script" && typeof props.src === "string" && typeof eventHandlers.onload !== "undefined") {
|
|
453
|
+
delayedSrc = props.src;
|
|
454
|
+
delete props.src;
|
|
455
|
+
}
|
|
456
|
+
return { props, eventHandlers, delayedSrc };
|
|
452
457
|
};
|
|
453
458
|
return defineHeadPlugin({
|
|
454
459
|
hooks: {
|
|
455
460
|
"ssr:render": function(ctx) {
|
|
456
461
|
ctx.tags = ctx.tags.map((tag) => {
|
|
457
|
-
tag.props = stripEventHandlers(tag).props;
|
|
462
|
+
tag.props = stripEventHandlers("ssr", tag).props;
|
|
458
463
|
return tag;
|
|
459
464
|
});
|
|
460
465
|
},
|
|
461
466
|
"dom:beforeRenderTag": function(ctx) {
|
|
462
|
-
const { props, eventHandlers } = stripEventHandlers(ctx.tag);
|
|
467
|
+
const { props, eventHandlers, delayedSrc } = stripEventHandlers("dom", ctx.tag);
|
|
463
468
|
if (!Object.keys(eventHandlers).length)
|
|
464
469
|
return;
|
|
465
470
|
ctx.tag.props = props;
|
|
466
471
|
ctx.tag._eventHandlers = eventHandlers;
|
|
472
|
+
ctx.tag._delayedSrc = delayedSrc;
|
|
467
473
|
},
|
|
468
474
|
"dom:renderTag": function(ctx) {
|
|
469
475
|
const $el = ctx.$el;
|
|
470
476
|
if (!ctx.tag._eventHandlers || !$el)
|
|
471
477
|
return;
|
|
478
|
+
const $eventListenerTarget = ctx.tag.tag === "bodyAttrs" && typeof window !== "undefined" ? window : $el;
|
|
472
479
|
Object.entries(ctx.tag._eventHandlers).forEach(([k, value]) => {
|
|
473
480
|
const sdeKey = `${ctx.tag._d || ctx.tag._p}:${k}`;
|
|
474
481
|
const eventName = k.slice(2).toLowerCase();
|
|
482
|
+
const eventDedupeKey = `data-h-${eventName}`;
|
|
483
|
+
delete ctx.queuedSideEffects[sdeKey];
|
|
484
|
+
if ($el.hasAttribute(eventDedupeKey))
|
|
485
|
+
return;
|
|
475
486
|
const handler = value;
|
|
476
|
-
$el
|
|
487
|
+
$el.setAttribute(eventDedupeKey, "");
|
|
488
|
+
$eventListenerTarget.addEventListener(eventName, handler);
|
|
477
489
|
ctx.entry._sde[sdeKey] = () => {
|
|
478
|
-
$
|
|
490
|
+
$eventListenerTarget.removeEventListener(eventName, handler);
|
|
491
|
+
$el.removeAttribute(eventDedupeKey);
|
|
479
492
|
};
|
|
480
|
-
delete ctx.queuedSideEffects[sdeKey];
|
|
481
493
|
});
|
|
494
|
+
if (ctx.tag._delayedSrc) {
|
|
495
|
+
$el.setAttribute("src", ctx.tag._delayedSrc);
|
|
496
|
+
}
|
|
482
497
|
}
|
|
483
498
|
}
|
|
484
499
|
});
|
|
@@ -673,4 +688,40 @@ function defineHeadPlugin(plugin) {
|
|
|
673
688
|
return plugin;
|
|
674
689
|
}
|
|
675
690
|
|
|
676
|
-
|
|
691
|
+
const coreComposableNames = [
|
|
692
|
+
"getActiveHead"
|
|
693
|
+
];
|
|
694
|
+
const composableNames = [
|
|
695
|
+
"useHead",
|
|
696
|
+
"useTagTitle",
|
|
697
|
+
"useTagBase",
|
|
698
|
+
"useTagMeta",
|
|
699
|
+
"useTagMetaFlat",
|
|
700
|
+
"useTagLink",
|
|
701
|
+
"useTagScript",
|
|
702
|
+
"useTagStyle",
|
|
703
|
+
"useTagNoscript",
|
|
704
|
+
"useHtmlAttrs",
|
|
705
|
+
"useBodyAttrs",
|
|
706
|
+
"useTitleTemplate",
|
|
707
|
+
"useServerHead",
|
|
708
|
+
"useServerTagTitle",
|
|
709
|
+
"useServerTagBase",
|
|
710
|
+
"useServerTagMeta",
|
|
711
|
+
"useServerTagMetaFlat",
|
|
712
|
+
"useServerTagLink",
|
|
713
|
+
"useServerTagScript",
|
|
714
|
+
"useServerTagStyle",
|
|
715
|
+
"useServerTagNoscript",
|
|
716
|
+
"useServerHtmlAttrs",
|
|
717
|
+
"useServerBodyAttrs",
|
|
718
|
+
"useServerTitleTemplate"
|
|
719
|
+
];
|
|
720
|
+
const unheadComposablesImports = [
|
|
721
|
+
{
|
|
722
|
+
from: "unhead",
|
|
723
|
+
imports: [...coreComposableNames, ...composableNames]
|
|
724
|
+
}
|
|
725
|
+
];
|
|
726
|
+
|
|
727
|
+
export { DedupesTagsPlugin, DeprecatedTagAttrPlugin, EventHandlersPlugin, PatchDomOnEntryUpdatesPlugin, ProvideTagHashPlugin, SortTagsPlugin, TitleTemplatePlugin, activeHead, asArray, composableNames, createHead, defineHeadPlugin, getActiveHead, normaliseEntryTags, setActiveHead, unheadComposablesImports, useBodyAttrs, useHead, useHtmlAttrs, useServerBodyAttrs, useServerHead, useServerHtmlAttrs, useServerTagBase, useServerTagLink, useServerTagMeta, useServerTagMetaFlat, useServerTagNoscript, useServerTagScript, useServerTagStyle, useServerTagTitle, useServerTitleTemplate, useTagBase, useTagLink, useTagMeta, useTagMetaFlat, useTagNoscript, useTagScript, useTagStyle, useTagTitle, useTitleTemplate };
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "unhead",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.6.0",
|
|
5
5
|
"packageManager": "pnpm@7.14.0",
|
|
6
6
|
"author": "Harlan Wilton <harlan@harlanzw.com>",
|
|
7
7
|
"license": "MIT",
|
|
@@ -30,8 +30,8 @@
|
|
|
30
30
|
"dist"
|
|
31
31
|
],
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"@unhead/dom": "0.
|
|
34
|
-
"@unhead/schema": "0.
|
|
33
|
+
"@unhead/dom": "0.6.0",
|
|
34
|
+
"@unhead/schema": "0.6.0",
|
|
35
35
|
"hookable": "^5.4.1"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|