UNPKG

@tachibana-shin/diff-object

Version:
76 lines (75 loc) 2.41 kB
// 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 };