core.js 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import { deepOmitUnsafe, deepPickUnsafe } from "deep-pick-omit";
  2. function hydrateStore(store, {
  3. storage,
  4. serializer,
  5. key,
  6. debug,
  7. pick,
  8. omit,
  9. beforeHydrate,
  10. afterHydrate
  11. }, context, runHooks = true) {
  12. try {
  13. if (runHooks)
  14. beforeHydrate?.(context);
  15. const fromStorage = storage.getItem(key);
  16. if (fromStorage) {
  17. const deserialized = serializer.deserialize(fromStorage);
  18. const picked = pick ? deepPickUnsafe(deserialized, pick) : deserialized;
  19. const omitted = omit ? deepOmitUnsafe(picked, omit) : picked;
  20. store.$patch(omitted);
  21. }
  22. if (runHooks)
  23. afterHydrate?.(context);
  24. } catch (error) {
  25. if (debug)
  26. console.error("[pinia-plugin-persistedstate]", error);
  27. }
  28. }
  29. function persistState(state, {
  30. storage,
  31. serializer,
  32. key,
  33. debug,
  34. pick,
  35. omit
  36. }) {
  37. try {
  38. const picked = pick ? deepPickUnsafe(state, pick) : state;
  39. const omitted = omit ? deepOmitUnsafe(picked, omit) : picked;
  40. const toStorage = serializer.serialize(omitted);
  41. storage.setItem(key, toStorage);
  42. } catch (error) {
  43. if (debug)
  44. console.error("[pinia-plugin-persistedstate]", error);
  45. }
  46. }
  47. export function createPersistence(context, optionsParser, auto) {
  48. const { pinia, store, options: { persist = auto } } = context;
  49. if (!persist)
  50. return;
  51. if (!(store.$id in pinia.state.value)) {
  52. const originalStore = pinia._s.get(store.$id.replace("__hot:", ""));
  53. if (originalStore)
  54. void Promise.resolve().then(() => originalStore.$persist());
  55. return;
  56. }
  57. const persistenceOptions = Array.isArray(persist) ? persist : persist === true ? [{}] : [persist];
  58. const persistences = persistenceOptions.map(optionsParser);
  59. store.$hydrate = ({ runHooks = true } = {}) => {
  60. persistences.forEach((p) => {
  61. hydrateStore(store, p, context, runHooks);
  62. });
  63. };
  64. store.$persist = () => {
  65. persistences.forEach((p) => {
  66. persistState(store.$state, p);
  67. });
  68. };
  69. persistences.forEach((p) => {
  70. hydrateStore(store, p, context);
  71. store.$subscribe(
  72. (_mutation, state) => persistState(state, p),
  73. { detached: true }
  74. );
  75. });
  76. }