@legendapp/state 3.0.0-alpha.30 → 3.0.0-alpha.31

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.
package/config.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { N as NodeInfo } from './observableInterfaces-Dilj6F92.mjs';
1
+ import { N as NodeInfo } from './observableInterfaces-CZR3_8mM.mjs';
2
2
 
3
3
  declare function configureLegendState({ observableFunctions, observableProperties, jsonReplacer, jsonReviver, }: {
4
4
  observableFunctions?: Record<string, (node: NodeInfo, ...args: any[]) => any>;
package/config.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { N as NodeInfo } from './observableInterfaces-Dilj6F92.js';
1
+ import { N as NodeInfo } from './observableInterfaces-CZR3_8mM.js';
2
2
 
3
3
  declare function configureLegendState({ observableFunctions, observableProperties, jsonReplacer, jsonReviver, }: {
4
4
  observableFunctions?: Record<string, (node: NodeInfo, ...args: any[]) => any>;
package/config.js CHANGED
@@ -871,16 +871,30 @@ function _when(predicate, effect, checkReady) {
871
871
  if (isPromise(predicate)) {
872
872
  return effect ? predicate.then(effect) : predicate;
873
873
  }
874
+ const isPredicateArray = isArray(predicate);
874
875
  let value;
875
876
  let effectValue;
876
877
  function run(e) {
877
- const ret = computeSelector(predicate);
878
+ const ret = isPredicateArray ? predicate.map((p) => computeSelector(p)) : computeSelector(predicate);
878
879
  if (isPromise(ret)) {
879
880
  value = ret;
880
881
  return void 0;
881
- } else if (!isPromise(ret) && (isObservableValueReady(ret) )) {
882
- value = ret;
883
- e.cancel = true;
882
+ } else {
883
+ let isOk = true;
884
+ if (isArray(ret)) {
885
+ for (let i = 0; i < ret.length; i++) {
886
+ if (isObservable(ret[i])) {
887
+ ret[i] = computeSelector(ret[i]);
888
+ }
889
+ isOk = isOk && !!(isObservableValueReady(ret[i]) );
890
+ }
891
+ } else {
892
+ isOk = isObservableValueReady(ret) ;
893
+ }
894
+ if (isOk) {
895
+ value = ret;
896
+ e.cancel = true;
897
+ }
884
898
  }
885
899
  return value;
886
900
  }
package/config.mjs CHANGED
@@ -869,16 +869,30 @@ function _when(predicate, effect, checkReady) {
869
869
  if (isPromise(predicate)) {
870
870
  return effect ? predicate.then(effect) : predicate;
871
871
  }
872
+ const isPredicateArray = isArray(predicate);
872
873
  let value;
873
874
  let effectValue;
874
875
  function run(e) {
875
- const ret = computeSelector(predicate);
876
+ const ret = isPredicateArray ? predicate.map((p) => computeSelector(p)) : computeSelector(predicate);
876
877
  if (isPromise(ret)) {
877
878
  value = ret;
878
879
  return void 0;
879
- } else if (!isPromise(ret) && (isObservableValueReady(ret) )) {
880
- value = ret;
881
- e.cancel = true;
880
+ } else {
881
+ let isOk = true;
882
+ if (isArray(ret)) {
883
+ for (let i = 0; i < ret.length; i++) {
884
+ if (isObservable(ret[i])) {
885
+ ret[i] = computeSelector(ret[i]);
886
+ }
887
+ isOk = isOk && !!(isObservableValueReady(ret[i]) );
888
+ }
889
+ } else {
890
+ isOk = isObservableValueReady(ret) ;
891
+ }
892
+ if (isOk) {
893
+ value = ret;
894
+ e.cancel = true;
895
+ }
882
896
  }
883
897
  return value;
884
898
  }
package/index.d.mts CHANGED
@@ -1,5 +1,5 @@
1
- import { N as NodeInfo, O as Observable, T as TrackingType, G as GetOptions, C as Change, R as RecursiveValueOrFunction, a as ObservableEvent, S as Selector, b as ObserveEvent, c as ObservableParam, d as OpaqueObject, e as TypeAtPath, L as LinkedOptions, f as Linked, g as ObservablePrimitive, h as ObserveOptions, i as ObserveEventCallback, j as ObservableSyncState, k as ListenerParams, l as TrackingNode, m as clone, n as ensureNodeValue, o as findIDKey, p as getNode, q as getNodeValue, r as getPathType, U as UpdateFn, s as safeParse, t as safeStringify, u as setNodeValue, v as TrackingState } from './observableInterfaces-Dilj6F92.mjs';
2
- export { A as ArrayValue, J as ChildNodeInfo, B as ClassConstructor, M as GetMode, a0 as ImmutableObservableBase, x as ListenerFn, H as NodeListener, F as NotPrimitive, $ as ObservableBoolean, D as ObservableListenerDispose, a1 as ObservableObject, _ as ObservableObjectFns, E as ObservableRoot, X as ObservableState, V as ObservableSyncStateBase, z as ObservableValue, P as Primitive, y as RecordValue, Z as RemoveObservables, Y as RetryOptions, I as RootNodeInfo, K as SetParams, Q as UpdateFnParams, W as WaitForSetFnParams, w as isObservable } from './observableInterfaces-Dilj6F92.mjs';
1
+ import { N as NodeInfo, O as Observable, T as TrackingType, G as GetOptions, C as Change, R as RecursiveValueOrFunction, a as ObservableEvent, S as Selector, b as ObserveEvent, c as ObservableParam, d as OpaqueObject, e as TypeAtPath, L as LinkedOptions, f as Linked, g as ObservablePrimitive, h as ObserveOptions, i as ObserveEventCallback, j as ObservableSyncState, k as ListenerParams, l as TrackingNode, m as clone, n as ensureNodeValue, o as findIDKey, p as getNode, q as getNodeValue, r as getPathType, U as UpdateFn, s as safeParse, t as safeStringify, u as setNodeValue, v as TrackingState } from './observableInterfaces-CZR3_8mM.mjs';
2
+ export { A as ArrayValue, J as ChildNodeInfo, B as ClassConstructor, Q as GetMode, a1 as ImmutableObservableBase, x as ListenerFn, H as NodeListener, F as NotPrimitive, a0 as ObservableBoolean, D as ObservableListenerDispose, a2 as ObservableObject, $ as ObservableObjectFns, E as ObservableRoot, Y as ObservableState, X as ObservableSyncStateBase, z as ObservableValue, P as Primitive, y as RecordValue, _ as RemoveObservables, Z as RetryOptions, I as RootNodeInfo, K as SetParams, V as UpdateFnParams, W as WaitForSet, M as WaitForSetFnParams, w as isObservable } from './observableInterfaces-CZR3_8mM.mjs';
3
3
 
4
4
  declare function getProxy(node: NodeInfo, p?: string, asFunction?: Function): Observable;
5
5
  declare function set(node: NodeInfo, newValue?: any): void;
@@ -74,10 +74,14 @@ declare function trackSelector<T>(selector: Selector<T>, update: (params: Listen
74
74
  };
75
75
 
76
76
  declare function when<T, T2>(predicate: Promise<T>, effect: (value: T) => T2): Promise<T2>;
77
+ declare function when<T, T2>(predicate: Selector<T>[], effect: (value: T[]) => T2): Promise<T2>;
77
78
  declare function when<T, T2>(predicate: Selector<T>, effect: (value: T) => T2): Promise<T2>;
79
+ declare function when<T>(predicate: Selector<T>[]): Promise<T[]>;
78
80
  declare function when<T>(predicate: Selector<T>): Promise<T>;
79
81
  declare function whenReady<T, T2>(predicate: Promise<T>, effect: (value: T) => T2): Promise<T2>;
82
+ declare function whenReady<T, T2>(predicate: Selector<T>[], effect: (value: T[]) => T2): Promise<T2[]>;
80
83
  declare function whenReady<T, T2>(predicate: Selector<T>, effect: (value: T) => T2): Promise<T2>;
84
+ declare function whenReady<T>(predicate: Selector<T>[]): Promise<T[]>;
81
85
  declare function whenReady<T>(predicate: Selector<T>): Promise<T>;
82
86
 
83
87
  declare const internal: {
package/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { N as NodeInfo, O as Observable, T as TrackingType, G as GetOptions, C as Change, R as RecursiveValueOrFunction, a as ObservableEvent, S as Selector, b as ObserveEvent, c as ObservableParam, d as OpaqueObject, e as TypeAtPath, L as LinkedOptions, f as Linked, g as ObservablePrimitive, h as ObserveOptions, i as ObserveEventCallback, j as ObservableSyncState, k as ListenerParams, l as TrackingNode, m as clone, n as ensureNodeValue, o as findIDKey, p as getNode, q as getNodeValue, r as getPathType, U as UpdateFn, s as safeParse, t as safeStringify, u as setNodeValue, v as TrackingState } from './observableInterfaces-Dilj6F92.js';
2
- export { A as ArrayValue, J as ChildNodeInfo, B as ClassConstructor, M as GetMode, a0 as ImmutableObservableBase, x as ListenerFn, H as NodeListener, F as NotPrimitive, $ as ObservableBoolean, D as ObservableListenerDispose, a1 as ObservableObject, _ as ObservableObjectFns, E as ObservableRoot, X as ObservableState, V as ObservableSyncStateBase, z as ObservableValue, P as Primitive, y as RecordValue, Z as RemoveObservables, Y as RetryOptions, I as RootNodeInfo, K as SetParams, Q as UpdateFnParams, W as WaitForSetFnParams, w as isObservable } from './observableInterfaces-Dilj6F92.js';
1
+ import { N as NodeInfo, O as Observable, T as TrackingType, G as GetOptions, C as Change, R as RecursiveValueOrFunction, a as ObservableEvent, S as Selector, b as ObserveEvent, c as ObservableParam, d as OpaqueObject, e as TypeAtPath, L as LinkedOptions, f as Linked, g as ObservablePrimitive, h as ObserveOptions, i as ObserveEventCallback, j as ObservableSyncState, k as ListenerParams, l as TrackingNode, m as clone, n as ensureNodeValue, o as findIDKey, p as getNode, q as getNodeValue, r as getPathType, U as UpdateFn, s as safeParse, t as safeStringify, u as setNodeValue, v as TrackingState } from './observableInterfaces-CZR3_8mM.js';
2
+ export { A as ArrayValue, J as ChildNodeInfo, B as ClassConstructor, Q as GetMode, a1 as ImmutableObservableBase, x as ListenerFn, H as NodeListener, F as NotPrimitive, a0 as ObservableBoolean, D as ObservableListenerDispose, a2 as ObservableObject, $ as ObservableObjectFns, E as ObservableRoot, Y as ObservableState, X as ObservableSyncStateBase, z as ObservableValue, P as Primitive, y as RecordValue, _ as RemoveObservables, Z as RetryOptions, I as RootNodeInfo, K as SetParams, V as UpdateFnParams, W as WaitForSet, M as WaitForSetFnParams, w as isObservable } from './observableInterfaces-CZR3_8mM.js';
3
3
 
4
4
  declare function getProxy(node: NodeInfo, p?: string, asFunction?: Function): Observable;
5
5
  declare function set(node: NodeInfo, newValue?: any): void;
@@ -74,10 +74,14 @@ declare function trackSelector<T>(selector: Selector<T>, update: (params: Listen
74
74
  };
75
75
 
76
76
  declare function when<T, T2>(predicate: Promise<T>, effect: (value: T) => T2): Promise<T2>;
77
+ declare function when<T, T2>(predicate: Selector<T>[], effect: (value: T[]) => T2): Promise<T2>;
77
78
  declare function when<T, T2>(predicate: Selector<T>, effect: (value: T) => T2): Promise<T2>;
79
+ declare function when<T>(predicate: Selector<T>[]): Promise<T[]>;
78
80
  declare function when<T>(predicate: Selector<T>): Promise<T>;
79
81
  declare function whenReady<T, T2>(predicate: Promise<T>, effect: (value: T) => T2): Promise<T2>;
82
+ declare function whenReady<T, T2>(predicate: Selector<T>[], effect: (value: T[]) => T2): Promise<T2[]>;
80
83
  declare function whenReady<T, T2>(predicate: Selector<T>, effect: (value: T) => T2): Promise<T2>;
84
+ declare function whenReady<T>(predicate: Selector<T>[]): Promise<T[]>;
81
85
  declare function whenReady<T>(predicate: Selector<T>): Promise<T>;
82
86
 
83
87
  declare const internal: {
package/index.js CHANGED
@@ -1024,16 +1024,30 @@ function _when(predicate, effect, checkReady) {
1024
1024
  if (isPromise(predicate)) {
1025
1025
  return effect ? predicate.then(effect) : predicate;
1026
1026
  }
1027
+ const isPredicateArray = isArray(predicate);
1027
1028
  let value;
1028
1029
  let effectValue;
1029
1030
  function run(e) {
1030
- const ret = computeSelector(predicate);
1031
+ const ret = isPredicateArray ? predicate.map((p) => computeSelector(p)) : computeSelector(predicate);
1031
1032
  if (isPromise(ret)) {
1032
1033
  value = ret;
1033
1034
  return void 0;
1034
- } else if (!isPromise(ret) && (checkReady ? isObservableValueReady(ret) : ret)) {
1035
- value = ret;
1036
- e.cancel = true;
1035
+ } else {
1036
+ let isOk = true;
1037
+ if (isArray(ret)) {
1038
+ for (let i = 0; i < ret.length; i++) {
1039
+ if (isObservable(ret[i])) {
1040
+ ret[i] = computeSelector(ret[i]);
1041
+ }
1042
+ isOk = isOk && !!(checkReady ? isObservableValueReady(ret[i]) : ret[i]);
1043
+ }
1044
+ } else {
1045
+ isOk = checkReady ? isObservableValueReady(ret) : ret;
1046
+ }
1047
+ if (isOk) {
1048
+ value = ret;
1049
+ e.cancel = true;
1050
+ }
1037
1051
  }
1038
1052
  return value;
1039
1053
  }
@@ -2222,6 +2236,7 @@ function syncState(obs) {
2222
2236
  isSyncEnabled: true,
2223
2237
  isGetting: false,
2224
2238
  isSetting: false,
2239
+ numPendingGets: 0,
2225
2240
  numPendingSets: 0,
2226
2241
  syncCount: 0,
2227
2242
  clearPersist: void 0,
package/index.mjs CHANGED
@@ -1022,16 +1022,30 @@ function _when(predicate, effect, checkReady) {
1022
1022
  if (isPromise(predicate)) {
1023
1023
  return effect ? predicate.then(effect) : predicate;
1024
1024
  }
1025
+ const isPredicateArray = isArray(predicate);
1025
1026
  let value;
1026
1027
  let effectValue;
1027
1028
  function run(e) {
1028
- const ret = computeSelector(predicate);
1029
+ const ret = isPredicateArray ? predicate.map((p) => computeSelector(p)) : computeSelector(predicate);
1029
1030
  if (isPromise(ret)) {
1030
1031
  value = ret;
1031
1032
  return void 0;
1032
- } else if (!isPromise(ret) && (checkReady ? isObservableValueReady(ret) : ret)) {
1033
- value = ret;
1034
- e.cancel = true;
1033
+ } else {
1034
+ let isOk = true;
1035
+ if (isArray(ret)) {
1036
+ for (let i = 0; i < ret.length; i++) {
1037
+ if (isObservable(ret[i])) {
1038
+ ret[i] = computeSelector(ret[i]);
1039
+ }
1040
+ isOk = isOk && !!(checkReady ? isObservableValueReady(ret[i]) : ret[i]);
1041
+ }
1042
+ } else {
1043
+ isOk = checkReady ? isObservableValueReady(ret) : ret;
1044
+ }
1045
+ if (isOk) {
1046
+ value = ret;
1047
+ e.cancel = true;
1048
+ }
1035
1049
  }
1036
1050
  return value;
1037
1051
  }
@@ -2220,6 +2234,7 @@ function syncState(obs) {
2220
2234
  isSyncEnabled: true,
2221
2235
  isGetting: false,
2222
2236
  isSetting: false,
2237
+ numPendingGets: 0,
2223
2238
  numPendingSets: 0,
2224
2239
  syncCount: 0,
2225
2240
  clearPersist: void 0,
@@ -224,11 +224,12 @@ interface ObserveEventCallback<T> {
224
224
  onCleanupReaction?: () => void;
225
225
  }
226
226
  type SetParams<T> = ListenerParams<T extends Promise<infer t> ? t : T>;
227
+ type WaitForSet<T> = ((params: WaitForSetFnParams<T>) => any) | Promise<any> | ObservableParam<any> | ObservableEvent | ObservableParam<any>[] | ObservableEvent[];
227
228
  interface LinkedOptions<T = any> {
228
229
  get?: () => Promise<T> | T;
229
230
  set?: (params: SetParams<T>) => void | Promise<any>;
230
231
  waitFor?: Selector<any>;
231
- waitForSet?: ((params: WaitForSetFnParams<T>) => any) | Promise<any> | ObservableParam<any> | ObservableEvent;
232
+ waitForSet?: WaitForSet<T>;
232
233
  initial?: (() => T) | T;
233
234
  activate?: 'auto' | 'lazy';
234
235
  }
@@ -254,9 +255,9 @@ interface ObservableSyncStateBase {
254
255
  lastSync?: number;
255
256
  syncCount?: number;
256
257
  isGetting?: boolean;
258
+ isSetting?: boolean;
257
259
  numPendingGets?: number;
258
260
  numPendingSets?: number;
259
- isSetting?: boolean;
260
261
  clearPersist: () => Promise<void>;
261
262
  sync: () => Promise<void>;
262
263
  getPendingChanges: () => Record<string, {
@@ -279,4 +280,4 @@ interface RetryOptions {
279
280
  maxDelay?: number;
280
281
  }
281
282
 
282
- export { type ObservableBoolean as $, type ArrayValue as A, type ClassConstructor as B, type Change as C, type ObservableListenerDispose as D, type ObservableRoot as E, type NotPrimitive as F, type GetOptions as G, type NodeListener as H, type RootNodeInfo as I, type ChildNodeInfo as J, type SetParams as K, type LinkedOptions as L, type GetMode as M, type NodeInfo as N, type Observable as O, type Primitive as P, type UpdateFnParams as Q, type RecursiveValueOrFunction as R, type Selector as S, type TrackingType as T, type UpdateFn as U, type ObservableSyncStateBase as V, type WaitForSetFnParams as W, type ObservableState as X, type RetryOptions as Y, type RemoveObservables as Z, type ObservableObjectFns as _, type ObservableEvent as a, type ImmutableObservableBase as a0, type ObservableObject as a1, type ObserveEvent as b, type ObservableParam as c, type OpaqueObject as d, type TypeAtPath as e, type Linked as f, type ObservablePrimitive as g, type ObserveOptions as h, type ObserveEventCallback as i, type ObservableSyncState as j, type ListenerParams as k, type TrackingNode as l, clone as m, ensureNodeValue as n, findIDKey as o, getNode as p, getNodeValue as q, getPathType as r, safeParse as s, safeStringify as t, setNodeValue as u, type TrackingState as v, isObservable as w, type ListenerFn as x, type RecordValue as y, type ObservableValue as z };
283
+ export { type ObservableObjectFns as $, type ArrayValue as A, type ClassConstructor as B, type Change as C, type ObservableListenerDispose as D, type ObservableRoot as E, type NotPrimitive as F, type GetOptions as G, type NodeListener as H, type RootNodeInfo as I, type ChildNodeInfo as J, type SetParams as K, type LinkedOptions as L, type WaitForSetFnParams as M, type NodeInfo as N, type Observable as O, type Primitive as P, type GetMode as Q, type RecursiveValueOrFunction as R, type Selector as S, type TrackingType as T, type UpdateFn as U, type UpdateFnParams as V, type WaitForSet as W, type ObservableSyncStateBase as X, type ObservableState as Y, type RetryOptions as Z, type RemoveObservables as _, type ObservableEvent as a, type ObservableBoolean as a0, type ImmutableObservableBase as a1, type ObservableObject as a2, type ObserveEvent as b, type ObservableParam as c, type OpaqueObject as d, type TypeAtPath as e, type Linked as f, type ObservablePrimitive as g, type ObserveOptions as h, type ObserveEventCallback as i, type ObservableSyncState as j, type ListenerParams as k, type TrackingNode as l, clone as m, ensureNodeValue as n, findIDKey as o, getNode as p, getNodeValue as q, getPathType as r, safeParse as s, safeStringify as t, setNodeValue as u, type TrackingState as v, isObservable as w, type ListenerFn as x, type RecordValue as y, type ObservableValue as z };
@@ -224,11 +224,12 @@ interface ObserveEventCallback<T> {
224
224
  onCleanupReaction?: () => void;
225
225
  }
226
226
  type SetParams<T> = ListenerParams<T extends Promise<infer t> ? t : T>;
227
+ type WaitForSet<T> = ((params: WaitForSetFnParams<T>) => any) | Promise<any> | ObservableParam<any> | ObservableEvent | ObservableParam<any>[] | ObservableEvent[];
227
228
  interface LinkedOptions<T = any> {
228
229
  get?: () => Promise<T> | T;
229
230
  set?: (params: SetParams<T>) => void | Promise<any>;
230
231
  waitFor?: Selector<any>;
231
- waitForSet?: ((params: WaitForSetFnParams<T>) => any) | Promise<any> | ObservableParam<any> | ObservableEvent;
232
+ waitForSet?: WaitForSet<T>;
232
233
  initial?: (() => T) | T;
233
234
  activate?: 'auto' | 'lazy';
234
235
  }
@@ -254,9 +255,9 @@ interface ObservableSyncStateBase {
254
255
  lastSync?: number;
255
256
  syncCount?: number;
256
257
  isGetting?: boolean;
258
+ isSetting?: boolean;
257
259
  numPendingGets?: number;
258
260
  numPendingSets?: number;
259
- isSetting?: boolean;
260
261
  clearPersist: () => Promise<void>;
261
262
  sync: () => Promise<void>;
262
263
  getPendingChanges: () => Record<string, {
@@ -279,4 +280,4 @@ interface RetryOptions {
279
280
  maxDelay?: number;
280
281
  }
281
282
 
282
- export { type ObservableBoolean as $, type ArrayValue as A, type ClassConstructor as B, type Change as C, type ObservableListenerDispose as D, type ObservableRoot as E, type NotPrimitive as F, type GetOptions as G, type NodeListener as H, type RootNodeInfo as I, type ChildNodeInfo as J, type SetParams as K, type LinkedOptions as L, type GetMode as M, type NodeInfo as N, type Observable as O, type Primitive as P, type UpdateFnParams as Q, type RecursiveValueOrFunction as R, type Selector as S, type TrackingType as T, type UpdateFn as U, type ObservableSyncStateBase as V, type WaitForSetFnParams as W, type ObservableState as X, type RetryOptions as Y, type RemoveObservables as Z, type ObservableObjectFns as _, type ObservableEvent as a, type ImmutableObservableBase as a0, type ObservableObject as a1, type ObserveEvent as b, type ObservableParam as c, type OpaqueObject as d, type TypeAtPath as e, type Linked as f, type ObservablePrimitive as g, type ObserveOptions as h, type ObserveEventCallback as i, type ObservableSyncState as j, type ListenerParams as k, type TrackingNode as l, clone as m, ensureNodeValue as n, findIDKey as o, getNode as p, getNodeValue as q, getPathType as r, safeParse as s, safeStringify as t, setNodeValue as u, type TrackingState as v, isObservable as w, type ListenerFn as x, type RecordValue as y, type ObservableValue as z };
283
+ export { type ObservableObjectFns as $, type ArrayValue as A, type ClassConstructor as B, type Change as C, type ObservableListenerDispose as D, type ObservableRoot as E, type NotPrimitive as F, type GetOptions as G, type NodeListener as H, type RootNodeInfo as I, type ChildNodeInfo as J, type SetParams as K, type LinkedOptions as L, type WaitForSetFnParams as M, type NodeInfo as N, type Observable as O, type Primitive as P, type GetMode as Q, type RecursiveValueOrFunction as R, type Selector as S, type TrackingType as T, type UpdateFn as U, type UpdateFnParams as V, type WaitForSet as W, type ObservableSyncStateBase as X, type ObservableState as Y, type RetryOptions as Z, type RemoveObservables as _, type ObservableEvent as a, type ObservableBoolean as a0, type ImmutableObservableBase as a1, type ObservableObject as a2, type ObserveEvent as b, type ObservableParam as c, type OpaqueObject as d, type TypeAtPath as e, type Linked as f, type ObservablePrimitive as g, type ObserveOptions as h, type ObserveEventCallback as i, type ObservableSyncState as j, type ListenerParams as k, type TrackingNode as l, clone as m, ensureNodeValue as n, findIDKey as o, getNode as p, getNodeValue as q, getPathType as r, safeParse as s, safeStringify as t, setNodeValue as u, type TrackingState as v, isObservable as w, type ListenerFn as x, type RecordValue as y, type ObservableValue as z };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@legendapp/state",
3
- "version": "3.0.0-alpha.30",
3
+ "version": "3.0.0-alpha.31",
4
4
  "description": "legend-state",
5
5
  "sideEffects": false,
6
6
  "private": false,
@@ -1,3 +1,4 @@
1
+ import { WaitForSetFnParams, ObservableParam, ObservableEvent } from '@legendapp/state';
1
2
  import { SyncedGetParams, SyncedOptions, SyncedSetParams, SyncedSubscribeParams } from '@legendapp/state/sync';
2
3
 
3
4
  type CrudAsOption = 'Map' | 'object' | 'value' | 'array';
@@ -19,7 +20,10 @@ interface SyncedCrudOnSavedParams<TRemote extends object, TLocal> {
19
20
  isCreate: boolean;
20
21
  props: SyncedCrudPropsBase<TRemote, TLocal>;
21
22
  }
22
- interface SyncedCrudPropsBase<TRemote extends object, TLocal = TRemote> extends Omit<SyncedOptions<TRemote, TLocal>, 'get' | 'set' | 'initial' | 'subscribe'> {
23
+ interface WaitForSetCrudFnParams<T> extends WaitForSetFnParams<T> {
24
+ type: 'create' | 'update' | 'delete';
25
+ }
26
+ interface SyncedCrudPropsBase<TRemote extends object, TLocal = TRemote> extends Omit<SyncedOptions<TRemote, TLocal>, 'get' | 'set' | 'initial' | 'subscribe' | 'waitForSet'> {
23
27
  create?(input: TRemote, params: SyncedSetParams<TRemote>): Promise<CrudResult<TRemote> | null | undefined | void>;
24
28
  update?(input: Partial<TRemote>, params: SyncedSetParams<TRemote>): Promise<CrudResult<Partial<TRemote> | null | undefined | void>>;
25
29
  delete?(input: TRemote, params: SyncedSetParams<TRemote>): Promise<any>;
@@ -33,6 +37,7 @@ interface SyncedCrudPropsBase<TRemote extends object, TLocal = TRemote> extends
33
37
  changesSince?: 'all' | 'last-sync';
34
38
  generateId?: () => string | number;
35
39
  subscribe?: (params: SyncedSubscribeParams<TRemote[]>) => (() => void) | void;
40
+ waitForSet?: ((params: WaitForSetCrudFnParams<TLocal>) => any) | Promise<any> | ObservableParam<any> | ObservableEvent;
36
41
  }
37
42
  type InitialValue<TLocal, TAsOption extends CrudAsOption> = TAsOption extends 'Map' ? Map<string | number, TLocal> : TAsOption extends 'object' ? Record<string | number, TLocal> : TAsOption extends 'value' ? TLocal : TLocal[];
38
43
  type SyncedCrudReturnType<TLocal, TAsOption extends CrudAsOption> = TAsOption extends 'Map' ? Map<TLocal extends {
@@ -43,4 +48,4 @@ type SyncedCrudReturnType<TLocal, TAsOption extends CrudAsOption> = TAsOption ex
43
48
  declare function syncedCrud<TRemote extends object, TLocal = TRemote>(props: SyncedCrudPropsBase<TRemote, TLocal> & SyncedCrudPropsSingle<TRemote, TLocal>): SyncedCrudReturnType<TLocal, 'value'>;
44
49
  declare function syncedCrud<TRemote extends object, TLocal = TRemote, TAsOption extends CrudAsOption = 'object'>(props: SyncedCrudPropsBase<TRemote, TLocal> & SyncedCrudPropsMany<TRemote, TLocal, TAsOption>): SyncedCrudReturnType<TLocal, Exclude<TAsOption, 'value'>>;
45
50
 
46
- export { type CrudAsOption, type CrudResult, type SyncedCrudOnSavedParams, type SyncedCrudPropsBase, type SyncedCrudPropsMany, type SyncedCrudPropsSingle, type SyncedCrudReturnType, syncedCrud };
51
+ export { type CrudAsOption, type CrudResult, type SyncedCrudOnSavedParams, type SyncedCrudPropsBase, type SyncedCrudPropsMany, type SyncedCrudPropsSingle, type SyncedCrudReturnType, type WaitForSetCrudFnParams, syncedCrud };
@@ -1,3 +1,4 @@
1
+ import { WaitForSetFnParams, ObservableParam, ObservableEvent } from '@legendapp/state';
1
2
  import { SyncedGetParams, SyncedOptions, SyncedSetParams, SyncedSubscribeParams } from '@legendapp/state/sync';
2
3
 
3
4
  type CrudAsOption = 'Map' | 'object' | 'value' | 'array';
@@ -19,7 +20,10 @@ interface SyncedCrudOnSavedParams<TRemote extends object, TLocal> {
19
20
  isCreate: boolean;
20
21
  props: SyncedCrudPropsBase<TRemote, TLocal>;
21
22
  }
22
- interface SyncedCrudPropsBase<TRemote extends object, TLocal = TRemote> extends Omit<SyncedOptions<TRemote, TLocal>, 'get' | 'set' | 'initial' | 'subscribe'> {
23
+ interface WaitForSetCrudFnParams<T> extends WaitForSetFnParams<T> {
24
+ type: 'create' | 'update' | 'delete';
25
+ }
26
+ interface SyncedCrudPropsBase<TRemote extends object, TLocal = TRemote> extends Omit<SyncedOptions<TRemote, TLocal>, 'get' | 'set' | 'initial' | 'subscribe' | 'waitForSet'> {
23
27
  create?(input: TRemote, params: SyncedSetParams<TRemote>): Promise<CrudResult<TRemote> | null | undefined | void>;
24
28
  update?(input: Partial<TRemote>, params: SyncedSetParams<TRemote>): Promise<CrudResult<Partial<TRemote> | null | undefined | void>>;
25
29
  delete?(input: TRemote, params: SyncedSetParams<TRemote>): Promise<any>;
@@ -33,6 +37,7 @@ interface SyncedCrudPropsBase<TRemote extends object, TLocal = TRemote> extends
33
37
  changesSince?: 'all' | 'last-sync';
34
38
  generateId?: () => string | number;
35
39
  subscribe?: (params: SyncedSubscribeParams<TRemote[]>) => (() => void) | void;
40
+ waitForSet?: ((params: WaitForSetCrudFnParams<TLocal>) => any) | Promise<any> | ObservableParam<any> | ObservableEvent;
36
41
  }
37
42
  type InitialValue<TLocal, TAsOption extends CrudAsOption> = TAsOption extends 'Map' ? Map<string | number, TLocal> : TAsOption extends 'object' ? Record<string | number, TLocal> : TAsOption extends 'value' ? TLocal : TLocal[];
38
43
  type SyncedCrudReturnType<TLocal, TAsOption extends CrudAsOption> = TAsOption extends 'Map' ? Map<TLocal extends {
@@ -43,4 +48,4 @@ type SyncedCrudReturnType<TLocal, TAsOption extends CrudAsOption> = TAsOption ex
43
48
  declare function syncedCrud<TRemote extends object, TLocal = TRemote>(props: SyncedCrudPropsBase<TRemote, TLocal> & SyncedCrudPropsSingle<TRemote, TLocal>): SyncedCrudReturnType<TLocal, 'value'>;
44
49
  declare function syncedCrud<TRemote extends object, TLocal = TRemote, TAsOption extends CrudAsOption = 'object'>(props: SyncedCrudPropsBase<TRemote, TLocal> & SyncedCrudPropsMany<TRemote, TLocal, TAsOption>): SyncedCrudReturnType<TLocal, Exclude<TAsOption, 'value'>>;
45
50
 
46
- export { type CrudAsOption, type CrudResult, type SyncedCrudOnSavedParams, type SyncedCrudPropsBase, type SyncedCrudPropsMany, type SyncedCrudPropsSingle, type SyncedCrudReturnType, syncedCrud };
51
+ export { type CrudAsOption, type CrudResult, type SyncedCrudOnSavedParams, type SyncedCrudPropsBase, type SyncedCrudPropsMany, type SyncedCrudPropsSingle, type SyncedCrudReturnType, type WaitForSetCrudFnParams, syncedCrud };
@@ -5,6 +5,7 @@ var sync = require('@legendapp/state/sync');
5
5
 
6
6
  // src/sync-plugins/crud.ts
7
7
  var { clone } = state.internal;
8
+ var { waitForSet } = sync.internal;
8
9
  function transformOut(data, transform) {
9
10
  return transform ? transform(clone(data)) : data;
10
11
  }
@@ -43,9 +44,11 @@ function syncedCrud(props) {
43
44
  mode: modeParam,
44
45
  changesSince,
45
46
  generateId,
47
+ waitForSet: waitForSetParam,
46
48
  ...rest
47
49
  } = props;
48
50
  const fieldId = fieldIdProp || "id";
51
+ const pendingCreates = /* @__PURE__ */ new Set();
49
52
  let asType = props.as;
50
53
  if (!asType) {
51
54
  asType = getFn ? "value" : "object";
@@ -154,13 +157,20 @@ function syncedCrud(props) {
154
157
  if (asType === "value") {
155
158
  if (value) {
156
159
  let id = value == null ? void 0 : value[fieldId];
157
- const isCreate = fieldCreatedAt ? !value[fieldCreatedAt] : !prevAtPath;
160
+ let isCreate = fieldCreatedAt ? !value[fieldCreatedAt] : !prevAtPath;
158
161
  if (!id && generateId) {
159
162
  id = ensureId(value, fieldId, generateId);
160
163
  }
161
164
  if (id) {
165
+ if (pendingCreates.has(id)) {
166
+ isCreate = false;
167
+ }
162
168
  if (isCreate || retryAsCreate) {
163
- creates.set(id, value);
169
+ if (createFn) {
170
+ creates.set(id, value);
171
+ } else {
172
+ console.log("[legend-state] missing create function");
173
+ }
164
174
  } else if (path.length === 0) {
165
175
  if (valueAtPath) {
166
176
  updates.set(id, getUpdateValue(valueAtPath, prevAtPath));
@@ -217,7 +227,7 @@ function syncedCrud(props) {
217
227
  }
218
228
  }
219
229
  itemsChanged == null ? void 0 : itemsChanged.forEach(([item, prev]) => {
220
- const isCreate = fieldCreatedAt ? !item[fieldCreatedAt] && !(prev == null ? void 0 : prev[fieldCreatedAt]) : fieldUpdatedAt ? !item[fieldUpdatedAt] && !(prev == null ? void 0 : prev[fieldCreatedAt]) : state.isNullOrUndefined(prev);
230
+ const isCreate = !pendingCreates.has(item.id) && (fieldCreatedAt ? !item[fieldCreatedAt] && !(prev == null ? void 0 : prev[fieldCreatedAt]) : fieldUpdatedAt ? !item[fieldUpdatedAt] && !(prev == null ? void 0 : prev[fieldCreatedAt]) : state.isNullOrUndefined(prev));
221
231
  if (isCreate) {
222
232
  if (generateId) {
223
233
  ensureId(item, fieldId, generateId);
@@ -226,6 +236,7 @@ function syncedCrud(props) {
226
236
  console.error("[legend-state]: added item without an id");
227
237
  }
228
238
  if (createFn) {
239
+ pendingCreates.add(item.id);
229
240
  creates.set(item.id, item);
230
241
  } else {
231
242
  console.log("[legend-state] missing create function");
@@ -289,12 +300,20 @@ function syncedCrud(props) {
289
300
  };
290
301
  return Promise.all([
291
302
  ...Array.from(creates).map(async ([itemKey, itemValue]) => {
303
+ if (waitForSetParam) {
304
+ await waitForSet(waitForSetParam, changes, itemValue, { type: "create" });
305
+ }
292
306
  const createObj = await transformOut(itemValue, transform == null ? void 0 : transform.save);
293
- return createFn(createObj, params).then(
294
- (result) => saveResult(itemKey, createObj, result, true)
295
- );
307
+ return createFn(createObj, params).then((result) => {
308
+ return saveResult(itemKey, createObj, result, true);
309
+ }).finally(() => {
310
+ pendingCreates.delete(itemKey);
311
+ });
296
312
  }),
297
313
  ...Array.from(updates).map(async ([itemKey, itemValue]) => {
314
+ if (waitForSetParam) {
315
+ await waitForSet(waitForSetParam, changes, itemValue, { type: "update" });
316
+ }
298
317
  const toSave = itemValue;
299
318
  const changed = await transformOut(toSave, transform == null ? void 0 : transform.save);
300
319
  if (Object.keys(changed).length > 0) {
@@ -303,8 +322,11 @@ function syncedCrud(props) {
303
322
  );
304
323
  }
305
324
  }),
306
- ...Array.from(deletes).map((valuePrevious) => {
325
+ ...Array.from(deletes).map(async (valuePrevious) => {
307
326
  if (valuePrevious !== state.symbolDelete) {
327
+ if (waitForSetParam) {
328
+ await waitForSet(waitForSetParam, changes, valuePrevious, { type: "delete" });
329
+ }
308
330
  if (deleteFn) {
309
331
  deleteFn(valuePrevious, params);
310
332
  } else if (fieldDeleted && updateFn) {
@@ -1,8 +1,9 @@
1
1
  import { isPromise, applyChanges, isNullOrUndefined, setAtPath, symbolDelete, isArray, internal, isObservable, getNodeValue } from '@legendapp/state';
2
- import { synced, deepEqual, diffObjects } from '@legendapp/state/sync';
2
+ import { synced, deepEqual, internal as internal$1, diffObjects } from '@legendapp/state/sync';
3
3
 
4
4
  // src/sync-plugins/crud.ts
5
5
  var { clone } = internal;
6
+ var { waitForSet } = internal$1;
6
7
  function transformOut(data, transform) {
7
8
  return transform ? transform(clone(data)) : data;
8
9
  }
@@ -41,9 +42,11 @@ function syncedCrud(props) {
41
42
  mode: modeParam,
42
43
  changesSince,
43
44
  generateId,
45
+ waitForSet: waitForSetParam,
44
46
  ...rest
45
47
  } = props;
46
48
  const fieldId = fieldIdProp || "id";
49
+ const pendingCreates = /* @__PURE__ */ new Set();
47
50
  let asType = props.as;
48
51
  if (!asType) {
49
52
  asType = getFn ? "value" : "object";
@@ -152,13 +155,20 @@ function syncedCrud(props) {
152
155
  if (asType === "value") {
153
156
  if (value) {
154
157
  let id = value == null ? void 0 : value[fieldId];
155
- const isCreate = fieldCreatedAt ? !value[fieldCreatedAt] : !prevAtPath;
158
+ let isCreate = fieldCreatedAt ? !value[fieldCreatedAt] : !prevAtPath;
156
159
  if (!id && generateId) {
157
160
  id = ensureId(value, fieldId, generateId);
158
161
  }
159
162
  if (id) {
163
+ if (pendingCreates.has(id)) {
164
+ isCreate = false;
165
+ }
160
166
  if (isCreate || retryAsCreate) {
161
- creates.set(id, value);
167
+ if (createFn) {
168
+ creates.set(id, value);
169
+ } else {
170
+ console.log("[legend-state] missing create function");
171
+ }
162
172
  } else if (path.length === 0) {
163
173
  if (valueAtPath) {
164
174
  updates.set(id, getUpdateValue(valueAtPath, prevAtPath));
@@ -215,7 +225,7 @@ function syncedCrud(props) {
215
225
  }
216
226
  }
217
227
  itemsChanged == null ? void 0 : itemsChanged.forEach(([item, prev]) => {
218
- const isCreate = fieldCreatedAt ? !item[fieldCreatedAt] && !(prev == null ? void 0 : prev[fieldCreatedAt]) : fieldUpdatedAt ? !item[fieldUpdatedAt] && !(prev == null ? void 0 : prev[fieldCreatedAt]) : isNullOrUndefined(prev);
228
+ const isCreate = !pendingCreates.has(item.id) && (fieldCreatedAt ? !item[fieldCreatedAt] && !(prev == null ? void 0 : prev[fieldCreatedAt]) : fieldUpdatedAt ? !item[fieldUpdatedAt] && !(prev == null ? void 0 : prev[fieldCreatedAt]) : isNullOrUndefined(prev));
219
229
  if (isCreate) {
220
230
  if (generateId) {
221
231
  ensureId(item, fieldId, generateId);
@@ -224,6 +234,7 @@ function syncedCrud(props) {
224
234
  console.error("[legend-state]: added item without an id");
225
235
  }
226
236
  if (createFn) {
237
+ pendingCreates.add(item.id);
227
238
  creates.set(item.id, item);
228
239
  } else {
229
240
  console.log("[legend-state] missing create function");
@@ -287,12 +298,20 @@ function syncedCrud(props) {
287
298
  };
288
299
  return Promise.all([
289
300
  ...Array.from(creates).map(async ([itemKey, itemValue]) => {
301
+ if (waitForSetParam) {
302
+ await waitForSet(waitForSetParam, changes, itemValue, { type: "create" });
303
+ }
290
304
  const createObj = await transformOut(itemValue, transform == null ? void 0 : transform.save);
291
- return createFn(createObj, params).then(
292
- (result) => saveResult(itemKey, createObj, result, true)
293
- );
305
+ return createFn(createObj, params).then((result) => {
306
+ return saveResult(itemKey, createObj, result, true);
307
+ }).finally(() => {
308
+ pendingCreates.delete(itemKey);
309
+ });
294
310
  }),
295
311
  ...Array.from(updates).map(async ([itemKey, itemValue]) => {
312
+ if (waitForSetParam) {
313
+ await waitForSet(waitForSetParam, changes, itemValue, { type: "update" });
314
+ }
296
315
  const toSave = itemValue;
297
316
  const changed = await transformOut(toSave, transform == null ? void 0 : transform.save);
298
317
  if (Object.keys(changed).length > 0) {
@@ -301,8 +320,11 @@ function syncedCrud(props) {
301
320
  );
302
321
  }
303
322
  }),
304
- ...Array.from(deletes).map((valuePrevious) => {
323
+ ...Array.from(deletes).map(async (valuePrevious) => {
305
324
  if (valuePrevious !== symbolDelete) {
325
+ if (waitForSetParam) {
326
+ await waitForSet(waitForSetParam, changes, valuePrevious, { type: "delete" });
327
+ }
306
328
  if (deleteFn) {
307
329
  deleteFn(valuePrevious, params);
308
330
  } else if (fieldDeleted && updateFn) {
@@ -2,8 +2,9 @@ import { FieldTransforms } from '@legendapp/state/sync';
2
2
  export { FieldTransforms } from '@legendapp/state/sync';
3
3
  import { CrudAsOption, SyncedCrudPropsMany, SyncedCrudPropsBase, SyncedCrudReturnType } from '@legendapp/state/sync-plugins/crud';
4
4
  import { DatabaseReference, Query } from 'firebase/database';
5
- export { invertFieldMap, transformObjectFields } from './_transformObjectFields.mjs';
6
- import '@legendapp/state';
5
+
6
+ declare function transformObjectFields(dataIn: Record<string, any>, map: Record<string, any>): any;
7
+ declare function invertFieldMap(obj: Record<string, any>): any;
7
8
 
8
9
  interface SyncedFirebaseProps<TRemote extends object, TLocal, TAs extends CrudAsOption = 'value'> extends Omit<SyncedCrudPropsMany<TRemote, TLocal, TAs>, 'list' | 'retry'>, SyncedCrudPropsBase<TRemote, TLocal> {
9
10
  refPath: (uid: string | undefined) => string;
@@ -23,4 +24,4 @@ interface SyncedFirebaseConfiguration {
23
24
  declare function configureSyncedFirebase(config: SyncedFirebaseConfiguration): void;
24
25
  declare function syncedFirebase<TRemote extends object, TLocal = TRemote, TAs extends CrudAsOption = 'object'>(props: SyncedFirebaseProps<TRemote, TLocal, TAs>): SyncedCrudReturnType<TLocal, TAs>;
25
26
 
26
- export { type SyncedFirebaseProps, configureSyncedFirebase, syncedFirebase };
27
+ export { type SyncedFirebaseProps, configureSyncedFirebase, invertFieldMap, syncedFirebase, transformObjectFields };
@@ -2,8 +2,9 @@ import { FieldTransforms } from '@legendapp/state/sync';
2
2
  export { FieldTransforms } from '@legendapp/state/sync';
3
3
  import { CrudAsOption, SyncedCrudPropsMany, SyncedCrudPropsBase, SyncedCrudReturnType } from '@legendapp/state/sync-plugins/crud';
4
4
  import { DatabaseReference, Query } from 'firebase/database';
5
- export { invertFieldMap, transformObjectFields } from './_transformObjectFields.js';
6
- import '@legendapp/state';
5
+
6
+ declare function transformObjectFields(dataIn: Record<string, any>, map: Record<string, any>): any;
7
+ declare function invertFieldMap(obj: Record<string, any>): any;
7
8
 
8
9
  interface SyncedFirebaseProps<TRemote extends object, TLocal, TAs extends CrudAsOption = 'value'> extends Omit<SyncedCrudPropsMany<TRemote, TLocal, TAs>, 'list' | 'retry'>, SyncedCrudPropsBase<TRemote, TLocal> {
9
10
  refPath: (uid: string | undefined) => string;
@@ -23,4 +24,4 @@ interface SyncedFirebaseConfiguration {
23
24
  declare function configureSyncedFirebase(config: SyncedFirebaseConfiguration): void;
24
25
  declare function syncedFirebase<TRemote extends object, TLocal = TRemote, TAs extends CrudAsOption = 'object'>(props: SyncedFirebaseProps<TRemote, TLocal, TAs>): SyncedCrudReturnType<TLocal, TAs>;
25
26
 
26
- export { type SyncedFirebaseProps, configureSyncedFirebase, syncedFirebase };
27
+ export { type SyncedFirebaseProps, configureSyncedFirebase, invertFieldMap, syncedFirebase, transformObjectFields };
@@ -1,16 +1,15 @@
1
1
  'use strict';
2
2
 
3
- var ksuid = require('ksuid');
4
3
  var state = require('@legendapp/state');
5
4
  var sync = require('@legendapp/state/sync');
6
5
  var crud = require('@legendapp/state/sync-plugins/crud');
6
+ var ksuid = require('ksuid');
7
7
 
8
8
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
9
9
 
10
10
  var ksuid__default = /*#__PURE__*/_interopDefault(ksuid);
11
11
 
12
12
  // src/sync-plugins/keel.ts
13
- var { clone } = state.internal;
14
13
  var KeelKeys = ["createdAt", "updatedAt"];
15
14
  function generateKeelId() {
16
15
  return ksuid__default.default.randomSync().string;
@@ -36,17 +35,20 @@ async function handleApiError(error, retry) {
36
35
  }
37
36
  }
38
37
  function convertObjectToCreate(item) {
39
- const cloned = clone(item);
40
- Object.keys(cloned).forEach((key) => {
38
+ const cloned = {};
39
+ Object.keys(item).forEach((key) => {
41
40
  if (key.endsWith("Id")) {
42
- if (cloned[key]) {
43
- cloned[key.slice(0, -2)] = { id: cloned[key] };
41
+ if (item[key]) {
42
+ cloned[key.slice(0, -2)] = { id: item[key] };
43
+ }
44
+ } else if (key !== "createdAt" && key !== "updatedAt") {
45
+ if (item[key] === void 0) {
46
+ cloned[key] = null;
47
+ } else {
48
+ cloned[key] = item[key];
44
49
  }
45
- delete cloned[key];
46
50
  }
47
51
  });
48
- delete cloned.createdAt;
49
- delete cloned.updatedAt;
50
52
  return cloned;
51
53
  }
52
54
  function getSyncedKeelConfiguration() {
@@ -227,8 +229,6 @@ function syncedKeel(props) {
227
229
  const id = input.id;
228
230
  const values = convertObjectToCreate(input);
229
231
  delete values.id;
230
- delete values.createdAt;
231
- delete values.updatedAt;
232
232
  if (!state.isEmpty(values)) {
233
233
  const { data, error } = await updateParam({ where: { id }, values });
234
234
  if (error) {
@@ -1,10 +1,9 @@
1
- import ksuid from 'ksuid';
2
- import { observable, computeSelector, isFunction, isEmpty, when, internal } from '@legendapp/state';
1
+ import { observable, computeSelector, isFunction, isEmpty, when } from '@legendapp/state';
3
2
  import { removeNullUndefined } from '@legendapp/state/sync';
4
3
  import { syncedCrud } from '@legendapp/state/sync-plugins/crud';
4
+ import ksuid from 'ksuid';
5
5
 
6
6
  // src/sync-plugins/keel.ts
7
- var { clone } = internal;
8
7
  var KeelKeys = ["createdAt", "updatedAt"];
9
8
  function generateKeelId() {
10
9
  return ksuid.randomSync().string;
@@ -30,17 +29,20 @@ async function handleApiError(error, retry) {
30
29
  }
31
30
  }
32
31
  function convertObjectToCreate(item) {
33
- const cloned = clone(item);
34
- Object.keys(cloned).forEach((key) => {
32
+ const cloned = {};
33
+ Object.keys(item).forEach((key) => {
35
34
  if (key.endsWith("Id")) {
36
- if (cloned[key]) {
37
- cloned[key.slice(0, -2)] = { id: cloned[key] };
35
+ if (item[key]) {
36
+ cloned[key.slice(0, -2)] = { id: item[key] };
37
+ }
38
+ } else if (key !== "createdAt" && key !== "updatedAt") {
39
+ if (item[key] === void 0) {
40
+ cloned[key] = null;
41
+ } else {
42
+ cloned[key] = item[key];
38
43
  }
39
- delete cloned[key];
40
44
  }
41
45
  });
42
- delete cloned.createdAt;
43
- delete cloned.updatedAt;
44
46
  return cloned;
45
47
  }
46
48
  function getSyncedKeelConfiguration() {
@@ -221,8 +223,6 @@ function syncedKeel(props) {
221
223
  const id = input.id;
222
224
  const values = convertObjectToCreate(input);
223
225
  delete values.id;
224
- delete values.createdAt;
225
- delete values.updatedAt;
226
226
  if (!isEmpty(values)) {
227
227
  const { data, error } = await updateParam({ where: { id }, values });
228
228
  if (error) {
package/sync.d.mts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { MMKVConfiguration } from 'react-native-mmkv';
2
2
  import { AsyncStorageStatic } from '@react-native-async-storage/async-storage';
3
- import { ClassConstructor, NodeInfo, ObservableParam, GetMode, SetParams, UpdateFn, LinkedOptions, RetryOptions, Change, Observable, ObservableSyncState, TypeAtPath, RecordValue, ArrayValue } from '@legendapp/state';
3
+ import { ClassConstructor, NodeInfo, ObservableParam, GetMode, SetParams, UpdateFn, LinkedOptions, RetryOptions, Change, Observable, ObservableSyncState, TypeAtPath, RecordValue, ArrayValue, WaitForSet } from '@legendapp/state';
4
4
  import { SyncedOptionsGlobal as SyncedOptionsGlobal$1 } from '@legendapp/state/sync';
5
5
 
6
6
  interface PersistOptions<T = any> {
@@ -215,8 +215,11 @@ type RetType = typeof synced;
215
215
  declare function configureSynced<T extends typeof synced>(fn: T, origOptions: SyncedOptionsConfigure): T;
216
216
  declare function configureSynced(origOptions: SyncedOptionsConfigure): RetType;
217
217
 
218
+ declare function waitForSet(waitForSet: WaitForSet<any>, changes: Change[], value: any, params?: Record<string, any>): Promise<void>;
219
+
218
220
  declare const internal: {
219
221
  observableSyncConfiguration: SyncedOptionsGlobal;
222
+ waitForSet: typeof waitForSet;
220
223
  };
221
224
 
222
225
  export { type FieldTransforms, type FieldTransformsInner, type ObservablePersistAsyncStoragePluginOptions, type ObservablePersistIndexedDBPluginOptions, type ObservablePersistPlugin, type ObservablePersistPluginOptions, type ObservableSyncFunctions, type ObservableSyncSetParams, type OnErrorRetryParams, type PendingChanges, type PersistMetadata, type PersistOptions, type QueryByModified, type StringToDate, type SubscribeOptions, type SyncTransform, type SyncTransformMethod, type Synced, type SyncedErrorParams, type SyncedGetParams, type SyncedGetSetBaseParams, type SyncedGetSetSubscribeBaseParams, type SyncedOptions, type SyncedOptionsGlobal, type SyncedSetParams, type SyncedSubscribeParams, type TransformStringifyKeys, type TransformStringifyOptions, type TransformStringsToDates, combineTransforms, configureObservableSync, configureSynced, deepEqual, diffObjects, internal, mapSyncPlugins, onChangeRemote, removeNullUndefined, syncObservable, synced, transformStringifyDates, transformStringifyKeys };
package/sync.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { MMKVConfiguration } from 'react-native-mmkv';
2
2
  import { AsyncStorageStatic } from '@react-native-async-storage/async-storage';
3
- import { ClassConstructor, NodeInfo, ObservableParam, GetMode, SetParams, UpdateFn, LinkedOptions, RetryOptions, Change, Observable, ObservableSyncState, TypeAtPath, RecordValue, ArrayValue } from '@legendapp/state';
3
+ import { ClassConstructor, NodeInfo, ObservableParam, GetMode, SetParams, UpdateFn, LinkedOptions, RetryOptions, Change, Observable, ObservableSyncState, TypeAtPath, RecordValue, ArrayValue, WaitForSet } from '@legendapp/state';
4
4
  import { SyncedOptionsGlobal as SyncedOptionsGlobal$1 } from '@legendapp/state/sync';
5
5
 
6
6
  interface PersistOptions<T = any> {
@@ -215,8 +215,11 @@ type RetType = typeof synced;
215
215
  declare function configureSynced<T extends typeof synced>(fn: T, origOptions: SyncedOptionsConfigure): T;
216
216
  declare function configureSynced(origOptions: SyncedOptionsConfigure): RetType;
217
217
 
218
+ declare function waitForSet(waitForSet: WaitForSet<any>, changes: Change[], value: any, params?: Record<string, any>): Promise<void>;
219
+
218
220
  declare const internal: {
219
221
  observableSyncConfiguration: SyncedOptionsGlobal;
222
+ waitForSet: typeof waitForSet;
220
223
  };
221
224
 
222
225
  export { type FieldTransforms, type FieldTransformsInner, type ObservablePersistAsyncStoragePluginOptions, type ObservablePersistIndexedDBPluginOptions, type ObservablePersistPlugin, type ObservablePersistPluginOptions, type ObservableSyncFunctions, type ObservableSyncSetParams, type OnErrorRetryParams, type PendingChanges, type PersistMetadata, type PersistOptions, type QueryByModified, type StringToDate, type SubscribeOptions, type SyncTransform, type SyncTransformMethod, type Synced, type SyncedErrorParams, type SyncedGetParams, type SyncedGetSetBaseParams, type SyncedGetSetSubscribeBaseParams, type SyncedOptions, type SyncedOptionsGlobal, type SyncedSetParams, type SyncedSubscribeParams, type TransformStringifyKeys, type TransformStringifyOptions, type TransformStringsToDates, combineTransforms, configureObservableSync, configureSynced, deepEqual, diffObjects, internal, mapSyncPlugins, onChangeRemote, removeNullUndefined, syncObservable, synced, transformStringifyDates, transformStringifyKeys };
package/sync.js CHANGED
@@ -200,6 +200,12 @@ function runWithRetry(state, retryOptions, fn, onError) {
200
200
  }
201
201
  return value;
202
202
  }
203
+ async function waitForSet(waitForSet2, changes, value, params = {}) {
204
+ const waitFn = state.isFunction(waitForSet2) ? waitForSet2({ changes, value, ...params }) : waitForSet2;
205
+ if (waitFn) {
206
+ await state.when(waitFn);
207
+ }
208
+ }
203
209
 
204
210
  // src/sync/syncObservable.ts
205
211
  var { clone, deepMerge, getNode, getNodeValue, getValueAtPath, globalState, symbolLinked, createPreviousHandler } = state.internal;
@@ -549,7 +555,7 @@ async function doChangeRemote(changeInfo) {
549
555
  const state$ = node.state;
550
556
  const persist = syncOptions.persist;
551
557
  const { table, config: configLocal } = parseLocalConfig(persist);
552
- const { onBeforeSet, waitForSet, onAfterSet } = syncOptions || {};
558
+ const { onBeforeSet, waitForSet: waitForSetParam, onAfterSet } = syncOptions || {};
553
559
  const shouldSaveMetadata = persist == null ? void 0 : persist.retrySync;
554
560
  const saveLocal = !!(persist == null ? void 0 : persist.name);
555
561
  if (changesRemote.length > 0) {
@@ -567,11 +573,8 @@ async function doChangeRemote(changeInfo) {
567
573
  });
568
574
  }
569
575
  }
570
- if (waitForSet) {
571
- const waitFn = state.isFunction(waitForSet) ? waitForSet({ changes: changesRemote, value: obs$.peek() }) : waitForSet;
572
- if (waitFn) {
573
- await state.when(waitFn);
574
- }
576
+ if (waitForSetParam) {
577
+ await waitForSet(waitForSetParam, changesRemote, obs$.peek());
575
578
  }
576
579
  let value = clone(obs$.peek());
577
580
  const transformSave = (_a = syncOptions == null ? void 0 : syncOptions.transform) == null ? void 0 : _a.save;
@@ -1061,9 +1064,21 @@ function syncObservable(obs$, syncOptionsOrSynced) {
1061
1064
  var _a;
1062
1065
  const wasPersistEnabled = syncStateValue.isPersistEnabled;
1063
1066
  const wasSyncEnabled = syncStateValue.isSyncEnabled;
1064
- syncStateValue.isPersistEnabled = false;
1065
- syncStateValue.isSyncEnabled = false;
1066
- syncStateValue.syncCount = 0;
1067
+ const metadata = metadatas.get(obs$);
1068
+ if (metadata) {
1069
+ Object.assign(metadata, { lastSync: void 0, pending: void 0 });
1070
+ }
1071
+ Object.assign(syncStateValue, {
1072
+ isPersistEnabled: false,
1073
+ isSyncEnabled: false,
1074
+ lastSync: void 0,
1075
+ numPendingGets: 0,
1076
+ isLoaded: false,
1077
+ isGetting: false,
1078
+ isSetting: false,
1079
+ numPendingSets: 0,
1080
+ syncCount: 0
1081
+ });
1067
1082
  isSynced = false;
1068
1083
  isSubscribed = false;
1069
1084
  unsubscribe == null ? void 0 : unsubscribe();
@@ -1172,7 +1187,8 @@ function configureSynced(fnOrOrigOptions, origOptions) {
1172
1187
 
1173
1188
  // sync.ts
1174
1189
  var internal4 = {
1175
- observableSyncConfiguration
1190
+ observableSyncConfiguration,
1191
+ waitForSet
1176
1192
  };
1177
1193
 
1178
1194
  exports.combineTransforms = combineTransforms;
package/sync.mjs CHANGED
@@ -198,6 +198,12 @@ function runWithRetry(state, retryOptions, fn, onError) {
198
198
  }
199
199
  return value;
200
200
  }
201
+ async function waitForSet(waitForSet2, changes, value, params = {}) {
202
+ const waitFn = isFunction(waitForSet2) ? waitForSet2({ changes, value, ...params }) : waitForSet2;
203
+ if (waitFn) {
204
+ await when(waitFn);
205
+ }
206
+ }
201
207
 
202
208
  // src/sync/syncObservable.ts
203
209
  var { clone, deepMerge, getNode, getNodeValue, getValueAtPath, globalState, symbolLinked, createPreviousHandler } = internal;
@@ -547,7 +553,7 @@ async function doChangeRemote(changeInfo) {
547
553
  const state$ = node.state;
548
554
  const persist = syncOptions.persist;
549
555
  const { table, config: configLocal } = parseLocalConfig(persist);
550
- const { onBeforeSet, waitForSet, onAfterSet } = syncOptions || {};
556
+ const { onBeforeSet, waitForSet: waitForSetParam, onAfterSet } = syncOptions || {};
551
557
  const shouldSaveMetadata = persist == null ? void 0 : persist.retrySync;
552
558
  const saveLocal = !!(persist == null ? void 0 : persist.name);
553
559
  if (changesRemote.length > 0) {
@@ -565,11 +571,8 @@ async function doChangeRemote(changeInfo) {
565
571
  });
566
572
  }
567
573
  }
568
- if (waitForSet) {
569
- const waitFn = isFunction(waitForSet) ? waitForSet({ changes: changesRemote, value: obs$.peek() }) : waitForSet;
570
- if (waitFn) {
571
- await when(waitFn);
572
- }
574
+ if (waitForSetParam) {
575
+ await waitForSet(waitForSetParam, changesRemote, obs$.peek());
573
576
  }
574
577
  let value = clone(obs$.peek());
575
578
  const transformSave = (_a = syncOptions == null ? void 0 : syncOptions.transform) == null ? void 0 : _a.save;
@@ -1059,9 +1062,21 @@ function syncObservable(obs$, syncOptionsOrSynced) {
1059
1062
  var _a;
1060
1063
  const wasPersistEnabled = syncStateValue.isPersistEnabled;
1061
1064
  const wasSyncEnabled = syncStateValue.isSyncEnabled;
1062
- syncStateValue.isPersistEnabled = false;
1063
- syncStateValue.isSyncEnabled = false;
1064
- syncStateValue.syncCount = 0;
1065
+ const metadata = metadatas.get(obs$);
1066
+ if (metadata) {
1067
+ Object.assign(metadata, { lastSync: void 0, pending: void 0 });
1068
+ }
1069
+ Object.assign(syncStateValue, {
1070
+ isPersistEnabled: false,
1071
+ isSyncEnabled: false,
1072
+ lastSync: void 0,
1073
+ numPendingGets: 0,
1074
+ isLoaded: false,
1075
+ isGetting: false,
1076
+ isSetting: false,
1077
+ numPendingSets: 0,
1078
+ syncCount: 0
1079
+ });
1065
1080
  isSynced = false;
1066
1081
  isSubscribed = false;
1067
1082
  unsubscribe == null ? void 0 : unsubscribe();
@@ -1170,7 +1185,8 @@ function configureSynced(fnOrOrigOptions, origOptions) {
1170
1185
 
1171
1186
  // sync.ts
1172
1187
  var internal4 = {
1173
- observableSyncConfiguration
1188
+ observableSyncConfiguration,
1189
+ waitForSet
1174
1190
  };
1175
1191
 
1176
1192
  export { combineTransforms, configureObservableSync, configureSynced, deepEqual, diffObjects, internal4 as internal, mapSyncPlugins, onChangeRemote, removeNullUndefined, syncObservable, synced, transformStringifyDates, transformStringifyKeys };
@@ -1,31 +0,0 @@
1
- import { RecordValue, ArrayValue } from '@legendapp/state';
2
- import { SyncTransform } from '@legendapp/state/sync';
3
-
4
- declare function transformObjectFields(dataIn: Record<string, any>, map: Record<string, any>): any;
5
- declare function invertFieldMap(obj: Record<string, any>): any;
6
- declare const fieldTransformToTransform: <T extends object>(fieldTransform: FieldTransforms<T>) => SyncTransform<T>;
7
- declare type FieldTransforms<T> = (T extends Record<string, Record<string, any>> ? {
8
- _dict: FieldTransformsInner<RecordValue<T>>;
9
- } : never) | FieldTransformsInner<T>;
10
- declare type FieldTransformsInner<T> = {
11
- [K in keyof T]: string;
12
- } & ({
13
- [K in keyof ObjectKeys<T> as `${K}_obj`]?: FieldTransforms<T[K]>;
14
- } | {
15
- [K in keyof DictKeys<T> as `${K}_dict`]?: FieldTransforms<RecordValue<T[K]>>;
16
- }) & {
17
- [K in keyof ArrayKeys<T> as `${K}_arr`]?: FieldTransforms<ArrayValue<T[K]>>;
18
- } & {
19
- [K in keyof ArrayKeys<T> as `${K}_val`]?: FieldTransforms<ArrayValue<T[K]>>;
20
- };
21
- declare type ObjectKeys<T> = Pick<T, {
22
- [K in keyof T]-?: K extends string ? T[K] extends Record<string, any> ? T[K] extends any[] ? never : K : never : never;
23
- }[keyof T]>;
24
- declare type DictKeys<T> = Pick<T, {
25
- [K in keyof T]-?: K extends string ? (T[K] extends Record<string, Record<string, any>> ? K : never) : never;
26
- }[keyof T]>;
27
- declare type ArrayKeys<T> = Pick<T, {
28
- [K in keyof T]-?: K extends string | number ? (T[K] extends any[] ? K : never) : never;
29
- }[keyof T]>;
30
-
31
- export { type FieldTransforms, type FieldTransformsInner, fieldTransformToTransform, invertFieldMap, transformObjectFields };
@@ -1,31 +0,0 @@
1
- import { RecordValue, ArrayValue } from '@legendapp/state';
2
- import { SyncTransform } from '@legendapp/state/sync';
3
-
4
- declare function transformObjectFields(dataIn: Record<string, any>, map: Record<string, any>): any;
5
- declare function invertFieldMap(obj: Record<string, any>): any;
6
- declare const fieldTransformToTransform: <T extends object>(fieldTransform: FieldTransforms<T>) => SyncTransform<T>;
7
- declare type FieldTransforms<T> = (T extends Record<string, Record<string, any>> ? {
8
- _dict: FieldTransformsInner<RecordValue<T>>;
9
- } : never) | FieldTransformsInner<T>;
10
- declare type FieldTransformsInner<T> = {
11
- [K in keyof T]: string;
12
- } & ({
13
- [K in keyof ObjectKeys<T> as `${K}_obj`]?: FieldTransforms<T[K]>;
14
- } | {
15
- [K in keyof DictKeys<T> as `${K}_dict`]?: FieldTransforms<RecordValue<T[K]>>;
16
- }) & {
17
- [K in keyof ArrayKeys<T> as `${K}_arr`]?: FieldTransforms<ArrayValue<T[K]>>;
18
- } & {
19
- [K in keyof ArrayKeys<T> as `${K}_val`]?: FieldTransforms<ArrayValue<T[K]>>;
20
- };
21
- declare type ObjectKeys<T> = Pick<T, {
22
- [K in keyof T]-?: K extends string ? T[K] extends Record<string, any> ? T[K] extends any[] ? never : K : never : never;
23
- }[keyof T]>;
24
- declare type DictKeys<T> = Pick<T, {
25
- [K in keyof T]-?: K extends string ? (T[K] extends Record<string, Record<string, any>> ? K : never) : never;
26
- }[keyof T]>;
27
- declare type ArrayKeys<T> = Pick<T, {
28
- [K in keyof T]-?: K extends string | number ? (T[K] extends any[] ? K : never) : never;
29
- }[keyof T]>;
30
-
31
- export { type FieldTransforms, type FieldTransformsInner, fieldTransformToTransform, invertFieldMap, transformObjectFields };
@@ -1,114 +0,0 @@
1
- 'use strict';
2
-
3
- var state = require('@legendapp/state');
4
-
5
- // src/sync-plugins/_transformObjectFields.ts
6
- var validateMap;
7
- function transformObjectFields(dataIn, map) {
8
- if (process.env.NODE_ENV === "development") {
9
- validateMap(map);
10
- }
11
- let ret = dataIn;
12
- if (dataIn) {
13
- if (dataIn === state.symbolDelete)
14
- return dataIn;
15
- if (state.isString(dataIn)) {
16
- return map[dataIn];
17
- }
18
- ret = {};
19
- const dict = Object.keys(map).length === 1 && map["_dict"];
20
- for (const key in dataIn) {
21
- let v = dataIn[key];
22
- if (dict) {
23
- ret[key] = transformObjectFields(v, dict);
24
- } else {
25
- const mapped = map[key];
26
- if (mapped === void 0) {
27
- if (key !== "@") {
28
- ret[key] = v;
29
- if (process.env.NODE_ENV === "development" || process.env.NODE_ENV === "test") {
30
- console.error("A fatal field transformation error has occurred", key, dataIn, map);
31
- }
32
- }
33
- } else if (mapped !== null) {
34
- if (v !== void 0 && v !== null) {
35
- if (map[key + "_val"]) {
36
- const mapChild = map[key + "_val"];
37
- if (state.isArray(v)) {
38
- v = v.map((vChild) => mapChild[vChild]);
39
- } else {
40
- v = mapChild[v];
41
- }
42
- } else if (map[key + "_arr"] && state.isArray(v)) {
43
- const mapChild = map[key + "_arr"];
44
- v = v.map((vChild) => transformObjectFields(vChild, mapChild));
45
- } else if (state.isObject(v)) {
46
- if (map[key + "_obj"]) {
47
- v = transformObjectFields(v, map[key + "_obj"]);
48
- } else if (map[key + "_dict"]) {
49
- const mapChild = map[key + "_dict"];
50
- const out = {};
51
- for (const keyChild in v) {
52
- out[keyChild] = transformObjectFields(v[keyChild], mapChild);
53
- }
54
- v = out;
55
- }
56
- }
57
- }
58
- ret[mapped] = v;
59
- }
60
- }
61
- }
62
- }
63
- return ret;
64
- }
65
- var invertedMaps = /* @__PURE__ */ new WeakMap();
66
- function invertFieldMap(obj) {
67
- const existing = invertedMaps.get(obj);
68
- if (existing)
69
- return existing;
70
- const target = {};
71
- for (const key in obj) {
72
- const val = obj[key];
73
- if (key === "_dict") {
74
- target[key] = invertFieldMap(val);
75
- } else if (key.endsWith("_obj") || key.endsWith("_dict") || key.endsWith("_arr") || key.endsWith("_val")) {
76
- const keyMapped = obj[key.replace(/_obj|_dict|_arr|_val$/, "")];
77
- const suffix = key.match(/_obj|_dict|_arr|_val$/)[0];
78
- target[keyMapped + suffix] = invertFieldMap(val);
79
- } else if (typeof val === "string") {
80
- target[val] = key;
81
- }
82
- }
83
- invertedMaps.set(obj, target);
84
- return target;
85
- }
86
- var fieldTransformToTransform = (fieldTransform) => ({
87
- load(value) {
88
- const inverted = invertFieldMap(fieldTransform);
89
- return transformObjectFields(value, inverted);
90
- },
91
- save(value) {
92
- return transformObjectFields(value, fieldTransform);
93
- }
94
- });
95
- if (process.env.NODE_ENV === "development") {
96
- validateMap = function(record) {
97
- const values = Object.values(record).filter((value) => {
98
- if (state.isObject(value)) {
99
- validateMap(value);
100
- } else {
101
- return state.isString(value);
102
- }
103
- });
104
- const uniques = Array.from(new Set(values));
105
- if (values.length !== uniques.length) {
106
- console.error("Field transform map has duplicate values", record, values.length, uniques.length);
107
- }
108
- return record;
109
- };
110
- }
111
-
112
- exports.fieldTransformToTransform = fieldTransformToTransform;
113
- exports.invertFieldMap = invertFieldMap;
114
- exports.transformObjectFields = transformObjectFields;
@@ -1,110 +0,0 @@
1
- import { symbolDelete, isString, isArray, isObject } from '@legendapp/state';
2
-
3
- // src/sync-plugins/_transformObjectFields.ts
4
- var validateMap;
5
- function transformObjectFields(dataIn, map) {
6
- if (process.env.NODE_ENV === "development") {
7
- validateMap(map);
8
- }
9
- let ret = dataIn;
10
- if (dataIn) {
11
- if (dataIn === symbolDelete)
12
- return dataIn;
13
- if (isString(dataIn)) {
14
- return map[dataIn];
15
- }
16
- ret = {};
17
- const dict = Object.keys(map).length === 1 && map["_dict"];
18
- for (const key in dataIn) {
19
- let v = dataIn[key];
20
- if (dict) {
21
- ret[key] = transformObjectFields(v, dict);
22
- } else {
23
- const mapped = map[key];
24
- if (mapped === void 0) {
25
- if (key !== "@") {
26
- ret[key] = v;
27
- if (process.env.NODE_ENV === "development" || process.env.NODE_ENV === "test") {
28
- console.error("A fatal field transformation error has occurred", key, dataIn, map);
29
- }
30
- }
31
- } else if (mapped !== null) {
32
- if (v !== void 0 && v !== null) {
33
- if (map[key + "_val"]) {
34
- const mapChild = map[key + "_val"];
35
- if (isArray(v)) {
36
- v = v.map((vChild) => mapChild[vChild]);
37
- } else {
38
- v = mapChild[v];
39
- }
40
- } else if (map[key + "_arr"] && isArray(v)) {
41
- const mapChild = map[key + "_arr"];
42
- v = v.map((vChild) => transformObjectFields(vChild, mapChild));
43
- } else if (isObject(v)) {
44
- if (map[key + "_obj"]) {
45
- v = transformObjectFields(v, map[key + "_obj"]);
46
- } else if (map[key + "_dict"]) {
47
- const mapChild = map[key + "_dict"];
48
- const out = {};
49
- for (const keyChild in v) {
50
- out[keyChild] = transformObjectFields(v[keyChild], mapChild);
51
- }
52
- v = out;
53
- }
54
- }
55
- }
56
- ret[mapped] = v;
57
- }
58
- }
59
- }
60
- }
61
- return ret;
62
- }
63
- var invertedMaps = /* @__PURE__ */ new WeakMap();
64
- function invertFieldMap(obj) {
65
- const existing = invertedMaps.get(obj);
66
- if (existing)
67
- return existing;
68
- const target = {};
69
- for (const key in obj) {
70
- const val = obj[key];
71
- if (key === "_dict") {
72
- target[key] = invertFieldMap(val);
73
- } else if (key.endsWith("_obj") || key.endsWith("_dict") || key.endsWith("_arr") || key.endsWith("_val")) {
74
- const keyMapped = obj[key.replace(/_obj|_dict|_arr|_val$/, "")];
75
- const suffix = key.match(/_obj|_dict|_arr|_val$/)[0];
76
- target[keyMapped + suffix] = invertFieldMap(val);
77
- } else if (typeof val === "string") {
78
- target[val] = key;
79
- }
80
- }
81
- invertedMaps.set(obj, target);
82
- return target;
83
- }
84
- var fieldTransformToTransform = (fieldTransform) => ({
85
- load(value) {
86
- const inverted = invertFieldMap(fieldTransform);
87
- return transformObjectFields(value, inverted);
88
- },
89
- save(value) {
90
- return transformObjectFields(value, fieldTransform);
91
- }
92
- });
93
- if (process.env.NODE_ENV === "development") {
94
- validateMap = function(record) {
95
- const values = Object.values(record).filter((value) => {
96
- if (isObject(value)) {
97
- validateMap(value);
98
- } else {
99
- return isString(value);
100
- }
101
- });
102
- const uniques = Array.from(new Set(values));
103
- if (values.length !== uniques.length) {
104
- console.error("Field transform map has duplicate values", record, values.length, uniques.length);
105
- }
106
- return record;
107
- };
108
- }
109
-
110
- export { fieldTransformToTransform, invertFieldMap, transformObjectFields };