@legendapp/state 3.0.0-alpha.12 → 3.0.0-alpha.13

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/index.d.mts CHANGED
@@ -5,7 +5,7 @@ type RemoveIndex<T> = {
5
5
  };
6
6
  type BuiltIns = String | Boolean | Number | Date | Error | RegExp | Array<any> | Function | Promise<any>;
7
7
  type IsUserDefinedObject<T> = T extends Function | BuiltIns | any[] ? false : T extends object ? true : false;
8
- type RemoveObservables<T> = T extends ImmutableObservableBase<infer t> ? t : IsUserDefinedObject<T> extends true ? {
8
+ type RemoveObservables<T> = T extends ImmutableObservableBase<infer t> ? t : T extends ImmutableObservableBase<infer t>[] ? t[] : IsUserDefinedObject<T> extends true ? {
9
9
  [K in keyof T]: RemoveObservables<T[K]>;
10
10
  } : T extends ImmutableObservableBase<infer TObs> ? TObs : T extends () => infer TRet ? RemoveObservables<TRet> & T : T extends (key: string) => infer TRet ? Record<string, RemoveObservables<TRet>> & T : T;
11
11
  interface ObservableArray<T, U> extends ObservablePrimitive<T>, Pick<Array<Observable<U>>, ArrayOverrideFnNames>, Omit<RemoveIndex<Array<U>>, ArrayOverrideFnNames> {
@@ -380,7 +380,6 @@ declare const internal: {
380
380
  getValueAtPath: typeof getValueAtPath;
381
381
  globalState: {
382
382
  isLoadingLocal: boolean;
383
- isMerging: boolean;
384
383
  isLoadingRemote: boolean;
385
384
  activateSyncedNode: (node: NodeValue, newValue: any) => {
386
385
  update: UpdateFn;
package/index.d.ts CHANGED
@@ -5,7 +5,7 @@ type RemoveIndex<T> = {
5
5
  };
6
6
  type BuiltIns = String | Boolean | Number | Date | Error | RegExp | Array<any> | Function | Promise<any>;
7
7
  type IsUserDefinedObject<T> = T extends Function | BuiltIns | any[] ? false : T extends object ? true : false;
8
- type RemoveObservables<T> = T extends ImmutableObservableBase<infer t> ? t : IsUserDefinedObject<T> extends true ? {
8
+ type RemoveObservables<T> = T extends ImmutableObservableBase<infer t> ? t : T extends ImmutableObservableBase<infer t>[] ? t[] : IsUserDefinedObject<T> extends true ? {
9
9
  [K in keyof T]: RemoveObservables<T[K]>;
10
10
  } : T extends ImmutableObservableBase<infer TObs> ? TObs : T extends () => infer TRet ? RemoveObservables<TRet> & T : T extends (key: string) => infer TRet ? Record<string, RemoveObservables<TRet>> & T : T;
11
11
  interface ObservableArray<T, U> extends ObservablePrimitive<T>, Pick<Array<Observable<U>>, ArrayOverrideFnNames>, Omit<RemoveIndex<Array<U>>, ArrayOverrideFnNames> {
@@ -380,7 +380,6 @@ declare const internal: {
380
380
  getValueAtPath: typeof getValueAtPath;
381
381
  globalState: {
382
382
  isLoadingLocal: boolean;
383
- isMerging: boolean;
384
383
  isLoadingRemote: boolean;
385
384
  activateSyncedNode: (node: NodeValue, newValue: any) => {
386
385
  update: UpdateFn;
package/index.js CHANGED
@@ -70,7 +70,6 @@ var optimized = Symbol("optimized");
70
70
  var symbolLinked = Symbol("linked");
71
71
  var globalState = {
72
72
  isLoadingLocal: false,
73
- isMerging: false,
74
73
  isLoadingRemote: false,
75
74
  activateSyncedNode: void 0,
76
75
  pendingNodes: /* @__PURE__ */ new Map(),
@@ -141,7 +140,7 @@ function isEvent(value$) {
141
140
  return value$ && ((_a = value$[symbolGetNode]) == null ? void 0 : _a.isEvent);
142
141
  }
143
142
  function setNodeValue(node, newValue) {
144
- var _a, _b, _c;
143
+ var _a;
145
144
  const parentNode = (_a = node.parent) != null ? _a : node;
146
145
  const key = node.parent ? node.key : "_";
147
146
  const isDelete = newValue === symbolDelete;
@@ -151,7 +150,7 @@ function setNodeValue(node, newValue) {
151
150
  const prevValue = parentValue[key];
152
151
  const isFunc = isFunction(newValue);
153
152
  newValue = !parentNode.isAssigning && isFunc && !isFunction(prevValue) ? newValue(prevValue) : newValue;
154
- if (newValue !== prevValue && (!globalState.isMerging || isNullOrUndefined(prevValue) || isFunction(prevValue) || !((_c = (_b = node.parent) == null ? void 0 : _b.functions) == null ? void 0 : _c.get(key)))) {
153
+ if (newValue !== prevValue) {
155
154
  try {
156
155
  parentNode.isSetting = (parentNode.isSetting || 0) + 1;
157
156
  const useMapFn = isMap(parentValue);
@@ -344,7 +343,6 @@ function setInObservableAtPath(value$, path, pathTypes, value, mode) {
344
343
  }
345
344
  function mergeIntoObservable(target, ...sources) {
346
345
  beginBatch();
347
- globalState.isMerging = true;
348
346
  for (let i = 0; i < sources.length; i++) {
349
347
  target = _mergeIntoObservable(
350
348
  target,
@@ -353,7 +351,6 @@ function mergeIntoObservable(target, ...sources) {
353
351
  i < sources.length - 1
354
352
  );
355
353
  }
356
- globalState.isMerging = false;
357
354
  endBatch();
358
355
  return target;
359
356
  }
@@ -1535,12 +1532,16 @@ function setKey(node, key, newValue, level) {
1535
1532
  } else {
1536
1533
  const { newValue: savedValue, prevValue } = setNodeValue(childNode, newValue);
1537
1534
  const isPrim = isPrimitive(savedValue) || savedValue instanceof Date;
1535
+ if (!isPrim) {
1536
+ let parent = childNode;
1537
+ do {
1538
+ parent.needsExtract = true;
1539
+ parent.recursivelyAutoActivated = false;
1540
+ } while (parent = parent.parent);
1541
+ }
1538
1542
  if (!equals(savedValue, prevValue)) {
1539
1543
  updateNodesAndNotify(node, savedValue, prevValue, childNode, isPrim, isRoot, level);
1540
1544
  }
1541
- if (!isPrim) {
1542
- childNode.needsExtract = true;
1543
- }
1544
1545
  extractFunctionOrComputed(node, key, savedValue);
1545
1546
  }
1546
1547
  }
@@ -1747,7 +1748,9 @@ function peekInternal(node, activateRecursive) {
1747
1748
  }
1748
1749
  isFlushing = false;
1749
1750
  let value = getNodeValue(node);
1750
- value = checkLazy(node, value, !!activateRecursive);
1751
+ if (!globalState.isLoadingLocal) {
1752
+ value = checkLazy(node, value, !!activateRecursive);
1753
+ }
1751
1754
  return value;
1752
1755
  }
1753
1756
  function checkLazy(node, value, activateRecursive) {
@@ -1762,10 +1765,12 @@ function checkLazy(node, value, activateRecursive) {
1762
1765
  } else {
1763
1766
  if (node.parent) {
1764
1767
  const parentValue = getNodeValue(node.parent);
1765
- if (parentValue) {
1766
- delete parentValue[node.key];
1767
- } else {
1768
- node.root._ = void 0;
1768
+ if (isFunction(value)) {
1769
+ if (parentValue) {
1770
+ delete parentValue[node.key];
1771
+ } else {
1772
+ node.root._ = void 0;
1773
+ }
1769
1774
  }
1770
1775
  }
1771
1776
  value = activateNodeFunction(node, lazyFn);
@@ -1854,7 +1859,9 @@ function activateNodeFunction(node, lazyFn) {
1854
1859
  var _a, _b, _c, _d;
1855
1860
  if (isFirst) {
1856
1861
  isFirst = false;
1857
- setNodeValue(node, void 0);
1862
+ if (isFunction(getNodeValue(node))) {
1863
+ setNodeValue(node, void 0);
1864
+ }
1858
1865
  } else if (!isFlushing && refreshFn) {
1859
1866
  if (shouldIgnoreUnobserved(node, refreshFn)) {
1860
1867
  ignoreThisUpdate = true;
package/index.mjs CHANGED
@@ -68,7 +68,6 @@ var optimized = Symbol("optimized");
68
68
  var symbolLinked = Symbol("linked");
69
69
  var globalState = {
70
70
  isLoadingLocal: false,
71
- isMerging: false,
72
71
  isLoadingRemote: false,
73
72
  activateSyncedNode: void 0,
74
73
  pendingNodes: /* @__PURE__ */ new Map(),
@@ -139,7 +138,7 @@ function isEvent(value$) {
139
138
  return value$ && ((_a = value$[symbolGetNode]) == null ? void 0 : _a.isEvent);
140
139
  }
141
140
  function setNodeValue(node, newValue) {
142
- var _a, _b, _c;
141
+ var _a;
143
142
  const parentNode = (_a = node.parent) != null ? _a : node;
144
143
  const key = node.parent ? node.key : "_";
145
144
  const isDelete = newValue === symbolDelete;
@@ -149,7 +148,7 @@ function setNodeValue(node, newValue) {
149
148
  const prevValue = parentValue[key];
150
149
  const isFunc = isFunction(newValue);
151
150
  newValue = !parentNode.isAssigning && isFunc && !isFunction(prevValue) ? newValue(prevValue) : newValue;
152
- if (newValue !== prevValue && (!globalState.isMerging || isNullOrUndefined(prevValue) || isFunction(prevValue) || !((_c = (_b = node.parent) == null ? void 0 : _b.functions) == null ? void 0 : _c.get(key)))) {
151
+ if (newValue !== prevValue) {
153
152
  try {
154
153
  parentNode.isSetting = (parentNode.isSetting || 0) + 1;
155
154
  const useMapFn = isMap(parentValue);
@@ -342,7 +341,6 @@ function setInObservableAtPath(value$, path, pathTypes, value, mode) {
342
341
  }
343
342
  function mergeIntoObservable(target, ...sources) {
344
343
  beginBatch();
345
- globalState.isMerging = true;
346
344
  for (let i = 0; i < sources.length; i++) {
347
345
  target = _mergeIntoObservable(
348
346
  target,
@@ -351,7 +349,6 @@ function mergeIntoObservable(target, ...sources) {
351
349
  i < sources.length - 1
352
350
  );
353
351
  }
354
- globalState.isMerging = false;
355
352
  endBatch();
356
353
  return target;
357
354
  }
@@ -1533,12 +1530,16 @@ function setKey(node, key, newValue, level) {
1533
1530
  } else {
1534
1531
  const { newValue: savedValue, prevValue } = setNodeValue(childNode, newValue);
1535
1532
  const isPrim = isPrimitive(savedValue) || savedValue instanceof Date;
1533
+ if (!isPrim) {
1534
+ let parent = childNode;
1535
+ do {
1536
+ parent.needsExtract = true;
1537
+ parent.recursivelyAutoActivated = false;
1538
+ } while (parent = parent.parent);
1539
+ }
1536
1540
  if (!equals(savedValue, prevValue)) {
1537
1541
  updateNodesAndNotify(node, savedValue, prevValue, childNode, isPrim, isRoot, level);
1538
1542
  }
1539
- if (!isPrim) {
1540
- childNode.needsExtract = true;
1541
- }
1542
1543
  extractFunctionOrComputed(node, key, savedValue);
1543
1544
  }
1544
1545
  }
@@ -1745,7 +1746,9 @@ function peekInternal(node, activateRecursive) {
1745
1746
  }
1746
1747
  isFlushing = false;
1747
1748
  let value = getNodeValue(node);
1748
- value = checkLazy(node, value, !!activateRecursive);
1749
+ if (!globalState.isLoadingLocal) {
1750
+ value = checkLazy(node, value, !!activateRecursive);
1751
+ }
1749
1752
  return value;
1750
1753
  }
1751
1754
  function checkLazy(node, value, activateRecursive) {
@@ -1760,10 +1763,12 @@ function checkLazy(node, value, activateRecursive) {
1760
1763
  } else {
1761
1764
  if (node.parent) {
1762
1765
  const parentValue = getNodeValue(node.parent);
1763
- if (parentValue) {
1764
- delete parentValue[node.key];
1765
- } else {
1766
- node.root._ = void 0;
1766
+ if (isFunction(value)) {
1767
+ if (parentValue) {
1768
+ delete parentValue[node.key];
1769
+ } else {
1770
+ node.root._ = void 0;
1771
+ }
1767
1772
  }
1768
1773
  }
1769
1774
  value = activateNodeFunction(node, lazyFn);
@@ -1852,7 +1857,9 @@ function activateNodeFunction(node, lazyFn) {
1852
1857
  var _a, _b, _c, _d;
1853
1858
  if (isFirst) {
1854
1859
  isFirst = false;
1855
- setNodeValue(node, void 0);
1860
+ if (isFunction(getNodeValue(node))) {
1861
+ setNodeValue(node, void 0);
1862
+ }
1856
1863
  } else if (!isFlushing && refreshFn) {
1857
1864
  if (shouldIgnoreUnobserved(node, refreshFn)) {
1858
1865
  ignoreThisUpdate = true;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@legendapp/state",
3
- "version": "3.0.0-alpha.12",
3
+ "version": "3.0.0-alpha.13",
4
4
  "description": "legend-state",
5
5
  "sideEffects": false,
6
6
  "private": false,
@@ -1,9 +1,9 @@
1
1
  import { Change } from '@legendapp/state';
2
- import { ObservablePersistPlugin, ObservablePersistenceConfigLocalGlobalOptions, PersistMetadata } from '@legendapp/state/sync';
2
+ import { ObservablePersistPlugin, ObservablePersistPluginOptions, PersistMetadata } from '@legendapp/state/sync';
3
3
 
4
4
  declare class ObservablePersistAsyncStorage implements ObservablePersistPlugin {
5
5
  private data;
6
- initialize(config: ObservablePersistenceConfigLocalGlobalOptions): Promise<void>;
6
+ initialize(config: ObservablePersistPluginOptions): Promise<void>;
7
7
  loadTable(table: string): void | Promise<void>;
8
8
  getTable(table: string, init: object): any;
9
9
  getMetadata(table: string): PersistMetadata;
@@ -1,9 +1,9 @@
1
1
  import { Change } from '@legendapp/state';
2
- import { ObservablePersistPlugin, ObservablePersistenceConfigLocalGlobalOptions, PersistMetadata } from '@legendapp/state/sync';
2
+ import { ObservablePersistPlugin, ObservablePersistPluginOptions, PersistMetadata } from '@legendapp/state/sync';
3
3
 
4
4
  declare class ObservablePersistAsyncStorage implements ObservablePersistPlugin {
5
5
  private data;
6
- initialize(config: ObservablePersistenceConfigLocalGlobalOptions): Promise<void>;
6
+ initialize(config: ObservablePersistPluginOptions): Promise<void>;
7
7
  loadTable(table: string): void | Promise<void>;
8
8
  getTable(table: string, init: object): any;
9
9
  getMetadata(table: string): PersistMetadata;
@@ -158,7 +158,6 @@ function syncedFirebase(props) {
158
158
  const {
159
159
  refPath,
160
160
  query,
161
- as: asType,
162
161
  fieldId,
163
162
  realtime,
164
163
  requireAuth,
@@ -170,6 +169,7 @@ function syncedFirebase(props) {
170
169
  ...rest
171
170
  } = props;
172
171
  const { fieldCreatedAt, changesSince } = props;
172
+ const asType = props.as || "value";
173
173
  const fieldUpdatedAt = props.fieldUpdatedAt || "@";
174
174
  const computeRef = (lastSync) => {
175
175
  const pathFirebase = refPath(fns.getCurrentUser());
@@ -346,7 +346,7 @@ function syncedFirebase(props) {
346
346
  update,
347
347
  delete: deleteFn,
348
348
  waitFor: () => isEnabled$.get() && (isAuthedIfRequired$ ? isAuthedIfRequired$.get() : true) && (waitFor ? state.computeSelector(waitFor) : true),
349
- waitForSet: () => isEnabled$.get() && (isAuthedIfRequired$ ? isAuthedIfRequired$.get() : true) && (waitForSet ? state.computeSelector(waitForSet) : true),
349
+ waitForSet: (params) => isEnabled$.get() && (isAuthedIfRequired$ ? isAuthedIfRequired$.get() : true) && (waitForSet ? state.isFunction(waitForSet) ? waitForSet(params) : waitForSet : true),
350
350
  generateId: fns.generateId,
351
351
  transform,
352
352
  as: asType
@@ -1,4 +1,4 @@
1
- import { observable, symbolDelete, isString, isArray, isObject, computeSelector, isNullOrUndefined, isPromise, isNumber, when } from '@legendapp/state';
1
+ import { observable, symbolDelete, isString, isArray, isObject, computeSelector, isFunction, isNullOrUndefined, isPromise, isNumber, when } from '@legendapp/state';
2
2
  import { syncedCrud } from '@legendapp/state/sync-plugins/crud';
3
3
  import { getAuth } from 'firebase/auth';
4
4
  import { ref, getDatabase, query, orderByChild, startAt, update, onValue, onChildAdded, onChildChanged, onChildRemoved, serverTimestamp, remove, push } from 'firebase/database';
@@ -156,7 +156,6 @@ function syncedFirebase(props) {
156
156
  const {
157
157
  refPath,
158
158
  query,
159
- as: asType,
160
159
  fieldId,
161
160
  realtime,
162
161
  requireAuth,
@@ -168,6 +167,7 @@ function syncedFirebase(props) {
168
167
  ...rest
169
168
  } = props;
170
169
  const { fieldCreatedAt, changesSince } = props;
170
+ const asType = props.as || "value";
171
171
  const fieldUpdatedAt = props.fieldUpdatedAt || "@";
172
172
  const computeRef = (lastSync) => {
173
173
  const pathFirebase = refPath(fns.getCurrentUser());
@@ -344,7 +344,7 @@ function syncedFirebase(props) {
344
344
  update,
345
345
  delete: deleteFn,
346
346
  waitFor: () => isEnabled$.get() && (isAuthedIfRequired$ ? isAuthedIfRequired$.get() : true) && (waitFor ? computeSelector(waitFor) : true),
347
- waitForSet: () => isEnabled$.get() && (isAuthedIfRequired$ ? isAuthedIfRequired$.get() : true) && (waitForSet ? computeSelector(waitForSet) : true),
347
+ waitForSet: (params) => isEnabled$.get() && (isAuthedIfRequired$ ? isAuthedIfRequired$.get() : true) && (waitForSet ? isFunction(waitForSet) ? waitForSet(params) : waitForSet : true),
348
348
  generateId: fns.generateId,
349
349
  transform,
350
350
  as: asType
@@ -102,7 +102,9 @@ interface SyncedKeelPropsBase<TRemote extends {
102
102
  where: any;
103
103
  values?: Partial<TRemote>;
104
104
  }) => Promise<APIResult<TRemote>>;
105
- delete?: (params: TRemote) => Promise<APIResult<string>>;
105
+ delete?: (params: {
106
+ id: string;
107
+ }) => Promise<APIResult<string>>;
106
108
  }
107
109
  declare function getSyncedKeelConfiguration(): SyncedKeelConfiguration;
108
110
  declare function configureSyncedKeel(config: SyncedKeelConfiguration): void;
@@ -102,7 +102,9 @@ interface SyncedKeelPropsBase<TRemote extends {
102
102
  where: any;
103
103
  values?: Partial<TRemote>;
104
104
  }) => Promise<APIResult<TRemote>>;
105
- delete?: (params: TRemote) => Promise<APIResult<string>>;
105
+ delete?: (params: {
106
+ id: string;
107
+ }) => Promise<APIResult<string>>;
106
108
  }
107
109
  declare function getSyncedKeelConfiguration(): SyncedKeelConfiguration;
108
110
  declare function configureSyncedKeel(config: SyncedKeelConfiguration): void;
@@ -221,7 +221,7 @@ function syncedKeel(props) {
221
221
  }
222
222
  } : void 0;
223
223
  const deleteFn = deleteParam ? async (value, params) => {
224
- const { data, error } = await deleteParam(value);
224
+ const { data, error } = await deleteParam({ id: value.id });
225
225
  if (error) {
226
226
  handleSetError(error, params, false);
227
227
  }
@@ -244,7 +244,7 @@ function syncedKeel(props) {
244
244
  update,
245
245
  delete: deleteFn,
246
246
  waitFor: () => isEnabled$.get() && (waitFor ? state.computeSelector(waitFor) : true),
247
- waitForSet: () => isEnabled$.get() && (waitForSet ? state.computeSelector(waitForSet) : true),
247
+ waitForSet: (params) => isEnabled$.get() && (waitForSet ? state.isFunction(waitForSet) ? waitForSet(params) : waitForSet : true),
248
248
  onSaved,
249
249
  fieldCreatedAt,
250
250
  fieldUpdatedAt,
@@ -215,7 +215,7 @@ function syncedKeel(props) {
215
215
  }
216
216
  } : void 0;
217
217
  const deleteFn = deleteParam ? async (value, params) => {
218
- const { data, error } = await deleteParam(value);
218
+ const { data, error } = await deleteParam({ id: value.id });
219
219
  if (error) {
220
220
  handleSetError(error, params, false);
221
221
  }
@@ -238,7 +238,7 @@ function syncedKeel(props) {
238
238
  update,
239
239
  delete: deleteFn,
240
240
  waitFor: () => isEnabled$.get() && (waitFor ? computeSelector(waitFor) : true),
241
- waitForSet: () => isEnabled$.get() && (waitForSet ? computeSelector(waitForSet) : true),
241
+ waitForSet: (params) => isEnabled$.get() && (waitForSet ? isFunction(waitForSet) ? waitForSet(params) : waitForSet : true),
242
242
  onSaved,
243
243
  fieldCreatedAt,
244
244
  fieldUpdatedAt,
@@ -135,7 +135,7 @@ function syncedSupabase(props) {
135
135
  transform,
136
136
  generateId,
137
137
  waitFor: () => isEnabled$.get() && (waitFor ? state.computeSelector(waitFor) : true),
138
- waitForSet: () => isEnabled$.get() && (waitForSet ? state.computeSelector(waitForSet) : true)
138
+ waitForSet: (params) => isEnabled$.get() && (waitForSet ? state.isFunction(waitForSet) ? waitForSet(params) : waitForSet : true)
139
139
  });
140
140
  }
141
141
 
@@ -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
 
@@ -133,7 +133,7 @@ function syncedSupabase(props) {
133
133
  transform,
134
134
  generateId,
135
135
  waitFor: () => isEnabled$.get() && (waitFor ? computeSelector(waitFor) : true),
136
- waitForSet: () => isEnabled$.get() && (waitForSet ? computeSelector(waitForSet) : true)
136
+ waitForSet: (params) => isEnabled$.get() && (waitForSet ? isFunction(waitForSet) ? waitForSet(params) : waitForSet : true)
137
137
  });
138
138
  }
139
139
 
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, Selector, TypeAtPath, ObservableState, RecordValue, ArrayValue } from '@legendapp/state';
3
+ import { ClassConstructor, GetMode, SetParams, NodeValue, UpdateFn, ObservableParam, LinkedOptions, RetryOptions, Change, Observable, ObservableSyncState, 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;
@@ -55,12 +54,11 @@ interface SyncedOptions<TRemote = any, TLocal = TRemote> extends Omit<LinkedOpti
55
54
  syncMode?: 'auto' | 'manual';
56
55
  mode?: GetMode;
57
56
  transform?: SyncTransform<TLocal, TRemote>;
58
- enableSync?: boolean;
59
- onGetError?: (error: Error) => void;
60
- onSetError?: (error: Error) => void;
61
- log?: (message?: any, ...optionalParams: any[]) => void;
57
+ onGetError?: (error: Error, getParams: SyncedGetParams | undefined, source: 'get' | 'subscribe') => void;
58
+ onSetError?: (error: Error, setParams: SyncedSetParams<TRemote>) => void;
62
59
  onBeforeSet?: () => void;
63
60
  onAfterSet?: () => void;
61
+ log?: (message?: any, ...optionalParams: any[]) => void;
64
62
  }
65
63
  interface SyncedOptionsGlobal<T = any> extends Omit<SyncedOptions<T>, 'get' | 'set' | 'persist' | 'initial' | 'waitForSet' | 'waitFor' | 'transform' | 'subscribe'> {
66
64
  persist?: ObservablePersistPluginOptions & Omit<PersistOptions, 'name' | 'transform' | 'options'>;
@@ -123,143 +121,6 @@ type Synced<T> = T;
123
121
 
124
122
  declare function configureObservableSync(options?: SyncedOptionsGlobal$1): void;
125
123
 
126
- interface PersistTransform<TOrig = any, TSaved = TOrig> {
127
- load?: (value: TSaved) => TOrig | Promise<TOrig>;
128
- save?: (value: TOrig) => TSaved | Promise<TSaved>;
129
- }
130
- interface LegacyPersistOptionsLocal<T = any> {
131
- name: string;
132
- transform?: PersistTransform<T>;
133
- fieldTransforms?: FieldTransforms<T>;
134
- readonly?: boolean;
135
- mmkv?: MMKVConfiguration;
136
- indexedDB?: {
137
- prefixID?: string;
138
- itemID?: string;
139
- };
140
- options?: any;
141
- }
142
- type LegacyPersistOptionsRemote<T = any> = ObservablePersistenceConfigRemoteGlobalOptions & {
143
- readonly?: boolean;
144
- waitForGet?: Selector<any>;
145
- waitForSet?: LinkedOptions['waitForSet'];
146
- manual?: boolean;
147
- fieldTransforms?: FieldTransforms<T>;
148
- allowSetIfError?: boolean;
149
- transform?: PersistTransform<T>;
150
- firebase?: {
151
- refPath: (uid: string | undefined) => string;
152
- query?: (ref: DatabaseReference) => DatabaseReference | Query;
153
- queryByModified?: QueryByModified<T>;
154
- ignoreKeys?: string[];
155
- requireAuth?: boolean;
156
- mode?: 'once' | 'realtime';
157
- };
158
- offlineBehavior?: false | 'retry';
159
- changeTimeout?: number;
160
- metadataTimeout?: number;
161
- retry?: RetryOptions;
162
- onGetError?: (error: Error) => void;
163
- onSetError?: (error: Error) => void;
164
- log?: (message?: any, ...optionalParams: any[]) => void;
165
- onBeforeSet?: () => void;
166
- onSet?: () => void;
167
- };
168
- interface ObservablePersistenceConfigLocalGlobalOptions {
169
- onGetError?: (error: Error) => void;
170
- onSetError?: (error: Error) => void;
171
- indexedDB?: {
172
- databaseName: string;
173
- version: number;
174
- tableNames: string[];
175
- };
176
- asyncStorage?: {
177
- AsyncStorage: AsyncStorageStatic;
178
- preload?: boolean | string[];
179
- };
180
- }
181
- interface ObservablePersistenceConfigRemoteGlobalOptions {
182
- debounceSet?: number;
183
- dateModifiedKey?: string;
184
- offlineBehavior?: false | 'retry';
185
- retry?: RetryOptions;
186
- onGetError?: (error: Error) => void;
187
- onSetError?: (error: Error) => void;
188
- log?: (logLevel: 'verbose' | 'warning' | 'error', message: any, ...optionalParams: any[]) => void;
189
- onBeforeSet?: () => void;
190
- onAfterSet?: () => void;
191
- }
192
- interface ObservablePersistenceConfig {
193
- pluginLocal?: ClassConstructor<ObservablePersistPlugin>;
194
- pluginRemote?: ClassConstructor<ObservablePersistRemoteClass> | ObservablePersistRemoteFunctions;
195
- localOptions?: ObservablePersistenceConfigLocalGlobalOptions;
196
- remoteOptions?: ObservablePersistenceConfigRemoteGlobalOptions;
197
- }
198
- interface LegacyPersistOptions<T = any> {
199
- local?: string | LegacyPersistOptionsLocal<T>;
200
- remote?: LegacyPersistOptionsRemote<T>;
201
- pluginLocal?: ClassConstructor<ObservablePersistPlugin>;
202
- pluginRemote?: ClassConstructor<ObservablePersistRemoteClass> | ObservablePersistRemoteFunctions<T>;
203
- }
204
- interface ObservableOnChangeParams {
205
- value: unknown;
206
- path?: string[];
207
- pathTypes?: TypeAtPath[];
208
- mode?: GetMode;
209
- dateModified?: number | undefined;
210
- lastSync?: number | undefined;
211
- }
212
- interface ObservablePersistRemoteSetParams<T> {
213
- syncState: Observable<ObservablePersistState>;
214
- obs: ObservableParam<T>;
215
- options: LegacyPersistOptions<T>;
216
- changes: Change[];
217
- value: T;
218
- }
219
- interface ObservablePersistRemoteGetParams<T> {
220
- state: Observable<ObservablePersistState>;
221
- obs: ObservableParam<T>;
222
- options: LegacyPersistOptions<T>;
223
- dateModified?: number;
224
- lastSync?: number;
225
- mode?: GetMode;
226
- onGet: () => void;
227
- onError: (error: Error) => void;
228
- onChange: (params: ObservableOnChangeParams) => void | Promise<void>;
229
- }
230
- type ObservablePersistRemoteGetFnParams<T> = Omit<ObservablePersistRemoteGetParams<T>, 'onGet'>;
231
- interface ObservablePersistRemoteClass {
232
- get?<T>(params: ObservablePersistRemoteGetParams<T>): void;
233
- set?<T>(params: ObservablePersistRemoteSetParams<T>): void | Promise<void | {
234
- changes?: object;
235
- dateModified?: number;
236
- lastSync?: number;
237
- pathStrs?: string[];
238
- }>;
239
- }
240
- interface ObservablePersistRemoteFunctions<T = any> {
241
- get?(params: ObservablePersistRemoteGetFnParams<T>): T | Promise<T>;
242
- set?(params: ObservablePersistRemoteSetParams<T>): void | Promise<void | {
243
- changes?: object | undefined;
244
- dateModified?: number;
245
- lastSync?: number;
246
- }>;
247
- }
248
- interface ObservablePersistStateBase {
249
- isLoadedLocal: boolean;
250
- isEnabledLocal: boolean;
251
- isEnabledRemote: boolean;
252
- dateModified?: number;
253
- lastSync?: number;
254
- syncCount?: number;
255
- clearLocal: () => Promise<void>;
256
- sync: () => Promise<void>;
257
- getPendingChanges: () => Record<string, {
258
- p: any;
259
- v?: any;
260
- }> | undefined;
261
- }
262
- type ObservablePersistState = ObservableState & ObservablePersistStateBase;
263
124
  declare type ObjectKeys<T> = Pick<T, {
264
125
  [K in keyof T]-?: K extends string ? T[K] extends Record<string, any> ? T[K] extends any[] ? never : K : never : never;
265
126
  }[keyof T]>;
@@ -331,4 +192,4 @@ declare const internal: {
331
192
  observableSyncConfiguration: SyncedOptionsGlobal;
332
193
  };
333
194
 
334
- 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 ObservableSyncFunctions, 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, mapSyncPlugins, onChangeRemote, removeNullUndefined, syncObservable, synced, transformStringifyDates, transformStringifyKeys };
195
+ export { type FieldTransforms, type FieldTransformsInner, type ObservablePersistPlugin, type ObservablePersistPluginOptions, type ObservableSyncFunctions, type ObservableSyncSetParams, type PersistMetadata, type PersistOptions, 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, mapSyncPlugins, onChangeRemote, removeNullUndefined, syncObservable, synced, transformStringifyDates, transformStringifyKeys };
package/sync.d.ts 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, Selector, TypeAtPath, ObservableState, RecordValue, ArrayValue } from '@legendapp/state';
3
+ import { ClassConstructor, GetMode, SetParams, NodeValue, UpdateFn, ObservableParam, LinkedOptions, RetryOptions, Change, Observable, ObservableSyncState, 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;
@@ -55,12 +54,11 @@ interface SyncedOptions<TRemote = any, TLocal = TRemote> extends Omit<LinkedOpti
55
54
  syncMode?: 'auto' | 'manual';
56
55
  mode?: GetMode;
57
56
  transform?: SyncTransform<TLocal, TRemote>;
58
- enableSync?: boolean;
59
- onGetError?: (error: Error) => void;
60
- onSetError?: (error: Error) => void;
61
- log?: (message?: any, ...optionalParams: any[]) => void;
57
+ onGetError?: (error: Error, getParams: SyncedGetParams | undefined, source: 'get' | 'subscribe') => void;
58
+ onSetError?: (error: Error, setParams: SyncedSetParams<TRemote>) => void;
62
59
  onBeforeSet?: () => void;
63
60
  onAfterSet?: () => void;
61
+ log?: (message?: any, ...optionalParams: any[]) => void;
64
62
  }
65
63
  interface SyncedOptionsGlobal<T = any> extends Omit<SyncedOptions<T>, 'get' | 'set' | 'persist' | 'initial' | 'waitForSet' | 'waitFor' | 'transform' | 'subscribe'> {
66
64
  persist?: ObservablePersistPluginOptions & Omit<PersistOptions, 'name' | 'transform' | 'options'>;
@@ -123,143 +121,6 @@ type Synced<T> = T;
123
121
 
124
122
  declare function configureObservableSync(options?: SyncedOptionsGlobal$1): void;
125
123
 
126
- interface PersistTransform<TOrig = any, TSaved = TOrig> {
127
- load?: (value: TSaved) => TOrig | Promise<TOrig>;
128
- save?: (value: TOrig) => TSaved | Promise<TSaved>;
129
- }
130
- interface LegacyPersistOptionsLocal<T = any> {
131
- name: string;
132
- transform?: PersistTransform<T>;
133
- fieldTransforms?: FieldTransforms<T>;
134
- readonly?: boolean;
135
- mmkv?: MMKVConfiguration;
136
- indexedDB?: {
137
- prefixID?: string;
138
- itemID?: string;
139
- };
140
- options?: any;
141
- }
142
- type LegacyPersistOptionsRemote<T = any> = ObservablePersistenceConfigRemoteGlobalOptions & {
143
- readonly?: boolean;
144
- waitForGet?: Selector<any>;
145
- waitForSet?: LinkedOptions['waitForSet'];
146
- manual?: boolean;
147
- fieldTransforms?: FieldTransforms<T>;
148
- allowSetIfError?: boolean;
149
- transform?: PersistTransform<T>;
150
- firebase?: {
151
- refPath: (uid: string | undefined) => string;
152
- query?: (ref: DatabaseReference) => DatabaseReference | Query;
153
- queryByModified?: QueryByModified<T>;
154
- ignoreKeys?: string[];
155
- requireAuth?: boolean;
156
- mode?: 'once' | 'realtime';
157
- };
158
- offlineBehavior?: false | 'retry';
159
- changeTimeout?: number;
160
- metadataTimeout?: number;
161
- retry?: RetryOptions;
162
- onGetError?: (error: Error) => void;
163
- onSetError?: (error: Error) => void;
164
- log?: (message?: any, ...optionalParams: any[]) => void;
165
- onBeforeSet?: () => void;
166
- onSet?: () => void;
167
- };
168
- interface ObservablePersistenceConfigLocalGlobalOptions {
169
- onGetError?: (error: Error) => void;
170
- onSetError?: (error: Error) => void;
171
- indexedDB?: {
172
- databaseName: string;
173
- version: number;
174
- tableNames: string[];
175
- };
176
- asyncStorage?: {
177
- AsyncStorage: AsyncStorageStatic;
178
- preload?: boolean | string[];
179
- };
180
- }
181
- interface ObservablePersistenceConfigRemoteGlobalOptions {
182
- debounceSet?: number;
183
- dateModifiedKey?: string;
184
- offlineBehavior?: false | 'retry';
185
- retry?: RetryOptions;
186
- onGetError?: (error: Error) => void;
187
- onSetError?: (error: Error) => void;
188
- log?: (logLevel: 'verbose' | 'warning' | 'error', message: any, ...optionalParams: any[]) => void;
189
- onBeforeSet?: () => void;
190
- onAfterSet?: () => void;
191
- }
192
- interface ObservablePersistenceConfig {
193
- pluginLocal?: ClassConstructor<ObservablePersistPlugin>;
194
- pluginRemote?: ClassConstructor<ObservablePersistRemoteClass> | ObservablePersistRemoteFunctions;
195
- localOptions?: ObservablePersistenceConfigLocalGlobalOptions;
196
- remoteOptions?: ObservablePersistenceConfigRemoteGlobalOptions;
197
- }
198
- interface LegacyPersistOptions<T = any> {
199
- local?: string | LegacyPersistOptionsLocal<T>;
200
- remote?: LegacyPersistOptionsRemote<T>;
201
- pluginLocal?: ClassConstructor<ObservablePersistPlugin>;
202
- pluginRemote?: ClassConstructor<ObservablePersistRemoteClass> | ObservablePersistRemoteFunctions<T>;
203
- }
204
- interface ObservableOnChangeParams {
205
- value: unknown;
206
- path?: string[];
207
- pathTypes?: TypeAtPath[];
208
- mode?: GetMode;
209
- dateModified?: number | undefined;
210
- lastSync?: number | undefined;
211
- }
212
- interface ObservablePersistRemoteSetParams<T> {
213
- syncState: Observable<ObservablePersistState>;
214
- obs: ObservableParam<T>;
215
- options: LegacyPersistOptions<T>;
216
- changes: Change[];
217
- value: T;
218
- }
219
- interface ObservablePersistRemoteGetParams<T> {
220
- state: Observable<ObservablePersistState>;
221
- obs: ObservableParam<T>;
222
- options: LegacyPersistOptions<T>;
223
- dateModified?: number;
224
- lastSync?: number;
225
- mode?: GetMode;
226
- onGet: () => void;
227
- onError: (error: Error) => void;
228
- onChange: (params: ObservableOnChangeParams) => void | Promise<void>;
229
- }
230
- type ObservablePersistRemoteGetFnParams<T> = Omit<ObservablePersistRemoteGetParams<T>, 'onGet'>;
231
- interface ObservablePersistRemoteClass {
232
- get?<T>(params: ObservablePersistRemoteGetParams<T>): void;
233
- set?<T>(params: ObservablePersistRemoteSetParams<T>): void | Promise<void | {
234
- changes?: object;
235
- dateModified?: number;
236
- lastSync?: number;
237
- pathStrs?: string[];
238
- }>;
239
- }
240
- interface ObservablePersistRemoteFunctions<T = any> {
241
- get?(params: ObservablePersistRemoteGetFnParams<T>): T | Promise<T>;
242
- set?(params: ObservablePersistRemoteSetParams<T>): void | Promise<void | {
243
- changes?: object | undefined;
244
- dateModified?: number;
245
- lastSync?: number;
246
- }>;
247
- }
248
- interface ObservablePersistStateBase {
249
- isLoadedLocal: boolean;
250
- isEnabledLocal: boolean;
251
- isEnabledRemote: boolean;
252
- dateModified?: number;
253
- lastSync?: number;
254
- syncCount?: number;
255
- clearLocal: () => Promise<void>;
256
- sync: () => Promise<void>;
257
- getPendingChanges: () => Record<string, {
258
- p: any;
259
- v?: any;
260
- }> | undefined;
261
- }
262
- type ObservablePersistState = ObservableState & ObservablePersistStateBase;
263
124
  declare type ObjectKeys<T> = Pick<T, {
264
125
  [K in keyof T]-?: K extends string ? T[K] extends Record<string, any> ? T[K] extends any[] ? never : K : never : never;
265
126
  }[keyof T]>;
@@ -331,4 +192,4 @@ declare const internal: {
331
192
  observableSyncConfiguration: SyncedOptionsGlobal;
332
193
  };
333
194
 
334
- 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 ObservableSyncFunctions, 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, mapSyncPlugins, onChangeRemote, removeNullUndefined, syncObservable, synced, transformStringifyDates, transformStringifyKeys };
195
+ export { type FieldTransforms, type FieldTransformsInner, type ObservablePersistPlugin, type ObservablePersistPluginOptions, type ObservableSyncFunctions, type ObservableSyncSetParams, type PersistMetadata, type PersistOptions, 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, mapSyncPlugins, onChangeRemote, removeNullUndefined, syncObservable, synced, transformStringifyDates, transformStringifyKeys };
package/sync.js CHANGED
@@ -139,6 +139,7 @@ function transformStringifyDates(...args) {
139
139
  }
140
140
  var { clone, getNode, getNodeValue, getValueAtPath, globalState, runWithRetry, symbolLinked, createPreviousHandler } = state.internal;
141
141
  var mapSyncPlugins = /* @__PURE__ */ new WeakMap();
142
+ var allSyncStates = /* @__PURE__ */ new Map();
142
143
  var metadatas = /* @__PURE__ */ new WeakMap();
143
144
  var promisesLocalSaves = /* @__PURE__ */ new Set();
144
145
  function parseLocalConfig(config) {
@@ -296,9 +297,8 @@ async function prepChangeLocal(queuedChange) {
296
297
  const { syncState: syncState2, changes, syncOptions, inRemoteChange, isApplyingPending } = queuedChange;
297
298
  const persist = syncOptions.persist;
298
299
  const { config: configLocal } = parseLocalConfig(persist);
299
- const configRemote = syncOptions;
300
300
  const saveLocal = (persist == null ? void 0 : persist.name) && !configLocal.readonly && !isApplyingPending && syncState2.isPersistEnabled.peek();
301
- const saveRemote = !!(!inRemoteChange && (syncOptions == null ? void 0 : syncOptions.set) && (configRemote == null ? void 0 : configRemote.enableSync) !== false && syncState2.isSyncEnabled.peek());
301
+ const saveRemote = !!(!inRemoteChange && (syncOptions == null ? void 0 : syncOptions.set) && syncState2.isSyncEnabled.peek());
302
302
  if (saveLocal || saveRemote) {
303
303
  if (saveLocal && !syncState2.isPersistLoaded.peek()) {
304
304
  console.error(
@@ -365,9 +365,8 @@ async function prepChangeRemote(queuedChange) {
365
365
  } = queuedChange;
366
366
  const persist = syncOptions.persist;
367
367
  const { config: configLocal } = parseLocalConfig(persist);
368
- const configRemote = syncOptions;
369
368
  const saveLocal = persist && !configLocal.readonly && !isApplyingPending && syncState2.isPersistEnabled.peek();
370
- const saveRemote = !inRemoteChange && (syncOptions == null ? void 0 : syncOptions.set) && (configRemote == null ? void 0 : configRemote.enableSync) !== false && syncState2.isSyncEnabled.peek();
369
+ const saveRemote = !inRemoteChange && (syncOptions == null ? void 0 : syncOptions.set) && syncState2.isSyncEnabled.peek();
371
370
  if (saveLocal || saveRemote) {
372
371
  if (saveLocal && !syncState2.isPersistLoaded.peek()) {
373
372
  console.error(
@@ -399,7 +398,7 @@ async function prepChangeRemote(queuedChange) {
399
398
  valueAtPath,
400
399
  path,
401
400
  pathTypes,
402
- configRemote || {}
401
+ syncOptions || {}
403
402
  );
404
403
  promisesTransform.push(
405
404
  doInOrder(promiseTransformRemote, ({ value: valueTransformed, path: pathTransformed }) => {
@@ -515,7 +514,7 @@ async function doChangeRemote(changeInfo) {
515
514
  const onError = (error) => {
516
515
  var _a2;
517
516
  state$.error.set(error);
518
- (_a2 = syncOptions.onSetError) == null ? void 0 : _a2.call(syncOptions, error);
517
+ (_a2 = syncOptions.onSetError) == null ? void 0 : _a2.call(syncOptions, error, setParams);
519
518
  };
520
519
  const setParams = {
521
520
  node,
@@ -718,14 +717,15 @@ function syncObservable(obs$, syncOptionsOrSynced) {
718
717
  let sync;
719
718
  let numOutstandingGets = 0;
720
719
  const syncState$ = state.syncState(obs$);
720
+ allSyncStates.set(syncState$, node);
721
721
  syncState$.assign({
722
722
  isLoaded: !syncOptions.get,
723
723
  getPendingChanges: () => localState.pendingChanges
724
724
  });
725
- const onError = (error) => {
725
+ const onError = (error, getParams, source) => {
726
726
  var _a;
727
727
  node.state.error.set(error);
728
- (_a = syncOptions.onGetError) == null ? void 0 : _a.call(syncOptions, error);
728
+ (_a = syncOptions.onGetError) == null ? void 0 : _a.call(syncOptions, error, getParams, source);
729
729
  };
730
730
  loadLocal(obs$, syncOptions, syncState$, localState);
731
731
  if (syncOptions.get) {
@@ -843,7 +843,7 @@ function syncObservable(obs$, syncOptionsOrSynced) {
843
843
  });
844
844
  },
845
845
  refresh: () => state.when(node.state.isLoaded, sync),
846
- onError
846
+ onError: (error) => onError(error, void 0, "subscribe")
847
847
  });
848
848
  }
849
849
  const existingValue = getNodeValue(node);
@@ -854,7 +854,7 @@ function syncObservable(obs$, syncOptionsOrSynced) {
854
854
  options: syncOptions,
855
855
  lastSync,
856
856
  updateLastSync: (lastSync2) => getParams.lastSync = lastSync2,
857
- onError
857
+ onError: (error) => onError(error, getParams, "get")
858
858
  };
859
859
  numOutstandingGets++;
860
860
  node.state.isGetting.set(true);
package/sync.mjs CHANGED
@@ -137,6 +137,7 @@ function transformStringifyDates(...args) {
137
137
  }
138
138
  var { clone, getNode, getNodeValue, getValueAtPath, globalState, runWithRetry, symbolLinked, createPreviousHandler } = internal;
139
139
  var mapSyncPlugins = /* @__PURE__ */ new WeakMap();
140
+ var allSyncStates = /* @__PURE__ */ new Map();
140
141
  var metadatas = /* @__PURE__ */ new WeakMap();
141
142
  var promisesLocalSaves = /* @__PURE__ */ new Set();
142
143
  function parseLocalConfig(config) {
@@ -294,9 +295,8 @@ async function prepChangeLocal(queuedChange) {
294
295
  const { syncState: syncState2, changes, syncOptions, inRemoteChange, isApplyingPending } = queuedChange;
295
296
  const persist = syncOptions.persist;
296
297
  const { config: configLocal } = parseLocalConfig(persist);
297
- const configRemote = syncOptions;
298
298
  const saveLocal = (persist == null ? void 0 : persist.name) && !configLocal.readonly && !isApplyingPending && syncState2.isPersistEnabled.peek();
299
- const saveRemote = !!(!inRemoteChange && (syncOptions == null ? void 0 : syncOptions.set) && (configRemote == null ? void 0 : configRemote.enableSync) !== false && syncState2.isSyncEnabled.peek());
299
+ const saveRemote = !!(!inRemoteChange && (syncOptions == null ? void 0 : syncOptions.set) && syncState2.isSyncEnabled.peek());
300
300
  if (saveLocal || saveRemote) {
301
301
  if (saveLocal && !syncState2.isPersistLoaded.peek()) {
302
302
  console.error(
@@ -363,9 +363,8 @@ async function prepChangeRemote(queuedChange) {
363
363
  } = queuedChange;
364
364
  const persist = syncOptions.persist;
365
365
  const { config: configLocal } = parseLocalConfig(persist);
366
- const configRemote = syncOptions;
367
366
  const saveLocal = persist && !configLocal.readonly && !isApplyingPending && syncState2.isPersistEnabled.peek();
368
- const saveRemote = !inRemoteChange && (syncOptions == null ? void 0 : syncOptions.set) && (configRemote == null ? void 0 : configRemote.enableSync) !== false && syncState2.isSyncEnabled.peek();
367
+ const saveRemote = !inRemoteChange && (syncOptions == null ? void 0 : syncOptions.set) && syncState2.isSyncEnabled.peek();
369
368
  if (saveLocal || saveRemote) {
370
369
  if (saveLocal && !syncState2.isPersistLoaded.peek()) {
371
370
  console.error(
@@ -397,7 +396,7 @@ async function prepChangeRemote(queuedChange) {
397
396
  valueAtPath,
398
397
  path,
399
398
  pathTypes,
400
- configRemote || {}
399
+ syncOptions || {}
401
400
  );
402
401
  promisesTransform.push(
403
402
  doInOrder(promiseTransformRemote, ({ value: valueTransformed, path: pathTransformed }) => {
@@ -513,7 +512,7 @@ async function doChangeRemote(changeInfo) {
513
512
  const onError = (error) => {
514
513
  var _a2;
515
514
  state$.error.set(error);
516
- (_a2 = syncOptions.onSetError) == null ? void 0 : _a2.call(syncOptions, error);
515
+ (_a2 = syncOptions.onSetError) == null ? void 0 : _a2.call(syncOptions, error, setParams);
517
516
  };
518
517
  const setParams = {
519
518
  node,
@@ -716,14 +715,15 @@ function syncObservable(obs$, syncOptionsOrSynced) {
716
715
  let sync;
717
716
  let numOutstandingGets = 0;
718
717
  const syncState$ = syncState(obs$);
718
+ allSyncStates.set(syncState$, node);
719
719
  syncState$.assign({
720
720
  isLoaded: !syncOptions.get,
721
721
  getPendingChanges: () => localState.pendingChanges
722
722
  });
723
- const onError = (error) => {
723
+ const onError = (error, getParams, source) => {
724
724
  var _a;
725
725
  node.state.error.set(error);
726
- (_a = syncOptions.onGetError) == null ? void 0 : _a.call(syncOptions, error);
726
+ (_a = syncOptions.onGetError) == null ? void 0 : _a.call(syncOptions, error, getParams, source);
727
727
  };
728
728
  loadLocal(obs$, syncOptions, syncState$, localState);
729
729
  if (syncOptions.get) {
@@ -841,7 +841,7 @@ function syncObservable(obs$, syncOptionsOrSynced) {
841
841
  });
842
842
  },
843
843
  refresh: () => when(node.state.isLoaded, sync),
844
- onError
844
+ onError: (error) => onError(error, void 0, "subscribe")
845
845
  });
846
846
  }
847
847
  const existingValue = getNodeValue(node);
@@ -852,7 +852,7 @@ function syncObservable(obs$, syncOptionsOrSynced) {
852
852
  options: syncOptions,
853
853
  lastSync,
854
854
  updateLastSync: (lastSync2) => getParams.lastSync = lastSync2,
855
- onError
855
+ onError: (error) => onError(error, getParams, "get")
856
856
  };
857
857
  numOutstandingGets++;
858
858
  node.state.isGetting.set(true);