@formily/reactive
Version:
> Web Reactive Library Like Mobx
276 lines • 11.6 kB
JavaScript
"use strict";
var __read = (this && this.__read) || function (o, n) {
var m = typeof Symbol === "function" && o[Symbol.iterator];
if (!m) return o;
var i = m.call(o), r, ar = [], e;
try {
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
}
catch (error) { e = { error: error }; }
finally {
try {
if (r && !r.done && (m = i["return"])) m.call(i);
}
finally { if (e) throw e.error; }
}
return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
if (ar || !(i in from)) {
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
ar[i] = from[i];
}
}
return to.concat(ar || Array.prototype.slice.call(from));
};
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.baseHandlers = exports.collectionHandlers = void 0;
var reaction_1 = require("./reaction");
var environment_1 = require("./environment");
var externals_1 = require("./externals");
var internals_1 = require("./internals");
var wellKnownSymbols = new Set(Object.getOwnPropertyNames(Symbol).reduce(function (buf, key) {
if (key === 'arguments' || key === 'caller')
return buf;
var value = Symbol[key];
if (typeof value === 'symbol')
return buf.concat(value);
return buf;
}, []));
var hasOwnProperty = Object.prototype.hasOwnProperty;
function findObservable(target, key, value) {
var observableObj = environment_1.RawProxy.get(value);
if (observableObj) {
return observableObj;
}
if (!(0, externals_1.isObservable)(value) && (0, externals_1.isSupportObservable)(value)) {
return (0, internals_1.createObservable)(target, key, value);
}
return value;
}
function patchIterator(target, key, iterator, isEntries) {
var originalNext = iterator.next;
iterator.next = function () {
var _a = originalNext.call(iterator), done = _a.done, value = _a.value;
if (!done) {
if (isEntries) {
value[1] = findObservable(target, key, value[1]);
}
else {
value = findObservable(target, key, value);
}
}
return { done: done, value: value };
};
return iterator;
}
var instrumentations = (_a = {
has: function (key) {
var target = environment_1.ProxyRaw.get(this);
var proto = Reflect.getPrototypeOf(this);
(0, reaction_1.bindTargetKeyWithCurrentReaction)({ target: target, key: key, type: 'has' });
return proto.has.apply(target, arguments);
},
get: function (key) {
var target = environment_1.ProxyRaw.get(this);
var proto = Reflect.getPrototypeOf(this);
(0, reaction_1.bindTargetKeyWithCurrentReaction)({ target: target, key: key, type: 'get' });
return findObservable(target, key, proto.get.apply(target, arguments));
},
add: function (key) {
var target = environment_1.ProxyRaw.get(this);
var proto = Reflect.getPrototypeOf(this);
var hadKey = proto.has.call(target, key);
// forward the operation before queueing reactions
var result = proto.add.apply(target, arguments);
if (!hadKey) {
(0, reaction_1.runReactionsFromTargetKey)({ target: target, key: key, value: key, type: 'add' });
}
return result;
},
set: function (key, value) {
var target = environment_1.ProxyRaw.get(this);
var proto = Reflect.getPrototypeOf(this);
var hadKey = proto.has.call(target, key);
var oldValue = proto.get.call(target, key);
// forward the operation before queueing reactions
var result = proto.set.apply(target, arguments);
if (!hadKey) {
(0, reaction_1.runReactionsFromTargetKey)({ target: target, key: key, value: value, type: 'add' });
}
else if (value !== oldValue) {
(0, reaction_1.runReactionsFromTargetKey)({ target: target, key: key, value: value, oldValue: oldValue, type: 'set' });
}
return result;
},
delete: function (key) {
var target = environment_1.ProxyRaw.get(this);
var proto = Reflect.getPrototypeOf(this);
var hadKey = proto.has.call(target, key);
var oldValue = proto.get ? proto.get.call(target, key) : undefined;
// forward the operation before queueing reactions
var result = proto.delete.apply(target, arguments);
if (hadKey) {
(0, reaction_1.runReactionsFromTargetKey)({ target: target, key: key, oldValue: oldValue, type: 'delete' });
}
return result;
},
clear: function () {
var target = environment_1.ProxyRaw.get(this);
var proto = Reflect.getPrototypeOf(this);
var hadItems = target.size !== 0;
var oldTarget = target instanceof Map ? new Map(target) : new Set(target);
// forward the operation before queueing reactions
var result = proto.clear.apply(target, arguments);
if (hadItems) {
(0, reaction_1.runReactionsFromTargetKey)({ target: target, oldTarget: oldTarget, type: 'clear' });
}
return result;
},
forEach: function (cb) {
var _a;
var args = [];
for (var _i = 1; _i < arguments.length; _i++) {
args[_i - 1] = arguments[_i];
}
var target = environment_1.ProxyRaw.get(this);
var proto = Reflect.getPrototypeOf(this);
(0, reaction_1.bindTargetKeyWithCurrentReaction)({ target: target, type: 'iterate' });
// swap out the raw values with their observable pairs
// before passing them to the callback
var wrappedCb = function (value, key) {
var args = [];
for (var _i = 2; _i < arguments.length; _i++) {
args[_i - 2] = arguments[_i];
}
return cb.apply(void 0, __spreadArray([findObservable(target, key, value), key], __read(args), false));
};
return (_a = proto.forEach).call.apply(_a, __spreadArray([target, wrappedCb], __read(args), false));
},
keys: function () {
var target = environment_1.ProxyRaw.get(this);
var proto = Reflect.getPrototypeOf(this);
(0, reaction_1.bindTargetKeyWithCurrentReaction)({ target: target, type: 'iterate' });
return proto.keys.apply(target, arguments);
},
values: function () {
var target = environment_1.ProxyRaw.get(this);
var proto = Reflect.getPrototypeOf(this);
(0, reaction_1.bindTargetKeyWithCurrentReaction)({ target: target, type: 'iterate' });
var iterator = proto.values.apply(target, arguments);
return patchIterator(target, '', iterator, false);
},
entries: function () {
var target = environment_1.ProxyRaw.get(this);
var proto = Reflect.getPrototypeOf(this);
(0, reaction_1.bindTargetKeyWithCurrentReaction)({ target: target, type: 'iterate' });
var iterator = proto.entries.apply(target, arguments);
return patchIterator(target, '', iterator, true);
}
},
_a[Symbol.iterator] = function () {
var target = environment_1.ProxyRaw.get(this);
var proto = Reflect.getPrototypeOf(this);
(0, reaction_1.bindTargetKeyWithCurrentReaction)({ target: target, type: 'iterate' });
var iterator = proto[Symbol.iterator].apply(target, arguments);
return patchIterator(target, '', iterator, target instanceof Map);
},
Object.defineProperty(_a, "size", {
get: function () {
var target = environment_1.ProxyRaw.get(this);
var proto = Reflect.getPrototypeOf(this);
(0, reaction_1.bindTargetKeyWithCurrentReaction)({ target: target, type: 'iterate' });
return Reflect.get(proto, 'size', target);
},
enumerable: false,
configurable: true
}),
_a);
exports.collectionHandlers = {
get: function (target, key, receiver) {
// instrument methods and property accessors to be reactive
target = hasOwnProperty.call(instrumentations, key)
? instrumentations
: target;
return Reflect.get(target, key, receiver);
},
};
exports.baseHandlers = {
get: function (target, key, receiver) {
if (!key)
return;
var result = target[key]; // use Reflect.get is too slow
if (typeof key === 'symbol' && wellKnownSymbols.has(key)) {
return result;
}
(0, reaction_1.bindTargetKeyWithCurrentReaction)({ target: target, key: key, receiver: receiver, type: 'get' });
var observableResult = environment_1.RawProxy.get(result);
if (observableResult) {
return observableResult;
}
if (!(0, externals_1.isObservable)(result) && (0, externals_1.isSupportObservable)(result)) {
var descriptor = Reflect.getOwnPropertyDescriptor(target, key);
if (!descriptor ||
!(descriptor.writable === false && descriptor.configurable === false)) {
return (0, internals_1.createObservable)(target, key, result);
}
}
return result;
},
has: function (target, key) {
var result = Reflect.has(target, key);
(0, reaction_1.bindTargetKeyWithCurrentReaction)({ target: target, key: key, type: 'has' });
return result;
},
ownKeys: function (target) {
var keys = Reflect.ownKeys(target);
(0, reaction_1.bindTargetKeyWithCurrentReaction)({ target: target, type: 'iterate' });
return keys;
},
set: function (target, key, value, receiver) {
// vue2中有对数组原型重写,因此需去除此处proxy
if (key === '__proto__') {
target[key] = value;
return true;
}
var hadKey = hasOwnProperty.call(target, key);
var newValue = (0, internals_1.createObservable)(target, key, value);
var oldValue = target[key];
target[key] = newValue; // use Reflect.set is too slow
if (!hadKey) {
(0, reaction_1.runReactionsFromTargetKey)({
target: target,
key: key,
value: newValue,
oldValue: oldValue,
receiver: receiver,
type: 'add',
});
}
else if (value !== oldValue) {
(0, reaction_1.runReactionsFromTargetKey)({
target: target,
key: key,
value: newValue,
oldValue: oldValue,
receiver: receiver,
type: 'set',
});
}
return true;
},
deleteProperty: function (target, key) {
var oldValue = target[key];
delete target[key];
(0, reaction_1.runReactionsFromTargetKey)({
target: target,
key: key,
oldValue: oldValue,
type: 'delete',
});
return true;
},
};
//# sourceMappingURL=handlers.js.map