cross-state 0.55.6 → 0.56.1

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 (65) hide show
  1. package/dist/{diff-BQ8bB3Wk.d.cts → diff-D7XuntCn.d.cts} +2 -2
  2. package/dist/{diff-gZezL04N.d.ts → diff-qAkLCsnM.d.ts} +2 -2
  3. package/dist/index.cjs +3 -3
  4. package/dist/index.d.cts +4 -4
  5. package/dist/index.d.ts +4 -4
  6. package/dist/index.js +3 -3
  7. package/dist/mutative/index.d.cts +2 -2
  8. package/dist/mutative/index.d.ts +2 -2
  9. package/dist/mutative/register.cjs +1 -1
  10. package/dist/mutative/register.d.cts +2 -2
  11. package/dist/mutative/register.d.ts +2 -2
  12. package/dist/mutative/register.js +1 -1
  13. package/dist/{mutativeMethods-6QzygG3W.d.cts → mutativeMethods-Be_XPk5N.d.cts} +2 -2
  14. package/dist/{mutativeMethods-Br3xN2Iq.d.ts → mutativeMethods-DRYtjUcH.d.ts} +2 -2
  15. package/dist/{patchMethods-pw_OcPA8.d.cts → patchMethods-BlYtjRUU.d.cts} +3 -3
  16. package/dist/{patchMethods-CT9M507t.d.ts → patchMethods-Dr2OFh02.d.ts} +3 -3
  17. package/dist/patches/index.d.cts +3 -3
  18. package/dist/patches/index.d.ts +3 -3
  19. package/dist/patches/register.cjs +1 -1
  20. package/dist/patches/register.d.cts +3 -3
  21. package/dist/patches/register.d.ts +3 -3
  22. package/dist/patches/register.js +1 -1
  23. package/dist/persist/register.cjs +2 -2
  24. package/dist/persist/register.d.cts +2 -2
  25. package/dist/persist/register.d.ts +2 -2
  26. package/dist/persist/register.js +2 -2
  27. package/dist/{persist-CPjpg6D0.d.ts → persist-CIEYJ0rO.d.ts} +2 -2
  28. package/dist/{persist-CGLe7YUX.cjs → persist-CQhYPv4d.cjs} +2 -2
  29. package/dist/{persist-CGLe7YUX.cjs.map → persist-CQhYPv4d.cjs.map} +1 -1
  30. package/dist/{persist-D7MAsyyW.d.cts → persist-CR3mhti7.d.cts} +2 -2
  31. package/dist/{persist-Btgg3qGU.js → persist-DFzbvNoJ.js} +2 -2
  32. package/dist/{persist-Btgg3qGU.js.map → persist-DFzbvNoJ.js.map} +1 -1
  33. package/dist/react/index.cjs +122 -95
  34. package/dist/react/index.cjs.map +1 -1
  35. package/dist/react/index.d.cts +25 -47
  36. package/dist/react/index.d.ts +25 -47
  37. package/dist/react/index.js +122 -92
  38. package/dist/react/index.js.map +1 -1
  39. package/dist/react/register.cjs +3 -3
  40. package/dist/react/register.d.cts +3 -3
  41. package/dist/react/register.d.ts +3 -3
  42. package/dist/react/register.js +3 -3
  43. package/dist/{scope-BbUXgNW_.d.ts → scope-ByLCVzKk.d.ts} +2 -2
  44. package/dist/{scope-CoDFmhxK.cjs → scope-C9JXWddv.cjs} +6 -3
  45. package/dist/scope-C9JXWddv.cjs.map +1 -0
  46. package/dist/{scope-6B7-8lwa.d.cts → scope-DkO-RIMy.d.cts} +2 -2
  47. package/dist/{scope-CKXL9xoi.js → scope-Mhr133F_.js} +6 -3
  48. package/dist/scope-Mhr133F_.js.map +1 -0
  49. package/dist/{store-DKaeE840.d.ts → store-B3PWCx63.d.cts} +2 -1
  50. package/dist/{store-BEsiS8y7.d.cts → store-BJWoRQIs.d.ts} +2 -1
  51. package/dist/{store-BpMJxIHt.js → store-DOEc60aP.js} +9 -7
  52. package/dist/store-DOEc60aP.js.map +1 -0
  53. package/dist/{store-1TGlSyq4.cjs → store-DQcFfgKD.cjs} +9 -7
  54. package/dist/store-DQcFfgKD.cjs.map +1 -0
  55. package/dist/{storeMethods-CkvcMFoL.js → storeMethods-C7bswcgj.js} +2 -2
  56. package/dist/{storeMethods-CkvcMFoL.js.map → storeMethods-C7bswcgj.js.map} +1 -1
  57. package/dist/{storeMethods-Bg8nMBrf.d.cts → storeMethods-Dt_mJTe3.d.cts} +3 -3
  58. package/dist/{storeMethods-C_RzHBQL.cjs → storeMethods-YDnpa-6-.cjs} +2 -2
  59. package/dist/{storeMethods-C_RzHBQL.cjs.map → storeMethods-YDnpa-6-.cjs.map} +1 -1
  60. package/dist/{storeMethods-DWKSveN0.d.ts → storeMethods-wsbbfJzY.d.ts} +3 -3
  61. package/package.json +3 -3
  62. package/dist/scope-CKXL9xoi.js.map +0 -1
  63. package/dist/scope-CoDFmhxK.cjs.map +0 -1
  64. package/dist/store-1TGlSyq4.cjs.map +0 -1
  65. package/dist/store-BpMJxIHt.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { KeyType } from "./store-BEsiS8y7.cjs";
1
+ import { KeyType } from "./store-B3PWCx63.cjs";
2
2
 
3
3
  //#region src/lib/diff.d.ts
4
4
  type Patch = {
@@ -19,4 +19,4 @@ interface DiffOptions {
19
19
  declare function diff(a: any, b: any, options?: DiffOptions): [patches: Patch[], reversePatches: Patch[]];
20
20
  //#endregion
21
21
  export { DiffOptions, Patch, diff };
22
- //# sourceMappingURL=diff-BQ8bB3Wk.d.cts.map
22
+ //# sourceMappingURL=diff-D7XuntCn.d.cts.map
@@ -1,4 +1,4 @@
1
- import { KeyType } from "./store-DKaeE840.js";
1
+ import { KeyType } from "./store-BJWoRQIs.js";
2
2
 
3
3
  //#region src/lib/diff.d.ts
4
4
  type Patch = {
@@ -19,4 +19,4 @@ interface DiffOptions {
19
19
  declare function diff(a: any, b: any, options?: DiffOptions): [patches: Patch[], reversePatches: Patch[]];
20
20
  //#endregion
21
21
  export { DiffOptions, Patch, diff };
22
- //# sourceMappingURL=diff-gZezL04N.d.ts.map
22
+ //# sourceMappingURL=diff-qAkLCsnM.d.ts.map
package/dist/index.cjs CHANGED
@@ -1,10 +1,10 @@
1
- const require_store = require('./store-1TGlSyq4.cjs');
1
+ const require_store = require('./store-DQcFfgKD.cjs');
2
2
  const require_propAccess = require('./propAccess-BdLsqViO.cjs');
3
3
  const require_hash = require('./hash-Dv3XlmHn.cjs');
4
- const require_scope = require('./scope-CoDFmhxK.cjs');
4
+ const require_scope = require('./scope-C9JXWddv.cjs');
5
5
  const require_patchMethods = require('./patchMethods-hhlLwtqE.cjs');
6
6
  const require_extendedJson = require('./extendedJson-Dn2F7Edo.cjs');
7
- const require_persist = require('./persist-CGLe7YUX.cjs');
7
+ const require_persist = require('./persist-CQhYPv4d.cjs');
8
8
 
9
9
  //#region src/core/pagedCache.ts
10
10
  var PagedCache = class PagedCache extends require_scope.Cache {
package/dist/index.d.cts CHANGED
@@ -1,7 +1,7 @@
1
- import { Cache, CacheBundle, CacheFunction, CacheGetOptions, CacheOptions, CacheState, CreateCacheResult, ErrorState, PendingState, Resource, ResourceGroup, Scope, ValueState, allResources, createCache, createResourceGroup, createScope } from "./scope-6B7-8lwa.cjs";
2
- import { AsyncConnectionActions, AsyncUpdateFunction, BaseConnectionActions, BoundStoreMethods, CalculationActions, Cancel, Connection, ConnectionActions, Constrain, DisposableCancel, Duration, Effect, KeyType, Listener, Path, PathAsArray, PathAsString, Selector, SettablePath, SettablePathAsArray, SettablePathAsString, SettableValue, Store, StoreMethods, StoreOptions, StoreOptionsWithMethods, SubscribeOptions, Update, UpdateFrom, UpdateFunction, Use, Value, arrayMethods, createStore, mapMethods, recordMethods, setMethods } from "./store-BEsiS8y7.cjs";
3
- import { Patch, diff } from "./diff-BQ8bB3Wk.cjs";
4
- import { Persist, PersistOptions, PersistStorage, PersistStorageBase, PersistStorageWithKeys, PersistStorageWithLength, PersistStorageWithListItems, persist } from "./persist-D7MAsyyW.cjs";
1
+ import { Cache, CacheBundle, CacheFunction, CacheGetOptions, CacheOptions, CacheState, CreateCacheResult, ErrorState, PendingState, Resource, ResourceGroup, Scope, ValueState, allResources, createCache, createResourceGroup, createScope } from "./scope-DkO-RIMy.cjs";
2
+ import { AsyncConnectionActions, AsyncUpdateFunction, BaseConnectionActions, BoundStoreMethods, CalculationActions, Cancel, Connection, ConnectionActions, Constrain, DisposableCancel, Duration, Effect, KeyType, Listener, Path, PathAsArray, PathAsString, Selector, SettablePath, SettablePathAsArray, SettablePathAsString, SettableValue, Store, StoreMethods, StoreOptions, StoreOptionsWithMethods, SubscribeOptions, Update, UpdateFrom, UpdateFunction, Use, Value, arrayMethods, createStore, mapMethods, recordMethods, setMethods } from "./store-B3PWCx63.cjs";
3
+ import { Patch, diff } from "./diff-D7XuntCn.cjs";
4
+ import { Persist, PersistOptions, PersistStorage, PersistStorageBase, PersistStorageWithKeys, PersistStorageWithLength, PersistStorageWithListItems, persist } from "./persist-CR3mhti7.cjs";
5
5
 
6
6
  //#region src/core/pagedCache.d.ts
7
7
  interface PageCacheFunctionProps<T> extends CalculationActions<Promise<PagedCacheState<T>>> {
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
- import { Cache, CacheBundle, CacheFunction, CacheGetOptions, CacheOptions, CacheState, CreateCacheResult, ErrorState, PendingState, Resource, ResourceGroup, Scope, ValueState, allResources, createCache, createResourceGroup, createScope } from "./scope-BbUXgNW_.js";
2
- import { AsyncConnectionActions, AsyncUpdateFunction, BaseConnectionActions, BoundStoreMethods, CalculationActions, Cancel, Connection, ConnectionActions, Constrain, DisposableCancel, Duration, Effect, KeyType, Listener, Path, PathAsArray, PathAsString, Selector, SettablePath, SettablePathAsArray, SettablePathAsString, SettableValue, Store, StoreMethods, StoreOptions, StoreOptionsWithMethods, SubscribeOptions, Update, UpdateFrom, UpdateFunction, Use, Value, arrayMethods, createStore, mapMethods, recordMethods, setMethods } from "./store-DKaeE840.js";
3
- import { Patch, diff } from "./diff-gZezL04N.js";
4
- import { Persist, PersistOptions, PersistStorage, PersistStorageBase, PersistStorageWithKeys, PersistStorageWithLength, PersistStorageWithListItems, persist } from "./persist-CPjpg6D0.js";
1
+ import { Cache, CacheBundle, CacheFunction, CacheGetOptions, CacheOptions, CacheState, CreateCacheResult, ErrorState, PendingState, Resource, ResourceGroup, Scope, ValueState, allResources, createCache, createResourceGroup, createScope } from "./scope-ByLCVzKk.js";
2
+ import { AsyncConnectionActions, AsyncUpdateFunction, BaseConnectionActions, BoundStoreMethods, CalculationActions, Cancel, Connection, ConnectionActions, Constrain, DisposableCancel, Duration, Effect, KeyType, Listener, Path, PathAsArray, PathAsString, Selector, SettablePath, SettablePathAsArray, SettablePathAsString, SettableValue, Store, StoreMethods, StoreOptions, StoreOptionsWithMethods, SubscribeOptions, Update, UpdateFrom, UpdateFunction, Use, Value, arrayMethods, createStore, mapMethods, recordMethods, setMethods } from "./store-BJWoRQIs.js";
3
+ import { Patch, diff } from "./diff-qAkLCsnM.js";
4
+ import { Persist, PersistOptions, PersistStorage, PersistStorageBase, PersistStorageWithKeys, PersistStorageWithLength, PersistStorageWithListItems, persist } from "./persist-CIEYJ0rO.js";
5
5
 
6
6
  //#region src/core/pagedCache.d.ts
7
7
  interface PageCacheFunctionProps<T> extends CalculationActions<Promise<PagedCacheState<T>>> {
package/dist/index.js CHANGED
@@ -1,10 +1,10 @@
1
- import { Store, arrayMethods, autobind, calcDuration, createStore, mapMethods, recordMethods, setMethods } from "./store-BpMJxIHt.js";
1
+ import { Store, arrayMethods, autobind, calcDuration, createStore, mapMethods, recordMethods, setMethods } from "./store-DOEc60aP.js";
2
2
  import { deepEqual, get, set, shallowEqual, strictEqual } from "./propAccess-B260LXN1.js";
3
3
  import { hash, simpleHash } from "./hash-DNFM5y_h.js";
4
- import { Cache, InstanceCache, ResourceGroup, Scope, allResources, createCache, createResourceGroup, createScope, defaultCacheOptions, internalCreate } from "./scope-CKXL9xoi.js";
4
+ import { Cache, InstanceCache, ResourceGroup, Scope, allResources, createCache, createResourceGroup, createScope, defaultCacheOptions, internalCreate } from "./scope-Mhr133F_.js";
5
5
  import { applyPatches, diff } from "./patchMethods-C_f3PORQ.js";
6
6
  import { fromExtendedJson, fromExtendedJsonString, toExtendedJson, toExtendedJsonString } from "./extendedJson-BZkQBXEv.js";
7
- import { persist } from "./persist-Btgg3qGU.js";
7
+ import { persist } from "./persist-DFzbvNoJ.js";
8
8
 
9
9
  //#region src/core/pagedCache.ts
10
10
  var PagedCache = class PagedCache extends Cache {
@@ -1,3 +1,3 @@
1
- import "../store-BEsiS8y7.cjs";
2
- import { Mutation, mutativeMethods } from "../mutativeMethods-6QzygG3W.cjs";
1
+ import "../store-B3PWCx63.cjs";
2
+ import { Mutation, mutativeMethods } from "../mutativeMethods-Be_XPk5N.cjs";
3
3
  export { type Mutation, mutativeMethods };
@@ -1,3 +1,3 @@
1
- import "../store-DKaeE840.js";
2
- import { Mutation, mutativeMethods } from "../mutativeMethods-Br3xN2Iq.js";
1
+ import "../store-BJWoRQIs.js";
2
+ import { Mutation, mutativeMethods } from "../mutativeMethods-DRYtjUcH.js";
3
3
  export { type Mutation, mutativeMethods };
@@ -1,4 +1,4 @@
1
- const require_store = require('../store-1TGlSyq4.cjs');
1
+ const require_store = require('../store-DQcFfgKD.cjs');
2
2
  require('../propAccess-BdLsqViO.cjs');
3
3
  const require_mutativeMethods = require('../mutativeMethods-CgXk_bMt.cjs');
4
4
 
@@ -1,5 +1,5 @@
1
- import "../store-BEsiS8y7.cjs";
2
- import { mutativeMethods } from "../mutativeMethods-6QzygG3W.cjs";
1
+ import "../store-B3PWCx63.cjs";
2
+ import { mutativeMethods } from "../mutativeMethods-Be_XPk5N.cjs";
3
3
 
4
4
  //#region src/mutative/register.d.ts
5
5
  type MutativeMethods = typeof mutativeMethods;
@@ -1,5 +1,5 @@
1
- import "../store-DKaeE840.js";
2
- import { mutativeMethods } from "../mutativeMethods-Br3xN2Iq.js";
1
+ import "../store-BJWoRQIs.js";
2
+ import { mutativeMethods } from "../mutativeMethods-DRYtjUcH.js";
3
3
 
4
4
  //#region src/mutative/register.d.ts
5
5
  type MutativeMethods = typeof mutativeMethods;
@@ -1,4 +1,4 @@
1
- import { Store, autobind } from "../store-BpMJxIHt.js";
1
+ import { Store, autobind } from "../store-DOEc60aP.js";
2
2
  import "../propAccess-B260LXN1.js";
3
3
  import { mutativeMethods } from "../mutativeMethods-CZKeRIDL.js";
4
4
 
@@ -1,4 +1,4 @@
1
- import { Constrain, Path, Store, Value } from "./store-BEsiS8y7.cjs";
1
+ import { Constrain, Path, Store, Value } from "./store-B3PWCx63.cjs";
2
2
  import { Draft } from "mutative";
3
3
 
4
4
  //#region src/mutative/mutativeMethods.d.ts
@@ -10,4 +10,4 @@ declare const mutativeMethods: {
10
10
  };
11
11
  //#endregion
12
12
  export { Mutation, mutativeMethods };
13
- //# sourceMappingURL=mutativeMethods-6QzygG3W.d.cts.map
13
+ //# sourceMappingURL=mutativeMethods-Be_XPk5N.d.cts.map
@@ -1,4 +1,4 @@
1
- import { Constrain, Path, Store, Value } from "./store-DKaeE840.js";
1
+ import { Constrain, Path, Store, Value } from "./store-BJWoRQIs.js";
2
2
  import { Draft } from "mutative";
3
3
 
4
4
  //#region src/mutative/mutativeMethods.d.ts
@@ -10,4 +10,4 @@ declare const mutativeMethods: {
10
10
  };
11
11
  //#endregion
12
12
  export { Mutation, mutativeMethods };
13
- //# sourceMappingURL=mutativeMethods-Br3xN2Iq.d.ts.map
13
+ //# sourceMappingURL=mutativeMethods-DRYtjUcH.d.ts.map
@@ -1,5 +1,5 @@
1
- import { Cancel, DisposableCancel, Store, SubscribeOptions } from "./store-BEsiS8y7.cjs";
2
- import { DiffOptions, Patch } from "./diff-BQ8bB3Wk.cjs";
1
+ import { Cancel, DisposableCancel, Store, SubscribeOptions } from "./store-B3PWCx63.cjs";
2
+ import { DiffOptions, Patch } from "./diff-D7XuntCn.cjs";
3
3
 
4
4
  //#region src/patches/patchMethods.d.ts
5
5
  interface SyncMessage {
@@ -45,4 +45,4 @@ declare const patchMethods: {
45
45
  };
46
46
  //#endregion
47
47
  export { SubscribePatchOptions, SyncMessage, patchMethods };
48
- //# sourceMappingURL=patchMethods-pw_OcPA8.d.cts.map
48
+ //# sourceMappingURL=patchMethods-BlYtjRUU.d.cts.map
@@ -1,5 +1,5 @@
1
- import { Cancel, DisposableCancel, Store, SubscribeOptions } from "./store-DKaeE840.js";
2
- import { DiffOptions, Patch } from "./diff-gZezL04N.js";
1
+ import { Cancel, DisposableCancel, Store, SubscribeOptions } from "./store-BJWoRQIs.js";
2
+ import { DiffOptions, Patch } from "./diff-qAkLCsnM.js";
3
3
 
4
4
  //#region src/patches/patchMethods.d.ts
5
5
  interface SyncMessage {
@@ -45,4 +45,4 @@ declare const patchMethods: {
45
45
  };
46
46
  //#endregion
47
47
  export { SubscribePatchOptions, SyncMessage, patchMethods };
48
- //# sourceMappingURL=patchMethods-CT9M507t.d.ts.map
48
+ //# sourceMappingURL=patchMethods-Dr2OFh02.d.ts.map
@@ -1,4 +1,4 @@
1
- import "../store-BEsiS8y7.cjs";
2
- import "../diff-BQ8bB3Wk.cjs";
3
- import { SubscribePatchOptions, SyncMessage, patchMethods } from "../patchMethods-pw_OcPA8.cjs";
1
+ import "../store-B3PWCx63.cjs";
2
+ import "../diff-D7XuntCn.cjs";
3
+ import { SubscribePatchOptions, SyncMessage, patchMethods } from "../patchMethods-BlYtjRUU.cjs";
4
4
  export { type SubscribePatchOptions, type SyncMessage, patchMethods };
@@ -1,4 +1,4 @@
1
- import "../store-DKaeE840.js";
2
- import "../diff-gZezL04N.js";
3
- import { SubscribePatchOptions, SyncMessage, patchMethods } from "../patchMethods-CT9M507t.js";
1
+ import "../store-BJWoRQIs.js";
2
+ import "../diff-qAkLCsnM.js";
3
+ import { SubscribePatchOptions, SyncMessage, patchMethods } from "../patchMethods-Dr2OFh02.js";
4
4
  export { type SubscribePatchOptions, type SyncMessage, patchMethods };
@@ -1,4 +1,4 @@
1
- const require_store = require('../store-1TGlSyq4.cjs');
1
+ const require_store = require('../store-DQcFfgKD.cjs');
2
2
  require('../propAccess-BdLsqViO.cjs');
3
3
  const require_patchMethods = require('../patchMethods-hhlLwtqE.cjs');
4
4
  require('../extendedJson-Dn2F7Edo.cjs');
@@ -1,6 +1,6 @@
1
- import "../store-BEsiS8y7.cjs";
2
- import "../diff-BQ8bB3Wk.cjs";
3
- import { patchMethods } from "../patchMethods-pw_OcPA8.cjs";
1
+ import "../store-B3PWCx63.cjs";
2
+ import "../diff-D7XuntCn.cjs";
3
+ import { patchMethods } from "../patchMethods-BlYtjRUU.cjs";
4
4
 
5
5
  //#region src/patches/register.d.ts
6
6
  type PatchMethods = typeof patchMethods;
@@ -1,6 +1,6 @@
1
- import "../store-DKaeE840.js";
2
- import "../diff-gZezL04N.js";
3
- import { patchMethods } from "../patchMethods-CT9M507t.js";
1
+ import "../store-BJWoRQIs.js";
2
+ import "../diff-qAkLCsnM.js";
3
+ import { patchMethods } from "../patchMethods-Dr2OFh02.js";
4
4
 
5
5
  //#region src/patches/register.d.ts
6
6
  type PatchMethods = typeof patchMethods;
@@ -1,4 +1,4 @@
1
- import { Store, autobind } from "../store-BpMJxIHt.js";
1
+ import { Store, autobind } from "../store-DOEc60aP.js";
2
2
  import "../propAccess-B260LXN1.js";
3
3
  import { patchMethods } from "../patchMethods-C_f3PORQ.js";
4
4
  import "../extendedJson-BZkQBXEv.js";
@@ -1,8 +1,8 @@
1
- const require_store = require('../store-1TGlSyq4.cjs');
1
+ const require_store = require('../store-DQcFfgKD.cjs');
2
2
  require('../propAccess-BdLsqViO.cjs');
3
3
  require('../patchMethods-hhlLwtqE.cjs');
4
4
  require('../extendedJson-Dn2F7Edo.cjs');
5
- const require_persist = require('../persist-CGLe7YUX.cjs');
5
+ const require_persist = require('../persist-CQhYPv4d.cjs');
6
6
 
7
7
  //#region src/persist/register.ts
8
8
  require_store.Store.addHook((store) => {
@@ -1,5 +1,5 @@
1
- import "../store-BEsiS8y7.cjs";
2
- import { Persist, PersistOptions } from "../persist-D7MAsyyW.cjs";
1
+ import "../store-B3PWCx63.cjs";
2
+ import { Persist, PersistOptions } from "../persist-CR3mhti7.cjs";
3
3
 
4
4
  //#region src/persist/register.d.ts
5
5
  declare module ".." {
@@ -1,5 +1,5 @@
1
- import "../store-DKaeE840.js";
2
- import { Persist, PersistOptions } from "../persist-CPjpg6D0.js";
1
+ import "../store-BJWoRQIs.js";
2
+ import { Persist, PersistOptions } from "../persist-CIEYJ0rO.js";
3
3
 
4
4
  //#region src/persist/register.d.ts
5
5
  declare module ".." {
@@ -1,8 +1,8 @@
1
- import { Store } from "../store-BpMJxIHt.js";
1
+ import { Store } from "../store-DOEc60aP.js";
2
2
  import "../propAccess-B260LXN1.js";
3
3
  import "../patchMethods-C_f3PORQ.js";
4
4
  import "../extendedJson-BZkQBXEv.js";
5
- import { persist } from "../persist-Btgg3qGU.js";
5
+ import { persist } from "../persist-DFzbvNoJ.js";
6
6
 
7
7
  //#region src/persist/register.ts
8
8
  Store.addHook((store) => {
@@ -1,4 +1,4 @@
1
- import { Cancel, Duration, KeyType, Store, WildcardPath } from "./store-DKaeE840.js";
1
+ import { Cancel, Duration, KeyType, Store, WildcardPath } from "./store-BJWoRQIs.js";
2
2
 
3
3
  //#region src/persist/persistStorage.d.ts
4
4
  interface PersistStorageBase {
@@ -58,4 +58,4 @@ declare class Persist<T> {
58
58
  declare function persist<T>(store: Store<T>, options: PersistOptions<T>): Persist<T>;
59
59
  //#endregion
60
60
  export { Persist, PersistOptions, PersistStorage, PersistStorageBase, PersistStorageWithKeys, PersistStorageWithLength, PersistStorageWithListItems, persist };
61
- //# sourceMappingURL=persist-CPjpg6D0.d.ts.map
61
+ //# sourceMappingURL=persist-CIEYJ0rO.d.ts.map
@@ -1,4 +1,4 @@
1
- const require_store = require('./store-1TGlSyq4.cjs');
1
+ const require_store = require('./store-DQcFfgKD.cjs');
2
2
  const require_propAccess = require('./propAccess-BdLsqViO.cjs');
3
3
  const require_patchMethods = require('./patchMethods-hhlLwtqE.cjs');
4
4
  const require_extendedJson = require('./extendedJson-Dn2F7Edo.cjs');
@@ -260,4 +260,4 @@ Object.defineProperty(exports, 'persist', {
260
260
  return persist;
261
261
  }
262
262
  });
263
- //# sourceMappingURL=persist-CGLe7YUX.cjs.map
263
+ //# sourceMappingURL=persist-CQhYPv4d.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"persist-CGLe7YUX.cjs","names":["isPromise","value","entries: Map<KeyType, unknown>","path","isPromise","store: Store<T>","options: PersistOptions<T>","queue","castArrayPath","calcDuration","subscribePatches","path","shallowEqual","isPromise","fromExtendedJsonString","remove","set","get","value","toExtendedJsonString"],"sources":["../src/lib/promiseChain.ts","../src/persist/persistPathHelpers.ts","../src/persist/persistStorage.ts","../src/persist/persist.ts"],"sourcesContent":["import isPromise from '@lib/isPromise';\n\nexport interface Chain<T> {\n value: T;\n next<S>(fn: (value: Awaited<T>) => S): T extends Promise<any> ? Chain<Promise<S>> : Chain<S>;\n}\n\nexport default function promiseChain<T>(value: T | (() => T)): Chain<T> {\n if (value instanceof Function) {\n value = value();\n }\n\n return {\n value,\n next(fn) {\n const next = isPromise(value)\n ? value.then((value) => fn(value as Awaited<T>))\n : fn(value as Awaited<T>);\n\n return promiseChain(next) as any;\n },\n };\n}\n","import type { KeyType } from '@lib/path';\n\nexport const isAncestor = (ancestor: KeyType[], path: KeyType[]): boolean => {\n return (\n ancestor.length <= path.length &&\n ancestor.every((v, i) => v === '*' || path[i] === '*' || v === path[i])\n );\n};\n\nexport const split = (value: any, path: KeyType[]): { path: KeyType[]; value: unknown }[] => {\n const [first, ...rest] = path;\n if (first === undefined) return [{ path: [], value }];\n\n let entries: Map<KeyType, unknown>;\n if (value instanceof Map) {\n entries = value;\n } else if (value instanceof Set) {\n entries = new Map([...value].map((v, i) => [i, v]));\n } else if (Array.isArray(value)) {\n entries = new Map(value.map((v, i) => [i, v]));\n } else if (typeof value === 'object' && value !== null) {\n entries = new Map(Object.entries(value));\n } else {\n return [{ path: [], value }];\n }\n\n if (first === '*') {\n return [...entries].flatMap(([k, v]) =>\n split(v, rest).map(({ path, value }) => ({ path: [k, ...path], value })),\n );\n }\n\n const subValue = entries.get(first);\n if (subValue === undefined) return [{ path: [], value }];\n\n return split(subValue, rest).map(({ path, value }) => ({ path: [first, ...path], value }));\n};\n","import isPromise from '@lib/isPromise';\nimport promiseChain from '@lib/promiseChain';\n\nexport interface PersistStorageBase {\n getItem: (key: string) => string | null | Promise<string | null>;\n setItem: (key: string, value: string) => void | Promise<unknown>;\n removeItem: (key: string) => void | Promise<unknown>;\n}\n\nexport interface PersistStorageWithKeys extends PersistStorageBase {\n keys: () => string[] | Promise<string[]>;\n}\n\nexport interface PersistStorageWithLength extends PersistStorageBase {\n length: number | (() => number | Promise<number>);\n key: (keyIndex: number) => string | null | Promise<string | null>;\n}\n\nexport interface PersistStorageWithListItems extends PersistStorageBase {\n listItems: () => Map<string, string> | Promise<Map<string, string>>;\n}\n\nexport type PersistStorage =\n | PersistStorageWithKeys\n | PersistStorageWithLength\n | PersistStorageWithListItems;\n\nexport function normalizeStorage(storage: PersistStorage): PersistStorageWithListItems {\n return {\n getItem: storage.getItem.bind(storage),\n setItem: storage.setItem.bind(storage),\n removeItem: storage.removeItem.bind(storage),\n\n listItems() {\n if ('listItems' in storage) {\n return storage.listItems();\n }\n\n return promiseChain(() => {\n if ('keys' in storage) {\n return storage.keys();\n } else {\n return promiseChain(\n storage.length instanceof Function ? storage.length() : storage.length,\n )\n .next((length) => {\n const keys = Array.from({ length }, (_, index) => storage.key(index));\n return keys.some(isPromise) ? Promise.all(keys) : (keys as (string | null)[]);\n })\n .next((keys) => {\n return keys.filter((key): key is string => typeof key === 'string');\n }).value;\n }\n })\n .next((keys) => {\n const results = keys.map(\n (key) =>\n promiseChain(storage.getItem(key)).next((value) => [key, value] as const).value,\n );\n\n return results.some(isPromise)\n ? Promise.all(results)\n : (results as [string, string | null][]);\n })\n .next((results) => {\n return new Map(results.filter(([, value]) => value !== null) as [string, string][]);\n }).value;\n },\n };\n}\n","import { type Cancel, type Duration, type Store } from '@core';\nimport { calcDuration } from '@lib/calcDuration';\nimport { shallowEqual } from '@lib/equals';\nimport { fromExtendedJsonString, toExtendedJsonString } from '@lib/extendedJson';\nimport isPromise from '@lib/isPromise';\nimport type { KeyType, WildcardPath } from '@lib/path';\nimport promiseChain from '@lib/promiseChain';\nimport { castArrayPath, get, remove, set } from '@lib/propAccess';\nimport { queue } from '@lib/queue';\nimport { subscribePatches } from '@patches/patchMethods';\nimport { isAncestor, split } from '@persist/persistPathHelpers';\nimport {\n normalizeStorage,\n type PersistStorage,\n type PersistStorageWithListItems,\n} from './persistStorage';\n\ntype PathOption<T> =\n | WildcardPath<T>\n | {\n path: WildcardPath<T>;\n // throttle?: Duration;\n };\n\ntype Key = { type: 'internal'; path: string } | { type: 'data'; path: KeyType[] };\n\nexport interface PersistOptions<T> {\n id: string;\n storage: PersistStorage;\n paths?: PathOption<T>[];\n throttle?: Duration;\n persistInitialState?: boolean;\n}\n\nexport class Persist<T> {\n readonly storage: PersistStorageWithListItems;\n readonly [Symbol.dispose]!: Cancel;\n\n readonly paths: {\n path: KeyType[];\n throttle?: number;\n }[];\n\n readonly initialized: Promise<void>;\n\n private resolveInitialized?: () => void;\n\n private channel: BroadcastChannel;\n\n private queue = queue();\n\n private handles = new Set<Cancel>();\n\n private stopped = false;\n\n private updateInProgress = new Map<string, unknown>();\n\n private prefix;\n\n constructor(\n public readonly store: Store<T>,\n public readonly options: PersistOptions<T>,\n ) {\n this.storage = normalizeStorage(options.storage);\n this.channel = new BroadcastChannel(`cross-state-persist_${options.id}`);\n this.prefix = `${options.id}:`;\n\n if (Symbol.dispose) {\n this[Symbol.dispose] = () => this.stop();\n }\n\n this.paths = (options.paths ?? [])\n .map<{\n path: KeyType[];\n throttle?: number;\n }>((p) => {\n if (isPlainPath(p)) {\n return {\n path: castArrayPath(p),\n throttle: options.throttle && calcDuration(options.throttle),\n };\n }\n\n const _p = p as { path: KeyType[]; throttle?: Duration };\n\n return {\n path: castArrayPath(_p.path),\n throttle:\n (_p.throttle && calcDuration(_p.throttle)) ??\n (options.throttle && calcDuration(options.throttle)),\n };\n })\n .sort((a, b) => b.path.length - a.path.length);\n\n if (this.paths.length === 0) {\n this.paths.push({\n path: ['*'],\n throttle: options.throttle && calcDuration(options.throttle),\n });\n }\n\n this.initialized = new Promise((resolve) => {\n this.resolveInitialized = resolve;\n });\n\n this.watchStore();\n this.watchStorage();\n }\n\n private watchStore() {\n const throttle = Math.min(...this.paths.map((p) => p.throttle ?? 0)) || undefined;\n\n const cancel = subscribePatches.apply(this.store as Store<unknown>, [\n (patches, reversePatches) => {\n let i = 0;\n for (const patch of patches) {\n const reversePatch = reversePatches[i++];\n\n const stringPath = JSON.stringify(patch.path);\n if (\n this.updateInProgress.has(stringPath) &&\n this.updateInProgress.get(stringPath) ===\n (patch.op === 'remove' ? undefined : patch.value)\n ) {\n continue;\n }\n\n const matchingPaths = this.paths.filter(\n (p) => isAncestor(p.path, patch.path) || isAncestor(patch.path, p.path),\n );\n\n for (const { path } of matchingPaths) {\n if (path.length <= patch.path.length) {\n const pathToSave = patch.path.slice(0, path.length);\n this.queue(() => this.save(pathToSave), pathToSave);\n } else if (patch.op === 'remove') {\n const subValues = split(\n reversePatch?.op === 'add' ? reversePatch.value : {},\n path.slice(patch.path.length),\n );\n\n for (const { path } of subValues) {\n this.queue(() => this.save([...patch.path, ...path]), [...patch.path, ...path]);\n }\n } else {\n const updatedValues = split(patch.value, path.slice(patch.path.length));\n const removedValues = split(\n reversePatch?.op !== 'remove' ? (reversePatch?.value ?? {}) : {},\n path.slice(patch.path.length),\n ).filter((v) => !updatedValues.some((u) => shallowEqual(u.path, v.path)));\n\n for (const { path } of updatedValues) {\n this.queue(() => this.save([...patch.path, ...path]), [...patch.path, ...path]);\n }\n for (const { path } of removedValues) {\n this.queue(() => this.save([...patch.path, ...path]), [...patch.path, ...path]);\n }\n }\n }\n }\n },\n { runNow: this.options.persistInitialState ?? false, passive: true, throttle },\n ]);\n\n this.handles.add(cancel);\n }\n\n private async watchStorage() {\n if (!this.options.persistInitialState) {\n let items = this.storage.listItems();\n if (isPromise(items)) {\n items = await items;\n }\n\n if (this.stopped) {\n return;\n }\n\n const toLoad = new Map(\n [...items.entries()]\n .sort((a, b) => b[1].length - a[1].length)\n .map(([key, value]) => [this.parseKey(key), value])\n .filter(([key]) => key) as [Key, string][],\n );\n\n this.queue(() => this.load(toLoad));\n }\n\n this.queue(() => this.resolveInitialized?.());\n\n const listener = (event: MessageEvent) => {\n this.queue(() => this.load([{ type: 'data', path: event.data }]));\n };\n\n this.channel.addEventListener('message', listener);\n this.handles.add(() => this.channel.removeEventListener('message', listener));\n }\n\n private buildKey({ type, path }: Key) {\n return `${this.prefix}${type === 'internal' ? path : JSON.stringify(path)}`;\n }\n\n private parseKey(key: string): Key | undefined {\n if (!key.startsWith(this.prefix)) {\n return;\n }\n\n key = key.slice(this.prefix.length);\n\n if (!key.startsWith('[')) {\n return { type: 'internal', path: key };\n }\n\n return { type: 'data', path: JSON.parse(key) as KeyType[] };\n }\n\n private load(items: Key[] | Map<Key, string>): void | Promise<void> {\n return promiseChain(() => {\n if (Array.isArray(items)) {\n return promiseChain(() => {\n const entries = items.map(\n (key) =>\n promiseChain(() => {\n return this.storage.getItem(this.buildKey(key));\n }).next((value) => [key, value] as const).value,\n );\n\n return entries.some(isPromise)\n ? Promise.all(entries)\n : (entries as [Key, string | null][]);\n }).next((entries) => {\n return entries.filter((entry) => entry !== null) as [Key, string][];\n }).value;\n } else {\n return [...items.entries()];\n }\n }).next((entries) => {\n if (this.stopped) {\n return;\n }\n\n const toWrite = entries\n .filter(([key, value]) => {\n if (key.type !== 'data' || !value) {\n return;\n }\n\n if (\n !this.paths.find(\n (p) =>\n (p.path.length === 1 && p.path[0] === '*' && key.path.length === 0) ||\n (p.path.length === key.path.length && isAncestor(p.path, key.path)),\n )\n ) {\n return null;\n }\n\n const inSaveQueue = this.queue\n .getRefs()\n .find((ref) => isAncestor(ref, key.path) || isAncestor(key.path, ref));\n return !inSaveQueue;\n })\n .map(([key, value]) => {\n try {\n return {\n path: key.path,\n value: !value || value === 'undefined' ? undefined : fromExtendedJsonString(value),\n };\n } catch {\n return undefined;\n }\n })\n .filter(Boolean) as { path: KeyType[]; value: unknown }[];\n\n if (toWrite.length > 0) {\n for (const { path, value } of toWrite) {\n this.updateInProgress.set(JSON.stringify(path), value);\n }\n\n this.store.set((state) => {\n for (const { path, value } of toWrite) {\n if (value === undefined) {\n state = remove(state, path as any);\n } else {\n state = set(state, path as any, value);\n }\n }\n\n return state;\n });\n\n this.updateInProgress.clear();\n }\n\n const versionEntry = entries.find(\n ([key]) => key.type === 'internal' && key.path === 'version',\n );\n if (versionEntry) {\n this.store.version = versionEntry[1];\n }\n }).value;\n }\n\n private save(path: KeyType[]): void | Promise<unknown> {\n const key = this.buildKey({ type: 'data', path });\n const value = get(this.store.get() as any, path);\n\n return promiseChain(value)\n .next((value) => {\n if (value === undefined) {\n return this.storage.removeItem(key);\n } else {\n return this.storage.setItem(key, toExtendedJsonString(value));\n }\n })\n .next(() => {\n this.channel.postMessage(path);\n\n if (this.store.version) {\n return this.storage.setItem(\n this.buildKey({ type: 'internal', path: 'version' }),\n this.store.version,\n );\n } else {\n return this.storage.removeItem(this.buildKey({ type: 'internal', path: 'version' }));\n }\n }).value;\n }\n\n async stop(): Promise<void> {\n this.stopped = true;\n\n for (const handle of this.handles) {\n handle();\n }\n\n await this.queue.whenDone();\n this.channel.close();\n }\n}\n\nexport function persist<T>(store: Store<T>, options: PersistOptions<T>): Persist<T> {\n return new Persist<T>(store, options);\n}\n\nfunction isPlainPath<T>(p: PathOption<T>): p is WildcardPath<T> & (KeyType[] | string) {\n return typeof p === 'string' || Array.isArray(p);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"persist-CQhYPv4d.cjs","names":["isPromise","value","entries: Map<KeyType, unknown>","path","isPromise","store: Store<T>","options: PersistOptions<T>","queue","castArrayPath","calcDuration","subscribePatches","path","shallowEqual","isPromise","fromExtendedJsonString","remove","set","get","value","toExtendedJsonString"],"sources":["../src/lib/promiseChain.ts","../src/persist/persistPathHelpers.ts","../src/persist/persistStorage.ts","../src/persist/persist.ts"],"sourcesContent":["import isPromise from '@lib/isPromise';\n\nexport interface Chain<T> {\n value: T;\n next<S>(fn: (value: Awaited<T>) => S): T extends Promise<any> ? Chain<Promise<S>> : Chain<S>;\n}\n\nexport default function promiseChain<T>(value: T | (() => T)): Chain<T> {\n if (value instanceof Function) {\n value = value();\n }\n\n return {\n value,\n next(fn) {\n const next = isPromise(value)\n ? value.then((value) => fn(value as Awaited<T>))\n : fn(value as Awaited<T>);\n\n return promiseChain(next) as any;\n },\n };\n}\n","import type { KeyType } from '@lib/path';\n\nexport const isAncestor = (ancestor: KeyType[], path: KeyType[]): boolean => {\n return (\n ancestor.length <= path.length &&\n ancestor.every((v, i) => v === '*' || path[i] === '*' || v === path[i])\n );\n};\n\nexport const split = (value: any, path: KeyType[]): { path: KeyType[]; value: unknown }[] => {\n const [first, ...rest] = path;\n if (first === undefined) return [{ path: [], value }];\n\n let entries: Map<KeyType, unknown>;\n if (value instanceof Map) {\n entries = value;\n } else if (value instanceof Set) {\n entries = new Map([...value].map((v, i) => [i, v]));\n } else if (Array.isArray(value)) {\n entries = new Map(value.map((v, i) => [i, v]));\n } else if (typeof value === 'object' && value !== null) {\n entries = new Map(Object.entries(value));\n } else {\n return [{ path: [], value }];\n }\n\n if (first === '*') {\n return [...entries].flatMap(([k, v]) =>\n split(v, rest).map(({ path, value }) => ({ path: [k, ...path], value })),\n );\n }\n\n const subValue = entries.get(first);\n if (subValue === undefined) return [{ path: [], value }];\n\n return split(subValue, rest).map(({ path, value }) => ({ path: [first, ...path], value }));\n};\n","import isPromise from '@lib/isPromise';\nimport promiseChain from '@lib/promiseChain';\n\nexport interface PersistStorageBase {\n getItem: (key: string) => string | null | Promise<string | null>;\n setItem: (key: string, value: string) => void | Promise<unknown>;\n removeItem: (key: string) => void | Promise<unknown>;\n}\n\nexport interface PersistStorageWithKeys extends PersistStorageBase {\n keys: () => string[] | Promise<string[]>;\n}\n\nexport interface PersistStorageWithLength extends PersistStorageBase {\n length: number | (() => number | Promise<number>);\n key: (keyIndex: number) => string | null | Promise<string | null>;\n}\n\nexport interface PersistStorageWithListItems extends PersistStorageBase {\n listItems: () => Map<string, string> | Promise<Map<string, string>>;\n}\n\nexport type PersistStorage =\n | PersistStorageWithKeys\n | PersistStorageWithLength\n | PersistStorageWithListItems;\n\nexport function normalizeStorage(storage: PersistStorage): PersistStorageWithListItems {\n return {\n getItem: storage.getItem.bind(storage),\n setItem: storage.setItem.bind(storage),\n removeItem: storage.removeItem.bind(storage),\n\n listItems() {\n if ('listItems' in storage) {\n return storage.listItems();\n }\n\n return promiseChain(() => {\n if ('keys' in storage) {\n return storage.keys();\n } else {\n return promiseChain(\n storage.length instanceof Function ? storage.length() : storage.length,\n )\n .next((length) => {\n const keys = Array.from({ length }, (_, index) => storage.key(index));\n return keys.some(isPromise) ? Promise.all(keys) : (keys as (string | null)[]);\n })\n .next((keys) => {\n return keys.filter((key): key is string => typeof key === 'string');\n }).value;\n }\n })\n .next((keys) => {\n const results = keys.map(\n (key) =>\n promiseChain(storage.getItem(key)).next((value) => [key, value] as const).value,\n );\n\n return results.some(isPromise)\n ? Promise.all(results)\n : (results as [string, string | null][]);\n })\n .next((results) => {\n return new Map(results.filter(([, value]) => value !== null) as [string, string][]);\n }).value;\n },\n };\n}\n","import { type Cancel, type Duration, type Store } from '@core';\nimport { calcDuration } from '@lib/calcDuration';\nimport { shallowEqual } from '@lib/equals';\nimport { fromExtendedJsonString, toExtendedJsonString } from '@lib/extendedJson';\nimport isPromise from '@lib/isPromise';\nimport type { KeyType, WildcardPath } from '@lib/path';\nimport promiseChain from '@lib/promiseChain';\nimport { castArrayPath, get, remove, set } from '@lib/propAccess';\nimport { queue } from '@lib/queue';\nimport { subscribePatches } from '@patches/patchMethods';\nimport { isAncestor, split } from '@persist/persistPathHelpers';\nimport {\n normalizeStorage,\n type PersistStorage,\n type PersistStorageWithListItems,\n} from './persistStorage';\n\ntype PathOption<T> =\n | WildcardPath<T>\n | {\n path: WildcardPath<T>;\n // throttle?: Duration;\n };\n\ntype Key = { type: 'internal'; path: string } | { type: 'data'; path: KeyType[] };\n\nexport interface PersistOptions<T> {\n id: string;\n storage: PersistStorage;\n paths?: PathOption<T>[];\n throttle?: Duration;\n persistInitialState?: boolean;\n}\n\nexport class Persist<T> {\n readonly storage: PersistStorageWithListItems;\n readonly [Symbol.dispose]!: Cancel;\n\n readonly paths: {\n path: KeyType[];\n throttle?: number;\n }[];\n\n readonly initialized: Promise<void>;\n\n private resolveInitialized?: () => void;\n\n private channel: BroadcastChannel;\n\n private queue = queue();\n\n private handles = new Set<Cancel>();\n\n private stopped = false;\n\n private updateInProgress = new Map<string, unknown>();\n\n private prefix;\n\n constructor(\n public readonly store: Store<T>,\n public readonly options: PersistOptions<T>,\n ) {\n this.storage = normalizeStorage(options.storage);\n this.channel = new BroadcastChannel(`cross-state-persist_${options.id}`);\n this.prefix = `${options.id}:`;\n\n if (Symbol.dispose) {\n this[Symbol.dispose] = () => this.stop();\n }\n\n this.paths = (options.paths ?? [])\n .map<{\n path: KeyType[];\n throttle?: number;\n }>((p) => {\n if (isPlainPath(p)) {\n return {\n path: castArrayPath(p),\n throttle: options.throttle && calcDuration(options.throttle),\n };\n }\n\n const _p = p as { path: KeyType[]; throttle?: Duration };\n\n return {\n path: castArrayPath(_p.path),\n throttle:\n (_p.throttle && calcDuration(_p.throttle)) ??\n (options.throttle && calcDuration(options.throttle)),\n };\n })\n .sort((a, b) => b.path.length - a.path.length);\n\n if (this.paths.length === 0) {\n this.paths.push({\n path: ['*'],\n throttle: options.throttle && calcDuration(options.throttle),\n });\n }\n\n this.initialized = new Promise((resolve) => {\n this.resolveInitialized = resolve;\n });\n\n this.watchStore();\n this.watchStorage();\n }\n\n private watchStore() {\n const throttle = Math.min(...this.paths.map((p) => p.throttle ?? 0)) || undefined;\n\n const cancel = subscribePatches.apply(this.store as Store<unknown>, [\n (patches, reversePatches) => {\n let i = 0;\n for (const patch of patches) {\n const reversePatch = reversePatches[i++];\n\n const stringPath = JSON.stringify(patch.path);\n if (\n this.updateInProgress.has(stringPath) &&\n this.updateInProgress.get(stringPath) ===\n (patch.op === 'remove' ? undefined : patch.value)\n ) {\n continue;\n }\n\n const matchingPaths = this.paths.filter(\n (p) => isAncestor(p.path, patch.path) || isAncestor(patch.path, p.path),\n );\n\n for (const { path } of matchingPaths) {\n if (path.length <= patch.path.length) {\n const pathToSave = patch.path.slice(0, path.length);\n this.queue(() => this.save(pathToSave), pathToSave);\n } else if (patch.op === 'remove') {\n const subValues = split(\n reversePatch?.op === 'add' ? reversePatch.value : {},\n path.slice(patch.path.length),\n );\n\n for (const { path } of subValues) {\n this.queue(() => this.save([...patch.path, ...path]), [...patch.path, ...path]);\n }\n } else {\n const updatedValues = split(patch.value, path.slice(patch.path.length));\n const removedValues = split(\n reversePatch?.op !== 'remove' ? (reversePatch?.value ?? {}) : {},\n path.slice(patch.path.length),\n ).filter((v) => !updatedValues.some((u) => shallowEqual(u.path, v.path)));\n\n for (const { path } of updatedValues) {\n this.queue(() => this.save([...patch.path, ...path]), [...patch.path, ...path]);\n }\n for (const { path } of removedValues) {\n this.queue(() => this.save([...patch.path, ...path]), [...patch.path, ...path]);\n }\n }\n }\n }\n },\n { runNow: this.options.persistInitialState ?? false, passive: true, throttle },\n ]);\n\n this.handles.add(cancel);\n }\n\n private async watchStorage() {\n if (!this.options.persistInitialState) {\n let items = this.storage.listItems();\n if (isPromise(items)) {\n items = await items;\n }\n\n if (this.stopped) {\n return;\n }\n\n const toLoad = new Map(\n [...items.entries()]\n .sort((a, b) => b[1].length - a[1].length)\n .map(([key, value]) => [this.parseKey(key), value])\n .filter(([key]) => key) as [Key, string][],\n );\n\n this.queue(() => this.load(toLoad));\n }\n\n this.queue(() => this.resolveInitialized?.());\n\n const listener = (event: MessageEvent) => {\n this.queue(() => this.load([{ type: 'data', path: event.data }]));\n };\n\n this.channel.addEventListener('message', listener);\n this.handles.add(() => this.channel.removeEventListener('message', listener));\n }\n\n private buildKey({ type, path }: Key) {\n return `${this.prefix}${type === 'internal' ? path : JSON.stringify(path)}`;\n }\n\n private parseKey(key: string): Key | undefined {\n if (!key.startsWith(this.prefix)) {\n return;\n }\n\n key = key.slice(this.prefix.length);\n\n if (!key.startsWith('[')) {\n return { type: 'internal', path: key };\n }\n\n return { type: 'data', path: JSON.parse(key) as KeyType[] };\n }\n\n private load(items: Key[] | Map<Key, string>): void | Promise<void> {\n return promiseChain(() => {\n if (Array.isArray(items)) {\n return promiseChain(() => {\n const entries = items.map(\n (key) =>\n promiseChain(() => {\n return this.storage.getItem(this.buildKey(key));\n }).next((value) => [key, value] as const).value,\n );\n\n return entries.some(isPromise)\n ? Promise.all(entries)\n : (entries as [Key, string | null][]);\n }).next((entries) => {\n return entries.filter((entry) => entry !== null) as [Key, string][];\n }).value;\n } else {\n return [...items.entries()];\n }\n }).next((entries) => {\n if (this.stopped) {\n return;\n }\n\n const toWrite = entries\n .filter(([key, value]) => {\n if (key.type !== 'data' || !value) {\n return;\n }\n\n if (\n !this.paths.find(\n (p) =>\n (p.path.length === 1 && p.path[0] === '*' && key.path.length === 0) ||\n (p.path.length === key.path.length && isAncestor(p.path, key.path)),\n )\n ) {\n return null;\n }\n\n const inSaveQueue = this.queue\n .getRefs()\n .find((ref) => isAncestor(ref, key.path) || isAncestor(key.path, ref));\n return !inSaveQueue;\n })\n .map(([key, value]) => {\n try {\n return {\n path: key.path,\n value: !value || value === 'undefined' ? undefined : fromExtendedJsonString(value),\n };\n } catch {\n return undefined;\n }\n })\n .filter(Boolean) as { path: KeyType[]; value: unknown }[];\n\n if (toWrite.length > 0) {\n for (const { path, value } of toWrite) {\n this.updateInProgress.set(JSON.stringify(path), value);\n }\n\n this.store.set((state) => {\n for (const { path, value } of toWrite) {\n if (value === undefined) {\n state = remove(state, path as any);\n } else {\n state = set(state, path as any, value);\n }\n }\n\n return state;\n });\n\n this.updateInProgress.clear();\n }\n\n const versionEntry = entries.find(\n ([key]) => key.type === 'internal' && key.path === 'version',\n );\n if (versionEntry) {\n this.store.version = versionEntry[1];\n }\n }).value;\n }\n\n private save(path: KeyType[]): void | Promise<unknown> {\n const key = this.buildKey({ type: 'data', path });\n const value = get(this.store.get() as any, path);\n\n return promiseChain(value)\n .next((value) => {\n if (value === undefined) {\n return this.storage.removeItem(key);\n } else {\n return this.storage.setItem(key, toExtendedJsonString(value));\n }\n })\n .next(() => {\n this.channel.postMessage(path);\n\n if (this.store.version) {\n return this.storage.setItem(\n this.buildKey({ type: 'internal', path: 'version' }),\n this.store.version,\n );\n } else {\n return this.storage.removeItem(this.buildKey({ type: 'internal', path: 'version' }));\n }\n }).value;\n }\n\n async stop(): Promise<void> {\n this.stopped = true;\n\n for (const handle of this.handles) {\n handle();\n }\n\n await this.queue.whenDone();\n this.channel.close();\n }\n}\n\nexport function persist<T>(store: Store<T>, options: PersistOptions<T>): Persist<T> {\n return new Persist<T>(store, options);\n}\n\nfunction isPlainPath<T>(p: PathOption<T>): p is WildcardPath<T> & (KeyType[] | string) {\n return typeof p === 'string' || Array.isArray(p);\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { Cancel, Duration, KeyType, Store, WildcardPath } from "./store-BEsiS8y7.cjs";
1
+ import { Cancel, Duration, KeyType, Store, WildcardPath } from "./store-B3PWCx63.cjs";
2
2
 
3
3
  //#region src/persist/persistStorage.d.ts
4
4
  interface PersistStorageBase {
@@ -58,4 +58,4 @@ declare class Persist<T> {
58
58
  declare function persist<T>(store: Store<T>, options: PersistOptions<T>): Persist<T>;
59
59
  //#endregion
60
60
  export { Persist, PersistOptions, PersistStorage, PersistStorageBase, PersistStorageWithKeys, PersistStorageWithLength, PersistStorageWithListItems, persist };
61
- //# sourceMappingURL=persist-D7MAsyyW.d.cts.map
61
+ //# sourceMappingURL=persist-CR3mhti7.d.cts.map
@@ -1,4 +1,4 @@
1
- import { calcDuration, isPromise, queue } from "./store-BpMJxIHt.js";
1
+ import { calcDuration, isPromise, queue } from "./store-DOEc60aP.js";
2
2
  import { castArrayPath, get, remove, set, shallowEqual } from "./propAccess-B260LXN1.js";
3
3
  import { subscribePatches } from "./patchMethods-C_f3PORQ.js";
4
4
  import { fromExtendedJsonString, toExtendedJsonString } from "./extendedJson-BZkQBXEv.js";
@@ -255,4 +255,4 @@ function isPlainPath(p) {
255
255
 
256
256
  //#endregion
257
257
  export { persist };
258
- //# sourceMappingURL=persist-Btgg3qGU.js.map
258
+ //# sourceMappingURL=persist-DFzbvNoJ.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"persist-Btgg3qGU.js","names":["value","entries: Map<KeyType, unknown>","path","store: Store<T>","options: PersistOptions<T>","path","value"],"sources":["../src/lib/promiseChain.ts","../src/persist/persistPathHelpers.ts","../src/persist/persistStorage.ts","../src/persist/persist.ts"],"sourcesContent":["import isPromise from '@lib/isPromise';\n\nexport interface Chain<T> {\n value: T;\n next<S>(fn: (value: Awaited<T>) => S): T extends Promise<any> ? Chain<Promise<S>> : Chain<S>;\n}\n\nexport default function promiseChain<T>(value: T | (() => T)): Chain<T> {\n if (value instanceof Function) {\n value = value();\n }\n\n return {\n value,\n next(fn) {\n const next = isPromise(value)\n ? value.then((value) => fn(value as Awaited<T>))\n : fn(value as Awaited<T>);\n\n return promiseChain(next) as any;\n },\n };\n}\n","import type { KeyType } from '@lib/path';\n\nexport const isAncestor = (ancestor: KeyType[], path: KeyType[]): boolean => {\n return (\n ancestor.length <= path.length &&\n ancestor.every((v, i) => v === '*' || path[i] === '*' || v === path[i])\n );\n};\n\nexport const split = (value: any, path: KeyType[]): { path: KeyType[]; value: unknown }[] => {\n const [first, ...rest] = path;\n if (first === undefined) return [{ path: [], value }];\n\n let entries: Map<KeyType, unknown>;\n if (value instanceof Map) {\n entries = value;\n } else if (value instanceof Set) {\n entries = new Map([...value].map((v, i) => [i, v]));\n } else if (Array.isArray(value)) {\n entries = new Map(value.map((v, i) => [i, v]));\n } else if (typeof value === 'object' && value !== null) {\n entries = new Map(Object.entries(value));\n } else {\n return [{ path: [], value }];\n }\n\n if (first === '*') {\n return [...entries].flatMap(([k, v]) =>\n split(v, rest).map(({ path, value }) => ({ path: [k, ...path], value })),\n );\n }\n\n const subValue = entries.get(first);\n if (subValue === undefined) return [{ path: [], value }];\n\n return split(subValue, rest).map(({ path, value }) => ({ path: [first, ...path], value }));\n};\n","import isPromise from '@lib/isPromise';\nimport promiseChain from '@lib/promiseChain';\n\nexport interface PersistStorageBase {\n getItem: (key: string) => string | null | Promise<string | null>;\n setItem: (key: string, value: string) => void | Promise<unknown>;\n removeItem: (key: string) => void | Promise<unknown>;\n}\n\nexport interface PersistStorageWithKeys extends PersistStorageBase {\n keys: () => string[] | Promise<string[]>;\n}\n\nexport interface PersistStorageWithLength extends PersistStorageBase {\n length: number | (() => number | Promise<number>);\n key: (keyIndex: number) => string | null | Promise<string | null>;\n}\n\nexport interface PersistStorageWithListItems extends PersistStorageBase {\n listItems: () => Map<string, string> | Promise<Map<string, string>>;\n}\n\nexport type PersistStorage =\n | PersistStorageWithKeys\n | PersistStorageWithLength\n | PersistStorageWithListItems;\n\nexport function normalizeStorage(storage: PersistStorage): PersistStorageWithListItems {\n return {\n getItem: storage.getItem.bind(storage),\n setItem: storage.setItem.bind(storage),\n removeItem: storage.removeItem.bind(storage),\n\n listItems() {\n if ('listItems' in storage) {\n return storage.listItems();\n }\n\n return promiseChain(() => {\n if ('keys' in storage) {\n return storage.keys();\n } else {\n return promiseChain(\n storage.length instanceof Function ? storage.length() : storage.length,\n )\n .next((length) => {\n const keys = Array.from({ length }, (_, index) => storage.key(index));\n return keys.some(isPromise) ? Promise.all(keys) : (keys as (string | null)[]);\n })\n .next((keys) => {\n return keys.filter((key): key is string => typeof key === 'string');\n }).value;\n }\n })\n .next((keys) => {\n const results = keys.map(\n (key) =>\n promiseChain(storage.getItem(key)).next((value) => [key, value] as const).value,\n );\n\n return results.some(isPromise)\n ? Promise.all(results)\n : (results as [string, string | null][]);\n })\n .next((results) => {\n return new Map(results.filter(([, value]) => value !== null) as [string, string][]);\n }).value;\n },\n };\n}\n","import { type Cancel, type Duration, type Store } from '@core';\nimport { calcDuration } from '@lib/calcDuration';\nimport { shallowEqual } from '@lib/equals';\nimport { fromExtendedJsonString, toExtendedJsonString } from '@lib/extendedJson';\nimport isPromise from '@lib/isPromise';\nimport type { KeyType, WildcardPath } from '@lib/path';\nimport promiseChain from '@lib/promiseChain';\nimport { castArrayPath, get, remove, set } from '@lib/propAccess';\nimport { queue } from '@lib/queue';\nimport { subscribePatches } from '@patches/patchMethods';\nimport { isAncestor, split } from '@persist/persistPathHelpers';\nimport {\n normalizeStorage,\n type PersistStorage,\n type PersistStorageWithListItems,\n} from './persistStorage';\n\ntype PathOption<T> =\n | WildcardPath<T>\n | {\n path: WildcardPath<T>;\n // throttle?: Duration;\n };\n\ntype Key = { type: 'internal'; path: string } | { type: 'data'; path: KeyType[] };\n\nexport interface PersistOptions<T> {\n id: string;\n storage: PersistStorage;\n paths?: PathOption<T>[];\n throttle?: Duration;\n persistInitialState?: boolean;\n}\n\nexport class Persist<T> {\n readonly storage: PersistStorageWithListItems;\n readonly [Symbol.dispose]!: Cancel;\n\n readonly paths: {\n path: KeyType[];\n throttle?: number;\n }[];\n\n readonly initialized: Promise<void>;\n\n private resolveInitialized?: () => void;\n\n private channel: BroadcastChannel;\n\n private queue = queue();\n\n private handles = new Set<Cancel>();\n\n private stopped = false;\n\n private updateInProgress = new Map<string, unknown>();\n\n private prefix;\n\n constructor(\n public readonly store: Store<T>,\n public readonly options: PersistOptions<T>,\n ) {\n this.storage = normalizeStorage(options.storage);\n this.channel = new BroadcastChannel(`cross-state-persist_${options.id}`);\n this.prefix = `${options.id}:`;\n\n if (Symbol.dispose) {\n this[Symbol.dispose] = () => this.stop();\n }\n\n this.paths = (options.paths ?? [])\n .map<{\n path: KeyType[];\n throttle?: number;\n }>((p) => {\n if (isPlainPath(p)) {\n return {\n path: castArrayPath(p),\n throttle: options.throttle && calcDuration(options.throttle),\n };\n }\n\n const _p = p as { path: KeyType[]; throttle?: Duration };\n\n return {\n path: castArrayPath(_p.path),\n throttle:\n (_p.throttle && calcDuration(_p.throttle)) ??\n (options.throttle && calcDuration(options.throttle)),\n };\n })\n .sort((a, b) => b.path.length - a.path.length);\n\n if (this.paths.length === 0) {\n this.paths.push({\n path: ['*'],\n throttle: options.throttle && calcDuration(options.throttle),\n });\n }\n\n this.initialized = new Promise((resolve) => {\n this.resolveInitialized = resolve;\n });\n\n this.watchStore();\n this.watchStorage();\n }\n\n private watchStore() {\n const throttle = Math.min(...this.paths.map((p) => p.throttle ?? 0)) || undefined;\n\n const cancel = subscribePatches.apply(this.store as Store<unknown>, [\n (patches, reversePatches) => {\n let i = 0;\n for (const patch of patches) {\n const reversePatch = reversePatches[i++];\n\n const stringPath = JSON.stringify(patch.path);\n if (\n this.updateInProgress.has(stringPath) &&\n this.updateInProgress.get(stringPath) ===\n (patch.op === 'remove' ? undefined : patch.value)\n ) {\n continue;\n }\n\n const matchingPaths = this.paths.filter(\n (p) => isAncestor(p.path, patch.path) || isAncestor(patch.path, p.path),\n );\n\n for (const { path } of matchingPaths) {\n if (path.length <= patch.path.length) {\n const pathToSave = patch.path.slice(0, path.length);\n this.queue(() => this.save(pathToSave), pathToSave);\n } else if (patch.op === 'remove') {\n const subValues = split(\n reversePatch?.op === 'add' ? reversePatch.value : {},\n path.slice(patch.path.length),\n );\n\n for (const { path } of subValues) {\n this.queue(() => this.save([...patch.path, ...path]), [...patch.path, ...path]);\n }\n } else {\n const updatedValues = split(patch.value, path.slice(patch.path.length));\n const removedValues = split(\n reversePatch?.op !== 'remove' ? (reversePatch?.value ?? {}) : {},\n path.slice(patch.path.length),\n ).filter((v) => !updatedValues.some((u) => shallowEqual(u.path, v.path)));\n\n for (const { path } of updatedValues) {\n this.queue(() => this.save([...patch.path, ...path]), [...patch.path, ...path]);\n }\n for (const { path } of removedValues) {\n this.queue(() => this.save([...patch.path, ...path]), [...patch.path, ...path]);\n }\n }\n }\n }\n },\n { runNow: this.options.persistInitialState ?? false, passive: true, throttle },\n ]);\n\n this.handles.add(cancel);\n }\n\n private async watchStorage() {\n if (!this.options.persistInitialState) {\n let items = this.storage.listItems();\n if (isPromise(items)) {\n items = await items;\n }\n\n if (this.stopped) {\n return;\n }\n\n const toLoad = new Map(\n [...items.entries()]\n .sort((a, b) => b[1].length - a[1].length)\n .map(([key, value]) => [this.parseKey(key), value])\n .filter(([key]) => key) as [Key, string][],\n );\n\n this.queue(() => this.load(toLoad));\n }\n\n this.queue(() => this.resolveInitialized?.());\n\n const listener = (event: MessageEvent) => {\n this.queue(() => this.load([{ type: 'data', path: event.data }]));\n };\n\n this.channel.addEventListener('message', listener);\n this.handles.add(() => this.channel.removeEventListener('message', listener));\n }\n\n private buildKey({ type, path }: Key) {\n return `${this.prefix}${type === 'internal' ? path : JSON.stringify(path)}`;\n }\n\n private parseKey(key: string): Key | undefined {\n if (!key.startsWith(this.prefix)) {\n return;\n }\n\n key = key.slice(this.prefix.length);\n\n if (!key.startsWith('[')) {\n return { type: 'internal', path: key };\n }\n\n return { type: 'data', path: JSON.parse(key) as KeyType[] };\n }\n\n private load(items: Key[] | Map<Key, string>): void | Promise<void> {\n return promiseChain(() => {\n if (Array.isArray(items)) {\n return promiseChain(() => {\n const entries = items.map(\n (key) =>\n promiseChain(() => {\n return this.storage.getItem(this.buildKey(key));\n }).next((value) => [key, value] as const).value,\n );\n\n return entries.some(isPromise)\n ? Promise.all(entries)\n : (entries as [Key, string | null][]);\n }).next((entries) => {\n return entries.filter((entry) => entry !== null) as [Key, string][];\n }).value;\n } else {\n return [...items.entries()];\n }\n }).next((entries) => {\n if (this.stopped) {\n return;\n }\n\n const toWrite = entries\n .filter(([key, value]) => {\n if (key.type !== 'data' || !value) {\n return;\n }\n\n if (\n !this.paths.find(\n (p) =>\n (p.path.length === 1 && p.path[0] === '*' && key.path.length === 0) ||\n (p.path.length === key.path.length && isAncestor(p.path, key.path)),\n )\n ) {\n return null;\n }\n\n const inSaveQueue = this.queue\n .getRefs()\n .find((ref) => isAncestor(ref, key.path) || isAncestor(key.path, ref));\n return !inSaveQueue;\n })\n .map(([key, value]) => {\n try {\n return {\n path: key.path,\n value: !value || value === 'undefined' ? undefined : fromExtendedJsonString(value),\n };\n } catch {\n return undefined;\n }\n })\n .filter(Boolean) as { path: KeyType[]; value: unknown }[];\n\n if (toWrite.length > 0) {\n for (const { path, value } of toWrite) {\n this.updateInProgress.set(JSON.stringify(path), value);\n }\n\n this.store.set((state) => {\n for (const { path, value } of toWrite) {\n if (value === undefined) {\n state = remove(state, path as any);\n } else {\n state = set(state, path as any, value);\n }\n }\n\n return state;\n });\n\n this.updateInProgress.clear();\n }\n\n const versionEntry = entries.find(\n ([key]) => key.type === 'internal' && key.path === 'version',\n );\n if (versionEntry) {\n this.store.version = versionEntry[1];\n }\n }).value;\n }\n\n private save(path: KeyType[]): void | Promise<unknown> {\n const key = this.buildKey({ type: 'data', path });\n const value = get(this.store.get() as any, path);\n\n return promiseChain(value)\n .next((value) => {\n if (value === undefined) {\n return this.storage.removeItem(key);\n } else {\n return this.storage.setItem(key, toExtendedJsonString(value));\n }\n })\n .next(() => {\n this.channel.postMessage(path);\n\n if (this.store.version) {\n return this.storage.setItem(\n this.buildKey({ type: 'internal', path: 'version' }),\n this.store.version,\n );\n } else {\n return this.storage.removeItem(this.buildKey({ type: 'internal', path: 'version' }));\n }\n }).value;\n }\n\n async stop(): Promise<void> {\n this.stopped = true;\n\n for (const handle of this.handles) {\n handle();\n }\n\n await this.queue.whenDone();\n this.channel.close();\n }\n}\n\nexport function persist<T>(store: Store<T>, options: PersistOptions<T>): Persist<T> {\n return new Persist<T>(store, options);\n}\n\nfunction isPlainPath<T>(p: PathOption<T>): p is WildcardPath<T> & (KeyType[] | string) {\n return typeof p === 'string' || Array.isArray(p);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"persist-DFzbvNoJ.js","names":["value","entries: Map<KeyType, unknown>","path","store: Store<T>","options: PersistOptions<T>","path","value"],"sources":["../src/lib/promiseChain.ts","../src/persist/persistPathHelpers.ts","../src/persist/persistStorage.ts","../src/persist/persist.ts"],"sourcesContent":["import isPromise from '@lib/isPromise';\n\nexport interface Chain<T> {\n value: T;\n next<S>(fn: (value: Awaited<T>) => S): T extends Promise<any> ? Chain<Promise<S>> : Chain<S>;\n}\n\nexport default function promiseChain<T>(value: T | (() => T)): Chain<T> {\n if (value instanceof Function) {\n value = value();\n }\n\n return {\n value,\n next(fn) {\n const next = isPromise(value)\n ? value.then((value) => fn(value as Awaited<T>))\n : fn(value as Awaited<T>);\n\n return promiseChain(next) as any;\n },\n };\n}\n","import type { KeyType } from '@lib/path';\n\nexport const isAncestor = (ancestor: KeyType[], path: KeyType[]): boolean => {\n return (\n ancestor.length <= path.length &&\n ancestor.every((v, i) => v === '*' || path[i] === '*' || v === path[i])\n );\n};\n\nexport const split = (value: any, path: KeyType[]): { path: KeyType[]; value: unknown }[] => {\n const [first, ...rest] = path;\n if (first === undefined) return [{ path: [], value }];\n\n let entries: Map<KeyType, unknown>;\n if (value instanceof Map) {\n entries = value;\n } else if (value instanceof Set) {\n entries = new Map([...value].map((v, i) => [i, v]));\n } else if (Array.isArray(value)) {\n entries = new Map(value.map((v, i) => [i, v]));\n } else if (typeof value === 'object' && value !== null) {\n entries = new Map(Object.entries(value));\n } else {\n return [{ path: [], value }];\n }\n\n if (first === '*') {\n return [...entries].flatMap(([k, v]) =>\n split(v, rest).map(({ path, value }) => ({ path: [k, ...path], value })),\n );\n }\n\n const subValue = entries.get(first);\n if (subValue === undefined) return [{ path: [], value }];\n\n return split(subValue, rest).map(({ path, value }) => ({ path: [first, ...path], value }));\n};\n","import isPromise from '@lib/isPromise';\nimport promiseChain from '@lib/promiseChain';\n\nexport interface PersistStorageBase {\n getItem: (key: string) => string | null | Promise<string | null>;\n setItem: (key: string, value: string) => void | Promise<unknown>;\n removeItem: (key: string) => void | Promise<unknown>;\n}\n\nexport interface PersistStorageWithKeys extends PersistStorageBase {\n keys: () => string[] | Promise<string[]>;\n}\n\nexport interface PersistStorageWithLength extends PersistStorageBase {\n length: number | (() => number | Promise<number>);\n key: (keyIndex: number) => string | null | Promise<string | null>;\n}\n\nexport interface PersistStorageWithListItems extends PersistStorageBase {\n listItems: () => Map<string, string> | Promise<Map<string, string>>;\n}\n\nexport type PersistStorage =\n | PersistStorageWithKeys\n | PersistStorageWithLength\n | PersistStorageWithListItems;\n\nexport function normalizeStorage(storage: PersistStorage): PersistStorageWithListItems {\n return {\n getItem: storage.getItem.bind(storage),\n setItem: storage.setItem.bind(storage),\n removeItem: storage.removeItem.bind(storage),\n\n listItems() {\n if ('listItems' in storage) {\n return storage.listItems();\n }\n\n return promiseChain(() => {\n if ('keys' in storage) {\n return storage.keys();\n } else {\n return promiseChain(\n storage.length instanceof Function ? storage.length() : storage.length,\n )\n .next((length) => {\n const keys = Array.from({ length }, (_, index) => storage.key(index));\n return keys.some(isPromise) ? Promise.all(keys) : (keys as (string | null)[]);\n })\n .next((keys) => {\n return keys.filter((key): key is string => typeof key === 'string');\n }).value;\n }\n })\n .next((keys) => {\n const results = keys.map(\n (key) =>\n promiseChain(storage.getItem(key)).next((value) => [key, value] as const).value,\n );\n\n return results.some(isPromise)\n ? Promise.all(results)\n : (results as [string, string | null][]);\n })\n .next((results) => {\n return new Map(results.filter(([, value]) => value !== null) as [string, string][]);\n }).value;\n },\n };\n}\n","import { type Cancel, type Duration, type Store } from '@core';\nimport { calcDuration } from '@lib/calcDuration';\nimport { shallowEqual } from '@lib/equals';\nimport { fromExtendedJsonString, toExtendedJsonString } from '@lib/extendedJson';\nimport isPromise from '@lib/isPromise';\nimport type { KeyType, WildcardPath } from '@lib/path';\nimport promiseChain from '@lib/promiseChain';\nimport { castArrayPath, get, remove, set } from '@lib/propAccess';\nimport { queue } from '@lib/queue';\nimport { subscribePatches } from '@patches/patchMethods';\nimport { isAncestor, split } from '@persist/persistPathHelpers';\nimport {\n normalizeStorage,\n type PersistStorage,\n type PersistStorageWithListItems,\n} from './persistStorage';\n\ntype PathOption<T> =\n | WildcardPath<T>\n | {\n path: WildcardPath<T>;\n // throttle?: Duration;\n };\n\ntype Key = { type: 'internal'; path: string } | { type: 'data'; path: KeyType[] };\n\nexport interface PersistOptions<T> {\n id: string;\n storage: PersistStorage;\n paths?: PathOption<T>[];\n throttle?: Duration;\n persistInitialState?: boolean;\n}\n\nexport class Persist<T> {\n readonly storage: PersistStorageWithListItems;\n readonly [Symbol.dispose]!: Cancel;\n\n readonly paths: {\n path: KeyType[];\n throttle?: number;\n }[];\n\n readonly initialized: Promise<void>;\n\n private resolveInitialized?: () => void;\n\n private channel: BroadcastChannel;\n\n private queue = queue();\n\n private handles = new Set<Cancel>();\n\n private stopped = false;\n\n private updateInProgress = new Map<string, unknown>();\n\n private prefix;\n\n constructor(\n public readonly store: Store<T>,\n public readonly options: PersistOptions<T>,\n ) {\n this.storage = normalizeStorage(options.storage);\n this.channel = new BroadcastChannel(`cross-state-persist_${options.id}`);\n this.prefix = `${options.id}:`;\n\n if (Symbol.dispose) {\n this[Symbol.dispose] = () => this.stop();\n }\n\n this.paths = (options.paths ?? [])\n .map<{\n path: KeyType[];\n throttle?: number;\n }>((p) => {\n if (isPlainPath(p)) {\n return {\n path: castArrayPath(p),\n throttle: options.throttle && calcDuration(options.throttle),\n };\n }\n\n const _p = p as { path: KeyType[]; throttle?: Duration };\n\n return {\n path: castArrayPath(_p.path),\n throttle:\n (_p.throttle && calcDuration(_p.throttle)) ??\n (options.throttle && calcDuration(options.throttle)),\n };\n })\n .sort((a, b) => b.path.length - a.path.length);\n\n if (this.paths.length === 0) {\n this.paths.push({\n path: ['*'],\n throttle: options.throttle && calcDuration(options.throttle),\n });\n }\n\n this.initialized = new Promise((resolve) => {\n this.resolveInitialized = resolve;\n });\n\n this.watchStore();\n this.watchStorage();\n }\n\n private watchStore() {\n const throttle = Math.min(...this.paths.map((p) => p.throttle ?? 0)) || undefined;\n\n const cancel = subscribePatches.apply(this.store as Store<unknown>, [\n (patches, reversePatches) => {\n let i = 0;\n for (const patch of patches) {\n const reversePatch = reversePatches[i++];\n\n const stringPath = JSON.stringify(patch.path);\n if (\n this.updateInProgress.has(stringPath) &&\n this.updateInProgress.get(stringPath) ===\n (patch.op === 'remove' ? undefined : patch.value)\n ) {\n continue;\n }\n\n const matchingPaths = this.paths.filter(\n (p) => isAncestor(p.path, patch.path) || isAncestor(patch.path, p.path),\n );\n\n for (const { path } of matchingPaths) {\n if (path.length <= patch.path.length) {\n const pathToSave = patch.path.slice(0, path.length);\n this.queue(() => this.save(pathToSave), pathToSave);\n } else if (patch.op === 'remove') {\n const subValues = split(\n reversePatch?.op === 'add' ? reversePatch.value : {},\n path.slice(patch.path.length),\n );\n\n for (const { path } of subValues) {\n this.queue(() => this.save([...patch.path, ...path]), [...patch.path, ...path]);\n }\n } else {\n const updatedValues = split(patch.value, path.slice(patch.path.length));\n const removedValues = split(\n reversePatch?.op !== 'remove' ? (reversePatch?.value ?? {}) : {},\n path.slice(patch.path.length),\n ).filter((v) => !updatedValues.some((u) => shallowEqual(u.path, v.path)));\n\n for (const { path } of updatedValues) {\n this.queue(() => this.save([...patch.path, ...path]), [...patch.path, ...path]);\n }\n for (const { path } of removedValues) {\n this.queue(() => this.save([...patch.path, ...path]), [...patch.path, ...path]);\n }\n }\n }\n }\n },\n { runNow: this.options.persistInitialState ?? false, passive: true, throttle },\n ]);\n\n this.handles.add(cancel);\n }\n\n private async watchStorage() {\n if (!this.options.persistInitialState) {\n let items = this.storage.listItems();\n if (isPromise(items)) {\n items = await items;\n }\n\n if (this.stopped) {\n return;\n }\n\n const toLoad = new Map(\n [...items.entries()]\n .sort((a, b) => b[1].length - a[1].length)\n .map(([key, value]) => [this.parseKey(key), value])\n .filter(([key]) => key) as [Key, string][],\n );\n\n this.queue(() => this.load(toLoad));\n }\n\n this.queue(() => this.resolveInitialized?.());\n\n const listener = (event: MessageEvent) => {\n this.queue(() => this.load([{ type: 'data', path: event.data }]));\n };\n\n this.channel.addEventListener('message', listener);\n this.handles.add(() => this.channel.removeEventListener('message', listener));\n }\n\n private buildKey({ type, path }: Key) {\n return `${this.prefix}${type === 'internal' ? path : JSON.stringify(path)}`;\n }\n\n private parseKey(key: string): Key | undefined {\n if (!key.startsWith(this.prefix)) {\n return;\n }\n\n key = key.slice(this.prefix.length);\n\n if (!key.startsWith('[')) {\n return { type: 'internal', path: key };\n }\n\n return { type: 'data', path: JSON.parse(key) as KeyType[] };\n }\n\n private load(items: Key[] | Map<Key, string>): void | Promise<void> {\n return promiseChain(() => {\n if (Array.isArray(items)) {\n return promiseChain(() => {\n const entries = items.map(\n (key) =>\n promiseChain(() => {\n return this.storage.getItem(this.buildKey(key));\n }).next((value) => [key, value] as const).value,\n );\n\n return entries.some(isPromise)\n ? Promise.all(entries)\n : (entries as [Key, string | null][]);\n }).next((entries) => {\n return entries.filter((entry) => entry !== null) as [Key, string][];\n }).value;\n } else {\n return [...items.entries()];\n }\n }).next((entries) => {\n if (this.stopped) {\n return;\n }\n\n const toWrite = entries\n .filter(([key, value]) => {\n if (key.type !== 'data' || !value) {\n return;\n }\n\n if (\n !this.paths.find(\n (p) =>\n (p.path.length === 1 && p.path[0] === '*' && key.path.length === 0) ||\n (p.path.length === key.path.length && isAncestor(p.path, key.path)),\n )\n ) {\n return null;\n }\n\n const inSaveQueue = this.queue\n .getRefs()\n .find((ref) => isAncestor(ref, key.path) || isAncestor(key.path, ref));\n return !inSaveQueue;\n })\n .map(([key, value]) => {\n try {\n return {\n path: key.path,\n value: !value || value === 'undefined' ? undefined : fromExtendedJsonString(value),\n };\n } catch {\n return undefined;\n }\n })\n .filter(Boolean) as { path: KeyType[]; value: unknown }[];\n\n if (toWrite.length > 0) {\n for (const { path, value } of toWrite) {\n this.updateInProgress.set(JSON.stringify(path), value);\n }\n\n this.store.set((state) => {\n for (const { path, value } of toWrite) {\n if (value === undefined) {\n state = remove(state, path as any);\n } else {\n state = set(state, path as any, value);\n }\n }\n\n return state;\n });\n\n this.updateInProgress.clear();\n }\n\n const versionEntry = entries.find(\n ([key]) => key.type === 'internal' && key.path === 'version',\n );\n if (versionEntry) {\n this.store.version = versionEntry[1];\n }\n }).value;\n }\n\n private save(path: KeyType[]): void | Promise<unknown> {\n const key = this.buildKey({ type: 'data', path });\n const value = get(this.store.get() as any, path);\n\n return promiseChain(value)\n .next((value) => {\n if (value === undefined) {\n return this.storage.removeItem(key);\n } else {\n return this.storage.setItem(key, toExtendedJsonString(value));\n }\n })\n .next(() => {\n this.channel.postMessage(path);\n\n if (this.store.version) {\n return this.storage.setItem(\n this.buildKey({ type: 'internal', path: 'version' }),\n this.store.version,\n );\n } else {\n return this.storage.removeItem(this.buildKey({ type: 'internal', path: 'version' }));\n }\n }).value;\n }\n\n async stop(): Promise<void> {\n this.stopped = true;\n\n for (const handle of this.handles) {\n handle();\n }\n\n await this.queue.whenDone();\n this.channel.close();\n }\n}\n\nexport function persist<T>(store: Store<T>, options: PersistOptions<T>): Persist<T> {\n return new Persist<T>(store, options);\n}\n\nfunction isPlainPath<T>(p: PathOption<T>): p is WildcardPath<T> & (KeyType[] | string) {\n return typeof p === 'string' || Array.isArray(p);\n}\n"],"mappings":";;;;;;AAOA,SAAwB,aAAgB,OAAgC;AACtE,KAAI,iBAAiB,SACnB,SAAQ;AAGV,QAAO;EACL;EACA,KAAK,IAAI;GACP,MAAM,OAAO,UAAU,SACnB,MAAM,MAAM,YAAU,GAAGA,YACzB,GAAG;AAEP,UAAO,aAAa;;;;;;;ACjB1B,MAAa,cAAc,UAAqB,SAA6B;AAC3E,QACE,SAAS,UAAU,KAAK,UACxB,SAAS,OAAO,GAAG,MAAM,MAAM,OAAO,KAAK,OAAO,OAAO,MAAM,KAAK;;AAIxE,MAAa,SAAS,OAAY,SAA2D;CAC3F,MAAM,CAAC,OAAO,GAAG,QAAQ;AACzB,KAAI,UAAU,OAAW,QAAO,CAAC;EAAE,MAAM;EAAI;;CAE7C,IAAIC;AACJ,KAAI,iBAAiB,IACnB,WAAU;UACD,iBAAiB,IAC1B,WAAU,IAAI,IAAI,CAAC,GAAG,OAAO,KAAK,GAAG,MAAM,CAAC,GAAG;UACtC,MAAM,QAAQ,OACvB,WAAU,IAAI,IAAI,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG;UACjC,OAAO,UAAU,YAAY,UAAU,KAChD,WAAU,IAAI,IAAI,OAAO,QAAQ;KAEjC,QAAO,CAAC;EAAE,MAAM;EAAI;;AAGtB,KAAI,UAAU,IACZ,QAAO,CAAC,GAAG,SAAS,SAAS,CAAC,GAAG,OAC/B,MAAM,GAAG,MAAM,KAAK,EAAE,cAAM,sBAAa;EAAE,MAAM,CAAC,GAAG,GAAGC;EAAO;;CAInE,MAAM,WAAW,QAAQ,IAAI;AAC7B,KAAI,aAAa,OAAW,QAAO,CAAC;EAAE,MAAM;EAAI;;AAEhD,QAAO,MAAM,UAAU,MAAM,KAAK,EAAE,cAAM,sBAAa;EAAE,MAAM,CAAC,OAAO,GAAGA;EAAO;;;;;;ACRnF,SAAgB,iBAAiB,SAAsD;AACrF,QAAO;EACL,SAAS,QAAQ,QAAQ,KAAK;EAC9B,SAAS,QAAQ,QAAQ,KAAK;EAC9B,YAAY,QAAQ,WAAW,KAAK;EAEpC,YAAY;AACV,OAAI,eAAe,QACjB,QAAO,QAAQ;AAGjB,UAAO,mBAAmB;AACxB,QAAI,UAAU,QACZ,QAAO,QAAQ;QAEf,QAAO,aACL,QAAQ,kBAAkB,WAAW,QAAQ,WAAW,QAAQ,QAE/D,MAAM,WAAW;KAChB,MAAM,OAAO,MAAM,KAAK,EAAE,WAAW,GAAG,UAAU,QAAQ,IAAI;AAC9D,YAAO,KAAK,KAAK,aAAa,QAAQ,IAAI,QAAS;OAEpD,MAAM,SAAS;AACd,YAAO,KAAK,QAAQ,QAAuB,OAAO,QAAQ;OACzD;MAGN,MAAM,SAAS;IACd,MAAM,UAAU,KAAK,KAClB,QACC,aAAa,QAAQ,QAAQ,MAAM,MAAM,UAAU,CAAC,KAAK,QAAiB;AAG9E,WAAO,QAAQ,KAAK,aAChB,QAAQ,IAAI,WACX;MAEN,MAAM,YAAY;AACjB,WAAO,IAAI,IAAI,QAAQ,QAAQ,GAAG,WAAW,UAAU;MACtD;;;;;;;AChCX,IAAa,UAAb,MAAwB;;EAEZ,OAAO;;CAuBjB,YACE,AAAgBC,OAChB,AAAgBC,SAChB;EAFgB;EACA;eAZF;iCAEE,IAAI;iBAEJ;0CAES,IAAI;AAQ7B,OAAK,UAAU,iBAAiB,QAAQ;AACxC,OAAK,UAAU,IAAI,iBAAiB,uBAAuB,QAAQ;AACnE,OAAK,SAAS,GAAG,QAAQ,GAAG;AAE5B,MAAI,OAAO,QACT,MAAK,OAAO,iBAAiB,KAAK;AAGpC,OAAK,SAAS,QAAQ,SAAS,IAC5B,KAGG,MAAM;AACR,OAAI,YAAY,GACd,QAAO;IACL,MAAM,cAAc;IACpB,UAAU,QAAQ,YAAY,aAAa,QAAQ;;GAIvD,MAAM,KAAK;AAEX,UAAO;IACL,MAAM,cAAc,GAAG;IACvB,WACG,GAAG,YAAY,aAAa,GAAG,eAC/B,QAAQ,YAAY,aAAa,QAAQ;;KAG/C,MAAM,GAAG,MAAM,EAAE,KAAK,SAAS,EAAE,KAAK;AAEzC,MAAI,KAAK,MAAM,WAAW,EACxB,MAAK,MAAM,KAAK;GACd,MAAM,CAAC;GACP,UAAU,QAAQ,YAAY,aAAa,QAAQ;;AAIvD,OAAK,cAAc,IAAI,SAAS,YAAY;AAC1C,QAAK,qBAAqB;;AAG5B,OAAK;AACL,OAAK;;CAGP,AAAQ,aAAa;EACnB,MAAM,WAAW,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,MAAM,EAAE,YAAY,OAAO;EAExE,MAAM,SAAS,iBAAiB,MAAM,KAAK,OAAyB,EACjE,SAAS,mBAAmB;GAC3B,IAAI,IAAI;AACR,QAAK,MAAM,SAAS,SAAS;IAC3B,MAAM,eAAe,eAAe;IAEpC,MAAM,aAAa,KAAK,UAAU,MAAM;AACxC,QACE,KAAK,iBAAiB,IAAI,eAC1B,KAAK,iBAAiB,IAAI,iBACvB,MAAM,OAAO,WAAW,SAAY,MAAM,OAE7C;IAGF,MAAM,gBAAgB,KAAK,MAAM,QAC9B,MAAM,WAAW,EAAE,MAAM,MAAM,SAAS,WAAW,MAAM,MAAM,EAAE;AAGpE,SAAK,MAAM,EAAE,UAAU,cACrB,KAAI,KAAK,UAAU,MAAM,KAAK,QAAQ;KACpC,MAAM,aAAa,MAAM,KAAK,MAAM,GAAG,KAAK;AAC5C,UAAK,YAAY,KAAK,KAAK,aAAa;eAC/B,MAAM,OAAO,UAAU;KAChC,MAAM,YAAY,MAChB,cAAc,OAAO,QAAQ,aAAa,QAAQ,IAClD,KAAK,MAAM,MAAM,KAAK;AAGxB,UAAK,MAAM,EAAE,kBAAU,UACrB,MAAK,YAAY,KAAK,KAAK,CAAC,GAAG,MAAM,MAAM,GAAGC,UAAQ,CAAC,GAAG,MAAM,MAAM,GAAGA;WAEtE;KACL,MAAM,gBAAgB,MAAM,MAAM,OAAO,KAAK,MAAM,MAAM,KAAK;KAC/D,MAAM,gBAAgB,MACpB,cAAc,OAAO,WAAY,cAAc,SAAS,KAAM,IAC9D,KAAK,MAAM,MAAM,KAAK,SACtB,QAAQ,MAAM,CAAC,cAAc,MAAM,MAAM,aAAa,EAAE,MAAM,EAAE;AAElE,UAAK,MAAM,EAAE,kBAAU,cACrB,MAAK,YAAY,KAAK,KAAK,CAAC,GAAG,MAAM,MAAM,GAAGA,UAAQ,CAAC,GAAG,MAAM,MAAM,GAAGA;AAE3E,UAAK,MAAM,EAAE,kBAAU,cACrB,MAAK,YAAY,KAAK,KAAK,CAAC,GAAG,MAAM,MAAM,GAAGA,UAAQ,CAAC,GAAG,MAAM,MAAM,GAAGA;;;KAMnF;GAAE,QAAQ,KAAK,QAAQ,uBAAuB;GAAO,SAAS;GAAM;;AAGtE,OAAK,QAAQ,IAAI;;CAGnB,MAAc,eAAe;AAC3B,MAAI,CAAC,KAAK,QAAQ,qBAAqB;GACrC,IAAI,QAAQ,KAAK,QAAQ;AACzB,OAAI,UAAU,OACZ,SAAQ,MAAM;AAGhB,OAAI,KAAK,QACP;GAGF,MAAM,SAAS,IAAI,IACjB,CAAC,GAAG,MAAM,WACP,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,EAAE,GAAG,QAClC,KAAK,CAAC,KAAK,WAAW,CAAC,KAAK,SAAS,MAAM,QAC3C,QAAQ,CAAC,SAAS;AAGvB,QAAK,YAAY,KAAK,KAAK;;AAG7B,OAAK,YAAY,KAAK;EAEtB,MAAM,YAAY,UAAwB;AACxC,QAAK,YAAY,KAAK,KAAK,CAAC;IAAE,MAAM;IAAQ,MAAM,MAAM;;;AAG1D,OAAK,QAAQ,iBAAiB,WAAW;AACzC,OAAK,QAAQ,UAAU,KAAK,QAAQ,oBAAoB,WAAW;;CAGrE,AAAQ,SAAS,EAAE,MAAM,QAAa;AACpC,SAAO,GAAG,KAAK,SAAS,SAAS,aAAa,OAAO,KAAK,UAAU;;CAGtE,AAAQ,SAAS,KAA8B;AAC7C,MAAI,CAAC,IAAI,WAAW,KAAK,QACvB;AAGF,QAAM,IAAI,MAAM,KAAK,OAAO;AAE5B,MAAI,CAAC,IAAI,WAAW,KAClB,QAAO;GAAE,MAAM;GAAY,MAAM;;AAGnC,SAAO;GAAE,MAAM;GAAQ,MAAM,KAAK,MAAM;;;CAG1C,AAAQ,KAAK,OAAuD;AAClE,SAAO,mBAAmB;AACxB,OAAI,MAAM,QAAQ,OAChB,QAAO,mBAAmB;IACxB,MAAM,UAAU,MAAM,KACnB,QACC,mBAAmB;AACjB,YAAO,KAAK,QAAQ,QAAQ,KAAK,SAAS;OACzC,MAAM,UAAU,CAAC,KAAK,QAAiB;AAG9C,WAAO,QAAQ,KAAK,aAChB,QAAQ,IAAI,WACX;MACJ,MAAM,YAAY;AACnB,WAAO,QAAQ,QAAQ,UAAU,UAAU;MAC1C;OAEH,QAAO,CAAC,GAAG,MAAM;KAElB,MAAM,YAAY;AACnB,OAAI,KAAK,QACP;GAGF,MAAM,UAAU,QACb,QAAQ,CAAC,KAAK,WAAW;AACxB,QAAI,IAAI,SAAS,UAAU,CAAC,MAC1B;AAGF,QACE,CAAC,KAAK,MAAM,MACT,MACE,EAAE,KAAK,WAAW,KAAK,EAAE,KAAK,OAAO,OAAO,IAAI,KAAK,WAAW,KAChE,EAAE,KAAK,WAAW,IAAI,KAAK,UAAU,WAAW,EAAE,MAAM,IAAI,OAGjE,QAAO;IAGT,MAAM,cAAc,KAAK,MACtB,UACA,MAAM,QAAQ,WAAW,KAAK,IAAI,SAAS,WAAW,IAAI,MAAM;AACnE,WAAO,CAAC;MAET,KAAK,CAAC,KAAK,WAAW;AACrB,QAAI;AACF,YAAO;MACL,MAAM,IAAI;MACV,OAAO,CAAC,SAAS,UAAU,cAAc,SAAY,uBAAuB;;YAExE;AACN,YAAO;;MAGV,OAAO;AAEV,OAAI,QAAQ,SAAS,GAAG;AACtB,SAAK,MAAM,EAAE,MAAM,WAAW,QAC5B,MAAK,iBAAiB,IAAI,KAAK,UAAU,OAAO;AAGlD,SAAK,MAAM,KAAK,UAAU;AACxB,UAAK,MAAM,EAAE,MAAM,WAAW,QAC5B,KAAI,UAAU,OACZ,SAAQ,OAAO,OAAO;SAEtB,SAAQ,IAAI,OAAO,MAAa;AAIpC,YAAO;;AAGT,SAAK,iBAAiB;;GAGxB,MAAM,eAAe,QAAQ,MAC1B,CAAC,SAAS,IAAI,SAAS,cAAc,IAAI,SAAS;AAErD,OAAI,aACF,MAAK,MAAM,UAAU,aAAa;KAEnC;;CAGL,AAAQ,KAAK,MAA0C;EACrD,MAAM,MAAM,KAAK,SAAS;GAAE,MAAM;GAAQ;;EAC1C,MAAM,QAAQ,IAAI,KAAK,MAAM,OAAc;AAE3C,SAAO,aAAa,OACjB,MAAM,YAAU;AACf,OAAIC,YAAU,OACZ,QAAO,KAAK,QAAQ,WAAW;OAE/B,QAAO,KAAK,QAAQ,QAAQ,KAAK,qBAAqBA;KAGzD,WAAW;AACV,QAAK,QAAQ,YAAY;AAEzB,OAAI,KAAK,MAAM,QACb,QAAO,KAAK,QAAQ,QAClB,KAAK,SAAS;IAAE,MAAM;IAAY,MAAM;OACxC,KAAK,MAAM;OAGb,QAAO,KAAK,QAAQ,WAAW,KAAK,SAAS;IAAE,MAAM;IAAY,MAAM;;KAExE;;CAGP,MAAM,OAAsB;AAC1B,OAAK,UAAU;AAEf,OAAK,MAAM,UAAU,KAAK,QACxB;AAGF,QAAM,KAAK,MAAM;AACjB,OAAK,QAAQ;;;AAIjB,SAAgB,QAAW,OAAiB,SAAwC;AAClF,QAAO,IAAI,QAAW,OAAO;;AAG/B,SAAS,YAAe,GAA+D;AACrF,QAAO,OAAO,MAAM,YAAY,MAAM,QAAQ"}