@legendapp/state 3.0.0-alpha.1 → 3.0.0-alpha.3
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/.DS_Store +0 -0
- package/CHANGELOG.md +1 -831
- package/LICENSE +1 -21
- package/README.md +1 -141
- package/as/arrayAsRecord.d.mts +5 -0
- package/as/arrayAsRecord.d.ts +5 -0
- package/as/arrayAsRecord.js +28 -0
- package/as/arrayAsRecord.mjs +26 -0
- package/as/arrayAsSet.d.mts +5 -0
- package/as/arrayAsSet.d.ts +5 -0
- package/as/arrayAsSet.js +13 -0
- package/as/arrayAsSet.mjs +11 -0
- package/as/arrayAsString.d.mts +5 -0
- package/as/arrayAsString.d.ts +5 -0
- package/as/arrayAsString.js +13 -0
- package/as/arrayAsString.mjs +11 -0
- package/as/numberAsString.d.mts +5 -0
- package/as/numberAsString.d.ts +5 -0
- package/as/numberAsString.js +13 -0
- package/as/numberAsString.mjs +11 -0
- package/as/recordAsArray.d.mts +5 -0
- package/as/recordAsArray.d.ts +5 -0
- package/as/recordAsArray.js +25 -0
- package/as/recordAsArray.mjs +23 -0
- package/as/recordAsString.d.mts +5 -0
- package/as/recordAsString.d.ts +5 -0
- package/as/recordAsString.js +13 -0
- package/as/recordAsString.mjs +11 -0
- package/as/setAsArray.d.mts +5 -0
- package/as/setAsArray.d.ts +5 -0
- package/as/setAsArray.js +13 -0
- package/as/setAsArray.mjs +11 -0
- package/as/setAsString.d.mts +5 -0
- package/as/setAsString.d.ts +5 -0
- package/as/setAsString.js +13 -0
- package/as/setAsString.mjs +11 -0
- package/as/stringAsArray.d.mts +5 -0
- package/as/stringAsArray.d.ts +5 -0
- package/as/stringAsArray.js +13 -0
- package/as/stringAsArray.mjs +11 -0
- package/as/stringAsNumber.d.mts +5 -0
- package/as/stringAsNumber.d.ts +5 -0
- package/as/stringAsNumber.js +16 -0
- package/as/stringAsNumber.mjs +14 -0
- package/as/stringAsRecord.d.mts +5 -0
- package/as/stringAsRecord.d.ts +5 -0
- package/as/stringAsRecord.js +15 -0
- package/as/stringAsRecord.mjs +13 -0
- package/as/stringAsSet.d.mts +5 -0
- package/as/stringAsSet.d.ts +5 -0
- package/as/stringAsSet.js +13 -0
- package/as/stringAsSet.mjs +11 -0
- package/babel.d.mts +21 -0
- package/babel.d.ts +21 -2
- package/babel.js +57 -53
- package/babel.mjs +65 -0
- package/config/enable$GetSet.js +13 -14
- package/config/enable$GetSet.mjs +13 -14
- package/config/enableReactComponents.d.mts +9 -0
- package/config/enableReactComponents.d.ts +4 -2
- package/config/enableReactComponents.js +13 -10
- package/config/enableReactComponents.mjs +13 -10
- package/config/enableReactNativeComponents.d.mts +22 -0
- package/config/enableReactNativeComponents.d.ts +6 -4
- package/config/enableReactNativeComponents.js +43 -47
- package/config/enableReactNativeComponents.mjs +43 -47
- package/config/enableReactTracking.d.mts +7 -0
- package/config/enableReactTracking.d.ts +3 -2
- package/config/enableReactTracking.js +33 -38
- package/config/enableReactTracking.mjs +33 -38
- package/config/enableReactUse.d.mts +10 -0
- package/config/enableReactUse.d.ts +4 -1
- package/config/enableReactUse.js +15 -14
- package/config/enableReactUse.mjs +15 -14
- package/config/{enable$GetSet.d.ts → enable_GetSet.d.mts} +4 -2
- package/config/enable_GetSet.d.ts +10 -0
- package/config/enable_PeekAssign.d.mts +10 -0
- package/config/enable_PeekAssign.d.ts +4 -2
- package/config/enable_PeekAssign.js +13 -14
- package/config/enable_PeekAssign.mjs +13 -14
- package/helpers/pageHash.d.mts +9 -0
- package/helpers/pageHash.d.ts +2 -0
- package/helpers/pageHash.js +25 -30
- package/helpers/pageHash.mjs +25 -30
- package/helpers/pageHashParams.d.mts +9 -0
- package/helpers/pageHashParams.d.ts +2 -0
- package/helpers/pageHashParams.js +34 -37
- package/helpers/pageHashParams.mjs +34 -37
- package/helpers/time.d.mts +6 -0
- package/helpers/time.d.ts +6 -3
- package/helpers/time.js +17 -17
- package/helpers/time.mjs +17 -17
- package/helpers/trackHistory.d.mts +6 -0
- package/helpers/trackHistory.d.ts +4 -2
- package/helpers/trackHistory.js +13 -16
- package/helpers/trackHistory.mjs +13 -16
- package/helpers/undoRedo.d.mts +37 -0
- package/helpers/undoRedo.d.ts +5 -3
- package/helpers/undoRedo.js +59 -94
- package/helpers/undoRedo.mjs +59 -94
- package/index.d.mts +404 -0
- package/index.d.ts +371 -28
- package/index.js +2015 -2166
- package/index.mjs +2015 -2166
- package/package.json +254 -195
- package/persist-plugins/async-storage.d.mts +18 -0
- package/persist-plugins/async-storage.d.ts +6 -3
- package/persist-plugins/async-storage.js +79 -86
- package/persist-plugins/async-storage.mjs +79 -86
- package/persist-plugins/indexeddb.d.mts +29 -0
- package/persist-plugins/indexeddb.d.ts +6 -3
- package/persist-plugins/indexeddb.js +331 -352
- package/persist-plugins/indexeddb.mjs +331 -352
- package/persist-plugins/local-storage.d.mts +23 -0
- package/persist-plugins/local-storage.d.ts +8 -5
- package/persist-plugins/local-storage.js +74 -76
- package/persist-plugins/local-storage.mjs +74 -76
- package/persist-plugins/mmkv.d.mts +18 -0
- package/persist-plugins/mmkv.d.ts +6 -3
- package/persist-plugins/mmkv.js +82 -86
- package/persist-plugins/mmkv.mjs +82 -86
- package/react-hooks/createObservableHook.d.mts +5 -0
- package/react-hooks/createObservableHook.d.ts +4 -1
- package/react-hooks/createObservableHook.js +29 -30
- package/react-hooks/createObservableHook.mjs +25 -30
- package/react-hooks/useHover.d.mts +5 -0
- package/react-hooks/useHover.d.ts +5 -3
- package/react-hooks/useHover.js +29 -29
- package/react-hooks/useHover.mjs +29 -29
- package/react-hooks/useMeasure.d.mts +9 -0
- package/react-hooks/useMeasure.d.ts +5 -2
- package/react-hooks/useMeasure.js +30 -32
- package/react-hooks/useMeasure.mjs +30 -32
- package/react-hooks/useObservableNextRouter.d.mts +35 -0
- package/react-hooks/useObservableNextRouter.d.ts +9 -7
- package/react-hooks/useObservableNextRouter.js +64 -77
- package/react-hooks/useObservableNextRouter.mjs +60 -77
- package/react.d.mts +157 -0
- package/react.d.ts +157 -21
- package/react.js +458 -749
- package/react.mjs +457 -752
- package/sync-plugins/crud.d.mts +54 -0
- package/sync-plugins/crud.d.ts +12 -10
- package/sync-plugins/crud.js +253 -270
- package/sync-plugins/crud.mjs +253 -270
- package/sync-plugins/fetch.d.mts +21 -0
- package/sync-plugins/fetch.d.ts +7 -4
- package/sync-plugins/fetch.js +50 -37
- package/sync-plugins/fetch.mjs +50 -37
- package/sync-plugins/keel.d.mts +108 -0
- package/sync-plugins/keel.d.ts +17 -15
- package/sync-plugins/keel.js +229 -462
- package/sync-plugins/keel.mjs +227 -464
- package/sync-plugins/supabase.d.mts +39 -0
- package/sync-plugins/supabase.d.ts +16 -14
- package/sync-plugins/supabase.js +128 -128
- package/sync-plugins/supabase.mjs +128 -128
- package/sync-plugins/tanstack-query.d.mts +14 -0
- package/sync-plugins/tanstack-query.d.ts +7 -4
- package/sync-plugins/tanstack-query.js +51 -57
- package/sync-plugins/tanstack-query.mjs +51 -57
- package/sync-plugins/tanstack-react-query.d.mts +8 -0
- package/sync-plugins/tanstack-react-query.d.ts +6 -1
- package/sync-plugins/tanstack-react-query.js +2 -2
- package/sync-plugins/tanstack-react-query.mjs +2 -2
- package/sync.d.mts +351 -0
- package/sync.d.ts +349 -9
- package/sync.js +910 -964
- package/sync.mjs +920 -974
- package/trace.d.mts +9 -0
- package/trace.d.ts +9 -4
- package/trace.js +72 -62
- package/trace.mjs +72 -62
- package/types/babel.d.ts +1 -12
- package/babel.js.map +0 -1
- package/config/enable$GetSet.js.map +0 -1
- package/config/enable$GetSet.mjs.map +0 -1
- package/config/enableReactComponents.js.map +0 -1
- package/config/enableReactComponents.mjs.map +0 -1
- package/config/enableReactNativeComponents.js.map +0 -1
- package/config/enableReactNativeComponents.mjs.map +0 -1
- package/config/enableReactTracking.js.map +0 -1
- package/config/enableReactTracking.mjs.map +0 -1
- package/config/enableReactUse.js.map +0 -1
- package/config/enableReactUse.mjs.map +0 -1
- package/config/enable_PeekAssign.js.map +0 -1
- package/config/enable_PeekAssign.mjs.map +0 -1
- package/helpers/pageHash.js.map +0 -1
- package/helpers/pageHash.mjs.map +0 -1
- package/helpers/pageHashParams.js.map +0 -1
- package/helpers/pageHashParams.mjs.map +0 -1
- package/helpers/time.js.map +0 -1
- package/helpers/time.mjs.map +0 -1
- package/helpers/trackHistory.js.map +0 -1
- package/helpers/trackHistory.mjs.map +0 -1
- package/helpers/undoRedo.js.map +0 -1
- package/helpers/undoRedo.mjs.map +0 -1
- package/history.d.ts +0 -1
- package/history.js +0 -24
- package/history.js.map +0 -1
- package/history.mjs +0 -22
- package/history.mjs.map +0 -1
- package/index.js.map +0 -1
- package/index.mjs.map +0 -1
- package/persist-plugins/async-storage.js.map +0 -1
- package/persist-plugins/async-storage.mjs.map +0 -1
- package/persist-plugins/indexeddb.js.map +0 -1
- package/persist-plugins/indexeddb.mjs.map +0 -1
- package/persist-plugins/local-storage.js.map +0 -1
- package/persist-plugins/local-storage.mjs.map +0 -1
- package/persist-plugins/mmkv.js.map +0 -1
- package/persist-plugins/mmkv.mjs.map +0 -1
- package/react-hooks/createObservableHook.js.map +0 -1
- package/react-hooks/createObservableHook.mjs.map +0 -1
- package/react-hooks/useHover.js.map +0 -1
- package/react-hooks/useHover.mjs.map +0 -1
- package/react-hooks/useMeasure.js.map +0 -1
- package/react-hooks/useMeasure.mjs.map +0 -1
- package/react-hooks/useObservableNextRouter.js.map +0 -1
- package/react-hooks/useObservableNextRouter.mjs.map +0 -1
- package/react.js.map +0 -1
- package/react.mjs.map +0 -1
- package/src/ObservableObject.ts +0 -1350
- package/src/ObservablePrimitive.ts +0 -62
- package/src/babel/index.ts +0 -83
- package/src/batching.ts +0 -357
- package/src/computed.ts +0 -18
- package/src/config/enable$GetSet.ts +0 -30
- package/src/config/enableReactComponents.ts +0 -26
- package/src/config/enableReactNativeComponents.ts +0 -102
- package/src/config/enableReactTracking.ts +0 -62
- package/src/config/enableReactUse.ts +0 -32
- package/src/config/enable_PeekAssign.ts +0 -31
- package/src/config.ts +0 -47
- package/src/createObservable.ts +0 -47
- package/src/event.ts +0 -26
- package/src/globals.ts +0 -235
- package/src/helpers/pageHash.ts +0 -41
- package/src/helpers/pageHashParams.ts +0 -55
- package/src/helpers/time.ts +0 -30
- package/src/helpers/trackHistory.ts +0 -29
- package/src/helpers/undoRedo.ts +0 -111
- package/src/helpers.ts +0 -231
- package/src/is.ts +0 -63
- package/src/linked.ts +0 -17
- package/src/observable.ts +0 -32
- package/src/observableInterfaces.ts +0 -151
- package/src/observableTypes.ts +0 -232
- package/src/observe.ts +0 -89
- package/src/old-plugins/firebase.ts +0 -1053
- package/src/onChange.ts +0 -146
- package/src/persist/configureObservablePersistence.ts +0 -7
- package/src/persist/fieldTransformer.ts +0 -149
- package/src/persist/observablePersistRemoteFunctionsAdapter.ts +0 -39
- package/src/persist/persistObservable.ts +0 -1034
- package/src/persist-plugins/async-storage.ts +0 -99
- package/src/persist-plugins/indexeddb.ts +0 -439
- package/src/persist-plugins/local-storage.ts +0 -86
- package/src/persist-plugins/mmkv.ts +0 -91
- package/src/proxy.ts +0 -28
- package/src/react/Computed.tsx +0 -8
- package/src/react/For.tsx +0 -116
- package/src/react/Memo.tsx +0 -4
- package/src/react/Reactive.tsx +0 -53
- package/src/react/Show.tsx +0 -33
- package/src/react/Switch.tsx +0 -43
- package/src/react/react-globals.ts +0 -3
- package/src/react/reactInterfaces.ts +0 -32
- package/src/react/reactive-observer.tsx +0 -210
- package/src/react/useComputed.ts +0 -36
- package/src/react/useEffectOnce.ts +0 -41
- package/src/react/useIsMounted.ts +0 -16
- package/src/react/useMount.ts +0 -15
- package/src/react/useObservable.ts +0 -24
- package/src/react/useObservableReducer.ts +0 -52
- package/src/react/useObservableState.ts +0 -30
- package/src/react/useObserve.ts +0 -54
- package/src/react/useObserveEffect.ts +0 -40
- package/src/react/usePauseProvider.tsx +0 -16
- package/src/react/useSelector.ts +0 -167
- package/src/react/useUnmount.ts +0 -8
- package/src/react/useWhen.ts +0 -9
- package/src/react-hooks/createObservableHook.ts +0 -53
- package/src/react-hooks/useHover.ts +0 -40
- package/src/react-hooks/useMeasure.ts +0 -48
- package/src/react-hooks/useObservableNextRouter.ts +0 -137
- package/src/retry.ts +0 -71
- package/src/setupTracking.ts +0 -26
- package/src/sync/activateSyncedNode.ts +0 -128
- package/src/sync/configureObservableSync.ts +0 -7
- package/src/sync/persistTypes.ts +0 -216
- package/src/sync/syncHelpers.ts +0 -180
- package/src/sync/syncObservable.ts +0 -1056
- package/src/sync/syncObservableAdapter.ts +0 -31
- package/src/sync/syncTypes.ts +0 -189
- package/src/sync/synced.ts +0 -21
- package/src/sync-plugins/crud.ts +0 -412
- package/src/sync-plugins/fetch.ts +0 -80
- package/src/sync-plugins/keel.ts +0 -495
- package/src/sync-plugins/supabase.ts +0 -249
- package/src/sync-plugins/tanstack-query.ts +0 -113
- package/src/sync-plugins/tanstack-react-query.ts +0 -12
- package/src/trace/traceHelpers.ts +0 -11
- package/src/trace/useTraceListeners.ts +0 -34
- package/src/trace/useTraceUpdates.ts +0 -24
- package/src/trace/useVerifyNotTracking.ts +0 -33
- package/src/trace/useVerifyOneRender.ts +0 -10
- package/src/trackSelector.ts +0 -52
- package/src/tracking.ts +0 -43
- package/src/types/babel.d.ts +0 -12
- package/src/when.ts +0 -75
- package/sync-plugins/crud.js.map +0 -1
- package/sync-plugins/crud.mjs.map +0 -1
- package/sync-plugins/fetch.js.map +0 -1
- package/sync-plugins/fetch.mjs.map +0 -1
- package/sync-plugins/keel.js.map +0 -1
- package/sync-plugins/keel.mjs.map +0 -1
- package/sync-plugins/supabase.js.map +0 -1
- package/sync-plugins/supabase.mjs.map +0 -1
- package/sync-plugins/tanstack-query.js.map +0 -1
- package/sync-plugins/tanstack-query.mjs.map +0 -1
- package/sync-plugins/tanstack-react-query.js.map +0 -1
- package/sync-plugins/tanstack-react-query.mjs.map +0 -1
- package/sync.js.map +0 -1
- package/sync.mjs.map +0 -1
- package/trace.js.map +0 -1
- package/trace.mjs.map +0 -1
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { SyncedGetParams, SyncedOptions, SyncedSetParams } from '@legendapp/state/sync';
|
|
2
|
+
|
|
3
|
+
type CrudAsOption = 'Map' | 'object' | 'value' | 'array';
|
|
4
|
+
type CrudResult<T> = T;
|
|
5
|
+
interface SyncedCrudPropsSingle<TRemote, TLocal> {
|
|
6
|
+
get?: (params: SyncedGetParams) => Promise<CrudResult<TRemote | null>> | CrudResult<TRemote | null>;
|
|
7
|
+
initial?: InitialValue<TLocal, 'value'>;
|
|
8
|
+
as?: never | 'value';
|
|
9
|
+
}
|
|
10
|
+
interface SyncedCrudPropsMany<TRemote, TLocal, TAsOption extends CrudAsOption> {
|
|
11
|
+
list?: (params: SyncedGetParams) => Promise<CrudResult<TRemote[] | null>> | CrudResult<TRemote[] | null>;
|
|
12
|
+
as?: TAsOption;
|
|
13
|
+
initial?: InitialValue<TLocal, TAsOption>;
|
|
14
|
+
}
|
|
15
|
+
interface SyncedCrudOnSavedParams<TRemote extends {
|
|
16
|
+
id: string | number;
|
|
17
|
+
}, TLocal> {
|
|
18
|
+
saved: TLocal;
|
|
19
|
+
input: TRemote;
|
|
20
|
+
currentValue: TLocal;
|
|
21
|
+
isCreate: boolean;
|
|
22
|
+
props: SyncedCrudPropsBase<TRemote, TLocal>;
|
|
23
|
+
}
|
|
24
|
+
interface SyncedCrudPropsBase<TRemote extends {
|
|
25
|
+
id: string | number;
|
|
26
|
+
}, TLocal = TRemote> extends Omit<SyncedOptions<TRemote, TLocal>, 'get' | 'set' | 'initial'> {
|
|
27
|
+
create?(input: TRemote, params: SyncedSetParams<TRemote>): Promise<CrudResult<TRemote> | null | undefined>;
|
|
28
|
+
update?(input: Partial<TRemote>, params: SyncedSetParams<TRemote>): Promise<CrudResult<Partial<TRemote> | null | undefined>>;
|
|
29
|
+
delete?(input: {
|
|
30
|
+
id: TRemote['id'];
|
|
31
|
+
}, params: SyncedSetParams<TRemote>): Promise<CrudResult<any>>;
|
|
32
|
+
onSaved?(params: SyncedCrudOnSavedParams<TRemote, TLocal>): Partial<TLocal> | void;
|
|
33
|
+
onSavedUpdate?: 'createdUpdatedAt';
|
|
34
|
+
fieldUpdatedAt?: string;
|
|
35
|
+
fieldCreatedAt?: string;
|
|
36
|
+
fieldDeleted?: string;
|
|
37
|
+
updatePartial?: boolean;
|
|
38
|
+
changesSince?: 'all' | 'last-sync';
|
|
39
|
+
generateId?: () => string | number;
|
|
40
|
+
}
|
|
41
|
+
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[];
|
|
42
|
+
type SyncedCrudReturnType<TLocal, TAsOption extends CrudAsOption> = TAsOption extends 'Map' ? Map<TLocal extends {
|
|
43
|
+
id: number;
|
|
44
|
+
} ? number : string, TLocal> : TAsOption extends 'object' ? Record<TLocal extends {
|
|
45
|
+
id: number;
|
|
46
|
+
} ? number : string, TLocal> : TAsOption extends 'value' ? TLocal : TLocal[];
|
|
47
|
+
declare function syncedCrud<TRemote extends {
|
|
48
|
+
id: string | number;
|
|
49
|
+
}, TLocal = TRemote>(props: SyncedCrudPropsBase<TRemote, TLocal> & SyncedCrudPropsSingle<TRemote, TLocal>): SyncedCrudReturnType<TLocal, 'value'>;
|
|
50
|
+
declare function syncedCrud<TRemote extends {
|
|
51
|
+
id: string | number;
|
|
52
|
+
}, TLocal = TRemote, TAsOption extends CrudAsOption = 'object'>(props: SyncedCrudPropsBase<TRemote, TLocal> & SyncedCrudPropsMany<TRemote, TLocal, TAsOption>): SyncedCrudReturnType<TLocal, Exclude<TAsOption, 'value'>>;
|
|
53
|
+
|
|
54
|
+
export { type CrudAsOption, type CrudResult, type SyncedCrudOnSavedParams, type SyncedCrudPropsBase, type SyncedCrudPropsMany, type SyncedCrudPropsSingle, type SyncedCrudReturnType, syncedCrud };
|
package/sync-plugins/crud.d.ts
CHANGED
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
import { SyncedGetParams, SyncedOptions, SyncedSetParams } from '@legendapp/state/sync';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
|
|
3
|
+
type CrudAsOption = 'Map' | 'object' | 'value' | 'array';
|
|
4
|
+
type CrudResult<T> = T;
|
|
5
|
+
interface SyncedCrudPropsSingle<TRemote, TLocal> {
|
|
5
6
|
get?: (params: SyncedGetParams) => Promise<CrudResult<TRemote | null>> | CrudResult<TRemote | null>;
|
|
6
7
|
initial?: InitialValue<TLocal, 'value'>;
|
|
7
8
|
as?: never | 'value';
|
|
8
9
|
}
|
|
9
|
-
|
|
10
|
+
interface SyncedCrudPropsMany<TRemote, TLocal, TAsOption extends CrudAsOption> {
|
|
10
11
|
list?: (params: SyncedGetParams) => Promise<CrudResult<TRemote[] | null>> | CrudResult<TRemote[] | null>;
|
|
11
12
|
as?: TAsOption;
|
|
12
13
|
initial?: InitialValue<TLocal, TAsOption>;
|
|
13
14
|
}
|
|
14
|
-
|
|
15
|
+
interface SyncedCrudOnSavedParams<TRemote extends {
|
|
15
16
|
id: string | number;
|
|
16
17
|
}, TLocal> {
|
|
17
18
|
saved: TLocal;
|
|
@@ -20,7 +21,7 @@ export interface SyncedCrudOnSavedParams<TRemote extends {
|
|
|
20
21
|
isCreate: boolean;
|
|
21
22
|
props: SyncedCrudPropsBase<TRemote, TLocal>;
|
|
22
23
|
}
|
|
23
|
-
|
|
24
|
+
interface SyncedCrudPropsBase<TRemote extends {
|
|
24
25
|
id: string | number;
|
|
25
26
|
}, TLocal = TRemote> extends Omit<SyncedOptions<TRemote, TLocal>, 'get' | 'set' | 'initial'> {
|
|
26
27
|
create?(input: TRemote, params: SyncedSetParams<TRemote>): Promise<CrudResult<TRemote> | null | undefined>;
|
|
@@ -38,15 +39,16 @@ export interface SyncedCrudPropsBase<TRemote extends {
|
|
|
38
39
|
generateId?: () => string | number;
|
|
39
40
|
}
|
|
40
41
|
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[];
|
|
41
|
-
|
|
42
|
+
type SyncedCrudReturnType<TLocal, TAsOption extends CrudAsOption> = TAsOption extends 'Map' ? Map<TLocal extends {
|
|
42
43
|
id: number;
|
|
43
44
|
} ? number : string, TLocal> : TAsOption extends 'object' ? Record<TLocal extends {
|
|
44
45
|
id: number;
|
|
45
46
|
} ? number : string, TLocal> : TAsOption extends 'value' ? TLocal : TLocal[];
|
|
46
|
-
|
|
47
|
+
declare function syncedCrud<TRemote extends {
|
|
47
48
|
id: string | number;
|
|
48
49
|
}, TLocal = TRemote>(props: SyncedCrudPropsBase<TRemote, TLocal> & SyncedCrudPropsSingle<TRemote, TLocal>): SyncedCrudReturnType<TLocal, 'value'>;
|
|
49
|
-
|
|
50
|
+
declare function syncedCrud<TRemote extends {
|
|
50
51
|
id: string | number;
|
|
51
52
|
}, TLocal = TRemote, TAsOption extends CrudAsOption = 'object'>(props: SyncedCrudPropsBase<TRemote, TLocal> & SyncedCrudPropsMany<TRemote, TLocal, TAsOption>): SyncedCrudReturnType<TLocal, Exclude<TAsOption, 'value'>>;
|
|
52
|
-
|
|
53
|
+
|
|
54
|
+
export { type CrudAsOption, type CrudResult, type SyncedCrudOnSavedParams, type SyncedCrudPropsBase, type SyncedCrudPropsMany, type SyncedCrudPropsSingle, type SyncedCrudReturnType, syncedCrud };
|
package/sync-plugins/crud.js
CHANGED
|
@@ -3,288 +3,271 @@
|
|
|
3
3
|
var state = require('@legendapp/state');
|
|
4
4
|
var sync = require('@legendapp/state/sync');
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
// src/sync-plugins/crud.ts
|
|
7
|
+
var { clone } = state.internal;
|
|
7
8
|
function transformOut(data, transform) {
|
|
8
|
-
|
|
9
|
+
return transform ? transform(clone(data)) : data;
|
|
9
10
|
}
|
|
10
11
|
function ensureId(obj, generateId) {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
if (!obj.id) {
|
|
13
|
+
obj.id = generateId();
|
|
14
|
+
}
|
|
15
|
+
return obj.id;
|
|
15
16
|
}
|
|
16
17
|
function onSavedCreatedUpdatedAt(mode, { saved, currentValue, isCreate, props }) {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
keyLower.endsWith('updatedat') ||
|
|
35
|
-
keyLower.endsWith('created_at') ||
|
|
36
|
-
keyLower.endsWith('updated_at')) &&
|
|
37
|
-
saved[k] instanceof Date) {
|
|
38
|
-
savedOut[k] = saved[k];
|
|
39
|
-
}
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
return savedOut;
|
|
18
|
+
const savedOut = {};
|
|
19
|
+
if (isCreate) {
|
|
20
|
+
Object.keys(saved).forEach((key) => {
|
|
21
|
+
if (state.isNullOrUndefined(currentValue[key])) {
|
|
22
|
+
savedOut[key] = saved[key];
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
} else if (mode === "createdUpdatedAt") {
|
|
26
|
+
Object.keys(saved).forEach((key) => {
|
|
27
|
+
const k = key;
|
|
28
|
+
const keyLower = key.toLowerCase();
|
|
29
|
+
if ((key === props.fieldCreatedAt || key === props.fieldUpdatedAt || keyLower.endsWith("createdat") || keyLower.endsWith("updatedat") || keyLower.endsWith("created_at") || keyLower.endsWith("updated_at")) && saved[k] instanceof Date) {
|
|
30
|
+
savedOut[k] = saved[k];
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
return savedOut;
|
|
43
35
|
}
|
|
44
36
|
function syncedCrud(props) {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
37
|
+
const {
|
|
38
|
+
get: getFn,
|
|
39
|
+
list: listFn,
|
|
40
|
+
create: createFn,
|
|
41
|
+
update: updateFn,
|
|
42
|
+
delete: deleteFn,
|
|
43
|
+
transform,
|
|
44
|
+
fieldCreatedAt,
|
|
45
|
+
fieldUpdatedAt,
|
|
46
|
+
fieldDeleted,
|
|
47
|
+
updatePartial,
|
|
48
|
+
onSaved,
|
|
49
|
+
onSavedUpdate,
|
|
50
|
+
mode: modeParam,
|
|
51
|
+
changesSince,
|
|
52
|
+
generateId,
|
|
53
|
+
...rest
|
|
54
|
+
} = props;
|
|
55
|
+
let asType = props.as;
|
|
56
|
+
if (!asType) {
|
|
57
|
+
asType = getFn ? "value" : "object";
|
|
58
|
+
}
|
|
59
|
+
const asMap = asType === "Map";
|
|
60
|
+
const asArray = asType === "array";
|
|
61
|
+
const get = getFn || listFn ? async (getParams) => {
|
|
62
|
+
const { updateLastSync, lastSync, value } = getParams;
|
|
63
|
+
if (listFn) {
|
|
64
|
+
const isLastSyncMode = changesSince === "last-sync";
|
|
65
|
+
if (isLastSyncMode && lastSync) {
|
|
66
|
+
getParams.mode = modeParam || (asType === "array" ? "append" : asType === "value" ? "set" : "assign");
|
|
67
|
+
}
|
|
68
|
+
const data = await listFn(getParams) || [];
|
|
69
|
+
let newLastSync = 0;
|
|
70
|
+
for (let i = 0; i < data.length; i++) {
|
|
71
|
+
const updated = data[i][fieldUpdatedAt] || data[i][fieldCreatedAt];
|
|
72
|
+
if (updated) {
|
|
73
|
+
newLastSync = Math.max(newLastSync, +new Date(updated));
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (newLastSync && newLastSync !== lastSync) {
|
|
77
|
+
updateLastSync(newLastSync);
|
|
78
|
+
}
|
|
79
|
+
let transformed = data;
|
|
80
|
+
if (transform == null ? void 0 : transform.load) {
|
|
81
|
+
transformed = await Promise.all(data.map((value2) => transform.load(value2, "get")));
|
|
82
|
+
}
|
|
83
|
+
if (asType === "value") {
|
|
84
|
+
return transformed.length > 0 ? transformed[0] : isLastSyncMode && lastSync && value || null;
|
|
85
|
+
} else {
|
|
86
|
+
const results = transformed.map(
|
|
87
|
+
(result) => result[fieldDeleted] || result.__deleted ? state.internal.symbolDelete : result
|
|
88
|
+
);
|
|
89
|
+
const out = asType === "array" ? [] : asMap ? /* @__PURE__ */ new Map() : {};
|
|
90
|
+
for (let i = 0; i < results.length; i++) {
|
|
91
|
+
let result = results[i];
|
|
92
|
+
result = result[fieldDeleted] || result.__deleted ? state.internal.symbolDelete : result;
|
|
93
|
+
if (asArray) {
|
|
94
|
+
out.push(result);
|
|
95
|
+
} else if (asMap) {
|
|
96
|
+
out.set(result.id, result);
|
|
97
|
+
} else {
|
|
98
|
+
out[result.id] = result;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return out;
|
|
102
|
+
}
|
|
103
|
+
} else if (getFn) {
|
|
104
|
+
const data = await getFn(getParams);
|
|
105
|
+
let transformed = data;
|
|
106
|
+
if (data) {
|
|
107
|
+
const newLastSync = data[fieldUpdatedAt] || data[fieldCreatedAt];
|
|
108
|
+
if (newLastSync && newLastSync !== lastSync) {
|
|
109
|
+
updateLastSync(newLastSync);
|
|
110
|
+
}
|
|
111
|
+
if (transform == null ? void 0 : transform.load) {
|
|
112
|
+
transformed = await transform.load(data, "get");
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return transformed;
|
|
49
116
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
}
|
|
76
|
-
if (asType === 'value') {
|
|
77
|
-
return transformed.length > 0
|
|
78
|
-
? transformed[0]
|
|
79
|
-
: (isLastSyncMode && lastSync && value) || null;
|
|
80
|
-
}
|
|
81
|
-
else {
|
|
82
|
-
const results = transformed.map((result) => result[fieldDeleted] || result.__deleted ? state.internal.symbolDelete : result);
|
|
83
|
-
const out = asType === 'array' ? [] : asMap ? new Map() : {};
|
|
84
|
-
for (let i = 0; i < results.length; i++) {
|
|
85
|
-
let result = results[i];
|
|
86
|
-
result = result[fieldDeleted] || result.__deleted ? state.internal.symbolDelete : result;
|
|
87
|
-
if (asArray) {
|
|
88
|
-
out.push(result);
|
|
89
|
-
}
|
|
90
|
-
else if (asMap) {
|
|
91
|
-
out.set(result.id, result);
|
|
92
|
-
}
|
|
93
|
-
else {
|
|
94
|
-
out[result.id] = result;
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
return out;
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
else if (getFn) {
|
|
101
|
-
const data = await getFn(getParams);
|
|
102
|
-
let transformed = data;
|
|
103
|
-
if (data) {
|
|
104
|
-
const newLastSync = data[fieldUpdatedAt] || data[fieldCreatedAt];
|
|
105
|
-
if (newLastSync && newLastSync !== lastSync) {
|
|
106
|
-
updateLastSync(newLastSync);
|
|
107
|
-
}
|
|
108
|
-
if (transform === null || transform === void 0 ? void 0 : transform.load) {
|
|
109
|
-
transformed = await transform.load(data, 'get');
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
return transformed;
|
|
117
|
+
} : void 0;
|
|
118
|
+
const set = createFn || updateFn || deleteFn ? async (params) => {
|
|
119
|
+
const { value, changes, update, retryAsCreate, valuePrevious, node } = params;
|
|
120
|
+
const creates = /* @__PURE__ */ new Map();
|
|
121
|
+
const updates = /* @__PURE__ */ new Map();
|
|
122
|
+
const deletes = /* @__PURE__ */ new Set();
|
|
123
|
+
changes.forEach(({ path, prevAtPath, valueAtPath }) => {
|
|
124
|
+
if (asType === "value") {
|
|
125
|
+
if (value) {
|
|
126
|
+
let id = value == null ? void 0 : value.id;
|
|
127
|
+
const isCreate = fieldCreatedAt ? !value[fieldCreatedAt] : !prevAtPath;
|
|
128
|
+
if (!id && generateId) {
|
|
129
|
+
id = ensureId(value, generateId);
|
|
130
|
+
}
|
|
131
|
+
if (id) {
|
|
132
|
+
if (isCreate || retryAsCreate) {
|
|
133
|
+
creates.set(id, value);
|
|
134
|
+
} else if (path.length === 0) {
|
|
135
|
+
if (valueAtPath) {
|
|
136
|
+
updates.set(id, valueAtPath);
|
|
137
|
+
} else if (prevAtPath) {
|
|
138
|
+
deletes.add(prevAtPath == null ? void 0 : prevAtPath.id);
|
|
139
|
+
}
|
|
140
|
+
} else {
|
|
141
|
+
updates.set(id, Object.assign(updates.get(id) || { id }, value));
|
|
113
142
|
}
|
|
143
|
+
} else {
|
|
144
|
+
console.error("[legend-state]: added synced item without an id");
|
|
145
|
+
}
|
|
146
|
+
} else if (path.length === 0) {
|
|
147
|
+
const id = prevAtPath == null ? void 0 : prevAtPath.id;
|
|
148
|
+
if (id) {
|
|
149
|
+
deletes.add(id);
|
|
150
|
+
}
|
|
114
151
|
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
const
|
|
120
|
-
const
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
}
|
|
134
|
-
else if (path.length === 0) {
|
|
135
|
-
if (valueAtPath) {
|
|
136
|
-
updates.set(id, valueAtPath);
|
|
137
|
-
}
|
|
138
|
-
else if (prevAtPath) {
|
|
139
|
-
deletes.add(prevAtPath === null || prevAtPath === void 0 ? void 0 : prevAtPath.id);
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
else {
|
|
143
|
-
updates.set(id, Object.assign(updates.get(id) || { id }, value));
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
else {
|
|
147
|
-
console.error('[legend-state]: added synced item without an id');
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
else if (path.length === 0) {
|
|
151
|
-
const id = prevAtPath === null || prevAtPath === void 0 ? void 0 : prevAtPath.id;
|
|
152
|
-
if (id) {
|
|
153
|
-
deletes.add(id);
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
else {
|
|
158
|
-
let itemsChanged = undefined;
|
|
159
|
-
if (path.length === 0) {
|
|
160
|
-
// Do a deep equal of each element vs its previous element to see which have changed
|
|
161
|
-
itemsChanged = (asMap
|
|
162
|
-
? Array.from(valueAtPath.entries())
|
|
163
|
-
: Object.entries(valueAtPath)).filter(([key, value]) => {
|
|
164
|
-
const prev = asMap ? prevAtPath.get(key) : prevAtPath[key];
|
|
165
|
-
const isDiff = !prevAtPath || !sync.deepEqual(value, prev);
|
|
166
|
-
return isDiff;
|
|
167
|
-
});
|
|
168
|
-
}
|
|
169
|
-
else {
|
|
170
|
-
const itemKey = path[0];
|
|
171
|
-
const itemValue = asMap ? value.get(itemKey) : value[itemKey];
|
|
172
|
-
if (!itemValue) {
|
|
173
|
-
if (path.length === 1 && prevAtPath) {
|
|
174
|
-
deletes.add(itemKey);
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
else {
|
|
178
|
-
itemsChanged = [[itemKey, itemValue]];
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
itemsChanged === null || itemsChanged === void 0 ? void 0 : itemsChanged.forEach(([itemKey, item]) => {
|
|
182
|
-
if (state.isNullOrUndefined(item)) {
|
|
183
|
-
deletes.add(itemKey);
|
|
184
|
-
}
|
|
185
|
-
else {
|
|
186
|
-
const prev = asMap ? valuePrevious.get(itemKey) : valuePrevious[itemKey];
|
|
187
|
-
const isCreate = fieldCreatedAt
|
|
188
|
-
? !item[fieldCreatedAt]
|
|
189
|
-
: fieldUpdatedAt
|
|
190
|
-
? !item[fieldUpdatedAt]
|
|
191
|
-
: state.isNullOrUndefined(prev);
|
|
192
|
-
if (isCreate) {
|
|
193
|
-
if (generateId) {
|
|
194
|
-
ensureId(item, generateId);
|
|
195
|
-
}
|
|
196
|
-
if (!item.id) {
|
|
197
|
-
console.error('[legend-state]: added item without an id');
|
|
198
|
-
}
|
|
199
|
-
if (createFn) {
|
|
200
|
-
creates.set(item.id, item);
|
|
201
|
-
}
|
|
202
|
-
else {
|
|
203
|
-
console.log('[legend-state] missing create function');
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
else {
|
|
207
|
-
if (updateFn) {
|
|
208
|
-
updates.set(item.id, item);
|
|
209
|
-
}
|
|
210
|
-
else {
|
|
211
|
-
console.log('[legend-state] missing update function');
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
});
|
|
216
|
-
}
|
|
217
|
-
});
|
|
218
|
-
const saveResult = async (itemKey, input, data, isCreate) => {
|
|
219
|
-
if (data && (onSaved || onSavedUpdate)) {
|
|
220
|
-
const saved = ((transform === null || transform === void 0 ? void 0 : transform.load) ? transform.load(data, 'set') : data);
|
|
221
|
-
const isChild = itemKey !== 'undefined' && asType !== 'value';
|
|
222
|
-
const currentPeeked = state.getNodeValue(node);
|
|
223
|
-
const currentValue = isChild ? currentPeeked === null || currentPeeked === void 0 ? void 0 : currentPeeked[itemKey] : currentPeeked;
|
|
224
|
-
const dataOnSaved = {
|
|
225
|
-
saved,
|
|
226
|
-
input,
|
|
227
|
-
currentValue,
|
|
228
|
-
isCreate,
|
|
229
|
-
props,
|
|
230
|
-
};
|
|
231
|
-
let savedOut = undefined;
|
|
232
|
-
if (onSavedUpdate) {
|
|
233
|
-
savedOut = onSavedCreatedUpdatedAt(onSavedUpdate, dataOnSaved);
|
|
234
|
-
}
|
|
235
|
-
if (onSaved) {
|
|
236
|
-
const ret = onSaved(dataOnSaved);
|
|
237
|
-
if (ret) {
|
|
238
|
-
savedOut = ret;
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
if (savedOut) {
|
|
242
|
-
const createdAt = fieldCreatedAt ? savedOut[fieldCreatedAt] : undefined;
|
|
243
|
-
const updatedAt = fieldUpdatedAt ? savedOut[fieldUpdatedAt] : undefined;
|
|
244
|
-
const value = itemKey !== 'undefined' && asType !== 'value' ? { [itemKey]: savedOut } : savedOut;
|
|
245
|
-
update({
|
|
246
|
-
value,
|
|
247
|
-
lastSync: updatedAt || createdAt ? +new Date(updatedAt || createdAt) : undefined,
|
|
248
|
-
mode: 'merge',
|
|
249
|
-
});
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
};
|
|
253
|
-
return Promise.all([
|
|
254
|
-
...Array.from(creates).map(([itemKey, itemValue]) => {
|
|
255
|
-
const createObj = transformOut(itemValue, transform === null || transform === void 0 ? void 0 : transform.save);
|
|
256
|
-
return createFn(createObj, params).then((result) => saveResult(itemKey, createObj, result, true));
|
|
257
|
-
}),
|
|
258
|
-
...Array.from(updates).map(([itemKey, itemValue]) => {
|
|
259
|
-
const toSave = updatePartial
|
|
260
|
-
? Object.assign(sync.diffObjects(asType === 'value' ? valuePrevious : valuePrevious[itemKey], itemValue), { id: itemValue.id })
|
|
261
|
-
: itemValue;
|
|
262
|
-
const changed = transformOut(toSave, transform === null || transform === void 0 ? void 0 : transform.save);
|
|
263
|
-
if (Object.keys(changed).length > 0) {
|
|
264
|
-
return updateFn(changed, params).then((result) => result && saveResult(itemKey, changed, result, false));
|
|
265
|
-
}
|
|
266
|
-
}),
|
|
267
|
-
...Array.from(deletes).map((id) => {
|
|
268
|
-
if (deleteFn) {
|
|
269
|
-
deleteFn({ id }, params);
|
|
270
|
-
}
|
|
271
|
-
else if (fieldDeleted && updateFn) {
|
|
272
|
-
updateFn({ id, [fieldDeleted]: true }, params);
|
|
273
|
-
}
|
|
274
|
-
else {
|
|
275
|
-
console.log('[legend-state] missing delete function');
|
|
276
|
-
}
|
|
277
|
-
}),
|
|
278
|
-
]);
|
|
152
|
+
} else {
|
|
153
|
+
let itemsChanged = void 0;
|
|
154
|
+
if (path.length === 0) {
|
|
155
|
+
itemsChanged = (asMap ? Array.from(valueAtPath.entries()) : Object.entries(valueAtPath)).filter(([key, value2]) => {
|
|
156
|
+
const prev = asMap ? prevAtPath.get(key) : prevAtPath[key];
|
|
157
|
+
const isDiff = !prevAtPath || !sync.deepEqual(value2, prev);
|
|
158
|
+
return isDiff;
|
|
159
|
+
});
|
|
160
|
+
} else {
|
|
161
|
+
const itemKey = path[0];
|
|
162
|
+
const itemValue = asMap ? value.get(itemKey) : value[itemKey];
|
|
163
|
+
if (!itemValue) {
|
|
164
|
+
if (path.length === 1 && prevAtPath) {
|
|
165
|
+
deletes.add(itemKey);
|
|
166
|
+
}
|
|
167
|
+
} else {
|
|
168
|
+
itemsChanged = [[itemKey, itemValue]];
|
|
169
|
+
}
|
|
279
170
|
}
|
|
280
|
-
:
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
171
|
+
itemsChanged == null ? void 0 : itemsChanged.forEach(([itemKey, item]) => {
|
|
172
|
+
if (state.isNullOrUndefined(item)) {
|
|
173
|
+
deletes.add(itemKey);
|
|
174
|
+
} else {
|
|
175
|
+
const prev = asMap ? valuePrevious.get(itemKey) : valuePrevious[itemKey];
|
|
176
|
+
const isCreate = fieldCreatedAt ? !item[fieldCreatedAt] : fieldUpdatedAt ? !item[fieldUpdatedAt] : state.isNullOrUndefined(prev);
|
|
177
|
+
if (isCreate) {
|
|
178
|
+
if (generateId) {
|
|
179
|
+
ensureId(item, generateId);
|
|
180
|
+
}
|
|
181
|
+
if (!item.id) {
|
|
182
|
+
console.error("[legend-state]: added item without an id");
|
|
183
|
+
}
|
|
184
|
+
if (createFn) {
|
|
185
|
+
creates.set(item.id, item);
|
|
186
|
+
} else {
|
|
187
|
+
console.log("[legend-state] missing create function");
|
|
188
|
+
}
|
|
189
|
+
} else {
|
|
190
|
+
if (updateFn) {
|
|
191
|
+
updates.set(item.id, item);
|
|
192
|
+
} else {
|
|
193
|
+
console.log("[legend-state] missing update function");
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
}
|
|
286
199
|
});
|
|
200
|
+
const saveResult = async (itemKey, input, data, isCreate) => {
|
|
201
|
+
if (data && (onSaved || onSavedUpdate)) {
|
|
202
|
+
const saved = (transform == null ? void 0 : transform.load) ? transform.load(data, "set") : data;
|
|
203
|
+
const isChild = itemKey !== "undefined" && asType !== "value";
|
|
204
|
+
const currentPeeked = state.getNodeValue(node);
|
|
205
|
+
const currentValue = isChild ? currentPeeked == null ? void 0 : currentPeeked[itemKey] : currentPeeked;
|
|
206
|
+
const dataOnSaved = {
|
|
207
|
+
saved,
|
|
208
|
+
input,
|
|
209
|
+
currentValue,
|
|
210
|
+
isCreate,
|
|
211
|
+
props
|
|
212
|
+
};
|
|
213
|
+
let savedOut = void 0;
|
|
214
|
+
if (onSavedUpdate) {
|
|
215
|
+
savedOut = onSavedCreatedUpdatedAt(onSavedUpdate, dataOnSaved);
|
|
216
|
+
}
|
|
217
|
+
if (onSaved) {
|
|
218
|
+
const ret = onSaved(dataOnSaved);
|
|
219
|
+
if (ret) {
|
|
220
|
+
savedOut = ret;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
if (savedOut) {
|
|
224
|
+
const createdAt = fieldCreatedAt ? savedOut[fieldCreatedAt] : void 0;
|
|
225
|
+
const updatedAt = fieldUpdatedAt ? savedOut[fieldUpdatedAt] : void 0;
|
|
226
|
+
const value2 = itemKey !== "undefined" && asType !== "value" ? { [itemKey]: savedOut } : savedOut;
|
|
227
|
+
update({
|
|
228
|
+
value: value2,
|
|
229
|
+
lastSync: updatedAt || createdAt ? +new Date(updatedAt || createdAt) : void 0,
|
|
230
|
+
mode: "merge"
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
};
|
|
235
|
+
return Promise.all([
|
|
236
|
+
...Array.from(creates).map(([itemKey, itemValue]) => {
|
|
237
|
+
const createObj = transformOut(itemValue, transform == null ? void 0 : transform.save);
|
|
238
|
+
return createFn(createObj, params).then(
|
|
239
|
+
(result) => saveResult(itemKey, createObj, result, true)
|
|
240
|
+
);
|
|
241
|
+
}),
|
|
242
|
+
...Array.from(updates).map(([itemKey, itemValue]) => {
|
|
243
|
+
const toSave = updatePartial ? Object.assign(
|
|
244
|
+
sync.diffObjects(asType === "value" ? valuePrevious : valuePrevious[itemKey], itemValue),
|
|
245
|
+
{ id: itemValue.id }
|
|
246
|
+
) : itemValue;
|
|
247
|
+
const changed = transformOut(toSave, transform == null ? void 0 : transform.save);
|
|
248
|
+
if (Object.keys(changed).length > 0) {
|
|
249
|
+
return updateFn(changed, params).then(
|
|
250
|
+
(result) => result && saveResult(itemKey, changed, result, false)
|
|
251
|
+
);
|
|
252
|
+
}
|
|
253
|
+
}),
|
|
254
|
+
...Array.from(deletes).map((id) => {
|
|
255
|
+
if (deleteFn) {
|
|
256
|
+
deleteFn({ id }, params);
|
|
257
|
+
} else if (fieldDeleted && updateFn) {
|
|
258
|
+
updateFn({ id, [fieldDeleted]: true }, params);
|
|
259
|
+
} else {
|
|
260
|
+
console.log("[legend-state] missing delete function");
|
|
261
|
+
}
|
|
262
|
+
})
|
|
263
|
+
]);
|
|
264
|
+
} : void 0;
|
|
265
|
+
return sync.synced({
|
|
266
|
+
set,
|
|
267
|
+
get,
|
|
268
|
+
mode: modeParam,
|
|
269
|
+
...rest
|
|
270
|
+
});
|
|
287
271
|
}
|
|
288
272
|
|
|
289
273
|
exports.syncedCrud = syncedCrud;
|
|
290
|
-
//# sourceMappingURL=crud.js.map
|