UNPKG

vue-app-sdk

Version:
331 lines (330 loc) 9.9 kB
"use strict"; Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" }); const index = require("../shared/index.cjs"); const vue = require("vue"); const defaultWindow = index.isClient ? window : void 0; function unrefElement(elRef) { var _a; const plain = index.toValue(elRef); return (_a = plain == null ? void 0 : plain.$el) != null ? _a : plain; } function useEventListener(...args) { let target; let events; let listeners; let options; if (typeof args[0] === "string" || Array.isArray(args[0])) { [events, listeners, options] = args; target = defaultWindow; } else { [target, events, listeners, options] = args; } if (!target) return index.noop; if (!Array.isArray(events)) events = [events]; if (!Array.isArray(listeners)) listeners = [listeners]; const cleanups = []; const cleanup = () => { cleanups.forEach((fn) => fn()); cleanups.length = 0; }; const register = (el, event, listener, options2) => { el.addEventListener(event, listener, options2); return () => el.removeEventListener(event, listener, options2); }; const stopWatch = vue.watch( () => [unrefElement(target), index.toValue(options)], ([el, options2]) => { cleanup(); if (!el) return; const optionsClone = index.isObject(options2) ? { ...options2 } : options2; cleanups.push( ...events.flatMap((event) => { return listeners.map((listener) => register(el, event, listener, optionsClone)); }) ); }, { immediate: true, flush: "post" } ); const stop = () => { stopWatch(); cleanup(); }; index.tryOnScopeDispose(stop); return stop; } const _global = typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : {}; const globalKey = "__vueuse_ssr_handlers__"; const handlers = /* @__PURE__ */ getHandlers(); function getHandlers() { if (!(globalKey in _global)) _global[globalKey] = _global[globalKey] || {}; return _global[globalKey]; } function getSSRHandler(key, fallback) { return handlers[key] || fallback; } function guessSerializerType(rawInit) { return rawInit == null ? "any" : rawInit instanceof Set ? "set" : rawInit instanceof Map ? "map" : rawInit instanceof Date ? "date" : typeof rawInit === "boolean" ? "boolean" : typeof rawInit === "string" ? "string" : typeof rawInit === "object" ? "object" : !Number.isNaN(rawInit) ? "number" : "any"; } const StorageSerializers = { boolean: { read: (v) => v === "true", write: (v) => String(v) }, object: { read: (v) => JSON.parse(v), write: (v) => JSON.stringify(v) }, number: { read: (v) => Number.parseFloat(v), write: (v) => String(v) }, any: { read: (v) => v, write: (v) => String(v) }, string: { read: (v) => v, write: (v) => String(v) }, map: { read: (v) => new Map(JSON.parse(v)), write: (v) => JSON.stringify(Array.from(v.entries())) }, set: { read: (v) => new Set(JSON.parse(v)), write: (v) => JSON.stringify(Array.from(v)) }, date: { read: (v) => new Date(v), write: (v) => v.toISOString() } }; const customStorageEventName = "vueuse-storage"; function useStorage(key, defaults, storage, options = {}) { var _a; const { flush = "pre", deep = true, listenToStorageChanges = true, writeDefaults = true, mergeDefaults = false, shallow, window: window2 = defaultWindow, eventFilter, onError = (e) => { console.error(e); }, initOnMounted } = options; const data = (shallow ? vue.shallowRef : vue.ref)(typeof defaults === "function" ? defaults() : defaults); if (!storage) { try { storage = getSSRHandler("getDefaultStorage", () => { var _a2; return (_a2 = defaultWindow) == null ? void 0 : _a2.localStorage; })(); } catch (e) { onError(e); } } if (!storage) return data; const rawInit = index.toValue(defaults); const type = guessSerializerType(rawInit); const serializer = (_a = options.serializer) != null ? _a : StorageSerializers[type]; const { pause: pauseWatch, resume: resumeWatch } = index.pausableWatch( data, () => write(data.value), { flush, deep, eventFilter } ); if (window2 && listenToStorageChanges) { index.tryOnMounted(() => { if (storage instanceof Storage) useEventListener(window2, "storage", update); else useEventListener(window2, customStorageEventName, updateFromCustomEvent); if (initOnMounted) update(); }); } if (!initOnMounted) update(); function dispatchWriteEvent(oldValue, newValue) { if (window2) { const payload = { key, oldValue, newValue, storageArea: storage }; window2.dispatchEvent(storage instanceof Storage ? new StorageEvent("storage", payload) : new CustomEvent(customStorageEventName, { detail: payload })); } } function write(v) { try { const oldValue = storage.getItem(key); if (v == null) { dispatchWriteEvent(oldValue, null); storage.removeItem(key); } else { const serialized = serializer.write(v); if (oldValue !== serialized) { storage.setItem(key, serialized); dispatchWriteEvent(oldValue, serialized); } } } catch (e) { onError(e); } } function read(event) { const rawValue = event ? event.newValue : storage.getItem(key); if (rawValue == null) { if (writeDefaults && rawInit != null) storage.setItem(key, serializer.write(rawInit)); return rawInit; } else if (!event && mergeDefaults) { const value = serializer.read(rawValue); if (typeof mergeDefaults === "function") return mergeDefaults(value, rawInit); else if (type === "object" && !Array.isArray(value)) return { ...rawInit, ...value }; return value; } else if (typeof rawValue !== "string") { return rawValue; } else { return serializer.read(rawValue); } } function update(event) { if (event && event.storageArea !== storage) return; if (event && event.key == null) { data.value = rawInit; return; } if (event && event.key !== key) return; pauseWatch(); try { if ((event == null ? void 0 : event.newValue) !== serializer.write(data.value)) data.value = read(event); } catch (e) { onError(e); } finally { if (event) vue.nextTick(resumeWatch); else resumeWatch(); } } function updateFromCustomEvent(event) { update(event.detail); } return data; } function useStorageAsync(key, initialValue, storage, options = {}) { var _a; const { flush = "pre", deep = true, listenToStorageChanges = true, writeDefaults = true, mergeDefaults = false, shallow, window: window2 = defaultWindow, eventFilter, onError = (e) => { console.error(e); } } = options; const rawInit = index.toValue(initialValue); const type = guessSerializerType(rawInit); const data = (shallow ? vue.shallowRef : vue.ref)(initialValue); const serializer = (_a = options.serializer) != null ? _a : StorageSerializers[type]; if (!storage) { try { storage = getSSRHandler("getDefaultStorageAsync", () => { var _a2; return (_a2 = defaultWindow) == null ? void 0 : _a2.localStorage; })(); } catch (e) { onError(e); } } async function read(event) { if (!storage || event && event.key !== key) return; try { const rawValue = event ? event.newValue : await storage.getItem(key); if (rawValue == null) { data.value = rawInit; if (writeDefaults && rawInit !== null) await storage.setItem(key, await serializer.write(rawInit)); } else if (mergeDefaults) { const value = await serializer.read(rawValue); if (typeof mergeDefaults === "function") data.value = mergeDefaults(value, rawInit); else if (type === "object" && !Array.isArray(value)) data.value = { ...rawInit, ...value }; else data.value = value; } else { data.value = await serializer.read(rawValue); } } catch (e) { onError(e); } } read(); if (window2 && listenToStorageChanges) useEventListener(window2, "storage", (e) => Promise.resolve().then(() => read(e))); if (storage) { index.watchWithFilter( data, async () => { try { if (data.value == null) await storage.removeItem(key); else await storage.setItem(key, await serializer.write(data.value)); } catch (e) { onError(e); } }, { flush, deep, eventFilter } ); } return data; } exports.bypassFilter = index.bypassFilter; exports.createFilterWrapper = index.createFilterWrapper; exports.getLifeCycleTarget = index.getLifeCycleTarget; exports.isClient = index.isClient; exports.isObject = index.isObject; exports.noop = index.noop; exports.pausableFilter = index.pausableFilter; exports.pausableWatch = index.pausableWatch; exports.toValue = index.toValue; exports.tryOnMounted = index.tryOnMounted; exports.tryOnScopeDispose = index.tryOnScopeDispose; exports.watchPausable = index.pausableWatch; exports.watchWithFilter = index.watchWithFilter; exports.StorageSerializers = StorageSerializers; exports.customStorageEventName = customStorageEventName; exports.defaultWindow = defaultWindow; exports.getSSRHandler = getSSRHandler; exports.unrefElement = unrefElement; exports.useEventListener = useEventListener; exports.useStorage = useStorage; exports.useStorageAsync = useStorageAsync;