Home Reference Source

src/callFactory.js

import {validateCreator, validateDefinition} from './utils/validate';
import {createLogger} from './utils/logging';
import createActions from './createActions';

export default function callFactory(name, {
    namespace='global',
    defaultActions=['loading', 'error', 'success'],
    actions=createActions(`${namespace}:${name}`, defaultActions),
    logger=createLogger(`${namespace}:${name}`),
}={}) {
    const errors = validateCreator({name, actions, logger}, logger);
    const errorKeys = errors && Object.keys(errors);
    if (errorKeys && errorKeys.length) {
        throw new Error(errors[errorKeys[0]]);
    }

    return {

        name,
        actions,

        create: (definition) => {
            const createDefinition = typeof definition === 'function' ? definition : () => definition;
            const call = Object.assign(createDefinition({name, actions, logger}), {
                name,
                actions,
                logger
            });
            if (validateDefinition(call, logger)) {
                throw new Error('Invalid call');
            }
            call.dataSource = {
                // set the default actions
                ...(call.actions || {}),
                // set dataSource from the definition passed om - potentially overriding the actions
                ...(call.dataSource || {})
            };
            return call;
        },
        createActions: (actionNames) => createActions(`${namespace}:${name}`, actionNames)
    };
}