UNPKG

softkave-js-utils

Version:

JavaScript & Typescript utility functions, types, and classes

62 lines 1.85 kB
/* 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