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

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 (74) 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 +2066 -0
  17. package/config.mjs +2064 -0
  18. package/helpers/trackHistory.js +2 -2
  19. package/helpers/trackHistory.mjs +2 -2
  20. package/index.d.mts +25 -302
  21. package/index.d.ts +25 -302
  22. package/index.js +293 -322
  23. package/index.mjs +294 -321
  24. package/observableInterfaces-CZR3_8mM.d.mts +283 -0
  25. package/observableInterfaces-CZR3_8mM.d.ts +283 -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/crud.d.mts +21 -24
  44. package/sync-plugins/crud.d.ts +21 -24
  45. package/sync-plugins/crud.js +240 -139
  46. package/sync-plugins/crud.mjs +242 -141
  47. package/sync-plugins/fetch.js +12 -8
  48. package/sync-plugins/fetch.mjs +13 -9
  49. package/sync-plugins/firebase.d.mts +27 -0
  50. package/sync-plugins/firebase.d.ts +27 -0
  51. package/sync-plugins/firebase.js +373 -0
  52. package/sync-plugins/firebase.mjs +368 -0
  53. package/sync-plugins/keel.d.mts +27 -10
  54. package/sync-plugins/keel.d.ts +27 -10
  55. package/sync-plugins/keel.js +51 -32
  56. package/sync-plugins/keel.mjs +52 -33
  57. package/sync-plugins/supabase.d.mts +12 -7
  58. package/sync-plugins/supabase.d.ts +12 -7
  59. package/sync-plugins/supabase.js +24 -13
  60. package/sync-plugins/supabase.mjs +25 -14
  61. package/sync-plugins/tanstack-query.d.mts +2 -2
  62. package/sync-plugins/tanstack-query.d.ts +2 -2
  63. package/sync-plugins/tanstack-query.js +3 -2
  64. package/sync-plugins/tanstack-query.mjs +3 -2
  65. package/sync-plugins/tanstack-react-query.d.mts +1 -1
  66. package/sync-plugins/tanstack-react-query.d.ts +1 -1
  67. package/sync.d.mts +71 -197
  68. package/sync.d.ts +71 -197
  69. package/sync.js +465 -284
  70. package/sync.mjs +471 -290
  71. package/types/babel.d.ts +12 -1
  72. package/.DS_Store +0 -0
  73. /package/config/{enable_GetSet.d.mts → enable$GetSet.d.mts} +0 -0
  74. /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
  }
@@ -1004,16 +1022,30 @@ function _when(predicate, effect, checkReady) {
1004
1022
  if (isPromise(predicate)) {
1005
1023
  return effect ? predicate.then(effect) : predicate;
1006
1024
  }
1025
+ const isPredicateArray = isArray(predicate);
1007
1026
  let value;
1008
1027
  let effectValue;
1009
1028
  function run(e) {
1010
- const ret = computeSelector(predicate);
1029
+ const ret = isPredicateArray ? predicate.map((p) => computeSelector(p)) : computeSelector(predicate);
1011
1030
  if (isPromise(ret)) {
1012
1031
  value = ret;
1013
1032
  return void 0;
1014
- } else if (!isPromise(ret) && (checkReady ? isObservableValueReady(ret) : ret)) {
1015
- value = ret;
1016
- e.cancel = true;
1033
+ } else {
1034
+ let isOk = true;
1035
+ if (isArray(ret)) {
1036
+ for (let i = 0; i < ret.length; i++) {
1037
+ if (isObservable(ret[i])) {
1038
+ ret[i] = computeSelector(ret[i]);
1039
+ }
1040
+ isOk = isOk && !!(checkReady ? isObservableValueReady(ret[i]) : ret[i]);
1041
+ }
1042
+ } else {
1043
+ isOk = checkReady ? isObservableValueReady(ret) : ret;
1044
+ }
1045
+ if (isOk) {
1046
+ value = ret;
1047
+ e.cancel = true;
1048
+ }
1017
1049
  }
1018
1050
  return value;
1019
1051
  }
@@ -1065,6 +1097,7 @@ var ArrayLoopers = /* @__PURE__ */ new Set([
1065
1097
  "filter",
1066
1098
  "find",
1067
1099
  "findIndex",
1100
+ "flatMap",
1068
1101
  "forEach",
1069
1102
  "join",
1070
1103
  "map",
@@ -1094,7 +1127,7 @@ function collectionSetter(node, target, prop, ...args) {
1094
1127
  const prevValue = target.slice();
1095
1128
  const ret = target[prop].apply(target, args);
1096
1129
  if (node) {
1097
- const hasParent = isChildNodeValue(node);
1130
+ const hasParent = isChildNode(node);
1098
1131
  const key = hasParent ? node.key : "_";
1099
1132
  const parentValue = hasParent ? getNodeValue(node.parent) : node.root;
1100
1133
  parentValue[key] = prevValue;
@@ -1118,7 +1151,7 @@ function updateNodes(parent, obj, prevValue) {
1118
1151
  }
1119
1152
  __devUpdateNodes.add(obj);
1120
1153
  }
1121
- if (isObject(obj) && obj[symbolOpaque] || isObject(prevValue) && prevValue[symbolOpaque]) {
1154
+ if (isObject(obj) && isOpaqueObject(obj) || isObject(prevValue) && isOpaqueObject(prevValue)) {
1122
1155
  const isDiff = obj !== prevValue;
1123
1156
  if (isDiff) {
1124
1157
  if (parent.listeners || parent.listenersImmediate) {
@@ -1306,10 +1339,10 @@ var proxyHandler = {
1306
1339
  if (p === symbolGetNode) {
1307
1340
  return node;
1308
1341
  }
1309
- if (p === "apply") {
1342
+ if (p === "apply" || p === "call") {
1310
1343
  const nodeValue = getNodeValue(node);
1311
1344
  if (isFunction(nodeValue)) {
1312
- return nodeValue.apply;
1345
+ return nodeValue[p];
1313
1346
  }
1314
1347
  }
1315
1348
  let value = peekInternal(
@@ -1317,11 +1350,14 @@ var proxyHandler = {
1317
1350
  /*activateRecursive*/
1318
1351
  p === "get" || p === "peek"
1319
1352
  );
1353
+ if (p === symbolIterator) {
1354
+ return !value || isPrimitive(value) ? void 0 : value[p];
1355
+ }
1320
1356
  const targetNode = node.linkedToNode || (value == null ? void 0 : value[symbolGetNode]);
1321
1357
  if (targetNode && p !== "onChange") {
1322
1358
  return proxyHandler.get(targetNode, p, receiver);
1323
1359
  }
1324
- if (isMap(value) || value instanceof WeakMap || value instanceof Set || value instanceof WeakSet) {
1360
+ if (isMap(value) || isSet(value)) {
1325
1361
  const ret = handlerMapSet(node, p, value);
1326
1362
  if (ret !== void 0) {
1327
1363
  return ret;
@@ -1351,7 +1387,7 @@ var proxyHandler = {
1351
1387
  return property.get(node);
1352
1388
  }
1353
1389
  let vProp = value == null ? void 0 : value[p];
1354
- if (isObject(value) && value[symbolOpaque]) {
1390
+ if (isObject(value) && isOpaqueObject(value)) {
1355
1391
  return vProp;
1356
1392
  }
1357
1393
  const fnOrComputed = (_a = node.functions) == null ? void 0 : _a.get(p);
@@ -1413,7 +1449,7 @@ var proxyHandler = {
1413
1449
  return vProp.bind(value);
1414
1450
  }
1415
1451
  if (isPrimitive(vProp)) {
1416
- if (isArray(value) && p === "length") {
1452
+ if (p === "length" && isArray(value)) {
1417
1453
  updateTracking(node, true);
1418
1454
  return vProp;
1419
1455
  }
@@ -1517,11 +1553,17 @@ function setKey(node, key, newValue, level) {
1517
1553
  } else {
1518
1554
  const { newValue: savedValue, prevValue } = setNodeValue(childNode, newValue);
1519
1555
  const isPrim = isPrimitive(savedValue) || savedValue instanceof Date;
1520
- if (!equals(savedValue, prevValue)) {
1521
- updateNodesAndNotify(node, savedValue, prevValue, childNode, isPrim, isRoot, level);
1522
- }
1523
1556
  if (!isPrim) {
1524
- childNode.needsExtract = true;
1557
+ let parent = childNode;
1558
+ do {
1559
+ parent.needsExtract = true;
1560
+ parent.recursivelyAutoActivated = false;
1561
+ } while (parent = parent.parent);
1562
+ }
1563
+ const notify2 = !equals(savedValue, prevValue);
1564
+ const forceNotify = !notify2 && childNode.isComputing && !isPrim;
1565
+ if (notify2 || forceNotify) {
1566
+ updateNodesAndNotify(node, savedValue, prevValue, childNode, isPrim, isRoot, level, forceNotify);
1525
1567
  }
1526
1568
  extractFunctionOrComputed(node, key, savedValue);
1527
1569
  }
@@ -1536,6 +1578,8 @@ function assign(node, value) {
1536
1578
  const currentValue = getNodeValue(node);
1537
1579
  if (isMap(currentValue)) {
1538
1580
  value.forEach((value2, key) => currentValue.set(key, value2));
1581
+ } else {
1582
+ set(node, value);
1539
1583
  }
1540
1584
  } else {
1541
1585
  node.isAssigning = (node.isAssigning || 0) + 1;
@@ -1549,7 +1593,7 @@ function assign(node, value) {
1549
1593
  return proxy2;
1550
1594
  }
1551
1595
  function deleteFn(node, key) {
1552
- if (key === void 0 && isChildNodeValue(node)) {
1596
+ if (key === void 0 && isChildNode(node)) {
1553
1597
  key = node.key;
1554
1598
  node = node.parent;
1555
1599
  }
@@ -1569,7 +1613,8 @@ function deleteFn(node, key) {
1569
1613
  function handlerMapSet(node, p, value) {
1570
1614
  const vProp = value == null ? void 0 : value[p];
1571
1615
  if (p === "size") {
1572
- return getProxy(node, p);
1616
+ updateTracking(node, true);
1617
+ return value[p];
1573
1618
  } else if (isFunction(vProp)) {
1574
1619
  return function(a, b, c) {
1575
1620
  const l = arguments.length;
@@ -1580,23 +1625,16 @@ function handlerMapSet(node, p, value) {
1580
1625
  }
1581
1626
  } else if (p === "set") {
1582
1627
  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;
1628
+ set(getChildNode(node, a), b);
1589
1629
  } else if (l === 1 && isMap(value)) {
1590
1630
  set(node, a);
1591
1631
  }
1632
+ return getProxy(node);
1592
1633
  } else if (p === "delete") {
1593
1634
  if (l > 0) {
1594
1635
  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;
1636
+ deleteFn(node, a);
1637
+ return prev !== void 0;
1600
1638
  }
1601
1639
  } else if (p === "clear") {
1602
1640
  const prev = new Map(valueMap);
@@ -1612,7 +1650,7 @@ function handlerMapSet(node, p, value) {
1612
1650
  if (!value.has(p)) {
1613
1651
  notify(node, ret, prev, 0);
1614
1652
  }
1615
- return ret;
1653
+ return getProxy(node);
1616
1654
  }
1617
1655
  const fn = observableFns.get(p);
1618
1656
  if (fn) {
@@ -1632,20 +1670,20 @@ function handlerMapSet(node, p, value) {
1632
1670
  };
1633
1671
  }
1634
1672
  }
1635
- function updateNodesAndNotify(node, newValue, prevValue, childNode, isPrim, isRoot, level) {
1673
+ function updateNodesAndNotify(node, newValue, prevValue, childNode, isPrim, isRoot, level, forceNotify) {
1636
1674
  if (!childNode)
1637
1675
  childNode = node;
1638
1676
  beginBatch();
1639
1677
  if (isPrim === void 0) {
1640
1678
  isPrim = isPrimitive(newValue);
1641
1679
  }
1642
- let hasADiff = isPrim;
1680
+ let hasADiff = forceNotify || isPrim;
1643
1681
  let whenOptimizedOnlyIf = false;
1644
1682
  if (!isPrim || prevValue && !isPrimitive(prevValue)) {
1645
1683
  if ((process.env.NODE_ENV === "development" || process.env.NODE_ENV === "test") && typeof __devUpdateNodes !== "undefined") {
1646
1684
  __devUpdateNodes.clear();
1647
1685
  }
1648
- hasADiff = updateNodes(childNode, newValue, prevValue);
1686
+ hasADiff = hasADiff || updateNodes(childNode, newValue, prevValue);
1649
1687
  if (isArray(newValue)) {
1650
1688
  whenOptimizedOnlyIf = (newValue == null ? void 0 : newValue.length) !== (prevValue == null ? void 0 : prevValue.length);
1651
1689
  }
@@ -1662,6 +1700,7 @@ function updateNodesAndNotify(node, newValue, prevValue, childNode, isPrim, isRo
1662
1700
  endBatch();
1663
1701
  }
1664
1702
  function extractPromise(node, value, setter) {
1703
+ const numGets = node.numGets = (node.numGets || 0) + 1;
1665
1704
  if (!node.state) {
1666
1705
  node.state = createObservable(
1667
1706
  {
@@ -1673,11 +1712,14 @@ function extractPromise(node, value, setter) {
1673
1712
  );
1674
1713
  }
1675
1714
  value.then((value2) => {
1676
- setter ? setter({ value: value2 }) : set(node, value2);
1677
- node.state.assign({
1678
- isLoaded: true,
1679
- error: void 0
1680
- });
1715
+ if (numGets >= (node.getNumResolved || 0)) {
1716
+ node.getNumResolved = node.numGets;
1717
+ setter ? setter({ value: value2 }) : set(node, value2);
1718
+ node.state.assign({
1719
+ isLoaded: true,
1720
+ error: void 0
1721
+ });
1722
+ }
1681
1723
  }).catch((error) => {
1682
1724
  node.state.error.set(error);
1683
1725
  });
@@ -1694,6 +1736,7 @@ function extractFunctionOrComputed(node, k, v) {
1694
1736
  const childNode = getChildNode(node, k, fn);
1695
1737
  const targetNode = getNode(v);
1696
1738
  const initialValue = peek(targetNode);
1739
+ setToObservable(childNode, v);
1697
1740
  setNodeValue(childNode, initialValue);
1698
1741
  return getNodeValue(childNode);
1699
1742
  } else if (typeof v === "function") {
@@ -1726,7 +1769,9 @@ function peekInternal(node, activateRecursive) {
1726
1769
  }
1727
1770
  isFlushing = false;
1728
1771
  let value = getNodeValue(node);
1729
- value = checkLazy(node, value, !!activateRecursive);
1772
+ if (!globalState.isLoadingLocal) {
1773
+ value = checkLazy(node, value, !!activateRecursive);
1774
+ }
1730
1775
  return value;
1731
1776
  }
1732
1777
  function checkLazy(node, value, activateRecursive) {
@@ -1741,10 +1786,12 @@ function checkLazy(node, value, activateRecursive) {
1741
1786
  } else {
1742
1787
  if (node.parent) {
1743
1788
  const parentValue = getNodeValue(node.parent);
1744
- if (parentValue) {
1745
- delete parentValue[node.key];
1746
- } else {
1747
- node.root._ = void 0;
1789
+ if (isFunction(value)) {
1790
+ if (parentValue) {
1791
+ delete parentValue[node.key];
1792
+ } else {
1793
+ node.root._ = void 0;
1794
+ }
1748
1795
  }
1749
1796
  }
1750
1797
  value = activateNodeFunction(node, lazyFn);
@@ -1833,7 +1880,9 @@ function activateNodeFunction(node, lazyFn) {
1833
1880
  var _a, _b, _c, _d;
1834
1881
  if (isFirst) {
1835
1882
  isFirst = false;
1836
- setNodeValue(node, void 0);
1883
+ if (isFunction(getNodeValue(node))) {
1884
+ setNodeValue(node, void 0);
1885
+ }
1837
1886
  } else if (!isFlushing && refreshFn) {
1838
1887
  if (shouldIgnoreUnobserved(node, refreshFn)) {
1839
1888
  ignoreThisUpdate = true;
@@ -1842,14 +1891,15 @@ function activateNodeFunction(node, lazyFn) {
1842
1891
  }
1843
1892
  let value = activateFn();
1844
1893
  let didSetToObs = false;
1845
- if (isObservable(value)) {
1846
- didSetToObs = true;
1894
+ const isObs = isObservable(value);
1895
+ if (isObs || node.linkedToNode) {
1896
+ didSetToObs = isObs;
1847
1897
  value = setToObservable(node, value);
1848
1898
  }
1849
- if (isFunction(value)) {
1899
+ if (isFunction(value) && value.length === 0) {
1850
1900
  value = value();
1851
1901
  }
1852
- const activated = !isObservable(value) ? value == null ? void 0 : value[symbolLinked] : void 0;
1902
+ const activated = !isObs ? value == null ? void 0 : value[symbolLinked] : void 0;
1853
1903
  if (activated) {
1854
1904
  node.activationState = activated;
1855
1905
  value = void 0;
@@ -1904,16 +1954,14 @@ function activateNodeFunction(node, lazyFn) {
1904
1954
  }
1905
1955
  } else {
1906
1956
  activatedValue = value;
1907
- if (node.state.isLoaded.peek()) {
1957
+ const isLoaded = node.state.isLoaded.peek();
1958
+ if (isLoaded || !isFunction(value)) {
1908
1959
  node.isComputing = true;
1909
1960
  set(node, value);
1910
1961
  node.isComputing = false;
1911
- } else {
1912
- setNodeValue(node, value);
1913
- node.state.assign({
1914
- isLoaded: true,
1915
- error: void 0
1916
- });
1962
+ }
1963
+ if (!isLoaded) {
1964
+ node.state.assign({ isLoaded: true, error: void 0 });
1917
1965
  }
1918
1966
  }
1919
1967
  }
@@ -1954,14 +2002,14 @@ function activateNodeBase(node, value) {
1954
2002
  if (allChanges.length > 0) {
1955
2003
  let changes;
1956
2004
  let value2;
1957
- let loading = false;
1958
- let remote = false;
2005
+ let isFromPersist = false;
2006
+ let isFromSync = false;
1959
2007
  let getPrevious;
1960
2008
  if (listenerParams) {
1961
2009
  changes = listenerParams.changes;
1962
2010
  value2 = listenerParams.value;
1963
- loading = listenerParams.loading;
1964
- remote = listenerParams.remote;
2011
+ isFromPersist = listenerParams.isFromPersist;
2012
+ isFromSync = listenerParams.isFromSync;
1965
2013
  getPrevious = listenerParams.getPrevious;
1966
2014
  } else {
1967
2015
  changes = allChanges;
@@ -1981,8 +2029,8 @@ function activateNodeBase(node, value) {
1981
2029
  setFn({
1982
2030
  value: value2,
1983
2031
  changes,
1984
- loading,
1985
- remote,
2032
+ isFromPersist,
2033
+ isFromSync,
1986
2034
  getPrevious
1987
2035
  });
1988
2036
  node.isComputing = false;
@@ -2017,26 +2065,31 @@ function activateNodeBase(node, value) {
2017
2065
  }
2018
2066
  function setToObservable(node, value) {
2019
2067
  var _a;
2020
- const linkedNode = getNode(value);
2068
+ const linkedNode = value ? getNode(value) : void 0;
2021
2069
  if (linkedNode !== node && (linkedNode == null ? void 0 : linkedNode.linkedToNode) !== node) {
2022
2070
  node.linkedToNode = linkedNode;
2023
- linkedNode.linkedFromNodes || (linkedNode.linkedFromNodes = /* @__PURE__ */ new Set());
2024
- linkedNode.linkedFromNodes.add(node);
2025
2071
  (_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
- );
2072
+ if (linkedNode) {
2073
+ linkedNode.linkedFromNodes || (linkedNode.linkedFromNodes = /* @__PURE__ */ new Set());
2074
+ linkedNode.linkedFromNodes.add(node);
2075
+ node.linkedToNodeDispose = onChange(
2076
+ linkedNode,
2077
+ () => {
2078
+ value = peekInternal(linkedNode);
2079
+ if (!isFunction(value)) {
2080
+ set(node, value);
2081
+ }
2082
+ },
2083
+ { initial: true },
2084
+ /* @__PURE__ */ new Set([node])
2085
+ );
2086
+ }
2035
2087
  }
2036
2088
  return value;
2037
2089
  }
2038
2090
  function recursivelyAutoActivate(obj, node) {
2039
- if (isObject(obj) || isArray(obj)) {
2091
+ if (!node.recursivelyAutoActivated && (isObject(obj) || isArray(obj)) && !isOpaqueObject(obj)) {
2092
+ node.recursivelyAutoActivated = true;
2040
2093
  const pathStack = [];
2041
2094
  const getNodeAtPath2 = () => {
2042
2095
  var _a;
@@ -2054,27 +2107,29 @@ function recursivelyAutoActivate(obj, node) {
2054
2107
  }
2055
2108
  function recursivelyAutoActivateInner(obj, pathStack, getNodeAtPath2) {
2056
2109
  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));
2110
+ if ((isObject(obj) || isArray(obj)) && !isOpaqueObject(obj)) {
2111
+ for (const key in obj) {
2112
+ if (hasOwnProperty.call(obj, key)) {
2113
+ const value = obj[key];
2114
+ if (isObservable(value)) {
2115
+ const childNode = getNodeAtPath2();
2116
+ extractFunctionOrComputed(childNode, key, value);
2117
+ delete childNode.lazy;
2118
+ } else {
2119
+ const linkedOptions = isFunction(value) && ((_a = value.prototype) == null ? void 0 : _a[symbolLinked]);
2120
+ if (linkedOptions) {
2121
+ const activate = linkedOptions.activate;
2122
+ if (!activate || activate === "auto") {
2123
+ const childNode = getNodeAtPath2();
2124
+ peek(getChildNode(childNode, key, value));
2125
+ }
2071
2126
  }
2072
2127
  }
2073
- }
2074
- if (typeof value === "object") {
2075
- pathStack.push({ key, value });
2076
- recursivelyAutoActivateInner(value, pathStack, getNodeAtPath2);
2077
- pathStack.pop();
2128
+ if (typeof value === "object") {
2129
+ pathStack.push({ key, value });
2130
+ recursivelyAutoActivateInner(value, pathStack, getNodeAtPath2);
2131
+ pathStack.pop();
2132
+ }
2078
2133
  }
2079
2134
  }
2080
2135
  }
@@ -2130,16 +2185,6 @@ function observable(value) {
2130
2185
  function observablePrimitive(value) {
2131
2186
  return createObservable(value, true, extractPromise, getProxy, ObservablePrimitiveClass);
2132
2187
  }
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
2188
 
2144
2189
  // src/computed.ts
2145
2190
  function computed(get2, set2) {
@@ -2148,45 +2193,6 @@ function computed(get2, set2) {
2148
2193
  );
2149
2194
  }
2150
2195
 
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
2196
  // src/event.ts
2191
2197
  function event() {
2192
2198
  const obs = observable(0);
@@ -2217,66 +2223,34 @@ function proxy(get2, set2) {
2217
2223
  );
2218
2224
  }
2219
2225
 
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();
2226
+ // src/syncState.ts
2227
+ function syncState(obs) {
2228
+ const node = getNode(obs);
2229
+ if (!node.state) {
2230
+ node.state = observable({
2231
+ isPersistLoaded: false,
2232
+ isLoaded: false,
2233
+ isPersistEnabled: true,
2234
+ isSyncEnabled: true,
2235
+ isGetting: false,
2236
+ isSetting: false,
2237
+ numPendingGets: 0,
2238
+ numPendingSets: 0,
2239
+ syncCount: 0,
2240
+ clearPersist: void 0,
2241
+ reset: () => Promise.resolve(),
2242
+ sync: () => Promise.resolve(),
2243
+ getPendingChanges: () => ({})
2271
2244
  });
2272
2245
  }
2273
- return value;
2246
+ return node.state;
2274
2247
  }
2275
2248
 
2276
2249
  // index.ts
2277
2250
  var internal = {
2278
2251
  createPreviousHandler,
2279
2252
  clone,
2253
+ deepMerge,
2280
2254
  ensureNodeValue,
2281
2255
  findIDKey,
2282
2256
  get,
@@ -2290,7 +2264,6 @@ var internal = {
2290
2264
  observableFns,
2291
2265
  optimized,
2292
2266
  peek,
2293
- runWithRetry,
2294
2267
  safeParse,
2295
2268
  safeStringify,
2296
2269
  set,
@@ -2301,4 +2274,4 @@ var internal = {
2301
2274
  tracking
2302
2275
  };
2303
2276
 
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 };
2277
+ 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 };