UNPKG

datum-merge

Version:

Simplified diff and merging for deeply nested objects

105 lines (104 loc) 4.92 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.diffFromMerge = exports.immutableDeepMerge = exports.deepMerge = exports.immutableMerge = exports.shallowMerge = exports.updateCodeInfo = void 0; const type_utils_1 = require("./type-utils"); const datum_utils_1 = require("./datum-utils"); const diff_high_1 = require("./diff-high"); const merge_low_1 = require("./merge-low"); function updateCodeInfo(mergeCode) { if (!(0, type_utils_1.isString)(mergeCode)) { return { enable: false }; } const allowUnset = [ merge_low_1.UpdateCode.Y, merge_low_1.UpdateCode.D, merge_low_1.UpdateCode.U, merge_low_1.UpdateCode.XR, merge_low_1.UpdateCode.XD, merge_low_1.UpdateCode.XI ].includes(mergeCode); const allowInsert = [ merge_low_1.UpdateCode.Y, merge_low_1.UpdateCode.I, merge_low_1.UpdateCode.B, merge_low_1.UpdateCode.XR, merge_low_1.UpdateCode.XM, merge_low_1.UpdateCode.XS, merge_low_1.UpdateCode.XF ].includes(mergeCode); const allowUpdate = [ merge_low_1.UpdateCode.Y, merge_low_1.UpdateCode.H, merge_low_1.UpdateCode.U, merge_low_1.UpdateCode.B, merge_low_1.UpdateCode.XR, merge_low_1.UpdateCode.XS, merge_low_1.UpdateCode.XF, merge_low_1.UpdateCode.XM, merge_low_1.UpdateCode.XI, merge_low_1.UpdateCode.XD ].includes(mergeCode); return { insert: allowInsert, update: allowUpdate, unset: allowUnset, enable: allowInsert || allowUpdate || allowUnset, }; } exports.updateCodeInfo = updateCodeInfo; function shallowMerge(target, source, scalarCode, vectorCode, excludeKeys, includeKeys) { const sourceKeys = (0, datum_utils_1.getObjectKeys)(source, excludeKeys, includeKeys); if (!(sourceKeys === null || sourceKeys === void 0 ? void 0 : sourceKeys.length)) { return false; } let changed = false; for (const label of sourceKeys) { if ((0, type_utils_1.isArrayOfAny)(target[label]) || (0, type_utils_1.isArrayOfAny)(source[label])) { if ((0, merge_low_1.mergeVectorField)(target, source, label, vectorCode !== null && vectorCode !== void 0 ? vectorCode : scalarCode)) { changed = true; } continue; } if ((0, merge_low_1.mergeScalarField)(target, source, label, scalarCode)) changed = true; } return changed; } exports.shallowMerge = shallowMerge; function immutableMerge(target, source, scalarCode, vectorCode) { const targetCopy = (0, datum_utils_1.deepClone)(target); shallowMerge(targetCopy, source, scalarCode, vectorCode); return targetCopy; } exports.immutableMerge = immutableMerge; ; function deepMerge(target, source, scalarCode, vectorCode, nestedCode) { const sourceKeys = (0, datum_utils_1.getObjectKeys)(source); if (!(sourceKeys === null || sourceKeys === void 0 ? void 0 : sourceKeys.length)) { return false; } let changed = false; for (const label of sourceKeys) { if ((0, type_utils_1.isArrayOfAny)(target[label]) || (0, type_utils_1.isArrayOfAny)(source[label])) { if ((0, merge_low_1.mergeVectorField)(target, source, label, vectorCode)) { changed = true; } continue; } if ((0, type_utils_1.isObject)(target[label]) && (0, type_utils_1.isObject)(source[label])) { if (nestedCode === merge_low_1.UpdateCode.N) continue; if (nestedCode === merge_low_1.UpdateCode.Y) { if ((0, merge_low_1.mergeScalarField)(target, source, label, scalarCode)) changed = true; continue; } if (deepMerge(target[label], source[label], nestedCode.startsWith("X") ? scalarCode : nestedCode, nestedCode.startsWith("X") ? nestedCode : vectorCode, nestedCode)) { changed = true; } continue; } if ((0, merge_low_1.mergeScalarField)(target, source, label, scalarCode)) { changed = true; } } return changed; } exports.deepMerge = deepMerge; function immutableDeepMerge(target, source, scalarCode, vectorCode, nestedCode) { const targetCopy = (0, datum_utils_1.deepClone)(target); deepMerge(targetCopy, source, scalarCode, vectorCode !== null && vectorCode !== void 0 ? vectorCode : scalarCode, nestedCode !== null && nestedCode !== void 0 ? nestedCode : scalarCode); return targetCopy; } exports.immutableDeepMerge = immutableDeepMerge; ; function diffFromMerge(target, source, scalarCode, vectorCode, nestedCode, orderInd = false) { const targetCopy = immutableDeepMerge(target, source, scalarCode, vectorCode, nestedCode); const delta = (0, diff_high_1.deepDiffTyped)(target, targetCopy, orderInd); return (0, type_utils_1.emptyObject)(delta) ? false : delta; } exports.diffFromMerge = diffFromMerge;