@legendapp/state 3.0.0-beta.33 → 3.0.0-beta.35

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
@@ -3,7 +3,7 @@ type ArrayOverrideFnNames = 'find' | 'findIndex' | 'every' | 'some' | 'filter' |
3
3
  type RemoveIndex<T> = {
4
4
  [K in keyof T as string extends K ? never : number extends K ? never : K]: T[K];
5
5
  };
6
- type BuiltIns = String | Boolean | Number | Date | Error | RegExp | Array<any> | Function | Promise<any> | OpaqueObject<any>;
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
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]>;
package/index.d.ts CHANGED
@@ -3,7 +3,7 @@ type ArrayOverrideFnNames = 'find' | 'findIndex' | 'every' | 'some' | 'filter' |
3
3
  type RemoveIndex<T> = {
4
4
  [K in keyof T as string extends K ? never : number extends K ? never : K]: T[K];
5
5
  };
6
- type BuiltIns = String | Boolean | Number | Date | Error | RegExp | Array<any> | Function | Promise<any> | OpaqueObject<any>;
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
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]>;
package/index.js CHANGED
@@ -1637,7 +1637,11 @@ var proxyHandler = {
1637
1637
  return { configurable: false, enumerable: false };
1638
1638
  }
1639
1639
  const value = getNodeValue(node);
1640
- return isPrimitive(value) ? void 0 : Reflect.getOwnPropertyDescriptor(value, prop);
1640
+ if (isPrimitive(value)) {
1641
+ return void 0;
1642
+ }
1643
+ const descriptor = Reflect.getOwnPropertyDescriptor(value, prop);
1644
+ return descriptor ? { ...descriptor, configurable: true } : void 0;
1641
1645
  },
1642
1646
  set(node, prop, value) {
1643
1647
  if (node.isSetting) {
@@ -2435,13 +2439,10 @@ function syncState(obs) {
2435
2439
  syncCount: 0,
2436
2440
  resetPersistence: void 0,
2437
2441
  reset: () => Promise.resolve(),
2438
- sync: (options) => {
2439
- var _a, _b;
2440
- if (options == null ? void 0 : options.resetLastSync) {
2441
- (_a = node.state) == null ? void 0 : _a.lastSync.set(void 0);
2442
- }
2442
+ sync: () => {
2443
+ var _a;
2443
2444
  obs.peek();
2444
- if ((_b = node.state) == null ? void 0 : _b.isGetting.peek()) {
2445
+ if ((_a = node.state) == null ? void 0 : _a.isGetting.peek()) {
2445
2446
  return when(node.state.isLoaded);
2446
2447
  }
2447
2448
  return Promise.resolve();
package/index.mjs CHANGED
@@ -1635,7 +1635,11 @@ var proxyHandler = {
1635
1635
  return { configurable: false, enumerable: false };
1636
1636
  }
1637
1637
  const value = getNodeValue(node);
1638
- return isPrimitive(value) ? void 0 : Reflect.getOwnPropertyDescriptor(value, prop);
1638
+ if (isPrimitive(value)) {
1639
+ return void 0;
1640
+ }
1641
+ const descriptor = Reflect.getOwnPropertyDescriptor(value, prop);
1642
+ return descriptor ? { ...descriptor, configurable: true } : void 0;
1639
1643
  },
1640
1644
  set(node, prop, value) {
1641
1645
  if (node.isSetting) {
@@ -2433,13 +2437,10 @@ function syncState(obs) {
2433
2437
  syncCount: 0,
2434
2438
  resetPersistence: void 0,
2435
2439
  reset: () => Promise.resolve(),
2436
- sync: (options) => {
2437
- var _a, _b;
2438
- if (options == null ? void 0 : options.resetLastSync) {
2439
- (_a = node.state) == null ? void 0 : _a.lastSync.set(void 0);
2440
- }
2440
+ sync: () => {
2441
+ var _a;
2441
2442
  obs.peek();
2442
- if ((_b = node.state) == null ? void 0 : _b.isGetting.peek()) {
2443
+ if ((_a = node.state) == null ? void 0 : _a.isGetting.peek()) {
2443
2444
  return when(node.state.isLoaded);
2444
2445
  }
2445
2446
  return Promise.resolve();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@legendapp/state",
3
- "version": "3.0.0-beta.33",
3
+ "version": "3.0.0-beta.35",
4
4
  "description": "legend-state",
5
5
  "sideEffects": false,
6
6
  "private": false,
package/react.d.mts CHANGED
@@ -187,4 +187,4 @@ declare function configureReactive({ components, binders, }: {
187
187
  binders?: Record<string, BindKeys>;
188
188
  }): void;
189
189
 
190
- export { type BindKey, type BindKeys, Computed, type ExtractFCPropsType, type FCReactive, type FCReactiveObject, For, type IReactive, Memo, type ObjectShapeWith$, type ReactifyProps, Reactive, type ShapeWith$, type ShapeWithNew$, type ShapeWithPick$, Show, Switch, type UseObserveOptions, type UseSelectorOptions, configureReactive, hasSymbol, observer, reactive, reactiveComponents, reactiveObserver, useSelector as use$, useComputed, useEffectOnce, useIsMounted, useMount, useMountOnce, useObservable, useObservableReducer, useObserve, useObserveEffect, usePauseProvider, useSelector, useUnmount, useUnmountOnce, useWhen, useWhenReady };
190
+ export { type BindKey, type BindKeys, Computed, type ExtractFCPropsType, type FCReactive, type FCReactiveObject, For, type IReactive, Memo, type ObjectShapeWith$, type ReactifyProps, Reactive, type ShapeWith$, type ShapeWithNew$, type ShapeWithPick$, Show, Switch, type UseObserveOptions, type UseSelectorOptions, configureReactive, hasSymbol, observer, reactive, reactiveComponents, reactiveObserver, useSelector as use$, useComputed, useEffectOnce, useIsMounted, useObservable as useLocalObservable, useMount, useMountOnce, useObservable, useObservableReducer, useObserve, useObserveEffect, usePauseProvider, useSelector, useUnmount, useUnmountOnce, useSelector as useValue, useWhen, useWhenReady };
package/react.d.ts CHANGED
@@ -187,4 +187,4 @@ declare function configureReactive({ components, binders, }: {
187
187
  binders?: Record<string, BindKeys>;
188
188
  }): void;
189
189
 
190
- export { type BindKey, type BindKeys, Computed, type ExtractFCPropsType, type FCReactive, type FCReactiveObject, For, type IReactive, Memo, type ObjectShapeWith$, type ReactifyProps, Reactive, type ShapeWith$, type ShapeWithNew$, type ShapeWithPick$, Show, Switch, type UseObserveOptions, type UseSelectorOptions, configureReactive, hasSymbol, observer, reactive, reactiveComponents, reactiveObserver, useSelector as use$, useComputed, useEffectOnce, useIsMounted, useMount, useMountOnce, useObservable, useObservableReducer, useObserve, useObserveEffect, usePauseProvider, useSelector, useUnmount, useUnmountOnce, useWhen, useWhenReady };
190
+ export { type BindKey, type BindKeys, Computed, type ExtractFCPropsType, type FCReactive, type FCReactiveObject, For, type IReactive, Memo, type ObjectShapeWith$, type ReactifyProps, Reactive, type ShapeWith$, type ShapeWithNew$, type ShapeWithPick$, Show, Switch, type UseObserveOptions, type UseSelectorOptions, configureReactive, hasSymbol, observer, reactive, reactiveComponents, reactiveObserver, useSelector as use$, useComputed, useEffectOnce, useIsMounted, useObservable as useLocalObservable, useMount, useMountOnce, useObservable, useObservableReducer, useObserve, useObserveEffect, usePauseProvider, useSelector, useUnmount, useUnmountOnce, useSelector as useValue, useWhen, useWhenReady };
package/react.js CHANGED
@@ -510,9 +510,15 @@ function useIsMounted() {
510
510
  return obs;
511
511
  }
512
512
  function useObservableReducer(reducer, initializerArg, initializer) {
513
- const obs = useObservable(
514
- () => initializerArg !== void 0 && state.isFunction(initializerArg) ? initializer(initializerArg) : initializerArg
515
- );
513
+ const obs = useObservable(() => {
514
+ if (initializer) {
515
+ return initializer(initializerArg);
516
+ }
517
+ if (state.isFunction(initializerArg)) {
518
+ return initializerArg();
519
+ }
520
+ return initializerArg;
521
+ });
516
522
  const dispatch = (action) => {
517
523
  obs.set(reducer(obs.get(), action));
518
524
  };
@@ -622,6 +628,7 @@ exports.use$ = useSelector;
622
628
  exports.useComputed = useComputed;
623
629
  exports.useEffectOnce = useEffectOnce;
624
630
  exports.useIsMounted = useIsMounted;
631
+ exports.useLocalObservable = useObservable;
625
632
  exports.useMount = useMount;
626
633
  exports.useMountOnce = useMountOnce;
627
634
  exports.useObservable = useObservable;
@@ -632,5 +639,6 @@ exports.usePauseProvider = usePauseProvider;
632
639
  exports.useSelector = useSelector;
633
640
  exports.useUnmount = useUnmount;
634
641
  exports.useUnmountOnce = useUnmountOnce;
642
+ exports.useValue = useSelector;
635
643
  exports.useWhen = useWhen;
636
644
  exports.useWhenReady = useWhenReady;
package/react.mjs CHANGED
@@ -504,9 +504,15 @@ function useIsMounted() {
504
504
  return obs;
505
505
  }
506
506
  function useObservableReducer(reducer, initializerArg, initializer) {
507
- const obs = useObservable(
508
- () => initializerArg !== void 0 && isFunction(initializerArg) ? initializer(initializerArg) : initializerArg
509
- );
507
+ const obs = useObservable(() => {
508
+ if (initializer) {
509
+ return initializer(initializerArg);
510
+ }
511
+ if (isFunction(initializerArg)) {
512
+ return initializerArg();
513
+ }
514
+ return initializerArg;
515
+ });
510
516
  const dispatch = (action) => {
511
517
  obs.set(reducer(obs.get(), action));
512
518
  };
@@ -600,4 +606,4 @@ function useWhenReady(predicate, effect) {
600
606
  return useMemo(() => whenReady(predicate, effect), []);
601
607
  }
602
608
 
603
- export { Computed, For, Memo, Reactive, Show, Switch, configureReactive, hasSymbol, observer, reactive, reactiveComponents, reactiveObserver, useSelector as use$, useComputed, useEffectOnce, useIsMounted, useMount, useMountOnce, useObservable, useObservableReducer, useObserve, useObserveEffect, usePauseProvider, useSelector, useUnmount, useUnmountOnce, useWhen, useWhenReady };
609
+ export { Computed, For, Memo, Reactive, Show, Switch, configureReactive, hasSymbol, observer, reactive, reactiveComponents, reactiveObserver, useSelector as use$, useComputed, useEffectOnce, useIsMounted, useObservable as useLocalObservable, useMount, useMountOnce, useObservable, useObservableReducer, useObserve, useObserveEffect, usePauseProvider, useSelector, useUnmount, useUnmountOnce, useSelector as useValue, useWhen, useWhenReady };
@@ -52,7 +52,7 @@ function syncedQuery(params) {
52
52
  }
53
53
  return result.data;
54
54
  } else {
55
- observer.refetch();
55
+ return Promise.resolve(observer.refetch()).then((res) => res.data);
56
56
  }
57
57
  };
58
58
  const subscribe = ({ update }) => {
@@ -50,7 +50,7 @@ function syncedQuery(params) {
50
50
  }
51
51
  return result.data;
52
52
  } else {
53
- observer.refetch();
53
+ return Promise.resolve(observer.refetch()).then((res) => res.data);
54
54
  }
55
55
  };
56
56
  const subscribe = ({ update }) => {
package/sync.d.mts CHANGED
@@ -211,6 +211,7 @@ declare const mapSyncPlugins: WeakMap<ClassConstructor<ObservablePersistPlugin>
211
211
  declare function onChangeRemote(cb: () => void): void;
212
212
  declare function syncObservable<T>(obs$: ObservableParam<T>, syncOptions: SyncedOptions<T>): Observable<ObservableSyncState>;
213
213
  declare function syncObservable<T>(obs$: ObservableParam<T>, syncOptions: Synced<T>): Observable<ObservableSyncState>;
214
+ declare function getAllSyncStates(): readonly [Observable<ObservableSyncState>, NodeInfo][];
214
215
 
215
216
  declare function synced<TRemote, TLocal = TRemote>(params: SyncedOptions<TRemote, TLocal> | (() => TRemote)): Synced<TLocal>;
216
217
 
@@ -230,4 +231,4 @@ declare const internal: {
230
231
  runWithRetry: typeof runWithRetry;
231
232
  };
232
233
 
233
- export { type FieldTransforms, type FieldTransformsInner, type ObservablePersistAsyncStoragePluginOptions, type ObservablePersistIndexedDBPluginOptions, type ObservablePersistPlugin, type ObservablePersistPluginOptions, type ObservableSyncFunctions, type ObservableSyncSetParams, type OnErrorRetryParams, type PendingChanges, type PersistMetadata, type PersistOptions, type QueryByModified, type StringToDate, type SubscribeOptions, type SyncTransform, type SyncTransformMethod, type Synced, type SyncedErrorParams, type SyncedGetParams, type SyncedGetSetBaseParams, type SyncedGetSetSubscribeBaseParams, type SyncedOptions, type SyncedOptionsGlobal, type SyncedSetParams, type SyncedSubscribeParams, type TransformStringifyKeys, type TransformStringifyOptions, type TransformStringsToDates, combineTransforms, configureObservableSync, configureSynced, createRevertChanges, deepEqual, diffObjects, internal, mapSyncPlugins, onChangeRemote, removeNullUndefined, syncObservable, synced, transformStringifyDates, transformStringifyKeys };
234
+ export { type FieldTransforms, type FieldTransformsInner, type ObservablePersistAsyncStoragePluginOptions, type ObservablePersistIndexedDBPluginOptions, type ObservablePersistPlugin, type ObservablePersistPluginOptions, type ObservableSyncFunctions, type ObservableSyncSetParams, type OnErrorRetryParams, type PendingChanges, type PersistMetadata, type PersistOptions, type QueryByModified, type StringToDate, type SubscribeOptions, type SyncTransform, type SyncTransformMethod, type Synced, type SyncedErrorParams, type SyncedGetParams, type SyncedGetSetBaseParams, type SyncedGetSetSubscribeBaseParams, type SyncedOptions, type SyncedOptionsGlobal, type SyncedSetParams, type SyncedSubscribeParams, type TransformStringifyKeys, type TransformStringifyOptions, type TransformStringsToDates, combineTransforms, configureObservableSync, configureSynced, createRevertChanges, deepEqual, diffObjects, getAllSyncStates, internal, mapSyncPlugins, onChangeRemote, removeNullUndefined, syncObservable, synced, transformStringifyDates, transformStringifyKeys };
package/sync.d.ts CHANGED
@@ -211,6 +211,7 @@ declare const mapSyncPlugins: WeakMap<ClassConstructor<ObservablePersistPlugin>
211
211
  declare function onChangeRemote(cb: () => void): void;
212
212
  declare function syncObservable<T>(obs$: ObservableParam<T>, syncOptions: SyncedOptions<T>): Observable<ObservableSyncState>;
213
213
  declare function syncObservable<T>(obs$: ObservableParam<T>, syncOptions: Synced<T>): Observable<ObservableSyncState>;
214
+ declare function getAllSyncStates(): readonly [Observable<ObservableSyncState>, NodeInfo][];
214
215
 
215
216
  declare function synced<TRemote, TLocal = TRemote>(params: SyncedOptions<TRemote, TLocal> | (() => TRemote)): Synced<TLocal>;
216
217
 
@@ -230,4 +231,4 @@ declare const internal: {
230
231
  runWithRetry: typeof runWithRetry;
231
232
  };
232
233
 
233
- export { type FieldTransforms, type FieldTransformsInner, type ObservablePersistAsyncStoragePluginOptions, type ObservablePersistIndexedDBPluginOptions, type ObservablePersistPlugin, type ObservablePersistPluginOptions, type ObservableSyncFunctions, type ObservableSyncSetParams, type OnErrorRetryParams, type PendingChanges, type PersistMetadata, type PersistOptions, type QueryByModified, type StringToDate, type SubscribeOptions, type SyncTransform, type SyncTransformMethod, type Synced, type SyncedErrorParams, type SyncedGetParams, type SyncedGetSetBaseParams, type SyncedGetSetSubscribeBaseParams, type SyncedOptions, type SyncedOptionsGlobal, type SyncedSetParams, type SyncedSubscribeParams, type TransformStringifyKeys, type TransformStringifyOptions, type TransformStringsToDates, combineTransforms, configureObservableSync, configureSynced, createRevertChanges, deepEqual, diffObjects, internal, mapSyncPlugins, onChangeRemote, removeNullUndefined, syncObservable, synced, transformStringifyDates, transformStringifyKeys };
234
+ export { type FieldTransforms, type FieldTransformsInner, type ObservablePersistAsyncStoragePluginOptions, type ObservablePersistIndexedDBPluginOptions, type ObservablePersistPlugin, type ObservablePersistPluginOptions, type ObservableSyncFunctions, type ObservableSyncSetParams, type OnErrorRetryParams, type PendingChanges, type PersistMetadata, type PersistOptions, type QueryByModified, type StringToDate, type SubscribeOptions, type SyncTransform, type SyncTransformMethod, type Synced, type SyncedErrorParams, type SyncedGetParams, type SyncedGetSetBaseParams, type SyncedGetSetSubscribeBaseParams, type SyncedOptions, type SyncedOptionsGlobal, type SyncedSetParams, type SyncedSubscribeParams, type TransformStringifyKeys, type TransformStringifyOptions, type TransformStringsToDates, combineTransforms, configureObservableSync, configureSynced, createRevertChanges, deepEqual, diffObjects, getAllSyncStates, internal, mapSyncPlugins, onChangeRemote, removeNullUndefined, syncObservable, synced, transformStringifyDates, transformStringifyKeys };
package/sync.js CHANGED
@@ -179,28 +179,43 @@ function runWithRetry(state, retryOptions, retryId, fn) {
179
179
  let timeoutRetry;
180
180
  if (mapRetryTimeouts.has(retryId)) {
181
181
  clearTimeout(mapRetryTimeouts.get(retryId));
182
+ mapRetryTimeouts.delete(retryId);
182
183
  }
184
+ const clearRetryState = () => {
185
+ if (timeoutRetry !== void 0) {
186
+ clearTimeout(timeoutRetry);
187
+ timeoutRetry = void 0;
188
+ }
189
+ mapRetryTimeouts.delete(retryId);
190
+ };
183
191
  return new Promise((resolve, reject) => {
184
192
  const run = () => {
185
193
  value.then((val) => {
194
+ state.retryNum = 0;
195
+ clearRetryState();
186
196
  resolve(val);
187
197
  }).catch((error) => {
188
- state.retryNum++;
189
- if (timeoutRetry) {
198
+ if (timeoutRetry !== void 0) {
190
199
  clearTimeout(timeoutRetry);
200
+ timeoutRetry = void 0;
191
201
  }
192
- if (!state.cancelRetry) {
193
- const timeout = createRetryTimeout(retryOptions, state.retryNum, () => {
194
- value = fn(state);
195
- run();
196
- });
197
- if (timeout === false) {
198
- state.cancelRetry = true;
199
- reject(error);
200
- } else {
201
- mapRetryTimeouts.set(retryId, timeout);
202
- timeoutRetry = timeout;
203
- }
202
+ state.retryNum++;
203
+ if (state.cancelRetry) {
204
+ clearRetryState();
205
+ reject(error);
206
+ return;
207
+ }
208
+ const timeout = createRetryTimeout(retryOptions, state.retryNum, () => {
209
+ value = fn(state);
210
+ run();
211
+ });
212
+ if (timeout === false) {
213
+ state.cancelRetry = true;
214
+ clearRetryState();
215
+ reject(error);
216
+ } else {
217
+ timeoutRetry = timeout;
218
+ mapRetryTimeouts.set(retryId, timeout);
204
219
  }
205
220
  });
206
221
  };
@@ -209,6 +224,7 @@ function runWithRetry(state, retryOptions, retryId, fn) {
209
224
  }
210
225
  return value;
211
226
  } catch (error) {
227
+ mapRetryTimeouts.delete(retryId);
212
228
  return Promise.reject(error);
213
229
  }
214
230
  }
@@ -243,7 +259,8 @@ var {
243
259
  getValueAtPath,
244
260
  globalState,
245
261
  registerMiddleware,
246
- symbolLinked
262
+ symbolLinked,
263
+ setNodeValue
247
264
  } = state.internal;
248
265
  var mapSyncPlugins = /* @__PURE__ */ new WeakMap();
249
266
  var allSyncStates = /* @__PURE__ */ new Map();
@@ -324,9 +341,14 @@ function mergeChanges(changes) {
324
341
  const existing = changesByPath.get(pathStr);
325
342
  if (existing) {
326
343
  if (change.valueAtPath === existing.prevAtPath) {
327
- changesOut.splice(changesOut.indexOf(change), 1);
344
+ const idx = changesOut.indexOf(existing);
345
+ if (idx >= 0) {
346
+ changesOut.splice(idx, 1);
347
+ }
348
+ changesByPath.delete(pathStr);
328
349
  } else {
329
350
  existing.valueAtPath = change.valueAtPath;
351
+ existing.pathTypes = change.pathTypes;
330
352
  }
331
353
  } else {
332
354
  let found = false;
@@ -955,6 +977,7 @@ function syncObservable(obs$, syncOptionsOrSynced) {
955
977
  const runGet = () => {
956
978
  var _a;
957
979
  const onChange = async ({ value, mode, lastSync: lastSync2 }) => {
980
+ var _a2;
958
981
  mode = mode || syncOptions.mode || "set";
959
982
  if (value !== void 0) {
960
983
  value = transformLoadData(value, syncOptions, true, "get");
@@ -1011,6 +1034,9 @@ function syncObservable(obs$, syncOptionsOrSynced) {
1011
1034
  });
1012
1035
  }
1013
1036
  }
1037
+ if (options == null ? void 0 : options.resetLastSync) {
1038
+ setNodeValue(node, (_a2 = syncOptions.initial) != null ? _a2 : void 0);
1039
+ }
1014
1040
  onChangeRemote2(() => {
1015
1041
  if (state.isPlainObject(value)) {
1016
1042
  value = state.ObservableHint.plain(value);
@@ -1232,6 +1258,14 @@ function syncObservable(obs$, syncOptionsOrSynced) {
1232
1258
  node.dirtyFn = sync;
1233
1259
  await promise;
1234
1260
  };
1261
+ syncState$.lastSync.onChange(({ value }) => {
1262
+ const metadata = metadatas.get(obs$);
1263
+ if (metadata && metadata.lastSync !== value) {
1264
+ updateMetadataImmediate(obs$, localState, syncState$, syncOptions, {
1265
+ lastSync: value
1266
+ });
1267
+ }
1268
+ });
1235
1269
  const onAllPersistLoaded = () => {
1236
1270
  var _a, _b;
1237
1271
  let parentNode = node;
@@ -1255,7 +1289,10 @@ function syncObservable(obs$, syncOptionsOrSynced) {
1255
1289
  });
1256
1290
  return syncState$;
1257
1291
  }
1258
- var { getProxy, globalState: globalState2, setNodeValue, getNodeValue: getNodeValue2 } = state.internal;
1292
+ function getAllSyncStates() {
1293
+ return Array.from(allSyncStates.entries());
1294
+ }
1295
+ var { getProxy, globalState: globalState2, setNodeValue: setNodeValue2, getNodeValue: getNodeValue2 } = state.internal;
1259
1296
  function enableActivateSyncedNode() {
1260
1297
  globalState2.activateSyncedNode = function activateSyncedNode(node, newValue) {
1261
1298
  const obs$ = getProxy(node);
@@ -1278,7 +1315,7 @@ function enableActivateSyncedNode() {
1278
1315
  } else {
1279
1316
  newValue = initial;
1280
1317
  }
1281
- setNodeValue(node, promiseReturn ? void 0 : newValue);
1318
+ setNodeValue2(node, promiseReturn ? void 0 : newValue);
1282
1319
  syncObservable(obs$, { ...node.activationState, get, set });
1283
1320
  return { update: onChange, value: newValue };
1284
1321
  } else {
@@ -1339,6 +1376,7 @@ exports.configureSynced = configureSynced;
1339
1376
  exports.createRevertChanges = createRevertChanges;
1340
1377
  exports.deepEqual = deepEqual;
1341
1378
  exports.diffObjects = diffObjects;
1379
+ exports.getAllSyncStates = getAllSyncStates;
1342
1380
  exports.internal = internal5;
1343
1381
  exports.mapSyncPlugins = mapSyncPlugins;
1344
1382
  exports.onChangeRemote = onChangeRemote2;
package/sync.mjs CHANGED
@@ -177,28 +177,43 @@ function runWithRetry(state, retryOptions, retryId, fn) {
177
177
  let timeoutRetry;
178
178
  if (mapRetryTimeouts.has(retryId)) {
179
179
  clearTimeout(mapRetryTimeouts.get(retryId));
180
+ mapRetryTimeouts.delete(retryId);
180
181
  }
182
+ const clearRetryState = () => {
183
+ if (timeoutRetry !== void 0) {
184
+ clearTimeout(timeoutRetry);
185
+ timeoutRetry = void 0;
186
+ }
187
+ mapRetryTimeouts.delete(retryId);
188
+ };
181
189
  return new Promise((resolve, reject) => {
182
190
  const run = () => {
183
191
  value.then((val) => {
192
+ state.retryNum = 0;
193
+ clearRetryState();
184
194
  resolve(val);
185
195
  }).catch((error) => {
186
- state.retryNum++;
187
- if (timeoutRetry) {
196
+ if (timeoutRetry !== void 0) {
188
197
  clearTimeout(timeoutRetry);
198
+ timeoutRetry = void 0;
189
199
  }
190
- if (!state.cancelRetry) {
191
- const timeout = createRetryTimeout(retryOptions, state.retryNum, () => {
192
- value = fn(state);
193
- run();
194
- });
195
- if (timeout === false) {
196
- state.cancelRetry = true;
197
- reject(error);
198
- } else {
199
- mapRetryTimeouts.set(retryId, timeout);
200
- timeoutRetry = timeout;
201
- }
200
+ state.retryNum++;
201
+ if (state.cancelRetry) {
202
+ clearRetryState();
203
+ reject(error);
204
+ return;
205
+ }
206
+ const timeout = createRetryTimeout(retryOptions, state.retryNum, () => {
207
+ value = fn(state);
208
+ run();
209
+ });
210
+ if (timeout === false) {
211
+ state.cancelRetry = true;
212
+ clearRetryState();
213
+ reject(error);
214
+ } else {
215
+ timeoutRetry = timeout;
216
+ mapRetryTimeouts.set(retryId, timeout);
202
217
  }
203
218
  });
204
219
  };
@@ -207,6 +222,7 @@ function runWithRetry(state, retryOptions, retryId, fn) {
207
222
  }
208
223
  return value;
209
224
  } catch (error) {
225
+ mapRetryTimeouts.delete(retryId);
210
226
  return Promise.reject(error);
211
227
  }
212
228
  }
@@ -241,7 +257,8 @@ var {
241
257
  getValueAtPath,
242
258
  globalState,
243
259
  registerMiddleware,
244
- symbolLinked
260
+ symbolLinked,
261
+ setNodeValue
245
262
  } = internal;
246
263
  var mapSyncPlugins = /* @__PURE__ */ new WeakMap();
247
264
  var allSyncStates = /* @__PURE__ */ new Map();
@@ -322,9 +339,14 @@ function mergeChanges(changes) {
322
339
  const existing = changesByPath.get(pathStr);
323
340
  if (existing) {
324
341
  if (change.valueAtPath === existing.prevAtPath) {
325
- changesOut.splice(changesOut.indexOf(change), 1);
342
+ const idx = changesOut.indexOf(existing);
343
+ if (idx >= 0) {
344
+ changesOut.splice(idx, 1);
345
+ }
346
+ changesByPath.delete(pathStr);
326
347
  } else {
327
348
  existing.valueAtPath = change.valueAtPath;
349
+ existing.pathTypes = change.pathTypes;
328
350
  }
329
351
  } else {
330
352
  let found = false;
@@ -953,6 +975,7 @@ function syncObservable(obs$, syncOptionsOrSynced) {
953
975
  const runGet = () => {
954
976
  var _a;
955
977
  const onChange = async ({ value, mode, lastSync: lastSync2 }) => {
978
+ var _a2;
956
979
  mode = mode || syncOptions.mode || "set";
957
980
  if (value !== void 0) {
958
981
  value = transformLoadData(value, syncOptions, true, "get");
@@ -1009,6 +1032,9 @@ function syncObservable(obs$, syncOptionsOrSynced) {
1009
1032
  });
1010
1033
  }
1011
1034
  }
1035
+ if (options == null ? void 0 : options.resetLastSync) {
1036
+ setNodeValue(node, (_a2 = syncOptions.initial) != null ? _a2 : void 0);
1037
+ }
1012
1038
  onChangeRemote2(() => {
1013
1039
  if (isPlainObject(value)) {
1014
1040
  value = ObservableHint.plain(value);
@@ -1230,6 +1256,14 @@ function syncObservable(obs$, syncOptionsOrSynced) {
1230
1256
  node.dirtyFn = sync;
1231
1257
  await promise;
1232
1258
  };
1259
+ syncState$.lastSync.onChange(({ value }) => {
1260
+ const metadata = metadatas.get(obs$);
1261
+ if (metadata && metadata.lastSync !== value) {
1262
+ updateMetadataImmediate(obs$, localState, syncState$, syncOptions, {
1263
+ lastSync: value
1264
+ });
1265
+ }
1266
+ });
1233
1267
  const onAllPersistLoaded = () => {
1234
1268
  var _a, _b;
1235
1269
  let parentNode = node;
@@ -1253,7 +1287,10 @@ function syncObservable(obs$, syncOptionsOrSynced) {
1253
1287
  });
1254
1288
  return syncState$;
1255
1289
  }
1256
- var { getProxy, globalState: globalState2, setNodeValue, getNodeValue: getNodeValue2 } = internal;
1290
+ function getAllSyncStates() {
1291
+ return Array.from(allSyncStates.entries());
1292
+ }
1293
+ var { getProxy, globalState: globalState2, setNodeValue: setNodeValue2, getNodeValue: getNodeValue2 } = internal;
1257
1294
  function enableActivateSyncedNode() {
1258
1295
  globalState2.activateSyncedNode = function activateSyncedNode(node, newValue) {
1259
1296
  const obs$ = getProxy(node);
@@ -1276,7 +1313,7 @@ function enableActivateSyncedNode() {
1276
1313
  } else {
1277
1314
  newValue = initial;
1278
1315
  }
1279
- setNodeValue(node, promiseReturn ? void 0 : newValue);
1316
+ setNodeValue2(node, promiseReturn ? void 0 : newValue);
1280
1317
  syncObservable(obs$, { ...node.activationState, get, set });
1281
1318
  return { update: onChange, value: newValue };
1282
1319
  } else {
@@ -1331,4 +1368,4 @@ var internal5 = {
1331
1368
  runWithRetry
1332
1369
  };
1333
1370
 
1334
- export { combineTransforms, configureObservableSync, configureSynced, createRevertChanges, deepEqual, diffObjects, internal5 as internal, mapSyncPlugins, onChangeRemote2 as onChangeRemote, removeNullUndefined, syncObservable, synced, transformStringifyDates, transformStringifyKeys };
1371
+ export { combineTransforms, configureObservableSync, configureSynced, createRevertChanges, deepEqual, diffObjects, getAllSyncStates, internal5 as internal, mapSyncPlugins, onChangeRemote2 as onChangeRemote, removeNullUndefined, syncObservable, synced, transformStringifyDates, transformStringifyKeys };