@brighte/redux-saga-test-plan
Version:
Test Redux Saga with an easy plan
80 lines (67 loc) • 1.54 kB
JavaScript
// @flow
import parseEffect from './parseEffect';
import {
ACTION_CHANNEL,
ALL,
CALL,
CANCEL,
CANCELLED,
CPS,
FLUSH,
FORK,
GET_CONTEXT,
JOIN,
PUT,
RACE,
SELECT,
SET_CONTEXT,
TAKE,
} from '../shared/keys';
import { asEffect } from '../utils/asEffect';
export const NEXT = Object.create(null);
export const next = () => NEXT;
export const handlers = {
[]: 'actionChannel',
[](providers, value) {
if (providers.all) {
return providers.all(value, next);
}
return NEXT;
},
[]: 'call',
[]: 'cancel',
[]: 'cancelled',
[]: 'cps',
[]: 'flush',
[](providers, value) {
const effect = asEffect.fork(value);
if (providers.fork && !effect.detached) {
return providers.fork(effect, next);
}
if (providers.spawn && effect.detached) {
return providers.spawn(effect, next);
}
return NEXT;
},
[]: 'getContext',
[]: 'join',
[]: 'put',
[]: 'race',
[]: 'select',
[]: 'setContext',
[]: 'take',
};
export function provideValue(providers: Providers, value: Object) {
if (providers) {
const effectType = parseEffect(value).type;
const handler = handlers[effectType];
if (typeof handler === 'string' && handler in providers) {
const effect = asEffect[handler](value);
return providers[handler](effect, next);
}
if (typeof handler === 'function') {
return handler(providers, value);
}
}
return NEXT;
}