UNPKG

redux-restate

Version:

<div align="center"> <h1>redux-restate</h1> <br/> <img src="https://cdn.rawgit.com/theKashey/restate/1d67d86d/images/logo.svg" alt="restate" width="600" align="center"> <br/> <br/> Restate base layer. <br/> <br/> <a href="https://circlec

156 lines (122 loc) 4.82 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); 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 _symbolObservable = require('symbol-observable'); var _symbolObservable2 = _interopRequireDefault(_symbolObservable); var _shallowequal = require('shallowequal'); var _shallowequal2 = _interopRequireDefault(_shallowequal); var _observable = require('./observable'); var _observable2 = _interopRequireDefault(_observable); var _subscribe = require('./subscribe'); var _subscribe2 = _interopRequireDefault(_subscribe); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var replaceReducer = function replaceReducer() { throw new Error('Dont call replaceReducer on synthetic store.'); }; var getDispatches = function getDispatches(stores) { var result = { called: null, returnedValue: null, next: Object.keys(stores).reduce(function (acc, storeKey) { acc[storeKey] = function (event) { result.called = storeKey; result.returnedValue = stores[storeKey].dispatch(event); }; return acc; }, {}) }; return result; }; var getStates = function getStates(stores) { return Object.keys(stores).reduce(function (acc, storeKey) { acc[storeKey] = stores[storeKey] && stores[storeKey].getState(); return acc; }, {}); }; var restate = function restate(stores, createState, onDispatch) { var _ref; var initialOptions = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; var options = initialOptions; if (typeof createState !== 'function') { throw new Error('Please provide a createState function'); } if (typeof onDispatch !== 'function') { throw new Error('Please provide a onDispatch function'); } var nextState = function nextState(oldState) { return createState(getStates(stores)) || oldState; }; var currentState = nextState({}); var updatePending = false; var subscriptions = []; var _createSubscription = (0, _subscribe2.default)(), subscribe = _createSubscription.subscribe, trigger = _createSubscription.trigger; var dispatch = function dispatch(event) { var dispatchers = getDispatches(stores); onDispatch(dispatchers.next, event); if (!dispatchers.called) { console.error('No next dispatch was called at', onDispatch); throw new Error('No next dispatch called'); } return dispatchers.returnedValue; }; var getState = function getState() { return currentState; }; var areStatesEqual = function areStatesEqual(prev, next) { var areEqual = options.areStatesEqual && options.areStatesEqual(prev, next); return typeof areEqual === 'undefined' ? (0, _shallowequal2.default)(prev, next) : areEqual; }; var onStateUpdate = function onStateUpdate() { if (options.async) { if (!updatePending) { updatePending = Promise.resolve().then(function () { updatePending = null; trigger(); }); } } else if (options.onUpdate) { options.onUpdate(trigger); } else { trigger(); } }; var triggerUpdate = function triggerUpdate() { var lastState = currentState; currentState = nextState(currentState); if (!areStatesEqual(lastState, currentState)) { onStateUpdate(); } }; var initialize = function initialize() { Object.keys(stores).filter(function (key) { return stores[key]; }).forEach(function (storeKey) { return subscriptions.push(stores[storeKey].subscribe(triggerUpdate)); }); }; var unsubscribe = function unsubscribe() { subscriptions.forEach(function (unsubscribe) { return unsubscribe(); }); }; var replaceOptions = function replaceOptions(newOptions) { options = _extends({}, options, { newOptions: newOptions }); }; if (!options.noAutoSubscribe) { initialize(); } return _ref = { dispatch: dispatch, subscribe: subscribe, getState: getState, replaceReducer: replaceReducer }, _defineProperty(_ref, _symbolObservable2.default, (0, _observable2.default)(subscribe, getState)), _defineProperty(_ref, 'unsubscribe', unsubscribe), _defineProperty(_ref, 'initialize', initialize), _defineProperty(_ref, 'update', triggerUpdate), _defineProperty(_ref, 'replaceOptions', replaceOptions), _ref; }; exports.default = restate;