UNPKG

@turbox3d/reactivity

Version:

Large-scale reactive state management library

127 lines 4.42 kB
import { bind, convert2UniqueString, isPromise, invariant, fail, quacksLikeADecorator } from '@turbox3d/shared'; import { store } from '../core/store'; import { EMPTY_ACTION_NAME, MATERIAL_TYPE } from '../const/symbol'; import { Domain } from '../core/domain'; import { EMaterialType } from '../const/enums'; function createMutation(target, name, original, config) { var stringMethodName = convert2UniqueString(name); var mutationWp = function mutationWp() { // eslint-disable-next-line @typescript-eslint/no-this-alias var _this = this; if (!target) { _this = new Domain(); } if (!store) { 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.dispatch({ name: stringMethodName, displayName: config.displayName || EMPTY_ACTION_NAME, payload: payload, type: EMaterialType.MUTATION, domain: _this, original: bind(original, _this), immediately: !!config.immediately, forceSaveHistory: !!config.forceSaveHistory, isNeedRecord: !!config.isNeedRecord }); if (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[MATERIAL_TYPE] = EMaterialType.MUTATION; return mutationWp; } /** * decorator @mutation, update state by mutation styling. */ export 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[MATERIAL_TYPE] === 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[MATERIAL_TYPE] === 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[MATERIAL_TYPE] === 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 () { 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[MATERIAL_TYPE] === EMaterialType.MUTATION) { return original; } return createMutation(target, name, original, config); }; return descriptor; }; if (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; }