function flattenRequestPayload<T extends RequestPayload>(
requestPayload: T,
path: string = ''
): FlattenedRequestPayload {
return Object.keys(requestPayload).reduce((acc: T, key: string): T => {
const value = requestPayload[key];
const newPath = path ? [path, key].join('.') : key;
const isNonEmptyPrimitiveArray =
Array.isArray(value) &&
value.every(v => isPrimitive(v)) &&
value.length > 0;
const isNonZeroValuePrimitive =
isPrimitive(value) && !isZeroValuePrimitive(value as Primitive);
let objectToMerge = {};
if (isPlainObject(value)) {
objectToMerge = flattenRequestPayload(value as RequestPayload, newPath);
} else if (isNonZeroValuePrimitive || isNonEmptyPrimitiveArray) {
objectToMerge = { [newPath]: value };
} else if (value && value.constructor === Uint8Array) {
objectToMerge = { [newPath]: b64Encode(value, 0, value.length) };
}
return { ...acc, ...objectToMerge };
}, {} as T) as FlattenedRequestPayload;
}