map-transform
Version:
Map and transform objects with mapping definitions
33 lines • 1.33 kB
JavaScript
import { setTargetOnState, goForward } from '../utils/stateHelpers.js';
import { defToDataMapper } from '../utils/definitionHelpers.js';
import { ensureArray } from '../utils/array.js';
const getLogicalFn = (operator) => operator === 'OR'
? (a, b) => Boolean(a) || Boolean(b)
: (a, b) => Boolean(a) && Boolean(b);
const transformer = function logical({ path = '.', operator = 'AND', }) {
return (options) => {
const pathArr = ensureArray(path);
const getFns = pathArr.map((path) => defToDataMapper(path, options));
const setFns = pathArr.map((path) => defToDataMapper(`>${path}`, options));
const logicalOp = getLogicalFn(operator);
return async (data, state) => {
if (state.rev) {
const value = Boolean(data);
let obj;
for (const setFn of setFns) {
obj = await setFn(value, setTargetOnState(goForward(state), obj));
}
return obj;
}
else {
const values = [];
for (const getFn of getFns) {
values.push(await getFn(data, state));
}
return values.reduce(logicalOp);
}
};
};
};
export default transformer;
//# sourceMappingURL=logical.js.map