@turbox3d/reactivity
Version:
Large-scale reactive state management library
76 lines (75 loc) • 2.61 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.meta = void 0;
exports.reactor = reactor;
var _shared = require("@turbox3d/shared");
var _domain = require("../core/domain");
var _symbol = require("../const/symbol");
var meta = exports.meta = {
freeze: false
};
function reactor() {
var config = {
deepProxy: true,
displayName: ''
};
var decorator = function decorator(target, property, descriptor) {
var newDescriptor = {
enumerable: true,
configurable: true,
get: function get() {
var current = this;
if (config.callback) {
var f = function f() {
meta.freeze = true;
config.callback && config.callback.call(current, current, property);
meta.freeze = false;
};
!meta.freeze && f();
}
var defaultValue = descriptor && descriptor.initializer && descriptor.initializer();
return current.propertyGet(property, config, !!(descriptor && descriptor.initializer), defaultValue);
},
set: function set(newVal) {
var current = this;
current.propertySet(property, newVal, config);
}
};
// typescript only: (exp: @reactor() name: string = 'someone';)
if (descriptor === void 0) {
return Object.defineProperty(target, property, newDescriptor);
}
// babel only: (exp: @reactor() name = 'someone';)
return newDescriptor;
};
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
if ((0, _shared.isPlainObject)(args[0]) || Array.isArray(args[0]) || args[0] && args[0].constructor && (0, _shared.includes)(_domain.collectionTypes, args[0].constructor)) {
var param = args[1];
if (param) {
param.displayName !== void 0 && (config.displayName = param.displayName);
param.isNeedRecord !== void 0 && (config.isNeedRecord = param.isNeedRecord);
param.callback !== void 0 && (config.callback = param.callback);
}
var domain = new _domain.Domain();
var propKey = config.displayName || _symbol.DEFAULT_FIELD_NAME;
var ins = decorator(domain, propKey);
ins[propKey] = args[0];
return ins[propKey];
}
if ((0, _shared.quacksLikeADecorator)(args)) {
// @decorator
// eslint-disable-next-line prefer-spread
return decorator.apply(null, args);
}
// @decorator(args)
config.deepProxy = args[0] !== void 0 ? args[0] : true;
if (args[1] !== void 0) {
config.isNeedRecord = args[1];
}
config.callback = args[2];
return decorator;
}