export interface CompareItem {
    name: string;
    oldValue: any;
    newValue: any;
}
/**
 * @description Вернёт массив: результат сравнения. Результат сравнения из себя представляет название поля, которые
 * отличаются от исходного объекта. Если поле N присутствует в newValue и присутствует в объекте oldValue и его значение
 * в этих объектах идентичное - данное поле не будет возвращено в результате работы данной функции. В любых иных случаях:
 * В новом объекте поле есть, а в старом нет (поле было добавлено) или в старом объекте поле есть, а в новом нет (поле
 * было удалено) - поле будет выведено в результате.
 *
 * @problem Что произойдёт если во вложенном объекте будет изменение? В таком случае мы всё-равно генерируем event
 * в котором уведомляем, что всё значение было изменено. Это не проблема. Если один из дочерних элементов был изменён, то
 * и родительский тоже. Дальше можно рекурсивно пройтись и узнать что именно было изменено. В худшем случае можно расширить
 * CompareItem и добавить туда difference: [], с массивом изменённых полей.
 *
 * @param {Object} newValue объект новых(исходных) значений
 * @param {Object} oldValue объект старых значений
 */
export declare function compareDifference(oldValue: unknown, newValue: unknown): CompareItem[];
/**
 *
 *
 * @param sourceValue Исходные объект
 * @param changes Изменения, которые были внесены в исходный объект.
 * @description В отличии от предыдущей функции, данная функция принимает изменения и объект, на который будут
 * производиться изменения. Из этого можно сделать вывод, что второй объект необходим лишь для двух вещей:
 * 1. Было ли поле изменено. В случае, если в изменениях пришло {name: "J"}, а в объекте и так было поле {name: "J"}, то
 * данное поле не будет помечено, как изменённое.
 * 2. Чтобы получить старое значение. (oldValue)
 * То есть мы уже имеем набор изменений, на полноценное сравнивать два объекта не надо, а лишь надо спроецировать первый
 * (изменения) на второй и сравнить, какие именно изменения будут произведены.
 *
 * Также нужно помнить, что изменения лишь проецируются на исходные значения. Иными словами, если
 * исходные значения {coordinate: {x: 1}}
 * изменения: {coordinate: {y: 2}}
 * результирующий объект(который предполагается): { coordinate: { x: 1, y: 2 } }
 * и в данном случае мы получаем, что у нас два изменения:
 * [
 *  { name: 'coordinate', newValue: { x: 1, y: 2 }, oldValue: { x: 1 } },
 *  { name: 'coordinate.y', newValue: 2, oldValue: undefined }
 * ]
 * */
export declare function compareMergeChanges(sourceValue: any, changes: any): CompareItem[];
export declare function compareDTO(name: string, newValue: any, oldValue: any): CompareItem;
