import get from 'lodash/object/get'; import isError from 'lodash/lang/isError'; import keyMirror from 'fbjs/lib/keyMirror'; export function actionGenerator(displayName, actions) { if (process.env.NODE_ENV === 'development') { Object.keys(actions).forEach(actionName => { if (actions[actionName]) { console.assert(/regeneratorRuntime\.async/.test(actions[actionName].toString()), `${displayName}.${actionName} should be async function`); } }); } return Object.assign((context, payload) => { return new Promise(async (resolve, reject) => { const actionType = get(payload, ['type']); try { const action = actions[actionType]; if (!action) { reject(new Error(`No action responded to ${displayName}.`)); } else { console.info(`execute ${displayName}.${actionType}`); resolve(await action({context, payload})); } } catch (error) { if (isError(error)) { // Normal Error reject(Object.assign(error, {message: `${error.message} (${displayName}.${actionType})`})); } else { // Network Error const message = `${error.status} ${error.statusText}`; reject(new Error(message)); } } }); }, {displayName, actionTypes: keyMirror(actions)}); }