export interface TranslationRes { [x: string]: string | TranslationRes; } /** * Recursively flattens a JSON object using dot notation. * * NOTE: input must be an object as described by JSON spec. Arbitrary * JS objects (e.g. {a: () => 42}) may result in unexpected output. * MOREOVER, it removes keys with empty objects/arrays as value (see * examples bellow). * * @example * flattenTranslation({a: 1, b: [{c: 2, d: {e: 3}}, 4]}) * // {a: 1, b.0.c: 2, b.0.d.e: 3, b.1: 4} * flattenTranslation({a: 1, b: [{c: 2, d: {e: [true, false, {f: 1}]}}]}) * // {a: 1, b.0.c: 2, b.0.d.e.0: true, b.0.d.e.1: false, b.0.d.e.2.f: 1} * flattenTranslation({a: 1, b: [], c: {}}) * // {a: 1} * * @param obj item to be flattened */ export const flattenTranslation = ( obj: string | TranslationRes, path?: string ): TranslationRes => { if (!(obj instanceof Object)) return { [path ?? '']: obj }; return Object.keys(obj).reduce((output, key) => { return Object.assign( output, flattenTranslation(obj[key], path ? path + '.' + key : key) ); }, {}); };