datum-merge
Version:
Simplified diff and merging for deeply nested objects
78 lines (77 loc) • 2.46 kB
JavaScript
import { cloneDeep, get } from "lodash-es";
import equal from 'fast-deep-equal';
export function getObjectKeys(obj, excludeKeys, includeKeys) {
if (!obj) {
return [];
}
let sourceKeys = Object.keys(obj);
if (includeKeys && !!includeKeys.length) {
includeKeys.filter((k) => !sourceKeys.includes(k))
.forEach((k) => sourceKeys.push(k));
}
if (excludeKeys && !!excludeKeys.length) {
sourceKeys = sourceKeys.filter((k) => !excludeKeys.includes(k));
}
return sourceKeys;
}
;
export function createValueKeys(keys, value) {
return Object.fromEntries(keys.map((k) => [k, value]));
}
export function deepEquals(lhs, rhs) {
return equal(lhs, rhs);
}
export function deepEqualsPath(lhs, rhs, atPath) {
return equal(get(lhs, atPath), get(rhs, atPath));
}
export function deepClone(val) {
return cloneDeep(val);
}
export function toUniqueArray(arr) {
return [...new Set(arr)];
}
export function areArraysEqual(arr1, arr2) {
if (arr1 == null && arr2 == null)
return true;
if (arr1 == null || arr2 == null)
return false;
if (arr1.length !== arr2.length)
return false;
for (let i = 0; i < arr1.length; i++) {
if (arr1[i] !== arr2[i]) {
return false;
}
}
return true;
}
export function createGlobRegex(search) {
const pattern = search.replace(/\*/g, ".+");
return new RegExp(`^${pattern}$`);
}
export function getGlobKeys(obj, includePats = ["*"], excludeKeys) {
const includeKeys = [];
if (!obj || !(includePats === null || includePats === void 0 ? void 0 : includePats.length)) {
return includeKeys;
}
const labels = getObjectKeys(obj, excludeKeys);
if (!labels || !labels.length) {
return includeKeys;
}
const globPats = includePats.filter((s) => s.includes("*"))
.map((g) => createGlobRegex(g));
for (const label of labels) {
if (includePats.includes(label)) {
includeKeys.push(label);
}
else if (globPats.findIndex((r) => r.test(label)) >= 0) {
includeKeys.push(label);
}
}
return includeKeys;
}
export function selectObjKeys(obj, includeKeys) {
if (!(includeKeys === null || includeKeys === void 0 ? void 0 : includeKeys.length))
return Object.assign({}, obj);
return Object.fromEntries(Object.entries(obj)
.filter(([k, _]) => includeKeys.includes(k)));
}