UNPKG

datum-merge

Version:

Simplified diff and merging for deeply nested objects

105 lines (104 loc) 5.13 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.updateCodeInfo = updateCodeInfo; exports.shallowMerge = shallowMerge; exports.immutableMerge = immutableMerge; exports.deepMerge = deepMerge; exports.immutableDeepMerge = immutableDeepMerge; exports.diffFromMerge = diffFromMerge; exports.patchFromMerge = patchFromMerge; const type_utils_1 = require("./type-utils"); const datum_utils_1 = require("./datum-utils"); const merge_low_1 = require("./merge-low"); const diff_high_1 = require("./diff-high"); const patch_low_1 = require("./patch-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, }; } 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; } function immutableMerge(target, source, scalarCode, vectorCode) { const targetCopy = (0, datum_utils_1.deepClone)(target); shallowMerge(targetCopy, source, scalarCode, vectorCode); return targetCopy; } ; 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])) { changed = (0, merge_low_1.mergeVectorField)(target, source, label, vectorCode) || changed; 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) { changed = (0, merge_low_1.mergeScalarField)(target, source, label, scalarCode) || changed; continue; } changed = deepMerge(target[label], source[label], nestedCode.startsWith("X") ? scalarCode : nestedCode, nestedCode.startsWith("X") ? nestedCode : vectorCode, nestedCode) || changed; continue; } changed = (0, merge_low_1.mergeScalarField)(target, source, label, scalarCode) || changed; } return changed; } 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; } ; 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; } function patchFromMerge(target, source, scalarCode, vectorCode, nestedCode, orderInd = false) { const targetCopy = immutableDeepMerge(target, source, scalarCode, vectorCode, nestedCode); const patch = (0, patch_low_1.deepPatchLog)(target, targetCopy, orderInd, true); return !(patch === null || patch === void 0 ? void 0 : patch.length) ? false : patch; }