UNPKG

@aomi/webapp-cli

Version:

a web app cli

90 lines (75 loc) 2.08 kB
import { applyMiddleware, bindActionCreators, combineReducers, compose, createStore } from 'redux'; import { combineEpics, createEpicMiddleware } from 'redux-observable'; import * as commonReducers from '../reducers'; import * as commonEpics from '../epics'; import * as actionTypes from '../constants/ActionTypes'; const data: any = {}; function getPayload(args) { if (args.length === 0) { return null; } else if (args.length === 1) { return args[0]; } return args; } /** * @author Sean(sean.snow@live.com) * @date 2016/12/19 */ export function create(reducers, epics, middlewares: Array<any>) { const rootReducers = combineReducers({ ...commonReducers, ...reducers }); const newEpics = { ...commonEpics }; Object.keys(epics).forEach(typeKey => { if (commonEpics[typeKey]) { newEpics[typeKey] = { ...commonEpics[typeKey], ...epics[typeKey] } } else { newEpics[typeKey] = epics[typeKey]; } }); const appEpics: Array<any> = []; Object.keys(newEpics) .forEach(typeKey => Object.keys(newEpics[typeKey]) .forEach(epicKey => appEpics.push(newEpics[typeKey][epicKey]))); const rootEpics = combineEpics(...appEpics); const epicMiddleware = createEpicMiddleware(); data.store = createStore( rootReducers, compose( applyMiddleware( ...middlewares, epicMiddleware ) ) ); epicMiddleware.run(rootEpics); let actions = {}; Object.keys(actionTypes).forEach(action => Object.keys(actionTypes[action]).forEach(type => { if (!actions[action]) { actions[action] = {}; } actions[action][type] = bindActionCreators((...args) => ({ type: actionTypes[action][type], payload: getPayload(args) }), data.store.dispatch); })); data.actions = actions; (global as any).actions = actions; return data.store; } export function getState() { return data.store.getState(); } export function dispatch(...args) { data.store.dispatch(...args); } export function getActions() { return data.actions; }