typesafe-actions-reducer-builder
Version:
Reducer builder for typesafe-actions, including immer for reducer's output
55 lines • 2.17 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
var immer_1 = __importDefault(require("immer"));
// Implementation
/**
* Create a reducer builder, starting from its state.
* It supports multiple actions (from typesafe-actions) with multiple reducers.
* When the reducers are all set, just call build() to create the root reducer.
*
* It uses immer, which will produce an Immutable<TState> object as the result
* of the reducer. The developer should edit the state in the reducer, instead
* of creating a new one: immer will take care of creating a new object.
*
* The builder will provide type hints along all the build structure, lowering
* the possibility of creating bugs.
*
* @param initialState the reducer's initial state
*/
function createReducerBuilder(initialState) {
var reducersMap = {};
var rootReducer = function (state, action) {
if (state === void 0) { state = initialState; }
var reducers = reducersMap[action.type] || [];
reducers.forEach(function (reducer) {
state = reducer(state, action);
});
return state;
};
var build = function () { return immer_1.default(rootReducer); };
var reducerBuilder = {};
var handlerBuilder = function (actionCreatorBuilder) {
var handler = {};
// Get the action's type
var type = actionCreatorBuilder(null, null).type;
var addReducer = function (reducer) {
if (!(type in reducersMap)) {
reducersMap[type] = [];
}
reducersMap[type].push(reducer);
return handler;
};
handler.reducer = addReducer;
handler.handle = handlerBuilder;
handler.build = build;
return handler;
};
reducerBuilder.build = build;
reducerBuilder.handle = handlerBuilder;
return reducerBuilder;
}
exports.default = createReducerBuilder;
//# sourceMappingURL=createReducerBuilder.js.map