@unhead/vue 0.6.4 → 0.6.6

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.
@@ -61,7 +61,8 @@ async function renderDOMHead(head, options = {}) {
61
61
  const tagRenderId = tag._d || tag._p;
62
62
  const markSideEffect = (key, fn) => {
63
63
  key = `${tagRenderId}:${key}`;
64
- entry._sde[key] = fn;
64
+ if (entry)
65
+ entry._sde[key] = fn;
65
66
  delete staleSideEffects[key];
66
67
  };
67
68
  const setAttrs = ($el, sideEffects = true) => {
@@ -140,7 +141,7 @@ async function renderDOMHead(head, options = {}) {
140
141
  return $newEl;
141
142
  };
142
143
  for (const tag of await head.resolveTags()) {
143
- const entry = head.headEntries().find((e) => e._i === Number(tag._e));
144
+ const entry = head.headEntries().find((e) => e._i === tag._e);
144
145
  const renderCtx = { $el: null, shouldRender: true, tag, entry, queuedSideEffects: staleSideEffects };
145
146
  await head.hooks.callHook("dom:beforeRenderTag", renderCtx);
146
147
  if (!renderCtx.shouldRender)
@@ -59,7 +59,8 @@ async function renderDOMHead(head, options = {}) {
59
59
  const tagRenderId = tag._d || tag._p;
60
60
  const markSideEffect = (key, fn) => {
61
61
  key = `${tagRenderId}:${key}`;
62
- entry._sde[key] = fn;
62
+ if (entry)
63
+ entry._sde[key] = fn;
63
64
  delete staleSideEffects[key];
64
65
  };
65
66
  const setAttrs = ($el, sideEffects = true) => {
@@ -138,7 +139,7 @@ async function renderDOMHead(head, options = {}) {
138
139
  return $newEl;
139
140
  };
140
141
  for (const tag of await head.resolveTags()) {
141
- const entry = head.headEntries().find((e) => e._i === Number(tag._e));
142
+ const entry = head.headEntries().find((e) => e._i === tag._e);
142
143
  const renderCtx = { $el: null, shouldRender: true, tag, entry, queuedSideEffects: staleSideEffects };
143
144
  await head.hooks.callHook("dom:beforeRenderTag", renderCtx);
144
145
  if (!renderCtx.shouldRender)
package/dist/index.cjs CHANGED
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- const vue = require('vue');
4
3
  const hookable = require('hookable');
4
+ const vue = require('vue');
5
5
 
6
6
  const ValidHeadTags = [
7
7
  "title",
@@ -351,10 +351,12 @@ const EventHandlersPlugin = () => {
351
351
  const handler = value;
352
352
  $el.setAttribute(eventDedupeKey, "");
353
353
  $eventListenerTarget.addEventListener(eventName, handler);
354
- ctx.entry._sde[sdeKey] = () => {
355
- $eventListenerTarget.removeEventListener(eventName, handler);
356
- $el.removeAttribute(eventDedupeKey);
357
- };
354
+ if (ctx.entry) {
355
+ ctx.entry._sde[sdeKey] = () => {
356
+ $eventListenerTarget.removeEventListener(eventName, handler);
357
+ $el.removeAttribute(eventDedupeKey);
358
+ };
359
+ }
358
360
  });
359
361
  if (ctx.tag._delayedSrc) {
360
362
  $el.setAttribute("src", ctx.tag._delayedSrc);
@@ -398,7 +400,26 @@ function normaliseEntryTags(e) {
398
400
  });
399
401
  }
400
402
 
403
+ const CorePlugins = () => [
404
+ DedupesTagsPlugin(),
405
+ SortTagsPlugin(),
406
+ TitleTemplatePlugin(),
407
+ ProvideTagHashPlugin(),
408
+ EventHandlersPlugin(),
409
+ DeprecatedTagAttrPlugin()
410
+ ];
411
+ const DOMPlugins = (options = {}) => [
412
+ PatchDomOnEntryUpdatesPlugin({ document: options?.document, delayFn: options?.domDelayFn })
413
+ ];
401
414
  function createHead$1(options = {}) {
415
+ const head = createHeadCore({
416
+ ...options,
417
+ plugins: [...DOMPlugins(options), ...options?.plugins || []]
418
+ });
419
+ setActiveHead(head);
420
+ return head;
421
+ }
422
+ function createHeadCore(options = {}) {
402
423
  let entries = [];
403
424
  let _sde = {};
404
425
  let _eid = 0;
@@ -406,13 +427,7 @@ function createHead$1(options = {}) {
406
427
  if (options?.hooks)
407
428
  hooks.addHooks(options.hooks);
408
429
  options.plugins = [
409
- DeprecatedTagAttrPlugin(),
410
- DedupesTagsPlugin(),
411
- SortTagsPlugin(),
412
- TitleTemplatePlugin(),
413
- EventHandlersPlugin(),
414
- ProvideTagHashPlugin(),
415
- PatchDomOnEntryUpdatesPlugin({ document: options?.document, delayFn: options?.domDelayFn }),
430
+ ...CorePlugins(),
416
431
  ...options?.plugins || []
417
432
  ];
418
433
  options.plugins.forEach((p) => p.hooks && hooks.addHooks(p.hooks));
@@ -482,7 +497,6 @@ function createHead$1(options = {}) {
482
497
  }
483
498
  };
484
499
  head.hooks.callHook("init", head);
485
- setActiveHead(head);
486
500
  return head;
487
501
  }
488
502
 
@@ -495,6 +509,7 @@ const composableNames = [
495
509
  "useTagBase",
496
510
  "useTagMeta",
497
511
  "useTagMetaFlat",
512
+ "useSeoMeta",
498
513
  "useTagLink",
499
514
  "useTagScript",
500
515
  "useTagStyle",
@@ -526,14 +541,17 @@ function resolveUnrefHeadInput(ref, lastKey = "") {
526
541
  if (Array.isArray(root))
527
542
  return root.map((r) => resolveUnrefHeadInput(r, lastKey));
528
543
  if (typeof root === "object") {
544
+ let dynamic = false;
529
545
  const unrefdObj = Object.fromEntries(
530
- Object.entries(root).map(([key, value]) => {
531
- if (key === "titleTemplate" || key.startsWith("on"))
532
- return [key, vue.unref(value)];
533
- return [key, resolveUnrefHeadInput(value, key)];
546
+ Object.entries(root).map(([k, v]) => {
547
+ if (k === "titleTemplate" || k.startsWith("on"))
548
+ return [k, vue.unref(v)];
549
+ if (typeof v === "function" || vue.isRef(v))
550
+ dynamic = true;
551
+ return [k, resolveUnrefHeadInput(v, k)];
534
552
  })
535
553
  );
536
- if (HasElementTags.includes(String(lastKey)) && JSON.stringify(unrefdObj) !== JSON.stringify(root))
554
+ if (dynamic && HasElementTags.includes(String(lastKey)))
537
555
  unrefdObj._dynamic = true;
538
556
  return unrefdObj;
539
557
  }
@@ -551,14 +569,13 @@ function injectHead() {
551
569
  return vue.getCurrentInstance() && vue.inject(headSymbol) || getActiveHead();
552
570
  }
553
571
  function createHead(options = {}) {
554
- const plugins = [
555
- VueReactiveUseHeadPlugin(),
556
- ...options?.plugins || []
557
- ];
558
572
  const head = createHead$1({
559
573
  ...options,
560
574
  domDelayFn: (fn) => setTimeout(() => vue.nextTick(() => fn()), 10),
561
- plugins
575
+ plugins: [
576
+ VueReactiveUseHeadPlugin(),
577
+ ...options?.plugins || []
578
+ ]
562
579
  });
563
580
  const vuePlugin = {
564
581
  install(app) {
@@ -816,6 +833,7 @@ const useTagMetaFlat = (meta) => {
816
833
  });
817
834
  return useHead({ meta: input });
818
835
  };
836
+ const useSeoMeta = useTagMetaFlat;
819
837
  const useTagLink = (link) => useHead({ link: asArray(link) });
820
838
  const useTagScript = (script) => useHead({ script: asArray(script) });
821
839
  const useTagStyle = (style) => useHead({ style: asArray(style) });
@@ -839,6 +857,7 @@ exports.VueHeadMixin = VueHeadMixin;
839
857
  exports.VueReactiveUseHeadPlugin = VueReactiveUseHeadPlugin;
840
858
  exports.asArray = asArray;
841
859
  exports.createHead = createHead;
860
+ exports.createHeadCore = createHeadCore;
842
861
  exports.headSymbol = headSymbol;
843
862
  exports.injectHead = injectHead;
844
863
  exports.resolveUnrefHeadInput = resolveUnrefHeadInput;
@@ -846,6 +865,7 @@ exports.unheadVueComposablesImports = unheadVueComposablesImports;
846
865
  exports.useBodyAttrs = useBodyAttrs;
847
866
  exports.useHead = useHead;
848
867
  exports.useHtmlAttrs = useHtmlAttrs;
868
+ exports.useSeoMeta = useSeoMeta;
849
869
  exports.useServerBodyAttrs = useServerBodyAttrs;
850
870
  exports.useServerHead = useServerHead;
851
871
  exports.useServerHtmlAttrs = useServerHtmlAttrs;
package/dist/index.d.ts CHANGED
@@ -1,8 +1,16 @@
1
1
  import * as _unhead_schema from '@unhead/schema';
2
- import { Title as Title$1, TitleTemplate as TitleTemplate$1, EntryAugmentation, Base as Base$1, Link as Link$1, Meta as Meta$1, Style as Style$1, Script as Script$1, Noscript as Noscript$1, DataKeys, SchemaAugmentations, DefinedValueOrEmptyObject, MergeHead, BaseHtmlAttr, MaybeArray, BaseBodyAttr, Unhead, CreateHeadOptions, HeadEntryOptions, MetaFlatInput, ActiveHeadEntry } from '@unhead/schema';
2
+ import { Head, CreateHeadOptions, Unhead, Title as Title$1, TitleTemplate as TitleTemplate$1, EntryAugmentation, Base as Base$1, Link as Link$1, Meta as Meta$1, Style as Style$1, Script as Script$1, Noscript as Noscript$1, DataKeys, SchemaAugmentations, DefinedValueOrEmptyObject, MergeHead, BaseHtmlAttr, MaybeArray, BaseBodyAttr, HeadEntryOptions, MetaFlatInput, ActiveHeadEntry } from '@unhead/schema';
3
3
  export { ActiveHeadEntry, Head, HeadEntryOptions, HeadTag, MergeHead, Unhead } from '@unhead/schema';
4
4
  import { ComputedRef, Ref, Plugin } from 'vue';
5
5
 
6
+ /**
7
+ * Creates a core instance of unhead. Does not provide a global ctx for composables to work
8
+ * and does not register DOM plugins.
9
+ *
10
+ * @param options
11
+ */
12
+ declare function createHeadCore<T extends {} = Head>(options?: CreateHeadOptions): Unhead<T>;
13
+
6
14
  declare type MaybeReadonlyRef<T> = (() => T) | ComputedRef<T>;
7
15
  declare type MaybeComputedRef<T> = T | MaybeReadonlyRef<T> | Ref<T>;
8
16
  declare type MaybeComputedRefEntries<T> = MaybeComputedRef<T> | {
@@ -138,6 +146,7 @@ declare const useTagTitle: (title: ReactiveHead['title']) => void | ActiveHeadEn
138
146
  declare const useTitleTemplate: (titleTemplate: ReactiveHead['titleTemplate']) => void | ActiveHeadEntry<UseHeadInput<MergeHead>>;
139
147
  declare const useTagMeta: (meta: Arrayable<Meta>) => void | ActiveHeadEntry<UseHeadInput<MergeHead>>;
140
148
  declare const useTagMetaFlat: (meta: MaybeComputedRefEntries<MetaFlatInput>) => void | ActiveHeadEntry<UseHeadInput<MergeHead>>;
149
+ declare const useSeoMeta: (meta: MaybeComputedRefEntries<MetaFlatInput>) => void | ActiveHeadEntry<UseHeadInput<MergeHead>>;
141
150
  declare const useTagLink: (link: Arrayable<Link>) => void | ActiveHeadEntry<UseHeadInput<MergeHead>>;
142
151
  declare const useTagScript: (script: Arrayable<Script>) => void | ActiveHeadEntry<UseHeadInput<MergeHead>>;
143
152
  declare const useTagStyle: (style: Arrayable<Style>) => void | ActiveHeadEntry<UseHeadInput<MergeHead>>;
@@ -151,4 +160,4 @@ declare const unheadVueComposablesImports: {
151
160
  imports: string[];
152
161
  }[];
153
162
 
154
- export { Arrayable, Base, BodyAttributes, HtmlAttributes, Link, MaybeComputedRef, MaybeComputedRefEntries, MaybeReadonlyRef, Meta, Noscript, ReactiveHead, Script, Style, Title, TitleTemplate, UseHeadInput, Vue2ProvideUnheadPlugin, VueHeadClient, VueHeadMixin, VueReactiveUseHeadPlugin, asArray, createHead, headSymbol, injectHead, resolveUnrefHeadInput, unheadVueComposablesImports, useBodyAttrs, useHead, useHtmlAttrs, useServerBodyAttrs, useServerHead, useServerHtmlAttrs, useServerTagBase, useServerTagLink, useServerTagMeta, useServerTagMetaFlat, useServerTagNoscript, useServerTagScript, useServerTagStyle, useServerTagTitle, useServerTitleTemplate, useTagBase, useTagLink, useTagMeta, useTagMetaFlat, useTagNoscript, useTagScript, useTagStyle, useTagTitle, useTitleTemplate };
163
+ export { Arrayable, Base, BodyAttributes, HtmlAttributes, Link, MaybeComputedRef, MaybeComputedRefEntries, MaybeReadonlyRef, Meta, Noscript, ReactiveHead, Script, Style, Title, TitleTemplate, UseHeadInput, Vue2ProvideUnheadPlugin, VueHeadClient, VueHeadMixin, VueReactiveUseHeadPlugin, asArray, createHead, createHeadCore, headSymbol, injectHead, resolveUnrefHeadInput, unheadVueComposablesImports, useBodyAttrs, useHead, useHtmlAttrs, useSeoMeta, 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
@@ -1,5 +1,5 @@
1
- import { unref, version, getCurrentInstance, inject, nextTick, ref, watchEffect, watch, onBeforeUnmount } from 'vue';
2
1
  import { createHooks } from 'hookable';
2
+ import { unref, isRef, version, getCurrentInstance, inject, nextTick, ref, watchEffect, watch, onBeforeUnmount } from 'vue';
3
3
 
4
4
  const ValidHeadTags = [
5
5
  "title",
@@ -349,10 +349,12 @@ const EventHandlersPlugin = () => {
349
349
  const handler = value;
350
350
  $el.setAttribute(eventDedupeKey, "");
351
351
  $eventListenerTarget.addEventListener(eventName, handler);
352
- ctx.entry._sde[sdeKey] = () => {
353
- $eventListenerTarget.removeEventListener(eventName, handler);
354
- $el.removeAttribute(eventDedupeKey);
355
- };
352
+ if (ctx.entry) {
353
+ ctx.entry._sde[sdeKey] = () => {
354
+ $eventListenerTarget.removeEventListener(eventName, handler);
355
+ $el.removeAttribute(eventDedupeKey);
356
+ };
357
+ }
356
358
  });
357
359
  if (ctx.tag._delayedSrc) {
358
360
  $el.setAttribute("src", ctx.tag._delayedSrc);
@@ -396,7 +398,26 @@ function normaliseEntryTags(e) {
396
398
  });
397
399
  }
398
400
 
401
+ const CorePlugins = () => [
402
+ DedupesTagsPlugin(),
403
+ SortTagsPlugin(),
404
+ TitleTemplatePlugin(),
405
+ ProvideTagHashPlugin(),
406
+ EventHandlersPlugin(),
407
+ DeprecatedTagAttrPlugin()
408
+ ];
409
+ const DOMPlugins = (options = {}) => [
410
+ PatchDomOnEntryUpdatesPlugin({ document: options?.document, delayFn: options?.domDelayFn })
411
+ ];
399
412
  function createHead$1(options = {}) {
413
+ const head = createHeadCore({
414
+ ...options,
415
+ plugins: [...DOMPlugins(options), ...options?.plugins || []]
416
+ });
417
+ setActiveHead(head);
418
+ return head;
419
+ }
420
+ function createHeadCore(options = {}) {
400
421
  let entries = [];
401
422
  let _sde = {};
402
423
  let _eid = 0;
@@ -404,13 +425,7 @@ function createHead$1(options = {}) {
404
425
  if (options?.hooks)
405
426
  hooks.addHooks(options.hooks);
406
427
  options.plugins = [
407
- DeprecatedTagAttrPlugin(),
408
- DedupesTagsPlugin(),
409
- SortTagsPlugin(),
410
- TitleTemplatePlugin(),
411
- EventHandlersPlugin(),
412
- ProvideTagHashPlugin(),
413
- PatchDomOnEntryUpdatesPlugin({ document: options?.document, delayFn: options?.domDelayFn }),
428
+ ...CorePlugins(),
414
429
  ...options?.plugins || []
415
430
  ];
416
431
  options.plugins.forEach((p) => p.hooks && hooks.addHooks(p.hooks));
@@ -480,7 +495,6 @@ function createHead$1(options = {}) {
480
495
  }
481
496
  };
482
497
  head.hooks.callHook("init", head);
483
- setActiveHead(head);
484
498
  return head;
485
499
  }
486
500
 
@@ -493,6 +507,7 @@ const composableNames = [
493
507
  "useTagBase",
494
508
  "useTagMeta",
495
509
  "useTagMetaFlat",
510
+ "useSeoMeta",
496
511
  "useTagLink",
497
512
  "useTagScript",
498
513
  "useTagStyle",
@@ -524,14 +539,17 @@ function resolveUnrefHeadInput(ref, lastKey = "") {
524
539
  if (Array.isArray(root))
525
540
  return root.map((r) => resolveUnrefHeadInput(r, lastKey));
526
541
  if (typeof root === "object") {
542
+ let dynamic = false;
527
543
  const unrefdObj = Object.fromEntries(
528
- Object.entries(root).map(([key, value]) => {
529
- if (key === "titleTemplate" || key.startsWith("on"))
530
- return [key, unref(value)];
531
- return [key, resolveUnrefHeadInput(value, key)];
544
+ Object.entries(root).map(([k, v]) => {
545
+ if (k === "titleTemplate" || k.startsWith("on"))
546
+ return [k, unref(v)];
547
+ if (typeof v === "function" || isRef(v))
548
+ dynamic = true;
549
+ return [k, resolveUnrefHeadInput(v, k)];
532
550
  })
533
551
  );
534
- if (HasElementTags.includes(String(lastKey)) && JSON.stringify(unrefdObj) !== JSON.stringify(root))
552
+ if (dynamic && HasElementTags.includes(String(lastKey)))
535
553
  unrefdObj._dynamic = true;
536
554
  return unrefdObj;
537
555
  }
@@ -549,14 +567,13 @@ function injectHead() {
549
567
  return getCurrentInstance() && inject(headSymbol) || getActiveHead();
550
568
  }
551
569
  function createHead(options = {}) {
552
- const plugins = [
553
- VueReactiveUseHeadPlugin(),
554
- ...options?.plugins || []
555
- ];
556
570
  const head = createHead$1({
557
571
  ...options,
558
572
  domDelayFn: (fn) => setTimeout(() => nextTick(() => fn()), 10),
559
- plugins
573
+ plugins: [
574
+ VueReactiveUseHeadPlugin(),
575
+ ...options?.plugins || []
576
+ ]
560
577
  });
561
578
  const vuePlugin = {
562
579
  install(app) {
@@ -814,6 +831,7 @@ const useTagMetaFlat = (meta) => {
814
831
  });
815
832
  return useHead({ meta: input });
816
833
  };
834
+ const useSeoMeta = useTagMetaFlat;
817
835
  const useTagLink = (link) => useHead({ link: asArray(link) });
818
836
  const useTagScript = (script) => useHead({ script: asArray(script) });
819
837
  const useTagStyle = (style) => useHead({ style: asArray(style) });
@@ -832,4 +850,4 @@ const unheadVueComposablesImports = [
832
850
  }
833
851
  ];
834
852
 
835
- export { Vue2ProvideUnheadPlugin, VueHeadMixin, VueReactiveUseHeadPlugin, asArray, createHead, headSymbol, injectHead, resolveUnrefHeadInput, unheadVueComposablesImports, useBodyAttrs, useHead, useHtmlAttrs, useServerBodyAttrs, useServerHead, useServerHtmlAttrs, useServerTagBase, useServerTagLink, useServerTagMeta, useServerTagMetaFlat, useServerTagNoscript, useServerTagScript, useServerTagStyle, useServerTagTitle, useServerTitleTemplate, useTagBase, useTagLink, useTagMeta, useTagMetaFlat, useTagNoscript, useTagScript, useTagStyle, useTagTitle, useTitleTemplate };
853
+ export { Vue2ProvideUnheadPlugin, VueHeadMixin, VueReactiveUseHeadPlugin, asArray, createHead, createHeadCore, headSymbol, injectHead, resolveUnrefHeadInput, unheadVueComposablesImports, useBodyAttrs, useHead, useHtmlAttrs, useSeoMeta, 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/vue",
3
3
  "type": "module",
4
- "version": "0.6.4",
4
+ "version": "0.6.6",
5
5
  "packageManager": "pnpm@7.14.0",
6
6
  "author": "Harlan Wilton <harlan@harlanzw.com>",
7
7
  "license": "MIT",
@@ -33,11 +33,11 @@
33
33
  "vue": ">=2.7 || >=3"
34
34
  },
35
35
  "dependencies": {
36
- "@unhead/schema": "0.6.4",
36
+ "@unhead/schema": "0.6.6",
37
37
  "hookable": "^5.4.1"
38
38
  },
39
39
  "devDependencies": {
40
- "unhead": "0.6.4",
40
+ "unhead": "0.6.6",
41
41
  "vue": "^3.2.45"
42
42
  },
43
43
  "scripts": {