@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 +1 -1
- package/config.d.ts +1 -1
- package/config.js +18 -4
- package/config.mjs +18 -4
- package/index.d.mts +6 -2
- package/index.d.ts +6 -2
- package/index.js +19 -4
- package/index.mjs +19 -4
- package/{observableInterfaces-Dilj6F92.d.mts → observableInterfaces-CZR3_8mM.d.mts} +4 -3
- package/{observableInterfaces-Dilj6F92.d.ts → observableInterfaces-CZR3_8mM.d.ts} +4 -3
- package/package.json +1 -1
- package/sync-plugins/crud.d.mts +7 -2
- package/sync-plugins/crud.d.ts +7 -2
- package/sync-plugins/crud.js +29 -7
- package/sync-plugins/crud.mjs +30 -8
- package/sync-plugins/firebase.d.mts +4 -3
- package/sync-plugins/firebase.d.ts +4 -3
- package/sync-plugins/keel.js +11 -11
- package/sync-plugins/keel.mjs +12 -12
- package/sync.d.mts +4 -1
- package/sync.d.ts +4 -1
- package/sync.js +26 -10
- package/sync.mjs +26 -10
- package/sync-plugins/_transformObjectFields.d.mts +0 -31
- package/sync-plugins/_transformObjectFields.d.ts +0 -31
- package/sync-plugins/_transformObjectFields.js +0 -114
- package/sync-plugins/_transformObjectFields.mjs +0 -110
package/config.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { N as NodeInfo } from './observableInterfaces-
|
|
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-
|
|
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
|
|
882
|
-
|
|
883
|
-
|
|
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
|
|
880
|
-
|
|
881
|
-
|
|
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-
|
|
2
|
-
export { A as ArrayValue, J as ChildNodeInfo, B as ClassConstructor,
|
|
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-
|
|
2
|
-
export { A as ArrayValue, J as ChildNodeInfo, B as ClassConstructor,
|
|
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
|
|
1035
|
-
|
|
1036
|
-
|
|
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
|
|
1033
|
-
|
|
1034
|
-
|
|
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?:
|
|
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
|
|
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?:
|
|
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
|
|
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
package/sync-plugins/crud.d.mts
CHANGED
|
@@ -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
|
|
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 };
|
package/sync-plugins/crud.d.ts
CHANGED
|
@@ -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
|
|
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 };
|
package/sync-plugins/crud.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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) {
|
package/sync-plugins/crud.mjs
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
6
|
-
|
|
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
|
-
|
|
6
|
-
|
|
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 };
|
package/sync-plugins/keel.js
CHANGED
|
@@ -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 =
|
|
40
|
-
Object.keys(
|
|
38
|
+
const cloned = {};
|
|
39
|
+
Object.keys(item).forEach((key) => {
|
|
41
40
|
if (key.endsWith("Id")) {
|
|
42
|
-
if (
|
|
43
|
-
cloned[key.slice(0, -2)] = { id:
|
|
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) {
|
package/sync-plugins/keel.mjs
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import
|
|
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 =
|
|
34
|
-
Object.keys(
|
|
32
|
+
const cloned = {};
|
|
33
|
+
Object.keys(item).forEach((key) => {
|
|
35
34
|
if (key.endsWith("Id")) {
|
|
36
|
-
if (
|
|
37
|
-
cloned[key.slice(0, -2)] = { id:
|
|
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 (
|
|
571
|
-
|
|
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
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
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 (
|
|
569
|
-
|
|
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
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
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 };
|