@formily/reactive
Version:
> Web Reactive Library Like Mobx
122 lines • 3.76 kB
JavaScript
import { isFn, isCollectionType, isNormalType } from './checkers';
import { RawProxy, ProxyRaw, MakeObModelSymbol, RawShallowProxy, } from './environment';
import { baseHandlers, collectionHandlers } from './handlers';
import { buildDataTree, getDataNode } from './tree';
import { isSupportObservable } from './externals';
var createNormalProxy = function (target, shallow) {
var proxy = new Proxy(target, baseHandlers);
ProxyRaw.set(proxy, target);
if (shallow) {
RawShallowProxy.set(target, proxy);
}
else {
RawProxy.set(target, proxy);
}
return proxy;
};
var createCollectionProxy = function (target, shallow) {
var proxy = new Proxy(target, collectionHandlers);
ProxyRaw.set(proxy, target);
if (shallow) {
RawShallowProxy.set(target, proxy);
}
else {
RawProxy.set(target, proxy);
}
return proxy;
};
var createShallowProxy = function (target) {
if (isNormalType(target))
return createNormalProxy(target, true);
if (isCollectionType(target))
return createCollectionProxy(target, true);
// never reach
return target;
};
export var createObservable = function (target, key, value, shallow) {
if (typeof value !== 'object')
return value;
var raw = ProxyRaw.get(value);
if (!!raw) {
var node = getDataNode(raw);
if (!node.target)
node.target = target;
node.key = key;
return value;
}
if (!isSupportObservable(value))
return value;
if (target) {
var parentRaw = ProxyRaw.get(target) || target;
var isShallowParent = RawShallowProxy.get(parentRaw);
if (isShallowParent)
return value;
}
buildDataTree(target, key, value);
if (shallow)
return createShallowProxy(value);
if (isNormalType(value))
return createNormalProxy(value);
if (isCollectionType(value))
return createCollectionProxy(value);
// never reach
return value;
};
export var createAnnotation = function (maker) {
var annotation = function (target) {
return maker({ value: target });
};
if (isFn(maker)) {
annotation[MakeObModelSymbol] = maker;
}
return annotation;
};
export var getObservableMaker = function (target) {
if (target[MakeObModelSymbol]) {
if (!target[MakeObModelSymbol][MakeObModelSymbol]) {
return target[MakeObModelSymbol];
}
return getObservableMaker(target[MakeObModelSymbol]);
}
};
export var createBoundaryFunction = function (start, end) {
function boundary(fn) {
var results;
try {
start();
if (isFn(fn)) {
results = fn();
}
}
finally {
end();
}
return results;
}
boundary.bound = createBindFunction(boundary);
return boundary;
};
export var createBindFunction = function (boundary) {
function bind(callback, context) {
return (function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
return boundary(function () { return callback.apply(context, args); });
});
}
return bind;
};
export var createBoundaryAnnotation = function (start, end) {
var boundary = createBoundaryFunction(start, end);
var annotation = createAnnotation(function (_a) {
var target = _a.target, key = _a.key;
target[key] = boundary.bound(target[key], target);
return target;
});
boundary[MakeObModelSymbol] = annotation;
boundary.bound[MakeObModelSymbol] = annotation;
return boundary;
};
//# sourceMappingURL=internals.js.map