UNPKG

@igo2/utils

Version:
87 lines 11.7 kB
import { ChangeType } from './change.interface'; import { StringUtils } from './string-utils'; export class ChangeUtils { static findChanges(obj1, obj2, ignoreKeys = []) { const items = { added: [], deleted: [], modified: [] }; if (!obj1 || !obj2) { return items; } const obj1Clone = [...obj1]; const obj2Clone = [...obj2]; for (const fromItem of obj1Clone) { const index = obj2Clone.findIndex((s) => s.id === fromItem.id); if (index === -1) { items.deleted.push({ change: { type: ChangeType.DELETED }, value: fromItem }); continue; } const toItem = obj2Clone.splice(index, 1)[0]; const fromItemClone = JSON.parse(JSON.stringify(fromItem)); const toItemClone = JSON.parse(JSON.stringify(toItem)); const keysChanged = ChangeUtils.compareObject(fromItemClone, toItemClone, undefined, ignoreKeys); if (keysChanged.length) { items.modified.push({ change: { type: ChangeType.MODIFIED, keysChanged }, value: fromItemClone, oldValue: fromItem, newValue: toItem }); } } items.added = obj2Clone.map((itemAdded) => { return { change: { type: ChangeType.ADDED }, value: itemAdded }; }); return items; } static compareObject(fromItem, toItem, baseKey, ignoreKeys = []) { const fromItemClone = JSON.parse(JSON.stringify(fromItem)); const toItemClone = JSON.parse(JSON.stringify(toItem)); const keys = new Set([ ...Object.keys(fromItem), ...Object.keys(toItem) ]); let keysChanged = []; keys.forEach((key) => { const keyString = baseKey ? `${baseKey}.${key}` : key; if (ignoreKeys.indexOf(keyString) !== -1) { return; } if (Array.isArray(fromItem[key])) { fromItem[key] = fromItem[key].join(',<br>'); } if (Array.isArray(toItem[key])) { toItem[key] = toItem[key].join(',<br>'); } if (typeof fromItem[key] === 'object' && typeof toItem[key] === 'object' && fromItem[key] !== null && toItem[key] !== null) { keysChanged = keysChanged.concat(this.compareObject(fromItem[key], toItem[key], keyString)); } else { if (fromItem[key] !== toItem[key]) { keysChanged.push({ key: keyString, oldValue: fromItemClone[key], newValue: toItemClone[key] }); fromItem[key] = StringUtils.diff(fromItem[key], toItem[key]); } } }); return keysChanged; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbmdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvdXRpbHMvc3JjL2xpYi9jaGFuZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBbUIsTUFBTSxvQkFBb0IsQ0FBQztBQUNqRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFN0MsTUFBTSxPQUFPLFdBQVc7SUFDdEIsTUFBTSxDQUFDLFdBQVcsQ0FDaEIsSUFBVyxFQUNYLElBQVcsRUFDWCxhQUF1QixFQUFFO1FBRXpCLE1BQU0sS0FBSyxHQUFvQjtZQUM3QixLQUFLLEVBQUUsRUFBRTtZQUNULE9BQU8sRUFBRSxFQUFFO1lBQ1gsUUFBUSxFQUFFLEVBQUU7U0FDYixDQUFDO1FBRUYsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ25CLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELE1BQU0sU0FBUyxHQUFRLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUNqQyxNQUFNLFNBQVMsR0FBUSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFFakMsS0FBSyxNQUFNLFFBQVEsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNqQyxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUUvRCxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNqQixLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztvQkFDakIsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxPQUFPLEVBQUU7b0JBQ3BDLEtBQUssRUFBRSxRQUFRO2lCQUNoQixDQUFDLENBQUM7Z0JBQ0gsU0FBUztZQUNYLENBQUM7WUFF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Z0JBQy9CLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJO2dCQUN0QixNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxFQUNwQixDQUFDO2dCQUNELFdBQVcsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUM5QixJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQzFELENBQUM7WUFDSixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ2xDLFdBQVcsQ0FBQyxJQUFJLENBQUM7d0JBQ2YsR0FBRyxFQUFFLFNBQVM7d0JBQ2QsUUFBUSxFQUFFLGFBQWEsQ0FBQyxHQUFHLENBQUM7d0JBQzVCLFFBQVEsRUFBRSxXQUFXLENBQUMsR0FBRyxDQUFDO3FCQUMzQixDQUFDLENBQUM7b0JBQ0gsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUMvRCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlVHlwZSwgR3JvdXBpbmdDaGFuZ2VzIH0gZnJvbSAnLi9jaGFuZ2UuaW50ZXJmYWNlJztcbmltcG9ydCB7IFN0cmluZ1V0aWxzIH0gZnJvbSAnLi9zdHJpbmctdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgQ2hhbmdlVXRpbHMge1xuICBzdGF0aWMgZmluZENoYW5nZXMoXG4gICAgb2JqMTogYW55W10sXG4gICAgb2JqMjogYW55W10sXG4gICAgaWdub3JlS2V5czogc3RyaW5nW10gPSBbXVxuICApOiBHcm91cGluZ0NoYW5nZXMge1xuICAgIGNvbnN0IGl0ZW1zOiBHcm91cGluZ0NoYW5nZXMgPSB7XG4gICAgICBhZGRlZDogW10sXG4gICAgICBkZWxldGVkOiBbXSxcbiAgICAgIG1vZGlmaWVkOiBbXVxuICAgIH07XG5cbiAgICBpZiAoIW9iajEgfHwgIW9iajIpIHtcbiAgICAgIHJldHVybiBpdGVtcztcbiAgICB9XG5cbiAgICBjb25zdCBvYmoxQ2xvbmU6IGFueSA9IFsuLi5vYmoxXTtcbiAgICBjb25zdCBvYmoyQ2xvbmU6IGFueSA9IFsuLi5vYmoyXTtcblxuICAgIGZvciAoY29uc3QgZnJvbUl0ZW0gb2Ygb2JqMUNsb25lKSB7XG4gICAgICBjb25zdCBpbmRleCA9IG9iajJDbG9uZS5maW5kSW5kZXgoKHMpID0+IHMuaWQgPT09IGZyb21JdGVtLmlkKTtcblxuICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgICBpdGVtcy5kZWxldGVkLnB1c2goe1xuICAgICAgICAgIGNoYW5nZTogeyB0eXBlOiBDaGFuZ2VUeXBlLkRFTEVURUQgfSxcbiAgICAgICAgICB2YWx1ZTogZnJvbUl0ZW1cbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0b0l0ZW0gPSBvYmoyQ2xvbmUuc3BsaWNlKGluZGV4LCAxKVswXTtcbiAgICAgIGNvbnN0IGZyb21JdGVtQ2xvbmUgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGZyb21JdGVtKSk7XG4gICAgICBjb25zdCB0b0l0ZW1DbG9uZSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodG9JdGVtKSk7XG5cbiAgICAgIGNvbnN0IGtleXNDaGFuZ2VkID0gQ2hhbmdlVXRpbHMuY29tcGFyZU9iamVjdChcbiAgICAgICAgZnJvbUl0ZW1DbG9uZSxcbiAgICAgICAgdG9JdGVtQ2xvbmUsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgaWdub3JlS2V5c1xuICAgICAgKTtcblxuICAgICAgaWYgKGtleXNDaGFuZ2VkLmxlbmd0aCkge1xuICAgICAgICBpdGVtcy5tb2RpZmllZC5wdXNoKHtcbiAgICAgICAgICBjaGFuZ2U6IHtcbiAgICAgICAgICAgIHR5cGU6IENoYW5nZVR5cGUuTU9ESUZJRUQsXG4gICAgICAgICAgICBrZXlzQ2hhbmdlZFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdmFsdWU6IGZyb21JdGVtQ2xvbmUsXG4gICAgICAgICAgb2xkVmFsdWU6IGZyb21JdGVtLFxuICAgICAgICAgIG5ld1ZhbHVlOiB0b0l0ZW1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaXRlbXMuYWRkZWQgPSBvYmoyQ2xvbmUubWFwKChpdGVtQWRkZWQpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNoYW5nZTogeyB0eXBlOiBDaGFuZ2VUeXBlLkFEREVEIH0sXG4gICAgICAgIHZhbHVlOiBpdGVtQWRkZWRcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICByZXR1cm4gaXRlbXM7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjb21wYXJlT2JqZWN0KGZyb21JdGVtLCB0b0l0ZW0sIGJhc2VLZXk/LCBpZ25vcmVLZXlzID0gW10pIHtcbiAgICBjb25zdCBmcm9tSXRlbUNsb25lID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShmcm9tSXRlbSkpO1xuICAgIGNvbnN0IHRvSXRlbUNsb25lID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0b0l0ZW0pKTtcblxuICAgIGNvbnN0IGtleXM6IGFueSA9IG5ldyBTZXQoW1xuICAgICAgLi4uT2JqZWN0LmtleXMoZnJvbUl0ZW0pLFxuICAgICAgLi4uT2JqZWN0LmtleXModG9JdGVtKVxuICAgIF0pO1xuICAgIGxldCBrZXlzQ2hhbmdlZCA9IFtdO1xuICAgIGtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBjb25zdCBrZXlTdHJpbmcgPSBiYXNlS2V5ID8gYCR7YmFzZUtleX0uJHtrZXl9YCA6IGtleTtcbiAgICAgIGlmIChpZ25vcmVLZXlzLmluZGV4T2Yoa2V5U3RyaW5nKSAhPT0gLTEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShmcm9tSXRlbVtrZXldKSkge1xuICAgICAgICBmcm9tSXRlbVtrZXldID0gZnJvbUl0ZW1ba2V5XS5qb2luKCcsPGJyPicpO1xuICAgICAgfVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodG9JdGVtW2tleV0pKSB7XG4gICAgICAgIHRvSXRlbVtrZXldID0gdG9JdGVtW2tleV0uam9pbignLDxicj4nKTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgZnJvbUl0ZW1ba2V5XSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgdHlwZW9mIHRvSXRlbVtrZXldID09PSAnb2JqZWN0JyAmJlxuICAgICAgICBmcm9tSXRlbVtrZXldICE9PSBudWxsICYmXG4gICAgICAgIHRvSXRlbVtrZXldICE9PSBudWxsXG4gICAgICApIHtcbiAgICAgICAga2V5c0NoYW5nZWQgPSBrZXlzQ2hhbmdlZC5jb25jYXQoXG4gICAgICAgICAgdGhpcy5jb21wYXJlT2JqZWN0KGZyb21JdGVtW2tleV0sIHRvSXRlbVtrZXldLCBrZXlTdHJpbmcpXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZnJvbUl0ZW1ba2V5XSAhPT0gdG9JdGVtW2tleV0pIHtcbiAgICAgICAgICBrZXlzQ2hhbmdlZC5wdXNoKHtcbiAgICAgICAgICAgIGtleToga2V5U3RyaW5nLFxuICAgICAgICAgICAgb2xkVmFsdWU6IGZyb21JdGVtQ2xvbmVba2V5XSxcbiAgICAgICAgICAgIG5ld1ZhbHVlOiB0b0l0ZW1DbG9uZVtrZXldXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZnJvbUl0ZW1ba2V5XSA9IFN0cmluZ1V0aWxzLmRpZmYoZnJvbUl0ZW1ba2V5XSwgdG9JdGVtW2tleV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4ga2V5c0NoYW5nZWQ7XG4gIH1cbn1cbiJdfQ==