datum-merge
Version:
Simplified diff and merging for deeply nested objects
105 lines (104 loc) • 5.13 kB
JavaScript
;
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;
}