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
JavaScript
;
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;