@legendapp/state 3.0.0-alpha.8 → 3.0.0-beta.0

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 (86) hide show
  1. package/.DS_Store +0 -0
  2. package/config/configureLegendState.d.mts +13 -0
  3. package/config/configureLegendState.d.ts +13 -0
  4. package/config/configureLegendState.js +45 -0
  5. package/config/configureLegendState.mjs +43 -0
  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/helpers/trackHistory.js +2 -2
  15. package/helpers/trackHistory.mjs +2 -2
  16. package/index.d.mts +104 -80
  17. package/index.d.ts +104 -80
  18. package/index.js +328 -318
  19. package/index.mjs +325 -316
  20. package/package.json +36 -1
  21. package/persist-plugins/async-storage.d.mts +6 -3
  22. package/persist-plugins/async-storage.d.ts +6 -3
  23. package/persist-plugins/async-storage.js +8 -4
  24. package/persist-plugins/async-storage.mjs +8 -5
  25. package/persist-plugins/indexeddb.d.mts +6 -4
  26. package/persist-plugins/indexeddb.d.ts +6 -4
  27. package/persist-plugins/indexeddb.js +35 -15
  28. package/persist-plugins/indexeddb.mjs +35 -16
  29. package/persist-plugins/mmkv.d.mts +5 -1
  30. package/persist-plugins/mmkv.d.ts +5 -1
  31. package/persist-plugins/mmkv.js +10 -5
  32. package/persist-plugins/mmkv.mjs +10 -6
  33. package/react-reactive/enableReactComponents.d.mts +9 -0
  34. package/react-reactive/enableReactComponents.d.ts +9 -0
  35. package/react-reactive/enableReactComponents.js +19 -0
  36. package/react-reactive/enableReactComponents.mjs +17 -0
  37. package/react-reactive/enableReactNativeComponents.d.mts +22 -0
  38. package/react-reactive/enableReactNativeComponents.d.ts +22 -0
  39. package/react-reactive/enableReactNativeComponents.js +53 -0
  40. package/react-reactive/enableReactNativeComponents.mjs +51 -0
  41. package/react-reactive/enableReactive.d.mts +5 -0
  42. package/react-reactive/enableReactive.d.ts +5 -0
  43. package/react-reactive/enableReactive.js +24 -0
  44. package/react-reactive/enableReactive.mjs +22 -0
  45. package/react-reactive/enableReactive.native.d.mts +5 -0
  46. package/react-reactive/enableReactive.native.d.ts +5 -0
  47. package/react-reactive/enableReactive.native.js +58 -0
  48. package/react-reactive/enableReactive.native.mjs +56 -0
  49. package/react-reactive/enableReactive.web.d.mts +5 -0
  50. package/react-reactive/enableReactive.web.d.ts +5 -0
  51. package/react-reactive/enableReactive.web.js +58 -0
  52. package/react-reactive/enableReactive.web.mjs +56 -0
  53. package/react.d.mts +39 -34
  54. package/react.d.ts +39 -34
  55. package/react.js +39 -17
  56. package/react.mjs +39 -17
  57. package/sync-plugins/crud.d.mts +21 -24
  58. package/sync-plugins/crud.d.ts +21 -24
  59. package/sync-plugins/crud.js +241 -140
  60. package/sync-plugins/crud.mjs +243 -142
  61. package/sync-plugins/fetch.js +12 -8
  62. package/sync-plugins/fetch.mjs +13 -9
  63. package/sync-plugins/firebase.d.mts +27 -0
  64. package/sync-plugins/firebase.d.ts +27 -0
  65. package/sync-plugins/firebase.js +373 -0
  66. package/sync-plugins/firebase.mjs +368 -0
  67. package/sync-plugins/keel.d.mts +43 -26
  68. package/sync-plugins/keel.d.ts +43 -26
  69. package/sync-plugins/keel.js +145 -100
  70. package/sync-plugins/keel.mjs +147 -100
  71. package/sync-plugins/supabase.d.mts +19 -9
  72. package/sync-plugins/supabase.d.ts +19 -9
  73. package/sync-plugins/supabase.js +52 -22
  74. package/sync-plugins/supabase.mjs +53 -23
  75. package/sync-plugins/tanstack-query.d.mts +2 -2
  76. package/sync-plugins/tanstack-query.d.ts +2 -2
  77. package/sync-plugins/tanstack-query.js +22 -5
  78. package/sync-plugins/tanstack-query.mjs +22 -5
  79. package/sync-plugins/tanstack-react-query.d.mts +1 -1
  80. package/sync-plugins/tanstack-react-query.d.ts +1 -1
  81. package/sync-plugins/tanstack-react-query.js +8 -1
  82. package/sync-plugins/tanstack-react-query.mjs +8 -1
  83. package/sync.d.mts +74 -200
  84. package/sync.d.ts +74 -200
  85. package/sync.js +492 -293
  86. package/sync.mjs +498 -299
package/index.mjs CHANGED
@@ -9,6 +9,9 @@ function isString(obj) {
9
9
  function isObject(obj) {
10
10
  return !!obj && typeof obj === "object" && !(obj instanceof Date) && !isArray(obj);
11
11
  }
12
+ function isPlainObject(obj) {
13
+ return isObject(obj) && obj.constructor === Object;
14
+ }
12
15
  function isFunction(obj) {
13
16
  return typeof obj === "function";
14
17
  }
@@ -29,17 +32,22 @@ function isPromise(obj) {
29
32
  return obj instanceof Promise;
30
33
  }
31
34
  function isMap(obj) {
32
- return obj instanceof Map;
35
+ return obj instanceof Map || obj instanceof WeakMap;
36
+ }
37
+ function isSet(obj) {
38
+ return obj instanceof Set || obj instanceof WeakSet;
33
39
  }
34
40
  function isNumber(obj) {
35
41
  const n = obj;
36
- return n - n < 1;
42
+ return typeof n === "number" && n - n < 1;
37
43
  }
38
44
  function isEmpty(obj) {
39
45
  if (!obj)
40
46
  return false;
41
47
  if (isArray(obj))
42
48
  return obj.length === 0;
49
+ if (isMap(obj) || isSet(obj))
50
+ return obj.size === 0;
43
51
  for (const key in obj) {
44
52
  if (hasOwnProperty.call(obj, key)) {
45
53
  return false;
@@ -54,27 +62,29 @@ var setPrimitives = /* @__PURE__ */ new Set(["boolean", "string", "number"]);
54
62
  function isActualPrimitive(arg) {
55
63
  return setPrimitives.has(typeof arg);
56
64
  }
57
- function isChildNodeValue(node) {
65
+ function isChildNode(node) {
58
66
  return !!node.parent;
59
67
  }
60
68
 
61
69
  // src/globals.ts
62
70
  var symbolToPrimitive = Symbol.toPrimitive;
71
+ var symbolIterator = Symbol.iterator;
63
72
  var symbolGetNode = Symbol("getNode");
64
73
  var symbolDelete = /* @__PURE__ */ Symbol("delete");
65
74
  var symbolOpaque = Symbol("opaque");
75
+ var symbolPlain = Symbol("plain");
66
76
  var optimized = Symbol("optimized");
67
77
  var symbolLinked = Symbol("linked");
68
78
  var globalState = {
69
- isLoadingLocal: false,
70
- isMerging: false,
71
- isLoadingRemote: false,
72
- activateSyncedNode: void 0,
73
79
  pendingNodes: /* @__PURE__ */ new Map(),
74
- dirtyNodes: /* @__PURE__ */ new Set(),
75
- replacer: void 0,
76
- reviver: void 0
80
+ dirtyNodes: /* @__PURE__ */ new Set()
77
81
  };
82
+ function isHintOpaque(value) {
83
+ return value && (value[symbolOpaque] || value["$$typeof"]);
84
+ }
85
+ function isHintPlain(value) {
86
+ return value && value[symbolPlain];
87
+ }
78
88
  function getPathType(value) {
79
89
  return isArray(value) ? "array" : isMap(value) ? "map" : value instanceof Set ? "set" : "object";
80
90
  }
@@ -116,10 +126,10 @@ function reviver(key, value) {
116
126
  return value;
117
127
  }
118
128
  function safeStringify(value) {
119
- return JSON.stringify(value, replacer);
129
+ return value ? JSON.stringify(value, replacer) : value;
120
130
  }
121
131
  function safeParse(value) {
122
- return JSON.parse(value, reviver);
132
+ return value ? JSON.parse(value, reviver) : value;
123
133
  }
124
134
  function clone(value) {
125
135
  return safeParse(safeStringify(value));
@@ -135,29 +145,31 @@ function isEvent(value$) {
135
145
  return value$ && ((_a = value$[symbolGetNode]) == null ? void 0 : _a.isEvent);
136
146
  }
137
147
  function setNodeValue(node, newValue) {
138
- var _a, _b, _c;
148
+ var _a;
139
149
  const parentNode = (_a = node.parent) != null ? _a : node;
140
150
  const key = node.parent ? node.key : "_";
141
151
  const isDelete = newValue === symbolDelete;
142
152
  if (isDelete)
143
153
  newValue = void 0;
144
154
  const parentValue = node.parent ? ensureNodeValue(parentNode) : parentNode.root;
145
- const prevValue = parentValue[key];
155
+ const useSetFn = isSet(parentValue);
156
+ const useMapFn = isMap(parentValue);
157
+ const prevValue = useSetFn ? key : useMapFn ? parentValue.get(key) : parentValue[key];
146
158
  const isFunc = isFunction(newValue);
147
159
  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))) {
160
+ if (newValue !== prevValue) {
149
161
  try {
150
162
  parentNode.isSetting = (parentNode.isSetting || 0) + 1;
151
- const useMapFn = isMap(parentValue);
152
163
  if (isDelete) {
153
- if (useMapFn) {
164
+ if (useMapFn || useSetFn) {
154
165
  parentValue.delete(key);
155
166
  } else {
156
167
  delete parentValue[key];
157
168
  }
158
169
  } else {
159
- const useMapFn2 = isMap(parentValue);
160
- if (useMapFn2) {
170
+ if (useSetFn) {
171
+ parentValue.add(newValue);
172
+ } else if (useMapFn) {
161
173
  parentValue.set(key, newValue);
162
174
  } else {
163
175
  parentValue[key] = newValue;
@@ -173,7 +185,7 @@ var arrNodeKeys = [];
173
185
  function getNodeValue(node) {
174
186
  let count = 0;
175
187
  let n = node;
176
- while (isChildNodeValue(n)) {
188
+ while (isChildNode(n)) {
177
189
  arrNodeKeys[count++] = n.key;
178
190
  n = n.parent;
179
191
  }
@@ -213,7 +225,7 @@ function getChildNode(node, key, asFunction) {
213
225
  function ensureNodeValue(node) {
214
226
  let value = getNodeValue(node);
215
227
  if (!value || isFunction(value)) {
216
- if (isChildNodeValue(node)) {
228
+ if (isChildNode(node)) {
217
229
  const parent = ensureNodeValue(node.parent);
218
230
  value = parent[node.key] = {};
219
231
  } else {
@@ -244,6 +256,27 @@ function equals(a, b) {
244
256
  return a === b || isDate(a) && isDate(b) && +a === +b;
245
257
  }
246
258
 
259
+ // src/ObservableHint.ts
260
+ function addSymbol(value, symbol) {
261
+ if (value) {
262
+ Object.defineProperty(value, symbol, {
263
+ value: true,
264
+ enumerable: false,
265
+ writable: true,
266
+ configurable: true
267
+ });
268
+ }
269
+ return value;
270
+ }
271
+ var ObservableHint = {
272
+ opaque: function opaqueObject(value) {
273
+ return addSymbol(value, symbolOpaque);
274
+ },
275
+ plain: function plainObject(value) {
276
+ return addSymbol(value, symbolPlain);
277
+ }
278
+ };
279
+
247
280
  // src/helpers.ts
248
281
  function computeSelector(selector, e, retainObservable) {
249
282
  let c = selector;
@@ -257,7 +290,10 @@ function getObservableIndex(value$) {
257
290
  const n = +node.key;
258
291
  return isNumber(n) ? n : -1;
259
292
  }
260
- function opaqueObject(value) {
293
+ function opaqueObject2(value) {
294
+ if (process.env.NODE_ENV === "development") {
295
+ console.warn("[legend-state]: In version 3.0 opaqueObject is moved to ObservableHint.opaque");
296
+ }
261
297
  if (value) {
262
298
  value[symbolOpaque] = true;
263
299
  }
@@ -274,34 +310,46 @@ function setAtPath(obj, path, pathTypes, value, mode, fullObj, restore) {
274
310
  let oFull = fullObj;
275
311
  for (let i = 0; i < path.length; i++) {
276
312
  p = path[i];
277
- if (o[p] === symbolDelete) {
313
+ const map = isMap(o);
314
+ let child = o ? map ? o.get(p) : o[p] : void 0;
315
+ const fullChild = oFull ? map ? oFull.get(p) : oFull[p] : void 0;
316
+ if (child === symbolDelete) {
278
317
  if (oFull) {
279
- o[p] = oFull[p];
280
- restore == null ? void 0 : restore(path.slice(0, i + 1), o[p]);
318
+ if (map) {
319
+ o.set(p, fullChild);
320
+ } else {
321
+ o[p] = fullChild;
322
+ }
323
+ restore == null ? void 0 : restore(path.slice(0, i + 1), fullChild);
281
324
  }
282
325
  return obj;
283
- } else if (o[p] === void 0 && value === void 0 && i === path.length - 1) {
326
+ } else if (child === void 0 && value === void 0 && i === path.length - 1) {
284
327
  return obj;
285
- } else if (o[p] === void 0 || o[p] === null) {
286
- o[p] = initializePathType(pathTypes[i]);
328
+ } else if (i < path.length - 1 && (child === void 0 || child === null)) {
329
+ child = initializePathType(pathTypes[i]);
330
+ if (isMap(o)) {
331
+ o.set(p, child);
332
+ } else {
333
+ o[p] = child;
334
+ }
287
335
  }
288
336
  if (i < path.length - 1) {
289
- o = o[p];
337
+ o = child;
290
338
  if (oFull) {
291
- oFull = oFull[p];
339
+ oFull = fullChild;
292
340
  }
293
341
  }
294
342
  }
295
343
  }
296
344
  if (p === void 0) {
297
345
  if (mode === "merge") {
298
- obj = _mergeIntoObservable(obj, value);
346
+ obj = deepMerge(obj, value);
299
347
  } else {
300
348
  obj = value;
301
349
  }
302
350
  } else {
303
351
  if (mode === "merge") {
304
- o[p] = _mergeIntoObservable(o[p], value);
352
+ o[p] = deepMerge(o[p], value);
305
353
  } else if (isMap(o)) {
306
354
  o.set(p, value);
307
355
  } else {
@@ -310,80 +358,53 @@ function setAtPath(obj, path, pathTypes, value, mode, fullObj, restore) {
310
358
  }
311
359
  return obj;
312
360
  }
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
361
  function mergeIntoObservable(target, ...sources) {
362
+ if (process.env.NODE_ENV === "development" || process.env.NODE_ENV === "test") {
363
+ if (!isObservable(target)) {
364
+ console.error("[legend-state] should only use mergeIntoObservable with observables");
365
+ }
366
+ }
335
367
  beginBatch();
336
- globalState.isMerging = true;
337
368
  for (let i = 0; i < sources.length; i++) {
338
- target = _mergeIntoObservable(
339
- target,
340
- sources[i],
341
- /*assign*/
342
- i < sources.length - 1
343
- );
369
+ _mergeIntoObservable(target, sources[i], 0);
344
370
  }
345
- globalState.isMerging = false;
346
371
  endBatch();
347
372
  return target;
348
373
  }
349
- function _mergeIntoObservable(target, source, assign2) {
350
- var _a;
374
+ function _mergeIntoObservable(target, source, levelsDeep) {
351
375
  if (isObservable(source)) {
352
376
  source = source.peek();
353
377
  }
354
- const needsSet = isObservable(target);
355
- const targetValue = needsSet ? target.peek() : target;
378
+ const targetValue = target.peek();
356
379
  const isTargetArr = isArray(targetValue);
357
380
  const isTargetObj = !isTargetArr && isObject(targetValue);
358
- if (isTargetObj && isObject(source) && !isEmpty(targetValue) || isTargetArr && targetValue.length > 0) {
359
- const keys = Object.keys(source);
381
+ const isSourceMap = isMap(source);
382
+ const isSourceSet = isSet(source);
383
+ if (isSourceSet && isSet(targetValue)) {
384
+ target.set(/* @__PURE__ */ new Set([...source, ...targetValue]));
385
+ } else if (isTargetObj && isObject(source) && !isEmpty(targetValue) || isTargetArr && targetValue.length > 0) {
386
+ const keys = isSourceMap || isSourceSet ? Array.from(source.keys()) : Object.keys(source);
360
387
  for (let i = 0; i < keys.length; i++) {
361
388
  const key = keys[i];
362
- const sourceValue = source[key];
389
+ const sourceValue = isSourceSet ? key : isSourceMap ? source.get(key) : source[key];
363
390
  if (sourceValue === symbolDelete) {
364
- needsSet && ((_a = target[key]) == null ? void 0 : _a.delete) ? target[key].delete() : delete target[key];
391
+ target[key].delete();
365
392
  } else {
366
393
  const isObj = isObject(sourceValue);
367
394
  const isArr = !isObj && isArray(sourceValue);
368
395
  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) {
396
+ if ((isObj || isArr) && targetChild) {
397
+ if (levelsDeep > 0 && isEmpty(sourceValue)) {
377
398
  targetChild.set(sourceValue);
378
- } else {
379
- const toSet = isObject(sourceValue) ? { ...sourceValue } : isArray(sourceValue) ? [...sourceValue] : sourceValue;
380
- target[key] = toSet;
381
399
  }
400
+ _mergeIntoObservable(targetChild, sourceValue, levelsDeep + 1);
401
+ } else {
402
+ targetChild.set(sourceValue);
382
403
  }
383
404
  }
384
405
  }
385
406
  } else if (source !== void 0) {
386
- needsSet ? target.set(source) : target = assign2 ? isArray(source) ? [...source] : { ...source } : source;
407
+ target.set(source);
387
408
  }
388
409
  return target;
389
410
  }
@@ -420,12 +441,13 @@ function initializePathType(pathType) {
420
441
  switch (pathType) {
421
442
  case "array":
422
443
  return [];
423
- case "object":
424
- return {};
425
444
  case "map":
426
445
  return /* @__PURE__ */ new Map();
427
446
  case "set":
428
447
  return /* @__PURE__ */ new Set();
448
+ case "object":
449
+ default:
450
+ return {};
429
451
  }
430
452
  }
431
453
  function applyChange(value, change, applyPrevious) {
@@ -438,6 +460,33 @@ function applyChanges(value, changes, applyPrevious) {
438
460
  }
439
461
  return value;
440
462
  }
463
+ function deepMerge(target, ...sources) {
464
+ if (isPrimitive(target)) {
465
+ return sources[sources.length - 1];
466
+ }
467
+ let result = isArray(target) ? [...target] : { ...target };
468
+ for (let i = 0; i < sources.length; i++) {
469
+ const obj2 = sources[i];
470
+ if (isPlainObject(obj2) || isArray(obj2)) {
471
+ const objTarget = obj2;
472
+ for (const key in objTarget) {
473
+ if (hasOwnProperty.call(objTarget, key)) {
474
+ if (objTarget[key] instanceof Object && !isObservable(objTarget[key]) && Object.keys(objTarget[key]).length > 0) {
475
+ result[key] = deepMerge(
476
+ result[key] || (isArray(objTarget[key]) ? [] : {}),
477
+ objTarget[key]
478
+ );
479
+ } else {
480
+ result[key] = objTarget[key];
481
+ }
482
+ }
483
+ }
484
+ } else {
485
+ result = obj2;
486
+ }
487
+ }
488
+ return result;
489
+ }
441
490
 
442
491
  // src/batching.ts
443
492
  var timeout;
@@ -484,9 +533,9 @@ function notify(node, value, prev, level, whenOptimizedOnlyIf) {
484
533
  changesInBatch,
485
534
  node,
486
535
  /*loading*/
487
- globalState.isLoadingLocal,
536
+ !!globalState.isLoadingLocal,
488
537
  /*remote*/
489
- globalState.isLoadingRemote,
538
+ !!globalState.isLoadingRemote,
490
539
  value,
491
540
  [],
492
541
  [],
@@ -497,31 +546,35 @@ function notify(node, value, prev, level, whenOptimizedOnlyIf) {
497
546
  level,
498
547
  whenOptimizedOnlyIf
499
548
  );
500
- if (changesInBatch.size) {
501
- batchNotifyChanges(
502
- changesInBatch,
503
- /*immediate*/
504
- true
505
- );
506
- }
507
549
  const existing = _batchMap.get(node);
508
550
  if (existing) {
509
- existing.value = value;
551
+ if (existing.prev === value) {
552
+ _batchMap.delete(node);
553
+ } else {
554
+ existing.value = value;
555
+ }
510
556
  } else {
511
557
  _batchMap.set(node, {
512
558
  value,
513
559
  prev,
514
560
  level,
515
561
  whenOptimizedOnlyIf,
516
- remote: globalState.isLoadingRemote,
517
- loading: globalState.isLoadingLocal
562
+ isFromSync: !!globalState.isLoadingRemote,
563
+ isFromPersist: !!globalState.isLoadingLocal
518
564
  });
519
565
  }
566
+ if (changesInBatch.size) {
567
+ batchNotifyChanges(
568
+ changesInBatch,
569
+ /*immediate*/
570
+ true
571
+ );
572
+ }
520
573
  if (numInBatch <= 0) {
521
574
  runBatch();
522
575
  }
523
576
  }
524
- function computeChangesAtNode(changesInBatch, node, loading, remote, value, path, pathTypes, valueAtPath, prevAtPath, immediate, level, whenOptimizedOnlyIf) {
577
+ function computeChangesAtNode(changesInBatch, node, isFromPersist, isFromSync, value, path, pathTypes, valueAtPath, prevAtPath, immediate, level, whenOptimizedOnlyIf) {
525
578
  if (immediate ? node.listenersImmediate : node.listeners) {
526
579
  const change = {
527
580
  path,
@@ -534,13 +587,14 @@ function computeChangesAtNode(changesInBatch, node, loading, remote, value, path
534
587
  const { changes } = changeInBatch;
535
588
  if (!isArraySubset(changes[0].path, change.path)) {
536
589
  changes.push(change);
590
+ changeInBatch.level = Math.min(changeInBatch.level, level);
537
591
  }
538
592
  } else {
539
593
  changesInBatch.set(node, {
540
594
  level,
541
595
  value,
542
- remote,
543
- loading,
596
+ isFromSync,
597
+ isFromPersist,
544
598
  whenOptimizedOnlyIf,
545
599
  changes: [change]
546
600
  });
@@ -604,7 +658,7 @@ function computeChangesRecursive(changesInBatch, node, loading, remote, value, p
604
658
  }
605
659
  function batchNotifyChanges(changesInBatch, immediate) {
606
660
  const listenersNotified = /* @__PURE__ */ new Set();
607
- changesInBatch.forEach(({ changes, level, value, loading, remote, whenOptimizedOnlyIf }, node) => {
661
+ changesInBatch.forEach(({ changes, level, value, isFromPersist, isFromSync, whenOptimizedOnlyIf }, node) => {
608
662
  const listeners = immediate ? node.listenersImmediate : node.listeners;
609
663
  if (listeners) {
610
664
  let listenerParams;
@@ -618,8 +672,8 @@ function batchNotifyChanges(changesInBatch, immediate) {
618
672
  if (!noArgs && !listenerParams) {
619
673
  listenerParams = {
620
674
  value,
621
- loading,
622
- remote,
675
+ isFromPersist,
676
+ isFromSync,
623
677
  getPrevious: createPreviousHandler(value, changes),
624
678
  changes
625
679
  };
@@ -647,12 +701,12 @@ function runBatch() {
647
701
  const map = _batchMap;
648
702
  _batchMap = /* @__PURE__ */ new Map();
649
703
  const changesInBatch = /* @__PURE__ */ new Map();
650
- map.forEach(({ value, prev, level, loading, remote, whenOptimizedOnlyIf }, node) => {
704
+ map.forEach(({ value, prev, level, isFromPersist, isFromSync, whenOptimizedOnlyIf }, node) => {
651
705
  computeChangesRecursive(
652
706
  changesInBatch,
653
707
  node,
654
- loading,
655
- remote,
708
+ isFromPersist,
709
+ isFromSync,
656
710
  value,
657
711
  [],
658
712
  [],
@@ -711,21 +765,6 @@ function getNodeAtPath(obj, path) {
711
765
  return o;
712
766
  }
713
767
 
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
768
  // src/createObservable.ts
730
769
  function createObservable(value, makePrimitive, extractPromise2, createObject, createPrimitive) {
731
770
  if (isObservable(value)) {
@@ -755,6 +794,21 @@ function createObservable(value, makePrimitive, extractPromise2, createObject, c
755
794
  return obs;
756
795
  }
757
796
 
797
+ // src/linked.ts
798
+ function linked(params, options) {
799
+ if (isFunction(params)) {
800
+ params = { get: params };
801
+ }
802
+ if (options) {
803
+ params = { ...params, ...options };
804
+ }
805
+ const ret = function() {
806
+ return { [symbolLinked]: params };
807
+ };
808
+ ret.prototype[symbolLinked] = params;
809
+ return ret;
810
+ }
811
+
758
812
  // src/onChange.ts
759
813
  function onChange(node, callback, options = {}, fromLinks) {
760
814
  var _a;
@@ -779,8 +833,8 @@ function onChange(node, callback, options = {}, fromLinks) {
779
833
  const value = getNodeValue(node);
780
834
  callback({
781
835
  value,
782
- loading: true,
783
- remote: false,
836
+ isFromPersist: true,
837
+ isFromSync: false,
784
838
  changes: [
785
839
  {
786
840
  path: [],
@@ -836,14 +890,14 @@ function onChange(node, callback, options = {}, fromLinks) {
836
890
  };
837
891
  }
838
892
  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);
893
+ let prevAtPath = deconstructObjectWithPath(path, [], getNodeValue(linkedFromNode));
894
+ return function({ value: valueA, isFromPersist, isFromSync }) {
895
+ const valueAtPath = deconstructObjectWithPath(path, [], valueA);
842
896
  if (valueAtPath !== prevAtPath) {
843
897
  callback({
844
898
  value: valueAtPath,
845
- loading,
846
- remote,
899
+ isFromPersist,
900
+ isFromSync,
847
901
  changes: [
848
902
  {
849
903
  path: [],
@@ -858,16 +912,6 @@ function createCb(linkedFromNode, path, callback) {
858
912
  prevAtPath = valueAtPath;
859
913
  };
860
914
  }
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
915
 
872
916
  // src/setupTracking.ts
873
917
  function setupTracking(nodes, update, noArgs, immediate) {
@@ -963,12 +1007,17 @@ function observe(selectorOrRun, reactionOrOptions, options) {
963
1007
  options = reactionOrOptions;
964
1008
  }
965
1009
  let dispose;
1010
+ let isRunning = false;
966
1011
  const e = { num: 0 };
967
1012
  const update = function() {
1013
+ if (isRunning) {
1014
+ return;
1015
+ }
968
1016
  if (e.onCleanup) {
969
1017
  e.onCleanup();
970
1018
  e.onCleanup = void 0;
971
1019
  }
1020
+ isRunning = true;
972
1021
  beginBatch();
973
1022
  delete e.value;
974
1023
  dispose == null ? void 0 : dispose();
@@ -982,6 +1031,7 @@ function observe(selectorOrRun, reactionOrOptions, options) {
982
1031
  e.onCleanupReaction = void 0;
983
1032
  }
984
1033
  endBatch();
1034
+ isRunning = false;
985
1035
  if (reaction && ((options == null ? void 0 : options.fromComputed) || (e.num > 0 || !isEvent(selectorOrRun)) && (e.previous !== e.value || typeof e.value === "object"))) {
986
1036
  reaction(e);
987
1037
  }
@@ -1004,16 +1054,30 @@ function _when(predicate, effect, checkReady) {
1004
1054
  if (isPromise(predicate)) {
1005
1055
  return effect ? predicate.then(effect) : predicate;
1006
1056
  }
1057
+ const isPredicateArray = isArray(predicate);
1007
1058
  let value;
1008
1059
  let effectValue;
1009
1060
  function run(e) {
1010
- const ret = computeSelector(predicate);
1061
+ const ret = isPredicateArray ? predicate.map((p) => computeSelector(p)) : computeSelector(predicate);
1011
1062
  if (isPromise(ret)) {
1012
1063
  value = ret;
1013
1064
  return void 0;
1014
- } else if (!isPromise(ret) && (checkReady ? isObservableValueReady(ret) : ret)) {
1015
- value = ret;
1016
- e.cancel = true;
1065
+ } else {
1066
+ let isOk = true;
1067
+ if (isArray(ret)) {
1068
+ for (let i = 0; i < ret.length; i++) {
1069
+ if (isObservable(ret[i])) {
1070
+ ret[i] = computeSelector(ret[i]);
1071
+ }
1072
+ isOk = isOk && !!(checkReady ? isObservableValueReady(ret[i]) : ret[i]);
1073
+ }
1074
+ } else {
1075
+ isOk = checkReady ? isObservableValueReady(ret) : ret;
1076
+ }
1077
+ if (isOk) {
1078
+ value = ret;
1079
+ e.cancel = true;
1080
+ }
1017
1081
  }
1018
1082
  return value;
1019
1083
  }
@@ -1065,6 +1129,7 @@ var ArrayLoopers = /* @__PURE__ */ new Set([
1065
1129
  "filter",
1066
1130
  "find",
1067
1131
  "findIndex",
1132
+ "flatMap",
1068
1133
  "forEach",
1069
1134
  "join",
1070
1135
  "map",
@@ -1094,7 +1159,7 @@ function collectionSetter(node, target, prop, ...args) {
1094
1159
  const prevValue = target.slice();
1095
1160
  const ret = target[prop].apply(target, args);
1096
1161
  if (node) {
1097
- const hasParent = isChildNodeValue(node);
1162
+ const hasParent = isChildNode(node);
1098
1163
  const key = hasParent ? node.key : "_";
1099
1164
  const parentValue = hasParent ? getNodeValue(node.parent) : node.root;
1100
1165
  parentValue[key] = prevValue;
@@ -1118,7 +1183,7 @@ function updateNodes(parent, obj, prevValue) {
1118
1183
  }
1119
1184
  __devUpdateNodes.add(obj);
1120
1185
  }
1121
- if (isObject(obj) && obj[symbolOpaque] || isObject(prevValue) && prevValue[symbolOpaque]) {
1186
+ if (isObject(obj) && isHintOpaque(obj) || isObject(prevValue) && isHintOpaque(prevValue)) {
1122
1187
  const isDiff = obj !== prevValue;
1123
1188
  if (isDiff) {
1124
1189
  if (parent.listeners || parent.listenersImmediate) {
@@ -1306,10 +1371,10 @@ var proxyHandler = {
1306
1371
  if (p === symbolGetNode) {
1307
1372
  return node;
1308
1373
  }
1309
- if (p === "apply") {
1374
+ if (p === "apply" || p === "call") {
1310
1375
  const nodeValue = getNodeValue(node);
1311
1376
  if (isFunction(nodeValue)) {
1312
- return nodeValue.apply;
1377
+ return nodeValue[p];
1313
1378
  }
1314
1379
  }
1315
1380
  let value = peekInternal(
@@ -1317,11 +1382,14 @@ var proxyHandler = {
1317
1382
  /*activateRecursive*/
1318
1383
  p === "get" || p === "peek"
1319
1384
  );
1385
+ if (p === symbolIterator) {
1386
+ return !value || isPrimitive(value) ? void 0 : value[p];
1387
+ }
1320
1388
  const targetNode = node.linkedToNode || (value == null ? void 0 : value[symbolGetNode]);
1321
1389
  if (targetNode && p !== "onChange") {
1322
1390
  return proxyHandler.get(targetNode, p, receiver);
1323
1391
  }
1324
- if (isMap(value) || value instanceof WeakMap || value instanceof Set || value instanceof WeakSet) {
1392
+ if (isMap(value) || isSet(value)) {
1325
1393
  const ret = handlerMapSet(node, p, value);
1326
1394
  if (ret !== void 0) {
1327
1395
  return ret;
@@ -1351,7 +1419,7 @@ var proxyHandler = {
1351
1419
  return property.get(node);
1352
1420
  }
1353
1421
  let vProp = value == null ? void 0 : value[p];
1354
- if (isObject(value) && value[symbolOpaque]) {
1422
+ if (isObject(value) && isHintOpaque(value)) {
1355
1423
  return vProp;
1356
1424
  }
1357
1425
  const fnOrComputed = (_a = node.functions) == null ? void 0 : _a.get(p);
@@ -1413,7 +1481,7 @@ var proxyHandler = {
1413
1481
  return vProp.bind(value);
1414
1482
  }
1415
1483
  if (isPrimitive(vProp)) {
1416
- if (isArray(value) && p === "length") {
1484
+ if (p === "length" && isArray(value)) {
1417
1485
  updateTracking(node, true);
1418
1486
  return vProp;
1419
1487
  }
@@ -1517,11 +1585,17 @@ function setKey(node, key, newValue, level) {
1517
1585
  } else {
1518
1586
  const { newValue: savedValue, prevValue } = setNodeValue(childNode, newValue);
1519
1587
  const isPrim = isPrimitive(savedValue) || savedValue instanceof Date;
1520
- if (!equals(savedValue, prevValue)) {
1521
- updateNodesAndNotify(node, savedValue, prevValue, childNode, isPrim, isRoot, level);
1522
- }
1523
1588
  if (!isPrim) {
1524
- childNode.needsExtract = true;
1589
+ let parent = childNode;
1590
+ do {
1591
+ parent.needsExtract = true;
1592
+ parent.recursivelyAutoActivated = false;
1593
+ } while (parent = parent.parent);
1594
+ }
1595
+ const notify2 = !equals(savedValue, prevValue);
1596
+ const forceNotify = !notify2 && childNode.isComputing && !isPrim;
1597
+ if (notify2 || forceNotify) {
1598
+ updateNodesAndNotify(node, savedValue, prevValue, childNode, isPrim, isRoot, level, forceNotify);
1525
1599
  }
1526
1600
  extractFunctionOrComputed(node, key, savedValue);
1527
1601
  }
@@ -1536,6 +1610,8 @@ function assign(node, value) {
1536
1610
  const currentValue = getNodeValue(node);
1537
1611
  if (isMap(currentValue)) {
1538
1612
  value.forEach((value2, key) => currentValue.set(key, value2));
1613
+ } else {
1614
+ set(node, value);
1539
1615
  }
1540
1616
  } else {
1541
1617
  node.isAssigning = (node.isAssigning || 0) + 1;
@@ -1549,7 +1625,7 @@ function assign(node, value) {
1549
1625
  return proxy2;
1550
1626
  }
1551
1627
  function deleteFn(node, key) {
1552
- if (key === void 0 && isChildNodeValue(node)) {
1628
+ if (key === void 0 && isChildNode(node)) {
1553
1629
  key = node.key;
1554
1630
  node = node.parent;
1555
1631
  }
@@ -1569,7 +1645,8 @@ function deleteFn(node, key) {
1569
1645
  function handlerMapSet(node, p, value) {
1570
1646
  const vProp = value == null ? void 0 : value[p];
1571
1647
  if (p === "size") {
1572
- return getProxy(node, p);
1648
+ updateTracking(node, true);
1649
+ return value[p];
1573
1650
  } else if (isFunction(vProp)) {
1574
1651
  return function(a, b, c) {
1575
1652
  const l = arguments.length;
@@ -1580,23 +1657,16 @@ function handlerMapSet(node, p, value) {
1580
1657
  }
1581
1658
  } else if (p === "set") {
1582
1659
  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;
1660
+ set(getChildNode(node, a), b);
1589
1661
  } else if (l === 1 && isMap(value)) {
1590
1662
  set(node, a);
1591
1663
  }
1664
+ return getProxy(node);
1592
1665
  } else if (p === "delete") {
1593
1666
  if (l > 0) {
1594
1667
  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;
1668
+ deleteFn(node, a);
1669
+ return prev !== void 0;
1600
1670
  }
1601
1671
  } else if (p === "clear") {
1602
1672
  const prev = new Map(valueMap);
@@ -1612,7 +1682,7 @@ function handlerMapSet(node, p, value) {
1612
1682
  if (!value.has(p)) {
1613
1683
  notify(node, ret, prev, 0);
1614
1684
  }
1615
- return ret;
1685
+ return getProxy(node);
1616
1686
  }
1617
1687
  const fn = observableFns.get(p);
1618
1688
  if (fn) {
@@ -1632,20 +1702,20 @@ function handlerMapSet(node, p, value) {
1632
1702
  };
1633
1703
  }
1634
1704
  }
1635
- function updateNodesAndNotify(node, newValue, prevValue, childNode, isPrim, isRoot, level) {
1705
+ function updateNodesAndNotify(node, newValue, prevValue, childNode, isPrim, isRoot, level, forceNotify) {
1636
1706
  if (!childNode)
1637
1707
  childNode = node;
1638
1708
  beginBatch();
1639
1709
  if (isPrim === void 0) {
1640
1710
  isPrim = isPrimitive(newValue);
1641
1711
  }
1642
- let hasADiff = isPrim;
1712
+ let hasADiff = forceNotify || isPrim;
1643
1713
  let whenOptimizedOnlyIf = false;
1644
1714
  if (!isPrim || prevValue && !isPrimitive(prevValue)) {
1645
1715
  if ((process.env.NODE_ENV === "development" || process.env.NODE_ENV === "test") && typeof __devUpdateNodes !== "undefined") {
1646
1716
  __devUpdateNodes.clear();
1647
1717
  }
1648
- hasADiff = updateNodes(childNode, newValue, prevValue);
1718
+ hasADiff = hasADiff || updateNodes(childNode, newValue, prevValue);
1649
1719
  if (isArray(newValue)) {
1650
1720
  whenOptimizedOnlyIf = (newValue == null ? void 0 : newValue.length) !== (prevValue == null ? void 0 : prevValue.length);
1651
1721
  }
@@ -1662,6 +1732,7 @@ function updateNodesAndNotify(node, newValue, prevValue, childNode, isPrim, isRo
1662
1732
  endBatch();
1663
1733
  }
1664
1734
  function extractPromise(node, value, setter) {
1735
+ const numGets = node.numGets = (node.numGets || 0) + 1;
1665
1736
  if (!node.state) {
1666
1737
  node.state = createObservable(
1667
1738
  {
@@ -1673,11 +1744,14 @@ function extractPromise(node, value, setter) {
1673
1744
  );
1674
1745
  }
1675
1746
  value.then((value2) => {
1676
- setter ? setter({ value: value2 }) : set(node, value2);
1677
- node.state.assign({
1678
- isLoaded: true,
1679
- error: void 0
1680
- });
1747
+ if (numGets >= (node.getNumResolved || 0)) {
1748
+ node.getNumResolved = node.numGets;
1749
+ setter ? setter({ value: value2 }) : set(node, value2);
1750
+ node.state.assign({
1751
+ isLoaded: true,
1752
+ error: void 0
1753
+ });
1754
+ }
1681
1755
  }).catch((error) => {
1682
1756
  node.state.error.set(error);
1683
1757
  });
@@ -1694,6 +1768,7 @@ function extractFunctionOrComputed(node, k, v) {
1694
1768
  const childNode = getChildNode(node, k, fn);
1695
1769
  const targetNode = getNode(v);
1696
1770
  const initialValue = peek(targetNode);
1771
+ setToObservable(childNode, v);
1697
1772
  setNodeValue(childNode, initialValue);
1698
1773
  return getNodeValue(childNode);
1699
1774
  } else if (typeof v === "function") {
@@ -1726,7 +1801,9 @@ function peekInternal(node, activateRecursive) {
1726
1801
  }
1727
1802
  isFlushing = false;
1728
1803
  let value = getNodeValue(node);
1729
- value = checkLazy(node, value, !!activateRecursive);
1804
+ if (!globalState.isLoadingLocal) {
1805
+ value = checkLazy(node, value, !!activateRecursive);
1806
+ }
1730
1807
  return value;
1731
1808
  }
1732
1809
  function checkLazy(node, value, activateRecursive) {
@@ -1741,10 +1818,12 @@ function checkLazy(node, value, activateRecursive) {
1741
1818
  } else {
1742
1819
  if (node.parent) {
1743
1820
  const parentValue = getNodeValue(node.parent);
1744
- if (parentValue) {
1745
- delete parentValue[node.key];
1746
- } else {
1747
- node.root._ = void 0;
1821
+ if (isFunction(value)) {
1822
+ if (parentValue) {
1823
+ delete parentValue[node.key];
1824
+ } else {
1825
+ node.root._ = void 0;
1826
+ }
1748
1827
  }
1749
1828
  }
1750
1829
  value = activateNodeFunction(node, lazyFn);
@@ -1833,7 +1912,9 @@ function activateNodeFunction(node, lazyFn) {
1833
1912
  var _a, _b, _c, _d;
1834
1913
  if (isFirst) {
1835
1914
  isFirst = false;
1836
- setNodeValue(node, void 0);
1915
+ if (isFunction(getNodeValue(node))) {
1916
+ setNodeValue(node, void 0);
1917
+ }
1837
1918
  } else if (!isFlushing && refreshFn) {
1838
1919
  if (shouldIgnoreUnobserved(node, refreshFn)) {
1839
1920
  ignoreThisUpdate = true;
@@ -1842,14 +1923,15 @@ function activateNodeFunction(node, lazyFn) {
1842
1923
  }
1843
1924
  let value = activateFn();
1844
1925
  let didSetToObs = false;
1845
- if (isObservable(value)) {
1846
- didSetToObs = true;
1926
+ const isObs = isObservable(value);
1927
+ if (isObs || node.linkedToNode) {
1928
+ didSetToObs = isObs;
1847
1929
  value = setToObservable(node, value);
1848
1930
  }
1849
- if (isFunction(value)) {
1931
+ if (isFunction(value) && value.length === 0) {
1850
1932
  value = value();
1851
1933
  }
1852
- const activated = !isObservable(value) ? value == null ? void 0 : value[symbolLinked] : void 0;
1934
+ const activated = !isObs ? value == null ? void 0 : value[symbolLinked] : void 0;
1853
1935
  if (activated) {
1854
1936
  node.activationState = activated;
1855
1937
  value = void 0;
@@ -1904,16 +1986,14 @@ function activateNodeFunction(node, lazyFn) {
1904
1986
  }
1905
1987
  } else {
1906
1988
  activatedValue = value;
1907
- if (node.state.isLoaded.peek()) {
1989
+ const isLoaded = node.state.isLoaded.peek();
1990
+ if (isLoaded || !isFunction(value)) {
1908
1991
  node.isComputing = true;
1909
1992
  set(node, value);
1910
1993
  node.isComputing = false;
1911
- } else {
1912
- setNodeValue(node, value);
1913
- node.state.assign({
1914
- isLoaded: true,
1915
- error: void 0
1916
- });
1994
+ }
1995
+ if (!isLoaded) {
1996
+ node.state.assign({ isLoaded: true, error: void 0 });
1917
1997
  }
1918
1998
  }
1919
1999
  }
@@ -1954,14 +2034,14 @@ function activateNodeBase(node, value) {
1954
2034
  if (allChanges.length > 0) {
1955
2035
  let changes;
1956
2036
  let value2;
1957
- let loading = false;
1958
- let remote = false;
2037
+ let isFromPersist = false;
2038
+ let isFromSync = false;
1959
2039
  let getPrevious;
1960
2040
  if (listenerParams) {
1961
2041
  changes = listenerParams.changes;
1962
2042
  value2 = listenerParams.value;
1963
- loading = listenerParams.loading;
1964
- remote = listenerParams.remote;
2043
+ isFromPersist = listenerParams.isFromPersist;
2044
+ isFromSync = listenerParams.isFromSync;
1965
2045
  getPrevious = listenerParams.getPrevious;
1966
2046
  } else {
1967
2047
  changes = allChanges;
@@ -1981,8 +2061,8 @@ function activateNodeBase(node, value) {
1981
2061
  setFn({
1982
2062
  value: value2,
1983
2063
  changes,
1984
- loading,
1985
- remote,
2064
+ isFromPersist,
2065
+ isFromSync,
1986
2066
  getPrevious
1987
2067
  });
1988
2068
  node.isComputing = false;
@@ -2017,32 +2097,37 @@ function activateNodeBase(node, value) {
2017
2097
  }
2018
2098
  function setToObservable(node, value) {
2019
2099
  var _a;
2020
- const linkedNode = getNode(value);
2100
+ const linkedNode = value ? getNode(value) : void 0;
2021
2101
  if (linkedNode !== node && (linkedNode == null ? void 0 : linkedNode.linkedToNode) !== node) {
2022
2102
  node.linkedToNode = linkedNode;
2023
- linkedNode.linkedFromNodes || (linkedNode.linkedFromNodes = /* @__PURE__ */ new Set());
2024
- linkedNode.linkedFromNodes.add(node);
2025
2103
  (_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
- );
2104
+ if (linkedNode) {
2105
+ linkedNode.linkedFromNodes || (linkedNode.linkedFromNodes = /* @__PURE__ */ new Set());
2106
+ linkedNode.linkedFromNodes.add(node);
2107
+ node.linkedToNodeDispose = onChange(
2108
+ linkedNode,
2109
+ () => {
2110
+ value = peekInternal(linkedNode);
2111
+ if (!isFunction(value)) {
2112
+ set(node, value);
2113
+ }
2114
+ },
2115
+ { initial: true },
2116
+ /* @__PURE__ */ new Set([node])
2117
+ );
2118
+ }
2035
2119
  }
2036
2120
  return value;
2037
2121
  }
2038
2122
  function recursivelyAutoActivate(obj, node) {
2039
- if ((isObject(obj) || isArray(obj)) && !obj[symbolOpaque]) {
2123
+ if (!node.recursivelyAutoActivated && (isObject(obj) || isArray(obj)) && !isHintOpaque(obj)) {
2124
+ node.recursivelyAutoActivated = true;
2040
2125
  const pathStack = [];
2041
2126
  const getNodeAtPath2 = () => {
2042
2127
  var _a;
2043
2128
  let childNode = node;
2044
2129
  for (let i = 0; i < pathStack.length; i++) {
2045
- const { key } = pathStack[i];
2130
+ const key = pathStack[i];
2046
2131
  const value = (_a = getNodeValue(childNode)) == null ? void 0 : _a[key];
2047
2132
  childNode = getChildNode(childNode, key, isFunction(value) ? value : void 0);
2048
2133
  peekInternal(childNode);
@@ -2054,7 +2139,7 @@ function recursivelyAutoActivate(obj, node) {
2054
2139
  }
2055
2140
  function recursivelyAutoActivateInner(obj, pathStack, getNodeAtPath2) {
2056
2141
  var _a;
2057
- if ((isObject(obj) || isArray(obj)) && !obj[symbolOpaque]) {
2142
+ if ((isObject(obj) || isArray(obj)) && !isHintOpaque(obj) && !isHintPlain(obj)) {
2058
2143
  for (const key in obj) {
2059
2144
  if (hasOwnProperty.call(obj, key)) {
2060
2145
  const value = obj[key];
@@ -2073,7 +2158,7 @@ function recursivelyAutoActivateInner(obj, pathStack, getNodeAtPath2) {
2073
2158
  }
2074
2159
  }
2075
2160
  if (typeof value === "object") {
2076
- pathStack.push({ key, value });
2161
+ pathStack.push(key);
2077
2162
  recursivelyAutoActivateInner(value, pathStack, getNodeAtPath2);
2078
2163
  pathStack.pop();
2079
2164
  }
@@ -2132,16 +2217,6 @@ function observable(value) {
2132
2217
  function observablePrimitive(value) {
2133
2218
  return createObservable(value, true, extractPromise, getProxy, ObservablePrimitiveClass);
2134
2219
  }
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
2220
 
2146
2221
  // src/computed.ts
2147
2222
  function computed(get2, set2) {
@@ -2150,45 +2225,6 @@ function computed(get2, set2) {
2150
2225
  );
2151
2226
  }
2152
2227
 
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
2228
  // src/event.ts
2193
2229
  function event() {
2194
2230
  const obs = observable(0);
@@ -2219,66 +2255,38 @@ function proxy(get2, set2) {
2219
2255
  );
2220
2256
  }
2221
2257
 
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();
2273
- });
2258
+ // src/syncState.ts
2259
+ function syncState(obs) {
2260
+ const node = getNode(obs);
2261
+ if (!node.state) {
2262
+ node.state = observable(
2263
+ ObservableHint.plain({
2264
+ isPersistLoaded: false,
2265
+ isLoaded: false,
2266
+ isPersistEnabled: true,
2267
+ isSyncEnabled: true,
2268
+ isGetting: false,
2269
+ isSetting: false,
2270
+ numPendingGets: 0,
2271
+ numPendingSets: 0,
2272
+ syncCount: 0,
2273
+ resetPersistence: void 0,
2274
+ reset: () => Promise.resolve(),
2275
+ sync: () => Promise.resolve(),
2276
+ getPendingChanges: () => ({}),
2277
+ // TODOV3 remove
2278
+ clearPersist: void 0
2279
+ })
2280
+ );
2274
2281
  }
2275
- return value;
2282
+ return node.state;
2276
2283
  }
2277
2284
 
2278
2285
  // index.ts
2279
2286
  var internal = {
2280
2287
  createPreviousHandler,
2281
2288
  clone,
2289
+ deepMerge,
2282
2290
  ensureNodeValue,
2283
2291
  findIDKey,
2284
2292
  get,
@@ -2289,10 +2297,11 @@ var internal = {
2289
2297
  getValueAtPath,
2290
2298
  globalState,
2291
2299
  initializePathType,
2300
+ ObservablePrimitiveClass,
2301
+ observableProperties,
2292
2302
  observableFns,
2293
2303
  optimized,
2294
2304
  peek,
2295
- runWithRetry,
2296
2305
  safeParse,
2297
2306
  safeStringify,
2298
2307
  set,
@@ -2303,4 +2312,4 @@ var internal = {
2303
2312
  tracking
2304
2313
  };
2305
2314
 
2306
- 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 };
2315
+ export { ObservableHint, 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, isPlainObject, isPrimitive, isPromise, isSet, isString, isSymbol, linked, mergeIntoObservable, observable, observablePrimitive, observe, opaqueObject2 as opaqueObject, optimized, proxy, setAtPath, setSilently, setupTracking, shouldIgnoreUnobserved, symbolDelete, syncState, trackSelector, tracking, updateTracking, when, whenReady };