@legendapp/state 3.0.0-beta.44 → 3.0.0-beta.45

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 (3) hide show
  1. package/index.js +37 -3
  2. package/index.mjs +37 -3
  3. package/package.json +1 -1
package/index.js CHANGED
@@ -918,16 +918,30 @@ function processQueuedEvents() {
918
918
  continue;
919
919
  const nodeListeners = node.listeners;
920
920
  const nodeListenersImmediate = node.listenersImmediate;
921
- if (!nodeListeners && !nodeListenersImmediate) {
921
+ if (!nodeListeners && !nodeListenersImmediate && node.numListenersRecursive && !(type === "listener-added" && !listener)) {
922
922
  continue;
923
923
  }
924
924
  let isValid = false;
925
925
  if (type === "listener-added") {
926
- isValid = !!(nodeListeners == null ? void 0 : nodeListeners.has(listener)) || !!(nodeListenersImmediate == null ? void 0 : nodeListenersImmediate.has(listener));
926
+ if (listener) {
927
+ isValid = !!(nodeListeners == null ? void 0 : nodeListeners.has(listener)) || !!(nodeListenersImmediate == null ? void 0 : nodeListenersImmediate.has(listener));
928
+ } else {
929
+ const hasNoLocalListeners = !(nodeListeners == null ? void 0 : nodeListeners.size) && !(nodeListenersImmediate == null ? void 0 : nodeListenersImmediate.size);
930
+ if (hasNoLocalListeners && typeof node.numListenersRecursive === "number") {
931
+ isValid = node.numListenersRecursive > 0;
932
+ } else {
933
+ isValid = false;
934
+ }
935
+ }
927
936
  } else if (type === "listener-removed") {
928
937
  isValid = !(nodeListeners == null ? void 0 : nodeListeners.has(listener)) && !(nodeListenersImmediate == null ? void 0 : nodeListenersImmediate.has(listener));
929
938
  } else {
930
- isValid = !(nodeListeners == null ? void 0 : nodeListeners.size) && !(nodeListenersImmediate == null ? void 0 : nodeListenersImmediate.size);
939
+ const hasAnyLocal = nodeListeners && nodeListeners.size > 0 || nodeListenersImmediate && nodeListenersImmediate.size > 0;
940
+ if (typeof node.numListenersRecursive === "number") {
941
+ isValid = !hasAnyLocal && node.numListenersRecursive === 0;
942
+ } else {
943
+ isValid = !hasAnyLocal;
944
+ }
931
945
  }
932
946
  if (isValid) {
933
947
  eventObj.type = type;
@@ -947,6 +961,14 @@ function processQueuedEvents() {
947
961
  }
948
962
 
949
963
  // src/onChange.ts
964
+ function isSyncedObservable(node) {
965
+ var _a;
966
+ return ((_a = node.activationState) == null ? void 0 : _a.synced) || false;
967
+ }
968
+ function shouldDispatchParentMiddlewareEvent(node) {
969
+ var _a, _b;
970
+ return !((_a = node.listeners) == null ? void 0 : _a.size) && !((_b = node.listenersImmediate) == null ? void 0 : _b.size) && isSyncedObservable(node);
971
+ }
950
972
  function onChange(node, callback, options = {}, fromLinks) {
951
973
  var _a;
952
974
  const { initial, immediate, noArgs } = options;
@@ -1013,6 +1035,9 @@ function onChange(node, callback, options = {}, fromLinks) {
1013
1035
  }
1014
1036
  }
1015
1037
  parent.numListenersRecursive++;
1038
+ if (shouldDispatchParentMiddlewareEvent(parent)) {
1039
+ dispatchMiddlewareEvent(parent, void 0, "listener-added");
1040
+ }
1016
1041
  pathParent = [parent.key, ...pathParent];
1017
1042
  parent = parent.parent;
1018
1043
  }
@@ -1020,15 +1045,24 @@ function onChange(node, callback, options = {}, fromLinks) {
1020
1045
  return () => {
1021
1046
  listeners.delete(listener);
1022
1047
  extraDisposes == null ? void 0 : extraDisposes.forEach((fn) => fn());
1048
+ const clearedRecursive = [];
1023
1049
  let parent2 = node;
1024
1050
  while (parent2) {
1025
1051
  parent2.numListenersRecursive--;
1052
+ if (parent2.numListenersRecursive === 0) {
1053
+ clearedRecursive.push(parent2);
1054
+ }
1026
1055
  parent2 = parent2.parent;
1027
1056
  }
1028
1057
  dispatchMiddlewareEvent(node, listener, "listener-removed");
1029
1058
  if (listeners.size === 0) {
1030
1059
  dispatchMiddlewareEvent(node, void 0, "listeners-cleared");
1031
1060
  }
1061
+ for (const clearedNode of clearedRecursive) {
1062
+ if (clearedNode !== node && shouldDispatchParentMiddlewareEvent(clearedNode)) {
1063
+ dispatchMiddlewareEvent(clearedNode, void 0, "listeners-cleared");
1064
+ }
1065
+ }
1032
1066
  };
1033
1067
  }
1034
1068
  function createCb(linkedFromNode, path, callback) {
package/index.mjs CHANGED
@@ -916,16 +916,30 @@ function processQueuedEvents() {
916
916
  continue;
917
917
  const nodeListeners = node.listeners;
918
918
  const nodeListenersImmediate = node.listenersImmediate;
919
- if (!nodeListeners && !nodeListenersImmediate) {
919
+ if (!nodeListeners && !nodeListenersImmediate && node.numListenersRecursive && !(type === "listener-added" && !listener)) {
920
920
  continue;
921
921
  }
922
922
  let isValid = false;
923
923
  if (type === "listener-added") {
924
- isValid = !!(nodeListeners == null ? void 0 : nodeListeners.has(listener)) || !!(nodeListenersImmediate == null ? void 0 : nodeListenersImmediate.has(listener));
924
+ if (listener) {
925
+ isValid = !!(nodeListeners == null ? void 0 : nodeListeners.has(listener)) || !!(nodeListenersImmediate == null ? void 0 : nodeListenersImmediate.has(listener));
926
+ } else {
927
+ const hasNoLocalListeners = !(nodeListeners == null ? void 0 : nodeListeners.size) && !(nodeListenersImmediate == null ? void 0 : nodeListenersImmediate.size);
928
+ if (hasNoLocalListeners && typeof node.numListenersRecursive === "number") {
929
+ isValid = node.numListenersRecursive > 0;
930
+ } else {
931
+ isValid = false;
932
+ }
933
+ }
925
934
  } else if (type === "listener-removed") {
926
935
  isValid = !(nodeListeners == null ? void 0 : nodeListeners.has(listener)) && !(nodeListenersImmediate == null ? void 0 : nodeListenersImmediate.has(listener));
927
936
  } else {
928
- isValid = !(nodeListeners == null ? void 0 : nodeListeners.size) && !(nodeListenersImmediate == null ? void 0 : nodeListenersImmediate.size);
937
+ const hasAnyLocal = nodeListeners && nodeListeners.size > 0 || nodeListenersImmediate && nodeListenersImmediate.size > 0;
938
+ if (typeof node.numListenersRecursive === "number") {
939
+ isValid = !hasAnyLocal && node.numListenersRecursive === 0;
940
+ } else {
941
+ isValid = !hasAnyLocal;
942
+ }
929
943
  }
930
944
  if (isValid) {
931
945
  eventObj.type = type;
@@ -945,6 +959,14 @@ function processQueuedEvents() {
945
959
  }
946
960
 
947
961
  // src/onChange.ts
962
+ function isSyncedObservable(node) {
963
+ var _a;
964
+ return ((_a = node.activationState) == null ? void 0 : _a.synced) || false;
965
+ }
966
+ function shouldDispatchParentMiddlewareEvent(node) {
967
+ var _a, _b;
968
+ return !((_a = node.listeners) == null ? void 0 : _a.size) && !((_b = node.listenersImmediate) == null ? void 0 : _b.size) && isSyncedObservable(node);
969
+ }
948
970
  function onChange(node, callback, options = {}, fromLinks) {
949
971
  var _a;
950
972
  const { initial, immediate, noArgs } = options;
@@ -1011,6 +1033,9 @@ function onChange(node, callback, options = {}, fromLinks) {
1011
1033
  }
1012
1034
  }
1013
1035
  parent.numListenersRecursive++;
1036
+ if (shouldDispatchParentMiddlewareEvent(parent)) {
1037
+ dispatchMiddlewareEvent(parent, void 0, "listener-added");
1038
+ }
1014
1039
  pathParent = [parent.key, ...pathParent];
1015
1040
  parent = parent.parent;
1016
1041
  }
@@ -1018,15 +1043,24 @@ function onChange(node, callback, options = {}, fromLinks) {
1018
1043
  return () => {
1019
1044
  listeners.delete(listener);
1020
1045
  extraDisposes == null ? void 0 : extraDisposes.forEach((fn) => fn());
1046
+ const clearedRecursive = [];
1021
1047
  let parent2 = node;
1022
1048
  while (parent2) {
1023
1049
  parent2.numListenersRecursive--;
1050
+ if (parent2.numListenersRecursive === 0) {
1051
+ clearedRecursive.push(parent2);
1052
+ }
1024
1053
  parent2 = parent2.parent;
1025
1054
  }
1026
1055
  dispatchMiddlewareEvent(node, listener, "listener-removed");
1027
1056
  if (listeners.size === 0) {
1028
1057
  dispatchMiddlewareEvent(node, void 0, "listeners-cleared");
1029
1058
  }
1059
+ for (const clearedNode of clearedRecursive) {
1060
+ if (clearedNode !== node && shouldDispatchParentMiddlewareEvent(clearedNode)) {
1061
+ dispatchMiddlewareEvent(clearedNode, void 0, "listeners-cleared");
1062
+ }
1063
+ }
1030
1064
  };
1031
1065
  }
1032
1066
  function createCb(linkedFromNode, path, callback) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@legendapp/state",
3
- "version": "3.0.0-beta.44",
3
+ "version": "3.0.0-beta.45",
4
4
  "description": "legend-state",
5
5
  "sideEffects": false,
6
6
  "private": false,