| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- import { deepOmitUnsafe, deepPickUnsafe } from "deep-pick-omit";
- 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 ? deepPickUnsafe(deserialized, pick) : deserialized;
- const omitted = omit ? deepOmitUnsafe(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 ? deepPickUnsafe(state, pick) : state;
- const omitted = omit ? deepOmitUnsafe(picked, omit) : picked;
- const toStorage = serializer.serialize(omitted);
- storage.setItem(key, toStorage);
- } catch (error) {
- if (debug)
- console.error("[pinia-plugin-persistedstate]", error);
- }
- }
- export function createPersistence(context, optionsParser, auto) {
- const { pinia, store, options: { persist = auto } } = context;
- if (!persist)
- return;
- if (!(store.$id in pinia.state.value)) {
- const originalStore = pinia._s.get(store.$id.replace("__hot:", ""));
- if (originalStore)
- void Promise.resolve().then(() => originalStore.$persist());
- return;
- }
- const persistenceOptions = Array.isArray(persist) ? persist : persist === true ? [{}] : [persist];
- const persistences = persistenceOptions.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 }
- );
- });
- }
|