differify-js
Version:
Differify allows you to get the diff between two entities (objects diff, arrays diff, date diff, functions diff, number diff, etc) very easily, quickly and in a friendly way.
89 lines • 3.86 kB
JavaScript
/*!
* Copyright(c) 2020 Fabian Roberto Orue <fabianorue@gmail.com>
* BSD Licensed
*/
import DIFF_MODES from './enums/modes';
import { buildDiff } from './property-diff-model';
import PROPERTY_STATUS from './enums/property-status';
import { valueRefEqualityComparator, arraySimpleComparator, dateComparator, toStringComparator, getConfiguredOrderedDeepArrayComparator, getConfiguredUnorderedDeepArrayComparator, getConfiguredDeepObjectComparator, JSONStringComparator, } from './comparators';
export default function comparatorSelector() {
//types
const typeMap = {
string: null,
number: null,
boolean: null,
function: null,
object: null,
};
const deepTypeMap = {};
//comparator selectors
function multipleComparatorSelector(a, b) {
if (a === b) {
return buildDiff(a, b, PROPERTY_STATUS.EQUAL);
}
const aType = typeof a;
const bType = typeof b;
if (aType !== bType) {
return buildDiff(a, b, PROPERTY_STATUS.MODIFIED, 1);
}
const comparator = typeMap[aType];
return comparator ? comparator(a, b) : valueRefEqualityComparator(a, b);
}
function deepComparatorSelector(a, b) {
// checks array => date => object
const aType = Object.prototype.toString.call(a);
const bType = Object.prototype.toString.call(b);
if (aType === bType) {
const comparator = deepTypeMap[aType];
return comparator ? comparator(a, b) : valueRefEqualityComparator(a, b);
}
return buildDiff(a, b, PROPERTY_STATUS.MODIFIED, 1);
}
function configure(config) {
const objectComp = {};
objectComp[DIFF_MODES.DIFF] = getConfiguredDeepObjectComparator(multipleComparatorSelector);
objectComp[DIFF_MODES.REFERENCE] = (a, b) => {
const pDiff = valueRefEqualityComparator(a, b);
return buildDiff(a, b, pDiff.status, pDiff.changes);
};
objectComp[DIFF_MODES.STRING] = (a, b) => {
const pDiff = JSONStringComparator(a, b);
return buildDiff(a, b, pDiff.status, pDiff.changes);
};
const arrayComp = {};
//TODO: si el modo es deepUnorderedArrayComparator entonces el comparar objetos
//dentro del array, debe ser no deep STRING mode
arrayComp[DIFF_MODES.DIFF] = config.compareArraysInOrder
? getConfiguredOrderedDeepArrayComparator(multipleComparatorSelector)
: getConfiguredUnorderedDeepArrayComparator(multipleComparatorSelector);
arrayComp[DIFF_MODES.REFERENCE] = (a, b) => {
const pDiff = valueRefEqualityComparator(a, b);
return buildDiff(a, b, pDiff.status, pDiff.changes);
};
arrayComp[DIFF_MODES.STRING] = (a, b) => {
const pDiff = arraySimpleComparator(a, b);
return buildDiff(a, b, pDiff.status, pDiff.changes);
};
const functionComp = {};
functionComp[DIFF_MODES.REFERENCE] = valueRefEqualityComparator;
functionComp[DIFF_MODES.STRING] = toStringComparator;
typeMap.string = valueRefEqualityComparator;
typeMap.number = valueRefEqualityComparator;
typeMap.boolean = valueRefEqualityComparator;
typeMap.function = functionComp[config.mode.function];
typeMap.object = deepComparatorSelector;
deepTypeMap['[object Array]'] = arrayComp[config.mode.array];
deepTypeMap['[object Date]'] = dateComparator;
deepTypeMap['[object Object]'] = objectComp[config.mode.object];
}
function getComparatorByType(type) {
return typeMap[type];
}
return {
multipleComparatorSelector,
deepComparatorSelector,
getComparatorByType,
configure,
};
}
//# sourceMappingURL=comparator-selector.js.map