@tachibana-shin/diff-object
Version:
Get diff object advanced
76 lines (75 loc) • 2.41 kB
JavaScript
// src/diff.ts
import isEqual from "lodash.isequal";
var KEY_SYMBOL_ACTION = Symbol("action");
var KEY_SYMBOL_VALUEA = Symbol("valueA");
var KEY_SYMBOL_VALUEB = Symbol("valueB");
var KEY_ACTION = "#@~!action";
var KEY_VALUEA = "#@~!valueA";
var KEY_VALUEB = "#@~!valueB";
function isDiffObject(diffObj, checkSymbol) {
return typeof diffObj === "object" && diffObj !== null && (checkSymbol ? KEY_SYMBOL_ACTION in diffObj && KEY_SYMBOL_VALUEA in diffObj && KEY_SYMBOL_VALUEB in diffObj : KEY_ACTION in diffObj && KEY_VALUEA in diffObj && KEY_VALUEB in diffObj);
}
function isKeyDiffObject(key) {
return typeof key === "string" && (key === KEY_ACTION || key === KEY_VALUEA || key === KEY_VALUEB) || typeof key === "symbol" && (key === KEY_SYMBOL_ACTION || key === KEY_SYMBOL_VALUEA || key === KEY_SYMBOL_VALUEB);
}
function diff(a, b, options) {
const KeyAction = (options == null ? void 0 : options.symbol) !== false ? KEY_SYMBOL_ACTION : KEY_ACTION;
const KeyValueA = (options == null ? void 0 : options.symbol) !== false ? KEY_SYMBOL_VALUEA : KEY_VALUEA;
const KeyValueB = (options == null ? void 0 : options.symbol) !== false ? KEY_SYMBOL_VALUEB : KEY_VALUEB;
const diffs = {};
const keys = /* @__PURE__ */ new Set([...Object.keys(a), ...Object.keys(b)]);
let countDiffs = 0;
for (const name of keys) {
if (!(name in a)) {
diffs[name] = {
[KeyAction]: "ADDED",
[KeyValueA]: a[name],
[KeyValueB]: b[name]
};
countDiffs++;
continue;
}
if (!(name in b)) {
diffs[name] = {
[KeyAction]: "DELETED",
[KeyValueA]: a[name],
[KeyValueB]: b[name]
};
countDiffs++;
continue;
}
if (isEqual(a[name], b[name]))
continue;
if (typeof a[name] === "object" && typeof b[name] === "object" && (options == null ? void 0 : options.deep) !== false) {
const { diffs: diffsChild, count } = diff(
a[name],
b[name],
options
);
diffs[name] = diffsChild;
countDiffs += count;
continue;
}
diffs[name] = {
[KeyAction]: "MODIFIED",
[KeyValueA]: a[name],
[KeyValueB]: b[name]
};
countDiffs++;
}
return {
diffs,
count: countDiffs
};
}
export {
KEY_ACTION,
KEY_SYMBOL_ACTION,
KEY_SYMBOL_VALUEA,
KEY_SYMBOL_VALUEB,
KEY_VALUEA,
KEY_VALUEB,
diff,
isDiffObject,
isKeyDiffObject
};