UNPKG

@turbox3d/reactivity

Version:

Large-scale reactive state management library

120 lines (119 loc) 4.14 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.action = action; var _shared = require("@turbox3d/shared"); var _action = require("../core/action"); var _enums = require("../const/enums"); var _symbol = require("../const/symbol"); var _mutation = require("./mutation"); function createAction(target, name, original, config) { var stringMethodName = (0, _shared.convert2UniqueString)(name); var actionWp = function actionWp() { var currentAction = _action.Action.create(stringMethodName, config.displayName); var bindOriginal = (0, _shared.bind)(original, this); var wp; if (config.isWrapMutation) { wp = (0, _mutation.mutation)(name, bindOriginal, config.mutationConfig); } else { wp = bindOriginal; } for (var _len = arguments.length, payload = new Array(_len), _key = 0; _key < _len; _key++) { payload[_key] = arguments[_key]; } var result = currentAction.execute(wp, payload); if ((0, _shared.isPromise)(result)) { return new Promise(function (resolve, reject) { result.then(function (res) { currentAction.complete(); resolve(res); }, function (err) { currentAction.abort(); reject(err); }); }); } currentAction.complete(); return result; }; actionWp[_symbol.MATERIAL_TYPE] = _enums.EMaterialType.ACTION; return actionWp; } /** * decorator @action, handle undo/redo action. */ function action() { var config = { displayName: '', isWrapMutation: true, mutationConfig: undefined }; 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.isWrapMutation = args[2].isWrapMutation; config.mutationConfig = args[2].mutationConfig; } var name = args[0]; var original = args[1]; if (original[_symbol.MATERIAL_TYPE] === _enums.EMaterialType.ACTION) { return original; } return createAction(undefined, name, original, config); } var decorator = function decorator(target, name, descriptor) { // typescript only: @action method = async () => {} if (descriptor === void 0) { var actionFunc; return Object.defineProperty(target, name, { enumerable: true, configurable: true, get: function get() { return actionFunc; }, set: function set(original) { if (original[_symbol.MATERIAL_TYPE] === _enums.EMaterialType.ACTION) { actionFunc = original; } else { actionFunc = createAction(target, name, original, config); } } }); } // babel/typescript: @action method() {} if (descriptor.value !== void 0) { var _original = descriptor.value; if (_original[_symbol.MATERIAL_TYPE] === _enums.EMaterialType.ACTION) { descriptor.value = _original; } else { descriptor.value = createAction(target, name, _original, config); } return descriptor; } // babel only: @action 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.ACTION) { return original; } return createAction(target, name, original, config); }; return descriptor; }; if ((0, _shared.quacksLikeADecorator)(args)) { // @action // eslint-disable-next-line prefer-spread return decorator.apply(null, args); } // @action(args) config.displayName = args[0] || ''; config.isWrapMutation = args[1] !== void 0 ? args[1] : true; config.mutationConfig = args[2] !== void 0 ? args[2] : undefined; return decorator; }