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