fluidstate
Version:
Library for fine-grained reactivity state management
68 lines (67 loc) • 2.44 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.deepObserve = void 0;
var _reactiveChildren = require("../abstractions/reactive-children");
var _reactiveProxy = require("../abstractions/reactive-proxy");
var _reactiveUtils = require("../abstractions/reactive-utils");
/**
* Recursively traverses a (potentially reactive) data structure and "observes"
* all its properties and elements.
*
* This function is typically used to ensure that all parts of a reactive
* object, array, Set, or Map are actively tracked by the reactive system.
* Accessing each part within this function effectively registers them as
* dependencies if called within a reactive context (like a reaction or
* computed atom).
*
* It handles cycles by keeping track of visited objects.
*
* @param something The data structure to deeply observe.
*/
const deepObserve = something => {
observeAny(something, new Set(), false);
};
exports.deepObserve = deepObserve;
const observeAny = (something, visited, requireSimpleObject = true) => {
if (!(0, _reactiveProxy.isReactive)(something) && (!(0, _reactiveChildren.isSimpleObject)(something) && requireSimpleObject || !(0, _reactiveUtils.isObject)(something) || Object.isFrozen(something))) {
return;
}
const inertObject = (0, _reactiveProxy.ensureInert)(something);
if (!visited.has(inertObject)) {
visited.add(inertObject);
if (Array.isArray(something)) {
observeReactiveArray(something, visited);
} else if (something instanceof Set) {
observeReactiveSet(something, visited);
} else if (something instanceof Map) {
observeReactiveMap(something, visited);
} else {
observeReactiveObject(something, visited);
}
}
};
const observeReactiveObject = (proxy, visited) => {
const keys = new Set([...Reflect.ownKeys(proxy), ...(0, _reactiveProxy.getProxyComputedKeys)(proxy)]);
for (const key of keys) {
observeAny(proxy[key], visited);
}
};
const observeReactiveMap = (proxy, visited) => {
for (const [key, value] of proxy) {
observeAny(key, visited);
observeAny(value, visited);
}
};
const observeReactiveArray = (proxy, visited) => {
for (let i = 0; i < proxy.length; i++) {
observeAny(proxy[i], visited);
}
};
const observeReactiveSet = (proxy, visited) => {
for (const value of proxy) {
observeAny(value, visited);
}
};
//# sourceMappingURL=reactive-deep-observe.js.map