stroid 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. package/CHANGELOG.md +210 -119
  2. package/README.md +104 -431
  3. package/dist/async.d.ts +42 -9
  4. package/dist/async.js +26 -26
  5. package/dist/async.js.map +1 -1
  6. package/dist/cache.d.ts +12 -0
  7. package/dist/computed.d.ts +40 -7
  8. package/dist/computed.js +11 -11
  9. package/dist/computed.js.map +1 -1
  10. package/dist/core.d.ts +5 -15
  11. package/dist/core.js +14 -15
  12. package/dist/core.js.map +1 -1
  13. package/dist/devtools.d.ts +30 -5
  14. package/dist/devtools.js +1 -1
  15. package/dist/devtools.js.map +1 -1
  16. package/dist/feature.d.ts +92 -14
  17. package/dist/feature.js +1 -1
  18. package/dist/feature.js.map +1 -1
  19. package/dist/helpers.d.ts +37 -3
  20. package/dist/helpers.js +14 -15
  21. package/dist/helpers.js.map +1 -1
  22. package/dist/index-internal.d.ts +44 -0
  23. package/dist/index.d.cts +169 -33
  24. package/dist/index.d.ts +169 -33
  25. package/dist/index.js +24 -23
  26. package/dist/index.js.map +1 -1
  27. package/dist/install.d.ts +6 -4
  28. package/dist/install.js +1 -1
  29. package/dist/install.js.map +1 -1
  30. package/dist/options.d.ts +295 -0
  31. package/dist/persist.d.ts +1 -1
  32. package/dist/persist.js +1 -1
  33. package/dist/persist.js.map +1 -1
  34. package/dist/react/index.d.ts +70 -0
  35. package/dist/react/index.js +38 -0
  36. package/dist/react/index.js.map +1 -0
  37. package/dist/registry.d.ts +117 -0
  38. package/dist/runtime-admin.d.ts +4 -2
  39. package/dist/runtime-admin.js +1 -1
  40. package/dist/runtime-admin.js.map +1 -1
  41. package/dist/runtime-tools.d.ts +66 -9
  42. package/dist/runtime-tools.js +2 -2
  43. package/dist/runtime-tools.js.map +1 -1
  44. package/dist/selectors.d.ts +4 -2
  45. package/dist/selectors.js +1 -1
  46. package/dist/selectors.js.map +1 -1
  47. package/dist/server.d.ts +30 -2
  48. package/dist/server.js +11 -10
  49. package/dist/server.js.map +1 -1
  50. package/dist/store-registry.d.ts +80 -0
  51. package/dist/sync.d.ts +1 -1
  52. package/dist/sync.js +1 -1
  53. package/dist/sync.js.map +1 -1
  54. package/dist/testing.d.ts +16 -4
  55. package/dist/testing.js +14 -15
  56. package/dist/testing.js.map +1 -1
  57. package/dist/tsdoc-metadata.json +11 -0
  58. package/dist/types/adapters/options.d.ts +335 -0
  59. package/dist/types/async/cache.d.ts +39 -0
  60. package/dist/types/async/clone.d.ts +10 -0
  61. package/dist/types/async/errors.d.ts +3 -0
  62. package/dist/types/async/fetch.d.ts +37 -0
  63. package/dist/types/async/inflight.d.ts +13 -0
  64. package/dist/types/async/rate.d.ts +5 -0
  65. package/dist/types/async/registry.d.ts +116 -0
  66. package/dist/types/async/request.d.ts +11 -0
  67. package/dist/types/async/retry.d.ts +10 -0
  68. package/dist/types/async.d.ts +10 -0
  69. package/dist/types/computed/computed-graph.d.ts +29 -0
  70. package/dist/types/computed/index.d.ts +16 -0
  71. package/dist/types/config.d.ts +10 -0
  72. package/dist/types/core/index.d.ts +11 -0
  73. package/dist/types/core/lifecycle-hooks.d.ts +16 -0
  74. package/dist/types/core/store-admin-impl.d.ts +9 -0
  75. package/dist/types/core/store-admin.d.ts +9 -0
  76. package/dist/types/core/store-core.d.ts +13 -0
  77. package/dist/types/core/store-create.d.ts +16 -0
  78. package/dist/types/core/store-hydrate-impl.d.ts +35 -0
  79. package/dist/types/core/store-hydrate.d.ts +9 -0
  80. package/dist/types/core/store-lifecycle/hooks.d.ts +19 -0
  81. package/dist/types/core/store-lifecycle/identity.d.ts +23 -0
  82. package/dist/types/core/store-lifecycle/registry.d.ts +53 -0
  83. package/dist/types/core/store-lifecycle/types.d.ts +67 -0
  84. package/dist/types/core/store-lifecycle/validation.d.ts +53 -0
  85. package/dist/types/core/store-name.d.ts +28 -0
  86. package/dist/types/core/store-notify.d.ts +12 -0
  87. package/dist/types/core/store-read.d.ts +18 -0
  88. package/dist/types/core/store-registry.d.ts +108 -0
  89. package/dist/types/core/store-replace-impl.d.ts +11 -0
  90. package/dist/types/core/store-replace.d.ts +9 -0
  91. package/dist/types/core/store-set-impl.d.ts +13 -0
  92. package/dist/types/core/store-set.d.ts +9 -0
  93. package/dist/types/core/store-shared/core.d.ts +13 -0
  94. package/dist/types/core/store-shared/notify.d.ts +12 -0
  95. package/dist/types/core/store-transaction.d.ts +26 -0
  96. package/dist/types/core/store-write-shared.d.ts +19 -0
  97. package/dist/types/core/store-write.d.ts +13 -0
  98. package/dist/types/features/feature-registry.d.ts +91 -0
  99. package/dist/types/features/lifecycle.d.ts +40 -0
  100. package/dist/types/index.d.ts +17 -0
  101. package/dist/types/integrations/query.d.ts +8 -0
  102. package/dist/types/internals/computed-order.d.ts +3 -0
  103. package/dist/types/internals/config.d.ts +116 -0
  104. package/dist/types/internals/diagnostics.d.ts +21 -0
  105. package/dist/types/internals/reporting.d.ts +9 -0
  106. package/dist/types/internals/store-admin.d.ts +7 -0
  107. package/dist/types/internals/store-ops.d.ts +13 -0
  108. package/dist/types/internals/test-reset.d.ts +2 -0
  109. package/dist/types/internals/write-context.d.ts +15 -0
  110. package/dist/types/notification/delivery.d.ts +3 -0
  111. package/dist/types/notification/index.d.ts +10 -0
  112. package/dist/types/notification/metrics.d.ts +12 -0
  113. package/dist/types/notification/priority.d.ts +9 -0
  114. package/dist/types/notification/scheduler.d.ts +11 -0
  115. package/dist/types/notification/snapshot.d.ts +8 -0
  116. package/dist/types/runtime-admin/index.d.ts +2 -0
  117. package/dist/types/runtime-tools/index.d.ts +58 -0
  118. package/dist/types/store.d.ts +16 -0
  119. package/dist/types/types/utility.d.ts +17 -0
  120. package/dist/types/utils/clone.d.ts +4 -0
  121. package/dist/types/utils/devfreeze.d.ts +2 -0
  122. package/dist/types/utils/hash.d.ts +8 -0
  123. package/dist/types/utils/path.d.ts +5 -0
  124. package/dist/types/utils/validation.d.ts +14 -0
  125. package/dist/types/utils.d.ts +13 -0
  126. package/dist/types.d.ts +65 -0
  127. package/dist/utility.d.ts +15 -0
  128. package/package.json +26 -11
  129. package/dist/_tsup-dts-rollup.d.cts +0 -2411
  130. package/dist/_tsup-dts-rollup.d.ts +0 -2411
  131. package/dist/async.cjs +0 -34
  132. package/dist/async.cjs.map +0 -1
  133. package/dist/async.d.cts +0 -9
  134. package/dist/computed.cjs +0 -13
  135. package/dist/computed.cjs.map +0 -1
  136. package/dist/computed.d.cts +0 -7
  137. package/dist/core.cjs +0 -24
  138. package/dist/core.cjs.map +0 -1
  139. package/dist/core.d.cts +0 -15
  140. package/dist/devtools.cjs +0 -2
  141. package/dist/devtools.cjs.map +0 -1
  142. package/dist/devtools.d.cts +0 -5
  143. package/dist/feature.cjs +0 -2
  144. package/dist/feature.cjs.map +0 -1
  145. package/dist/feature.d.cts +0 -14
  146. package/dist/helpers.cjs +0 -24
  147. package/dist/helpers.cjs.map +0 -1
  148. package/dist/helpers.d.cts +0 -3
  149. package/dist/index.cjs +0 -35
  150. package/dist/index.cjs.map +0 -1
  151. package/dist/install.cjs +0 -2
  152. package/dist/install.cjs.map +0 -1
  153. package/dist/install.d.cts +0 -4
  154. package/dist/persist.cjs +0 -2
  155. package/dist/persist.cjs.map +0 -1
  156. package/dist/persist.d.cts +0 -1
  157. package/dist/react.cjs +0 -36
  158. package/dist/react.cjs.map +0 -1
  159. package/dist/react.d.cts +0 -7
  160. package/dist/react.d.ts +0 -7
  161. package/dist/react.js +0 -36
  162. package/dist/react.js.map +0 -1
  163. package/dist/runtime-admin.cjs +0 -2
  164. package/dist/runtime-admin.cjs.map +0 -1
  165. package/dist/runtime-admin.d.cts +0 -2
  166. package/dist/runtime-tools.cjs +0 -4
  167. package/dist/runtime-tools.cjs.map +0 -1
  168. package/dist/runtime-tools.d.cts +0 -9
  169. package/dist/selectors.cjs +0 -2
  170. package/dist/selectors.cjs.map +0 -1
  171. package/dist/selectors.d.cts +0 -2
  172. package/dist/server.cjs +0 -12
  173. package/dist/server.cjs.map +0 -1
  174. package/dist/server.d.cts +0 -2
  175. package/dist/sync.cjs +0 -2
  176. package/dist/sync.cjs.map +0 -1
  177. package/dist/sync.d.cts +0 -1
  178. package/dist/testing.cjs +0 -24
  179. package/dist/testing.cjs.map +0 -1
  180. package/dist/testing.d.cts +0 -4
@@ -0,0 +1,295 @@
1
+ import { T as TraceContext } from './utility.js';
2
+
3
+ type StoreValue = unknown;
4
+ interface FeatureOptionsMap {
5
+ }
6
+ type FeatureOptions = Partial<FeatureOptionsMap> & Record<string, unknown>;
7
+ interface PersistDriver {
8
+ getItem?: (k: string) => string | null | Promise<string | null>;
9
+ setItem?: (k: string, v: string) => void | Promise<void>;
10
+ removeItem?: (k: string) => void | Promise<void>;
11
+ [key: string]: unknown;
12
+ }
13
+ type StoreScope = "request" | "global" | "temp";
14
+ type SnapshotMode = "deep" | "shallow" | "ref";
15
+ type ValidateFn<State = StoreValue> = (next: State) => boolean | State;
16
+ type SchemaValidateOption = {
17
+ safeParse: (value: unknown) => {
18
+ success: true;
19
+ data: unknown;
20
+ } | {
21
+ success: false;
22
+ error?: unknown;
23
+ };
24
+ } | {
25
+ parse: (value: unknown) => unknown;
26
+ } | {
27
+ validateSync: (value: unknown) => unknown;
28
+ } | {
29
+ isValidSync: (value: unknown) => boolean;
30
+ } | {
31
+ validate: (value: unknown) => unknown;
32
+ };
33
+ type ValidateOption<State = StoreValue> = ValidateFn<State> | SchemaValidateOption;
34
+ interface PersistOptions<State = StoreValue> {
35
+ driver?: PersistDriver;
36
+ storage?: PersistDriver;
37
+ key?: string;
38
+ serialize?: (v: unknown) => string;
39
+ deserialize?: (v: string) => unknown;
40
+ /**
41
+ * Optional encryption hook for persisted payloads.
42
+ *
43
+ * Default is identity (no encryption). Data is stored in plaintext.
44
+ */
45
+ encrypt?: (v: string) => string;
46
+ /**
47
+ * Optional async encryption hook for persisted payloads.
48
+ *
49
+ * When provided, persistence will encrypt in the background and hydrate asynchronously.
50
+ */
51
+ encryptAsync?: (v: string) => Promise<string>;
52
+ /**
53
+ * Optional decryption hook for persisted payloads.
54
+ *
55
+ * Default is identity (no encryption). Data is stored in plaintext.
56
+ */
57
+ decrypt?: (v: string) => string;
58
+ /**
59
+ * Optional async decryption hook for persisted payloads.
60
+ *
61
+ * When provided, persistence will hydrate asynchronously after store creation.
62
+ */
63
+ decryptAsync?: (v: string) => Promise<string>;
64
+ /**
65
+ * Explicitly allow plaintext persistence when encrypt/decrypt are identity.
66
+ *
67
+ * In production builds, plaintext persistence is blocked unless this is true.
68
+ */
69
+ allowPlaintext?: boolean;
70
+ /**
71
+ * Marks this store's persisted data as sensitive (secrets/PII).
72
+ *
73
+ * When `true`, stroid throws at store creation time unless a non-identity
74
+ * `encrypt` hook is provided.
75
+ */
76
+ sensitiveData?: boolean;
77
+ /**
78
+ * Maximum allowed persisted payload size (in characters).
79
+ * When exceeded, hydration is skipped and an error is reported.
80
+ */
81
+ maxSize?: number;
82
+ /**
83
+ * Integrity check mode for persisted payloads.
84
+ * - "hash" (default): store and validate a checksum.
85
+ * - "none": skip checksum generation/validation.
86
+ * - "sha256": store a SHA-256 hash for stronger tamper detection (may be async in browsers).
87
+ */
88
+ checksum?: "hash" | "none" | "sha256";
89
+ version?: number;
90
+ migrations?: Record<number, (state: State) => State>;
91
+ onMigrationFail?: "reset" | "keep" | ((state: unknown) => unknown);
92
+ onStorageCleared?: (info: {
93
+ name: string;
94
+ key: string;
95
+ reason: "clear" | "remove" | "missing";
96
+ }) => void;
97
+ }
98
+ interface PersistConfig {
99
+ driver: PersistDriver;
100
+ key: string;
101
+ serialize: (v: unknown) => string;
102
+ deserialize: (v: string) => unknown;
103
+ encrypt: (v: string) => string;
104
+ decrypt: (v: string) => string;
105
+ encryptAsync?: (v: string) => Promise<string>;
106
+ decryptAsync?: (v: string) => Promise<string>;
107
+ allowPlaintext?: boolean;
108
+ sensitiveData?: boolean;
109
+ maxSize?: number;
110
+ checksum: "hash" | "none" | "sha256";
111
+ onMigrationFail?: "reset" | "keep" | ((state: unknown) => unknown);
112
+ onStorageCleared?: (info: {
113
+ name: string;
114
+ key: string;
115
+ reason: "clear" | "remove" | "missing";
116
+ }) => void;
117
+ }
118
+ interface MiddlewareCtx {
119
+ action: string;
120
+ name: string;
121
+ prev: StoreValue;
122
+ next: StoreValue;
123
+ path: unknown;
124
+ correlationId?: string;
125
+ traceContext?: TraceContext;
126
+ }
127
+ interface SyncOptions {
128
+ channel?: string;
129
+ maxPayloadBytes?: number;
130
+ /**
131
+ * Authentication policy for sync.
132
+ * - "strict": require authToken or verify (blocks sync if missing)
133
+ * - "insecure": allow unauthenticated sync (explicit opt-out)
134
+ */
135
+ policy?: "strict" | "insecure";
136
+ /**
137
+ * Optional shared token for lightweight cross-tab authentication.
138
+ * When set, incoming sync messages without a matching token are rejected.
139
+ */
140
+ authToken?: string;
141
+ /**
142
+ * Explicitly allow unauthenticated sync.
143
+ * Deprecated in favor of policy: "insecure".
144
+ */
145
+ insecure?: boolean;
146
+ conflictResolver?: (args: {
147
+ local: StoreValue;
148
+ incoming: StoreValue;
149
+ localUpdated: number;
150
+ incomingUpdated: number;
151
+ }) => StoreValue | void;
152
+ /**
153
+ * Optional guard to prevent rapid feedback loops when sync updates trigger local reactions.
154
+ *
155
+ * - true: enable with a default window (100ms)
156
+ * - { windowMs }: customize the guard window in milliseconds
157
+ * - false: disable (default is enabled when sync is truthy)
158
+ */
159
+ loopGuard?: boolean | {
160
+ windowMs?: number;
161
+ };
162
+ /**
163
+ * Optional checksum mode for sync payloads.
164
+ * - "hash" (default): include a checksum of the payload.
165
+ * - "none": skip checksum generation.
166
+ */
167
+ checksum?: "hash" | "none";
168
+ /**
169
+ * Optional signer for sync payloads. The returned value is attached to the message as `auth`.
170
+ */
171
+ sign?: (payload: SyncMessage) => unknown;
172
+ /**
173
+ * Optional verifier for incoming sync payloads.
174
+ * Return true to accept the message, false to reject it.
175
+ */
176
+ verify?: (payload: SyncMessage) => boolean;
177
+ /**
178
+ * Optional resolver for updatedAt timestamps when conflicts are resolved.
179
+ */
180
+ resolveUpdatedAt?: (args: {
181
+ localUpdated: number;
182
+ incomingUpdated: number | undefined;
183
+ now: number;
184
+ }) => number;
185
+ }
186
+ type SyncMessage = {
187
+ v: number;
188
+ protocol: number;
189
+ type: "sync-request" | "sync-state";
190
+ name: string;
191
+ clock: number;
192
+ source: string;
193
+ updatedAt?: number;
194
+ data?: StoreValue;
195
+ checksum?: number | null;
196
+ auth?: unknown;
197
+ token?: string;
198
+ requestedAt?: number;
199
+ };
200
+ interface DevtoolsOptions<State = StoreValue> {
201
+ enabled?: boolean;
202
+ historyLimit?: number;
203
+ redactor?: (state: State) => State;
204
+ }
205
+ interface LifecycleOptions<State = StoreValue> {
206
+ middleware?: Array<(ctx: MiddlewareCtx) => StoreValue | void>;
207
+ onSet?: (prev: State, next: State) => void;
208
+ onReset?: (prev: State, next: State) => void;
209
+ onDelete?: (prev: State) => void;
210
+ onCreate?: (initial: State) => void;
211
+ }
212
+ interface StoreOptions<State = StoreValue> {
213
+ scope?: StoreScope;
214
+ lazy?: boolean;
215
+ /**
216
+ * Allow `setStore(name, path, value)` to create missing **leaf** keys on object nodes.
217
+ *
218
+ * Default: `false` (strict path writes).
219
+ *
220
+ * Notes:
221
+ * - Does not expand arrays (out-of-bounds indices are still rejected).
222
+ * - Does not create missing intermediate objects for deep paths; define the shape up-front.
223
+ */
224
+ pathCreate?: boolean;
225
+ validate?: ValidateOption<State>;
226
+ persist?: boolean | string | PersistOptions<State>;
227
+ devtools?: boolean | DevtoolsOptions<State>;
228
+ lifecycle?: LifecycleOptions<State>;
229
+ middleware?: Array<(ctx: MiddlewareCtx) => StoreValue | void>;
230
+ onSet?: (prev: State, next: State) => void;
231
+ onReset?: (prev: State, next: State) => void;
232
+ onDelete?: (prev: State) => void;
233
+ onCreate?: (initial: State) => void;
234
+ onError?: (err: string) => void;
235
+ /** @deprecated use validate instead */
236
+ validator?: (next: State) => boolean;
237
+ /** @deprecated use validate instead */
238
+ schema?: unknown;
239
+ migrations?: Record<number, (state: State) => State>;
240
+ version?: number;
241
+ redactor?: (state: State) => State;
242
+ historyLimit?: number;
243
+ allowSSRGlobalStore?: boolean;
244
+ sync?: boolean | SyncOptions;
245
+ /**
246
+ * Optional feature option bag for third-party plugins.
247
+ * Keys are plugin names, values are plugin-specific options.
248
+ */
249
+ features?: FeatureOptions;
250
+ /**
251
+ * Snapshot cloning strategy used by subscriptions and selector snapshots.
252
+ *
253
+ * - "deep" (default): deep clone and dev-freeze snapshot values.
254
+ * - "shallow": shallow clone (top-level) only; nested references are shared.
255
+ * - "ref": return the live store reference (dev-freeze by default).
256
+ */
257
+ snapshot?: SnapshotMode;
258
+ /**
259
+ * Safety policy for snapshot deliveries when using "ref" or "shallow" modes.
260
+ * - "warn": (default) log a warning in dev when mutation is detected.
261
+ * - "throw": throw an error in dev when mutation is detected.
262
+ * - "auto-clone": in dev, if a subscriber mutates a frozen snapshot, deliver a cloned
263
+ * snapshot to that subscriber so the mutation does not affect other subscribers or the store.
264
+ */
265
+ snapshotSafety?: 'warn' | 'throw' | 'auto-clone';
266
+ }
267
+ interface NormalizedOptions {
268
+ scope: StoreScope;
269
+ lazy: boolean;
270
+ pathCreate: boolean;
271
+ persist: PersistConfig | null;
272
+ devtools: boolean;
273
+ middleware: Array<(ctx: MiddlewareCtx) => StoreValue | void>;
274
+ onSet?: (prev: StoreValue, next: StoreValue) => void;
275
+ onReset?: (prev: StoreValue, next: StoreValue) => void;
276
+ onDelete?: (prev: StoreValue) => void;
277
+ onCreate?: (initial: StoreValue) => void;
278
+ onError?: (err: string) => void;
279
+ validate?: ValidateOption;
280
+ migrations: Record<number, (state: any) => any>;
281
+ version: number;
282
+ redactor?: (state: StoreValue) => StoreValue;
283
+ historyLimit: number;
284
+ allowSSRGlobalStore?: boolean;
285
+ sync?: boolean | SyncOptions;
286
+ features?: FeatureOptions;
287
+ snapshot: SnapshotMode;
288
+ /** normalized snapshotSafety value */
289
+ snapshotSafety?: 'warn' | 'throw' | 'auto-clone';
290
+ explicitPersist: boolean;
291
+ explicitSync: boolean;
292
+ explicitDevtools: boolean;
293
+ }
294
+
295
+ export type { FeatureOptions as F, MiddlewareCtx as M, NormalizedOptions as N, PersistOptions as P, StoreOptions as S, StoreValue as a, SnapshotMode as b, FeatureOptionsMap as c, SyncOptions as d };
package/dist/persist.d.ts CHANGED
@@ -1 +1 @@
1
- export { installPersist_alias_1 as installPersist } from './_tsup-dts-rollup.js';
1
+ export { installPersist } from './install.js';
package/dist/persist.js CHANGED
@@ -1,2 +1,2 @@
1
- var pe=new Map,Y=(e,t)=>{pe.set(e,t);};var me=typeof Symbol=="function"?Symbol.for("stroid.persist.defaultCrypto"):"__stroid_persist_defaultCrypto__",V=e=>!!e?.[me],O=e=>{try{let t=`__stroid_plaintext_probe_${Math.random().toString(36).slice(2)}__`,n=`__stroid_plaintext_probe_${Math.random().toString(36).slice(2)}__`;return e(t)!==t?!1:e(n)===n}catch{return false}},K=(e,t,n)=>{let o="__stroid_persist_roundtrip_probe__",a;try{a=t(o);}catch(l){return {ok:false,reason:`persist: encrypt failed for store "${e}" (${l?.message??l})`}}if(typeof a!="string")return {ok:false,reason:`persist: encrypt must return a string for store "${e}".`};let c;try{c=n(a);}catch(l){return {ok:false,reason:`persist: decrypt failed for store "${e}" (${l?.message??l})`}}return typeof c!="string"?{ok:false,reason:`persist: decrypt must return a string for store "${e}".`}:c!==o?{ok:false,reason:`persist: encrypt/decrypt must round-trip for store "${e}".`}:{ok:true}};var J=(e,t,n)=>{e[t]&&(e[t].lastPresent=n);},G=({name:e,persistConfig:t,persistWatchState:n})=>{let o=t?.onStorageCleared;if(!t||typeof o!="function"||typeof window>"u"||typeof window.addEventListener!="function")return;n[e]?.dispose();let a=window,c=()=>{try{return t.driver.getItem?.(t.key)!=null}catch{return false}},l=u=>{let b=n[e],y=c();if(b){if(!b.lastPresent||y){b.lastPresent=y;return}b.lastPresent=false,o({name:e,key:t.key,reason:u});}},r=u=>{if(u.key===null){l("clear");return}u.key===t.key&&u.newValue===null&&l("remove");},s=()=>{l("missing");};a.addEventListener("storage",r),a.addEventListener("focus",s),n[e]={lastPresent:c(),dispose:()=>{a.removeEventListener("storage",r),a.removeEventListener("focus",s);}};};var N=({value:e,sanitize:t,validate:n,onSanitizeError:o})=>{let a;if(t)try{a=t(e);}catch(l){return o?.(l),{ok:false}}else a=e;let c=n(a);return c.ok?{ok:true,value:c.value??a}:{ok:false}},x=({value:e,fallbackMs:t=Date.now(),onInvalid:n})=>{if(typeof e=="number")return Number.isFinite(e)?e:(n?.(),t);if(typeof e=="string"){let o=Date.parse(e);return Number.isFinite(o)?o:(n?.(),t)}return n?.(),t};var ye=new Map,T=(e,t,n=0)=>{!e||typeof t!="function"||ye.set(e,{name:e,order:n,fn:t});};var Q=()=>({fetchRegistry:Object.create(null),inflight:Object.create(null),requestVersion:Object.create(null),cacheMeta:Object.create(null),rateWindowStart:Object.create(null),rateCount:Object.create(null),ratePruneState:{lastAt:0},ratePruneTimer:null,noSignalWarned:new Set,shapeWarned:new Set,autoCreateWarned:new Set,mutableResultWarned:new Set,cleanupSubs:Object.create(null),storeCleanupFns:Object.create(null),revalidateKeys:new Set,revalidateHandlers:Object.create(null),asyncMetrics:{cacheHits:0,cacheMisses:0,dedupes:0,requests:0,failures:0,avgMs:0,lastMs:0}});var $=new Map,Se=typeof __STROID_REGISTRY_ID__<"u"&&__STROID_REGISTRY_ID__||typeof process<"u"&&process.env?.STROID_REGISTRY_ID||void 0,X,Z=e=>(X||Se||e).replace(/\.ts(\?|$)/,".js$1"),he=Z(new URL("./store.js",import.meta.url).href);var be=()=>{X=void 0,$.clear();};T("registry.scope-override",be,110);var ke=()=>({pendingNotifications:new Set,pendingBuffer:[],orderedNames:[],notifyScheduled:false,batchDepth:0});var we=()=>({stores:Object.create(null),subscribers:Object.create(null),initialStates:Object.create(null),initialFactories:Object.create(null),metaEntries:Object.create(null),snapshotCache:Object.create(null),featureRuntimes:new Map,deletingStores:new Set,computedEntries:Object.create(null),computedDependents:Object.create(null),computedCleanups:new Map,transaction:{depth:0,pending:[],stagedValues:new Map,snapshotCache:new Map,failed:false,error:void 0},async:Q(),notify:ke()}),ve=e=>{let t=Z(e),n=$.get(t);if(n)return n;let o=we();return $.set(t,o),o};var ee=e=>e||ve(he);var Me={log:(e,t)=>{typeof console<"u"&&typeof console.log=="function"&&(t?console.log(`[stroid] ${e}`,t):console.log(`[stroid] ${e}`));},warn:(e,t)=>{typeof console<"u"&&typeof console.warn=="function"&&(t?console.warn(`[stroid] ${e}`,t):console.warn(`[stroid] ${e}`));},critical:(e,t)=>{typeof console<"u"&&typeof console.error=="function"&&(t?console.error(`[stroid] ${e}`,t):console.error(`[stroid] ${e}`));}},te={logSink:Me,flush:{chunkSize:Number.POSITIVE_INFINITY,chunkDelayMs:0,priorityStores:[]},revalidateOnFocus:{debounceMs:0,maxConcurrent:3,staggerMs:100},namespace:"",strictMissingFeatures:true,assertRuntime:false,strictMutatorReturns:true,asyncAutoCreate:false,asyncCloneResult:"none",defaultSnapshotMode:"deep",strictAsyncUsageErrors:false,middleware:[],allowUntrustedHydration:false,mutatorProduce:void 0},I=e=>({logSink:{...e.logSink},flush:{...e.flush},revalidateOnFocus:{...e.revalidateOnFocus},namespace:e.namespace,strictMissingFeatures:e.strictMissingFeatures,assertRuntime:e.assertRuntime,strictMutatorReturns:e.strictMutatorReturns,asyncAutoCreate:e.asyncAutoCreate,asyncCloneResult:e.asyncCloneResult,defaultSnapshotMode:e.defaultSnapshotMode,strictAsyncUsageErrors:e.strictAsyncUsageErrors,middleware:[...e.middleware],allowUntrustedHydration:e.allowUntrustedHydration,mutatorProduce:e.mutatorProduce}),W=new WeakMap,re=I(te),Ce=e=>{let t=W.get(e);return t||(t=I(re),W.set(e,t)),t};var z=()=>Ce(ee());var Pe=()=>{W=new WeakMap,re=I(te);};T("config.reset",Pe,90);typeof process<"u"&&typeof process.env?.NODE_ENV=="string"?process.env.NODE_ENV:void 0;typeof import.meta<"u"&&import.meta?.env?.MODE?import.meta.env.MODE:void 0;var _e=(e,t)=>{typeof console<"u"&&typeof console.warn=="function"&&(t?console.warn(`[stroid] ${e}`,t):console.warn(`[stroid] ${e}`));};var H=(e,t)=>{if((z().logSink.warn??_e)(e,t),z().assertRuntime)throw new Error(e)};var ne=new Set(["__proto__","constructor","prototype"]);var U=null,Oe=()=>{if(U)return U;let e,t=[];for(let n=0;n<256;n++){e=n;for(let o=0;o<8;o++)e=e&1?3988292384^e>>>1:e>>>1;t[n]=e>>>0;}return U=t,t},se=e=>{let t=Oe(),n=-1;for(let o=0;o<e.length;o++)n=n>>>0,n=n>>>8^t[(n^e.charCodeAt(o))&255];return (n^-1)>>>0},Te=2166136261,Ae=2654435761,De=1e5,v=(e,t)=>{let n=t>>>0;e.h1=Math.imul(e.h1^n,2246822507),e.h2=Math.imul(e.h2^n,3266489909);},R=(e,t)=>{v(e,t.length);for(let n=0;n<t.length;n++)v(e,t.charCodeAt(n));},S=(e,t)=>{R(e,t);},oe=(e,t)=>{if(Number.isNaN(t)){S(e,"NaN");return}if(!Number.isFinite(t)){S(e,t>0?"Infinity":"-Infinity");return}if(Object.is(t,-0)){S(e,"-0");return}let n=t|0;if(t===n){S(e,"int"),v(e,n);return}S(e,"num"),R(e,String(t));},M=(e,t)=>{if(e.nodes++>De){S(e,"[max]");return}if(t===null){S(e,"null");return}let n=typeof t;if(n==="string"){S(e,"string"),R(e,t);return}if(n==="number"){S(e,"number"),oe(e,t);return}if(n==="boolean"){S(e,t?"true":"false");return}if(n==="undefined"){S(e,"undefined");return}if(n==="bigint"){S(e,"bigint"),R(e,t.toString());return}if(n==="symbol"){S(e,"symbol");let s=t;R(e,Symbol.keyFor(s)??s.description??String(s));return}if(n==="function"){S(e,"function"),R(e,t.name||"anonymous");return}let o=t,a=e.seen.get(o);if(a!==void 0){S(e,"ref"),v(e,a);return}let c=e.nextId++;if(e.seen.set(o,c),Array.isArray(o)){S(e,"array"),v(e,o.length);for(let s=0;s<o.length;s++)Object.prototype.hasOwnProperty.call(o,s)?M(e,o[s]):S(e,"hole");return}if(o instanceof Date){S(e,"date"),oe(e,o.getTime());return}if(o instanceof Map){S(e,"map"),v(e,o.size),o.forEach((s,u)=>{M(e,u),M(e,s);});return}if(o instanceof Set){S(e,"set"),v(e,o.size),o.forEach(s=>{M(e,s);});return}S(e,"object");let l=Object.getOwnPropertyDescriptors(o),r=[];Object.entries(l).forEach(([s,u])=>{u?.enumerable&&(ne.has(s)||"get"in u||"set"in u||r.push([s,u]));}),v(e,r.length);for(let[s,u]of r)R(e,s),M(e,u.value);},B=e=>{if(typeof e=="string")return se(JSON.stringify(e));let t={h1:Te,h2:Ae,seen:new WeakMap,nextId:1,nodes:0};M(t,e);let n=t.h1>>>0,o=t.h2>>>0;return n^=n>>>16,n=Math.imul(n,2246822507),n^=n>>>13,n=Math.imul(n,3266489909),n^=n>>>16,o^=o>>>16,o=Math.imul(o,668265261),o^=o>>>15,o=Math.imul(o,374761393),o^=o>>>16,(n&2097151)*4294967296+(o>>>0)};var je=e=>{let t=new Uint8Array(e),n="";for(let o=0;o<t.length;o++)n+=t[o].toString(16).padStart(2,"0");return n},Ve=async e=>{if(typeof globalThis<"u"&&globalThis.crypto?.subtle){let t=typeof TextEncoder<"u"?new TextEncoder:null,n=t?t.encode(e):new Uint8Array(Buffer.from(e)),o=await globalThis.crypto.subtle.digest("SHA-256",n);return je(o)}try{let{createHash:t}=await import('crypto');return t("sha256").update(e).digest("hex")}catch{throw new Error("sha256 checksum is not supported in this environment")}},A=async(e,t,n=B)=>e==="none"?null:e==="sha256"?Ve(t):n(t);var L=({name:e,persisted:t,reason:n,persistConfig:o,initialState:a,reportStoreError:c,sanitize:l,deepClone:r})=>{c(e,n);let s=o?.onMigrationFail??"reset";if(s==="keep")return {state:t,requiresValidation:true};if(typeof s=="function")try{let u=s(r(t));if(u!==void 0)return {state:l(u),requiresValidation:!0};c(e,`onMigrationFail for "${e}" returned undefined. Falling back to initial state.`);}catch(u){c(e,`onMigrationFail for "${e}" failed: ${u?.message??u}`);}return {state:r(a),requiresValidation:true}},ae=e=>{let n=e.getMeta()?.options?.persist;return n?!!n.decryptAsync||n.checksum==="sha256"?xe(e):Ne(e):false},Ne=({name:e,silent:t=false,getMeta:n,getInitialState:o,applyFeatureState:a,reportStoreError:c,validate:l,log:r,hashState:s,deepClone:u,sanitize:b,shouldApply:y})=>{let p=n(),d=p?.options?.persist;if(!d)return false;let f=i=>N({value:i,validate:l});try{let i=d.driver.getItem?.(d.key)??null;if(!i)return !1;if(typeof i!="string")return c(e,`Persist driver for "${e}" returned an async value during sync hydration. Provide async decrypt hooks or use an async-capable persist driver.`),!0;let g=d.decrypt(i),h=JSON.parse(g),{v:m=1,checksum:k,data:w,updatedAt:D,updatedAtMs:C}=h||{};if(!w)return !0;let F=x({value:typeof C=="number"?C:D,fallbackMs:Date.now(),onInvalid:()=>{r(`persist: corrupt updatedAt in stored data for "${e}". Using current time to prevent sync overwrite.`);}});if(d.checksum!=="none"&&k!==s(w))return c(e,`Checksum mismatch loading store "${e}". Falling back to initial state.`),(!y||y())&&a(u(o()),Date.now()),!0;let _=d.deserialize(w),j=p?.version??1,E=ie({name:e,parsed:_,v:m,targetVersion:j,cfg:d,migrations:p?.options?.migrations??{},getInitialState:o,reportStoreError:c,sanitize:b,deepClone:u,validateState:f,safeUpdatedAt:F,applyFeatureState:a,shouldApply:y});return E.ok&&(_=E.state,(!y||y())&&(a(E.state,F),t||r(`Store "${e}" loaded from persistence`))),!0}catch(i){return c(e,`Could not load store "${e}" (${i?.message||i})`),true}},xe=async({name:e,silent:t=false,getMeta:n,getInitialState:o,applyFeatureState:a,reportStoreError:c,validate:l,log:r,hashState:s,deepClone:u,sanitize:b,shouldApply:y})=>{let p=n(),d=p?.options?.persist;if(!d)return false;let f=i=>N({value:i,validate:l});try{let i=await Promise.resolve(d.driver.getItem?.(d.key)??null);if(!i)return !1;let g=d.decryptAsync?await d.decryptAsync(i):d.decrypt(i),h=JSON.parse(g),{v:m=1,checksum:k,data:w,updatedAt:D,updatedAtMs:C}=h||{};if(!w)return !0;let F=x({value:typeof C=="number"?C:D,fallbackMs:Date.now(),onInvalid:()=>{r(`persist: corrupt updatedAt in stored data for "${e}". Using current time to prevent sync overwrite.`);}}),_=await A(d.checksum,w,s);if(d.checksum!=="none"&&k!==_)return c(e,`Checksum mismatch loading store "${e}". Falling back to initial state.`),(!y||y())&&a(u(o()),Date.now()),!0;let j=d.deserialize(w),E=p?.version??1,q=ie({name:e,parsed:j,v:m,targetVersion:E,cfg:d,migrations:p?.options?.migrations??{},getInitialState:o,reportStoreError:c,sanitize:b,deepClone:u,validateState:f,safeUpdatedAt:F,applyFeatureState:a,shouldApply:y});return q.ok&&(!y||y())&&(a(q.state,F),t||r(`Store "${e}" loaded from persistence`)),!0}catch(i){return c(e,`Could not load store "${e}" (${i?.message||i})`),true}},ie=({name:e,parsed:t,v:n,targetVersion:o,cfg:a,migrations:c,getInitialState:l,reportStoreError:r,sanitize:s,deepClone:u,validateState:b,safeUpdatedAt:y,applyFeatureState:p,shouldApply:d})=>{if(n!==o){let i=Object.keys(c).map(m=>Number(m)).filter(m=>m>n&&m<=o).sort((m,k)=>m-k);if(i.length===0){let m=L({name:e,persisted:t,reason:`No migration path from v${n} to v${o} for "${e}". Applying onMigrationFail strategy.`,persistConfig:a,initialState:l(),reportStoreError:r,sanitize:s,deepClone:u});if(t=m.state,!m.requiresValidation)return (!d||d())&&p(t,y),{ok:false,state:t}}let g=false,h=true;if(i.forEach(m=>{if(!g)try{let k=c[m](t);k!==void 0&&(t=k);}catch(k){let w=L({name:e,persisted:t,reason:`Migration to v${m} failed for "${e}": ${k?.message||k}`,persistConfig:a,initialState:l(),reportStoreError:r,sanitize:s,deepClone:u});t=w.state,h=w.requiresValidation,g=true;}}),g){if(!h)return (!d||d())&&p(t,y),{ok:false,state:t};let m=b(t);return m.ok?{ok:true,state:m.value??t}:((!d||d())&&p(u(l()),Date.now()),{ok:false,state:t})}}let f=b(t);if(!f.ok){if(n!==o){let i=L({name:e,persisted:t,reason:`Persisted state for "${e}" failed schema after version change. Applying onMigrationFail strategy.`,persistConfig:a,initialState:l(),reportStoreError:r,sanitize:s,deepClone:u});if(!i.requiresValidation)return (!d||d())&&p(i.state,y),{ok:false,state:i.state};let g=b(i.state);if(g.ok)return {ok:true,state:g.value??i.state}}return r(e,`Persisted state for "${e}" failed schema; resetting to initial.`),(!d||d())&&p(u(l()),Date.now()),{ok:false,state:t}}return {ok:true,state:f.value??t}};var ue=({name:e,persistTimers:t,persistInFlight:n,persistSequence:o,persistWatchState:a,plaintextWarningsIssued:c,exists:l,getMeta:r,getStoreValue:s,reportStoreError:u,hashState:b},y=false)=>{let p=r()?.options?.persist;if(!p)return;let d=async()=>{let g=r();if(!(!g?.options?.persist||g.options.persist!==p||!l())){if(!p.allowPlaintext&&!c.has(e)&&V(p.encrypt)&&V(p.decrypt)){c.add(e);let h=`[stroid/persist] Store '${e}' is persisted in plaintext. Provide encrypt/decrypt hooks to protect sensitive data.`;g.options.onError?.(h),H(h);}try{let h=p.serialize(s()),m=await A(p.checksum,h,b),k=JSON.stringify({v:g.version??1,updatedAt:g.updatedAt,updatedAtMs:g.updatedAtMs??Date.now(),checksum:m,data:h}),w=p.encryptAsync?await p.encryptAsync(k):p.encrypt(k);await Promise.resolve(p.driver.setItem?.(p.key,w)),J(a,e,!0);}catch(h){u(e,`Could not persist store "${e}" (${h?.message||h})`);}}},f=g=>{let h=n[e],m=(o[e]??0)+1;o[e]=m;let w=(async()=>{h&&await h,!(g&&t[e]!==g)&&o[e]===m&&await d();})().finally(()=>{n[e]===w&&(n[e]=null),g&&t[e]===g&&delete t[e];});n[e]=w;};if(y){t[e]&&(clearTimeout(t[e]),delete t[e]),f();return}t[e]&&clearTimeout(t[e]);let i=setTimeout(()=>{t[e]===i&&f(i);},0);t[e]=i;},P=e=>ue(e),ce=(e,t)=>ue({...t,name:e},true);var le=false,$e=typeof process<"u"&&typeof process.env?.NODE_ENV=="string"?process.env.NODE_ENV:void 0,We=typeof import.meta<"u"&&import.meta?.env?.MODE?import.meta.env.MODE:void 0,Ie=$e??We,ze=()=>Ie==="production",He=()=>{let e={},t={},n=Object.create(null),o=Object.create(null),a=Object.create(null),c=new Set,l=Object.create(null);return {api:{getPersistQueueDepth(r){return e[r]?1:0}},onStoreCreate(r){let s=r.options.persist;if(!s)return;if(!s.encryptAsync&&O(s.encrypt)&&O(s.decrypt)&&!s.allowPlaintext){let f=`[stroid/persist] Store "${r.name}" is configured for plaintext persistence. Provide encrypt/decrypt hooks or set persist.allowPlaintext: true to acknowledge.`;if(ze()){r.reportStoreError(f),r.options.persist=null;return}r.warn(f);}if(s.sensitiveData&&!s.encryptAsync&&O(s.encrypt)){r.reportStoreError(`persist: store "${r.name}" is marked sensitiveData but has no encrypt function. Plaintext data will be written to storage.`);return}let b=K(r.name,s.encrypt,s.decrypt);if(!b.ok){r.reportStoreError(b.reason??`persist: encrypt/decrypt validation failed for store "${r.name}".`),r.options.persist=null;return}if(s.key){let f=o[s.key];f&&f!==r.name&&r.isDev()?r.warn(`Persist key collision: "${s.key}" already used by store "${f}". Store "${r.name}" will overwrite the same storage key.`):o[s.key]=r.name;}let y=r.getMeta()?.updateCount??0,p=()=>{let f=r.getMeta();return f?(f.updateCount??0)===y:false},d=ae({name:r.name,silent:true,getMeta:r.getMeta,getInitialState:r.getInitialState,applyFeatureState:r.applyFeatureState,reportStoreError:(f,i)=>r.reportStoreError(i),validate:r.validate,log:r.log,hashState:r.hashState,deepClone:r.deepClone,sanitize:r.sanitize,shouldApply:p});if(typeof d?.then=="function"?(l[r.name]={loading:true,pendingSave:false},d.then(f=>{let i=l[r.name];i&&(i.loading=false,(!f||i.pendingSave)&&P({name:r.name,persistTimers:e,persistInFlight:t,persistSequence:n,persistWatchState:a,plaintextWarningsIssued:c,exists:()=>r.hasStore(),getMeta:r.getMeta,getStoreValue:r.getStoreValue,reportStoreError:(g,h)=>r.reportStoreError(h),hashState:r.hashState}),delete l[r.name]);}).catch(()=>{let f=l[r.name];f&&(f.loading=false,f.pendingSave&&P({name:r.name,persistTimers:e,persistInFlight:t,persistSequence:n,persistWatchState:a,plaintextWarningsIssued:c,exists:()=>r.hasStore(),getMeta:r.getMeta,getStoreValue:r.getStoreValue,reportStoreError:(i,g)=>r.reportStoreError(g),hashState:r.hashState}),delete l[r.name]);})):d||P({name:r.name,persistTimers:e,persistInFlight:t,persistSequence:n,persistWatchState:a,plaintextWarningsIssued:c,exists:()=>r.hasStore(),getMeta:r.getMeta,getStoreValue:r.getStoreValue,reportStoreError:(f,i)=>r.reportStoreError(i),hashState:r.hashState}),typeof window<"u"&&typeof window.addEventListener=="function"){let f=()=>{ce(r.name,{name:r.name,persistTimers:e,persistInFlight:t,persistSequence:n,persistWatchState:a,plaintextWarningsIssued:c,exists:()=>r.hasStore(),getMeta:r.getMeta,getStoreValue:r.getStoreValue,reportStoreError:(i,g)=>r.reportStoreError(g),hashState:r.hashState});};window.addEventListener("pagehide",f,{once:true}),window.addEventListener("beforeunload",f,{once:true});}G({name:r.name,persistConfig:s,persistWatchState:a});},onStoreWrite(r){if(!r.options.persist)return;let s=l[r.name];if(s?.loading){s.pendingSave=true;return}P({name:r.name,persistTimers:e,persistInFlight:t,persistSequence:n,persistWatchState:a,plaintextWarningsIssued:c,exists:()=>r.hasStore(),getMeta:r.getMeta,getStoreValue:r.getStoreValue,reportStoreError:(u,b)=>r.reportStoreError(b),hashState:r.hashState});},beforeStoreDelete(r){let s=r.options.persist;if(s){delete l[r.name],e[r.name]&&(clearTimeout(e[r.name]),delete e[r.name]),t[r.name]=null,delete n[r.name];try{s.driver.removeItem?.(s.key);}catch{}s.key&&o[s.key]===r.name&&delete o[s.key],a[r.name]?.dispose(),delete a[r.name];}},resetAll(){Object.values(e).forEach(r=>clearTimeout(r)),Object.values(a).forEach(r=>{try{r.dispose();}catch{}}),Object.keys(e).forEach(r=>delete e[r]),Object.keys(t).forEach(r=>{t[r]=null,delete t[r];}),Object.keys(n).forEach(r=>delete n[r]),Object.keys(o).forEach(r=>delete o[r]),Object.keys(a).forEach(r=>delete a[r]),Object.keys(l).forEach(r=>delete l[r]),c.clear();}}},de=()=>{le||(le=true,Y("persist",He));};var fe=()=>{de();};fe();export{fe as installPersist};//# sourceMappingURL=persist.js.map
1
+ var $=new Map,X=(e,t)=>{$.set(e,t);};var Q=e=>$.get(e),Z=()=>Array.from($.keys());var Me=typeof Symbol=="function"?Symbol.for("stroid.persist.defaultCrypto"):"__stroid_persist_defaultCrypto__",z=e=>!!e?.[Me],j=e=>{try{let t=`__stroid_plaintext_probe_${Math.random().toString(36).slice(2)}__`,n=`__stroid_plaintext_probe_${Math.random().toString(36).slice(2)}__`;return e(t)!==t?!1:e(n)===n}catch{return false}},ee=(e,t,n)=>{let o="__stroid_persist_roundtrip_probe__",i;try{i=t(o);}catch(p){return {ok:false,reason:`persist: encrypt failed for store "${e}" (${p?.message??p})`}}if(typeof i!="string")return {ok:false,reason:`persist: encrypt must return a string for store "${e}".`};let u;try{u=n(i);}catch(p){return {ok:false,reason:`persist: decrypt failed for store "${e}" (${p?.message??p})`}}return typeof u!="string"?{ok:false,reason:`persist: decrypt must return a string for store "${e}".`}:u!==o?{ok:false,reason:`persist: encrypt/decrypt must round-trip for store "${e}".`}:{ok:true}};var te=(e,t,n)=>{e[t]&&(e[t].lastPresent=n);},re=({name:e,persistConfig:t,persistWatchState:n})=>{let o=t?.onStorageCleared;if(!t||typeof o!="function"||typeof window>"u"||typeof window.addEventListener!="function")return;n[e]?.dispose();let i=window,u=()=>{try{return t.driver.getItem?.(t.key)!=null}catch{return false}},p=s=>{let h=n[e],b=u();if(h){if(!h.lastPresent||b){h.lastPresent=b;return}h.lastPresent=false,o({name:e,key:t.key,reason:s});}},g=s=>{if(s.key===null){p("clear");return}s.key===t.key&&s.newValue===null&&p("remove");},r=()=>{p("missing");};i.addEventListener("storage",g),i.addEventListener("focus",r),n[e]={lastPresent:u(),dispose:()=>{i.removeEventListener("storage",g),i.removeEventListener("focus",r);}};};var W=({value:e,sanitize:t,validate:n,onSanitizeError:o})=>{let i;if(t)try{i=t(e);}catch(p){return o?.(p),{ok:false}}else i=e;let u=n(i);return u.ok?{ok:true,value:u.value??i}:{ok:false}},H=({value:e,fallbackMs:t=Date.now(),onInvalid:n})=>{if(typeof e=="number")return Number.isFinite(e)?e:(n?.(),t);if(typeof e=="string"){let o=Date.parse(e);return Number.isFinite(o)?o:(n?.(),t)}return n?.(),t};var Ce=new Map,D=(e,t,n=0)=>{!e||typeof t!="function"||Ce.set(e,{name:e,order:n,fn:t});};var Fe=()=>new Map([["noSignal",new Set],["shape",new Set],["autoCreate",new Set],["mutableResult",new Set]]),ne=()=>({fetchRegistry:Object.create(null),inflight:Object.create(null),requestVersion:Object.create(null),cacheMeta:Object.create(null),rateWindowStart:Object.create(null),rateCount:Object.create(null),ratePruneState:{lastAt:0},ratePruneTimer:null,warnedOnce:Fe(),storeCleanups:Object.create(null),revalidateKeys:new Set,revalidateHandlers:Object.create(null),asyncMetrics:{cacheHits:0,cacheMisses:0,dedupes:0,requests:0,failures:0,avgMs:0,lastMs:0}});var L=new Map,oe=new WeakSet,Ee=e=>{oe.has(e)||(oe.add(e),Z().forEach(t=>{if(!e.featureRuntimes.get(t)){let n=Q(t);n&&e.featureRuntimes.set(t,n());}}));},Pe=typeof __STROID_REGISTRY_ID__<"u"&&__STROID_REGISTRY_ID__||typeof process<"u"&&process.env?.STROID_REGISTRY_ID||void 0,se,ie=e=>(se||Pe||e).replace(/\.ts(\?|$)/,".js$1"),Te=ie(new URL("../../store.js",import.meta.url).href);var xe=()=>{se=void 0,L.clear();};D("registry.scope-override",xe,110);var Oe=()=>({pendingNotifications:new Set,pendingBuffer:[],orderedNames:[],subscriberBuffer:[],notifyScheduled:false,batchDepth:0,flushId:0,isFlushing:false});var _e=()=>({depth:0,pending:[],stagedValues:new Map,snapshotCache:new Map,failed:false,error:void 0}),Ae=(e="default")=>{let t={scope:e,stores:Object.create(null),subscribers:Object.create(null),initialStates:Object.create(null),initialFactories:Object.create(null),metaEntries:Object.create(null),snapshotCache:Object.create(null),featureRuntimes:new Map,deletingStores:new Set,computedEntries:Object.create(null),computedDependents:Object.create(null),computedCleanups:new Map,transaction:_e(),async:ne(),notify:Oe(),lifecycleListener:null};return Ee(t),t},je=e=>{let t=ie(e),n=L.get(t);if(n)return n;let o=Ae();return L.set(t,o),o};var v=[],Ve={run:(e,t)=>{v.push(e);try{return t()}finally{v.pop();}},get:()=>v.length>0?v[v.length-1]:null,enterWith:e=>{if(v.length>0){v[v.length-1]=e;return}v.push(e);}};var ae=e=>(Ve).get()||e||je(Te);var Ne={log:(e,t)=>{typeof console<"u"&&typeof console.log=="function"&&(t?console.log(`[stroid] ${e}`,t):console.log(`[stroid] ${e}`));},warn:(e,t)=>{typeof console<"u"&&typeof console.warn=="function"&&(t?console.warn(`[stroid] ${e}`,t):console.warn(`[stroid] ${e}`));},critical:(e,t)=>{typeof console<"u"&&typeof console.error=="function"&&(t?console.error(`[stroid] ${e}`,t):console.error(`[stroid] ${e}`));}},ue={logSink:Ne,flush:{chunkSize:Number.POSITIVE_INFINITY,chunkDelayMs:0,priorityStores:[]},revalidateOnFocus:{debounceMs:0,maxConcurrent:3,staggerMs:100},namespace:"",strictMissingFeatures:true,assertRuntime:false,strictMutatorReturns:true,asyncAutoCreate:false,asyncCloneResult:"none",autoCorrelationIds:false,acknowledgeLooseTypes:false,pathCacheSize:500,defaultSnapshotMode:"deep",strictAsyncUsageErrors:false,middleware:[],allowUntrustedHydration:false,mutatorProduce:void 0,selectorCloneFrozen:true},U=e=>({logSink:{...e.logSink},flush:{...e.flush},revalidateOnFocus:{...e.revalidateOnFocus},namespace:e.namespace,strictMissingFeatures:e.strictMissingFeatures,assertRuntime:e.assertRuntime,strictMutatorReturns:e.strictMutatorReturns,asyncAutoCreate:e.asyncAutoCreate,asyncCloneResult:e.asyncCloneResult,autoCorrelationIds:e.autoCorrelationIds,acknowledgeLooseTypes:e.acknowledgeLooseTypes,pathCacheSize:e.pathCacheSize,defaultSnapshotMode:e.defaultSnapshotMode,strictAsyncUsageErrors:e.strictAsyncUsageErrors,middleware:[...e.middleware],allowUntrustedHydration:e.allowUntrustedHydration,mutatorProduce:e.mutatorProduce,selectorCloneFrozen:e.selectorCloneFrozen}),B=new WeakMap,ce=U(ue),Ie=e=>{let t=B.get(e);return t||(t=U(ce),B.set(e,t)),t};var q=()=>Ie(ae());var He=()=>{B=new WeakMap,ce=U(ue);};D("config.reset",He,90);typeof process<"u"&&typeof process.env?.NODE_ENV=="string"?process.env.NODE_ENV:void 0;typeof import.meta<"u"&&import.meta?.env?.MODE?import.meta.env.MODE:void 0;var Le=(e,t)=>{typeof console<"u"&&typeof console.warn=="function"&&(t?console.warn(`[stroid] ${e}`,t):console.warn(`[stroid] ${e}`));};var O=(e,t)=>{if((q().logSink.warn??Le)(e,t),q().assertRuntime)throw new Error(e)};var le=new Set(["__proto__","constructor","prototype"]);var Y=null,Be=()=>{if(Y)return Y;let e,t=[];for(let n=0;n<256;n++){e=n;for(let o=0;o<8;o++)e=e&1?3988292384^e>>>1:e>>>1;t[n]=e>>>0;}return Y=t,t},fe=e=>{let t=Be(),n=-1;for(let o=0;o<e.length;o++)n=n>>>0,n=n>>>8^t[(n^e.charCodeAt(o))&255];return (n^-1)>>>0},Ue=2166136261,qe=2654435761,Ye=1e5,R=(e,t)=>{let n=t>>>0;e.h1=Math.imul(e.h1^n,2246822507),e.h2=Math.imul(e.h2^n,3266489909);},C=(e,t)=>{R(e,t.length);for(let n=0;n<t.length;n++)R(e,t.charCodeAt(n));},S=(e,t)=>{C(e,t);},de=(e,t)=>{if(Number.isNaN(t)){S(e,"NaN");return}if(!Number.isFinite(t)){S(e,t>0?"Infinity":"-Infinity");return}if(Object.is(t,-0)){S(e,"-0");return}let n=t|0;if(t===n){S(e,"int"),R(e,n);return}S(e,"num"),C(e,String(t));},F=(e,t)=>{if(e.nodes++>Ye){S(e,"[max]");return}if(t===null){S(e,"null");return}let n=typeof t;if(n==="string"){S(e,"string"),C(e,t);return}if(n==="number"){S(e,"number"),de(e,t);return}if(n==="boolean"){S(e,t?"true":"false");return}if(n==="undefined"){S(e,"undefined");return}if(n==="bigint"){S(e,"bigint"),C(e,t.toString());return}if(n==="symbol"){S(e,"symbol");let r=t;C(e,Symbol.keyFor(r)??r.description??String(r));return}if(n==="function"){S(e,"function"),C(e,t.name||"anonymous");return}let o=t,i=e.seen.get(o);if(i!==void 0){S(e,"ref"),R(e,i);return}let u=e.nextId++;if(e.seen.set(o,u),Array.isArray(o)){S(e,"array"),R(e,o.length);for(let r=0;r<o.length;r++)Object.prototype.hasOwnProperty.call(o,r)?F(e,o[r]):S(e,"hole");return}if(o instanceof Date){S(e,"date"),de(e,o.getTime());return}if(o instanceof Map){S(e,"map"),R(e,o.size),o.forEach((r,s)=>{F(e,s),F(e,r);});return}if(o instanceof Set){S(e,"set"),R(e,o.size),o.forEach(r=>{F(e,r);});return}S(e,"object");let p=Object.getOwnPropertyDescriptors(o),g=[];Object.entries(p).forEach(([r,s])=>{s?.enumerable&&(le.has(r)||"get"in s||"set"in s||g.push([r,s]));}),R(e,g.length);for(let[r,s]of g)C(e,r),F(e,s.value);},K=e=>{if(typeof e=="string")return fe(JSON.stringify(e));let t={h1:Ue,h2:qe,seen:new WeakMap,nextId:1,nodes:0};F(t,e);let n=t.h1>>>0,o=t.h2>>>0;return n^=n>>>16,n=Math.imul(n,2246822507),n^=n>>>13,n=Math.imul(n,3266489909),n^=n>>>16,o^=o>>>16,o=Math.imul(o,668265261),o^=o>>>15,o=Math.imul(o,374761393),o^=o>>>16,(n&2097151)*4294967296+(o>>>0)};var Ge=e=>{let t=new Uint8Array(e),n="";for(let o=0;o<t.length;o++)n+=t[o].toString(16).padStart(2,"0");return n},Xe=async e=>{if(typeof globalThis<"u"&&globalThis.crypto?.subtle){let t=typeof TextEncoder<"u"?new TextEncoder:null,n=t?t.encode(e):new Uint8Array(Buffer.from(e)),o=await globalThis.crypto.subtle.digest("SHA-256",n);return Ge(o)}try{let{createHash:t}=await import('crypto');return t("sha256").update(e).digest("hex")}catch{throw new Error("sha256 checksum is not supported in this environment")}},V=async(e,t,n=K)=>e==="none"?null:e==="sha256"?Xe(t):n(t);var pe=1e6,ge=(e,t)=>{let n=e?.options?.migrations??{};if(Object.keys(n).length>0)return n;let o=t?.migrate;if(typeof o!="function")return n;let i=e?.version??1;return !Number.isFinite(i)||i<=1?n:{[i]:o}},J=({name:e,persisted:t,reason:n,persistConfig:o,initialState:i,reportStoreError:u,sanitize:p,deepClone:g})=>{u(e,n);let r=o?.onMigrationFail??"reset";if(r==="keep")return {state:t,requiresValidation:true};if(typeof r=="function")try{let s=r(g(t));if(s!==void 0)return {state:p(s),requiresValidation:!0};u(e,`onMigrationFail for "${e}" returned undefined. Falling back to initial state.`);}catch(s){u(e,`onMigrationFail for "${e}" failed: ${s?.message??s}`);}return {state:g(i),requiresValidation:true}},ye=e=>{let n=e.getMeta()?.options?.persist;return n?!!n.decryptAsync||n.checksum==="sha256"?Ze(e):Qe(e):false},Qe=({name:e,silent:t=false,getMeta:n,getInitialState:o,applyFeatureState:i,reportStoreError:u,warnMissingMaxSize:p,validate:g,log:r,hashState:s,deepClone:h,sanitize:b,shouldApply:y})=>{let m=n(),c=m?.options?.persist;if(!c)return false;let l=ge(m,c),f=a=>W({value:a,validate:g});try{let a=c.driver.getItem?.(c.key)??null;if(!a)return !1;if(typeof a!="string")return u(e,`Persist driver for "${e}" returned an async value during sync hydration. Provide async decrypt hooks or use an async-capable persist driver.`),!0;if(typeof c.maxSize!="number"&&a.length>pe&&p?.(a.length),typeof c.maxSize=="number"&&a.length>c.maxSize)return u(e,`Persist payload for "${e}" exceeds maxSize (${a.length} > ${c.maxSize}). Skipping hydration.`),!0;let d=c.decrypt(a),k=JSON.parse(d),{v:w=1,checksum:E,data:M,updatedAt:N,updatedAtMs:P}=k||{};if(!M)return !0;let T=H({value:typeof P=="number"?P:N,fallbackMs:Date.now(),onInvalid:()=>{r(`persist: corrupt updatedAt in stored data for "${e}". Using current time to prevent sync overwrite.`);}});if(c.checksum!=="none"&&E!==s(M))return u(e,`Checksum mismatch loading store "${e}". Falling back to initial state.`),(!y||y())&&i(h(o()),Date.now()),!0;let A=c.deserialize(M),I=m?.version??1,x=me({name:e,parsed:A,v:w,targetVersion:I,cfg:c,migrations:l,getInitialState:o,reportStoreError:u,sanitize:b,deepClone:h,validateState:f,safeUpdatedAt:T,applyFeatureState:i,shouldApply:y});return x.ok&&(A=x.state,(!y||y())&&(i(x.state,T),t||r(`Store "${e}" loaded from persistence`))),!0}catch(a){return u(e,`Could not load store "${e}" (${a?.message||a})`),true}},Ze=async({name:e,silent:t=false,getMeta:n,getInitialState:o,applyFeatureState:i,reportStoreError:u,warnMissingMaxSize:p,validate:g,log:r,hashState:s,deepClone:h,sanitize:b,shouldApply:y})=>{let m=n(),c=m?.options?.persist;if(!c)return false;let l=ge(m,c),f=a=>W({value:a,validate:g});try{let a=await Promise.resolve(c.driver.getItem?.(c.key)??null);if(!a)return !1;if(typeof c.maxSize!="number"&&typeof a=="string"&&a.length>pe&&p?.(a.length),typeof c.maxSize=="number"&&typeof a=="string"&&a.length>c.maxSize)return u(e,`Persist payload for "${e}" exceeds maxSize (${a.length} > ${c.maxSize}). Skipping hydration.`),!0;let d=c.decryptAsync?await c.decryptAsync(a):c.decrypt(a),k=JSON.parse(d),{v:w=1,checksum:E,data:M,updatedAt:N,updatedAtMs:P}=k||{};if(!M)return !0;let T=H({value:typeof P=="number"?P:N,fallbackMs:Date.now(),onInvalid:()=>{r(`persist: corrupt updatedAt in stored data for "${e}". Using current time to prevent sync overwrite.`);}}),A=await V(c.checksum,M,s);if(c.checksum!=="none"&&E!==A)return u(e,`Checksum mismatch loading store "${e}". Falling back to initial state.`),(!y||y())&&i(h(o()),Date.now()),!0;let I=c.deserialize(M),x=m?.version??1,G=me({name:e,parsed:I,v:w,targetVersion:x,cfg:c,migrations:l,getInitialState:o,reportStoreError:u,sanitize:b,deepClone:h,validateState:f,safeUpdatedAt:T,applyFeatureState:i,shouldApply:y});return G.ok&&(!y||y())&&(i(G.state,T),t||r(`Store "${e}" loaded from persistence`)),!0}catch(a){return u(e,`Could not load store "${e}" (${a?.message||a})`),true}},me=({name:e,parsed:t,v:n,targetVersion:o,cfg:i,migrations:u,getInitialState:p,reportStoreError:g,sanitize:r,deepClone:s,validateState:h,safeUpdatedAt:b,applyFeatureState:y,shouldApply:m})=>{if(n!==o){let l=Object.keys(u).map(d=>Number(d)).filter(d=>d>n&&d<=o).sort((d,k)=>d-k);if(l.length===0){let d=J({name:e,persisted:t,reason:`No migration path from v${n} to v${o} for "${e}". Applying onMigrationFail strategy.`,persistConfig:i,initialState:p(),reportStoreError:g,sanitize:r,deepClone:s});if(t=d.state,!d.requiresValidation)return (!m||m())&&y(t,b),{ok:false,state:t}}let f=false,a=true;if(l.forEach(d=>{if(!f)try{let k=u[d](t);k!==void 0&&(t=k);}catch(k){let w=J({name:e,persisted:t,reason:`Migration to v${d} failed for "${e}": ${k?.message||k}`,persistConfig:i,initialState:p(),reportStoreError:g,sanitize:r,deepClone:s});t=w.state,a=w.requiresValidation,f=true;}}),f){if(!a)return (!m||m())&&y(t,b),{ok:false,state:t};let d=h(t);return d.ok?{ok:true,state:d.value??t}:((!m||m())&&y(s(p()),Date.now()),{ok:false,state:t})}}let c=h(t);if(!c.ok){if(n!==o){let l=i?.onMigrationFail??"reset",f=J({name:e,persisted:t,reason:`Persisted state for "${e}" failed schema after version change. Applying onMigrationFail strategy.`,persistConfig:i,initialState:p(),reportStoreError:g,sanitize:r,deepClone:s});if(!f.requiresValidation)return (!m||m())&&y(f.state,b),{ok:false,state:f.state};let a=h(f.state);if(a.ok)return l==="reset"&&g(e,`Persisted state for "${e}" failed schema; resetting to initial.`),{ok:true,state:a.value??f.state}}return g(e,`Persisted state for "${e}" failed schema; resetting to initial.`),(!m||m())&&y(s(p()),Date.now()),{ok:false,state:t}}return {ok:true,state:c.value??t}};var Se=(e,t,...n)=>{if(typeof e=="function")try{e(...n);}catch(o){let i=o?.message??o;O(`${t} callback threw: ${String(i)}`);}};var he=({name:e,persistTimers:t,persistInFlight:n,persistSequence:o,persistWatchState:i,plaintextWarningsIssued:u,exists:p,getMeta:g,getStoreValue:r,reportStoreError:s,hashState:h},b=false)=>{let y=g()?.options?.persist;if(!y)return;let m=async f=>{let a=g();if(!(!a?.options?.persist||a.options.persist!==y||!p())&&!(f!==void 0&&o[e]!==f)){if(!y.allowPlaintext&&!u.has(e)&&z(y.encrypt)&&z(y.decrypt)){u.add(e);let d=`[stroid/persist] Store '${e}' is persisted in plaintext. Provide encrypt/decrypt hooks to protect sensitive data.`;Se(a.options.onError,`onError(${e})`,d),O(d);}try{let d=y.serialize(r()),k=await V(y.checksum,d,h),w=JSON.stringify({v:a.version??1,updatedAt:a.updatedAt,updatedAtMs:a.updatedAtMs??Date.now(),checksum:k,data:d}),E=y.encryptAsync?await y.encryptAsync(w):y.encrypt(w);if(f!==void 0&&o[e]!==f)return;await Promise.resolve(y.driver.setItem?.(y.key,E)),te(i,e,!0);}catch(d){s(e,`Could not persist store "${e}" (${d?.message||d})`);}}},c=f=>{let a=n[e],d=(o[e]??0)+1;o[e]=d;let w=(async()=>{a&&await a,!(f&&t[e]!==f)&&o[e]===d&&await m(d);})().finally(()=>{n[e]===w&&(n[e]=null),f&&t[e]===f&&delete t[e];});n[e]=w;};if(b){t[e]&&(clearTimeout(t[e]),delete t[e]),c();return}t[e]&&clearTimeout(t[e]);let l=setTimeout(()=>{t[e]===l&&c(l);},0);t[e]=l;},_=e=>he(e),be=(e,t)=>he({...t,name:e},true);var ke=false,et=typeof process<"u"&&typeof process.env?.NODE_ENV=="string"?process.env.NODE_ENV:void 0,tt=typeof import.meta<"u"&&import.meta?.env?.MODE?import.meta.env.MODE:void 0,rt=et??tt,nt=()=>rt==="production",ot=()=>{let e={},t={},n=Object.create(null),o=Object.create(null),i=Object.create(null),u=new Set,p=new Set,g=Object.create(null);return {api:{getPersistQueueDepth(r){return e[r]?1:0}},onStoreCreate(r){let s=r.options.persist;if(!s)return;if(!s.encryptAsync&&j(s.encrypt)&&j(s.decrypt)&&!s.allowPlaintext){let l=`[stroid/persist] Store "${r.name}" is configured for plaintext persistence. Provide encrypt/decrypt hooks or set persist.allowPlaintext: true to acknowledge.`;if(nt()){r.reportStoreError(l),r.options.persist=null;return}r.warn(l);}if(s.sensitiveData&&!s.encryptAsync&&j(s.encrypt)){r.reportStoreError(`persist: store "${r.name}" is marked sensitiveData but has no encrypt function. Plaintext data will be written to storage.`);return}let b=ee(r.name,s.encrypt,s.decrypt);if(!b.ok){r.reportStoreError(b.reason??`persist: encrypt/decrypt validation failed for store "${r.name}".`),r.options.persist=null;return}if(s.key){let l=o[s.key];l&&l!==r.name&&r.isDev()?r.warn(`Persist key collision: "${s.key}" already used by store "${l}". Store "${r.name}" will overwrite the same storage key.`):o[s.key]=r.name;}let y=r.getMeta()?.updateCount??0,m=()=>{let l=r.getMeta();return l?(l.updateCount??0)===y:false},c=ye({name:r.name,silent:true,getMeta:r.getMeta,getInitialState:r.getInitialState,applyFeatureState:r.applyFeatureState,reportStoreError:(l,f)=>r.reportStoreError(f),warnMissingMaxSize:l=>{p.has(r.name)||(p.add(r.name),r.warnAlways(`[stroid/persist] Store "${r.name}" loaded ${l} bytes without a maxSize guard. Set persist.maxSize to prevent oversized payloads.`));},validate:r.validate,log:r.log,hashState:r.hashState,deepClone:r.deepClone,sanitize:r.sanitize,shouldApply:m});if(typeof c?.then=="function"?(g[r.name]={loading:true,pendingSave:false},c.then(l=>{let f=g[r.name];f&&(f.loading=false,(!l||f.pendingSave)&&_({name:r.name,persistTimers:e,persistInFlight:t,persistSequence:n,persistWatchState:i,plaintextWarningsIssued:u,exists:()=>r.hasStore(),getMeta:r.getMeta,getStoreValue:r.getStoreValue,reportStoreError:(a,d)=>r.reportStoreError(d),hashState:r.hashState}),delete g[r.name]);}).catch(()=>{let l=g[r.name];l&&(l.loading=false,l.pendingSave&&_({name:r.name,persistTimers:e,persistInFlight:t,persistSequence:n,persistWatchState:i,plaintextWarningsIssued:u,exists:()=>r.hasStore(),getMeta:r.getMeta,getStoreValue:r.getStoreValue,reportStoreError:(f,a)=>r.reportStoreError(a),hashState:r.hashState}),delete g[r.name]);})):c||_({name:r.name,persistTimers:e,persistInFlight:t,persistSequence:n,persistWatchState:i,plaintextWarningsIssued:u,exists:()=>r.hasStore(),getMeta:r.getMeta,getStoreValue:r.getStoreValue,reportStoreError:(l,f)=>r.reportStoreError(f),hashState:r.hashState}),typeof window<"u"&&typeof window.addEventListener=="function"){let l=()=>{be(r.name,{name:r.name,persistTimers:e,persistInFlight:t,persistSequence:n,persistWatchState:i,plaintextWarningsIssued:u,exists:()=>r.hasStore(),getMeta:r.getMeta,getStoreValue:r.getStoreValue,reportStoreError:(f,a)=>r.reportStoreError(a),hashState:r.hashState});};window.addEventListener("pagehide",l,{once:true}),window.addEventListener("beforeunload",l,{once:true});}re({name:r.name,persistConfig:s,persistWatchState:i});},onStoreWrite(r){if(!r.options.persist)return;let s=g[r.name];if(s?.loading){s.pendingSave=true;return}_({name:r.name,persistTimers:e,persistInFlight:t,persistSequence:n,persistWatchState:i,plaintextWarningsIssued:u,exists:()=>r.hasStore(),getMeta:r.getMeta,getStoreValue:r.getStoreValue,reportStoreError:(h,b)=>r.reportStoreError(b),hashState:r.hashState});},beforeStoreDelete(r){let s=r.options.persist;if(s){delete g[r.name],p.delete(r.name),e[r.name]&&(clearTimeout(e[r.name]),delete e[r.name]),t[r.name]=null,delete n[r.name];try{s.driver.removeItem?.(s.key);}catch{}s.key&&o[s.key]===r.name&&delete o[s.key],i[r.name]?.dispose(),delete i[r.name];}},resetAll(){Object.values(e).forEach(r=>clearTimeout(r)),Object.values(i).forEach(r=>{try{r.dispose();}catch{}}),Object.keys(e).forEach(r=>delete e[r]),Object.keys(t).forEach(r=>{t[r]=null,delete t[r];}),Object.keys(n).forEach(r=>delete n[r]),Object.keys(o).forEach(r=>delete o[r]),Object.keys(i).forEach(r=>delete i[r]),Object.keys(g).forEach(r=>delete g[r]),u.clear(),p.clear();}}},we=()=>{ke||(ke=true,X("persist",ot));};var ve=()=>{we();};ve();export{ve as installPersist};//# sourceMappingURL=persist.js.map
2
2
  //# sourceMappingURL=persist.js.map