@jiuyue-/pinia-persisted-state
Version:
Persisted state for Pinia
64 lines (61 loc) • 1.94 kB
JavaScript
;
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;