kilto
Version:
A state management system with easy async and low boilerplate.
85 lines (67 loc) • 2.46 kB
JavaScript
;
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 };
}