UNPKG

mobx-roof

Version:

Simple React data management by mobx.

209 lines (179 loc) 7.71 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = undefined; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _utils = require('../common/utils'); var _MobxModel = require('./MobxModel'); var _MobxModel2 = _interopRequireDefault(_MobxModel); var _globalMiddleware = require('./globalMiddleware'); var _globalMiddleware2 = _interopRequireDefault(_globalMiddleware); var _MobxRelation = require('./MobxRelation'); var _MobxRelation2 = _interopRequireDefault(_MobxRelation); var _SimpleEvent2 = require('../common/SimpleEvent'); var _SimpleEvent3 = _interopRequireDefault(_SimpleEvent2); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var MobxContext = function (_SimpleEvent) { _inherits(MobxContext, _SimpleEvent); /** * @param {Object} contextInitData * @param {Object} opts * - parentContext * - middleware * - relation * - transfer */ function MobxContext() { var contextInitData = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; var opts = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; _classCallCheck(this, MobxContext); var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(MobxContext).call(this)); _this._middleware = opts.middleware || _globalMiddleware2.default; _this._relation = opts.relation || new _MobxRelation2.default(); _this._data = (0, _utils.mapValues)(contextInitData, function (Model, name) { // Get from parent context if (typeof Model === 'string') { if (opts.parentContext) { return opts.parentContext.find(Model); } throw new Error('[@context] InitData "' + Model + '" can not find in it\'s parentContext.'); } // Get a class if ((0, _MobxModel.isMobxModelClass)(Model)) { return new Model(null, _this._middleware); } // Get an instance if (Model instanceof _MobxModel2.default) { // update model's middleware Model.middleware = _this._middleware; return Model; } throw new TypeError('[@context] ' + name + ' must instance of MobxModel or MobxModel class.'); }); // transfer middleware and relation if (opts.parentContext) { _this.transferFromParentContext(opts.parentContext, opts); } _this._addRelationMiddleware(); // trigger relation init function in async setTimeout(function () { _this._relation.triggerInit(_this); _this._relation.triggerAutorun(_this); }); return _this; } _createClass(MobxContext, [{ key: 'transferFromParentContext', value: function transferFromParentContext(parentContext, opts) { this._middleware = parentContext.middleware; // transfer customer if (opts.transfer) { opts.transfer(this, opts.parentContext); } } }, { key: '_addRelationMiddleware', value: function _addRelationMiddleware() { var _this2 = this; if (this._relationRemove) return; var hook = function hook(arg) { var fullname = _this2._findKeyByModel(arg.model) + '.' + arg.action; // exec async setTimeout(function () { _this2._relation.execInMiddleware(_extends({}, arg, { fullname: fullname, context: _this2 })); }); return arg.payload; }; this._relationRemove = this.middleware.use({ after: hook }); } }, { key: 'destroy', value: function destroy() { // remove relation middleware if (this._relationRemove) { this._relationRemove(); this._relationRemove = null; } } }, { key: 'checkMobxModels', value: function checkMobxModels(mobxModels) { var _this3 = this; if (Array.isArray(mobxModels)) { mobxModels.forEach(function (name) { if (!_this3._data[name]) { throw new Error('[@observer] Can not find data "' + name + '" in MobxContext.'); } }); } else { (0, _utils.each)(mobxModels, function (MobxModel, name) { if (_this3._data[name]) { if (!(0, _MobxModel.isMobxModelClass)(MobxModel)) { throw new TypeError('[@observer] MobxContext required MobxModel class.'); } if (!(_this3._data[name] instanceof MobxModel)) { throw new TypeError('[@observer] ' + name + ' is not instance of ' + MobxModel.name + '.'); } } else { throw new Error('[@observer] Can not find data "' + name + '" in MobxContext.'); } }); } } }, { key: 'pick', value: function pick() { var _this4 = this; for (var _len = arguments.length, keys = Array(_len), _key = 0; _key < _len; _key++) { keys[_key] = arguments[_key]; } return keys.reduce(function (obj, key) { if (!_this4._data[key]) throw new Error('[MobxContext] Can not find data "' + key + '" in MobxContext.'); obj[key] = _this4._data[key]; return obj; }, {}); } }, { key: 'find', value: function find(key) { if (!this._data[key]) throw new Error('[MobxContext] Can not find data "' + key + '" in MobxContext.'); return this._data[key]; } }, { key: '_findKeyByModel', value: function _findKeyByModel(model) { var _this5 = this; return Object.keys(this._data).find(function (key) { return _this5._data[key] === model; }); } }, { key: 'relation', set: function set(newRelation) { this._relation = newRelation; }, get: function get() { return this._relation; } }, { key: 'middleware', get: function get() { return this._middleware; } }, { key: 'data', get: function get() { return this._data; } }]); return MobxContext; }(_SimpleEvent3.default); exports.default = MobxContext; module.exports = exports['default'];