UNPKG

@turbox3d/reactivity

Version:

Large-scale reactive state management library

133 lines (132 loc) 4.61 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.mutation = mutation; var _shared = require("@turbox3d/shared"); var _store = require("../core/store"); var _symbol = require("../const/symbol"); var _domain = require("../core/domain"); var _enums = require("../const/enums"); function createMutation(target, name, original, config) { var stringMethodName = (0, _shared.convert2UniqueString)(name); var mutationWp = function mutationWp() { // eslint-disable-next-line @typescript-eslint/no-this-alias var _this = this; if (!target) { _this = new _domain.Domain(); } if (!_store.store) { (0, _shared.fail)('store is not ready, please init first.'); } for (var _len = arguments.length, payload = new Array(_len), _key = 0; _key < _len; _key++) { payload[_key] = arguments[_key]; } var result = _store.store.dispatch({ name: stringMethodName, displayName: config.displayName || _symbol.EMPTY_ACTION_NAME, payload: payload, type: _enums.EMaterialType.MUTATION, domain: _this, original: (0, _shared.bind)(original, _this), immediately: !!config.immediately, forceSaveHistory: !!config.forceSaveHistory, isNeedRecord: !!config.isNeedRecord }); if ((0, _shared.isPromise)(result)) { return new Promise(function (resolve, reject) { result.then(function (res) { resolve(res); }, function (err) { reject(err); }); }); } if (result && result instanceof Error) { throw result; } return result; }; mutationWp[_symbol.MATERIAL_TYPE] = _enums.EMaterialType.MUTATION; return mutationWp; } /** * decorator @mutation, update state by mutation styling. */ function mutation() { var config = { immediately: false, displayName: '', forceSaveHistory: false, isNeedRecord: true }; for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { args[_key2] = arguments[_key2]; } if (typeof args[0] === 'string' && typeof args[1] === 'function') { if (args[2] !== void 0) { config.displayName = args[2].displayName; config.immediately = args[2].immediately; config.forceSaveHistory = !!args[2].forceSaveHistory; config.isNeedRecord = !!args[2].isNeedRecord; } var name = args[0]; var original = args[1]; if (original[_symbol.MATERIAL_TYPE] === _enums.EMaterialType.MUTATION) { return original; } return createMutation(undefined, name, original, config); } var decorator = function decorator(target, name, descriptor) { // typescript only: @mutation method = () => {} if (descriptor === void 0) { var mutationFunc; return Object.defineProperty(target, name, { enumerable: true, configurable: true, get: function get() { return mutationFunc; }, set: function set(original) { if (original[_symbol.MATERIAL_TYPE] === _enums.EMaterialType.MUTATION) { mutationFunc = original; } else { mutationFunc = createMutation(target, name, original, config); } } }); } // babel/typescript: @mutation method() {} if (descriptor.value !== void 0) { var _original = descriptor.value; if (_original[_symbol.MATERIAL_TYPE] === _enums.EMaterialType.MUTATION) { descriptor.value = _original; } else { descriptor.value = createMutation(target, name, _original, config); } return descriptor; } // babel only: @mutation method = () => {} var initializer = descriptor.initializer; descriptor.initializer = function () { (0, _shared.invariant)(!!initializer, 'The initializer of the descriptor doesn\'t exist, please compile it by using babel and correspond decorator plugin.'); var original = initializer && initializer.call(this); if (original[_symbol.MATERIAL_TYPE] === _enums.EMaterialType.MUTATION) { return original; } return createMutation(target, name, original, config); }; return descriptor; }; if ((0, _shared.quacksLikeADecorator)(args)) { // @mutation // eslint-disable-next-line prefer-spread return decorator.apply(null, args); } // @mutation(args) config.displayName = args[0] || ''; config.immediately = args[1] !== void 0 ? args[1] : false; config.forceSaveHistory = args[2] !== void 0 ? args[2] : false; config.isNeedRecord = args[3] !== void 0 ? args[3] : true; return decorator; }