@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.js CHANGED
@@ -31,17 +31,22 @@ function isPromise(obj) {
31
31
  return obj instanceof Promise;
32
32
  }
33
33
  function isMap(obj) {
34
- return obj instanceof Map;
34
+ return obj instanceof Map || obj instanceof WeakMap;
35
+ }
36
+ function isSet(obj) {
37
+ return obj instanceof Set || obj instanceof WeakSet;
35
38
  }
36
39
  function isNumber(obj) {
37
40
  const n = obj;
38
- return n - n < 1;
41
+ return typeof n === "number" && n - n < 1;
39
42
  }
40
43
  function isEmpty(obj) {
41
44
  if (!obj)
42
45
  return false;
43
46
  if (isArray(obj))
44
47
  return obj.length === 0;
48
+ if (isMap(obj) || isSet(obj))
49
+ return obj.size === 0;
45
50
  for (const key in obj) {
46
51
  if (hasOwnProperty.call(obj, key)) {
47
52
  return false;
@@ -56,27 +61,25 @@ var setPrimitives = /* @__PURE__ */ new Set(["boolean", "string", "number"]);
56
61
  function isActualPrimitive(arg) {
57
62
  return setPrimitives.has(typeof arg);
58
63
  }
59
- function isChildNodeValue(node) {
64
+ function isChildNode(node) {
60
65
  return !!node.parent;
61
66
  }
62
67
 
63
68
  // src/globals.ts
64
69
  var symbolToPrimitive = Symbol.toPrimitive;
70
+ var symbolIterator = Symbol.iterator;
65
71
  var symbolGetNode = Symbol("getNode");
66
72
  var symbolDelete = /* @__PURE__ */ Symbol("delete");
67
73
  var symbolOpaque = Symbol("opaque");
68
74
  var optimized = Symbol("optimized");
69
75
  var symbolLinked = Symbol("linked");
70
76
  var globalState = {
71
- isLoadingLocal: false,
72
- isMerging: false,
73
- isLoadingRemote: false,
74
- activateSyncedNode: void 0,
75
77
  pendingNodes: /* @__PURE__ */ new Map(),
76
- dirtyNodes: /* @__PURE__ */ new Set(),
77
- replacer: void 0,
78
- reviver: void 0
78
+ dirtyNodes: /* @__PURE__ */ new Set()
79
79
  };
80
+ function isOpaqueObject(value) {
81
+ return value && (value[symbolOpaque] || value["$$typeof"]);
82
+ }
80
83
  function getPathType(value) {
81
84
  return isArray(value) ? "array" : isMap(value) ? "map" : value instanceof Set ? "set" : "object";
82
85
  }
@@ -118,10 +121,10 @@ function reviver(key, value) {
118
121
  return value;
119
122
  }
120
123
  function safeStringify(value) {
121
- return JSON.stringify(value, replacer);
124
+ return value ? JSON.stringify(value, replacer) : value;
122
125
  }
123
126
  function safeParse(value) {
124
- return JSON.parse(value, reviver);
127
+ return value ? JSON.parse(value, reviver) : value;
125
128
  }
126
129
  function clone(value) {
127
130
  return safeParse(safeStringify(value));
@@ -137,29 +140,31 @@ function isEvent(value$) {
137
140
  return value$ && ((_a = value$[symbolGetNode]) == null ? void 0 : _a.isEvent);
138
141
  }
139
142
  function setNodeValue(node, newValue) {
140
- var _a, _b, _c;
143
+ var _a;
141
144
  const parentNode = (_a = node.parent) != null ? _a : node;
142
145
  const key = node.parent ? node.key : "_";
143
146
  const isDelete = newValue === symbolDelete;
144
147
  if (isDelete)
145
148
  newValue = void 0;
146
149
  const parentValue = node.parent ? ensureNodeValue(parentNode) : parentNode.root;
147
- const prevValue = parentValue[key];
150
+ const useSetFn = isSet(parentValue);
151
+ const useMapFn = isMap(parentValue);
152
+ const prevValue = useSetFn ? key : useMapFn ? parentValue.get(key) : parentValue[key];
148
153
  const isFunc = isFunction(newValue);
149
154
  newValue = !parentNode.isAssigning && isFunc && !isFunction(prevValue) ? newValue(prevValue) : newValue;
150
- if (!globalState.isMerging || isNullOrUndefined(prevValue) || isFunction(prevValue) || !((_c = (_b = node.parent) == null ? void 0 : _b.functions) == null ? void 0 : _c.get(key))) {
155
+ if (newValue !== prevValue) {
151
156
  try {
152
157
  parentNode.isSetting = (parentNode.isSetting || 0) + 1;
153
- const useMapFn = isMap(parentValue);
154
158
  if (isDelete) {
155
- if (useMapFn) {
159
+ if (useMapFn || useSetFn) {
156
160
  parentValue.delete(key);
157
161
  } else {
158
162
  delete parentValue[key];
159
163
  }
160
164
  } else {
161
- const useMapFn2 = isMap(parentValue);
162
- if (useMapFn2) {
165
+ if (useSetFn) {
166
+ parentValue.add(newValue);
167
+ } else if (useMapFn) {
163
168
  parentValue.set(key, newValue);
164
169
  } else {
165
170
  parentValue[key] = newValue;
@@ -175,7 +180,7 @@ var arrNodeKeys = [];
175
180
  function getNodeValue(node) {
176
181
  let count = 0;
177
182
  let n = node;
178
- while (isChildNodeValue(n)) {
183
+ while (isChildNode(n)) {
179
184
  arrNodeKeys[count++] = n.key;
180
185
  n = n.parent;
181
186
  }
@@ -215,7 +220,7 @@ function getChildNode(node, key, asFunction) {
215
220
  function ensureNodeValue(node) {
216
221
  let value = getNodeValue(node);
217
222
  if (!value || isFunction(value)) {
218
- if (isChildNodeValue(node)) {
223
+ if (isChildNode(node)) {
219
224
  const parent = ensureNodeValue(node.parent);
220
225
  value = parent[node.key] = {};
221
226
  } else {
@@ -284,11 +289,16 @@ function setAtPath(obj, path, pathTypes, value, mode, fullObj, restore) {
284
289
  return obj;
285
290
  } else if (o[p] === void 0 && value === void 0 && i === path.length - 1) {
286
291
  return obj;
287
- } else if (o[p] === void 0 || o[p] === null) {
288
- o[p] = initializePathType(pathTypes[i]);
292
+ } else if (i < path.length - 1 && (o[p] === void 0 || o[p] === null)) {
293
+ const child = initializePathType(pathTypes[i]);
294
+ if (isMap(o)) {
295
+ o.set(p, child);
296
+ } else {
297
+ o[p] = child;
298
+ }
289
299
  }
290
300
  if (i < path.length - 1) {
291
- o = o[p];
301
+ o = isMap(o) ? o.get(p) : o[p];
292
302
  if (oFull) {
293
303
  oFull = oFull[p];
294
304
  }
@@ -297,13 +307,13 @@ function setAtPath(obj, path, pathTypes, value, mode, fullObj, restore) {
297
307
  }
298
308
  if (p === void 0) {
299
309
  if (mode === "merge") {
300
- obj = _mergeIntoObservable(obj, value);
310
+ obj = deepMerge(obj, value);
301
311
  } else {
302
312
  obj = value;
303
313
  }
304
314
  } else {
305
315
  if (mode === "merge") {
306
- o[p] = _mergeIntoObservable(o[p], value);
316
+ o[p] = deepMerge(o[p], value);
307
317
  } else if (isMap(o)) {
308
318
  o.set(p, value);
309
319
  } else {
@@ -312,80 +322,59 @@ function setAtPath(obj, path, pathTypes, value, mode, fullObj, restore) {
312
322
  }
313
323
  return obj;
314
324
  }
315
- function setInObservableAtPath(value$, path, pathTypes, value, mode) {
316
- let o = value$;
317
- let v = value;
318
- for (let i = 0; i < path.length; i++) {
319
- const p = path[i];
320
- if (!o.peek()[p]) {
321
- o[p].set(initializePathType(pathTypes[i]));
322
- }
323
- o = o[p];
324
- v = v[p];
325
- }
326
- if (v === symbolDelete) {
327
- o.delete();
328
- } else if (mode === "assign" && o.assign && isObject(o.peek())) {
329
- o.assign(v);
330
- } else if (mode === "merge") {
331
- mergeIntoObservable(o, v);
332
- } else {
333
- o.set(v);
334
- }
335
- }
336
325
  function mergeIntoObservable(target, ...sources) {
326
+ if (process.env.NODE_ENV === "development" || process.env.NODE_ENV === "test") {
327
+ if (!isObservable(target)) {
328
+ console.error("[legend-state] should only use mergeIntoObservable with observables");
329
+ }
330
+ }
337
331
  beginBatch();
338
- globalState.isMerging = true;
339
332
  for (let i = 0; i < sources.length; i++) {
340
- target = _mergeIntoObservable(
333
+ _mergeIntoObservable(
341
334
  target,
342
335
  sources[i],
343
336
  /*assign*/
344
- i < sources.length - 1
337
+ i < sources.length - 1,
338
+ 0
345
339
  );
346
340
  }
347
- globalState.isMerging = false;
348
341
  endBatch();
349
342
  return target;
350
343
  }
351
- function _mergeIntoObservable(target, source, assign2) {
352
- var _a;
344
+ function _mergeIntoObservable(target, source, assign2, levelsDeep) {
353
345
  if (isObservable(source)) {
354
346
  source = source.peek();
355
347
  }
356
- const needsSet = isObservable(target);
357
- const targetValue = needsSet ? target.peek() : target;
348
+ const targetValue = target.peek();
358
349
  const isTargetArr = isArray(targetValue);
359
350
  const isTargetObj = !isTargetArr && isObject(targetValue);
360
- if (isTargetObj && isObject(source) && !isEmpty(targetValue) || isTargetArr && targetValue.length > 0) {
361
- const keys = Object.keys(source);
351
+ const isSourceMap = isMap(source);
352
+ const isSourceSet = isSet(source);
353
+ if (isSourceSet && isSet(targetValue)) {
354
+ target.set(/* @__PURE__ */ new Set([...source, ...targetValue]));
355
+ } else if (isTargetObj && isObject(source) && !isEmpty(targetValue) || isTargetArr && targetValue.length > 0) {
356
+ const keys = isSourceMap || isSourceSet ? Array.from(source.keys()) : Object.keys(source);
362
357
  for (let i = 0; i < keys.length; i++) {
363
358
  const key = keys[i];
364
- const sourceValue = source[key];
359
+ const sourceValue = isSourceSet ? key : isSourceMap ? source.get(key) : source[key];
365
360
  if (sourceValue === symbolDelete) {
366
- needsSet && ((_a = target[key]) == null ? void 0 : _a.delete) ? target[key].delete() : delete target[key];
361
+ target[key].delete();
367
362
  } else {
368
363
  const isObj = isObject(sourceValue);
369
364
  const isArr = !isObj && isArray(sourceValue);
370
365
  const targetChild = target[key];
371
- if ((isObj || isArr) && targetChild && (needsSet || !isEmpty(targetChild))) {
372
- if (!needsSet && (!targetChild || (isObj ? !isObject(targetChild) : !isArray(targetChild)))) {
373
- target[key] = assign2 ? isArr ? [...sourceValue] : { ...sourceValue } : sourceValue;
374
- } else {
375
- _mergeIntoObservable(targetChild, sourceValue);
376
- }
377
- } else {
378
- if (needsSet) {
366
+ if ((isObj || isArr) && targetChild) {
367
+ if (levelsDeep > 0 && isEmpty(sourceValue)) {
379
368
  targetChild.set(sourceValue);
380
- } else {
381
- const toSet = isObject(sourceValue) ? { ...sourceValue } : isArray(sourceValue) ? [...sourceValue] : sourceValue;
382
- target[key] = toSet;
383
369
  }
370
+ _mergeIntoObservable(targetChild, sourceValue, false, levelsDeep + 1);
371
+ } else {
372
+ targetChild.set(sourceValue);
384
373
  }
385
374
  }
386
375
  }
387
376
  } else if (source !== void 0) {
388
- needsSet ? target.set(source) : target = assign2 ? isArray(source) ? [...source] : { ...source } : source;
377
+ target.set(source);
389
378
  }
390
379
  return target;
391
380
  }
@@ -422,12 +411,13 @@ function initializePathType(pathType) {
422
411
  switch (pathType) {
423
412
  case "array":
424
413
  return [];
425
- case "object":
426
- return {};
427
414
  case "map":
428
415
  return /* @__PURE__ */ new Map();
429
416
  case "set":
430
417
  return /* @__PURE__ */ new Set();
418
+ case "object":
419
+ default:
420
+ return {};
431
421
  }
432
422
  }
433
423
  function applyChange(value, change, applyPrevious) {
@@ -440,6 +430,33 @@ function applyChanges(value, changes, applyPrevious) {
440
430
  }
441
431
  return value;
442
432
  }
433
+ function deepMerge(target, ...sources) {
434
+ if (isPrimitive(target)) {
435
+ return sources[sources.length - 1];
436
+ }
437
+ let result = isArray(target) ? [...target] : { ...target };
438
+ for (let i = 0; i < sources.length; i++) {
439
+ const obj2 = sources[i];
440
+ if (isObject(obj2) || isArray(obj2)) {
441
+ const objTarget = obj2;
442
+ for (const key in objTarget) {
443
+ if (hasOwnProperty.call(objTarget, key)) {
444
+ if (objTarget[key] instanceof Object && !isObservable(objTarget[key]) && Object.keys(objTarget[key]).length > 0) {
445
+ result[key] = deepMerge(
446
+ result[key] || (isArray(objTarget[key]) ? [] : {}),
447
+ objTarget[key]
448
+ );
449
+ } else {
450
+ result[key] = objTarget[key];
451
+ }
452
+ }
453
+ }
454
+ } else {
455
+ result = obj2;
456
+ }
457
+ }
458
+ return result;
459
+ }
443
460
 
444
461
  // src/batching.ts
445
462
  var timeout;
@@ -486,9 +503,9 @@ function notify(node, value, prev, level, whenOptimizedOnlyIf) {
486
503
  changesInBatch,
487
504
  node,
488
505
  /*loading*/
489
- globalState.isLoadingLocal,
506
+ !!globalState.isLoadingLocal,
490
507
  /*remote*/
491
- globalState.isLoadingRemote,
508
+ !!globalState.isLoadingRemote,
492
509
  value,
493
510
  [],
494
511
  [],
@@ -499,31 +516,35 @@ function notify(node, value, prev, level, whenOptimizedOnlyIf) {
499
516
  level,
500
517
  whenOptimizedOnlyIf
501
518
  );
502
- if (changesInBatch.size) {
503
- batchNotifyChanges(
504
- changesInBatch,
505
- /*immediate*/
506
- true
507
- );
508
- }
509
519
  const existing = _batchMap.get(node);
510
520
  if (existing) {
511
- existing.value = value;
521
+ if (existing.prev === value) {
522
+ _batchMap.delete(node);
523
+ } else {
524
+ existing.value = value;
525
+ }
512
526
  } else {
513
527
  _batchMap.set(node, {
514
528
  value,
515
529
  prev,
516
530
  level,
517
531
  whenOptimizedOnlyIf,
518
- remote: globalState.isLoadingRemote,
519
- loading: globalState.isLoadingLocal
532
+ isFromSync: !!globalState.isLoadingRemote,
533
+ isFromPersist: !!globalState.isLoadingLocal
520
534
  });
521
535
  }
536
+ if (changesInBatch.size) {
537
+ batchNotifyChanges(
538
+ changesInBatch,
539
+ /*immediate*/
540
+ true
541
+ );
542
+ }
522
543
  if (numInBatch <= 0) {
523
544
  runBatch();
524
545
  }
525
546
  }
526
- function computeChangesAtNode(changesInBatch, node, loading, remote, value, path, pathTypes, valueAtPath, prevAtPath, immediate, level, whenOptimizedOnlyIf) {
547
+ function computeChangesAtNode(changesInBatch, node, isFromPersist, isFromSync, value, path, pathTypes, valueAtPath, prevAtPath, immediate, level, whenOptimizedOnlyIf) {
527
548
  if (immediate ? node.listenersImmediate : node.listeners) {
528
549
  const change = {
529
550
  path,
@@ -536,13 +557,14 @@ function computeChangesAtNode(changesInBatch, node, loading, remote, value, path
536
557
  const { changes } = changeInBatch;
537
558
  if (!isArraySubset(changes[0].path, change.path)) {
538
559
  changes.push(change);
560
+ changeInBatch.level = Math.min(changeInBatch.level, level);
539
561
  }
540
562
  } else {
541
563
  changesInBatch.set(node, {
542
564
  level,
543
565
  value,
544
- remote,
545
- loading,
566
+ isFromSync,
567
+ isFromPersist,
546
568
  whenOptimizedOnlyIf,
547
569
  changes: [change]
548
570
  });
@@ -606,7 +628,7 @@ function computeChangesRecursive(changesInBatch, node, loading, remote, value, p
606
628
  }
607
629
  function batchNotifyChanges(changesInBatch, immediate) {
608
630
  const listenersNotified = /* @__PURE__ */ new Set();
609
- changesInBatch.forEach(({ changes, level, value, loading, remote, whenOptimizedOnlyIf }, node) => {
631
+ changesInBatch.forEach(({ changes, level, value, isFromPersist, isFromSync, whenOptimizedOnlyIf }, node) => {
610
632
  const listeners = immediate ? node.listenersImmediate : node.listeners;
611
633
  if (listeners) {
612
634
  let listenerParams;
@@ -620,8 +642,8 @@ function batchNotifyChanges(changesInBatch, immediate) {
620
642
  if (!noArgs && !listenerParams) {
621
643
  listenerParams = {
622
644
  value,
623
- loading,
624
- remote,
645
+ isFromPersist,
646
+ isFromSync,
625
647
  getPrevious: createPreviousHandler(value, changes),
626
648
  changes
627
649
  };
@@ -649,12 +671,12 @@ function runBatch() {
649
671
  const map = _batchMap;
650
672
  _batchMap = /* @__PURE__ */ new Map();
651
673
  const changesInBatch = /* @__PURE__ */ new Map();
652
- map.forEach(({ value, prev, level, loading, remote, whenOptimizedOnlyIf }, node) => {
674
+ map.forEach(({ value, prev, level, isFromPersist, isFromSync, whenOptimizedOnlyIf }, node) => {
653
675
  computeChangesRecursive(
654
676
  changesInBatch,
655
677
  node,
656
- loading,
657
- remote,
678
+ isFromPersist,
679
+ isFromSync,
658
680
  value,
659
681
  [],
660
682
  [],
@@ -713,21 +735,6 @@ function getNodeAtPath(obj, path) {
713
735
  return o;
714
736
  }
715
737
 
716
- // src/linked.ts
717
- function linked(params, options) {
718
- if (isFunction(params)) {
719
- params = { get: params };
720
- }
721
- if (options) {
722
- params = { ...params, ...options };
723
- }
724
- const ret = function() {
725
- return { [symbolLinked]: params };
726
- };
727
- ret.prototype[symbolLinked] = params;
728
- return ret;
729
- }
730
-
731
738
  // src/createObservable.ts
732
739
  function createObservable(value, makePrimitive, extractPromise2, createObject, createPrimitive) {
733
740
  if (isObservable(value)) {
@@ -757,6 +764,21 @@ function createObservable(value, makePrimitive, extractPromise2, createObject, c
757
764
  return obs;
758
765
  }
759
766
 
767
+ // src/linked.ts
768
+ function linked(params, options) {
769
+ if (isFunction(params)) {
770
+ params = { get: params };
771
+ }
772
+ if (options) {
773
+ params = { ...params, ...options };
774
+ }
775
+ const ret = function() {
776
+ return { [symbolLinked]: params };
777
+ };
778
+ ret.prototype[symbolLinked] = params;
779
+ return ret;
780
+ }
781
+
760
782
  // src/onChange.ts
761
783
  function onChange(node, callback, options = {}, fromLinks) {
762
784
  var _a;
@@ -781,8 +803,8 @@ function onChange(node, callback, options = {}, fromLinks) {
781
803
  const value = getNodeValue(node);
782
804
  callback({
783
805
  value,
784
- loading: true,
785
- remote: false,
806
+ isFromPersist: true,
807
+ isFromSync: false,
786
808
  changes: [
787
809
  {
788
810
  path: [],
@@ -838,14 +860,14 @@ function onChange(node, callback, options = {}, fromLinks) {
838
860
  };
839
861
  }
840
862
  function createCb(linkedFromNode, path, callback) {
841
- let { valueAtPath: prevAtPath } = getValueAtPath2(getNodeValue(linkedFromNode), path);
842
- return function({ value: valueA, loading, remote }) {
843
- const { valueAtPath } = getValueAtPath2(valueA, path);
863
+ let prevAtPath = deconstructObjectWithPath(path, [], getNodeValue(linkedFromNode));
864
+ return function({ value: valueA, isFromPersist, isFromSync }) {
865
+ const valueAtPath = deconstructObjectWithPath(path, [], valueA);
844
866
  if (valueAtPath !== prevAtPath) {
845
867
  callback({
846
868
  value: valueAtPath,
847
- loading,
848
- remote,
869
+ isFromPersist,
870
+ isFromSync,
849
871
  changes: [
850
872
  {
851
873
  path: [],
@@ -860,16 +882,6 @@ function createCb(linkedFromNode, path, callback) {
860
882
  prevAtPath = valueAtPath;
861
883
  };
862
884
  }
863
- function getValueAtPath2(obj, path) {
864
- let o = obj;
865
- const pathTypes = [];
866
- for (let i = 0; o && i < path.length; i++) {
867
- pathTypes.push(isArray(o) ? "array" : "object");
868
- const p = path[i];
869
- o = o[p];
870
- }
871
- return { valueAtPath: o, pathTypes };
872
- }
873
885
 
874
886
  // src/setupTracking.ts
875
887
  function setupTracking(nodes, update, noArgs, immediate) {
@@ -965,12 +977,17 @@ function observe(selectorOrRun, reactionOrOptions, options) {
965
977
  options = reactionOrOptions;
966
978
  }
967
979
  let dispose;
980
+ let isRunning = false;
968
981
  const e = { num: 0 };
969
982
  const update = function() {
983
+ if (isRunning) {
984
+ return;
985
+ }
970
986
  if (e.onCleanup) {
971
987
  e.onCleanup();
972
988
  e.onCleanup = void 0;
973
989
  }
990
+ isRunning = true;
974
991
  beginBatch();
975
992
  delete e.value;
976
993
  dispose == null ? void 0 : dispose();
@@ -984,6 +1001,7 @@ function observe(selectorOrRun, reactionOrOptions, options) {
984
1001
  e.onCleanupReaction = void 0;
985
1002
  }
986
1003
  endBatch();
1004
+ isRunning = false;
987
1005
  if (reaction && ((options == null ? void 0 : options.fromComputed) || (e.num > 0 || !isEvent(selectorOrRun)) && (e.previous !== e.value || typeof e.value === "object"))) {
988
1006
  reaction(e);
989
1007
  }
@@ -1006,16 +1024,30 @@ function _when(predicate, effect, checkReady) {
1006
1024
  if (isPromise(predicate)) {
1007
1025
  return effect ? predicate.then(effect) : predicate;
1008
1026
  }
1027
+ const isPredicateArray = isArray(predicate);
1009
1028
  let value;
1010
1029
  let effectValue;
1011
1030
  function run(e) {
1012
- const ret = computeSelector(predicate);
1031
+ const ret = isPredicateArray ? predicate.map((p) => computeSelector(p)) : computeSelector(predicate);
1013
1032
  if (isPromise(ret)) {
1014
1033
  value = ret;
1015
1034
  return void 0;
1016
- } else if (!isPromise(ret) && (checkReady ? isObservableValueReady(ret) : ret)) {
1017
- value = ret;
1018
- e.cancel = true;
1035
+ } else {
1036
+ let isOk = true;
1037
+ if (isArray(ret)) {
1038
+ for (let i = 0; i < ret.length; i++) {
1039
+ if (isObservable(ret[i])) {
1040
+ ret[i] = computeSelector(ret[i]);
1041
+ }
1042
+ isOk = isOk && !!(checkReady ? isObservableValueReady(ret[i]) : ret[i]);
1043
+ }
1044
+ } else {
1045
+ isOk = checkReady ? isObservableValueReady(ret) : ret;
1046
+ }
1047
+ if (isOk) {
1048
+ value = ret;
1049
+ e.cancel = true;
1050
+ }
1019
1051
  }
1020
1052
  return value;
1021
1053
  }
@@ -1067,6 +1099,7 @@ var ArrayLoopers = /* @__PURE__ */ new Set([
1067
1099
  "filter",
1068
1100
  "find",
1069
1101
  "findIndex",
1102
+ "flatMap",
1070
1103
  "forEach",
1071
1104
  "join",
1072
1105
  "map",
@@ -1096,7 +1129,7 @@ function collectionSetter(node, target, prop, ...args) {
1096
1129
  const prevValue = target.slice();
1097
1130
  const ret = target[prop].apply(target, args);
1098
1131
  if (node) {
1099
- const hasParent = isChildNodeValue(node);
1132
+ const hasParent = isChildNode(node);
1100
1133
  const key = hasParent ? node.key : "_";
1101
1134
  const parentValue = hasParent ? getNodeValue(node.parent) : node.root;
1102
1135
  parentValue[key] = prevValue;
@@ -1120,7 +1153,7 @@ function updateNodes(parent, obj, prevValue) {
1120
1153
  }
1121
1154
  __devUpdateNodes.add(obj);
1122
1155
  }
1123
- if (isObject(obj) && obj[symbolOpaque] || isObject(prevValue) && prevValue[symbolOpaque]) {
1156
+ if (isObject(obj) && isOpaqueObject(obj) || isObject(prevValue) && isOpaqueObject(prevValue)) {
1124
1157
  const isDiff = obj !== prevValue;
1125
1158
  if (isDiff) {
1126
1159
  if (parent.listeners || parent.listenersImmediate) {
@@ -1308,10 +1341,10 @@ var proxyHandler = {
1308
1341
  if (p === symbolGetNode) {
1309
1342
  return node;
1310
1343
  }
1311
- if (p === "apply") {
1344
+ if (p === "apply" || p === "call") {
1312
1345
  const nodeValue = getNodeValue(node);
1313
1346
  if (isFunction(nodeValue)) {
1314
- return nodeValue.apply;
1347
+ return nodeValue[p];
1315
1348
  }
1316
1349
  }
1317
1350
  let value = peekInternal(
@@ -1319,11 +1352,14 @@ var proxyHandler = {
1319
1352
  /*activateRecursive*/
1320
1353
  p === "get" || p === "peek"
1321
1354
  );
1355
+ if (p === symbolIterator) {
1356
+ return !value || isPrimitive(value) ? void 0 : value[p];
1357
+ }
1322
1358
  const targetNode = node.linkedToNode || (value == null ? void 0 : value[symbolGetNode]);
1323
1359
  if (targetNode && p !== "onChange") {
1324
1360
  return proxyHandler.get(targetNode, p, receiver);
1325
1361
  }
1326
- if (isMap(value) || value instanceof WeakMap || value instanceof Set || value instanceof WeakSet) {
1362
+ if (isMap(value) || isSet(value)) {
1327
1363
  const ret = handlerMapSet(node, p, value);
1328
1364
  if (ret !== void 0) {
1329
1365
  return ret;
@@ -1353,7 +1389,7 @@ var proxyHandler = {
1353
1389
  return property.get(node);
1354
1390
  }
1355
1391
  let vProp = value == null ? void 0 : value[p];
1356
- if (isObject(value) && value[symbolOpaque]) {
1392
+ if (isObject(value) && isOpaqueObject(value)) {
1357
1393
  return vProp;
1358
1394
  }
1359
1395
  const fnOrComputed = (_a = node.functions) == null ? void 0 : _a.get(p);
@@ -1415,7 +1451,7 @@ var proxyHandler = {
1415
1451
  return vProp.bind(value);
1416
1452
  }
1417
1453
  if (isPrimitive(vProp)) {
1418
- if (isArray(value) && p === "length") {
1454
+ if (p === "length" && isArray(value)) {
1419
1455
  updateTracking(node, true);
1420
1456
  return vProp;
1421
1457
  }
@@ -1519,11 +1555,17 @@ function setKey(node, key, newValue, level) {
1519
1555
  } else {
1520
1556
  const { newValue: savedValue, prevValue } = setNodeValue(childNode, newValue);
1521
1557
  const isPrim = isPrimitive(savedValue) || savedValue instanceof Date;
1522
- if (!equals(savedValue, prevValue)) {
1523
- updateNodesAndNotify(node, savedValue, prevValue, childNode, isPrim, isRoot, level);
1524
- }
1525
1558
  if (!isPrim) {
1526
- childNode.needsExtract = true;
1559
+ let parent = childNode;
1560
+ do {
1561
+ parent.needsExtract = true;
1562
+ parent.recursivelyAutoActivated = false;
1563
+ } while (parent = parent.parent);
1564
+ }
1565
+ const notify2 = !equals(savedValue, prevValue);
1566
+ const forceNotify = !notify2 && childNode.isComputing && !isPrim;
1567
+ if (notify2 || forceNotify) {
1568
+ updateNodesAndNotify(node, savedValue, prevValue, childNode, isPrim, isRoot, level, forceNotify);
1527
1569
  }
1528
1570
  extractFunctionOrComputed(node, key, savedValue);
1529
1571
  }
@@ -1538,6 +1580,8 @@ function assign(node, value) {
1538
1580
  const currentValue = getNodeValue(node);
1539
1581
  if (isMap(currentValue)) {
1540
1582
  value.forEach((value2, key) => currentValue.set(key, value2));
1583
+ } else {
1584
+ set(node, value);
1541
1585
  }
1542
1586
  } else {
1543
1587
  node.isAssigning = (node.isAssigning || 0) + 1;
@@ -1551,7 +1595,7 @@ function assign(node, value) {
1551
1595
  return proxy2;
1552
1596
  }
1553
1597
  function deleteFn(node, key) {
1554
- if (key === void 0 && isChildNodeValue(node)) {
1598
+ if (key === void 0 && isChildNode(node)) {
1555
1599
  key = node.key;
1556
1600
  node = node.parent;
1557
1601
  }
@@ -1571,7 +1615,8 @@ function deleteFn(node, key) {
1571
1615
  function handlerMapSet(node, p, value) {
1572
1616
  const vProp = value == null ? void 0 : value[p];
1573
1617
  if (p === "size") {
1574
- return getProxy(node, p);
1618
+ updateTracking(node, true);
1619
+ return value[p];
1575
1620
  } else if (isFunction(vProp)) {
1576
1621
  return function(a, b, c) {
1577
1622
  const l = arguments.length;
@@ -1582,23 +1627,16 @@ function handlerMapSet(node, p, value) {
1582
1627
  }
1583
1628
  } else if (p === "set") {
1584
1629
  if (l === 2) {
1585
- const prev = valueMap.get(a);
1586
- const ret = valueMap.set(a, b);
1587
- if (prev !== b) {
1588
- updateNodesAndNotify(getChildNode(node, a), b, prev);
1589
- }
1590
- return ret;
1630
+ set(getChildNode(node, a), b);
1591
1631
  } else if (l === 1 && isMap(value)) {
1592
1632
  set(node, a);
1593
1633
  }
1634
+ return getProxy(node);
1594
1635
  } else if (p === "delete") {
1595
1636
  if (l > 0) {
1596
1637
  const prev = value.get ? valueMap.get(a) : a;
1597
- const ret = value.delete(a);
1598
- if (ret) {
1599
- updateNodesAndNotify(getChildNode(node, a), void 0, prev);
1600
- }
1601
- return ret;
1638
+ deleteFn(node, a);
1639
+ return prev !== void 0;
1602
1640
  }
1603
1641
  } else if (p === "clear") {
1604
1642
  const prev = new Map(valueMap);
@@ -1614,7 +1652,7 @@ function handlerMapSet(node, p, value) {
1614
1652
  if (!value.has(p)) {
1615
1653
  notify(node, ret, prev, 0);
1616
1654
  }
1617
- return ret;
1655
+ return getProxy(node);
1618
1656
  }
1619
1657
  const fn = observableFns.get(p);
1620
1658
  if (fn) {
@@ -1634,20 +1672,20 @@ function handlerMapSet(node, p, value) {
1634
1672
  };
1635
1673
  }
1636
1674
  }
1637
- function updateNodesAndNotify(node, newValue, prevValue, childNode, isPrim, isRoot, level) {
1675
+ function updateNodesAndNotify(node, newValue, prevValue, childNode, isPrim, isRoot, level, forceNotify) {
1638
1676
  if (!childNode)
1639
1677
  childNode = node;
1640
1678
  beginBatch();
1641
1679
  if (isPrim === void 0) {
1642
1680
  isPrim = isPrimitive(newValue);
1643
1681
  }
1644
- let hasADiff = isPrim;
1682
+ let hasADiff = forceNotify || isPrim;
1645
1683
  let whenOptimizedOnlyIf = false;
1646
1684
  if (!isPrim || prevValue && !isPrimitive(prevValue)) {
1647
1685
  if ((process.env.NODE_ENV === "development" || process.env.NODE_ENV === "test") && typeof __devUpdateNodes !== "undefined") {
1648
1686
  __devUpdateNodes.clear();
1649
1687
  }
1650
- hasADiff = updateNodes(childNode, newValue, prevValue);
1688
+ hasADiff = hasADiff || updateNodes(childNode, newValue, prevValue);
1651
1689
  if (isArray(newValue)) {
1652
1690
  whenOptimizedOnlyIf = (newValue == null ? void 0 : newValue.length) !== (prevValue == null ? void 0 : prevValue.length);
1653
1691
  }
@@ -1664,6 +1702,7 @@ function updateNodesAndNotify(node, newValue, prevValue, childNode, isPrim, isRo
1664
1702
  endBatch();
1665
1703
  }
1666
1704
  function extractPromise(node, value, setter) {
1705
+ const numGets = node.numGets = (node.numGets || 0) + 1;
1667
1706
  if (!node.state) {
1668
1707
  node.state = createObservable(
1669
1708
  {
@@ -1675,11 +1714,14 @@ function extractPromise(node, value, setter) {
1675
1714
  );
1676
1715
  }
1677
1716
  value.then((value2) => {
1678
- setter ? setter({ value: value2 }) : set(node, value2);
1679
- node.state.assign({
1680
- isLoaded: true,
1681
- error: void 0
1682
- });
1717
+ if (numGets >= (node.getNumResolved || 0)) {
1718
+ node.getNumResolved = node.numGets;
1719
+ setter ? setter({ value: value2 }) : set(node, value2);
1720
+ node.state.assign({
1721
+ isLoaded: true,
1722
+ error: void 0
1723
+ });
1724
+ }
1683
1725
  }).catch((error) => {
1684
1726
  node.state.error.set(error);
1685
1727
  });
@@ -1696,6 +1738,7 @@ function extractFunctionOrComputed(node, k, v) {
1696
1738
  const childNode = getChildNode(node, k, fn);
1697
1739
  const targetNode = getNode(v);
1698
1740
  const initialValue = peek(targetNode);
1741
+ setToObservable(childNode, v);
1699
1742
  setNodeValue(childNode, initialValue);
1700
1743
  return getNodeValue(childNode);
1701
1744
  } else if (typeof v === "function") {
@@ -1728,7 +1771,9 @@ function peekInternal(node, activateRecursive) {
1728
1771
  }
1729
1772
  isFlushing = false;
1730
1773
  let value = getNodeValue(node);
1731
- value = checkLazy(node, value, !!activateRecursive);
1774
+ if (!globalState.isLoadingLocal) {
1775
+ value = checkLazy(node, value, !!activateRecursive);
1776
+ }
1732
1777
  return value;
1733
1778
  }
1734
1779
  function checkLazy(node, value, activateRecursive) {
@@ -1743,10 +1788,12 @@ function checkLazy(node, value, activateRecursive) {
1743
1788
  } else {
1744
1789
  if (node.parent) {
1745
1790
  const parentValue = getNodeValue(node.parent);
1746
- if (parentValue) {
1747
- delete parentValue[node.key];
1748
- } else {
1749
- node.root._ = void 0;
1791
+ if (isFunction(value)) {
1792
+ if (parentValue) {
1793
+ delete parentValue[node.key];
1794
+ } else {
1795
+ node.root._ = void 0;
1796
+ }
1750
1797
  }
1751
1798
  }
1752
1799
  value = activateNodeFunction(node, lazyFn);
@@ -1835,7 +1882,9 @@ function activateNodeFunction(node, lazyFn) {
1835
1882
  var _a, _b, _c, _d;
1836
1883
  if (isFirst) {
1837
1884
  isFirst = false;
1838
- setNodeValue(node, void 0);
1885
+ if (isFunction(getNodeValue(node))) {
1886
+ setNodeValue(node, void 0);
1887
+ }
1839
1888
  } else if (!isFlushing && refreshFn) {
1840
1889
  if (shouldIgnoreUnobserved(node, refreshFn)) {
1841
1890
  ignoreThisUpdate = true;
@@ -1844,14 +1893,15 @@ function activateNodeFunction(node, lazyFn) {
1844
1893
  }
1845
1894
  let value = activateFn();
1846
1895
  let didSetToObs = false;
1847
- if (isObservable(value)) {
1848
- didSetToObs = true;
1896
+ const isObs = isObservable(value);
1897
+ if (isObs || node.linkedToNode) {
1898
+ didSetToObs = isObs;
1849
1899
  value = setToObservable(node, value);
1850
1900
  }
1851
- if (isFunction(value)) {
1901
+ if (isFunction(value) && value.length === 0) {
1852
1902
  value = value();
1853
1903
  }
1854
- const activated = !isObservable(value) ? value == null ? void 0 : value[symbolLinked] : void 0;
1904
+ const activated = !isObs ? value == null ? void 0 : value[symbolLinked] : void 0;
1855
1905
  if (activated) {
1856
1906
  node.activationState = activated;
1857
1907
  value = void 0;
@@ -1906,16 +1956,14 @@ function activateNodeFunction(node, lazyFn) {
1906
1956
  }
1907
1957
  } else {
1908
1958
  activatedValue = value;
1909
- if (node.state.isLoaded.peek()) {
1959
+ const isLoaded = node.state.isLoaded.peek();
1960
+ if (isLoaded || !isFunction(value)) {
1910
1961
  node.isComputing = true;
1911
1962
  set(node, value);
1912
1963
  node.isComputing = false;
1913
- } else {
1914
- setNodeValue(node, value);
1915
- node.state.assign({
1916
- isLoaded: true,
1917
- error: void 0
1918
- });
1964
+ }
1965
+ if (!isLoaded) {
1966
+ node.state.assign({ isLoaded: true, error: void 0 });
1919
1967
  }
1920
1968
  }
1921
1969
  }
@@ -1956,14 +2004,14 @@ function activateNodeBase(node, value) {
1956
2004
  if (allChanges.length > 0) {
1957
2005
  let changes;
1958
2006
  let value2;
1959
- let loading = false;
1960
- let remote = false;
2007
+ let isFromPersist = false;
2008
+ let isFromSync = false;
1961
2009
  let getPrevious;
1962
2010
  if (listenerParams) {
1963
2011
  changes = listenerParams.changes;
1964
2012
  value2 = listenerParams.value;
1965
- loading = listenerParams.loading;
1966
- remote = listenerParams.remote;
2013
+ isFromPersist = listenerParams.isFromPersist;
2014
+ isFromSync = listenerParams.isFromSync;
1967
2015
  getPrevious = listenerParams.getPrevious;
1968
2016
  } else {
1969
2017
  changes = allChanges;
@@ -1983,8 +2031,8 @@ function activateNodeBase(node, value) {
1983
2031
  setFn({
1984
2032
  value: value2,
1985
2033
  changes,
1986
- loading,
1987
- remote,
2034
+ isFromPersist,
2035
+ isFromSync,
1988
2036
  getPrevious
1989
2037
  });
1990
2038
  node.isComputing = false;
@@ -2019,26 +2067,31 @@ function activateNodeBase(node, value) {
2019
2067
  }
2020
2068
  function setToObservable(node, value) {
2021
2069
  var _a;
2022
- const linkedNode = getNode(value);
2070
+ const linkedNode = value ? getNode(value) : void 0;
2023
2071
  if (linkedNode !== node && (linkedNode == null ? void 0 : linkedNode.linkedToNode) !== node) {
2024
2072
  node.linkedToNode = linkedNode;
2025
- linkedNode.linkedFromNodes || (linkedNode.linkedFromNodes = /* @__PURE__ */ new Set());
2026
- linkedNode.linkedFromNodes.add(node);
2027
2073
  (_a = node.linkedToNodeDispose) == null ? void 0 : _a.call(node);
2028
- node.linkedToNodeDispose = onChange(
2029
- linkedNode,
2030
- () => {
2031
- value = peekInternal(linkedNode);
2032
- set(node, value);
2033
- },
2034
- { initial: true },
2035
- /* @__PURE__ */ new Set([node])
2036
- );
2074
+ if (linkedNode) {
2075
+ linkedNode.linkedFromNodes || (linkedNode.linkedFromNodes = /* @__PURE__ */ new Set());
2076
+ linkedNode.linkedFromNodes.add(node);
2077
+ node.linkedToNodeDispose = onChange(
2078
+ linkedNode,
2079
+ () => {
2080
+ value = peekInternal(linkedNode);
2081
+ if (!isFunction(value)) {
2082
+ set(node, value);
2083
+ }
2084
+ },
2085
+ { initial: true },
2086
+ /* @__PURE__ */ new Set([node])
2087
+ );
2088
+ }
2037
2089
  }
2038
2090
  return value;
2039
2091
  }
2040
2092
  function recursivelyAutoActivate(obj, node) {
2041
- if (isObject(obj) || isArray(obj)) {
2093
+ if (!node.recursivelyAutoActivated && (isObject(obj) || isArray(obj)) && !isOpaqueObject(obj)) {
2094
+ node.recursivelyAutoActivated = true;
2042
2095
  const pathStack = [];
2043
2096
  const getNodeAtPath2 = () => {
2044
2097
  var _a;
@@ -2056,27 +2109,29 @@ function recursivelyAutoActivate(obj, node) {
2056
2109
  }
2057
2110
  function recursivelyAutoActivateInner(obj, pathStack, getNodeAtPath2) {
2058
2111
  var _a;
2059
- for (const key in obj) {
2060
- if (hasOwnProperty.call(obj, key)) {
2061
- const value = obj[key];
2062
- if (isObservable(value)) {
2063
- const childNode = getNodeAtPath2();
2064
- extractFunctionOrComputed(childNode, key, value);
2065
- delete childNode.lazy;
2066
- } else {
2067
- const linkedOptions = isFunction(value) && ((_a = value.prototype) == null ? void 0 : _a[symbolLinked]);
2068
- if (linkedOptions) {
2069
- const activate = linkedOptions.activate;
2070
- if (!activate || activate === "auto") {
2071
- const childNode = getNodeAtPath2();
2072
- peek(getChildNode(childNode, key, value));
2112
+ if ((isObject(obj) || isArray(obj)) && !isOpaqueObject(obj)) {
2113
+ for (const key in obj) {
2114
+ if (hasOwnProperty.call(obj, key)) {
2115
+ const value = obj[key];
2116
+ if (isObservable(value)) {
2117
+ const childNode = getNodeAtPath2();
2118
+ extractFunctionOrComputed(childNode, key, value);
2119
+ delete childNode.lazy;
2120
+ } else {
2121
+ const linkedOptions = isFunction(value) && ((_a = value.prototype) == null ? void 0 : _a[symbolLinked]);
2122
+ if (linkedOptions) {
2123
+ const activate = linkedOptions.activate;
2124
+ if (!activate || activate === "auto") {
2125
+ const childNode = getNodeAtPath2();
2126
+ peek(getChildNode(childNode, key, value));
2127
+ }
2073
2128
  }
2074
2129
  }
2075
- }
2076
- if (typeof value === "object") {
2077
- pathStack.push({ key, value });
2078
- recursivelyAutoActivateInner(value, pathStack, getNodeAtPath2);
2079
- pathStack.pop();
2130
+ if (typeof value === "object") {
2131
+ pathStack.push({ key, value });
2132
+ recursivelyAutoActivateInner(value, pathStack, getNodeAtPath2);
2133
+ pathStack.pop();
2134
+ }
2080
2135
  }
2081
2136
  }
2082
2137
  }
@@ -2132,16 +2187,6 @@ function observable(value) {
2132
2187
  function observablePrimitive(value) {
2133
2188
  return createObservable(value, true, extractPromise, getProxy, ObservablePrimitiveClass);
2134
2189
  }
2135
- function syncState(obs) {
2136
- const node = getNode(obs);
2137
- if (!node.state) {
2138
- peekInternal(node);
2139
- }
2140
- if (!node.state) {
2141
- node.state = observable({});
2142
- }
2143
- return node.state;
2144
- }
2145
2190
 
2146
2191
  // src/computed.ts
2147
2192
  function computed(get2, set2) {
@@ -2150,45 +2195,6 @@ function computed(get2, set2) {
2150
2195
  );
2151
2196
  }
2152
2197
 
2153
- // src/config.ts
2154
- function configureLegendState({
2155
- observableFunctions,
2156
- observableProperties: observableProperties2,
2157
- jsonReplacer,
2158
- jsonReviver
2159
- }) {
2160
- if (observableFunctions) {
2161
- for (const key in observableFunctions) {
2162
- const fn = observableFunctions[key];
2163
- observableFns.set(key, fn);
2164
- ObservablePrimitiveClass.prototype[key] = function(...args) {
2165
- return fn.call(this, this._node, ...args);
2166
- };
2167
- }
2168
- }
2169
- if (observableProperties2) {
2170
- for (const key in observableProperties2) {
2171
- const fns2 = observableProperties2[key];
2172
- observableProperties.set(key, fns2);
2173
- Object.defineProperty(ObservablePrimitiveClass.prototype, key, {
2174
- configurable: true,
2175
- get() {
2176
- return fns2.get.call(this, this._node);
2177
- },
2178
- set(value) {
2179
- return fns2.set.call(this, this._node, value);
2180
- }
2181
- });
2182
- }
2183
- }
2184
- if (jsonReplacer) {
2185
- globalState.replacer = jsonReplacer;
2186
- }
2187
- if (jsonReviver) {
2188
- globalState.reviver = jsonReviver;
2189
- }
2190
- }
2191
-
2192
2198
  // src/event.ts
2193
2199
  function event() {
2194
2200
  const obs = observable(0);
@@ -2219,66 +2225,34 @@ function proxy(get2, set2) {
2219
2225
  );
2220
2226
  }
2221
2227
 
2222
- // src/retry.ts
2223
- function calculateRetryDelay(retryOptions, attemptNum) {
2224
- const { backoff, delay = 1e3, infinite, times = 3, maxDelay = 3e4 } = retryOptions;
2225
- if (infinite || attemptNum < times) {
2226
- const delayTime = Math.min(delay * (backoff === "constant" ? 1 : 2 ** attemptNum), maxDelay);
2227
- return delayTime;
2228
- }
2229
- return null;
2230
- }
2231
- function createRetryTimeout(retryOptions, attemptNum, fn) {
2232
- const delayTime = calculateRetryDelay(retryOptions, attemptNum);
2233
- if (delayTime) {
2234
- return setTimeout(fn, delayTime);
2235
- }
2236
- }
2237
- function runWithRetry(node, state, fn) {
2238
- const { waitFor } = node.activationState;
2239
- const { retry } = state;
2240
- const e = { cancel: false };
2241
- let value = void 0;
2242
- if (waitFor) {
2243
- value = whenReady(waitFor, () => {
2244
- node.activationState.waitFor = void 0;
2245
- return fn(e);
2246
- });
2247
- } else {
2248
- value = fn(e);
2249
- }
2250
- if (isPromise(value) && retry) {
2251
- let timeoutRetry;
2252
- return new Promise((resolve) => {
2253
- const run = () => {
2254
- value.then((val) => {
2255
- node.activationState.persistedRetry = false;
2256
- resolve(val);
2257
- }).catch(() => {
2258
- state.attemptNum++;
2259
- if (timeoutRetry) {
2260
- clearTimeout(timeoutRetry);
2261
- }
2262
- if (!e.cancel) {
2263
- timeoutRetry = createRetryTimeout(retry, state.attemptNum, () => {
2264
- value = fn(e);
2265
- run();
2266
- });
2267
- }
2268
- }).finally(() => {
2269
- node.activationState.persistedRetry = false;
2270
- });
2271
- };
2272
- run();
2228
+ // src/syncState.ts
2229
+ function syncState(obs) {
2230
+ const node = getNode(obs);
2231
+ if (!node.state) {
2232
+ node.state = observable({
2233
+ isPersistLoaded: false,
2234
+ isLoaded: false,
2235
+ isPersistEnabled: true,
2236
+ isSyncEnabled: true,
2237
+ isGetting: false,
2238
+ isSetting: false,
2239
+ numPendingGets: 0,
2240
+ numPendingSets: 0,
2241
+ syncCount: 0,
2242
+ clearPersist: void 0,
2243
+ reset: () => Promise.resolve(),
2244
+ sync: () => Promise.resolve(),
2245
+ getPendingChanges: () => ({})
2273
2246
  });
2274
2247
  }
2275
- return value;
2248
+ return node.state;
2276
2249
  }
2277
2250
 
2278
2251
  // index.ts
2279
2252
  var internal = {
2280
2253
  createPreviousHandler,
2281
2254
  clone,
2255
+ deepMerge,
2282
2256
  ensureNodeValue,
2283
2257
  findIDKey,
2284
2258
  get,
@@ -2292,7 +2266,6 @@ var internal = {
2292
2266
  observableFns,
2293
2267
  optimized,
2294
2268
  peek,
2295
- runWithRetry,
2296
2269
  safeParse,
2297
2270
  safeStringify,
2298
2271
  set,
@@ -2311,7 +2284,6 @@ exports.beginBatch = beginBatch;
2311
2284
  exports.beginTracking = beginTracking;
2312
2285
  exports.computeSelector = computeSelector;
2313
2286
  exports.computed = computed;
2314
- exports.configureLegendState = configureLegendState;
2315
2287
  exports.constructObjectWithPath = constructObjectWithPath;
2316
2288
  exports.deconstructObjectWithPath = deconstructObjectWithPath;
2317
2289
  exports.endBatch = endBatch;
@@ -2348,7 +2320,6 @@ exports.opaqueObject = opaqueObject;
2348
2320
  exports.optimized = optimized;
2349
2321
  exports.proxy = proxy;
2350
2322
  exports.setAtPath = setAtPath;
2351
- exports.setInObservableAtPath = setInObservableAtPath;
2352
2323
  exports.setSilently = setSilently;
2353
2324
  exports.setupTracking = setupTracking;
2354
2325
  exports.shouldIgnoreUnobserved = shouldIgnoreUnobserved;