rvx
Version:
A signal based rendering library
68 lines • 2.26 kB
JavaScript
import { createReactiveArrayProxy } from "./reactive-array-proxy.js";
import { ReactiveMap } from "./reactive-map.js";
import { createReactiveProxy } from "./reactive-proxy.js";
import { ReactiveSet } from "./reactive-set.js";
const WRAP_INSTANCE = Symbol.for("rvx:store:wrap_instance");
const WRAPPERS = new WeakMap();
const TARGETS = new WeakMap();
export const BARRIER = { wrap, unwrap };
export function wrap(value) {
if (value !== null && typeof value === "object") {
if (TARGETS.has(value)) {
return value;
}
let wrapper = WRAPPERS.get(value);
if (wrapper !== undefined) {
return wrapper;
}
const ctor = value.constructor;
const wrapInstance = ctor[WRAP_INSTANCE];
if (wrapInstance) {
wrapper = wrapInstance(value);
}
else {
const proto = Object.getPrototypeOf(value);
switch (proto) {
case Object.prototype:
wrapper = createReactiveProxy(value, BARRIER);
break;
case Array.prototype:
wrapper = createReactiveArrayProxy(value, BARRIER);
break;
case Map.prototype:
wrapper = new ReactiveMap(value, BARRIER);
break;
case Set.prototype:
wrapper = new ReactiveSet(value, BARRIER);
break;
default:
return value;
}
}
WRAPPERS.set(value, wrapper);
TARGETS.set(wrapper, value);
return wrapper;
}
return value;
}
export function unwrap(value) {
if (value !== null && typeof value === "object") {
const target = TARGETS.get(value);
if (target !== undefined) {
return target;
}
}
return value;
}
function defaultWrapInstance(value) {
return createReactiveProxy(value, BARRIER);
}
export function wrapInstancesOf(targetClass, wrap) {
Object.defineProperty(targetClass, WRAP_INSTANCE, {
configurable: true,
enumerable: false,
writable: false,
value: wrap ?? defaultWrapInstance,
});
}
//# sourceMappingURL=barrier.js.map