@legendapp/state 3.0.0-alpha.3 → 3.0.0-alpha.30

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 (78) hide show
  1. package/CHANGELOG.md +831 -1
  2. package/LICENSE +21 -1
  3. package/README.md +141 -1
  4. package/babel.js +0 -2
  5. package/babel.mjs +0 -2
  6. package/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/config.d.mts +13 -0
  15. package/config.d.ts +13 -0
  16. package/config.js +2052 -0
  17. package/config.mjs +2050 -0
  18. package/helpers/trackHistory.js +2 -2
  19. package/helpers/trackHistory.mjs +2 -2
  20. package/index.d.mts +21 -302
  21. package/index.d.ts +21 -302
  22. package/index.js +274 -318
  23. package/index.mjs +275 -317
  24. package/observableInterfaces-Dilj6F92.d.mts +282 -0
  25. package/observableInterfaces-Dilj6F92.d.ts +282 -0
  26. package/package.json +11 -1
  27. package/persist-plugins/async-storage.d.mts +6 -3
  28. package/persist-plugins/async-storage.d.ts +6 -3
  29. package/persist-plugins/async-storage.js +12 -4
  30. package/persist-plugins/async-storage.mjs +12 -5
  31. package/persist-plugins/indexeddb.d.mts +6 -4
  32. package/persist-plugins/indexeddb.d.ts +6 -4
  33. package/persist-plugins/indexeddb.js +16 -6
  34. package/persist-plugins/indexeddb.mjs +16 -7
  35. package/persist-plugins/mmkv.d.mts +5 -1
  36. package/persist-plugins/mmkv.d.ts +5 -1
  37. package/persist-plugins/mmkv.js +14 -5
  38. package/persist-plugins/mmkv.mjs +14 -6
  39. package/react.d.mts +18 -14
  40. package/react.d.ts +18 -14
  41. package/react.js +57 -32
  42. package/react.mjs +58 -33
  43. package/sync-plugins/_transformObjectFields.d.mts +31 -0
  44. package/sync-plugins/_transformObjectFields.d.ts +31 -0
  45. package/sync-plugins/_transformObjectFields.js +114 -0
  46. package/sync-plugins/_transformObjectFields.mjs +110 -0
  47. package/sync-plugins/crud.d.mts +15 -23
  48. package/sync-plugins/crud.d.ts +15 -23
  49. package/sync-plugins/crud.js +213 -134
  50. package/sync-plugins/crud.mjs +214 -135
  51. package/sync-plugins/fetch.js +12 -8
  52. package/sync-plugins/fetch.mjs +13 -9
  53. package/sync-plugins/firebase.d.mts +26 -0
  54. package/sync-plugins/firebase.d.ts +26 -0
  55. package/sync-plugins/firebase.js +373 -0
  56. package/sync-plugins/firebase.mjs +368 -0
  57. package/sync-plugins/keel.d.mts +27 -10
  58. package/sync-plugins/keel.d.ts +27 -10
  59. package/sync-plugins/keel.js +40 -21
  60. package/sync-plugins/keel.mjs +40 -21
  61. package/sync-plugins/supabase.d.mts +12 -7
  62. package/sync-plugins/supabase.d.ts +12 -7
  63. package/sync-plugins/supabase.js +24 -13
  64. package/sync-plugins/supabase.mjs +25 -14
  65. package/sync-plugins/tanstack-query.d.mts +2 -2
  66. package/sync-plugins/tanstack-query.d.ts +2 -2
  67. package/sync-plugins/tanstack-query.js +3 -2
  68. package/sync-plugins/tanstack-query.mjs +3 -2
  69. package/sync-plugins/tanstack-react-query.d.mts +1 -1
  70. package/sync-plugins/tanstack-react-query.d.ts +1 -1
  71. package/sync.d.mts +68 -197
  72. package/sync.d.ts +68 -197
  73. package/sync.js +448 -283
  74. package/sync.mjs +454 -289
  75. package/types/babel.d.ts +12 -1
  76. package/.DS_Store +0 -0
  77. /package/config/{enable_GetSet.d.mts → enable$GetSet.d.mts} +0 -0
  78. /package/config/{enable_GetSet.d.ts → enable$GetSet.d.ts} +0 -0
package/index.mjs CHANGED
@@ -29,17 +29,22 @@ function isPromise(obj) {
29
29
  return obj instanceof Promise;
30
30
  }
31
31
  function isMap(obj) {
32
- return obj instanceof Map;
32
+ return obj instanceof Map || obj instanceof WeakMap;
33
+ }
34
+ function isSet(obj) {
35
+ return obj instanceof Set || obj instanceof WeakSet;
33
36
  }
34
37
  function isNumber(obj) {
35
38
  const n = obj;
36
- return n - n < 1;
39
+ return typeof n === "number" && n - n < 1;
37
40
  }
38
41
  function isEmpty(obj) {
39
42
  if (!obj)
40
43
  return false;
41
44
  if (isArray(obj))
42
45
  return obj.length === 0;
46
+ if (isMap(obj) || isSet(obj))
47
+ return obj.size === 0;
43
48
  for (const key in obj) {
44
49
  if (hasOwnProperty.call(obj, key)) {
45
50
  return false;
@@ -54,27 +59,25 @@ var setPrimitives = /* @__PURE__ */ new Set(["boolean", "string", "number"]);
54
59
  function isActualPrimitive(arg) {
55
60
  return setPrimitives.has(typeof arg);
56
61
  }
57
- function isChildNodeValue(node) {
62
+ function isChildNode(node) {
58
63
  return !!node.parent;
59
64
  }
60
65
 
61
66
  // src/globals.ts
62
67
  var symbolToPrimitive = Symbol.toPrimitive;
68
+ var symbolIterator = Symbol.iterator;
63
69
  var symbolGetNode = Symbol("getNode");
64
70
  var symbolDelete = /* @__PURE__ */ Symbol("delete");
65
71
  var symbolOpaque = Symbol("opaque");
66
72
  var optimized = Symbol("optimized");
67
73
  var symbolLinked = Symbol("linked");
68
74
  var globalState = {
69
- isLoadingLocal: false,
70
- isMerging: false,
71
- isLoadingRemote: false,
72
- activateSyncedNode: void 0,
73
75
  pendingNodes: /* @__PURE__ */ new Map(),
74
- dirtyNodes: /* @__PURE__ */ new Set(),
75
- replacer: void 0,
76
- reviver: void 0
76
+ dirtyNodes: /* @__PURE__ */ new Set()
77
77
  };
78
+ function isOpaqueObject(value) {
79
+ return value && (value[symbolOpaque] || value["$$typeof"]);
80
+ }
78
81
  function getPathType(value) {
79
82
  return isArray(value) ? "array" : isMap(value) ? "map" : value instanceof Set ? "set" : "object";
80
83
  }
@@ -116,10 +119,10 @@ function reviver(key, value) {
116
119
  return value;
117
120
  }
118
121
  function safeStringify(value) {
119
- return JSON.stringify(value, replacer);
122
+ return value ? JSON.stringify(value, replacer) : value;
120
123
  }
121
124
  function safeParse(value) {
122
- return JSON.parse(value, reviver);
125
+ return value ? JSON.parse(value, reviver) : value;
123
126
  }
124
127
  function clone(value) {
125
128
  return safeParse(safeStringify(value));
@@ -135,29 +138,31 @@ function isEvent(value$) {
135
138
  return value$ && ((_a = value$[symbolGetNode]) == null ? void 0 : _a.isEvent);
136
139
  }
137
140
  function setNodeValue(node, newValue) {
138
- var _a, _b, _c;
141
+ var _a;
139
142
  const parentNode = (_a = node.parent) != null ? _a : node;
140
143
  const key = node.parent ? node.key : "_";
141
144
  const isDelete = newValue === symbolDelete;
142
145
  if (isDelete)
143
146
  newValue = void 0;
144
147
  const parentValue = node.parent ? ensureNodeValue(parentNode) : parentNode.root;
145
- const prevValue = parentValue[key];
148
+ const useSetFn = isSet(parentValue);
149
+ const useMapFn = isMap(parentValue);
150
+ const prevValue = useSetFn ? key : useMapFn ? parentValue.get(key) : parentValue[key];
146
151
  const isFunc = isFunction(newValue);
147
152
  newValue = !parentNode.isAssigning && isFunc && !isFunction(prevValue) ? newValue(prevValue) : newValue;
148
- if (!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) {
149
154
  try {
150
155
  parentNode.isSetting = (parentNode.isSetting || 0) + 1;
151
- const useMapFn = isMap(parentValue);
152
156
  if (isDelete) {
153
- if (useMapFn) {
157
+ if (useMapFn || useSetFn) {
154
158
  parentValue.delete(key);
155
159
  } else {
156
160
  delete parentValue[key];
157
161
  }
158
162
  } else {
159
- const useMapFn2 = isMap(parentValue);
160
- if (useMapFn2) {
163
+ if (useSetFn) {
164
+ parentValue.add(newValue);
165
+ } else if (useMapFn) {
161
166
  parentValue.set(key, newValue);
162
167
  } else {
163
168
  parentValue[key] = newValue;
@@ -173,7 +178,7 @@ var arrNodeKeys = [];
173
178
  function getNodeValue(node) {
174
179
  let count = 0;
175
180
  let n = node;
176
- while (isChildNodeValue(n)) {
181
+ while (isChildNode(n)) {
177
182
  arrNodeKeys[count++] = n.key;
178
183
  n = n.parent;
179
184
  }
@@ -213,7 +218,7 @@ function getChildNode(node, key, asFunction) {
213
218
  function ensureNodeValue(node) {
214
219
  let value = getNodeValue(node);
215
220
  if (!value || isFunction(value)) {
216
- if (isChildNodeValue(node)) {
221
+ if (isChildNode(node)) {
217
222
  const parent = ensureNodeValue(node.parent);
218
223
  value = parent[node.key] = {};
219
224
  } else {
@@ -282,11 +287,16 @@ function setAtPath(obj, path, pathTypes, value, mode, fullObj, restore) {
282
287
  return obj;
283
288
  } else if (o[p] === void 0 && value === void 0 && i === path.length - 1) {
284
289
  return obj;
285
- } else if (o[p] === void 0 || o[p] === null) {
286
- o[p] = initializePathType(pathTypes[i]);
290
+ } else if (i < path.length - 1 && (o[p] === void 0 || o[p] === null)) {
291
+ const child = initializePathType(pathTypes[i]);
292
+ if (isMap(o)) {
293
+ o.set(p, child);
294
+ } else {
295
+ o[p] = child;
296
+ }
287
297
  }
288
298
  if (i < path.length - 1) {
289
- o = o[p];
299
+ o = isMap(o) ? o.get(p) : o[p];
290
300
  if (oFull) {
291
301
  oFull = oFull[p];
292
302
  }
@@ -295,13 +305,13 @@ function setAtPath(obj, path, pathTypes, value, mode, fullObj, restore) {
295
305
  }
296
306
  if (p === void 0) {
297
307
  if (mode === "merge") {
298
- obj = _mergeIntoObservable(obj, value);
308
+ obj = deepMerge(obj, value);
299
309
  } else {
300
310
  obj = value;
301
311
  }
302
312
  } else {
303
313
  if (mode === "merge") {
304
- o[p] = _mergeIntoObservable(o[p], value);
314
+ o[p] = deepMerge(o[p], value);
305
315
  } else if (isMap(o)) {
306
316
  o.set(p, value);
307
317
  } else {
@@ -310,80 +320,59 @@ function setAtPath(obj, path, pathTypes, value, mode, fullObj, restore) {
310
320
  }
311
321
  return obj;
312
322
  }
313
- function setInObservableAtPath(value$, path, pathTypes, value, mode) {
314
- let o = value$;
315
- let v = value;
316
- for (let i = 0; i < path.length; i++) {
317
- const p = path[i];
318
- if (!o.peek()[p]) {
319
- o[p].set(initializePathType(pathTypes[i]));
320
- }
321
- o = o[p];
322
- v = v[p];
323
- }
324
- if (v === symbolDelete) {
325
- o.delete();
326
- } else if (mode === "assign" && o.assign && isObject(o.peek())) {
327
- o.assign(v);
328
- } else if (mode === "merge") {
329
- mergeIntoObservable(o, v);
330
- } else {
331
- o.set(v);
332
- }
333
- }
334
323
  function mergeIntoObservable(target, ...sources) {
324
+ if (process.env.NODE_ENV === "development" || process.env.NODE_ENV === "test") {
325
+ if (!isObservable(target)) {
326
+ console.error("[legend-state] should only use mergeIntoObservable with observables");
327
+ }
328
+ }
335
329
  beginBatch();
336
- globalState.isMerging = true;
337
330
  for (let i = 0; i < sources.length; i++) {
338
- target = _mergeIntoObservable(
331
+ _mergeIntoObservable(
339
332
  target,
340
333
  sources[i],
341
334
  /*assign*/
342
- i < sources.length - 1
335
+ i < sources.length - 1,
336
+ 0
343
337
  );
344
338
  }
345
- globalState.isMerging = false;
346
339
  endBatch();
347
340
  return target;
348
341
  }
349
- function _mergeIntoObservable(target, source, assign2) {
350
- var _a;
342
+ function _mergeIntoObservable(target, source, assign2, levelsDeep) {
351
343
  if (isObservable(source)) {
352
344
  source = source.peek();
353
345
  }
354
- const needsSet = isObservable(target);
355
- const targetValue = needsSet ? target.peek() : target;
346
+ const targetValue = target.peek();
356
347
  const isTargetArr = isArray(targetValue);
357
348
  const isTargetObj = !isTargetArr && isObject(targetValue);
358
- if (isTargetObj && isObject(source) && !isEmpty(targetValue) || isTargetArr && targetValue.length > 0) {
359
- const keys = Object.keys(source);
349
+ const isSourceMap = isMap(source);
350
+ const isSourceSet = isSet(source);
351
+ if (isSourceSet && isSet(targetValue)) {
352
+ target.set(/* @__PURE__ */ new Set([...source, ...targetValue]));
353
+ } else if (isTargetObj && isObject(source) && !isEmpty(targetValue) || isTargetArr && targetValue.length > 0) {
354
+ const keys = isSourceMap || isSourceSet ? Array.from(source.keys()) : Object.keys(source);
360
355
  for (let i = 0; i < keys.length; i++) {
361
356
  const key = keys[i];
362
- const sourceValue = source[key];
357
+ const sourceValue = isSourceSet ? key : isSourceMap ? source.get(key) : source[key];
363
358
  if (sourceValue === symbolDelete) {
364
- needsSet && ((_a = target[key]) == null ? void 0 : _a.delete) ? target[key].delete() : delete target[key];
359
+ target[key].delete();
365
360
  } else {
366
361
  const isObj = isObject(sourceValue);
367
362
  const isArr = !isObj && isArray(sourceValue);
368
363
  const targetChild = target[key];
369
- if ((isObj || isArr) && targetChild && (needsSet || !isEmpty(targetChild))) {
370
- if (!needsSet && (!targetChild || (isObj ? !isObject(targetChild) : !isArray(targetChild)))) {
371
- target[key] = assign2 ? isArr ? [...sourceValue] : { ...sourceValue } : sourceValue;
372
- } else {
373
- _mergeIntoObservable(targetChild, sourceValue);
374
- }
375
- } else {
376
- if (needsSet) {
364
+ if ((isObj || isArr) && targetChild) {
365
+ if (levelsDeep > 0 && isEmpty(sourceValue)) {
377
366
  targetChild.set(sourceValue);
378
- } else {
379
- const toSet = isObject(sourceValue) ? { ...sourceValue } : isArray(sourceValue) ? [...sourceValue] : sourceValue;
380
- target[key] = toSet;
381
367
  }
368
+ _mergeIntoObservable(targetChild, sourceValue, false, levelsDeep + 1);
369
+ } else {
370
+ targetChild.set(sourceValue);
382
371
  }
383
372
  }
384
373
  }
385
374
  } else if (source !== void 0) {
386
- needsSet ? target.set(source) : target = assign2 ? isArray(source) ? [...source] : { ...source } : source;
375
+ target.set(source);
387
376
  }
388
377
  return target;
389
378
  }
@@ -420,12 +409,13 @@ function initializePathType(pathType) {
420
409
  switch (pathType) {
421
410
  case "array":
422
411
  return [];
423
- case "object":
424
- return {};
425
412
  case "map":
426
413
  return /* @__PURE__ */ new Map();
427
414
  case "set":
428
415
  return /* @__PURE__ */ new Set();
416
+ case "object":
417
+ default:
418
+ return {};
429
419
  }
430
420
  }
431
421
  function applyChange(value, change, applyPrevious) {
@@ -438,6 +428,33 @@ function applyChanges(value, changes, applyPrevious) {
438
428
  }
439
429
  return value;
440
430
  }
431
+ function deepMerge(target, ...sources) {
432
+ if (isPrimitive(target)) {
433
+ return sources[sources.length - 1];
434
+ }
435
+ let result = isArray(target) ? [...target] : { ...target };
436
+ for (let i = 0; i < sources.length; i++) {
437
+ const obj2 = sources[i];
438
+ if (isObject(obj2) || isArray(obj2)) {
439
+ const objTarget = obj2;
440
+ for (const key in objTarget) {
441
+ if (hasOwnProperty.call(objTarget, key)) {
442
+ if (objTarget[key] instanceof Object && !isObservable(objTarget[key]) && Object.keys(objTarget[key]).length > 0) {
443
+ result[key] = deepMerge(
444
+ result[key] || (isArray(objTarget[key]) ? [] : {}),
445
+ objTarget[key]
446
+ );
447
+ } else {
448
+ result[key] = objTarget[key];
449
+ }
450
+ }
451
+ }
452
+ } else {
453
+ result = obj2;
454
+ }
455
+ }
456
+ return result;
457
+ }
441
458
 
442
459
  // src/batching.ts
443
460
  var timeout;
@@ -484,9 +501,9 @@ function notify(node, value, prev, level, whenOptimizedOnlyIf) {
484
501
  changesInBatch,
485
502
  node,
486
503
  /*loading*/
487
- globalState.isLoadingLocal,
504
+ !!globalState.isLoadingLocal,
488
505
  /*remote*/
489
- globalState.isLoadingRemote,
506
+ !!globalState.isLoadingRemote,
490
507
  value,
491
508
  [],
492
509
  [],
@@ -497,31 +514,35 @@ function notify(node, value, prev, level, whenOptimizedOnlyIf) {
497
514
  level,
498
515
  whenOptimizedOnlyIf
499
516
  );
500
- if (changesInBatch.size) {
501
- batchNotifyChanges(
502
- changesInBatch,
503
- /*immediate*/
504
- true
505
- );
506
- }
507
517
  const existing = _batchMap.get(node);
508
518
  if (existing) {
509
- existing.value = value;
519
+ if (existing.prev === value) {
520
+ _batchMap.delete(node);
521
+ } else {
522
+ existing.value = value;
523
+ }
510
524
  } else {
511
525
  _batchMap.set(node, {
512
526
  value,
513
527
  prev,
514
528
  level,
515
529
  whenOptimizedOnlyIf,
516
- remote: globalState.isLoadingRemote,
517
- loading: globalState.isLoadingLocal
530
+ isFromSync: !!globalState.isLoadingRemote,
531
+ isFromPersist: !!globalState.isLoadingLocal
518
532
  });
519
533
  }
534
+ if (changesInBatch.size) {
535
+ batchNotifyChanges(
536
+ changesInBatch,
537
+ /*immediate*/
538
+ true
539
+ );
540
+ }
520
541
  if (numInBatch <= 0) {
521
542
  runBatch();
522
543
  }
523
544
  }
524
- function computeChangesAtNode(changesInBatch, node, loading, remote, value, path, pathTypes, valueAtPath, prevAtPath, immediate, level, whenOptimizedOnlyIf) {
545
+ function computeChangesAtNode(changesInBatch, node, isFromPersist, isFromSync, value, path, pathTypes, valueAtPath, prevAtPath, immediate, level, whenOptimizedOnlyIf) {
525
546
  if (immediate ? node.listenersImmediate : node.listeners) {
526
547
  const change = {
527
548
  path,
@@ -534,13 +555,14 @@ function computeChangesAtNode(changesInBatch, node, loading, remote, value, path
534
555
  const { changes } = changeInBatch;
535
556
  if (!isArraySubset(changes[0].path, change.path)) {
536
557
  changes.push(change);
558
+ changeInBatch.level = Math.min(changeInBatch.level, level);
537
559
  }
538
560
  } else {
539
561
  changesInBatch.set(node, {
540
562
  level,
541
563
  value,
542
- remote,
543
- loading,
564
+ isFromSync,
565
+ isFromPersist,
544
566
  whenOptimizedOnlyIf,
545
567
  changes: [change]
546
568
  });
@@ -604,7 +626,7 @@ function computeChangesRecursive(changesInBatch, node, loading, remote, value, p
604
626
  }
605
627
  function batchNotifyChanges(changesInBatch, immediate) {
606
628
  const listenersNotified = /* @__PURE__ */ new Set();
607
- changesInBatch.forEach(({ changes, level, value, loading, remote, whenOptimizedOnlyIf }, node) => {
629
+ changesInBatch.forEach(({ changes, level, value, isFromPersist, isFromSync, whenOptimizedOnlyIf }, node) => {
608
630
  const listeners = immediate ? node.listenersImmediate : node.listeners;
609
631
  if (listeners) {
610
632
  let listenerParams;
@@ -618,8 +640,8 @@ function batchNotifyChanges(changesInBatch, immediate) {
618
640
  if (!noArgs && !listenerParams) {
619
641
  listenerParams = {
620
642
  value,
621
- loading,
622
- remote,
643
+ isFromPersist,
644
+ isFromSync,
623
645
  getPrevious: createPreviousHandler(value, changes),
624
646
  changes
625
647
  };
@@ -647,12 +669,12 @@ function runBatch() {
647
669
  const map = _batchMap;
648
670
  _batchMap = /* @__PURE__ */ new Map();
649
671
  const changesInBatch = /* @__PURE__ */ new Map();
650
- map.forEach(({ value, prev, level, loading, remote, whenOptimizedOnlyIf }, node) => {
672
+ map.forEach(({ value, prev, level, isFromPersist, isFromSync, whenOptimizedOnlyIf }, node) => {
651
673
  computeChangesRecursive(
652
674
  changesInBatch,
653
675
  node,
654
- loading,
655
- remote,
676
+ isFromPersist,
677
+ isFromSync,
656
678
  value,
657
679
  [],
658
680
  [],
@@ -711,21 +733,6 @@ function getNodeAtPath(obj, path) {
711
733
  return o;
712
734
  }
713
735
 
714
- // src/linked.ts
715
- function linked(params, options) {
716
- if (isFunction(params)) {
717
- params = { get: params };
718
- }
719
- if (options) {
720
- params = { ...params, ...options };
721
- }
722
- const ret = function() {
723
- return { [symbolLinked]: params };
724
- };
725
- ret.prototype[symbolLinked] = params;
726
- return ret;
727
- }
728
-
729
736
  // src/createObservable.ts
730
737
  function createObservable(value, makePrimitive, extractPromise2, createObject, createPrimitive) {
731
738
  if (isObservable(value)) {
@@ -755,6 +762,21 @@ function createObservable(value, makePrimitive, extractPromise2, createObject, c
755
762
  return obs;
756
763
  }
757
764
 
765
+ // src/linked.ts
766
+ function linked(params, options) {
767
+ if (isFunction(params)) {
768
+ params = { get: params };
769
+ }
770
+ if (options) {
771
+ params = { ...params, ...options };
772
+ }
773
+ const ret = function() {
774
+ return { [symbolLinked]: params };
775
+ };
776
+ ret.prototype[symbolLinked] = params;
777
+ return ret;
778
+ }
779
+
758
780
  // src/onChange.ts
759
781
  function onChange(node, callback, options = {}, fromLinks) {
760
782
  var _a;
@@ -779,8 +801,8 @@ function onChange(node, callback, options = {}, fromLinks) {
779
801
  const value = getNodeValue(node);
780
802
  callback({
781
803
  value,
782
- loading: true,
783
- remote: false,
804
+ isFromPersist: true,
805
+ isFromSync: false,
784
806
  changes: [
785
807
  {
786
808
  path: [],
@@ -836,14 +858,14 @@ function onChange(node, callback, options = {}, fromLinks) {
836
858
  };
837
859
  }
838
860
  function createCb(linkedFromNode, path, callback) {
839
- let { valueAtPath: prevAtPath } = getValueAtPath2(getNodeValue(linkedFromNode), path);
840
- return function({ value: valueA, loading, remote }) {
841
- const { valueAtPath } = getValueAtPath2(valueA, path);
861
+ let prevAtPath = deconstructObjectWithPath(path, [], getNodeValue(linkedFromNode));
862
+ return function({ value: valueA, isFromPersist, isFromSync }) {
863
+ const valueAtPath = deconstructObjectWithPath(path, [], valueA);
842
864
  if (valueAtPath !== prevAtPath) {
843
865
  callback({
844
866
  value: valueAtPath,
845
- loading,
846
- remote,
867
+ isFromPersist,
868
+ isFromSync,
847
869
  changes: [
848
870
  {
849
871
  path: [],
@@ -858,16 +880,6 @@ function createCb(linkedFromNode, path, callback) {
858
880
  prevAtPath = valueAtPath;
859
881
  };
860
882
  }
861
- function getValueAtPath2(obj, path) {
862
- let o = obj;
863
- const pathTypes = [];
864
- for (let i = 0; o && i < path.length; i++) {
865
- pathTypes.push(isArray(o) ? "array" : "object");
866
- const p = path[i];
867
- o = o[p];
868
- }
869
- return { valueAtPath: o, pathTypes };
870
- }
871
883
 
872
884
  // src/setupTracking.ts
873
885
  function setupTracking(nodes, update, noArgs, immediate) {
@@ -963,12 +975,17 @@ function observe(selectorOrRun, reactionOrOptions, options) {
963
975
  options = reactionOrOptions;
964
976
  }
965
977
  let dispose;
978
+ let isRunning = false;
966
979
  const e = { num: 0 };
967
980
  const update = function() {
981
+ if (isRunning) {
982
+ return;
983
+ }
968
984
  if (e.onCleanup) {
969
985
  e.onCleanup();
970
986
  e.onCleanup = void 0;
971
987
  }
988
+ isRunning = true;
972
989
  beginBatch();
973
990
  delete e.value;
974
991
  dispose == null ? void 0 : dispose();
@@ -982,6 +999,7 @@ function observe(selectorOrRun, reactionOrOptions, options) {
982
999
  e.onCleanupReaction = void 0;
983
1000
  }
984
1001
  endBatch();
1002
+ isRunning = false;
985
1003
  if (reaction && ((options == null ? void 0 : options.fromComputed) || (e.num > 0 || !isEvent(selectorOrRun)) && (e.previous !== e.value || typeof e.value === "object"))) {
986
1004
  reaction(e);
987
1005
  }
@@ -1065,6 +1083,7 @@ var ArrayLoopers = /* @__PURE__ */ new Set([
1065
1083
  "filter",
1066
1084
  "find",
1067
1085
  "findIndex",
1086
+ "flatMap",
1068
1087
  "forEach",
1069
1088
  "join",
1070
1089
  "map",
@@ -1094,7 +1113,7 @@ function collectionSetter(node, target, prop, ...args) {
1094
1113
  const prevValue = target.slice();
1095
1114
  const ret = target[prop].apply(target, args);
1096
1115
  if (node) {
1097
- const hasParent = isChildNodeValue(node);
1116
+ const hasParent = isChildNode(node);
1098
1117
  const key = hasParent ? node.key : "_";
1099
1118
  const parentValue = hasParent ? getNodeValue(node.parent) : node.root;
1100
1119
  parentValue[key] = prevValue;
@@ -1118,7 +1137,7 @@ function updateNodes(parent, obj, prevValue) {
1118
1137
  }
1119
1138
  __devUpdateNodes.add(obj);
1120
1139
  }
1121
- if (isObject(obj) && obj[symbolOpaque] || isObject(prevValue) && prevValue[symbolOpaque]) {
1140
+ if (isObject(obj) && isOpaqueObject(obj) || isObject(prevValue) && isOpaqueObject(prevValue)) {
1122
1141
  const isDiff = obj !== prevValue;
1123
1142
  if (isDiff) {
1124
1143
  if (parent.listeners || parent.listenersImmediate) {
@@ -1306,10 +1325,10 @@ var proxyHandler = {
1306
1325
  if (p === symbolGetNode) {
1307
1326
  return node;
1308
1327
  }
1309
- if (p === "apply") {
1328
+ if (p === "apply" || p === "call") {
1310
1329
  const nodeValue = getNodeValue(node);
1311
1330
  if (isFunction(nodeValue)) {
1312
- return nodeValue.apply;
1331
+ return nodeValue[p];
1313
1332
  }
1314
1333
  }
1315
1334
  let value = peekInternal(
@@ -1317,11 +1336,14 @@ var proxyHandler = {
1317
1336
  /*activateRecursive*/
1318
1337
  p === "get" || p === "peek"
1319
1338
  );
1339
+ if (p === symbolIterator) {
1340
+ return !value || isPrimitive(value) ? void 0 : value[p];
1341
+ }
1320
1342
  const targetNode = node.linkedToNode || (value == null ? void 0 : value[symbolGetNode]);
1321
1343
  if (targetNode && p !== "onChange") {
1322
1344
  return proxyHandler.get(targetNode, p, receiver);
1323
1345
  }
1324
- if (isMap(value) || value instanceof WeakMap || value instanceof Set || value instanceof WeakSet) {
1346
+ if (isMap(value) || isSet(value)) {
1325
1347
  const ret = handlerMapSet(node, p, value);
1326
1348
  if (ret !== void 0) {
1327
1349
  return ret;
@@ -1351,7 +1373,7 @@ var proxyHandler = {
1351
1373
  return property.get(node);
1352
1374
  }
1353
1375
  let vProp = value == null ? void 0 : value[p];
1354
- if (isObject(value) && value[symbolOpaque]) {
1376
+ if (isObject(value) && isOpaqueObject(value)) {
1355
1377
  return vProp;
1356
1378
  }
1357
1379
  const fnOrComputed = (_a = node.functions) == null ? void 0 : _a.get(p);
@@ -1413,7 +1435,7 @@ var proxyHandler = {
1413
1435
  return vProp.bind(value);
1414
1436
  }
1415
1437
  if (isPrimitive(vProp)) {
1416
- if (isArray(value) && p === "length") {
1438
+ if (p === "length" && isArray(value)) {
1417
1439
  updateTracking(node, true);
1418
1440
  return vProp;
1419
1441
  }
@@ -1517,11 +1539,17 @@ function setKey(node, key, newValue, level) {
1517
1539
  } else {
1518
1540
  const { newValue: savedValue, prevValue } = setNodeValue(childNode, newValue);
1519
1541
  const isPrim = isPrimitive(savedValue) || savedValue instanceof Date;
1520
- if (!equals(savedValue, prevValue)) {
1521
- updateNodesAndNotify(node, savedValue, prevValue, childNode, isPrim, isRoot, level);
1522
- }
1523
1542
  if (!isPrim) {
1524
- childNode.needsExtract = true;
1543
+ let parent = childNode;
1544
+ do {
1545
+ parent.needsExtract = true;
1546
+ parent.recursivelyAutoActivated = false;
1547
+ } while (parent = parent.parent);
1548
+ }
1549
+ const notify2 = !equals(savedValue, prevValue);
1550
+ const forceNotify = !notify2 && childNode.isComputing && !isPrim;
1551
+ if (notify2 || forceNotify) {
1552
+ updateNodesAndNotify(node, savedValue, prevValue, childNode, isPrim, isRoot, level, forceNotify);
1525
1553
  }
1526
1554
  extractFunctionOrComputed(node, key, savedValue);
1527
1555
  }
@@ -1536,6 +1564,8 @@ function assign(node, value) {
1536
1564
  const currentValue = getNodeValue(node);
1537
1565
  if (isMap(currentValue)) {
1538
1566
  value.forEach((value2, key) => currentValue.set(key, value2));
1567
+ } else {
1568
+ set(node, value);
1539
1569
  }
1540
1570
  } else {
1541
1571
  node.isAssigning = (node.isAssigning || 0) + 1;
@@ -1549,7 +1579,7 @@ function assign(node, value) {
1549
1579
  return proxy2;
1550
1580
  }
1551
1581
  function deleteFn(node, key) {
1552
- if (key === void 0 && isChildNodeValue(node)) {
1582
+ if (key === void 0 && isChildNode(node)) {
1553
1583
  key = node.key;
1554
1584
  node = node.parent;
1555
1585
  }
@@ -1569,7 +1599,8 @@ function deleteFn(node, key) {
1569
1599
  function handlerMapSet(node, p, value) {
1570
1600
  const vProp = value == null ? void 0 : value[p];
1571
1601
  if (p === "size") {
1572
- return getProxy(node, p);
1602
+ updateTracking(node, true);
1603
+ return value[p];
1573
1604
  } else if (isFunction(vProp)) {
1574
1605
  return function(a, b, c) {
1575
1606
  const l = arguments.length;
@@ -1580,23 +1611,16 @@ function handlerMapSet(node, p, value) {
1580
1611
  }
1581
1612
  } else if (p === "set") {
1582
1613
  if (l === 2) {
1583
- const prev = valueMap.get(a);
1584
- const ret = valueMap.set(a, b);
1585
- if (prev !== b) {
1586
- updateNodesAndNotify(getChildNode(node, a), b, prev);
1587
- }
1588
- return ret;
1614
+ set(getChildNode(node, a), b);
1589
1615
  } else if (l === 1 && isMap(value)) {
1590
1616
  set(node, a);
1591
1617
  }
1618
+ return getProxy(node);
1592
1619
  } else if (p === "delete") {
1593
1620
  if (l > 0) {
1594
1621
  const prev = value.get ? valueMap.get(a) : a;
1595
- const ret = value.delete(a);
1596
- if (ret) {
1597
- updateNodesAndNotify(getChildNode(node, a), void 0, prev);
1598
- }
1599
- return ret;
1622
+ deleteFn(node, a);
1623
+ return prev !== void 0;
1600
1624
  }
1601
1625
  } else if (p === "clear") {
1602
1626
  const prev = new Map(valueMap);
@@ -1612,7 +1636,7 @@ function handlerMapSet(node, p, value) {
1612
1636
  if (!value.has(p)) {
1613
1637
  notify(node, ret, prev, 0);
1614
1638
  }
1615
- return ret;
1639
+ return getProxy(node);
1616
1640
  }
1617
1641
  const fn = observableFns.get(p);
1618
1642
  if (fn) {
@@ -1632,20 +1656,20 @@ function handlerMapSet(node, p, value) {
1632
1656
  };
1633
1657
  }
1634
1658
  }
1635
- function updateNodesAndNotify(node, newValue, prevValue, childNode, isPrim, isRoot, level) {
1659
+ function updateNodesAndNotify(node, newValue, prevValue, childNode, isPrim, isRoot, level, forceNotify) {
1636
1660
  if (!childNode)
1637
1661
  childNode = node;
1638
1662
  beginBatch();
1639
1663
  if (isPrim === void 0) {
1640
1664
  isPrim = isPrimitive(newValue);
1641
1665
  }
1642
- let hasADiff = isPrim;
1666
+ let hasADiff = forceNotify || isPrim;
1643
1667
  let whenOptimizedOnlyIf = false;
1644
1668
  if (!isPrim || prevValue && !isPrimitive(prevValue)) {
1645
1669
  if ((process.env.NODE_ENV === "development" || process.env.NODE_ENV === "test") && typeof __devUpdateNodes !== "undefined") {
1646
1670
  __devUpdateNodes.clear();
1647
1671
  }
1648
- hasADiff = updateNodes(childNode, newValue, prevValue);
1672
+ hasADiff = hasADiff || updateNodes(childNode, newValue, prevValue);
1649
1673
  if (isArray(newValue)) {
1650
1674
  whenOptimizedOnlyIf = (newValue == null ? void 0 : newValue.length) !== (prevValue == null ? void 0 : prevValue.length);
1651
1675
  }
@@ -1662,6 +1686,7 @@ function updateNodesAndNotify(node, newValue, prevValue, childNode, isPrim, isRo
1662
1686
  endBatch();
1663
1687
  }
1664
1688
  function extractPromise(node, value, setter) {
1689
+ const numGets = node.numGets = (node.numGets || 0) + 1;
1665
1690
  if (!node.state) {
1666
1691
  node.state = createObservable(
1667
1692
  {
@@ -1673,11 +1698,14 @@ function extractPromise(node, value, setter) {
1673
1698
  );
1674
1699
  }
1675
1700
  value.then((value2) => {
1676
- setter ? setter({ value: value2 }) : set(node, value2);
1677
- node.state.assign({
1678
- isLoaded: true,
1679
- error: void 0
1680
- });
1701
+ if (numGets >= (node.getNumResolved || 0)) {
1702
+ node.getNumResolved = node.numGets;
1703
+ setter ? setter({ value: value2 }) : set(node, value2);
1704
+ node.state.assign({
1705
+ isLoaded: true,
1706
+ error: void 0
1707
+ });
1708
+ }
1681
1709
  }).catch((error) => {
1682
1710
  node.state.error.set(error);
1683
1711
  });
@@ -1694,6 +1722,7 @@ function extractFunctionOrComputed(node, k, v) {
1694
1722
  const childNode = getChildNode(node, k, fn);
1695
1723
  const targetNode = getNode(v);
1696
1724
  const initialValue = peek(targetNode);
1725
+ setToObservable(childNode, v);
1697
1726
  setNodeValue(childNode, initialValue);
1698
1727
  return getNodeValue(childNode);
1699
1728
  } else if (typeof v === "function") {
@@ -1726,7 +1755,9 @@ function peekInternal(node, activateRecursive) {
1726
1755
  }
1727
1756
  isFlushing = false;
1728
1757
  let value = getNodeValue(node);
1729
- value = checkLazy(node, value, !!activateRecursive);
1758
+ if (!globalState.isLoadingLocal) {
1759
+ value = checkLazy(node, value, !!activateRecursive);
1760
+ }
1730
1761
  return value;
1731
1762
  }
1732
1763
  function checkLazy(node, value, activateRecursive) {
@@ -1741,10 +1772,12 @@ function checkLazy(node, value, activateRecursive) {
1741
1772
  } else {
1742
1773
  if (node.parent) {
1743
1774
  const parentValue = getNodeValue(node.parent);
1744
- if (parentValue) {
1745
- delete parentValue[node.key];
1746
- } else {
1747
- node.root._ = void 0;
1775
+ if (isFunction(value)) {
1776
+ if (parentValue) {
1777
+ delete parentValue[node.key];
1778
+ } else {
1779
+ node.root._ = void 0;
1780
+ }
1748
1781
  }
1749
1782
  }
1750
1783
  value = activateNodeFunction(node, lazyFn);
@@ -1833,7 +1866,9 @@ function activateNodeFunction(node, lazyFn) {
1833
1866
  var _a, _b, _c, _d;
1834
1867
  if (isFirst) {
1835
1868
  isFirst = false;
1836
- setNodeValue(node, void 0);
1869
+ if (isFunction(getNodeValue(node))) {
1870
+ setNodeValue(node, void 0);
1871
+ }
1837
1872
  } else if (!isFlushing && refreshFn) {
1838
1873
  if (shouldIgnoreUnobserved(node, refreshFn)) {
1839
1874
  ignoreThisUpdate = true;
@@ -1842,14 +1877,15 @@ function activateNodeFunction(node, lazyFn) {
1842
1877
  }
1843
1878
  let value = activateFn();
1844
1879
  let didSetToObs = false;
1845
- if (isObservable(value)) {
1846
- didSetToObs = true;
1880
+ const isObs = isObservable(value);
1881
+ if (isObs || node.linkedToNode) {
1882
+ didSetToObs = isObs;
1847
1883
  value = setToObservable(node, value);
1848
1884
  }
1849
- if (isFunction(value)) {
1885
+ if (isFunction(value) && value.length === 0) {
1850
1886
  value = value();
1851
1887
  }
1852
- const activated = !isObservable(value) ? value == null ? void 0 : value[symbolLinked] : void 0;
1888
+ const activated = !isObs ? value == null ? void 0 : value[symbolLinked] : void 0;
1853
1889
  if (activated) {
1854
1890
  node.activationState = activated;
1855
1891
  value = void 0;
@@ -1904,16 +1940,14 @@ function activateNodeFunction(node, lazyFn) {
1904
1940
  }
1905
1941
  } else {
1906
1942
  activatedValue = value;
1907
- if (node.state.isLoaded.peek()) {
1943
+ const isLoaded = node.state.isLoaded.peek();
1944
+ if (isLoaded || !isFunction(value)) {
1908
1945
  node.isComputing = true;
1909
1946
  set(node, value);
1910
1947
  node.isComputing = false;
1911
- } else {
1912
- setNodeValue(node, value);
1913
- node.state.assign({
1914
- isLoaded: true,
1915
- error: void 0
1916
- });
1948
+ }
1949
+ if (!isLoaded) {
1950
+ node.state.assign({ isLoaded: true, error: void 0 });
1917
1951
  }
1918
1952
  }
1919
1953
  }
@@ -1954,14 +1988,14 @@ function activateNodeBase(node, value) {
1954
1988
  if (allChanges.length > 0) {
1955
1989
  let changes;
1956
1990
  let value2;
1957
- let loading = false;
1958
- let remote = false;
1991
+ let isFromPersist = false;
1992
+ let isFromSync = false;
1959
1993
  let getPrevious;
1960
1994
  if (listenerParams) {
1961
1995
  changes = listenerParams.changes;
1962
1996
  value2 = listenerParams.value;
1963
- loading = listenerParams.loading;
1964
- remote = listenerParams.remote;
1997
+ isFromPersist = listenerParams.isFromPersist;
1998
+ isFromSync = listenerParams.isFromSync;
1965
1999
  getPrevious = listenerParams.getPrevious;
1966
2000
  } else {
1967
2001
  changes = allChanges;
@@ -1981,8 +2015,8 @@ function activateNodeBase(node, value) {
1981
2015
  setFn({
1982
2016
  value: value2,
1983
2017
  changes,
1984
- loading,
1985
- remote,
2018
+ isFromPersist,
2019
+ isFromSync,
1986
2020
  getPrevious
1987
2021
  });
1988
2022
  node.isComputing = false;
@@ -2017,26 +2051,31 @@ function activateNodeBase(node, value) {
2017
2051
  }
2018
2052
  function setToObservable(node, value) {
2019
2053
  var _a;
2020
- const linkedNode = getNode(value);
2054
+ const linkedNode = value ? getNode(value) : void 0;
2021
2055
  if (linkedNode !== node && (linkedNode == null ? void 0 : linkedNode.linkedToNode) !== node) {
2022
2056
  node.linkedToNode = linkedNode;
2023
- linkedNode.linkedFromNodes || (linkedNode.linkedFromNodes = /* @__PURE__ */ new Set());
2024
- linkedNode.linkedFromNodes.add(node);
2025
2057
  (_a = node.linkedToNodeDispose) == null ? void 0 : _a.call(node);
2026
- node.linkedToNodeDispose = onChange(
2027
- linkedNode,
2028
- () => {
2029
- value = peekInternal(linkedNode);
2030
- set(node, value);
2031
- },
2032
- { initial: true },
2033
- /* @__PURE__ */ new Set([node])
2034
- );
2058
+ if (linkedNode) {
2059
+ linkedNode.linkedFromNodes || (linkedNode.linkedFromNodes = /* @__PURE__ */ new Set());
2060
+ linkedNode.linkedFromNodes.add(node);
2061
+ node.linkedToNodeDispose = onChange(
2062
+ linkedNode,
2063
+ () => {
2064
+ value = peekInternal(linkedNode);
2065
+ if (!isFunction(value)) {
2066
+ set(node, value);
2067
+ }
2068
+ },
2069
+ { initial: true },
2070
+ /* @__PURE__ */ new Set([node])
2071
+ );
2072
+ }
2035
2073
  }
2036
2074
  return value;
2037
2075
  }
2038
2076
  function recursivelyAutoActivate(obj, node) {
2039
- if (isObject(obj) || isArray(obj)) {
2077
+ if (!node.recursivelyAutoActivated && (isObject(obj) || isArray(obj)) && !isOpaqueObject(obj)) {
2078
+ node.recursivelyAutoActivated = true;
2040
2079
  const pathStack = [];
2041
2080
  const getNodeAtPath2 = () => {
2042
2081
  var _a;
@@ -2054,27 +2093,29 @@ function recursivelyAutoActivate(obj, node) {
2054
2093
  }
2055
2094
  function recursivelyAutoActivateInner(obj, pathStack, getNodeAtPath2) {
2056
2095
  var _a;
2057
- for (const key in obj) {
2058
- if (hasOwnProperty.call(obj, key)) {
2059
- const value = obj[key];
2060
- if (isObservable(value)) {
2061
- const childNode = getNodeAtPath2();
2062
- extractFunctionOrComputed(childNode, key, value);
2063
- delete childNode.lazy;
2064
- } else {
2065
- const linkedOptions = isFunction(value) && ((_a = value.prototype) == null ? void 0 : _a[symbolLinked]);
2066
- if (linkedOptions) {
2067
- const activate = linkedOptions.activate;
2068
- if (!activate || activate === "auto") {
2069
- const childNode = getNodeAtPath2();
2070
- peek(getChildNode(childNode, key, value));
2096
+ if ((isObject(obj) || isArray(obj)) && !isOpaqueObject(obj)) {
2097
+ for (const key in obj) {
2098
+ if (hasOwnProperty.call(obj, key)) {
2099
+ const value = obj[key];
2100
+ if (isObservable(value)) {
2101
+ const childNode = getNodeAtPath2();
2102
+ extractFunctionOrComputed(childNode, key, value);
2103
+ delete childNode.lazy;
2104
+ } else {
2105
+ const linkedOptions = isFunction(value) && ((_a = value.prototype) == null ? void 0 : _a[symbolLinked]);
2106
+ if (linkedOptions) {
2107
+ const activate = linkedOptions.activate;
2108
+ if (!activate || activate === "auto") {
2109
+ const childNode = getNodeAtPath2();
2110
+ peek(getChildNode(childNode, key, value));
2111
+ }
2071
2112
  }
2072
2113
  }
2073
- }
2074
- if (typeof value === "object") {
2075
- pathStack.push({ key, value });
2076
- recursivelyAutoActivateInner(value, pathStack, getNodeAtPath2);
2077
- pathStack.pop();
2114
+ if (typeof value === "object") {
2115
+ pathStack.push({ key, value });
2116
+ recursivelyAutoActivateInner(value, pathStack, getNodeAtPath2);
2117
+ pathStack.pop();
2118
+ }
2078
2119
  }
2079
2120
  }
2080
2121
  }
@@ -2130,16 +2171,6 @@ function observable(value) {
2130
2171
  function observablePrimitive(value) {
2131
2172
  return createObservable(value, true, extractPromise, getProxy, ObservablePrimitiveClass);
2132
2173
  }
2133
- function syncState(obs) {
2134
- const node = getNode(obs);
2135
- if (!node.state) {
2136
- peekInternal(node);
2137
- }
2138
- if (!node.state) {
2139
- node.state = observable({});
2140
- }
2141
- return node.state;
2142
- }
2143
2174
 
2144
2175
  // src/computed.ts
2145
2176
  function computed(get2, set2) {
@@ -2148,45 +2179,6 @@ function computed(get2, set2) {
2148
2179
  );
2149
2180
  }
2150
2181
 
2151
- // src/config.ts
2152
- function configureLegendState({
2153
- observableFunctions,
2154
- observableProperties: observableProperties2,
2155
- jsonReplacer,
2156
- jsonReviver
2157
- }) {
2158
- if (observableFunctions) {
2159
- for (const key in observableFunctions) {
2160
- const fn = observableFunctions[key];
2161
- observableFns.set(key, fn);
2162
- ObservablePrimitiveClass.prototype[key] = function(...args) {
2163
- return fn.call(this, this._node, ...args);
2164
- };
2165
- }
2166
- }
2167
- if (observableProperties2) {
2168
- for (const key in observableProperties2) {
2169
- const fns2 = observableProperties2[key];
2170
- observableProperties.set(key, fns2);
2171
- Object.defineProperty(ObservablePrimitiveClass.prototype, key, {
2172
- configurable: true,
2173
- get() {
2174
- return fns2.get.call(this, this._node);
2175
- },
2176
- set(value) {
2177
- return fns2.set.call(this, this._node, value);
2178
- }
2179
- });
2180
- }
2181
- }
2182
- if (jsonReplacer) {
2183
- globalState.replacer = jsonReplacer;
2184
- }
2185
- if (jsonReviver) {
2186
- globalState.reviver = jsonReviver;
2187
- }
2188
- }
2189
-
2190
2182
  // src/event.ts
2191
2183
  function event() {
2192
2184
  const obs = observable(0);
@@ -2217,66 +2209,33 @@ function proxy(get2, set2) {
2217
2209
  );
2218
2210
  }
2219
2211
 
2220
- // src/retry.ts
2221
- function calculateRetryDelay(retryOptions, attemptNum) {
2222
- const { backoff, delay = 1e3, infinite, times = 3, maxDelay = 3e4 } = retryOptions;
2223
- if (infinite || attemptNum < times) {
2224
- const delayTime = Math.min(delay * (backoff === "constant" ? 1 : 2 ** attemptNum), maxDelay);
2225
- return delayTime;
2226
- }
2227
- return null;
2228
- }
2229
- function createRetryTimeout(retryOptions, attemptNum, fn) {
2230
- const delayTime = calculateRetryDelay(retryOptions, attemptNum);
2231
- if (delayTime) {
2232
- return setTimeout(fn, delayTime);
2233
- }
2234
- }
2235
- function runWithRetry(node, state, fn) {
2236
- const { waitFor } = node.activationState;
2237
- const { retry } = state;
2238
- const e = { cancel: false };
2239
- let value = void 0;
2240
- if (waitFor) {
2241
- value = whenReady(waitFor, () => {
2242
- node.activationState.waitFor = void 0;
2243
- return fn(e);
2244
- });
2245
- } else {
2246
- value = fn(e);
2247
- }
2248
- if (isPromise(value) && retry) {
2249
- let timeoutRetry;
2250
- return new Promise((resolve) => {
2251
- const run = () => {
2252
- value.then((val) => {
2253
- node.activationState.persistedRetry = false;
2254
- resolve(val);
2255
- }).catch(() => {
2256
- state.attemptNum++;
2257
- if (timeoutRetry) {
2258
- clearTimeout(timeoutRetry);
2259
- }
2260
- if (!e.cancel) {
2261
- timeoutRetry = createRetryTimeout(retry, state.attemptNum, () => {
2262
- value = fn(e);
2263
- run();
2264
- });
2265
- }
2266
- }).finally(() => {
2267
- node.activationState.persistedRetry = false;
2268
- });
2269
- };
2270
- run();
2212
+ // src/syncState.ts
2213
+ function syncState(obs) {
2214
+ const node = getNode(obs);
2215
+ if (!node.state) {
2216
+ node.state = observable({
2217
+ isPersistLoaded: false,
2218
+ isLoaded: false,
2219
+ isPersistEnabled: true,
2220
+ isSyncEnabled: true,
2221
+ isGetting: false,
2222
+ isSetting: false,
2223
+ numPendingSets: 0,
2224
+ syncCount: 0,
2225
+ clearPersist: void 0,
2226
+ reset: () => Promise.resolve(),
2227
+ sync: () => Promise.resolve(),
2228
+ getPendingChanges: () => ({})
2271
2229
  });
2272
2230
  }
2273
- return value;
2231
+ return node.state;
2274
2232
  }
2275
2233
 
2276
2234
  // index.ts
2277
2235
  var internal = {
2278
2236
  createPreviousHandler,
2279
2237
  clone,
2238
+ deepMerge,
2280
2239
  ensureNodeValue,
2281
2240
  findIDKey,
2282
2241
  get,
@@ -2290,7 +2249,6 @@ var internal = {
2290
2249
  observableFns,
2291
2250
  optimized,
2292
2251
  peek,
2293
- runWithRetry,
2294
2252
  safeParse,
2295
2253
  safeStringify,
2296
2254
  set,
@@ -2301,4 +2259,4 @@ var internal = {
2301
2259
  tracking
2302
2260
  };
2303
2261
 
2304
- export { ObservablePrimitiveClass, applyChange, applyChanges, batch, beginBatch, beginTracking, computeSelector, computed, configureLegendState, constructObjectWithPath, deconstructObjectWithPath, endBatch, endTracking, event, findIDKey, getNode, getNodeValue, getObservableIndex, hasOwnProperty, internal, isArray, isBoolean, isDate, isEmpty, isFunction, isMap, isNullOrUndefined, isNumber, isObject, isObservable, isObservableValueReady, isObserved, isPrimitive, isPromise, isString, isSymbol, linked, mergeIntoObservable, observable, observablePrimitive, observe, opaqueObject, optimized, proxy, setAtPath, setInObservableAtPath, setSilently, setupTracking, shouldIgnoreUnobserved, symbolDelete, syncState, trackSelector, tracking, updateTracking, when, whenReady };
2262
+ export { ObservablePrimitiveClass, applyChange, applyChanges, batch, beginBatch, beginTracking, computeSelector, computed, constructObjectWithPath, deconstructObjectWithPath, endBatch, endTracking, event, findIDKey, getNode, getNodeValue, getObservableIndex, hasOwnProperty, internal, isArray, isBoolean, isDate, isEmpty, isFunction, isMap, isNullOrUndefined, isNumber, isObject, isObservable, isObservableValueReady, isObserved, isPrimitive, isPromise, isString, isSymbol, linked, mergeIntoObservable, observable, observablePrimitive, observe, opaqueObject, optimized, proxy, setAtPath, setSilently, setupTracking, shouldIgnoreUnobserved, symbolDelete, syncState, trackSelector, tracking, updateTracking, when, whenReady };