@legendapp/state 3.0.0-beta.4 → 3.0.0-beta.41

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 (79) hide show
  1. package/.DS_Store +0 -0
  2. package/README.md +2 -2
  3. package/config/enableReactComponents.js +3 -1
  4. package/config/enableReactComponents.mjs +3 -1
  5. package/config/enableReactTracking.d.mts +2 -1
  6. package/config/enableReactTracking.d.ts +2 -1
  7. package/config/enableReactTracking.js +32 -13
  8. package/config/enableReactTracking.mjs +32 -13
  9. package/index.d.mts +46 -8
  10. package/index.d.ts +46 -8
  11. package/index.js +267 -75
  12. package/index.mjs +267 -75
  13. package/package.json +35 -1
  14. package/persist-plugins/async-storage.js +17 -9
  15. package/persist-plugins/async-storage.mjs +17 -9
  16. package/persist-plugins/expo-sqlite.d.mts +19 -0
  17. package/persist-plugins/expo-sqlite.d.ts +19 -0
  18. package/persist-plugins/expo-sqlite.js +72 -0
  19. package/persist-plugins/expo-sqlite.mjs +69 -0
  20. package/persist-plugins/indexeddb.js +13 -3
  21. package/persist-plugins/indexeddb.mjs +13 -3
  22. package/react-native.d.mts +4 -0
  23. package/react-native.d.ts +4 -0
  24. package/react-native.js +53 -0
  25. package/react-native.mjs +40 -0
  26. package/react-reactive/Components.d.mts +19 -0
  27. package/react-reactive/Components.d.ts +19 -0
  28. package/react-reactive/Components.js +53 -0
  29. package/react-reactive/Components.mjs +40 -0
  30. package/react-reactive/enableReactComponents.d.mts +3 -2
  31. package/react-reactive/enableReactComponents.d.ts +3 -2
  32. package/react-reactive/enableReactComponents.js +10 -3
  33. package/react-reactive/enableReactComponents.mjs +10 -3
  34. package/react-reactive/enableReactNativeComponents.d.mts +3 -20
  35. package/react-reactive/enableReactNativeComponents.d.ts +3 -20
  36. package/react-reactive/enableReactNativeComponents.js +8 -3
  37. package/react-reactive/enableReactNativeComponents.mjs +8 -3
  38. package/react-reactive/enableReactive.js +10 -3
  39. package/react-reactive/enableReactive.mjs +10 -3
  40. package/react-reactive/enableReactive.native.js +8 -3
  41. package/react-reactive/enableReactive.native.mjs +8 -3
  42. package/react-reactive/enableReactive.web.js +8 -3
  43. package/react-reactive/enableReactive.web.mjs +8 -3
  44. package/react-web.d.mts +7 -0
  45. package/react-web.d.ts +7 -0
  46. package/react-web.js +39 -0
  47. package/react-web.mjs +37 -0
  48. package/react.d.mts +59 -26
  49. package/react.d.ts +59 -26
  50. package/react.js +136 -87
  51. package/react.mjs +135 -89
  52. package/sync-plugins/crud.d.mts +24 -9
  53. package/sync-plugins/crud.d.ts +24 -9
  54. package/sync-plugins/crud.js +267 -123
  55. package/sync-plugins/crud.mjs +268 -124
  56. package/sync-plugins/firebase.d.mts +7 -3
  57. package/sync-plugins/firebase.d.ts +7 -3
  58. package/sync-plugins/firebase.js +214 -64
  59. package/sync-plugins/firebase.mjs +215 -65
  60. package/sync-plugins/keel.d.mts +12 -13
  61. package/sync-plugins/keel.d.ts +12 -13
  62. package/sync-plugins/keel.js +60 -52
  63. package/sync-plugins/keel.mjs +61 -48
  64. package/sync-plugins/supabase.d.mts +10 -5
  65. package/sync-plugins/supabase.d.ts +10 -5
  66. package/sync-plugins/supabase.js +90 -33
  67. package/sync-plugins/supabase.mjs +91 -34
  68. package/sync-plugins/tanstack-query.d.mts +3 -3
  69. package/sync-plugins/tanstack-query.d.ts +3 -3
  70. package/sync-plugins/tanstack-query.js +1 -1
  71. package/sync-plugins/tanstack-query.mjs +1 -1
  72. package/sync.d.mts +17 -8
  73. package/sync.d.ts +17 -8
  74. package/sync.js +448 -307
  75. package/sync.mjs +446 -307
  76. package/trace.js +5 -6
  77. package/trace.mjs +5 -6
  78. package/types/reactive-native.d.ts +19 -0
  79. package/types/reactive-web.d.ts +7 -0
package/index.js CHANGED
@@ -146,6 +146,16 @@ function isEvent(value$) {
146
146
  var _a;
147
147
  return value$ && ((_a = value$[symbolGetNode]) == null ? void 0 : _a.isEvent);
148
148
  }
149
+ function setNewValue(parentValue, key, newValue, useSetFn, useMapFn) {
150
+ if (useSetFn) {
151
+ parentValue.add(newValue);
152
+ } else if (useMapFn) {
153
+ parentValue.set(key, newValue);
154
+ } else {
155
+ parentValue[key] = newValue;
156
+ }
157
+ return newValue;
158
+ }
149
159
  function setNodeValue(node, newValue) {
150
160
  var _a;
151
161
  const parentNode = (_a = node.parent) != null ? _a : node;
@@ -169,19 +179,13 @@ function setNodeValue(node, newValue) {
169
179
  delete parentValue[key];
170
180
  }
171
181
  } else {
172
- if (useSetFn) {
173
- parentValue.add(newValue);
174
- } else if (useMapFn) {
175
- parentValue.set(key, newValue);
176
- } else {
177
- parentValue[key] = newValue;
178
- }
182
+ setNewValue(parentValue, key, newValue, useSetFn, useMapFn);
179
183
  }
180
184
  } finally {
181
185
  parentNode.isSetting--;
182
186
  }
183
187
  }
184
- return { prevValue, newValue };
188
+ return { prevValue, newValue, parentValue };
185
189
  }
186
190
  var arrNodeKeys = [];
187
191
  function getNodeValue(node) {
@@ -194,7 +198,7 @@ function getNodeValue(node) {
194
198
  let child = node.root._;
195
199
  for (let i = count - 1; child && i >= 0; i--) {
196
200
  const key = arrNodeKeys[i];
197
- child = key !== "size" && (isMap(child) || child instanceof WeakMap) ? child.get(key) : child[key];
201
+ child = key !== "size" && isMap(child) ? child.get(key) : child[key];
198
202
  }
199
203
  return child;
200
204
  }
@@ -229,7 +233,9 @@ function ensureNodeValue(node) {
229
233
  if (!value || isFunction(value)) {
230
234
  if (isChildNode(node)) {
231
235
  const parent = ensureNodeValue(node.parent);
232
- value = parent[node.key] = {};
236
+ const useSetFn = isSet(parent);
237
+ const useMapFn = isMap(parent);
238
+ value = setNewValue(parent, node.key, {}, useSetFn, useMapFn);
233
239
  } else {
234
240
  value = node.root._ = {};
235
241
  }
@@ -257,6 +263,9 @@ function extractFunction(node, key, fnOrComputed) {
257
263
  function equals(a, b) {
258
264
  return a === b || isDate(a) && isDate(b) && +a === +b;
259
265
  }
266
+ function getKeys(obj, isArr, isMap2, isSet2) {
267
+ return isArr ? void 0 : obj ? isSet2 ? Array.from(obj) : isMap2 ? Array.from(obj.keys()) : Object.keys(obj) : [];
268
+ }
260
269
 
261
270
  // src/ObservableHint.ts
262
271
  function addSymbol(value, symbol) {
@@ -276,16 +285,27 @@ var ObservableHint = {
276
285
  },
277
286
  plain: function plainObject(value) {
278
287
  return addSymbol(value, symbolPlain);
288
+ },
289
+ function: function plainObject2(value) {
290
+ return addSymbol(value, symbolPlain);
279
291
  }
280
292
  };
281
293
 
294
+ // src/checkPlain.ts
295
+ function checkPlain(node, value) {
296
+ var _a;
297
+ if (!node.isPlain && (((_a = node.parent) == null ? void 0 : _a.isPlain) || isHintPlain(value))) {
298
+ node.isPlain = true;
299
+ }
300
+ }
301
+
282
302
  // src/helpers.ts
283
- function computeSelector(selector, e, retainObservable) {
303
+ function computeSelector(selector, getOptions, e, retainObservable) {
284
304
  let c = selector;
285
305
  if (!isObservable(c) && isFunction(c)) {
286
306
  c = e ? c(e) : c();
287
307
  }
288
- return isObservable(c) && !retainObservable ? c.get() : c;
308
+ return isObservable(c) && !retainObservable ? c.get(getOptions) : c;
289
309
  }
290
310
  function getObservableIndex(value$) {
291
311
  const node = getNode(value$);
@@ -384,7 +404,7 @@ function _mergeIntoObservable(target, source, levelsDeep) {
384
404
  const isSourceSet = isSet(source);
385
405
  if (isSourceSet && isSet(targetValue)) {
386
406
  target.set(/* @__PURE__ */ new Set([...source, ...targetValue]));
387
- } else if (isTargetObj && isObject(source) && !isEmpty(targetValue) || isTargetArr && targetValue.length > 0) {
407
+ } else if (isTargetObj && isObject(source) || isTargetArr && targetValue.length > 0) {
388
408
  const keys = isSourceMap || isSourceSet ? Array.from(source.keys()) : Object.keys(source);
389
409
  for (let i = 0; i < keys.length; i++) {
390
410
  const key = keys[i];
@@ -590,6 +610,7 @@ function computeChangesAtNode(changesInBatch, node, isFromPersist, isFromSync, v
590
610
  if (!isArraySubset(changes[0].path, change.path)) {
591
611
  changes.push(change);
592
612
  changeInBatch.level = Math.min(changeInBatch.level, level);
613
+ changeInBatch.whenOptimizedOnlyIf || (changeInBatch.whenOptimizedOnlyIf = whenOptimizedOnlyIf);
593
614
  }
594
615
  } else {
595
616
  changesInBatch.set(node, {
@@ -604,37 +625,39 @@ function computeChangesAtNode(changesInBatch, node, isFromPersist, isFromSync, v
604
625
  }
605
626
  }
606
627
  function computeChangesRecursive(changesInBatch, node, loading, remote, value, path, pathTypes, valueAtPath, prevAtPath, immediate, level, whenOptimizedOnlyIf) {
607
- computeChangesAtNode(
608
- changesInBatch,
609
- node,
610
- loading,
611
- remote,
612
- value,
613
- path,
614
- pathTypes,
615
- valueAtPath,
616
- prevAtPath,
617
- immediate,
618
- level,
619
- whenOptimizedOnlyIf
620
- );
621
- if (node.linkedFromNodes) {
622
- for (const linkedFromNode of node.linkedFromNodes) {
623
- const childNode = getNodeAtPath(linkedFromNode, path);
624
- computeChangesRecursive(
625
- changesInBatch,
626
- childNode,
627
- loading,
628
- remote,
629
- valueAtPath,
630
- [],
631
- [],
632
- valueAtPath,
633
- prevAtPath,
634
- immediate,
635
- 0,
636
- whenOptimizedOnlyIf
637
- );
628
+ if (node.numListenersRecursive > 0) {
629
+ computeChangesAtNode(
630
+ changesInBatch,
631
+ node,
632
+ loading,
633
+ remote,
634
+ value,
635
+ path,
636
+ pathTypes,
637
+ valueAtPath,
638
+ prevAtPath,
639
+ immediate,
640
+ level,
641
+ whenOptimizedOnlyIf
642
+ );
643
+ if (node.linkedFromNodes) {
644
+ for (const linkedFromNode of node.linkedFromNodes) {
645
+ const childNode = getNodeAtPath(linkedFromNode, path);
646
+ computeChangesRecursive(
647
+ changesInBatch,
648
+ childNode,
649
+ loading,
650
+ remote,
651
+ valueAtPath,
652
+ [],
653
+ [],
654
+ valueAtPath,
655
+ prevAtPath,
656
+ immediate,
657
+ 0,
658
+ whenOptimizedOnlyIf
659
+ );
660
+ }
638
661
  }
639
662
  }
640
663
  if (node.parent) {
@@ -811,6 +834,109 @@ function linked(params, options) {
811
834
  return ret;
812
835
  }
813
836
 
837
+ // src/middleware.ts
838
+ var nodeMiddlewareHandlers = /* @__PURE__ */ new WeakMap();
839
+ var queuedNodes = [];
840
+ var queuedListeners = [];
841
+ var queuedTypes = [];
842
+ var queueSize = 0;
843
+ var isMicrotaskScheduled = false;
844
+ function registerMiddleware(node, type, handler) {
845
+ let handlersMap = nodeMiddlewareHandlers.get(node);
846
+ if (!handlersMap) {
847
+ handlersMap = /* @__PURE__ */ new Map();
848
+ nodeMiddlewareHandlers.set(node, handlersMap);
849
+ }
850
+ let handlers = handlersMap.get(type);
851
+ if (!handlers) {
852
+ handlers = /* @__PURE__ */ new Set();
853
+ handlersMap.set(type, handlers);
854
+ }
855
+ handlers.add(handler);
856
+ return () => {
857
+ const handlersMap2 = nodeMiddlewareHandlers.get(node);
858
+ if (!handlersMap2)
859
+ return;
860
+ const handlers2 = handlersMap2.get(type);
861
+ if (!handlers2)
862
+ return;
863
+ handlers2.delete(handler);
864
+ if (handlers2.size === 0) {
865
+ handlersMap2.delete(type);
866
+ if (handlersMap2.size === 0) {
867
+ nodeMiddlewareHandlers.delete(node);
868
+ }
869
+ }
870
+ };
871
+ }
872
+ function dispatchMiddlewareEvent(node, listener, type) {
873
+ const handlersMap = nodeMiddlewareHandlers.get(node);
874
+ if (!handlersMap || !handlersMap.has(type)) {
875
+ return;
876
+ }
877
+ const handlers = handlersMap.get(type);
878
+ if (!handlers || handlers.size === 0) {
879
+ return;
880
+ }
881
+ queuedNodes[queueSize] = node;
882
+ queuedListeners[queueSize] = listener;
883
+ queuedTypes[queueSize] = type;
884
+ queueSize++;
885
+ if (!isMicrotaskScheduled) {
886
+ isMicrotaskScheduled = true;
887
+ queueMicrotask(processQueuedEvents);
888
+ }
889
+ }
890
+ var eventObj = {
891
+ type: "listener-added",
892
+ node: null,
893
+ listener: void 0,
894
+ timestamp: 0
895
+ };
896
+ function processQueuedEvents() {
897
+ isMicrotaskScheduled = false;
898
+ const timestamp = typeof performance !== "undefined" ? performance.now() : Date.now();
899
+ eventObj.timestamp = timestamp;
900
+ for (let i = 0; i < queueSize; i++) {
901
+ const node = queuedNodes[i];
902
+ const listener = queuedListeners[i];
903
+ const type = queuedTypes[i];
904
+ const handlersMap = nodeMiddlewareHandlers.get(node);
905
+ if (!handlersMap)
906
+ continue;
907
+ const handlers = handlersMap.get(type);
908
+ if (!handlers || handlers.size === 0)
909
+ continue;
910
+ const nodeListeners = node.listeners;
911
+ const nodeListenersImmediate = node.listenersImmediate;
912
+ if (!nodeListeners && !nodeListenersImmediate) {
913
+ continue;
914
+ }
915
+ let isValid = false;
916
+ if (type === "listener-added") {
917
+ isValid = !!(nodeListeners == null ? void 0 : nodeListeners.has(listener)) || !!(nodeListenersImmediate == null ? void 0 : nodeListenersImmediate.has(listener));
918
+ } else if (type === "listener-removed") {
919
+ isValid = !(nodeListeners == null ? void 0 : nodeListeners.has(listener)) && !(nodeListenersImmediate == null ? void 0 : nodeListenersImmediate.has(listener));
920
+ } else {
921
+ isValid = !(nodeListeners == null ? void 0 : nodeListeners.size) && !(nodeListenersImmediate == null ? void 0 : nodeListenersImmediate.size);
922
+ }
923
+ if (isValid) {
924
+ eventObj.type = type;
925
+ eventObj.node = node;
926
+ eventObj.listener = listener;
927
+ const iterableHandlers = Array.from(handlers);
928
+ for (let j = 0; j < iterableHandlers.length; j++) {
929
+ try {
930
+ iterableHandlers[j](eventObj);
931
+ } catch (error) {
932
+ console.error(`Error in middleware handler for ${type}:`, error);
933
+ }
934
+ }
935
+ }
936
+ }
937
+ queueSize = 0;
938
+ }
939
+
814
940
  // src/onChange.ts
815
941
  function onChange(node, callback, options = {}, fromLinks) {
816
942
  var _a;
@@ -881,6 +1007,7 @@ function onChange(node, callback, options = {}, fromLinks) {
881
1007
  pathParent = [parent.key, ...pathParent];
882
1008
  parent = parent.parent;
883
1009
  }
1010
+ dispatchMiddlewareEvent(node, listener, "listener-added");
884
1011
  return () => {
885
1012
  listeners.delete(listener);
886
1013
  extraDisposes == null ? void 0 : extraDisposes.forEach((fn) => fn());
@@ -889,6 +1016,10 @@ function onChange(node, callback, options = {}, fromLinks) {
889
1016
  parent2.numListenersRecursive--;
890
1017
  parent2 = parent2.parent;
891
1018
  }
1019
+ dispatchMiddlewareEvent(node, listener, "listener-removed");
1020
+ if (listeners.size === 0) {
1021
+ dispatchMiddlewareEvent(node, void 0, "listeners-cleared");
1022
+ }
892
1023
  };
893
1024
  }
894
1025
  function createCb(linkedFromNode, path, callback) {
@@ -969,13 +1100,13 @@ function updateTracking(node, track) {
969
1100
  }
970
1101
 
971
1102
  // src/trackSelector.ts
972
- function trackSelector(selector, update, observeEvent, observeOptions, createResubscribe) {
1103
+ function trackSelector(selector, update, getOptions, observeEvent, observeOptions, createResubscribe) {
973
1104
  var _a;
974
1105
  let dispose;
975
1106
  let resubscribe;
976
1107
  let updateFn = update;
977
1108
  beginTracking();
978
- const value = selector ? computeSelector(selector, observeEvent, observeOptions == null ? void 0 : observeOptions.fromComputed) : selector;
1109
+ const value = selector ? computeSelector(selector, getOptions, observeEvent, observeOptions == null ? void 0 : observeOptions.fromComputed) : selector;
979
1110
  const tracker = tracking.current;
980
1111
  const nodes = tracker.nodes;
981
1112
  endTracking();
@@ -1023,7 +1154,11 @@ function observe(selectorOrRun, reactionOrOptions, options) {
1023
1154
  beginBatch();
1024
1155
  delete e.value;
1025
1156
  dispose == null ? void 0 : dispose();
1026
- const { dispose: _dispose, value, nodes } = trackSelector(selectorOrRun, update, e, options);
1157
+ const {
1158
+ dispose: _dispose,
1159
+ value,
1160
+ nodes
1161
+ } = trackSelector(selectorOrRun, update, void 0, e, options);
1027
1162
  dispose = _dispose;
1028
1163
  e.value = value;
1029
1164
  e.nodes = nodes;
@@ -1068,10 +1203,13 @@ function _when(predicate, effect, checkReady) {
1068
1203
  let isOk = true;
1069
1204
  if (isArray(ret)) {
1070
1205
  for (let i = 0; i < ret.length; i++) {
1071
- if (isObservable(ret[i])) {
1072
- ret[i] = computeSelector(ret[i]);
1206
+ let item = ret[i];
1207
+ if (isObservable(item)) {
1208
+ item = computeSelector(item);
1209
+ } else if (isFunction(item)) {
1210
+ item = item();
1073
1211
  }
1074
- isOk = isOk && !!(checkReady ? isObservableValueReady(ret[i]) : ret[i]);
1212
+ isOk = isOk && !!(checkReady ? isObservableValueReady(item) : item);
1075
1213
  }
1076
1214
  } else {
1077
1215
  isOk = checkReady ? isObservableValueReady(ret) : ret;
@@ -1170,9 +1308,6 @@ function collectionSetter(node, target, prop, ...args) {
1170
1308
  return ret;
1171
1309
  }
1172
1310
  }
1173
- function getKeys(obj, isArr, isMap2) {
1174
- return isArr ? void 0 : obj ? isMap2 ? Array.from(obj.keys()) : Object.keys(obj) : [];
1175
- }
1176
1311
  function updateNodes(parent, obj, prevValue) {
1177
1312
  var _a, _b, _c;
1178
1313
  if ((process.env.NODE_ENV === "development" || process.env.NODE_ENV === "test") && typeof __devUpdateNodes !== "undefined" && isObject(obj)) {
@@ -1201,9 +1336,11 @@ function updateNodes(parent, obj, prevValue) {
1201
1336
  let prevChildrenById;
1202
1337
  let moved;
1203
1338
  const isCurMap = isMap(obj);
1339
+ const isCurSet = isSet(obj);
1204
1340
  const isPrevMap = isMap(prevValue);
1205
- const keys = getKeys(obj, isArr, isCurMap);
1206
- const keysPrev = getKeys(prevValue, isArr, isPrevMap);
1341
+ const isPrevSet = isSet(prevValue);
1342
+ const keys = getKeys(obj, isArr, isCurMap, isCurSet);
1343
+ const keysPrev = getKeys(prevValue, isArr, isPrevMap, isPrevSet);
1207
1344
  const length = ((_a = keys || obj) == null ? void 0 : _a.length) || 0;
1208
1345
  const lengthPrev = ((_b = keysPrev || prevValue) == null ? void 0 : _b.length) || 0;
1209
1346
  let idField;
@@ -1436,7 +1573,8 @@ var proxyHandler = {
1436
1573
  }
1437
1574
  if (isNullOrUndefined(value) && vProp === void 0 && (ArrayModifiers.has(p) || ArrayLoopers.has(p))) {
1438
1575
  value = [];
1439
- setNodeValue(node, value);
1576
+ if (ArrayModifiers.has(p))
1577
+ setNodeValue(node, value);
1440
1578
  vProp = value[p];
1441
1579
  }
1442
1580
  if (isFunction(vProp)) {
@@ -1515,7 +1653,11 @@ var proxyHandler = {
1515
1653
  return { configurable: false, enumerable: false };
1516
1654
  }
1517
1655
  const value = getNodeValue(node);
1518
- return isPrimitive(value) ? void 0 : Reflect.getOwnPropertyDescriptor(value, prop);
1656
+ if (isPrimitive(value)) {
1657
+ return void 0;
1658
+ }
1659
+ const descriptor = Reflect.getOwnPropertyDescriptor(value, prop);
1660
+ return descriptor ? { ...descriptor, configurable: true } : void 0;
1519
1661
  },
1520
1662
  set(node, prop, value) {
1521
1663
  if (node.isSetting) {
@@ -1553,7 +1695,9 @@ var proxyHandler = {
1553
1695
  if (isObservable(thisArg)) {
1554
1696
  thisArg = thisArg.peek();
1555
1697
  }
1556
- return Reflect.apply(target.lazyFn || target, thisArg, argArray);
1698
+ const fnRaw = getNodeValue(target);
1699
+ const fn = isFunction(fnRaw) ? fnRaw : target.lazyFn || target;
1700
+ return Reflect.apply(fn, thisArg, argArray);
1557
1701
  }
1558
1702
  };
1559
1703
  function set(node, newValue) {
@@ -1578,6 +1722,7 @@ function setKey(node, key, newValue, level) {
1578
1722
  }
1579
1723
  }
1580
1724
  const isRoot = !node.parent && key === "_";
1725
+ checkPlain(node, newValue);
1581
1726
  if (node.parent && !getNodeValue(node) && !isFunction(newValue)) {
1582
1727
  set(node, { [key]: newValue });
1583
1728
  }
@@ -1585,8 +1730,8 @@ function setKey(node, key, newValue, level) {
1585
1730
  if (isObservable(newValue)) {
1586
1731
  setToObservable(childNode, newValue);
1587
1732
  } else {
1588
- const { newValue: savedValue, prevValue } = setNodeValue(childNode, newValue);
1589
- const isPrim = isPrimitive(savedValue) || savedValue instanceof Date;
1733
+ const { newValue: savedValue, prevValue, parentValue } = setNodeValue(childNode, newValue);
1734
+ const isPrim = isPrimitive(prevValue) || prevValue instanceof Date || isPrimitive(savedValue) || savedValue instanceof Date;
1590
1735
  if (!isPrim) {
1591
1736
  let parent = childNode;
1592
1737
  do {
@@ -1595,9 +1740,19 @@ function setKey(node, key, newValue, level) {
1595
1740
  } while (parent = parent.parent);
1596
1741
  }
1597
1742
  const notify2 = !equals(savedValue, prevValue);
1598
- const forceNotify = !notify2 && childNode.isComputing && !isPrim;
1599
- if (notify2 || forceNotify) {
1600
- updateNodesAndNotify(node, savedValue, prevValue, childNode, isPrim, isRoot, level, forceNotify);
1743
+ const forceNotify = !notify2 && childNode.isComputing && !isPrim && !childNode.isPlain;
1744
+ if ((notify2 || forceNotify) && !(childNode.isComputing && childNode.isPlain && node.numListenersRecursive === 0)) {
1745
+ updateNodesAndNotify(
1746
+ node,
1747
+ savedValue,
1748
+ prevValue,
1749
+ childNode,
1750
+ parentValue,
1751
+ isPrim,
1752
+ isRoot,
1753
+ level,
1754
+ forceNotify
1755
+ );
1601
1756
  }
1602
1757
  extractFunctionOrComputed(node, key, savedValue);
1603
1758
  }
@@ -1652,7 +1807,7 @@ function handlerMapSet(node, p, value) {
1652
1807
  } else if (isFunction(vProp)) {
1653
1808
  return function(a, b, c) {
1654
1809
  const l = arguments.length;
1655
- const valueMap = value;
1810
+ const valueMapOrSet = value;
1656
1811
  if (p === "get") {
1657
1812
  if (l > 0 && typeof a !== "boolean" && a !== optimized) {
1658
1813
  return getProxy(node, a);
@@ -1666,14 +1821,14 @@ function handlerMapSet(node, p, value) {
1666
1821
  return getProxy(node);
1667
1822
  } else if (p === "delete") {
1668
1823
  if (l > 0) {
1669
- const prev = value.get ? valueMap.get(a) : a;
1824
+ const prev = value.get ? valueMapOrSet.get(a) : a;
1670
1825
  deleteFn(node, a);
1671
1826
  return prev !== void 0;
1672
1827
  }
1673
1828
  } else if (p === "clear") {
1674
- const prev = new Map(valueMap);
1675
- const size = valueMap.size;
1676
- valueMap.clear();
1829
+ const prev = isSet(valueMapOrSet) ? new Set(valueMapOrSet) : new Map(valueMapOrSet);
1830
+ const size = valueMapOrSet.size;
1831
+ valueMapOrSet.clear();
1677
1832
  if (size) {
1678
1833
  updateNodesAndNotify(node, value, prev);
1679
1834
  }
@@ -1704,7 +1859,7 @@ function handlerMapSet(node, p, value) {
1704
1859
  };
1705
1860
  }
1706
1861
  }
1707
- function updateNodesAndNotify(node, newValue, prevValue, childNode, isPrim, isRoot, level, forceNotify) {
1862
+ function updateNodesAndNotify(node, newValue, prevValue, childNode, parentValue, isPrim, isRoot, level, forceNotify) {
1708
1863
  if (!childNode)
1709
1864
  childNode = node;
1710
1865
  beginBatch();
@@ -1713,15 +1868,29 @@ function updateNodesAndNotify(node, newValue, prevValue, childNode, isPrim, isRo
1713
1868
  }
1714
1869
  let hasADiff = forceNotify || isPrim;
1715
1870
  let whenOptimizedOnlyIf = false;
1871
+ let valueAsArr;
1872
+ let valueAsMap;
1716
1873
  if (!isPrim || prevValue && !isPrimitive(prevValue)) {
1717
1874
  if ((process.env.NODE_ENV === "development" || process.env.NODE_ENV === "test") && typeof __devUpdateNodes !== "undefined") {
1718
1875
  __devUpdateNodes.clear();
1719
1876
  }
1720
1877
  hasADiff = hasADiff || updateNodes(childNode, newValue, prevValue);
1721
1878
  if (isArray(newValue)) {
1722
- whenOptimizedOnlyIf = (newValue == null ? void 0 : newValue.length) !== (prevValue == null ? void 0 : prevValue.length);
1879
+ valueAsArr = newValue;
1880
+ } else if (isMap(newValue) || isSet(newValue)) {
1881
+ valueAsMap = newValue;
1723
1882
  }
1724
1883
  }
1884
+ if (isArray(parentValue)) {
1885
+ valueAsArr = parentValue;
1886
+ } else if (isMap(parentValue) || isSet(parentValue)) {
1887
+ valueAsMap = parentValue;
1888
+ }
1889
+ if (valueAsArr) {
1890
+ whenOptimizedOnlyIf = (valueAsArr == null ? void 0 : valueAsArr.length) !== (prevValue == null ? void 0 : prevValue.length);
1891
+ } else if (valueAsMap) {
1892
+ whenOptimizedOnlyIf = (valueAsMap == null ? void 0 : valueAsMap.size) !== (prevValue == null ? void 0 : prevValue.size);
1893
+ }
1725
1894
  if (isPrim || !newValue || isEmpty(newValue) && !isEmpty(prevValue) ? newValue !== prevValue : hasADiff) {
1726
1895
  notify(
1727
1896
  isPrim && isRoot ? node : childNode,
@@ -1803,7 +1972,7 @@ function peekInternal(node, activateRecursive) {
1803
1972
  }
1804
1973
  isFlushing = false;
1805
1974
  let value = getNodeValue(node);
1806
- if (!globalState.isLoadingLocal) {
1975
+ if (!node.root.isLoadingLocal && !node.isPlain) {
1807
1976
  value = checkLazy(node, value, !!activateRecursive);
1808
1977
  }
1809
1978
  return value;
@@ -1834,7 +2003,8 @@ function checkLazy(node, value, activateRecursive) {
1834
2003
  value = extractFunctionOrComputed(node.parent, node.key, value);
1835
2004
  }
1836
2005
  }
1837
- if ((lazy || node.needsExtract) && !isObservable(value) && !isPrimitive(value)) {
2006
+ checkPlain(node, value);
2007
+ if ((lazy || node.needsExtract) && !node.isPlain && !isObservable(value) && !isPrimitive(value)) {
1838
2008
  if (activateRecursive) {
1839
2009
  recursivelyAutoActivate(value, node);
1840
2010
  }
@@ -1857,11 +2027,14 @@ function checkProperty(value, key) {
1857
2027
  return value[key];
1858
2028
  }
1859
2029
  }
1860
- function reactivateNode(node, lazyFn) {
2030
+ function deactivateNode(node) {
1861
2031
  var _a, _b;
1862
2032
  (_a = node.activatedObserveDispose) == null ? void 0 : _a.call(node);
1863
2033
  (_b = node.linkedToNodeDispose) == null ? void 0 : _b.call(node);
1864
2034
  node.activatedObserveDispose = node.linkedToNodeDispose = node.linkedToNode = void 0;
2035
+ }
2036
+ function reactivateNode(node, lazyFn) {
2037
+ deactivateNode(node);
1865
2038
  node.lazyFn = lazyFn;
1866
2039
  node.lazy = true;
1867
2040
  }
@@ -1909,7 +2082,7 @@ function activateNodeFunction(node, lazyFn) {
1909
2082
  node.dirtyFn = refreshFn;
1910
2083
  globalState.dirtyNodes.add(node);
1911
2084
  }
1912
- node.activatedObserveDispose = observe(
2085
+ const observeDispose = observe(
1913
2086
  () => {
1914
2087
  var _a, _b, _c, _d;
1915
2088
  if (isFirst) {
@@ -1963,6 +2136,9 @@ function activateNodeFunction(node, lazyFn) {
1963
2136
  value = (_d = (_c = activated2.get) == null ? void 0 : _c.call(activated2)) != null ? _d : activated2.initial;
1964
2137
  }
1965
2138
  }
2139
+ if (ignoreThisUpdate) {
2140
+ activatedValue = value;
2141
+ }
1966
2142
  wasPromise = wasPromise || isPromise(value);
1967
2143
  return value;
1968
2144
  },
@@ -2009,6 +2185,10 @@ function activateNodeFunction(node, lazyFn) {
2009
2185
  },
2010
2186
  { fromComputed: true }
2011
2187
  );
2188
+ node.activatedObserveDispose = () => {
2189
+ observeDispose == null ? void 0 : observeDispose();
2190
+ disposes.forEach((fn) => fn());
2191
+ };
2012
2192
  return activatedValue;
2013
2193
  }
2014
2194
  function activateNodeBase(node, value) {
@@ -2274,7 +2454,14 @@ function syncState(obs) {
2274
2454
  syncCount: 0,
2275
2455
  resetPersistence: void 0,
2276
2456
  reset: () => Promise.resolve(),
2277
- sync: () => Promise.resolve(),
2457
+ sync: () => {
2458
+ var _a;
2459
+ obs.peek();
2460
+ if ((_a = node.state) == null ? void 0 : _a.isGetting.peek()) {
2461
+ return when(node.state.isLoaded);
2462
+ }
2463
+ return Promise.resolve();
2464
+ },
2278
2465
  getPendingChanges: () => ({}),
2279
2466
  // TODOV3 remove
2280
2467
  clearPersist: void 0
@@ -2288,10 +2475,13 @@ function syncState(obs) {
2288
2475
  var internal = {
2289
2476
  createPreviousHandler,
2290
2477
  clone,
2478
+ deactivateNode,
2291
2479
  deepMerge,
2292
2480
  ensureNodeValue,
2293
2481
  findIDKey,
2294
2482
  get,
2483
+ getChildNode,
2484
+ getKeys,
2295
2485
  getNode,
2296
2486
  getNodeValue,
2297
2487
  getPathType,
@@ -2304,6 +2494,8 @@ var internal = {
2304
2494
  observableFns,
2305
2495
  optimized,
2306
2496
  peek,
2497
+ reactivateNode,
2498
+ registerMiddleware,
2307
2499
  safeParse,
2308
2500
  safeStringify,
2309
2501
  set,