UNPKG

@tachibana-shin/diff-object

Version:
76 lines (65 loc) 2.87 kB
"use strict";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;