UNPKG

kilto

Version:

A state management system with easy async and low boilerplate.

85 lines (67 loc) 2.46 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = createStore; var _isPromise = require('./util/isPromise'); var _isPromise2 = _interopRequireDefault(_isPromise); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } // TODO: middleware support function createStore(initialState) { var state = initialState; var subscribers = []; var getState = function getState() { return state; }; var updateState = function updateState(newState) { if (newState === state) return state; state = newState; subscribers.forEach(function (subscriber) { subscriber(state); }); return state; }; var unsubscribe = function unsubscribe(cb) { var i = subscribers.indexOf(cb); if (i > -1) { subscribers.splice(i, 1); } }; var subscribe = function subscribe(cb) { subscribers.push(cb); return function () { return unsubscribe(cb); }; }; var dispatch = function dispatch(actionsArg) { for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } if (actionsArg === null || actionsArg === undefined) { throw new TypeError('The first argument of dispatch must be a function or array.'); } var actions = Array.isArray(actionsArg) ? actionsArg : [actionsArg]; var action = actions[0]; var result = action.apply(undefined, [state].concat(args)); if (actions.length > 1) { if ((0, _isPromise2.default)(result)) { result.then(function (asyncResult) { dispatch.apply(undefined, [actions.slice(1), asyncResult].concat(args)); }).catch(function (error) { console.error('Error encountered in action promise. Action was ignored.', error, action.name); }); } else { dispatch.apply(undefined, [actions.slice(1), result].concat(args)); } } else { if ((0, _isPromise2.default)(result) || result === null || result === undefined) { throw new Error('The last function in an action must be a syncrounous pure function of state (not a Promise)! Offending action is ' + action.name + '.'); } updateState(result); } }; var reset = function reset() { return updateState(initialState); }; return { getState: getState, subscribe: subscribe, reset: reset, dispatch: dispatch }; }