@legendapp/state 3.0.0-alpha.9 → 3.0.0-beta.0

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 (86) hide show
  1. package/.DS_Store +0 -0
  2. package/config/configureLegendState.d.mts +13 -0
  3. package/config/configureLegendState.d.ts +13 -0
  4. package/config/configureLegendState.js +45 -0
  5. package/config/configureLegendState.mjs +43 -0
  6. package/config/enable$GetSet.js +2 -1
  7. package/config/enable$GetSet.mjs +2 -1
  8. package/config/enableReactTracking.js +2 -1
  9. package/config/enableReactTracking.mjs +2 -1
  10. package/config/enableReactUse.js +2 -1
  11. package/config/enableReactUse.mjs +2 -1
  12. package/config/enable_PeekAssign.js +2 -1
  13. package/config/enable_PeekAssign.mjs +2 -1
  14. package/helpers/trackHistory.js +2 -2
  15. package/helpers/trackHistory.mjs +2 -2
  16. package/index.d.mts +103 -79
  17. package/index.d.ts +103 -79
  18. package/index.js +326 -316
  19. package/index.mjs +323 -314
  20. package/package.json +36 -1
  21. package/persist-plugins/async-storage.d.mts +6 -3
  22. package/persist-plugins/async-storage.d.ts +6 -3
  23. package/persist-plugins/async-storage.js +8 -4
  24. package/persist-plugins/async-storage.mjs +8 -5
  25. package/persist-plugins/indexeddb.d.mts +6 -4
  26. package/persist-plugins/indexeddb.d.ts +6 -4
  27. package/persist-plugins/indexeddb.js +35 -15
  28. package/persist-plugins/indexeddb.mjs +35 -16
  29. package/persist-plugins/mmkv.d.mts +5 -1
  30. package/persist-plugins/mmkv.d.ts +5 -1
  31. package/persist-plugins/mmkv.js +10 -5
  32. package/persist-plugins/mmkv.mjs +10 -6
  33. package/react-reactive/enableReactComponents.d.mts +9 -0
  34. package/react-reactive/enableReactComponents.d.ts +9 -0
  35. package/react-reactive/enableReactComponents.js +19 -0
  36. package/react-reactive/enableReactComponents.mjs +17 -0
  37. package/react-reactive/enableReactNativeComponents.d.mts +22 -0
  38. package/react-reactive/enableReactNativeComponents.d.ts +22 -0
  39. package/react-reactive/enableReactNativeComponents.js +53 -0
  40. package/react-reactive/enableReactNativeComponents.mjs +51 -0
  41. package/react-reactive/enableReactive.d.mts +5 -0
  42. package/react-reactive/enableReactive.d.ts +5 -0
  43. package/react-reactive/enableReactive.js +24 -0
  44. package/react-reactive/enableReactive.mjs +22 -0
  45. package/react-reactive/enableReactive.native.d.mts +5 -0
  46. package/react-reactive/enableReactive.native.d.ts +5 -0
  47. package/react-reactive/enableReactive.native.js +58 -0
  48. package/react-reactive/enableReactive.native.mjs +56 -0
  49. package/react-reactive/enableReactive.web.d.mts +5 -0
  50. package/react-reactive/enableReactive.web.d.ts +5 -0
  51. package/react-reactive/enableReactive.web.js +58 -0
  52. package/react-reactive/enableReactive.web.mjs +56 -0
  53. package/react.d.mts +39 -34
  54. package/react.d.ts +39 -34
  55. package/react.js +39 -17
  56. package/react.mjs +39 -17
  57. package/sync-plugins/crud.d.mts +21 -23
  58. package/sync-plugins/crud.d.ts +21 -23
  59. package/sync-plugins/crud.js +224 -112
  60. package/sync-plugins/crud.mjs +226 -114
  61. package/sync-plugins/fetch.js +12 -8
  62. package/sync-plugins/fetch.mjs +13 -9
  63. package/sync-plugins/firebase.d.mts +27 -0
  64. package/sync-plugins/firebase.d.ts +27 -0
  65. package/sync-plugins/firebase.js +373 -0
  66. package/sync-plugins/firebase.mjs +368 -0
  67. package/sync-plugins/keel.d.mts +43 -26
  68. package/sync-plugins/keel.d.ts +43 -26
  69. package/sync-plugins/keel.js +145 -99
  70. package/sync-plugins/keel.mjs +147 -99
  71. package/sync-plugins/supabase.d.mts +19 -9
  72. package/sync-plugins/supabase.d.ts +19 -9
  73. package/sync-plugins/supabase.js +52 -21
  74. package/sync-plugins/supabase.mjs +53 -22
  75. package/sync-plugins/tanstack-query.d.mts +2 -2
  76. package/sync-plugins/tanstack-query.d.ts +2 -2
  77. package/sync-plugins/tanstack-query.js +22 -5
  78. package/sync-plugins/tanstack-query.mjs +22 -5
  79. package/sync-plugins/tanstack-react-query.d.mts +1 -1
  80. package/sync-plugins/tanstack-react-query.d.ts +1 -1
  81. package/sync-plugins/tanstack-react-query.js +8 -1
  82. package/sync-plugins/tanstack-react-query.mjs +8 -1
  83. package/sync.d.mts +74 -200
  84. package/sync.d.ts +74 -200
  85. package/sync.js +495 -281
  86. package/sync.mjs +500 -286
@@ -5,14 +5,25 @@ var sync = require('@legendapp/state/sync');
5
5
 
6
6
  // src/sync-plugins/crud.ts
7
7
  var { clone } = state.internal;
8
+ var { waitForSet } = sync.internal;
8
9
  function transformOut(data, transform) {
9
10
  return transform ? transform(clone(data)) : data;
10
11
  }
11
- function ensureId(obj, generateId) {
12
- if (!obj.id) {
13
- obj.id = generateId();
12
+ function ensureId(obj, fieldId, generateId) {
13
+ if (!obj[fieldId]) {
14
+ obj[fieldId] = generateId();
14
15
  }
15
- return obj.id;
16
+ return obj[fieldId];
17
+ }
18
+ function computeLastSync(data, fieldUpdatedAt, fieldCreatedAt) {
19
+ let newLastSync = 0;
20
+ for (let i = 0; i < data.length; i++) {
21
+ const updated = (fieldUpdatedAt ? data[i][fieldUpdatedAt] : 0) || (fieldCreatedAt ? data[i][fieldCreatedAt] : 0);
22
+ if (updated) {
23
+ newLastSync = Math.max(newLastSync, +new Date(updated));
24
+ }
25
+ }
26
+ return newLastSync;
16
27
  }
17
28
  function syncedCrud(props) {
18
29
  const {
@@ -22,167 +33,233 @@ function syncedCrud(props) {
22
33
  update: updateFn,
23
34
  delete: deleteFn,
24
35
  transform,
36
+ fieldId: fieldIdProp,
25
37
  fieldCreatedAt,
26
38
  fieldUpdatedAt,
27
39
  fieldDeleted,
40
+ fieldDeletedList,
28
41
  updatePartial,
42
+ subscribe: subscribeProp,
29
43
  onSaved,
30
44
  mode: modeParam,
31
45
  changesSince,
32
46
  generateId,
47
+ waitForSet: waitForSetParam,
33
48
  ...rest
34
49
  } = props;
50
+ const fieldId = fieldIdProp || "id";
51
+ const pendingCreates = /* @__PURE__ */ new Set();
35
52
  let asType = props.as;
36
53
  if (!asType) {
37
54
  asType = getFn ? "value" : "object";
38
55
  }
39
56
  const asMap = asType === "Map";
40
57
  const asArray = asType === "array";
41
- const get = getFn || listFn ? async (getParams) => {
58
+ const resultsToOutType = (results) => {
59
+ if (asType === "value") {
60
+ return results[0];
61
+ }
62
+ const out = asType === "array" ? [] : asMap ? /* @__PURE__ */ new Map() : {};
63
+ for (let i = 0; i < results.length; i++) {
64
+ let result = results[i];
65
+ const value = result;
66
+ if (value) {
67
+ result = fieldDeleted && result[fieldDeleted] || fieldDeletedList && result[fieldDeletedList] || result[state.symbolDelete] ? state.internal.symbolDelete : result;
68
+ if (asArray) {
69
+ out.push(result);
70
+ } else if (asMap) {
71
+ out.set(value[fieldId], result);
72
+ } else {
73
+ out[value[fieldId]] = result;
74
+ }
75
+ }
76
+ }
77
+ return out;
78
+ };
79
+ const transformRows = (data) => {
80
+ return Promise.all(
81
+ data.map(
82
+ (value) => (
83
+ // Skip transforming any children with symbolDelete or fieldDeleted because they'll get deleted by resultsToOutType
84
+ value[state.symbolDelete] || fieldDeleted && value[fieldDeleted] || fieldDeletedList && value[fieldDeletedList] ? value : transform.load(value, "get")
85
+ )
86
+ )
87
+ );
88
+ };
89
+ const get = getFn || listFn ? (getParams) => {
42
90
  const { updateLastSync, lastSync, value } = getParams;
43
91
  if (listFn) {
44
92
  const isLastSyncMode = changesSince === "last-sync";
45
93
  if (isLastSyncMode && lastSync) {
46
94
  getParams.mode = modeParam || (asType === "array" ? "append" : asType === "value" ? "set" : "assign");
47
95
  }
48
- const data = await listFn(getParams) || [];
49
- let newLastSync = 0;
50
- for (let i = 0; i < data.length; i++) {
51
- const updated = data[i][fieldUpdatedAt] || data[i][fieldCreatedAt];
52
- if (updated) {
53
- newLastSync = Math.max(newLastSync, +new Date(updated));
96
+ const listPromise = listFn(getParams);
97
+ const toOut = (transformed) => {
98
+ var _a;
99
+ if (asType === "value") {
100
+ return transformed.length > 0 ? transformed[0] : (_a = (isLastSyncMode && lastSync || fieldDeleted) && value) != null ? _a : null;
101
+ } else {
102
+ return resultsToOutType(transformed);
54
103
  }
55
- }
56
- if (newLastSync && newLastSync !== lastSync) {
57
- updateLastSync(newLastSync);
58
- }
59
- let transformed = data;
60
- if (transform == null ? void 0 : transform.load) {
61
- transformed = await Promise.all(data.map((value2) => transform.load(value2, "get")));
62
- }
63
- if (asType === "value") {
64
- return transformed.length > 0 ? transformed[0] : isLastSyncMode && lastSync && value || null;
65
- } else {
66
- const results = transformed.map(
67
- (result) => result[fieldDeleted] || result.__deleted ? state.internal.symbolDelete : result
68
- );
69
- const out = asType === "array" ? [] : asMap ? /* @__PURE__ */ new Map() : {};
70
- for (let i = 0; i < results.length; i++) {
71
- let result = results[i];
72
- result = result[fieldDeleted] || result.__deleted ? state.internal.symbolDelete : result;
73
- if (asArray) {
74
- out.push(result);
75
- } else if (asMap) {
76
- out.set(result.id, result);
77
- } else {
78
- out[result.id] = result;
104
+ };
105
+ const processResults = (data) => {
106
+ data || (data = []);
107
+ if (fieldUpdatedAt) {
108
+ const newLastSync = computeLastSync(data, fieldUpdatedAt, fieldCreatedAt);
109
+ if (newLastSync && newLastSync !== lastSync) {
110
+ updateLastSync(newLastSync);
79
111
  }
80
112
  }
81
- return out;
82
- }
83
- } else if (getFn) {
84
- const data = await getFn(getParams);
85
- let transformed = data;
86
- if (data) {
87
- const newLastSync = data[fieldUpdatedAt] || data[fieldCreatedAt];
88
- if (newLastSync && newLastSync !== lastSync) {
89
- updateLastSync(newLastSync);
90
- }
113
+ let transformed = data;
91
114
  if (transform == null ? void 0 : transform.load) {
92
- transformed = await transform.load(data, "get");
115
+ transformed = transformRows(data);
93
116
  }
94
- }
95
- return transformed;
117
+ return state.isPromise(transformed) ? transformed.then(toOut) : toOut(transformed);
118
+ };
119
+ return state.isPromise(listPromise) ? listPromise.then(processResults) : processResults(listPromise);
120
+ } else if (getFn) {
121
+ const dataPromise = getFn(getParams);
122
+ const processData = (data) => {
123
+ let transformed = data;
124
+ if (data) {
125
+ const newLastSync = data[fieldUpdatedAt] || data[fieldCreatedAt];
126
+ if (newLastSync && newLastSync !== lastSync) {
127
+ updateLastSync(newLastSync);
128
+ }
129
+ if (transform == null ? void 0 : transform.load) {
130
+ transformed = transform.load(data, "get");
131
+ }
132
+ }
133
+ return transformed;
134
+ };
135
+ return state.isPromise(dataPromise) ? dataPromise.then(processData) : processData(dataPromise);
96
136
  }
97
137
  } : void 0;
98
138
  const set = createFn || updateFn || deleteFn ? async (params) => {
99
- const { value, changes, update, retryAsCreate, valuePrevious, node } = params;
139
+ const { value, changes, update, retryAsCreate, node } = params;
100
140
  const creates = /* @__PURE__ */ new Map();
101
141
  const updates = /* @__PURE__ */ new Map();
102
142
  const deletes = /* @__PURE__ */ new Set();
103
- changes.forEach(({ path, prevAtPath, valueAtPath }) => {
143
+ const getUpdateValue = (itemValue, prev) => {
144
+ return updatePartial ? Object.assign(
145
+ sync.diffObjects(
146
+ prev,
147
+ itemValue,
148
+ /*deep*/
149
+ true
150
+ ),
151
+ itemValue[fieldId] ? { [fieldId]: itemValue[fieldId] } : {}
152
+ ) : itemValue;
153
+ };
154
+ changes.forEach((change) => {
155
+ const { path, prevAtPath, valueAtPath, pathTypes } = change;
104
156
  if (asType === "value") {
105
157
  if (value) {
106
- let id = value == null ? void 0 : value.id;
107
- const isCreate = fieldCreatedAt ? !value[fieldCreatedAt] : !prevAtPath;
158
+ let id = value == null ? void 0 : value[fieldId];
159
+ let isCreate = fieldCreatedAt ? !value[fieldCreatedAt] : !prevAtPath;
108
160
  if (!id && generateId) {
109
- id = ensureId(value, generateId);
161
+ id = ensureId(value, fieldId, generateId);
110
162
  }
111
163
  if (id) {
164
+ if (pendingCreates.has(id)) {
165
+ isCreate = false;
166
+ }
112
167
  if (isCreate || retryAsCreate) {
113
- creates.set(id, value);
168
+ if (createFn) {
169
+ creates.set(id, value);
170
+ } else {
171
+ console.warn("[legend-state] missing create function");
172
+ }
114
173
  } else if (path.length === 0) {
115
174
  if (valueAtPath) {
116
- updates.set(id, valueAtPath);
175
+ updates.set(id, getUpdateValue(valueAtPath, prevAtPath));
117
176
  } else if (prevAtPath) {
118
- deletes.add(prevAtPath == null ? void 0 : prevAtPath.id);
177
+ deletes.add(prevAtPath);
119
178
  }
120
- } else {
121
- updates.set(id, Object.assign(updates.get(id) || { id }, value));
179
+ } else if (!updates.has(id)) {
180
+ const previous = state.applyChanges(
181
+ clone(value),
182
+ changes,
183
+ /*applyPrevious*/
184
+ true
185
+ );
186
+ updates.set(id, getUpdateValue(value, previous));
122
187
  }
123
188
  } else {
124
189
  console.error("[legend-state]: added synced item without an id");
125
190
  }
126
191
  } else if (path.length === 0) {
127
- const id = prevAtPath == null ? void 0 : prevAtPath.id;
128
- if (id) {
129
- deletes.add(id);
130
- }
192
+ deletes.add(prevAtPath);
131
193
  }
132
194
  } else {
133
- let itemsChanged = void 0;
195
+ let itemsChanged = [];
134
196
  if (path.length === 0) {
135
- itemsChanged = (asMap ? Array.from(valueAtPath.entries()) : Object.entries(valueAtPath)).filter(([key, value2]) => {
197
+ const changed = asMap ? Array.from(valueAtPath.entries()) : Object.entries(valueAtPath);
198
+ for (let i = 0; i < changed.length; i++) {
199
+ const [key, value2] = changed[i];
136
200
  const prev = asMap ? prevAtPath.get(key) : prevAtPath[key];
137
- const isDiff = !prevAtPath || !sync.deepEqual(value2, prev);
138
- return isDiff;
139
- });
201
+ if (state.isNullOrUndefined(value2) && !state.isNullOrUndefined(prev)) {
202
+ deletes.add(prev);
203
+ return false;
204
+ } else {
205
+ const isDiff = !prevAtPath || !sync.deepEqual(value2, prev);
206
+ if (isDiff) {
207
+ itemsChanged.push([getUpdateValue(value2, prev), prev]);
208
+ }
209
+ }
210
+ }
140
211
  } else {
141
212
  const itemKey = path[0];
142
213
  const itemValue = asMap ? value.get(itemKey) : value[itemKey];
143
214
  if (!itemValue) {
144
215
  if (path.length === 1 && prevAtPath) {
145
- deletes.add(itemKey);
216
+ deletes.add(prevAtPath);
146
217
  }
147
218
  } else {
148
- itemsChanged = [[itemKey, itemValue]];
219
+ const previous = state.setAtPath(
220
+ clone(itemValue),
221
+ path.slice(1),
222
+ pathTypes.slice(1),
223
+ prevAtPath
224
+ );
225
+ itemsChanged = [[getUpdateValue(itemValue, previous), previous]];
149
226
  }
150
227
  }
151
- itemsChanged == null ? void 0 : itemsChanged.forEach(([itemKey, item]) => {
152
- if (state.isNullOrUndefined(item)) {
153
- deletes.add(itemKey);
228
+ itemsChanged == null ? void 0 : itemsChanged.forEach(([item, prev]) => {
229
+ const isCreate = !pendingCreates.has(item[fieldId]) && (fieldCreatedAt ? !item[fieldCreatedAt] && !(prev == null ? void 0 : prev[fieldCreatedAt]) : fieldUpdatedAt ? !item[fieldUpdatedAt] && !(prev == null ? void 0 : prev[fieldCreatedAt]) : state.isNullOrUndefined(prev));
230
+ if (isCreate) {
231
+ if (generateId) {
232
+ ensureId(item, fieldId, generateId);
233
+ }
234
+ if (!item[fieldId]) {
235
+ console.error("[legend-state]: added item without an id");
236
+ }
237
+ if (createFn) {
238
+ pendingCreates.add(item[fieldId]);
239
+ creates.set(item[fieldId], item);
240
+ } else {
241
+ console.warn("[legend-state] missing create function");
242
+ }
154
243
  } else {
155
- const prev = asMap ? valuePrevious.get(itemKey) : valuePrevious[itemKey];
156
- const isCreate = fieldCreatedAt ? !item[fieldCreatedAt] : fieldUpdatedAt ? !item[fieldUpdatedAt] : state.isNullOrUndefined(prev);
157
- if (isCreate) {
158
- if (generateId) {
159
- ensureId(item, generateId);
160
- }
161
- if (!item.id) {
162
- console.error("[legend-state]: added item without an id");
163
- }
164
- if (createFn) {
165
- creates.set(item.id, item);
166
- } else {
167
- console.log("[legend-state] missing create function");
168
- }
244
+ if (updateFn) {
245
+ updates.set(
246
+ item[fieldId],
247
+ updates.has(item[fieldId]) ? Object.assign(updates.get(item[fieldId]), item) : item
248
+ );
169
249
  } else {
170
- if (updateFn) {
171
- updates.set(item.id, item);
172
- } else {
173
- console.log("[legend-state] missing update function");
174
- }
250
+ console.warn("[legend-state] missing update function");
175
251
  }
176
252
  }
177
253
  });
178
254
  }
179
255
  });
180
256
  const saveResult = async (itemKey, input, data, isCreate) => {
257
+ var _a;
181
258
  if (data) {
182
- const saved = (transform == null ? void 0 : transform.load) ? transform.load(data, "set") : data;
259
+ const saved = (transform == null ? void 0 : transform.load) ? await transform.load(data, "set") : data;
183
260
  const isChild = itemKey !== "undefined" && asType !== "value";
184
261
  const currentPeeked = state.getNodeValue(node);
185
- const currentValue = isChild ? currentPeeked == null ? void 0 : currentPeeked[itemKey] : currentPeeked;
262
+ const currentValue = isChild ? (_a = asType === "array" && state.isArray(currentPeeked) ? currentPeeked.find((v) => v[fieldId] === itemKey) : void 0) != null ? _a : currentPeeked[itemKey] : currentPeeked;
186
263
  const dataOnSaved = {
187
264
  saved,
188
265
  input,
@@ -191,7 +268,7 @@ function syncedCrud(props) {
191
268
  props
192
269
  };
193
270
  let savedOut = saved;
194
- if (savedOut) {
271
+ if (savedOut && !state.isNullOrUndefined(currentValue)) {
195
272
  savedOut = clone(savedOut);
196
273
  Object.keys(savedOut).forEach((key) => {
197
274
  const i = input[key];
@@ -222,38 +299,73 @@ function syncedCrud(props) {
222
299
  }
223
300
  };
224
301
  return Promise.all([
225
- ...Array.from(creates).map(([itemKey, itemValue]) => {
226
- const createObj = transformOut(itemValue, transform == null ? void 0 : transform.save);
227
- return createFn(createObj, params).then(
228
- (result) => saveResult(itemKey, createObj, result, true)
229
- );
302
+ ...Array.from(creates).map(async ([itemKey, itemValue]) => {
303
+ if (waitForSetParam) {
304
+ await waitForSet(waitForSetParam, changes, itemValue, { type: "create" });
305
+ }
306
+ const createObj = await transformOut(itemValue, transform == null ? void 0 : transform.save);
307
+ return createFn(createObj, params).then((result) => {
308
+ return saveResult(itemKey, createObj, result, true);
309
+ }).finally(() => {
310
+ pendingCreates.delete(itemKey);
311
+ });
230
312
  }),
231
- ...Array.from(updates).map(([itemKey, itemValue]) => {
232
- const toSave = updatePartial ? Object.assign(
233
- sync.diffObjects(asType === "value" ? valuePrevious : valuePrevious[itemKey], itemValue),
234
- { id: itemValue.id }
235
- ) : itemValue;
236
- const changed = transformOut(toSave, transform == null ? void 0 : transform.save);
313
+ ...Array.from(updates).map(async ([itemKey, itemValue]) => {
314
+ if (waitForSetParam) {
315
+ await waitForSet(waitForSetParam, changes, itemValue, { type: "update" });
316
+ }
317
+ const toSave = itemValue;
318
+ const changed = await transformOut(toSave, transform == null ? void 0 : transform.save);
237
319
  if (Object.keys(changed).length > 0) {
238
320
  return updateFn(changed, params).then(
239
321
  (result) => result && saveResult(itemKey, changed, result, false)
240
322
  );
241
323
  }
242
324
  }),
243
- ...Array.from(deletes).map((id) => {
244
- if (deleteFn) {
245
- deleteFn({ id }, params);
246
- } else if (fieldDeleted && updateFn) {
247
- updateFn({ id, [fieldDeleted]: true }, params);
248
- } else {
249
- console.log("[legend-state] missing delete function");
325
+ ...Array.from(deletes).map(async (valuePrevious) => {
326
+ if (valuePrevious !== state.symbolDelete) {
327
+ if (waitForSetParam) {
328
+ await waitForSet(waitForSetParam, changes, valuePrevious, { type: "delete" });
329
+ }
330
+ if (deleteFn) {
331
+ deleteFn(valuePrevious, params);
332
+ } else if (fieldDeleted && updateFn) {
333
+ const valueId = valuePrevious[fieldId];
334
+ if (valueId) {
335
+ updateFn({ ...{ [fieldId]: valueId }, [fieldDeleted]: true }, params);
336
+ } else {
337
+ console.error("[legend-state]: deleting item without an id");
338
+ }
339
+ } else {
340
+ console.warn("[legend-state] missing delete function");
341
+ }
250
342
  }
251
343
  })
252
344
  ]);
253
345
  } : void 0;
346
+ const subscribe = subscribeProp ? (params) => subscribeProp({
347
+ ...params,
348
+ update: async (paramsUpdate) => {
349
+ const paramsForUpdate = paramsUpdate;
350
+ const rows = paramsUpdate.value;
351
+ if (process.env.NODE_ENV === "development" || process.env.NODE_ENV === "test") {
352
+ if (!state.isArray(rows)) {
353
+ console.error("[legend-state] subscribe:update expects an array of changed items");
354
+ }
355
+ }
356
+ const newLastSync = computeLastSync(rows, fieldUpdatedAt, fieldCreatedAt);
357
+ if (newLastSync) {
358
+ paramsForUpdate.lastSync = newLastSync;
359
+ }
360
+ const rowsTransformed = (transform == null ? void 0 : transform.load) ? await transformRows(rows) : rows;
361
+ paramsForUpdate.value = resultsToOutType(rowsTransformed);
362
+ params.update(paramsForUpdate);
363
+ }
364
+ }) : void 0;
254
365
  return sync.synced({
255
366
  set,
256
367
  get,
368
+ subscribe,
257
369
  mode: modeParam,
258
370
  ...rest
259
371
  });