index.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. // src/index.ts
  2. import { destr } from "destr";
  3. // src/runtime/core.ts
  4. import { deepOmitUnsafe, deepPickUnsafe } from "deep-pick-omit";
  5. function hydrateStore(store, {
  6. storage,
  7. serializer,
  8. key,
  9. debug,
  10. pick,
  11. omit,
  12. beforeHydrate,
  13. afterHydrate
  14. }, context, runHooks = true) {
  15. try {
  16. if (runHooks)
  17. beforeHydrate?.(context);
  18. const fromStorage = storage.getItem(key);
  19. if (fromStorage) {
  20. const deserialized = serializer.deserialize(fromStorage);
  21. const picked = pick ? deepPickUnsafe(deserialized, pick) : deserialized;
  22. const omitted = omit ? deepOmitUnsafe(picked, omit) : picked;
  23. store.$patch(omitted);
  24. }
  25. if (runHooks)
  26. afterHydrate?.(context);
  27. } catch (error) {
  28. if (debug)
  29. console.error("[pinia-plugin-persistedstate]", error);
  30. }
  31. }
  32. function persistState(state, {
  33. storage,
  34. serializer,
  35. key,
  36. debug,
  37. pick,
  38. omit
  39. }) {
  40. try {
  41. const picked = pick ? deepPickUnsafe(state, pick) : state;
  42. const omitted = omit ? deepOmitUnsafe(picked, omit) : picked;
  43. const toStorage = serializer.serialize(omitted);
  44. storage.setItem(key, toStorage);
  45. } catch (error) {
  46. if (debug)
  47. console.error("[pinia-plugin-persistedstate]", error);
  48. }
  49. }
  50. function createPersistence(context, optionsParser, auto) {
  51. const { pinia, store, options: { persist = auto } } = context;
  52. if (!persist)
  53. return;
  54. if (!(store.$id in pinia.state.value)) {
  55. const originalStore = pinia._s.get(store.$id.replace("__hot:", ""));
  56. if (originalStore)
  57. void Promise.resolve().then(() => originalStore.$persist());
  58. return;
  59. }
  60. const persistenceOptions = Array.isArray(persist) ? persist : persist === true ? [{}] : [persist];
  61. const persistences = persistenceOptions.map(optionsParser);
  62. store.$hydrate = ({ runHooks = true } = {}) => {
  63. persistences.forEach((p) => {
  64. hydrateStore(store, p, context, runHooks);
  65. });
  66. };
  67. store.$persist = () => {
  68. persistences.forEach((p) => {
  69. persistState(store.$state, p);
  70. });
  71. };
  72. persistences.forEach((p) => {
  73. hydrateStore(store, p, context);
  74. store.$subscribe(
  75. (_mutation, state) => persistState(state, p),
  76. { detached: true }
  77. );
  78. });
  79. }
  80. // src/index.ts
  81. function createPersistedState(options = {}) {
  82. return function(context) {
  83. createPersistence(
  84. context,
  85. (p) => ({
  86. key: (options.key ? options.key : (x) => x)(p.key ?? context.store.$id),
  87. debug: p.debug ?? options.debug ?? false,
  88. serializer: p.serializer ?? options.serializer ?? {
  89. serialize: (data) => JSON.stringify(data),
  90. deserialize: (data) => destr(data)
  91. },
  92. storage: p.storage ?? options.storage ?? window.localStorage,
  93. beforeHydrate: p.beforeHydrate,
  94. afterHydrate: p.afterHydrate,
  95. pick: p.pick,
  96. omit: p.omit
  97. }),
  98. options.auto ?? false
  99. );
  100. };
  101. }
  102. var index_default = createPersistedState();
  103. export {
  104. createPersistedState,
  105. index_default as default
  106. };