140 lines
5.0 KiB
JavaScript
140 lines
5.0 KiB
JavaScript
var piniaPluginPersistedstate = (function(exports) {
|
|
|
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
|
//#region src/runtime/utils.ts
|
|
function get(obj, path) {
|
|
if (obj == null) return void 0;
|
|
let value = obj;
|
|
for (let i = 0; i < path.length; i++) {
|
|
if (value === void 0 || value[path[i]] === void 0) return void 0;
|
|
if (value === null || value[path[i]] === null) return null;
|
|
value = value[path[i]];
|
|
}
|
|
return value;
|
|
}
|
|
function set(obj, value, path) {
|
|
if (path.length === 0) return value;
|
|
const idx = path[0];
|
|
if (path.length > 1) value = set(typeof obj !== "object" || obj === null || !Object.prototype.hasOwnProperty.call(obj, idx) ? Number.isInteger(Number(path[1])) ? [] : {} : obj[idx], value, Array.prototype.slice.call(path, 1));
|
|
if (Number.isInteger(Number(idx)) && Array.isArray(obj)) return obj.slice()[idx];
|
|
return Object.assign({}, obj, { [idx]: value });
|
|
}
|
|
function unset(obj, path) {
|
|
if (obj == null || path.length === 0) return obj;
|
|
if (path.length === 1) {
|
|
if (obj == null) return obj;
|
|
if (Number.isInteger(path[0]) && Array.isArray(obj)) return Array.prototype.slice.call(obj, 0).splice(path[0], 1);
|
|
const result = {};
|
|
for (const p in obj) result[p] = obj[p];
|
|
delete result[path[0]];
|
|
return result;
|
|
}
|
|
if (obj[path[0]] == null) {
|
|
if (Number.isInteger(path[0]) && Array.isArray(obj)) return Array.prototype.concat.call([], obj);
|
|
const result = {};
|
|
for (const p in obj) result[p] = obj[p];
|
|
return result;
|
|
}
|
|
return set(obj, unset(obj[path[0]], Array.prototype.slice.call(path, 1)), [path[0]]);
|
|
}
|
|
function deepPick(obj, paths) {
|
|
return paths.map((p) => p.split(".")).map((p) => [p, get(obj, p)]).filter((t) => t[1] !== void 0).reduce((acc, cur) => set(acc, cur[1], cur[0]), {});
|
|
}
|
|
function deepOmit(obj, paths) {
|
|
return paths.map((p) => p.split(".")).reduce((acc, cur) => unset(acc, cur), obj);
|
|
}
|
|
|
|
//#endregion
|
|
//#region src/runtime/core.ts
|
|
function hydrateStore(store, { storage, serializer, key, debug, pick, omit, beforeHydrate, afterHydrate }, context, runHooks = true) {
|
|
try {
|
|
if (runHooks) beforeHydrate?.(context);
|
|
const fromStorage = storage.getItem(key);
|
|
if (fromStorage) {
|
|
const deserialized = serializer.deserialize(fromStorage);
|
|
const picked = pick ? deepPick(deserialized, pick) : deserialized;
|
|
const omitted = omit ? deepOmit(picked, omit) : picked;
|
|
store.$patch(omitted);
|
|
}
|
|
if (runHooks) afterHydrate?.(context);
|
|
} catch (error) {
|
|
if (debug) console.error("[pinia-plugin-persistedstate]", error);
|
|
}
|
|
}
|
|
function persistState(state, { storage, serializer, key, debug, pick, omit }) {
|
|
try {
|
|
const picked = pick ? deepPick(state, pick) : state;
|
|
const omitted = omit ? deepOmit(picked, omit) : picked;
|
|
const toStorage = serializer.serialize(omitted);
|
|
storage.setItem(key, toStorage);
|
|
} catch (error) {
|
|
if (debug) console.error("[pinia-plugin-persistedstate]", error);
|
|
}
|
|
}
|
|
function parsePersistKey(key, storeId) {
|
|
return typeof key === "function" ? key(storeId) : typeof key === "string" ? key : storeId;
|
|
}
|
|
function createPersistence(context, optionsParser, auto) {
|
|
const { pinia, store, options: { persist = auto } } = context;
|
|
if (!persist) return;
|
|
// v8 ignore if -- @preserve
|
|
if (!(store.$id in pinia.state.value)) {
|
|
const originalStore = pinia._s.get(store.$id.replace("__hot:", ""));
|
|
if (originalStore) Promise.resolve().then(() => originalStore.$persist());
|
|
return;
|
|
}
|
|
const persistences = (Array.isArray(persist) ? persist : persist === true ? [{}] : [persist]).map(optionsParser);
|
|
store.$hydrate = ({ runHooks = true } = {}) => {
|
|
persistences.forEach((p) => {
|
|
hydrateStore(store, p, context, runHooks);
|
|
});
|
|
};
|
|
store.$persist = () => {
|
|
persistences.forEach((p) => {
|
|
persistState(store.$state, p);
|
|
});
|
|
};
|
|
persistences.forEach((p) => {
|
|
hydrateStore(store, p, context);
|
|
store.$subscribe((_mutation, state) => persistState(state, p), { detached: true });
|
|
});
|
|
}
|
|
|
|
//#endregion
|
|
//#region src/index.ts
|
|
/**
|
|
* Create a Pinia persistence plugin.
|
|
* @see https://codeberg.org/praz/pinia-plugin-persistedstate
|
|
*/
|
|
function createPersistedState(options = {}) {
|
|
return function(context) {
|
|
createPersistence(context, (p) => {
|
|
const persistKey = parsePersistKey(p.key, context.store.$id);
|
|
return {
|
|
key: (options.key ? options.key : (x) => x)(persistKey),
|
|
debug: p.debug ?? options.debug ?? false,
|
|
serializer: p.serializer ?? options.serializer ?? {
|
|
serialize: (data) => JSON.stringify(data),
|
|
deserialize: (data) => JSON.parse(data)
|
|
},
|
|
storage: p.storage ?? options.storage ?? window.localStorage,
|
|
beforeHydrate: p.beforeHydrate ?? options.beforeHydrate,
|
|
afterHydrate: p.afterHydrate ?? options.afterHydrate,
|
|
pick: p.pick,
|
|
omit: p.omit
|
|
};
|
|
}, options.auto ?? false);
|
|
};
|
|
}
|
|
/**
|
|
* Pinia plugin to persist stores.
|
|
* @see https://codeberg.org/praz/pinia-plugin-persistedstate
|
|
*/
|
|
var src_default = createPersistedState();
|
|
|
|
//#endregion
|
|
exports.createPersistedState = createPersistedState;
|
|
exports.default = src_default;
|
|
return exports;
|
|
})({}); |