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 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
- return { props, eventHandlers };
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?.addEventListener(eventName, handler);
489
+ $el.setAttribute(eventDedupeKey, "");
490
+ $eventListenerTarget.addEventListener(eventName, handler);
479
491
  ctx.entry._sde[sdeKey] = () => {
480
- $el.removeEventListener(eventName, handler);
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
- export { Arrayable, DedupesTagsPlugin, DedupesTagsPluginOptions, DeprecatedTagAttrPlugin, EventHandlersPlugin, PatchDomOnEntryUpdatesPlugin, ProvideTagHashPlugin, SortTagsPlugin, TitleTemplatePlugin, activeHead, asArray, createHead, defineHeadPlugin, getActiveHead, normaliseEntryTags, setActiveHead, useBodyAttrs, useHead, useHtmlAttrs, useServerBodyAttrs, useServerHead, useServerHtmlAttrs, useServerTagBase, useServerTagLink, useServerTagMeta, useServerTagMetaFlat, useServerTagNoscript, useServerTagScript, useServerTagStyle, useServerTagTitle, useServerTitleTemplate, useTagBase, useTagLink, useTagMeta, useTagMetaFlat, useTagNoscript, useTagScript, useTagStyle, useTagTitle, useTitleTemplate };
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
- return { props, eventHandlers };
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?.addEventListener(eventName, handler);
487
+ $el.setAttribute(eventDedupeKey, "");
488
+ $eventListenerTarget.addEventListener(eventName, handler);
477
489
  ctx.entry._sde[sdeKey] = () => {
478
- $el.removeEventListener(eventName, handler);
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
- export { DedupesTagsPlugin, DeprecatedTagAttrPlugin, EventHandlersPlugin, PatchDomOnEntryUpdatesPlugin, ProvideTagHashPlugin, SortTagsPlugin, TitleTemplatePlugin, activeHead, asArray, createHead, defineHeadPlugin, getActiveHead, normaliseEntryTags, setActiveHead, useBodyAttrs, useHead, useHtmlAttrs, useServerBodyAttrs, useServerHead, useServerHtmlAttrs, useServerTagBase, useServerTagLink, useServerTagMeta, useServerTagMetaFlat, useServerTagNoscript, useServerTagScript, useServerTagStyle, useServerTagTitle, useServerTitleTemplate, useTagBase, useTagLink, useTagMeta, useTagMetaFlat, useTagNoscript, useTagScript, useTagStyle, useTagTitle, useTitleTemplate };
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.8",
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.4.8",
34
- "@unhead/schema": "0.4.8",
33
+ "@unhead/dom": "0.6.0",
34
+ "@unhead/schema": "0.6.0",
35
35
  "hookable": "^5.4.1"
36
36
  },
37
37
  "devDependencies": {