UNPKG

dareway-rui

Version:

320 lines (270 loc) 10.7 kB
'use strict'; var _interopRequireWildcard = require('@babel/runtime/helpers/interopRequireWildcard'); var _interopRequireDefault = require('@babel/runtime/helpers/interopRequireDefault'); Object.defineProperty(exports, '__esModule', { value: true }); exports.create = create; var _objectSpread2 = _interopRequireDefault(require('@babel/runtime/helpers/objectSpread')); var _redux = require('redux'); var _reduxSaga = _interopRequireDefault(require('redux-saga')); var _invariant = _interopRequireDefault(require('invariant')); var _checkModel = _interopRequireDefault(require('./checkModel')); var _prefixNamespace = _interopRequireDefault(require('./prefixNamespace')); var _Plugin = _interopRequireWildcard(require('./Plugin')); var _createStore = _interopRequireDefault(require('./createStore')); var _getSaga = _interopRequireDefault(require('./getSaga')); var _getReducer = _interopRequireDefault(require('./getReducer')); var _createPromiseMiddleware = _interopRequireDefault(require('./createPromiseMiddleware')); var _subscription = require('./subscription'); var _utils = require('./utils'); // Internal model to update global state when do unmodel var dvaModel = { namespace: '@@dva', state: 0, reducers: { UPDATE: function UPDATE(state) { return state + 1; } } }; /** * Create dva-core instance. * * @param hooksAndOpts * @param createOpts */ function create() { var hooksAndOpts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var createOpts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var initialReducer = createOpts.initialReducer, _createOpts$setupApp = createOpts.setupApp, setupApp = _createOpts$setupApp === void 0 ? _utils.noop : _createOpts$setupApp; var plugin = new _Plugin.default(); plugin.use((0, _Plugin.filterHooks)(hooksAndOpts)); var app = { _models: [(0, _prefixNamespace.default)((0, _objectSpread2.default)({}, dvaModel))], _store: null, _plugin: plugin, use: plugin.use.bind(plugin), model: model, start: start }; return app; /** * Register model before app is started. * * @param m {Object} model to register */ function model(m) { if (process.env.NODE_ENV !== 'production') { (0, _checkModel.default)(m, app._models); } var prefixedModel = (0, _prefixNamespace.default)((0, _objectSpread2.default)({}, m)); app._models.push(prefixedModel); return prefixedModel; } /** * Inject model after app is started. * * @param createReducer * @param onError * @param unlisteners * @param m */ function injectModel(createReducer, onError, unlisteners, m) { m = model(m); var store = app._store; store.asyncReducers[m.namespace] = (0, _getReducer.default)(m.reducers, m.state, plugin._handleActions); store.replaceReducer(createReducer(store.asyncReducers)); if (m.effects) { store.runSaga(app._getSaga(m.effects, m, onError, plugin.get('onEffect'))); } if (m.subscriptions) { unlisteners[m.namespace] = (0, _subscription.run)(m.subscriptions, m, app, onError); } ////////////////////////////////////////////////////////// // dva 动态扩充模型后,若不dispatch一个action,新模型不会被注册到store中.... // 不知道这是不是个bug; store.dispatch({ type: '@@dva/UPDATE' }); // ////////////////////////////////////////////////////////// } /** * Unregister model. * * @param createReducer * @param reducers * @param unlisteners * @param namespace * * Unexpected key warn problem: * https://github.com/reactjs/redux/issues/1636 */ function unmodel(createReducer, reducers, unlisteners, namespace) { var store = app._store; // Delete reducers delete store.asyncReducers[namespace]; delete reducers[namespace]; store.replaceReducer(createReducer()); store.dispatch({ type: '@@dva/UPDATE' }); // Cancel effects store.dispatch({ type: ''.concat(namespace, '/@@CANCEL_EFFECTS') }); // Unlisten subscrioptions (0, _subscription.unlisten)(unlisteners, namespace); // Delete model from app._models app._models = app._models.filter(function(model) { return model.namespace !== namespace; }); } /** * Start the app. * * @returns void */ function start() { // Global error handler var onError = function onError(err) { if (err) { if (typeof err === 'string') err = new Error(err); err.preventDefault = function() { err._dontReject = true; }; plugin.apply('onError', function(err) { throw new Error(err.stack || err); })(err, app._store.dispatch); } }; var sagaMiddleware = (0, _reduxSaga.default)(); var promiseMiddleware = (0, _createPromiseMiddleware.default)(app); app._getSaga = _getSaga.default.bind(null); var sagas = []; var reducers = (0, _objectSpread2.default)({}, initialReducer); var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for ( var _iterator = app._models[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true ) { var m = _step.value; reducers[m.namespace] = (0, _getReducer.default)(m.reducers, m.state, plugin._handleActions); if (m.effects) sagas.push(app._getSaga(m.effects, m, onError, plugin.get('onEffect'))); } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return != null) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } var reducerEnhancer = plugin.get('onReducer'); var extraReducers = plugin.get('extraReducers'); (0, _invariant.default)( Object.keys(extraReducers).every(function(key) { return !(key in reducers); }), '[app.start] extraReducers is conflict with other reducers, reducers list: '.concat( Object.keys(reducers).join(', ') ) ); // Create store var store = (app._store = (0, _createStore.default)({ // eslint-disable-line reducers: createReducer(), initialState: hooksAndOpts.initialState || {}, plugin: plugin, createOpts: createOpts, sagaMiddleware: sagaMiddleware, promiseMiddleware: promiseMiddleware })); // Extend store store.runSaga = sagaMiddleware.run; store.asyncReducers = {}; // Execute listeners when state is changed var listeners = plugin.get('onStateChange'); var _iteratorNormalCompletion2 = true; var _didIteratorError2 = false; var _iteratorError2 = undefined; try { var _loop = function _loop() { var listener = _step2.value; store.subscribe(function() { listener(store.getState()); }); }; for ( var _iterator2 = listeners[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true ) { _loop(); } // Run sagas } catch (err) { _didIteratorError2 = true; _iteratorError2 = err; } finally { try { if (!_iteratorNormalCompletion2 && _iterator2.return != null) { _iterator2.return(); } } finally { if (_didIteratorError2) { throw _iteratorError2; } } } sagas.forEach(sagaMiddleware.run); // Setup app setupApp(app); // Run subscriptions var unlisteners = {}; var _iteratorNormalCompletion3 = true; var _didIteratorError3 = false; var _iteratorError3 = undefined; try { for ( var _iterator3 = this._models[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true ) { var _model = _step3.value; if (_model.subscriptions) { unlisteners[_model.namespace] = (0, _subscription.run)(_model.subscriptions, _model, app, onError); } } // Setup app.model and app.unmodel } catch (err) { _didIteratorError3 = true; _iteratorError3 = err; } finally { try { if (!_iteratorNormalCompletion3 && _iterator3.return != null) { _iterator3.return(); } } finally { if (_didIteratorError3) { throw _iteratorError3; } } } app.model = injectModel.bind(app, createReducer, onError, unlisteners); app.unmodel = unmodel.bind(app, createReducer, reducers, unlisteners); /** * Create global reducer for redux. * * @returns {Object} */ function createReducer() { return reducerEnhancer( (0, _redux.combineReducers)( (0, _objectSpread2.default)({}, reducers, extraReducers, app._store ? app._store.asyncReducers : {}) ) ); } } } //@ sourceMappingURL=index.js.map