softkave-js-utils
Version:
JavaScript & Typescript utility functions, types, and classes
62 lines • 1.85 kB
JavaScript
/* eslint-disable @typescript-eslint/no-explicit-any */
/* eslint-disable @typescript-eslint/ban-types */
import { isFunction, pick } from 'lodash-es';
import { cast } from '../other/index.js';
export function getExtractFields(data, finalizeFn) {
const keys = Object.keys(data);
return keys.reduce((paths, key) => {
const value = data[key];
if (isFunction(value)) {
paths.scalarFieldsWithTransformers.push({
property: key,
transformer: value,
});
}
else {
paths.scalarFields.push(key);
}
return paths;
}, {
scalarFields: [],
scalarFieldsWithTransformers: [],
object: cast({}),
extraArgs: cast({}),
result: cast({}),
finalize: finalizeFn,
});
}
export function extractFields(data, paths, extraArgs) {
let result = pick(data, paths.scalarFields);
paths.scalarFieldsWithTransformers.forEach(({ property, transformer }) => {
const propValue = data[property];
if (propValue === undefined) {
return;
}
result[property] =
propValue === null ? null : transformer(propValue, extraArgs, data);
});
if (paths.finalize) {
result = paths.finalize(data, result, extraArgs);
}
return result;
}
// TODO: make extract simpler
export function makeExtract(fields) {
const fn = (data) => {
return extractFields(data, fields);
};
return fn;
}
export function makeExtractIfPresent(fields) {
const fn = (data) => {
return data && extractFields(data, fields);
};
return fn;
}
export function makeListExtract(fields) {
const fn = (data) => {
return data.map(datum => extractFields(datum, fields));
};
return fn;
}
//# sourceMappingURL=extract.js.map