@legendapp/state 3.0.0-alpha.2 → 3.0.0-alpha.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/CHANGELOG.md +831 -1
  2. package/LICENSE +21 -1
  3. package/README.md +141 -1
  4. package/babel.js +0 -2
  5. package/babel.mjs +0 -2
  6. package/helpers/trackHistory.js +2 -2
  7. package/helpers/trackHistory.mjs +2 -2
  8. package/index.d.mts +45 -32
  9. package/index.d.ts +45 -32
  10. package/index.js +234 -156
  11. package/index.mjs +234 -156
  12. package/package.json +6 -1
  13. package/persist-plugins/async-storage.d.mts +2 -2
  14. package/persist-plugins/async-storage.d.ts +2 -2
  15. package/persist-plugins/indexeddb.js +1 -1
  16. package/persist-plugins/indexeddb.mjs +1 -1
  17. package/react.d.mts +17 -14
  18. package/react.d.ts +17 -14
  19. package/react.js +55 -30
  20. package/react.mjs +56 -31
  21. package/sync-plugins/_transformObjectFields.d.mts +31 -0
  22. package/sync-plugins/_transformObjectFields.d.ts +31 -0
  23. package/sync-plugins/_transformObjectFields.js +114 -0
  24. package/sync-plugins/_transformObjectFields.mjs +110 -0
  25. package/sync-plugins/crud.d.mts +14 -23
  26. package/sync-plugins/crud.d.ts +14 -23
  27. package/sync-plugins/crud.js +194 -129
  28. package/sync-plugins/crud.mjs +195 -130
  29. package/sync-plugins/firebase.d.mts +26 -0
  30. package/sync-plugins/firebase.d.ts +26 -0
  31. package/sync-plugins/firebase.js +365 -0
  32. package/sync-plugins/firebase.mjs +360 -0
  33. package/sync-plugins/keel.d.mts +24 -8
  34. package/sync-plugins/keel.d.ts +24 -8
  35. package/sync-plugins/keel.js +32 -16
  36. package/sync-plugins/keel.mjs +32 -16
  37. package/sync-plugins/supabase.d.mts +1 -1
  38. package/sync-plugins/supabase.d.ts +1 -1
  39. package/sync-plugins/supabase.js +5 -4
  40. package/sync-plugins/supabase.mjs +6 -5
  41. package/sync-plugins/tanstack-query.d.mts +2 -2
  42. package/sync-plugins/tanstack-query.d.ts +2 -2
  43. package/sync-plugins/tanstack-query.js +3 -2
  44. package/sync-plugins/tanstack-query.mjs +3 -2
  45. package/sync-plugins/tanstack-react-query.d.mts +1 -1
  46. package/sync-plugins/tanstack-react-query.d.ts +1 -1
  47. package/sync.d.mts +38 -185
  48. package/sync.d.ts +38 -185
  49. package/sync.js +354 -296
  50. package/sync.mjs +356 -297
  51. package/types/babel.d.ts +12 -1
  52. package/.DS_Store +0 -0
  53. /package/config/{enable_GetSet.d.mts → enable$GetSet.d.mts} +0 -0
  54. /package/config/{enable_GetSet.d.ts → enable$GetSet.d.ts} +0 -0
@@ -59,9 +59,9 @@ function configureSyncedKeel(config) {
59
59
  const oldFn = queries[key];
60
60
  queries[key] = (i) => {
61
61
  const realtimeKey = [key, ...Object.values(i.where || {})].filter((value) => value && typeof value !== "object").join("/");
62
- const subscribe = ({ refresh }) => {
62
+ const subscribe = (params) => {
63
63
  if (realtimeKey) {
64
- return realtimePlugin.subscribe(realtimeKey, refresh);
64
+ return realtimePlugin.subscribe(realtimeKey, params);
65
65
  }
66
66
  };
67
67
  return oldFn(i).then((ret) => {
@@ -122,7 +122,9 @@ function syncedKeel(props) {
122
122
  first,
123
123
  where: whereParam,
124
124
  waitFor,
125
+ waitForSet,
125
126
  fieldDeleted,
127
+ mode,
126
128
  ...rest
127
129
  } = props;
128
130
  const { changesSince } = props;
@@ -131,8 +133,15 @@ function syncedKeel(props) {
131
133
  const subscribeFnKey$ = observable("");
132
134
  const fieldCreatedAt = "createdAt";
133
135
  const fieldUpdatedAt = "updatedAt";
136
+ const setupSubscribe = (doSubscribe, subscribeKey, lastSync) => {
137
+ subscribeFn = doSubscribe;
138
+ subscribeFnKey$.set(subscribeKey);
139
+ if (realtimePlugin && lastSync) {
140
+ realtimePlugin.setLatestChange(subscribeKey, new Date(lastSync));
141
+ }
142
+ };
134
143
  const list = listParam ? async (listParams) => {
135
- const { lastSync, refresh } = listParams;
144
+ const { lastSync } = listParams;
136
145
  const queryBySync = !!lastSync && changesSince === "last-sync";
137
146
  const where = Object.assign(
138
147
  queryBySync ? { updatedAt: { after: new Date(lastSync + 1) } } : {},
@@ -141,8 +150,7 @@ function syncedKeel(props) {
141
150
  const params = { where, first };
142
151
  const { results, subscribe: subscribe2, subscribeKey } = await getAllPages(listParam, params);
143
152
  if (subscribe2) {
144
- subscribeFn = () => subscribe2({ refresh });
145
- subscribeFnKey$.set(subscribeKey);
153
+ setupSubscribe(() => subscribe2(listParams), subscribeKey, lastSync);
146
154
  }
147
155
  return results;
148
156
  } : void 0;
@@ -150,8 +158,7 @@ function syncedKeel(props) {
150
158
  const { refresh } = getParams;
151
159
  const { data, error, subscribe: subscribe2, subscribeKey } = await getParam({ refresh });
152
160
  if (subscribe2) {
153
- subscribeFn = () => subscribe2({ refresh });
154
- subscribeFnKey$.set(subscribeKey);
161
+ setupSubscribe(() => subscribe2(getParams), subscribeKey);
155
162
  }
156
163
  if (error) {
157
164
  throw new Error(error.message);
@@ -170,19 +177,27 @@ function syncedKeel(props) {
170
177
  }
171
178
  }
172
179
  };
173
- const handleSetError = async (error, params, isCreate) => {
180
+ const handleSetError = async (error, params, input, fn, from) => {
174
181
  var _a, _b, _c;
175
182
  const { retryNum, cancelRetry, update: update2 } = params;
176
- if (isCreate && ((_a = error.message) == null ? void 0 : _a.includes("for the unique")) && ((_b = error.message) == null ? void 0 : _b.includes("must be unique"))) {
183
+ if (from === "create" && ((_a = error.message) == null ? void 0 : _a.includes("for the unique")) && ((_b = error.message) == null ? void 0 : _b.includes("must be unique"))) {
177
184
  if (__DEV__) {
178
185
  console.log("Creating duplicate data already saved, just ignore.");
179
186
  }
187
+ cancelRetry();
180
188
  update2({
181
189
  value: {},
182
190
  mode: "assign"
183
191
  });
192
+ } else if (from === "delete") {
193
+ if (error.message === "record not found") {
194
+ if (__DEV__) {
195
+ console.log("Deleting non-existing data, just ignore.");
196
+ }
197
+ cancelRetry();
198
+ }
184
199
  } else if (error.type === "bad_request") {
185
- (_c = keelConfig.onError) == null ? void 0 : _c.call(keelConfig, error);
200
+ (_c = keelConfig.onError) == null ? void 0 : _c.call(keelConfig, { error, params, input, type: from, action: fn.name || fn.toString() });
186
201
  if (retryNum > 4) {
187
202
  cancelRetry();
188
203
  }
@@ -195,7 +210,7 @@ function syncedKeel(props) {
195
210
  const create = createParam ? async (input, params) => {
196
211
  const { data, error } = await createParam(convertObjectToCreate(input));
197
212
  if (error) {
198
- handleSetError(error, params, true);
213
+ await handleSetError(error, params, input, createParam, "create");
199
214
  }
200
215
  return data;
201
216
  } : void 0;
@@ -208,15 +223,15 @@ function syncedKeel(props) {
208
223
  if (!isEmpty(values)) {
209
224
  const { data, error } = await updateParam({ where: { id }, values });
210
225
  if (error) {
211
- handleSetError(error, params, false);
226
+ await handleSetError(error, params, input, updateParam, "update");
212
227
  }
213
228
  return data;
214
229
  }
215
230
  } : void 0;
216
- const deleteFn = deleteParam ? async ({ id }, params) => {
217
- const { data, error } = await deleteParam({ id });
231
+ const deleteFn = deleteParam ? async (value, params) => {
232
+ const { data, error } = await deleteParam({ id: value.id });
218
233
  if (error) {
219
- handleSetError(error, params, false);
234
+ await handleSetError(error, params, value, deleteParam, "delete");
220
235
  }
221
236
  return data;
222
237
  } : void 0;
@@ -232,13 +247,14 @@ function syncedKeel(props) {
232
247
  return syncedCrud({
233
248
  ...rest,
234
249
  as: asType,
250
+ mode: mode || "merge",
235
251
  list,
236
252
  create,
237
253
  update,
238
254
  delete: deleteFn,
239
255
  waitFor: () => isEnabled$.get() && (waitFor ? computeSelector(waitFor) : true),
256
+ waitForSet: (params) => isEnabled$.get() && (waitForSet ? isFunction(waitForSet) ? waitForSet(params) : waitForSet : true),
240
257
  onSaved,
241
- onSavedUpdate: "createdUpdatedAt",
242
258
  fieldCreatedAt,
243
259
  fieldUpdatedAt,
244
260
  fieldDeleted: fieldDeleted || "deleted",
@@ -24,7 +24,7 @@ interface SyncedSupabaseProps<Client extends SupabaseClient, Collection extends
24
24
  supabase: Client;
25
25
  collection: Collection;
26
26
  select?: (query: PostgrestQueryBuilder<SupabaseSchemaOf<Client>, SupabaseTableOf<Client>[Collection], Collection>) => PostgrestFilterBuilder<SupabaseSchemaOf<Client>, TRemote, TRemote[], Collection, []>;
27
- filter?: (select: PostgrestFilterBuilder<SupabaseSchemaOf<Client>, TRemote, TRemote[], Collection, []>, params: SyncedGetParams) => PostgrestFilterBuilder<SupabaseSchemaOf<Client>, TRemote, TRemote[], Collection, []>;
27
+ filter?: (select: PostgrestFilterBuilder<SupabaseSchemaOf<Client>, TRemote, TRemote[], Collection, []>, params: SyncedGetParams<TRemote>) => PostgrestFilterBuilder<SupabaseSchemaOf<Client>, TRemote, TRemote[], Collection, []>;
28
28
  actions?: ('create' | 'read' | 'update' | 'delete')[];
29
29
  realtime?: boolean | {
30
30
  schema?: string;
@@ -24,7 +24,7 @@ interface SyncedSupabaseProps<Client extends SupabaseClient, Collection extends
24
24
  supabase: Client;
25
25
  collection: Collection;
26
26
  select?: (query: PostgrestQueryBuilder<SupabaseSchemaOf<Client>, SupabaseTableOf<Client>[Collection], Collection>) => PostgrestFilterBuilder<SupabaseSchemaOf<Client>, TRemote, TRemote[], Collection, []>;
27
- filter?: (select: PostgrestFilterBuilder<SupabaseSchemaOf<Client>, TRemote, TRemote[], Collection, []>, params: SyncedGetParams) => PostgrestFilterBuilder<SupabaseSchemaOf<Client>, TRemote, TRemote[], Collection, []>;
27
+ filter?: (select: PostgrestFilterBuilder<SupabaseSchemaOf<Client>, TRemote, TRemote[], Collection, []>, params: SyncedGetParams<TRemote>) => PostgrestFilterBuilder<SupabaseSchemaOf<Client>, TRemote, TRemote[], Collection, []>;
28
28
  actions?: ('create' | 'read' | 'update' | 'delete')[];
29
29
  realtime?: boolean | {
30
30
  schema?: string;
@@ -36,6 +36,7 @@ function syncedSupabase(props) {
36
36
  waitFor,
37
37
  waitForSet,
38
38
  generateId,
39
+ mode,
39
40
  ...rest
40
41
  } = props;
41
42
  const fieldCreatedAt = fieldCreatedAtParam || (changesSince === "last-sync" ? "created_at" : void 0);
@@ -101,7 +102,7 @@ function syncedSupabase(props) {
101
102
  const valueDate = +new Date(valueDateStr);
102
103
  if (valueDateStr && (!curDateStr || valueDate > +new Date(curDateStr))) {
103
104
  update2({
104
- value: { [value.id]: value },
105
+ value: [value],
105
106
  lastSync: valueDate,
106
107
  mode: "merge"
107
108
  });
@@ -109,7 +110,7 @@ function syncedSupabase(props) {
109
110
  } else if (eventType === "DELETE") {
110
111
  const { id } = old;
111
112
  update2({
112
- value: { [id]: state.symbolDelete }
113
+ value: [{ [id]: state.symbolDelete }]
113
114
  });
114
115
  }
115
116
  }
@@ -123,6 +124,7 @@ function syncedSupabase(props) {
123
124
  }
124
125
  return crud.syncedCrud({
125
126
  ...rest,
127
+ mode: mode || "merge",
126
128
  list,
127
129
  create,
128
130
  update,
@@ -132,11 +134,10 @@ function syncedSupabase(props) {
132
134
  fieldUpdatedAt,
133
135
  fieldDeleted,
134
136
  updatePartial: false,
135
- onSavedUpdate: "createdUpdatedAt",
136
137
  transform,
137
138
  generateId,
138
139
  waitFor: () => isEnabled$.get() && (waitFor ? state.computeSelector(waitFor) : true),
139
- waitForSet
140
+ waitForSet: (params) => isEnabled$.get() && (waitForSet ? state.isFunction(waitForSet) ? waitForSet(params) : waitForSet : true)
140
141
  });
141
142
  }
142
143
 
@@ -1,4 +1,4 @@
1
- import { observable, computeSelector, isObject, symbolDelete } from '@legendapp/state';
1
+ import { observable, computeSelector, isFunction, isObject, symbolDelete } from '@legendapp/state';
2
2
  import { removeNullUndefined, transformStringifyDates, combineTransforms } from '@legendapp/state/sync';
3
3
  import { syncedCrud } from '@legendapp/state/sync-plugins/crud';
4
4
 
@@ -34,6 +34,7 @@ function syncedSupabase(props) {
34
34
  waitFor,
35
35
  waitForSet,
36
36
  generateId,
37
+ mode,
37
38
  ...rest
38
39
  } = props;
39
40
  const fieldCreatedAt = fieldCreatedAtParam || (changesSince === "last-sync" ? "created_at" : void 0);
@@ -99,7 +100,7 @@ function syncedSupabase(props) {
99
100
  const valueDate = +new Date(valueDateStr);
100
101
  if (valueDateStr && (!curDateStr || valueDate > +new Date(curDateStr))) {
101
102
  update2({
102
- value: { [value.id]: value },
103
+ value: [value],
103
104
  lastSync: valueDate,
104
105
  mode: "merge"
105
106
  });
@@ -107,7 +108,7 @@ function syncedSupabase(props) {
107
108
  } else if (eventType === "DELETE") {
108
109
  const { id } = old;
109
110
  update2({
110
- value: { [id]: symbolDelete }
111
+ value: [{ [id]: symbolDelete }]
111
112
  });
112
113
  }
113
114
  }
@@ -121,6 +122,7 @@ function syncedSupabase(props) {
121
122
  }
122
123
  return syncedCrud({
123
124
  ...rest,
125
+ mode: mode || "merge",
124
126
  list,
125
127
  create,
126
128
  update,
@@ -130,11 +132,10 @@ function syncedSupabase(props) {
130
132
  fieldUpdatedAt,
131
133
  fieldDeleted,
132
134
  updatePartial: false,
133
- onSavedUpdate: "createdUpdatedAt",
134
135
  transform,
135
136
  generateId,
136
137
  waitFor: () => isEnabled$.get() && (waitFor ? computeSelector(waitFor) : true),
137
- waitForSet
138
+ waitForSet: (params) => isEnabled$.get() && (waitForSet ? isFunction(waitForSet) ? waitForSet(params) : waitForSet : true)
138
139
  });
139
140
  }
140
141
 
@@ -4,11 +4,11 @@ import { QueryKey, QueryObserverOptions, QueryClient, MutationObserverOptions, D
4
4
  interface ObservableQueryOptions<TQueryFnData, TError, TData, TQueryKey extends QueryKey> extends Omit<QueryObserverOptions<TQueryFnData, TError, TData, TQueryKey>, 'queryKey'> {
5
5
  queryKey?: TQueryKey | (() => TQueryKey);
6
6
  }
7
- interface SyncedQueryParams<TQueryFnData, TError, TData, TQueryKey extends QueryKey> extends SyncedOptions<TData> {
7
+ interface SyncedQueryParams<TQueryFnData, TError, TData, TQueryKey extends QueryKey> extends Omit<SyncedOptions<TData>, 'get' | 'set'> {
8
8
  queryClient: QueryClient;
9
9
  query: ObservableQueryOptions<TQueryFnData, TError, TData, TQueryKey>;
10
10
  mutation?: MutationObserverOptions<TData, TError, void>;
11
11
  }
12
- declare function syncedQuery<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey>(params: SyncedQueryParams<TQueryFnData, TError, TData, TQueryKey>): NonNullable<TData>;
12
+ declare function syncedQuery<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey>(params: SyncedQueryParams<TQueryFnData, TError, TData, TQueryKey>): TData;
13
13
 
14
14
  export { type ObservableQueryOptions, type SyncedQueryParams, syncedQuery };
@@ -4,11 +4,11 @@ import { QueryKey, QueryObserverOptions, QueryClient, MutationObserverOptions, D
4
4
  interface ObservableQueryOptions<TQueryFnData, TError, TData, TQueryKey extends QueryKey> extends Omit<QueryObserverOptions<TQueryFnData, TError, TData, TQueryKey>, 'queryKey'> {
5
5
  queryKey?: TQueryKey | (() => TQueryKey);
6
6
  }
7
- interface SyncedQueryParams<TQueryFnData, TError, TData, TQueryKey extends QueryKey> extends SyncedOptions<TData> {
7
+ interface SyncedQueryParams<TQueryFnData, TError, TData, TQueryKey extends QueryKey> extends Omit<SyncedOptions<TData>, 'get' | 'set'> {
8
8
  queryClient: QueryClient;
9
9
  query: ObservableQueryOptions<TQueryFnData, TError, TData, TQueryKey>;
10
10
  mutation?: MutationObserverOptions<TData, TError, void>;
11
11
  }
12
- declare function syncedQuery<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey>(params: SyncedQueryParams<TQueryFnData, TError, TData, TQueryKey>): NonNullable<TData>;
12
+ declare function syncedQuery<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey>(params: SyncedQueryParams<TQueryFnData, TError, TData, TQueryKey>): TData;
13
13
 
14
14
  export { type ObservableQueryOptions, type SyncedQueryParams, syncedQuery };
@@ -6,7 +6,7 @@ var queryCore = require('@tanstack/query-core');
6
6
 
7
7
  // src/sync-plugins/tanstack-query.ts
8
8
  function syncedQuery(params) {
9
- const { query: options, mutation: mutationOptions, queryClient } = params;
9
+ const { query: options, mutation: mutationOptions, queryClient, ...rest } = params;
10
10
  const Observer = queryCore.QueryObserver;
11
11
  const defaultedOptions = queryClient.defaultQueryOptions(
12
12
  options
@@ -58,7 +58,8 @@ function syncedQuery(params) {
58
58
  return sync.synced({
59
59
  get,
60
60
  set,
61
- subscribe
61
+ subscribe,
62
+ ...rest
62
63
  });
63
64
  }
64
65
 
@@ -4,7 +4,7 @@ import { MutationObserver, QueryObserver, notifyManager } from '@tanstack/query-
4
4
 
5
5
  // src/sync-plugins/tanstack-query.ts
6
6
  function syncedQuery(params) {
7
- const { query: options, mutation: mutationOptions, queryClient } = params;
7
+ const { query: options, mutation: mutationOptions, queryClient, ...rest } = params;
8
8
  const Observer = QueryObserver;
9
9
  const defaultedOptions = queryClient.defaultQueryOptions(
10
10
  options
@@ -56,7 +56,8 @@ function syncedQuery(params) {
56
56
  return synced({
57
57
  get,
58
58
  set,
59
- subscribe
59
+ subscribe,
60
+ ...rest
60
61
  });
61
62
  }
62
63
 
@@ -3,6 +3,6 @@ import { DefaultError, QueryKey } from '@tanstack/query-core';
3
3
  import { Observable } from '@legendapp/state';
4
4
  import { Synced } from '@legendapp/state/sync';
5
5
 
6
- declare function useObservableSyncedQuery<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey>(params: SyncedQueryParams<TQueryFnData, TError, TData, TQueryKey>): Observable<NonNullable<Synced<TData>>>;
6
+ declare function useObservableSyncedQuery<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey>(params: SyncedQueryParams<TQueryFnData, TError, TData, TQueryKey>): Observable<Synced<TData>>;
7
7
 
8
8
  export { useObservableSyncedQuery };
@@ -3,6 +3,6 @@ import { DefaultError, QueryKey } from '@tanstack/query-core';
3
3
  import { Observable } from '@legendapp/state';
4
4
  import { Synced } from '@legendapp/state/sync';
5
5
 
6
- declare function useObservableSyncedQuery<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey>(params: SyncedQueryParams<TQueryFnData, TError, TData, TQueryKey>): Observable<NonNullable<Synced<TData>>>;
6
+ declare function useObservableSyncedQuery<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey>(params: SyncedQueryParams<TQueryFnData, TError, TData, TQueryKey>): Observable<Synced<TData>>;
7
7
 
8
8
  export { useObservableSyncedQuery };
package/sync.d.mts CHANGED
@@ -1,8 +1,7 @@
1
1
  import { MMKVConfiguration } from 'react-native-mmkv';
2
2
  import { AsyncStorageStatic } from '@react-native-async-storage/async-storage';
3
- import { ClassConstructor, GetMode, SetParams, NodeValue, UpdateFn, ObservableParam, LinkedOptions, RetryOptions, Change, Observable, ObservableSyncState, UpdateFnParams, Selector, TypeAtPath, ObservableState, RecordValue, ArrayValue } from '@legendapp/state';
3
+ import { ClassConstructor, NodeValue, ObservableParam, GetMode, SetParams, UpdateFn, LinkedOptions, RetryOptions, Change, Observable, ObservableSyncState, TypeAtPath, RecordValue, ArrayValue } from '@legendapp/state';
4
4
  import { SyncedOptionsGlobal as SyncedOptionsGlobal$1 } from '@legendapp/state/sync';
5
- import { DatabaseReference, Query } from 'firebase/database';
6
5
 
7
6
  interface PersistOptions<T = any> {
8
7
  name: string;
@@ -17,30 +16,34 @@ interface PersistOptions<T = any> {
17
16
  };
18
17
  options?: any;
19
18
  }
20
- interface SyncedGetParams {
19
+ interface SyncedGetSetSubscribeBaseParams<T = any> {
20
+ node: NodeValue;
21
+ value$: ObservableParam<T>;
22
+ refresh: () => void;
23
+ }
24
+ interface SyncedGetParams<T> extends SyncedGetSetSubscribeBaseParams<T> {
21
25
  value: any;
22
26
  lastSync: number | undefined;
23
27
  updateLastSync: (lastSync: number) => void;
24
28
  mode: GetMode;
25
- refresh: () => void;
29
+ retryNum: number;
30
+ cancelRetry: () => void;
31
+ onError: (error: Error) => void;
32
+ options: SyncedOptions;
26
33
  }
27
- interface SyncedSetParams<T> extends SetParams<T> {
28
- node: NodeValue;
29
- valuePrevious: T;
30
- update: UpdateFn;
31
- refresh: () => void;
34
+ interface SyncedSetParams<T> extends Pick<SetParams<T>, 'changes' | 'value'>, SyncedGetSetSubscribeBaseParams<T> {
35
+ update: UpdateFn<T>;
32
36
  cancelRetry: () => void;
33
37
  retryNum: number;
34
- fromSubscribe: boolean | undefined;
38
+ onError: (error: Error) => void;
35
39
  }
36
- interface SyncedSubscribeParams<T = any> {
37
- node: NodeValue;
38
- value$: ObservableParam<T>;
39
- update: UpdateFn;
40
- refresh: () => void;
40
+ interface SyncedSubscribeParams<T = any> extends SyncedGetSetSubscribeBaseParams<T> {
41
+ lastSync: number | undefined;
42
+ update: UpdateFn<T>;
43
+ onError: (error: Error) => void;
41
44
  }
42
45
  interface SyncedOptions<TRemote = any, TLocal = TRemote> extends Omit<LinkedOptions<TRemote>, 'get' | 'set'> {
43
- get?: (params: SyncedGetParams) => Promise<TRemote> | TRemote;
46
+ get?: (params: SyncedGetParams<TRemote>) => Promise<TRemote> | TRemote;
44
47
  set?: (params: SyncedSetParams<TRemote>) => void | Promise<any>;
45
48
  subscribe?: (params: SyncedSubscribeParams<TRemote>) => (() => void) | void;
46
49
  retry?: RetryOptions;
@@ -49,13 +52,18 @@ interface SyncedOptions<TRemote = any, TLocal = TRemote> extends Omit<LinkedOpti
49
52
  syncMode?: 'auto' | 'manual';
50
53
  mode?: GetMode;
51
54
  transform?: SyncTransform<TLocal, TRemote>;
52
- enableSync?: boolean;
53
- onGetError?: (error: Error) => void;
54
- onSetError?: (error: Error) => void;
55
- log?: (message?: any, ...optionalParams: any[]) => void;
55
+ onGetError?: (error: Error, getParams: SyncedGetParams<TRemote> | undefined, source: 'get' | 'subscribe') => void;
56
+ onSetError?: (error: Error, setParams: SyncedSetParams<TRemote>) => void;
57
+ onBeforeGet?: (params: {
58
+ value: TRemote;
59
+ lastSync: number | undefined;
60
+ pendingChanges: PendingChanges | undefined;
61
+ clearPendingChanges: () => Promise<void>;
62
+ resetCache: () => Promise<void>;
63
+ }) => void;
56
64
  onBeforeSet?: () => void;
57
65
  onAfterSet?: () => void;
58
- allowSetIfGetError?: boolean;
66
+ log?: (message?: any, ...optionalParams: any[]) => void;
59
67
  }
60
68
  interface SyncedOptionsGlobal<T = any> extends Omit<SyncedOptions<T>, 'get' | 'set' | 'persist' | 'initial' | 'waitForSet' | 'waitFor' | 'transform' | 'subscribe'> {
61
69
  persist?: ObservablePersistPluginOptions & Omit<PersistOptions, 'name' | 'transform' | 'options'>;
@@ -99,31 +107,9 @@ interface ObservableSyncSetParams<T> {
99
107
  options: SyncedOptions<T>;
100
108
  changes: Change[];
101
109
  value: T;
102
- valuePrevious: T;
103
- }
104
- interface ObservableSyncGetParams<T> {
105
- state: Observable<ObservableSyncState>;
106
- value$: ObservableParam<T>;
107
- options: SyncedOptions<T>;
108
- dateModified?: number;
109
- lastSync?: number;
110
- mode?: GetMode;
111
- onGet: () => void;
112
- onError: (error: Error) => void;
113
- onChange: (params: UpdateFnParams) => void | Promise<void>;
114
- }
115
- type ObservableSyncRemoteGetFnParams<T> = Omit<ObservableSyncGetParams<T>, 'onGet'>;
116
- interface ObservableSyncClass {
117
- get?<T>(params: ObservableSyncGetParams<T>): void;
118
- set?<T>(params: ObservableSyncSetParams<T>): void | Promise<void | {
119
- changes?: object;
120
- dateModified?: number;
121
- lastSync?: number;
122
- pathStrs?: string[];
123
- }>;
124
110
  }
125
111
  interface ObservableSyncFunctions<T = any> {
126
- get?(params: ObservableSyncRemoteGetFnParams<T>): T | Promise<T>;
112
+ get?(params: SyncedGetParams<T>): T | Promise<T>;
127
113
  set?(params: ObservableSyncSetParams<T>): void | Promise<void | {
128
114
  changes?: object | undefined;
129
115
  dateModified?: number;
@@ -136,146 +122,14 @@ interface SubscribeOptions {
136
122
  refresh: () => void;
137
123
  }
138
124
  type Synced<T> = T;
125
+ type PendingChanges = Record<string, {
126
+ p: any;
127
+ v?: any;
128
+ t: TypeAtPath[];
129
+ }>;
139
130
 
140
131
  declare function configureObservableSync(options?: SyncedOptionsGlobal$1): void;
141
132
 
142
- interface PersistTransform<TOrig = any, TSaved = TOrig> {
143
- load?: (value: TSaved) => TOrig | Promise<TOrig>;
144
- save?: (value: TOrig) => TSaved | Promise<TSaved>;
145
- }
146
- interface LegacyPersistOptionsLocal<T = any> {
147
- name: string;
148
- transform?: PersistTransform<T>;
149
- fieldTransforms?: FieldTransforms<T>;
150
- readonly?: boolean;
151
- mmkv?: MMKVConfiguration;
152
- indexedDB?: {
153
- prefixID?: string;
154
- itemID?: string;
155
- };
156
- options?: any;
157
- }
158
- type LegacyPersistOptionsRemote<T = any> = ObservablePersistenceConfigRemoteGlobalOptions & {
159
- readonly?: boolean;
160
- waitForGet?: Selector<any>;
161
- waitForSet?: LinkedOptions['waitForSet'];
162
- manual?: boolean;
163
- fieldTransforms?: FieldTransforms<T>;
164
- allowSetIfError?: boolean;
165
- transform?: PersistTransform<T>;
166
- firebase?: {
167
- refPath: (uid: string | undefined) => string;
168
- query?: (ref: DatabaseReference) => DatabaseReference | Query;
169
- queryByModified?: QueryByModified<T>;
170
- ignoreKeys?: string[];
171
- requireAuth?: boolean;
172
- mode?: 'once' | 'realtime';
173
- };
174
- offlineBehavior?: false | 'retry';
175
- changeTimeout?: number;
176
- metadataTimeout?: number;
177
- retry?: RetryOptions;
178
- onGetError?: (error: Error) => void;
179
- onSetError?: (error: Error) => void;
180
- log?: (message?: any, ...optionalParams: any[]) => void;
181
- onBeforeSet?: () => void;
182
- onSet?: () => void;
183
- };
184
- interface ObservablePersistenceConfigLocalGlobalOptions {
185
- onGetError?: (error: Error) => void;
186
- onSetError?: (error: Error) => void;
187
- indexedDB?: {
188
- databaseName: string;
189
- version: number;
190
- tableNames: string[];
191
- };
192
- asyncStorage?: {
193
- AsyncStorage: AsyncStorageStatic;
194
- preload?: boolean | string[];
195
- };
196
- }
197
- interface ObservablePersistenceConfigRemoteGlobalOptions {
198
- debounceSet?: number;
199
- dateModifiedKey?: string;
200
- offlineBehavior?: false | 'retry';
201
- retry?: RetryOptions;
202
- onGetError?: (error: Error) => void;
203
- onSetError?: (error: Error) => void;
204
- log?: (logLevel: 'verbose' | 'warning' | 'error', message: any, ...optionalParams: any[]) => void;
205
- onBeforeSet?: () => void;
206
- onAfterSet?: () => void;
207
- }
208
- interface ObservablePersistenceConfig {
209
- pluginLocal?: ClassConstructor<ObservablePersistPlugin>;
210
- pluginRemote?: ClassConstructor<ObservablePersistRemoteClass> | ObservablePersistRemoteFunctions;
211
- localOptions?: ObservablePersistenceConfigLocalGlobalOptions;
212
- remoteOptions?: ObservablePersistenceConfigRemoteGlobalOptions;
213
- }
214
- interface LegacyPersistOptions<T = any> {
215
- local?: string | LegacyPersistOptionsLocal<T>;
216
- remote?: LegacyPersistOptionsRemote<T>;
217
- pluginLocal?: ClassConstructor<ObservablePersistPlugin>;
218
- pluginRemote?: ClassConstructor<ObservablePersistRemoteClass> | ObservablePersistRemoteFunctions<T>;
219
- }
220
- interface ObservableOnChangeParams {
221
- value: unknown;
222
- path?: string[];
223
- pathTypes?: TypeAtPath[];
224
- mode?: GetMode;
225
- dateModified?: number | undefined;
226
- lastSync?: number | undefined;
227
- }
228
- interface ObservablePersistRemoteSetParams<T> {
229
- syncState: Observable<ObservablePersistState>;
230
- obs: ObservableParam<T>;
231
- options: LegacyPersistOptions<T>;
232
- changes: Change[];
233
- value: T;
234
- }
235
- interface ObservablePersistRemoteGetParams<T> {
236
- state: Observable<ObservablePersistState>;
237
- obs: ObservableParam<T>;
238
- options: LegacyPersistOptions<T>;
239
- dateModified?: number;
240
- lastSync?: number;
241
- mode?: GetMode;
242
- onGet: () => void;
243
- onError: (error: Error) => void;
244
- onChange: (params: ObservableOnChangeParams) => void | Promise<void>;
245
- }
246
- type ObservablePersistRemoteGetFnParams<T> = Omit<ObservablePersistRemoteGetParams<T>, 'onGet'>;
247
- interface ObservablePersistRemoteClass {
248
- get?<T>(params: ObservablePersistRemoteGetParams<T>): void;
249
- set?<T>(params: ObservablePersistRemoteSetParams<T>): void | Promise<void | {
250
- changes?: object;
251
- dateModified?: number;
252
- lastSync?: number;
253
- pathStrs?: string[];
254
- }>;
255
- }
256
- interface ObservablePersistRemoteFunctions<T = any> {
257
- get?(params: ObservablePersistRemoteGetFnParams<T>): T | Promise<T>;
258
- set?(params: ObservablePersistRemoteSetParams<T>): void | Promise<void | {
259
- changes?: object | undefined;
260
- dateModified?: number;
261
- lastSync?: number;
262
- }>;
263
- }
264
- interface ObservablePersistStateBase {
265
- isLoadedLocal: boolean;
266
- isEnabledLocal: boolean;
267
- isEnabledRemote: boolean;
268
- dateModified?: number;
269
- lastSync?: number;
270
- syncCount?: number;
271
- clearLocal: () => Promise<void>;
272
- sync: () => Promise<void>;
273
- getPendingChanges: () => Record<string, {
274
- p: any;
275
- v?: any;
276
- }> | undefined;
277
- }
278
- type ObservablePersistState = ObservableState & ObservablePersistStateBase;
279
133
  declare type ObjectKeys<T> = Pick<T, {
280
134
  [K in keyof T]-?: K extends string ? T[K] extends Record<string, any> ? T[K] extends any[] ? never : K : never : never;
281
135
  }[keyof T]>;
@@ -333,8 +187,8 @@ declare function transformStringifyDates<TRemote extends Record<string, any>, TL
333
187
  declare function transformStringifyDates<TRemote extends Record<string, any>, Keys extends keyof TRemote = keyof TRemote>(...args: Keys[]): SyncTransform<TransformStringsToDates<TRemote, Keys>, TRemote>;
334
188
  declare function transformStringifyDates<TRemote extends Record<string, any>, TLocal extends Record<string, any> = TRemote>(...args: (keyof TRemote)[]): SyncTransform<TRemote, TLocal>;
335
189
 
336
- declare const mapSyncPlugins: WeakMap<ClassConstructor<ObservablePersistPlugin | ObservableSyncClass>, {
337
- plugin: ObservablePersistPlugin | ObservableSyncClass;
190
+ declare const mapSyncPlugins: WeakMap<ClassConstructor<ObservablePersistPlugin>, {
191
+ plugin: ObservablePersistPlugin;
338
192
  initialized: Observable<boolean>;
339
193
  }>;
340
194
  declare function onChangeRemote(cb: () => void): void;
@@ -343,9 +197,8 @@ declare function syncObservable<T>(obs$: ObservableParam<T>, syncOptions: Synced
343
197
 
344
198
  declare function synced<TRemote, TLocal = TRemote>(params: SyncedOptions<TRemote, TLocal> | (() => TRemote)): Synced<TLocal>;
345
199
 
346
- declare function isInRemoteChange(): boolean;
347
200
  declare const internal: {
348
201
  observableSyncConfiguration: SyncedOptionsGlobal;
349
202
  };
350
203
 
351
- export { type FieldTransforms, type FieldTransformsInner, type LegacyPersistOptions, type LegacyPersistOptionsLocal, type LegacyPersistOptionsRemote, type ObservableOnChangeParams, type ObservablePersistPlugin, type ObservablePersistPluginOptions, type ObservablePersistRemoteClass, type ObservablePersistRemoteFunctions, type ObservablePersistRemoteGetFnParams, type ObservablePersistRemoteGetParams, type ObservablePersistRemoteSetParams, type ObservablePersistState, type ObservablePersistStateBase, type ObservablePersistenceConfig, type ObservablePersistenceConfigLocalGlobalOptions, type ObservablePersistenceConfigRemoteGlobalOptions, type ObservableSyncClass, type ObservableSyncFunctions, type ObservableSyncGetParams, type ObservableSyncRemoteGetFnParams, type ObservableSyncSetParams, type PersistMetadata, type PersistOptions, type PersistTransform, type QueryByModified, type StringToDate, type SubscribeOptions, type SyncTransform, type SyncTransformMethod, type Synced, type SyncedGetParams, type SyncedOptions, type SyncedOptionsGlobal, type SyncedSetParams, type SyncedSubscribeParams, type TransformStringifyKeys, type TransformStringifyOptions, type TransformStringsToDates, combineTransforms, configureObservableSync, deepEqual, diffObjects, internal, isInRemoteChange, mapSyncPlugins, onChangeRemote, removeNullUndefined, syncObservable, synced, transformStringifyDates, transformStringifyKeys };
204
+ export { type FieldTransforms, type FieldTransformsInner, type ObservablePersistPlugin, type ObservablePersistPluginOptions, type ObservableSyncFunctions, type ObservableSyncSetParams, type PendingChanges, type PersistMetadata, type PersistOptions, type QueryByModified, type StringToDate, type SubscribeOptions, type SyncTransform, type SyncTransformMethod, type Synced, type SyncedGetParams, type SyncedGetSetSubscribeBaseParams, type SyncedOptions, type SyncedOptionsGlobal, type SyncedSetParams, type SyncedSubscribeParams, type TransformStringifyKeys, type TransformStringifyOptions, type TransformStringsToDates, combineTransforms, configureObservableSync, deepEqual, diffObjects, internal, mapSyncPlugins, onChangeRemote, removeNullUndefined, syncObservable, synced, transformStringifyDates, transformStringifyKeys };