@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.
- package/CHANGELOG.md +831 -1
- package/LICENSE +21 -1
- package/README.md +141 -1
- package/babel.js +0 -2
- package/babel.mjs +0 -2
- package/helpers/trackHistory.js +2 -2
- package/helpers/trackHistory.mjs +2 -2
- package/index.d.mts +45 -32
- package/index.d.ts +45 -32
- package/index.js +234 -156
- package/index.mjs +234 -156
- package/package.json +6 -1
- package/persist-plugins/async-storage.d.mts +2 -2
- package/persist-plugins/async-storage.d.ts +2 -2
- package/persist-plugins/indexeddb.js +1 -1
- package/persist-plugins/indexeddb.mjs +1 -1
- package/react.d.mts +17 -14
- package/react.d.ts +17 -14
- package/react.js +55 -30
- package/react.mjs +56 -31
- package/sync-plugins/_transformObjectFields.d.mts +31 -0
- package/sync-plugins/_transformObjectFields.d.ts +31 -0
- package/sync-plugins/_transformObjectFields.js +114 -0
- package/sync-plugins/_transformObjectFields.mjs +110 -0
- package/sync-plugins/crud.d.mts +14 -23
- package/sync-plugins/crud.d.ts +14 -23
- package/sync-plugins/crud.js +194 -129
- package/sync-plugins/crud.mjs +195 -130
- package/sync-plugins/firebase.d.mts +26 -0
- package/sync-plugins/firebase.d.ts +26 -0
- package/sync-plugins/firebase.js +365 -0
- package/sync-plugins/firebase.mjs +360 -0
- package/sync-plugins/keel.d.mts +24 -8
- package/sync-plugins/keel.d.ts +24 -8
- package/sync-plugins/keel.js +32 -16
- package/sync-plugins/keel.mjs +32 -16
- package/sync-plugins/supabase.d.mts +1 -1
- package/sync-plugins/supabase.d.ts +1 -1
- package/sync-plugins/supabase.js +5 -4
- package/sync-plugins/supabase.mjs +6 -5
- package/sync-plugins/tanstack-query.d.mts +2 -2
- package/sync-plugins/tanstack-query.d.ts +2 -2
- package/sync-plugins/tanstack-query.js +3 -2
- package/sync-plugins/tanstack-query.mjs +3 -2
- package/sync-plugins/tanstack-react-query.d.mts +1 -1
- package/sync-plugins/tanstack-react-query.d.ts +1 -1
- package/sync.d.mts +38 -185
- package/sync.d.ts +38 -185
- package/sync.js +354 -296
- package/sync.mjs +356 -297
- package/types/babel.d.ts +12 -1
- package/.DS_Store +0 -0
- /package/config/{enable_GetSet.d.mts → enable$GetSet.d.mts} +0 -0
- /package/config/{enable_GetSet.d.ts → enable$GetSet.d.ts} +0 -0
package/sync-plugins/keel.mjs
CHANGED
|
@@ -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 = (
|
|
62
|
+
const subscribe = (params) => {
|
|
63
63
|
if (realtimeKey) {
|
|
64
|
-
return realtimePlugin.subscribe(realtimeKey,
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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 (
|
|
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,
|
|
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,
|
|
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 (
|
|
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,
|
|
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;
|
package/sync-plugins/supabase.js
CHANGED
|
@@ -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:
|
|
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:
|
|
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>):
|
|
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>):
|
|
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<
|
|
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<
|
|
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,
|
|
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
|
|
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
|
-
|
|
29
|
+
retryNum: number;
|
|
30
|
+
cancelRetry: () => void;
|
|
31
|
+
onError: (error: Error) => void;
|
|
32
|
+
options: SyncedOptions;
|
|
26
33
|
}
|
|
27
|
-
interface SyncedSetParams<T> extends SetParams<T> {
|
|
28
|
-
|
|
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
|
-
|
|
38
|
+
onError: (error: Error) => void;
|
|
35
39
|
}
|
|
36
|
-
interface SyncedSubscribeParams<T = any> {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
|
337
|
-
plugin: ObservablePersistPlugin
|
|
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
|
|
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 };
|