UNPKG

fluidstate

Version:

Library for fine-grained reactivity state management

68 lines (67 loc) 2.44 kB
"use strict"; 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