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

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.mjs CHANGED
@@ -144,6 +144,16 @@ function isEvent(value$) {
144
144
  var _a;
145
145
  return value$ && ((_a = value$[symbolGetNode]) == null ? void 0 : _a.isEvent);
146
146
  }
147
+ function setNewValue(parentValue, key, newValue, useSetFn, useMapFn) {
148
+ if (useSetFn) {
149
+ parentValue.add(newValue);
150
+ } else if (useMapFn) {
151
+ parentValue.set(key, newValue);
152
+ } else {
153
+ parentValue[key] = newValue;
154
+ }
155
+ return newValue;
156
+ }
147
157
  function setNodeValue(node, newValue) {
148
158
  var _a;
149
159
  const parentNode = (_a = node.parent) != null ? _a : node;
@@ -167,19 +177,13 @@ function setNodeValue(node, newValue) {
167
177
  delete parentValue[key];
168
178
  }
169
179
  } else {
170
- if (useSetFn) {
171
- parentValue.add(newValue);
172
- } else if (useMapFn) {
173
- parentValue.set(key, newValue);
174
- } else {
175
- parentValue[key] = newValue;
176
- }
180
+ setNewValue(parentValue, key, newValue, useSetFn, useMapFn);
177
181
  }
178
182
  } finally {
179
183
  parentNode.isSetting--;
180
184
  }
181
185
  }
182
- return { prevValue, newValue };
186
+ return { prevValue, newValue, parentValue };
183
187
  }
184
188
  var arrNodeKeys = [];
185
189
  function getNodeValue(node) {
@@ -192,7 +196,7 @@ function getNodeValue(node) {
192
196
  let child = node.root._;
193
197
  for (let i = count - 1; child && i >= 0; i--) {
194
198
  const key = arrNodeKeys[i];
195
- child = key !== "size" && (isMap(child) || child instanceof WeakMap) ? child.get(key) : child[key];
199
+ child = key !== "size" && isMap(child) ? child.get(key) : child[key];
196
200
  }
197
201
  return child;
198
202
  }
@@ -227,7 +231,9 @@ function ensureNodeValue(node) {
227
231
  if (!value || isFunction(value)) {
228
232
  if (isChildNode(node)) {
229
233
  const parent = ensureNodeValue(node.parent);
230
- value = parent[node.key] = {};
234
+ const useSetFn = isSet(parent);
235
+ const useMapFn = isMap(parent);
236
+ value = setNewValue(parent, node.key, {}, useSetFn, useMapFn);
231
237
  } else {
232
238
  value = node.root._ = {};
233
239
  }
@@ -255,6 +261,9 @@ function extractFunction(node, key, fnOrComputed) {
255
261
  function equals(a, b) {
256
262
  return a === b || isDate(a) && isDate(b) && +a === +b;
257
263
  }
264
+ function getKeys(obj, isArr, isMap2, isSet2) {
265
+ return isArr ? void 0 : obj ? isSet2 ? Array.from(obj) : isMap2 ? Array.from(obj.keys()) : Object.keys(obj) : [];
266
+ }
258
267
 
259
268
  // src/ObservableHint.ts
260
269
  function addSymbol(value, symbol) {
@@ -274,16 +283,27 @@ var ObservableHint = {
274
283
  },
275
284
  plain: function plainObject(value) {
276
285
  return addSymbol(value, symbolPlain);
286
+ },
287
+ function: function plainObject2(value) {
288
+ return addSymbol(value, symbolPlain);
277
289
  }
278
290
  };
279
291
 
292
+ // src/checkPlain.ts
293
+ function checkPlain(node, value) {
294
+ var _a;
295
+ if (!node.isPlain && (((_a = node.parent) == null ? void 0 : _a.isPlain) || isHintPlain(value))) {
296
+ node.isPlain = true;
297
+ }
298
+ }
299
+
280
300
  // src/helpers.ts
281
- function computeSelector(selector, e, retainObservable) {
301
+ function computeSelector(selector, getOptions, e, retainObservable) {
282
302
  let c = selector;
283
303
  if (!isObservable(c) && isFunction(c)) {
284
304
  c = e ? c(e) : c();
285
305
  }
286
- return isObservable(c) && !retainObservable ? c.get() : c;
306
+ return isObservable(c) && !retainObservable ? c.get(getOptions) : c;
287
307
  }
288
308
  function getObservableIndex(value$) {
289
309
  const node = getNode(value$);
@@ -382,7 +402,7 @@ function _mergeIntoObservable(target, source, levelsDeep) {
382
402
  const isSourceSet = isSet(source);
383
403
  if (isSourceSet && isSet(targetValue)) {
384
404
  target.set(/* @__PURE__ */ new Set([...source, ...targetValue]));
385
- } else if (isTargetObj && isObject(source) && !isEmpty(targetValue) || isTargetArr && targetValue.length > 0) {
405
+ } else if (isTargetObj && isObject(source) || isTargetArr && targetValue.length > 0) {
386
406
  const keys = isSourceMap || isSourceSet ? Array.from(source.keys()) : Object.keys(source);
387
407
  for (let i = 0; i < keys.length; i++) {
388
408
  const key = keys[i];
@@ -588,6 +608,7 @@ function computeChangesAtNode(changesInBatch, node, isFromPersist, isFromSync, v
588
608
  if (!isArraySubset(changes[0].path, change.path)) {
589
609
  changes.push(change);
590
610
  changeInBatch.level = Math.min(changeInBatch.level, level);
611
+ changeInBatch.whenOptimizedOnlyIf || (changeInBatch.whenOptimizedOnlyIf = whenOptimizedOnlyIf);
591
612
  }
592
613
  } else {
593
614
  changesInBatch.set(node, {
@@ -602,37 +623,39 @@ function computeChangesAtNode(changesInBatch, node, isFromPersist, isFromSync, v
602
623
  }
603
624
  }
604
625
  function computeChangesRecursive(changesInBatch, node, loading, remote, value, path, pathTypes, valueAtPath, prevAtPath, immediate, level, whenOptimizedOnlyIf) {
605
- computeChangesAtNode(
606
- changesInBatch,
607
- node,
608
- loading,
609
- remote,
610
- value,
611
- path,
612
- pathTypes,
613
- valueAtPath,
614
- prevAtPath,
615
- immediate,
616
- level,
617
- whenOptimizedOnlyIf
618
- );
619
- if (node.linkedFromNodes) {
620
- for (const linkedFromNode of node.linkedFromNodes) {
621
- const childNode = getNodeAtPath(linkedFromNode, path);
622
- computeChangesRecursive(
623
- changesInBatch,
624
- childNode,
625
- loading,
626
- remote,
627
- valueAtPath,
628
- [],
629
- [],
630
- valueAtPath,
631
- prevAtPath,
632
- immediate,
633
- 0,
634
- whenOptimizedOnlyIf
635
- );
626
+ if (node.numListenersRecursive > 0) {
627
+ computeChangesAtNode(
628
+ changesInBatch,
629
+ node,
630
+ loading,
631
+ remote,
632
+ value,
633
+ path,
634
+ pathTypes,
635
+ valueAtPath,
636
+ prevAtPath,
637
+ immediate,
638
+ level,
639
+ whenOptimizedOnlyIf
640
+ );
641
+ if (node.linkedFromNodes) {
642
+ for (const linkedFromNode of node.linkedFromNodes) {
643
+ const childNode = getNodeAtPath(linkedFromNode, path);
644
+ computeChangesRecursive(
645
+ changesInBatch,
646
+ childNode,
647
+ loading,
648
+ remote,
649
+ valueAtPath,
650
+ [],
651
+ [],
652
+ valueAtPath,
653
+ prevAtPath,
654
+ immediate,
655
+ 0,
656
+ whenOptimizedOnlyIf
657
+ );
658
+ }
636
659
  }
637
660
  }
638
661
  if (node.parent) {
@@ -809,6 +832,109 @@ function linked(params, options) {
809
832
  return ret;
810
833
  }
811
834
 
835
+ // src/middleware.ts
836
+ var nodeMiddlewareHandlers = /* @__PURE__ */ new WeakMap();
837
+ var queuedNodes = [];
838
+ var queuedListeners = [];
839
+ var queuedTypes = [];
840
+ var queueSize = 0;
841
+ var isMicrotaskScheduled = false;
842
+ function registerMiddleware(node, type, handler) {
843
+ let handlersMap = nodeMiddlewareHandlers.get(node);
844
+ if (!handlersMap) {
845
+ handlersMap = /* @__PURE__ */ new Map();
846
+ nodeMiddlewareHandlers.set(node, handlersMap);
847
+ }
848
+ let handlers = handlersMap.get(type);
849
+ if (!handlers) {
850
+ handlers = /* @__PURE__ */ new Set();
851
+ handlersMap.set(type, handlers);
852
+ }
853
+ handlers.add(handler);
854
+ return () => {
855
+ const handlersMap2 = nodeMiddlewareHandlers.get(node);
856
+ if (!handlersMap2)
857
+ return;
858
+ const handlers2 = handlersMap2.get(type);
859
+ if (!handlers2)
860
+ return;
861
+ handlers2.delete(handler);
862
+ if (handlers2.size === 0) {
863
+ handlersMap2.delete(type);
864
+ if (handlersMap2.size === 0) {
865
+ nodeMiddlewareHandlers.delete(node);
866
+ }
867
+ }
868
+ };
869
+ }
870
+ function dispatchMiddlewareEvent(node, listener, type) {
871
+ const handlersMap = nodeMiddlewareHandlers.get(node);
872
+ if (!handlersMap || !handlersMap.has(type)) {
873
+ return;
874
+ }
875
+ const handlers = handlersMap.get(type);
876
+ if (!handlers || handlers.size === 0) {
877
+ return;
878
+ }
879
+ queuedNodes[queueSize] = node;
880
+ queuedListeners[queueSize] = listener;
881
+ queuedTypes[queueSize] = type;
882
+ queueSize++;
883
+ if (!isMicrotaskScheduled) {
884
+ isMicrotaskScheduled = true;
885
+ queueMicrotask(processQueuedEvents);
886
+ }
887
+ }
888
+ var eventObj = {
889
+ type: "listener-added",
890
+ node: null,
891
+ listener: void 0,
892
+ timestamp: 0
893
+ };
894
+ function processQueuedEvents() {
895
+ isMicrotaskScheduled = false;
896
+ const timestamp = typeof performance !== "undefined" ? performance.now() : Date.now();
897
+ eventObj.timestamp = timestamp;
898
+ for (let i = 0; i < queueSize; i++) {
899
+ const node = queuedNodes[i];
900
+ const listener = queuedListeners[i];
901
+ const type = queuedTypes[i];
902
+ const handlersMap = nodeMiddlewareHandlers.get(node);
903
+ if (!handlersMap)
904
+ continue;
905
+ const handlers = handlersMap.get(type);
906
+ if (!handlers || handlers.size === 0)
907
+ continue;
908
+ const nodeListeners = node.listeners;
909
+ const nodeListenersImmediate = node.listenersImmediate;
910
+ if (!nodeListeners && !nodeListenersImmediate) {
911
+ continue;
912
+ }
913
+ let isValid = false;
914
+ if (type === "listener-added") {
915
+ isValid = !!(nodeListeners == null ? void 0 : nodeListeners.has(listener)) || !!(nodeListenersImmediate == null ? void 0 : nodeListenersImmediate.has(listener));
916
+ } else if (type === "listener-removed") {
917
+ isValid = !(nodeListeners == null ? void 0 : nodeListeners.has(listener)) && !(nodeListenersImmediate == null ? void 0 : nodeListenersImmediate.has(listener));
918
+ } else {
919
+ isValid = !(nodeListeners == null ? void 0 : nodeListeners.size) && !(nodeListenersImmediate == null ? void 0 : nodeListenersImmediate.size);
920
+ }
921
+ if (isValid) {
922
+ eventObj.type = type;
923
+ eventObj.node = node;
924
+ eventObj.listener = listener;
925
+ const iterableHandlers = Array.from(handlers);
926
+ for (let j = 0; j < iterableHandlers.length; j++) {
927
+ try {
928
+ iterableHandlers[j](eventObj);
929
+ } catch (error) {
930
+ console.error(`Error in middleware handler for ${type}:`, error);
931
+ }
932
+ }
933
+ }
934
+ }
935
+ queueSize = 0;
936
+ }
937
+
812
938
  // src/onChange.ts
813
939
  function onChange(node, callback, options = {}, fromLinks) {
814
940
  var _a;
@@ -879,6 +1005,7 @@ function onChange(node, callback, options = {}, fromLinks) {
879
1005
  pathParent = [parent.key, ...pathParent];
880
1006
  parent = parent.parent;
881
1007
  }
1008
+ dispatchMiddlewareEvent(node, listener, "listener-added");
882
1009
  return () => {
883
1010
  listeners.delete(listener);
884
1011
  extraDisposes == null ? void 0 : extraDisposes.forEach((fn) => fn());
@@ -887,6 +1014,10 @@ function onChange(node, callback, options = {}, fromLinks) {
887
1014
  parent2.numListenersRecursive--;
888
1015
  parent2 = parent2.parent;
889
1016
  }
1017
+ dispatchMiddlewareEvent(node, listener, "listener-removed");
1018
+ if (listeners.size === 0) {
1019
+ dispatchMiddlewareEvent(node, void 0, "listeners-cleared");
1020
+ }
890
1021
  };
891
1022
  }
892
1023
  function createCb(linkedFromNode, path, callback) {
@@ -967,13 +1098,13 @@ function updateTracking(node, track) {
967
1098
  }
968
1099
 
969
1100
  // src/trackSelector.ts
970
- function trackSelector(selector, update, observeEvent, observeOptions, createResubscribe) {
1101
+ function trackSelector(selector, update, getOptions, observeEvent, observeOptions, createResubscribe) {
971
1102
  var _a;
972
1103
  let dispose;
973
1104
  let resubscribe;
974
1105
  let updateFn = update;
975
1106
  beginTracking();
976
- const value = selector ? computeSelector(selector, observeEvent, observeOptions == null ? void 0 : observeOptions.fromComputed) : selector;
1107
+ const value = selector ? computeSelector(selector, getOptions, observeEvent, observeOptions == null ? void 0 : observeOptions.fromComputed) : selector;
977
1108
  const tracker = tracking.current;
978
1109
  const nodes = tracker.nodes;
979
1110
  endTracking();
@@ -1021,7 +1152,11 @@ function observe(selectorOrRun, reactionOrOptions, options) {
1021
1152
  beginBatch();
1022
1153
  delete e.value;
1023
1154
  dispose == null ? void 0 : dispose();
1024
- const { dispose: _dispose, value, nodes } = trackSelector(selectorOrRun, update, e, options);
1155
+ const {
1156
+ dispose: _dispose,
1157
+ value,
1158
+ nodes
1159
+ } = trackSelector(selectorOrRun, update, void 0, e, options);
1025
1160
  dispose = _dispose;
1026
1161
  e.value = value;
1027
1162
  e.nodes = nodes;
@@ -1066,10 +1201,13 @@ function _when(predicate, effect, checkReady) {
1066
1201
  let isOk = true;
1067
1202
  if (isArray(ret)) {
1068
1203
  for (let i = 0; i < ret.length; i++) {
1069
- if (isObservable(ret[i])) {
1070
- ret[i] = computeSelector(ret[i]);
1204
+ let item = ret[i];
1205
+ if (isObservable(item)) {
1206
+ item = computeSelector(item);
1207
+ } else if (isFunction(item)) {
1208
+ item = item();
1071
1209
  }
1072
- isOk = isOk && !!(checkReady ? isObservableValueReady(ret[i]) : ret[i]);
1210
+ isOk = isOk && !!(checkReady ? isObservableValueReady(item) : item);
1073
1211
  }
1074
1212
  } else {
1075
1213
  isOk = checkReady ? isObservableValueReady(ret) : ret;
@@ -1168,9 +1306,6 @@ function collectionSetter(node, target, prop, ...args) {
1168
1306
  return ret;
1169
1307
  }
1170
1308
  }
1171
- function getKeys(obj, isArr, isMap2) {
1172
- return isArr ? void 0 : obj ? isMap2 ? Array.from(obj.keys()) : Object.keys(obj) : [];
1173
- }
1174
1309
  function updateNodes(parent, obj, prevValue) {
1175
1310
  var _a, _b, _c;
1176
1311
  if ((process.env.NODE_ENV === "development" || process.env.NODE_ENV === "test") && typeof __devUpdateNodes !== "undefined" && isObject(obj)) {
@@ -1199,9 +1334,11 @@ function updateNodes(parent, obj, prevValue) {
1199
1334
  let prevChildrenById;
1200
1335
  let moved;
1201
1336
  const isCurMap = isMap(obj);
1337
+ const isCurSet = isSet(obj);
1202
1338
  const isPrevMap = isMap(prevValue);
1203
- const keys = getKeys(obj, isArr, isCurMap);
1204
- const keysPrev = getKeys(prevValue, isArr, isPrevMap);
1339
+ const isPrevSet = isSet(prevValue);
1340
+ const keys = getKeys(obj, isArr, isCurMap, isCurSet);
1341
+ const keysPrev = getKeys(prevValue, isArr, isPrevMap, isPrevSet);
1205
1342
  const length = ((_a = keys || obj) == null ? void 0 : _a.length) || 0;
1206
1343
  const lengthPrev = ((_b = keysPrev || prevValue) == null ? void 0 : _b.length) || 0;
1207
1344
  let idField;
@@ -1434,7 +1571,8 @@ var proxyHandler = {
1434
1571
  }
1435
1572
  if (isNullOrUndefined(value) && vProp === void 0 && (ArrayModifiers.has(p) || ArrayLoopers.has(p))) {
1436
1573
  value = [];
1437
- setNodeValue(node, value);
1574
+ if (ArrayModifiers.has(p))
1575
+ setNodeValue(node, value);
1438
1576
  vProp = value[p];
1439
1577
  }
1440
1578
  if (isFunction(vProp)) {
@@ -1513,7 +1651,11 @@ var proxyHandler = {
1513
1651
  return { configurable: false, enumerable: false };
1514
1652
  }
1515
1653
  const value = getNodeValue(node);
1516
- return isPrimitive(value) ? void 0 : Reflect.getOwnPropertyDescriptor(value, prop);
1654
+ if (isPrimitive(value)) {
1655
+ return void 0;
1656
+ }
1657
+ const descriptor = Reflect.getOwnPropertyDescriptor(value, prop);
1658
+ return descriptor ? { ...descriptor, configurable: true } : void 0;
1517
1659
  },
1518
1660
  set(node, prop, value) {
1519
1661
  if (node.isSetting) {
@@ -1551,7 +1693,9 @@ var proxyHandler = {
1551
1693
  if (isObservable(thisArg)) {
1552
1694
  thisArg = thisArg.peek();
1553
1695
  }
1554
- return Reflect.apply(target.lazyFn || target, thisArg, argArray);
1696
+ const fnRaw = getNodeValue(target);
1697
+ const fn = isFunction(fnRaw) ? fnRaw : target.lazyFn || target;
1698
+ return Reflect.apply(fn, thisArg, argArray);
1555
1699
  }
1556
1700
  };
1557
1701
  function set(node, newValue) {
@@ -1576,6 +1720,7 @@ function setKey(node, key, newValue, level) {
1576
1720
  }
1577
1721
  }
1578
1722
  const isRoot = !node.parent && key === "_";
1723
+ checkPlain(node, newValue);
1579
1724
  if (node.parent && !getNodeValue(node) && !isFunction(newValue)) {
1580
1725
  set(node, { [key]: newValue });
1581
1726
  }
@@ -1583,8 +1728,8 @@ function setKey(node, key, newValue, level) {
1583
1728
  if (isObservable(newValue)) {
1584
1729
  setToObservable(childNode, newValue);
1585
1730
  } else {
1586
- const { newValue: savedValue, prevValue } = setNodeValue(childNode, newValue);
1587
- const isPrim = isPrimitive(savedValue) || savedValue instanceof Date;
1731
+ const { newValue: savedValue, prevValue, parentValue } = setNodeValue(childNode, newValue);
1732
+ const isPrim = isPrimitive(prevValue) || prevValue instanceof Date || isPrimitive(savedValue) || savedValue instanceof Date;
1588
1733
  if (!isPrim) {
1589
1734
  let parent = childNode;
1590
1735
  do {
@@ -1593,9 +1738,19 @@ function setKey(node, key, newValue, level) {
1593
1738
  } while (parent = parent.parent);
1594
1739
  }
1595
1740
  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);
1741
+ const forceNotify = !notify2 && childNode.isComputing && !isPrim && !childNode.isPlain;
1742
+ if ((notify2 || forceNotify) && !(childNode.isComputing && childNode.isPlain && node.numListenersRecursive === 0)) {
1743
+ updateNodesAndNotify(
1744
+ node,
1745
+ savedValue,
1746
+ prevValue,
1747
+ childNode,
1748
+ parentValue,
1749
+ isPrim,
1750
+ isRoot,
1751
+ level,
1752
+ forceNotify
1753
+ );
1599
1754
  }
1600
1755
  extractFunctionOrComputed(node, key, savedValue);
1601
1756
  }
@@ -1650,7 +1805,7 @@ function handlerMapSet(node, p, value) {
1650
1805
  } else if (isFunction(vProp)) {
1651
1806
  return function(a, b, c) {
1652
1807
  const l = arguments.length;
1653
- const valueMap = value;
1808
+ const valueMapOrSet = value;
1654
1809
  if (p === "get") {
1655
1810
  if (l > 0 && typeof a !== "boolean" && a !== optimized) {
1656
1811
  return getProxy(node, a);
@@ -1664,14 +1819,14 @@ function handlerMapSet(node, p, value) {
1664
1819
  return getProxy(node);
1665
1820
  } else if (p === "delete") {
1666
1821
  if (l > 0) {
1667
- const prev = value.get ? valueMap.get(a) : a;
1822
+ const prev = value.get ? valueMapOrSet.get(a) : a;
1668
1823
  deleteFn(node, a);
1669
1824
  return prev !== void 0;
1670
1825
  }
1671
1826
  } else if (p === "clear") {
1672
- const prev = new Map(valueMap);
1673
- const size = valueMap.size;
1674
- valueMap.clear();
1827
+ const prev = isSet(valueMapOrSet) ? new Set(valueMapOrSet) : new Map(valueMapOrSet);
1828
+ const size = valueMapOrSet.size;
1829
+ valueMapOrSet.clear();
1675
1830
  if (size) {
1676
1831
  updateNodesAndNotify(node, value, prev);
1677
1832
  }
@@ -1702,7 +1857,7 @@ function handlerMapSet(node, p, value) {
1702
1857
  };
1703
1858
  }
1704
1859
  }
1705
- function updateNodesAndNotify(node, newValue, prevValue, childNode, isPrim, isRoot, level, forceNotify) {
1860
+ function updateNodesAndNotify(node, newValue, prevValue, childNode, parentValue, isPrim, isRoot, level, forceNotify) {
1706
1861
  if (!childNode)
1707
1862
  childNode = node;
1708
1863
  beginBatch();
@@ -1711,15 +1866,29 @@ function updateNodesAndNotify(node, newValue, prevValue, childNode, isPrim, isRo
1711
1866
  }
1712
1867
  let hasADiff = forceNotify || isPrim;
1713
1868
  let whenOptimizedOnlyIf = false;
1869
+ let valueAsArr;
1870
+ let valueAsMap;
1714
1871
  if (!isPrim || prevValue && !isPrimitive(prevValue)) {
1715
1872
  if ((process.env.NODE_ENV === "development" || process.env.NODE_ENV === "test") && typeof __devUpdateNodes !== "undefined") {
1716
1873
  __devUpdateNodes.clear();
1717
1874
  }
1718
1875
  hasADiff = hasADiff || updateNodes(childNode, newValue, prevValue);
1719
1876
  if (isArray(newValue)) {
1720
- whenOptimizedOnlyIf = (newValue == null ? void 0 : newValue.length) !== (prevValue == null ? void 0 : prevValue.length);
1877
+ valueAsArr = newValue;
1878
+ } else if (isMap(newValue) || isSet(newValue)) {
1879
+ valueAsMap = newValue;
1721
1880
  }
1722
1881
  }
1882
+ if (isArray(parentValue)) {
1883
+ valueAsArr = parentValue;
1884
+ } else if (isMap(parentValue) || isSet(parentValue)) {
1885
+ valueAsMap = parentValue;
1886
+ }
1887
+ if (valueAsArr) {
1888
+ whenOptimizedOnlyIf = (valueAsArr == null ? void 0 : valueAsArr.length) !== (prevValue == null ? void 0 : prevValue.length);
1889
+ } else if (valueAsMap) {
1890
+ whenOptimizedOnlyIf = (valueAsMap == null ? void 0 : valueAsMap.size) !== (prevValue == null ? void 0 : prevValue.size);
1891
+ }
1723
1892
  if (isPrim || !newValue || isEmpty(newValue) && !isEmpty(prevValue) ? newValue !== prevValue : hasADiff) {
1724
1893
  notify(
1725
1894
  isPrim && isRoot ? node : childNode,
@@ -1801,7 +1970,7 @@ function peekInternal(node, activateRecursive) {
1801
1970
  }
1802
1971
  isFlushing = false;
1803
1972
  let value = getNodeValue(node);
1804
- if (!globalState.isLoadingLocal) {
1973
+ if (!node.root.isLoadingLocal && !node.isPlain) {
1805
1974
  value = checkLazy(node, value, !!activateRecursive);
1806
1975
  }
1807
1976
  return value;
@@ -1832,7 +2001,8 @@ function checkLazy(node, value, activateRecursive) {
1832
2001
  value = extractFunctionOrComputed(node.parent, node.key, value);
1833
2002
  }
1834
2003
  }
1835
- if ((lazy || node.needsExtract) && !isObservable(value) && !isPrimitive(value)) {
2004
+ checkPlain(node, value);
2005
+ if ((lazy || node.needsExtract) && !node.isPlain && !isObservable(value) && !isPrimitive(value)) {
1836
2006
  if (activateRecursive) {
1837
2007
  recursivelyAutoActivate(value, node);
1838
2008
  }
@@ -1855,11 +2025,14 @@ function checkProperty(value, key) {
1855
2025
  return value[key];
1856
2026
  }
1857
2027
  }
1858
- function reactivateNode(node, lazyFn) {
2028
+ function deactivateNode(node) {
1859
2029
  var _a, _b;
1860
2030
  (_a = node.activatedObserveDispose) == null ? void 0 : _a.call(node);
1861
2031
  (_b = node.linkedToNodeDispose) == null ? void 0 : _b.call(node);
1862
2032
  node.activatedObserveDispose = node.linkedToNodeDispose = node.linkedToNode = void 0;
2033
+ }
2034
+ function reactivateNode(node, lazyFn) {
2035
+ deactivateNode(node);
1863
2036
  node.lazyFn = lazyFn;
1864
2037
  node.lazy = true;
1865
2038
  }
@@ -1907,7 +2080,7 @@ function activateNodeFunction(node, lazyFn) {
1907
2080
  node.dirtyFn = refreshFn;
1908
2081
  globalState.dirtyNodes.add(node);
1909
2082
  }
1910
- node.activatedObserveDispose = observe(
2083
+ const observeDispose = observe(
1911
2084
  () => {
1912
2085
  var _a, _b, _c, _d;
1913
2086
  if (isFirst) {
@@ -1961,6 +2134,9 @@ function activateNodeFunction(node, lazyFn) {
1961
2134
  value = (_d = (_c = activated2.get) == null ? void 0 : _c.call(activated2)) != null ? _d : activated2.initial;
1962
2135
  }
1963
2136
  }
2137
+ if (ignoreThisUpdate) {
2138
+ activatedValue = value;
2139
+ }
1964
2140
  wasPromise = wasPromise || isPromise(value);
1965
2141
  return value;
1966
2142
  },
@@ -2007,6 +2183,10 @@ function activateNodeFunction(node, lazyFn) {
2007
2183
  },
2008
2184
  { fromComputed: true }
2009
2185
  );
2186
+ node.activatedObserveDispose = () => {
2187
+ observeDispose == null ? void 0 : observeDispose();
2188
+ disposes.forEach((fn) => fn());
2189
+ };
2010
2190
  return activatedValue;
2011
2191
  }
2012
2192
  function activateNodeBase(node, value) {
@@ -2272,7 +2452,14 @@ function syncState(obs) {
2272
2452
  syncCount: 0,
2273
2453
  resetPersistence: void 0,
2274
2454
  reset: () => Promise.resolve(),
2275
- sync: () => Promise.resolve(),
2455
+ sync: () => {
2456
+ var _a;
2457
+ obs.peek();
2458
+ if ((_a = node.state) == null ? void 0 : _a.isGetting.peek()) {
2459
+ return when(node.state.isLoaded);
2460
+ }
2461
+ return Promise.resolve();
2462
+ },
2276
2463
  getPendingChanges: () => ({}),
2277
2464
  // TODOV3 remove
2278
2465
  clearPersist: void 0
@@ -2286,10 +2473,13 @@ function syncState(obs) {
2286
2473
  var internal = {
2287
2474
  createPreviousHandler,
2288
2475
  clone,
2476
+ deactivateNode,
2289
2477
  deepMerge,
2290
2478
  ensureNodeValue,
2291
2479
  findIDKey,
2292
2480
  get,
2481
+ getChildNode,
2482
+ getKeys,
2293
2483
  getNode,
2294
2484
  getNodeValue,
2295
2485
  getPathType,
@@ -2302,6 +2492,8 @@ var internal = {
2302
2492
  observableFns,
2303
2493
  optimized,
2304
2494
  peek,
2495
+ reactivateNode,
2496
+ registerMiddleware,
2305
2497
  safeParse,
2306
2498
  safeStringify,
2307
2499
  set,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@legendapp/state",
3
- "version": "3.0.0-beta.4",
3
+ "version": "3.0.0-beta.40",
4
4
  "description": "legend-state",
5
5
  "sideEffects": false,
6
6
  "private": false,
@@ -13,6 +13,14 @@
13
13
  "dependencies": {
14
14
  "use-sync-external-store": "^1.2.2"
15
15
  },
16
+ "peerDependencies": {
17
+ "expo-sqlite": "^15.0.0"
18
+ },
19
+ "peerDependenciesMeta": {
20
+ "expo-sqlite": {
21
+ "optional": true
22
+ }
23
+ },
16
24
  "author": "Legend <contact@legendapp.com> (https://github.com/LegendApp)",
17
25
  "keywords": [
18
26
  "react",
@@ -48,6 +56,12 @@
48
56
  "./types/babel": {
49
57
  "types": "./types/babel.d.ts"
50
58
  },
59
+ "./types/reactive-web": {
60
+ "types": "./types/reactive-web.d.ts"
61
+ },
62
+ "./types/reactive-native": {
63
+ "types": "./types/reactive-native.d.ts"
64
+ },
51
65
  ".": {
52
66
  "import": "./index.mjs",
53
67
  "require": "./index.js",
@@ -63,6 +77,16 @@
63
77
  "require": "./react.js",
64
78
  "types": "./react.d.ts"
65
79
  },
80
+ "./react-native": {
81
+ "import": "./react-native.mjs",
82
+ "require": "./react-native.js",
83
+ "types": "./react-native.d.ts"
84
+ },
85
+ "./react-web": {
86
+ "import": "./react-web.mjs",
87
+ "require": "./react-web.js",
88
+ "types": "./react-web.d.ts"
89
+ },
66
90
  "./trace": {
67
91
  "import": "./trace.mjs",
68
92
  "require": "./trace.js",
@@ -73,6 +97,11 @@
73
97
  "require": "./react-reactive/enableReactive.js",
74
98
  "types": "./react-reactive/enableReactive.d.ts"
75
99
  },
100
+ "./react-reactive/Components": {
101
+ "import": "./react-reactive/Components.mjs",
102
+ "require": "./react-reactive/Components.js",
103
+ "types": "./react-reactive/Components.d.ts"
104
+ },
76
105
  "./react-reactive/enableReactComponents": {
77
106
  "import": "./react-reactive/enableReactComponents.mjs",
78
107
  "require": "./react-reactive/enableReactComponents.js",
@@ -228,6 +257,11 @@
228
257
  "require": "./persist-plugins/local-storage.js",
229
258
  "types": "./persist-plugins/local-storage.d.ts"
230
259
  },
260
+ "./persist-plugins/expo-sqlite": {
261
+ "import": "./persist-plugins/expo-sqlite.mjs",
262
+ "require": "./persist-plugins/expo-sqlite.js",
263
+ "types": "./persist-plugins/expo-sqlite.d.ts"
264
+ },
231
265
  "./persist-plugins/async-storage": {
232
266
  "import": "./persist-plugins/async-storage.mjs",
233
267
  "require": "./persist-plugins/async-storage.js",