/* eslint-disable no-param-reassign */ import _ from 'lodash'; /** * When IPC arguments are prepared for the cross-process send, they are JSON.stringified. * We can't send ArrayBuffers or BigNumbers (what we get from proto library for dates). * @param data - data to be cleaned */ export function cleanData(data: any): any { const keys = Object.keys(data); for (let index = 0, max = keys.length; index < max; index += 1) { const key = keys[index]; const value = data[key]; if (value === null || value === undefined) { // eslint-disable-next-line no-continue continue; } // eslint-disable no-param-reassign if (_.isFunction(value.toNumber)) { // eslint-disable-next-line no-param-reassign data[key] = value.toNumber(); } else if (_.isFunction(value)) { // just skip a function which has not a toNumber function. We don't want to save a function to the db. // an attachment comes with a toJson() function delete data[key]; } else if (Array.isArray(value)) { data[key] = value.map(cleanData); } else if (_.isObject(value) && value instanceof File) { data[key] = { name: value.name, path: value.path, size: value.size, type: value.type }; } else if (_.isObject(value) && value instanceof ArrayBuffer) { window.log.error( 'Trying to save an ArrayBuffer to the db is most likely an error. This specific field should be removed before the cleanData call' ); /// just skip it continue; } else if (_.isObject(value)) { data[key] = cleanData(value); } else if (_.isBoolean(value)) { data[key] = value ? 1 : 0; } else if ( typeof value !== 'string' && typeof value !== 'number' && typeof value !== 'boolean' ) { window?.log?.info(`cleanData: key ${key} had type ${typeof value}`); } } return data; }