lobe-chat
1import isEqual from 'fast-deep-equal';
2import { isArray, isObject, transform } from 'lodash-es';
3
4/**
5* Compare two objects and return the difference.
6* when there are difference in array, just return the new value.
7* it's used mostly in settings
8*/
9export const difference = <T extends object>(object: T, base: T) => {
10const changes = (object: any, base: any) =>
11transform(object, (result: any, value, key) => {
12// First, check if value and base[key] are both arrays.
13// If they are arrays, we directly use isEqual to compare their values.
14if (isArray(value) && isArray(base[key])) {
15if (!isEqual(value, base[key])) {
16result[key] = value;
17}
18}
19// If they are objects, we recursively call changes to compare their values.
20else if (!isEqual(value, base[key])) {
21result[key] = isObject(value) && isObject(base[key]) ? changes(value, base[key]) : value;
22}
23});
24
25return changes(object, base);
26};
27