UNPKG

datum-merge

Version:

Simplified diff and merging for deeply nested objects

86 lines (85 loc) 2.75 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) { if (lhs === rhs) return true; 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 fastGlobMatch(glob, text) { if (!glob.includes("*")) return text === glob; if (glob === "*") return typeof text === "string"; const globParts = glob.split(/\*+/g, -1); const partsLen = globParts.length; if (partsLen === 0) return !text; if (partsLen === 1) return text === globParts[0]; if (!text.startsWith(globParts[0])) return false; let textIdx = globParts[0].length; for (let i = 1; i < partsLen - 1; i++) { const nextIdx = text.indexOf(globParts[i], textIdx); if (nextIdx < 0) { return false; } textIdx = nextIdx + globParts[i].length; continue; } if (!text.endsWith(globParts[partsLen - 1])) return false; return true; } export function getGlobKeys(obj, inclPats = ["*"], exclPats) { return Object.keys(obj) .filter((k) => !inclPats || inclPats.some((g) => fastGlobMatch(g, k))) .filter((k) => !(exclPats === null || exclPats === void 0 ? void 0 : exclPats.length) || !exclPats.some((g) => fastGlobMatch(g, k))); } 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))); }