UNPKG

lingo3d

Version:

Lingo3D is a React/Vue 3d game development framework that ships with a complete visual editor

48 lines 1.62 kB
import { Reactive } from "@lincode/reactivity"; import { assert, forceGetInstance } from "@lincode/utils"; import unsafeGetValue from "./unsafeGetValue"; import unsafeSetValue from "./unsafeSetValue"; const prototypeDescriptorMap = new WeakMap(); const getPropertyDescriptor = (obj, key) => { if (!obj) return; const descriptorMap = forceGetInstance(prototypeDescriptorMap, obj, (Map)); if (descriptorMap.has(key)) return descriptorMap.get(key); const desc = Object.getOwnPropertyDescriptor(obj, key); if (desc) { descriptorMap.set(key, desc); return desc; } return getPropertyDescriptor(Object.getPrototypeOf(obj), key); }; export default (manager, key) => { const stateKey = `${key}State`; let reactive = unsafeGetValue(manager, stateKey); if (reactive) return reactive; unsafeSetValue(manager, stateKey, (reactive = new Reactive(unsafeGetValue(manager, key)))); const desc = getPropertyDescriptor(manager, key); assert(desc, `Property "${key}" not found`); if ("value" in desc) Object.defineProperty(manager, key, { get() { return reactive.get(); }, set(value) { reactive.set(value); } }); else Object.defineProperty(manager, key, { get() { return desc.get.call(manager); }, set(value) { reactive.set(value); desc.set.call(manager, value); } }); return reactive; }; //# sourceMappingURL=getReactive.js.map