UNPKG

datum-merge

Version:

Simplified diff and merging for deeply nested objects

78 lines (77 loc) 2.46 kB
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))); }