@tachibana-shin/diff-object
Version:
Get diff object advanced
76 lines (65 loc) • 2.87 kB
JavaScript
;Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }// src/diff.ts
var _lodashisequal = require('lodash.isequal'); var _lodashisequal2 = _interopRequireDefault(_lodashisequal);
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 (_lodashisequal2.default.call(void 0, 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
};
}
exports.KEY_ACTION = KEY_ACTION; exports.KEY_SYMBOL_ACTION = KEY_SYMBOL_ACTION; exports.KEY_SYMBOL_VALUEA = KEY_SYMBOL_VALUEA; exports.KEY_SYMBOL_VALUEB = KEY_SYMBOL_VALUEB; exports.KEY_VALUEA = KEY_VALUEA; exports.KEY_VALUEB = KEY_VALUEB; exports.diff = diff; exports.isDiffObject = isDiffObject; exports.isKeyDiffObject = isKeyDiffObject;