fulinqingjie/public/output/server/chunks/build/asyncData-D5wEK86T.mjs

326 lines
12 KiB
JavaScript

import { computed, toValue, getCurrentInstance, onServerPrefetch, ref, shallowRef, nextTick, unref, toRef, defineComponent, createElementBlock, provide, cloneVNode, h } from 'vue';
import { debounce } from 'perfect-debounce';
import { c as useNuxtApp, d as asyncDataDefaults, e as createError } from './server.mjs';
defineComponent({
name: "ServerPlaceholder",
render() {
return createElementBlock("div");
}
});
const clientOnlySymbol = /* @__PURE__ */ Symbol.for("nuxt:client-only");
defineComponent({
name: "ClientOnly",
inheritAttrs: false,
props: ["fallback", "placeholder", "placeholderTag", "fallbackTag"],
...false,
setup(props, { slots, attrs }) {
const mounted = shallowRef(false);
const vm = getCurrentInstance();
if (vm) {
vm._nuxtClientOnly = true;
}
provide(clientOnlySymbol, true);
return () => {
if (mounted.value) {
const vnodes = slots.default?.();
if (vnodes && vnodes.length === 1) {
return [cloneVNode(vnodes[0], attrs)];
}
return vnodes;
}
const slot = slots.fallback || slots.placeholder;
if (slot) {
return h(slot);
}
const fallbackStr = props.fallback || props.placeholder || "";
const fallbackTag = props.fallbackTag || props.placeholderTag || "span";
return createElementBlock(fallbackTag, attrs, fallbackStr);
};
}
});
function useAsyncData(...args) {
const autoKey = typeof args[args.length - 1] === "string" ? args.pop() : void 0;
if (_isAutoKeyNeeded(args[0], args[1])) {
args.unshift(autoKey);
}
let [_key, _handler, options = {}] = args;
const key = computed(() => toValue(_key));
if (typeof key.value !== "string") {
throw new TypeError("[nuxt] [useAsyncData] key must be a string.");
}
if (typeof _handler !== "function") {
throw new TypeError("[nuxt] [useAsyncData] handler must be a function.");
}
const nuxtApp = useNuxtApp();
options.server ??= true;
options.default ??= getDefault;
options.getCachedData ??= getDefaultCachedData;
options.lazy ??= false;
options.immediate ??= true;
options.deep ??= asyncDataDefaults.deep;
options.dedupe ??= "cancel";
options._functionName || "useAsyncData";
nuxtApp._asyncData[key.value];
function createInitialFetch() {
const initialFetchOptions = { cause: "initial", dedupe: options.dedupe };
if (!nuxtApp._asyncData[key.value]?._init) {
initialFetchOptions.cachedData = options.getCachedData(key.value, nuxtApp, { cause: "initial" });
nuxtApp._asyncData[key.value] = createAsyncData(nuxtApp, key.value, _handler, options, initialFetchOptions.cachedData);
}
return () => nuxtApp._asyncData[key.value].execute(initialFetchOptions);
}
const initialFetch = createInitialFetch();
const asyncData = nuxtApp._asyncData[key.value];
asyncData._deps++;
const fetchOnServer = options.server !== false && nuxtApp.payload.serverRendered;
if (fetchOnServer && options.immediate) {
const promise = initialFetch();
if (getCurrentInstance()) {
onServerPrefetch(() => promise);
} else {
nuxtApp.hook("app:created", async () => {
await promise;
});
}
}
const asyncReturn = {
data: writableComputedRef(() => nuxtApp._asyncData[key.value]?.data),
pending: writableComputedRef(() => nuxtApp._asyncData[key.value]?.pending),
status: writableComputedRef(() => nuxtApp._asyncData[key.value]?.status),
error: writableComputedRef(() => nuxtApp._asyncData[key.value]?.error),
refresh: (...args2) => {
if (!nuxtApp._asyncData[key.value]?._init) {
const initialFetch2 = createInitialFetch();
return initialFetch2();
}
return nuxtApp._asyncData[key.value].execute(...args2);
},
execute: (...args2) => asyncReturn.refresh(...args2),
clear: () => {
const entry = nuxtApp._asyncData[key.value];
if (entry?._abortController) {
try {
entry._abortController.abort(new DOMException("AsyncData aborted by user.", "AbortError"));
} finally {
entry._abortController = void 0;
}
}
clearNuxtDataByKey(nuxtApp, key.value);
}
};
const asyncDataPromise = Promise.resolve(nuxtApp._asyncDataPromises[key.value]).then(() => asyncReturn);
Object.assign(asyncDataPromise, asyncReturn);
return asyncDataPromise;
}
function writableComputedRef(getter) {
return computed({
get() {
return getter()?.value;
},
set(value) {
const ref2 = getter();
if (ref2) {
ref2.value = value;
}
}
});
}
function _isAutoKeyNeeded(keyOrFetcher, fetcher) {
if (typeof keyOrFetcher === "string") {
return false;
}
if (typeof keyOrFetcher === "object" && keyOrFetcher !== null) {
return false;
}
if (typeof keyOrFetcher === "function" && typeof fetcher === "function") {
return false;
}
return true;
}
function clearNuxtDataByKey(nuxtApp, key) {
if (key in nuxtApp.payload.data) {
nuxtApp.payload.data[key] = void 0;
}
if (key in nuxtApp.payload._errors) {
nuxtApp.payload._errors[key] = void 0;
}
if (nuxtApp._asyncData[key]) {
nuxtApp._asyncData[key].data.value = unref(nuxtApp._asyncData[key]._default());
nuxtApp._asyncData[key].error.value = void 0;
nuxtApp._asyncData[key].status.value = "idle";
}
if (key in nuxtApp._asyncDataPromises) {
nuxtApp._asyncDataPromises[key] = void 0;
}
}
function pick(obj, keys) {
const newObj = {};
for (const key of keys) {
newObj[key] = obj[key];
}
return newObj;
}
function createAsyncData(nuxtApp, key, _handler, options, initialCachedData) {
nuxtApp.payload._errors[key] ??= void 0;
const hasCustomGetCachedData = options.getCachedData !== getDefaultCachedData;
const handler = _handler ;
const _ref = options.deep ? ref : shallowRef;
const hasCachedData = initialCachedData !== void 0;
const unsubRefreshAsyncData = nuxtApp.hook("app:data:refresh", async (keys) => {
if (!keys || keys.includes(key)) {
await asyncData.execute({ cause: "refresh:hook" });
}
});
const asyncData = {
data: _ref(hasCachedData ? initialCachedData : options.default()),
pending: computed(() => asyncData.status.value === "pending"),
error: toRef(nuxtApp.payload._errors, key),
status: shallowRef("idle"),
execute: (...args) => {
const [_opts, newValue = void 0] = args;
const opts = _opts && newValue === void 0 && typeof _opts === "object" ? _opts : {};
if (nuxtApp._asyncDataPromises[key]) {
if ((opts.dedupe ?? options.dedupe) === "defer") {
return nuxtApp._asyncDataPromises[key];
}
}
{
const cachedData = "cachedData" in opts ? opts.cachedData : options.getCachedData(key, nuxtApp, { cause: opts.cause ?? "refresh:manual" });
if (cachedData !== void 0) {
nuxtApp.payload.data[key] = asyncData.data.value = cachedData;
asyncData.error.value = void 0;
asyncData.status.value = "success";
return Promise.resolve(cachedData);
}
}
if (asyncData._abortController) {
asyncData._abortController.abort(new DOMException("AsyncData request cancelled by deduplication", "AbortError"));
}
asyncData._abortController = new AbortController();
asyncData.status.value = "pending";
const cleanupController = new AbortController();
const promise = new Promise(
(resolve, reject) => {
try {
const timeout = opts.timeout ?? options.timeout;
const mergedSignal = mergeAbortSignals([asyncData._abortController?.signal, opts?.signal], cleanupController.signal, timeout);
if (mergedSignal.aborted) {
const reason = mergedSignal.reason;
reject(reason instanceof Error ? reason : new DOMException(String(reason ?? "Aborted"), "AbortError"));
return;
}
mergedSignal.addEventListener("abort", () => {
const reason = mergedSignal.reason;
reject(reason instanceof Error ? reason : new DOMException(String(reason ?? "Aborted"), "AbortError"));
}, { once: true, signal: cleanupController.signal });
return Promise.resolve(handler(nuxtApp, { signal: mergedSignal })).then(resolve, reject);
} catch (err) {
reject(err);
}
}
).then(async (_result) => {
let result = _result;
if (options.transform) {
result = await options.transform(_result);
}
if (options.pick) {
result = pick(result, options.pick);
}
nuxtApp.payload.data[key] = result;
asyncData.data.value = result;
asyncData.error.value = void 0;
asyncData.status.value = "success";
}).catch((error) => {
if (nuxtApp._asyncDataPromises[key] && nuxtApp._asyncDataPromises[key] !== promise) {
return nuxtApp._asyncDataPromises[key];
}
if (asyncData._abortController?.signal.aborted) {
return nuxtApp._asyncDataPromises[key];
}
if (typeof DOMException !== "undefined" && error instanceof DOMException && error.name === "AbortError") {
asyncData.status.value = "idle";
return nuxtApp._asyncDataPromises[key];
}
asyncData.error.value = createError(error);
asyncData.data.value = unref(options.default());
asyncData.status.value = "error";
}).finally(() => {
cleanupController.abort();
delete nuxtApp._asyncDataPromises[key];
});
nuxtApp._asyncDataPromises[key] = promise;
return nuxtApp._asyncDataPromises[key];
},
_execute: debounce((...args) => asyncData.execute(...args), 0, { leading: true }),
_default: options.default,
_deps: 0,
_init: true,
_hash: void 0,
_off: () => {
unsubRefreshAsyncData();
if (nuxtApp._asyncData[key]?._init) {
nuxtApp._asyncData[key]._init = false;
}
if (!hasCustomGetCachedData) {
nextTick(() => {
if (!nuxtApp._asyncData[key]?._init) {
clearNuxtDataByKey(nuxtApp, key);
asyncData.execute = () => Promise.resolve();
}
});
}
}
};
return asyncData;
}
const getDefault = () => void 0;
const getDefaultCachedData = (key, nuxtApp, ctx) => {
if (nuxtApp.isHydrating) {
return nuxtApp.payload.data[key];
}
if (ctx.cause !== "refresh:manual" && ctx.cause !== "refresh:hook") {
return nuxtApp.static.data[key];
}
};
function mergeAbortSignals(signals, cleanupSignal, timeout) {
const list = signals.filter((s) => !!s);
if (typeof timeout === "number" && timeout >= 0) {
const timeoutSignal = AbortSignal.timeout?.(timeout);
if (timeoutSignal) {
list.push(timeoutSignal);
}
}
if (AbortSignal.any) {
return AbortSignal.any(list);
}
const controller = new AbortController();
for (const sig of list) {
if (sig.aborted) {
const reason = sig.reason ?? new DOMException("Aborted", "AbortError");
try {
controller.abort(reason);
} catch {
controller.abort();
}
return controller.signal;
}
}
const onAbort = () => {
const abortedSignal = list.find((s) => s.aborted);
const reason = abortedSignal?.reason ?? new DOMException("Aborted", "AbortError");
try {
controller.abort(reason);
} catch {
controller.abort();
}
};
for (const sig of list) {
sig.addEventListener?.("abort", onAbort, { once: true, signal: cleanupSignal });
}
return controller.signal;
}
export { useAsyncData as u };
//# sourceMappingURL=asyncData-D5wEK86T.mjs.map