"use strict"; import EventEmitter from 'event-emitter'; import {createStore, applyMiddleware} from 'redux'; import {composeReducers} from 'redux-sac'; import {effectsMiddleware} from 'redux-effex'; import {persistStore} from 'redux-persist'; export default () => { const ee = new EventEmitter(); function on (event, handler) { ee.on(event, handler); return this; } let persistOptions = {}; function withPersistence (_persistOptions) { persistOptions = _persistOptions; return this; } let reducers = [], effects = [], middlewares = []; function withReducers (..._reducers) { reducers.push(..._reducers); return this; } function withEffects (..._effects) { effects.push(..._effects); return this; } function withMiddlewares (..._middlewares) { middlewares.push(..._middlewares); return this; } function create (reset = false) { const store = createStore( composeReducers(...reducers), applyMiddleware(...middlewares, effectsMiddleware(effects)) ); const persistor = persistStore(store, persistOptions, () => ee.emit('rehydrate', store)); if (reset) persistor.purge(); return store; } return {withReducers, withMiddlewares, withEffects, withPersistence, on, create}; }