UNPKG

@turbox3d/reactivity

Version:

Large-scale reactive state management library

76 lines (75 loc) 2.61 kB
"use strict"; 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; }