2025-09-05 14:59:21 +08:00

163 lines
4.7 KiB
JavaScript

import { useScript as useScript$1 } from 'unhead';
export { CapoPlugin, HashHydrationPlugin, createHeadCore } from 'unhead';
import { i as injectHead, h as headSymbol, V as Vue3 } from './shared/vue.ziyDaVMR.mjs';
export { c as createHead, a as createServerHead, r as resolveUnrefHeadInput, s as setHeadInjectionHandler } from './shared/vue.ziyDaVMR.mjs';
import { composableNames, whitelistSafeInput, unpackMeta } from '@unhead/shared';
import { u as useHead } from './shared/vue.-sixQ7xP.mjs';
import { getCurrentInstance, onMounted, isRef, watch, onScopeDispose, ref } from 'vue';
const coreComposableNames = [
"injectHead"
];
const unheadVueComposablesImports = {
"@unhead/vue": [...coreComposableNames, ...composableNames]
};
function useHeadSafe(input, options = {}) {
return useHead(input, { ...options, transform: whitelistSafeInput });
}
function registerVueScopeHandlers(script, scope) {
if (!scope) {
return;
}
const _registerCb = (key, cb) => {
if (!script._cbs[key]) {
cb(script.instance);
return () => {
};
}
let i = script._cbs[key].push(cb);
const destroy = () => {
if (i) {
script._cbs[key]?.splice(i - 1, 1);
i = null;
}
};
onScopeDispose(destroy);
return destroy;
};
script.onLoaded = (cb) => _registerCb("loaded", cb);
script.onError = (cb) => _registerCb("error", cb);
onScopeDispose(() => {
script._triggerAbortController?.abort();
});
}
function useScript(_input, _options) {
const input = typeof _input === "string" ? { src: _input } : _input;
const options = _options || {};
const head = options?.head || injectHead();
options.head = head;
const scope = getCurrentInstance();
options.eventContext = scope;
if (scope && typeof options.trigger === "undefined") {
options.trigger = onMounted;
} else if (isRef(options.trigger)) {
const refTrigger = options.trigger;
let off;
options.trigger = new Promise((resolve) => {
off = watch(refTrigger, (val) => {
if (val) {
resolve(true);
}
}, {
immediate: true
});
onScopeDispose(() => resolve(false), true);
}).then((val) => {
off?.();
return val;
});
}
head._scriptStatusWatcher = head._scriptStatusWatcher || head.hooks.hook("script:updated", ({ script: s }) => {
s._statusRef.value = s.status;
});
const script = useScript$1(input, options);
script._statusRef = script._statusRef || ref(script.status);
registerVueScopeHandlers(script, scope);
return new Proxy(script, {
get(_, key, a) {
return Reflect.get(_, key === "status" ? "_statusRef" : key, a);
}
});
}
function useSeoMeta(input, options) {
const { title, titleTemplate, ...meta } = input;
return useHead({
title,
titleTemplate,
// @ts-expect-error runtime type
_flatMeta: meta
}, {
...options,
transform(t) {
const meta2 = unpackMeta({ ...t._flatMeta });
delete t._flatMeta;
return {
// @ts-expect-error runtime type
...t,
meta: meta2
};
}
});
}
function useServerHead(input, options = {}) {
const head = options.head || injectHead();
delete options.head;
if (head)
return head.push(input, { ...options, mode: "server" });
}
function useServerHeadSafe(input, options = {}) {
return useHeadSafe(input, { ...options, mode: "server" });
}
function useServerSeoMeta(input, options) {
return useSeoMeta(input, { ...options, mode: "server" });
}
const Vue2ProvideUnheadPlugin = (_Vue, head) => {
_Vue.mixin({
beforeCreate() {
const options = this.$options;
const origProvide = options.provide;
options.provide = function() {
let origProvideResult;
if (typeof origProvide === "function")
origProvideResult = origProvide.call(this);
else
origProvideResult = origProvide || {};
return {
...origProvideResult,
[headSymbol]: head
};
};
}
});
};
const VueHeadMixin = {
created() {
let source = false;
if (Vue3) {
const instance = getCurrentInstance();
if (!instance)
return;
const options = instance.type;
if (!options || !("head" in options))
return;
source = typeof options.head === "function" ? () => options.head.call(instance.proxy) : options.head;
} else {
const head = this.$options.head;
if (head) {
source = typeof head === "function" ? () => head.call(this) : head;
}
}
source && useHead(source);
}
};
export { Vue2ProvideUnheadPlugin, VueHeadMixin, injectHead, unheadVueComposablesImports, useHead, useHeadSafe, useScript, useSeoMeta, useServerHead, useServerHeadSafe, useServerSeoMeta };