map-transform
Version:
Map and transform objects with mapping definitions
45 lines • 1.79 kB
JavaScript
import { defToOperation } from '../utils/definitionHelpers.js';
import { noopNext } from '../utils/stateHelpers.js';
const getPipeline = (pipelineId, { pipelines }) => (typeof pipelineId === 'string' || typeof pipelineId === 'symbol') &&
pipelines
? pipelines[pipelineId]
: undefined;
function setPipeline(id, operation, options) {
if (options.pipelines) {
options.pipelines[id] = operation;
}
}
const removeFlip = ({ flip, ...state }) => state;
function prepareAndSetPipeline(pipelineId, pipeline, options) {
if (typeof pipeline !== 'function' && pipeline) {
setPipeline(pipelineId, () => () => noopNext, options);
const operation = defToOperation(pipeline, options)(options);
setPipeline(pipelineId, () => operation, options);
}
}
export default function apply(pipelineId) {
return (options) => {
const pipeline = getPipeline(pipelineId, options);
if (!pipeline) {
const message = pipelineId
? `Failed to apply pipeline '${String(pipelineId)}'. Unknown pipeline`
: 'Failed to apply pipeline. No id provided';
throw new Error(message);
}
prepareAndSetPipeline(pipelineId, pipeline, options);
return (next) => {
const operation = getPipeline(pipelineId, options);
const fn = typeof operation === 'function'
? operation(options)(noopNext)
: undefined;
if (fn) {
setPipeline(pipelineId, () => () => fn, options);
}
return async (state) => {
const nextState = await next(state);
return fn ? fn(removeFlip(nextState)) : nextState;
};
};
};
}
//# sourceMappingURL=apply.js.map