packages/jsii-config/lib/util.ts (52 lines of code) (raw):

import { readFile } from 'fs'; /* * Look for existing nested values in config, return undefined if not found */ export function getNestedValue( keys: string[], current: Record<string, unknown>, ): any { try { return keys.reduce((val: any, key: string) => val[key], current); } catch { return undefined; } } /* * recursively remove keys from object whose value empty. */ export function removeEmptyValues<T>(fields: T): T { return Object.entries(fields).reduce( (accum: any, [key, val]: [string, any]) => { if (typeof val === 'object') { return { ...accum, [key]: removeEmptyValues(val), }; } return { ...accum, ...(!val ? {} : { [key]: val, }), }; }, {}, ); } /* * recursively flatten nested object */ export function flattenKeys(parent: string, fields: any) { return Object.entries(fields).reduce( (accum: any, [key, vals]: [string, any]) => ({ ...accum, [`${parent}.${key}`]: vals, }), {}, ); } /** * utility for for fs.readFile as a promise * * TODO: use util.promisify without breaking test stub */ export async function readFilePromise(path: string): Promise<Buffer> { const result: Buffer = await new Promise((resolve, reject) => { readFile(path, (err, data) => { if (err) { return reject(err); } return resolve(data); }); }); return result; }