@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.
- package/index.js +37 -3
- package/index.mjs +37 -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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) {
|