UNPKG

@jiuyue-/pinia-persisted-state

Version:
64 lines (61 loc) 1.94 kB
'use strict'; let defaultStorage = localStorage; let defaultPiniaName = 'pinia'; const isBoolean = (target) => typeof target === 'boolean'; const getPiniaStore = (storage) => { const store = storage.getItem(defaultPiniaName); if (store) { return JSON.parse(store); } return {}; }; const updateStorage = (store, options) => { const { paths, storage = defaultStorage, key = store.$id } = options; let state = store.$state; let piniaStore = getPiniaStore(storage); if (paths && Array.isArray(paths) && paths.length > 0) { state = paths?.reduce((obj, key) => { obj[key] = store.$state[key]; return obj; }, {}); } storage.setItem(defaultPiniaName, JSON.stringify(Object.assign(piniaStore, { [key]: state }))); }; const setConfig = (config) => { const { name, storage } = config; if (name) { defaultPiniaName = name; } if (storage) { defaultStorage = storage; } }; function createPersistedState(context, config) { if (config) { setConfig(config); } const { options, store } = context; const storeId = store.$id; const persist = options?.persist; let persistOptions; if (!options?.persist) return; const defaultOptions = { key: storeId, storage: defaultStorage, paths: [], }; if (persist && isBoolean(persist)) { persistOptions = defaultOptions; } else { persistOptions = Object.assign(defaultOptions, persist); } const { key = storeId, storage = defaultStorage } = persistOptions; const piniaStore = getPiniaStore(storage); const result = piniaStore[key]; result && store.$patch(result); store.$subscribe(() => updateStorage(store, persistOptions)); updateStorage(store, persistOptions); } module.exports = createPersistedState;