@circuitly/diff
Version:
A javascript text diff implementation.
86 lines (84 loc) • 12.4 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.canonicalize = canonicalize;
exports.diffJson = diffJson;
exports.jsonDiff = void 0;
var _base = _interopRequireDefault(require("./base"));
var _line = require("./line");
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
var jsonDiff = exports.jsonDiff = new _base["default"]();
// Discriminate between two lines of pretty-printed, serialized JSON where one of them has a
// dangling comma and the other doesn't. Turns out including the dangling comma yields the nicest output:
jsonDiff.useLongestToken = true;
jsonDiff.tokenize = _line.lineDiff.tokenize;
jsonDiff.castInput = function (value, options) {
var undefinedReplacement = options.undefinedReplacement,
_options$stringifyRep = options.stringifyReplacer,
stringifyReplacer = _options$stringifyRep === void 0 ? function (k, v) {
return typeof v === 'undefined' ? undefinedReplacement : v;
} : _options$stringifyRep;
return typeof value === 'string' ? value : JSON.stringify(canonicalize(value, null, null, stringifyReplacer), null, ' ');
};
jsonDiff.equals = function (left, right, options) {
return _base["default"].prototype.equals.call(jsonDiff, left.replace(/,([\r\n])/g, '$1'), right.replace(/,([\r\n])/g, '$1'), options);
};
function diffJson(oldObj, newObj, options) {
return jsonDiff.diff(oldObj, newObj, options);
}
// This function handles the presence of circular references by bailing out when encountering an
// object that is already on the "stack" of items being processed. Accepts an optional replacer
function canonicalize(obj, stack, replacementStack, replacer, key) {
stack = stack || [];
replacementStack = replacementStack || [];
if (replacer) {
obj = replacer(key === undefined ? '' : key, obj);
}
var i;
for (i = 0; i < stack.length; i += 1) {
if (stack[i] === obj) {
return replacementStack[i];
}
}
var canonicalizedObj;
if ('[object Array]' === Object.prototype.toString.call(obj)) {
stack.push(obj);
canonicalizedObj = new Array(obj.length);
replacementStack.push(canonicalizedObj);
for (i = 0; i < obj.length; i += 1) {
canonicalizedObj[i] = canonicalize(obj[i], stack, replacementStack, replacer, String(i));
}
stack.pop();
replacementStack.pop();
return canonicalizedObj;
}
if (obj && obj.toJSON) {
obj = obj.toJSON();
}
if (_typeof(obj) === 'object' && obj !== null) {
stack.push(obj);
canonicalizedObj = {};
replacementStack.push(canonicalizedObj);
var sortedKeys = [],
_key;
for (_key in obj) {
/* istanbul ignore else */
if (Object.prototype.hasOwnProperty.call(obj, _key)) {
sortedKeys.push(_key);
}
}
sortedKeys.sort();
for (i = 0; i < sortedKeys.length; i += 1) {
_key = sortedKeys[i];
canonicalizedObj[_key] = canonicalize(obj[_key], stack, replacementStack, replacer, _key);
}
stack.pop();
replacementStack.pop();
} else {
canonicalizedObj = obj;
}
return canonicalizedObj;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYmFzZSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX2xpbmUiLCJlIiwiX19lc01vZHVsZSIsIl90eXBlb2YiLCJvIiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJjb25zdHJ1Y3RvciIsInByb3RvdHlwZSIsImpzb25EaWZmIiwiZXhwb3J0cyIsIkRpZmYiLCJ1c2VMb25nZXN0VG9rZW4iLCJ0b2tlbml6ZSIsImxpbmVEaWZmIiwiY2FzdElucHV0IiwidmFsdWUiLCJvcHRpb25zIiwidW5kZWZpbmVkUmVwbGFjZW1lbnQiLCJfb3B0aW9ucyRzdHJpbmdpZnlSZXAiLCJzdHJpbmdpZnlSZXBsYWNlciIsImsiLCJ2IiwiSlNPTiIsInN0cmluZ2lmeSIsImNhbm9uaWNhbGl6ZSIsImVxdWFscyIsImxlZnQiLCJyaWdodCIsImNhbGwiLCJyZXBsYWNlIiwiZGlmZkpzb24iLCJvbGRPYmoiLCJuZXdPYmoiLCJkaWZmIiwib2JqIiwic3RhY2siLCJyZXBsYWNlbWVudFN0YWNrIiwicmVwbGFjZXIiLCJrZXkiLCJ1bmRlZmluZWQiLCJpIiwibGVuZ3RoIiwiY2Fub25pY2FsaXplZE9iaiIsIk9iamVjdCIsInRvU3RyaW5nIiwicHVzaCIsIkFycmF5IiwiU3RyaW5nIiwicG9wIiwidG9KU09OIiwic29ydGVkS2V5cyIsImhhc093blByb3BlcnR5Iiwic29ydCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWZmL2pzb24uanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IERpZmYgZnJvbSAnLi9iYXNlJztcbmltcG9ydCB7bGluZURpZmZ9IGZyb20gJy4vbGluZSc7XG5cbmV4cG9ydCBjb25zdCBqc29uRGlmZiA9IG5ldyBEaWZmKCk7XG4vLyBEaXNjcmltaW5hdGUgYmV0d2VlbiB0d28gbGluZXMgb2YgcHJldHR5LXByaW50ZWQsIHNlcmlhbGl6ZWQgSlNPTiB3aGVyZSBvbmUgb2YgdGhlbSBoYXMgYVxuLy8gZGFuZ2xpbmcgY29tbWEgYW5kIHRoZSBvdGhlciBkb2Vzbid0LiBUdXJucyBvdXQgaW5jbHVkaW5nIHRoZSBkYW5nbGluZyBjb21tYSB5aWVsZHMgdGhlIG5pY2VzdCBvdXRwdXQ6XG5qc29uRGlmZi51c2VMb25nZXN0VG9rZW4gPSB0cnVlO1xuXG5qc29uRGlmZi50b2tlbml6ZSA9IGxpbmVEaWZmLnRva2VuaXplO1xuanNvbkRpZmYuY2FzdElucHV0ID0gZnVuY3Rpb24odmFsdWUsIG9wdGlvbnMpIHtcbiAgY29uc3Qge3VuZGVmaW5lZFJlcGxhY2VtZW50LCBzdHJpbmdpZnlSZXBsYWNlciA9IChrLCB2KSA9PiB0eXBlb2YgdiA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWRSZXBsYWNlbWVudCA6IHZ9ID0gb3B0aW9ucztcblxuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogSlNPTi5zdHJpbmdpZnkoY2Fub25pY2FsaXplKHZhbHVlLCBudWxsLCBudWxsLCBzdHJpbmdpZnlSZXBsYWNlciksIG51bGwsICcgICcpO1xufTtcbmpzb25EaWZmLmVxdWFscyA9IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0LCBvcHRpb25zKSB7XG4gIHJldHVybiBEaWZmLnByb3RvdHlwZS5lcXVhbHMuY2FsbChqc29uRGlmZiwgbGVmdC5yZXBsYWNlKC8sKFtcXHJcXG5dKS9nLCAnJDEnKSwgcmlnaHQucmVwbGFjZSgvLChbXFxyXFxuXSkvZywgJyQxJyksIG9wdGlvbnMpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGRpZmZKc29uKG9sZE9iaiwgbmV3T2JqLCBvcHRpb25zKSB7IHJldHVybiBqc29uRGlmZi5kaWZmKG9sZE9iaiwgbmV3T2JqLCBvcHRpb25zKTsgfVxuXG4vLyBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIHByZXNlbmNlIG9mIGNpcmN1bGFyIHJlZmVyZW5jZXMgYnkgYmFpbGluZyBvdXQgd2hlbiBlbmNvdW50ZXJpbmcgYW5cbi8vIG9iamVjdCB0aGF0IGlzIGFscmVhZHkgb24gdGhlIFwic3RhY2tcIiBvZiBpdGVtcyBiZWluZyBwcm9jZXNzZWQuIEFjY2VwdHMgYW4gb3B0aW9uYWwgcmVwbGFjZXJcbmV4cG9ydCBmdW5jdGlvbiBjYW5vbmljYWxpemUob2JqLCBzdGFjaywgcmVwbGFjZW1lbnRTdGFjaywgcmVwbGFjZXIsIGtleSkge1xuICBzdGFjayA9IHN0YWNrIHx8IFtdO1xuICByZXBsYWNlbWVudFN0YWNrID0gcmVwbGFjZW1lbnRTdGFjayB8fCBbXTtcblxuICBpZiAocmVwbGFjZXIpIHtcbiAgICBvYmogPSByZXBsYWNlcihrZXkgPT09IHVuZGVmaW5lZCA/ICcnIDoga2V5LCBvYmopO1xuICB9XG5cbiAgbGV0IGk7XG5cbiAgZm9yIChpID0gMDsgaSA8IHN0YWNrLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgaWYgKHN0YWNrW2ldID09PSBvYmopIHtcbiAgICAgIHJldHVybiByZXBsYWNlbWVudFN0YWNrW2ldO1xuICAgIH1cbiAgfVxuXG4gIGxldCBjYW5vbmljYWxpemVkT2JqO1xuXG4gIGlmICgnW29iamVjdCBBcnJheV0nID09PSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSkge1xuICAgIHN0YWNrLnB1c2gob2JqKTtcbiAgICBjYW5vbmljYWxpemVkT2JqID0gbmV3IEFycmF5KG9iai5sZW5ndGgpO1xuICAgIHJlcGxhY2VtZW50U3RhY2sucHVzaChjYW5vbmljYWxpemVkT2JqKTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgb2JqLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBjYW5vbmljYWxpemVkT2JqW2ldID0gY2Fub25pY2FsaXplKG9ialtpXSwgc3RhY2ssIHJlcGxhY2VtZW50U3RhY2ssIHJlcGxhY2VyLCBTdHJpbmcoaSkpO1xuICAgIH1cbiAgICBzdGFjay5wb3AoKTtcbiAgICByZXBsYWNlbWVudFN0YWNrLnBvcCgpO1xuICAgIHJldHVybiBjYW5vbmljYWxpemVkT2JqO1xuICB9XG5cbiAgaWYgKG9iaiAmJiBvYmoudG9KU09OKSB7XG4gICAgb2JqID0gb2JqLnRvSlNPTigpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIG9iaiAhPT0gbnVsbCkge1xuICAgIHN0YWNrLnB1c2gob2JqKTtcbiAgICBjYW5vbmljYWxpemVkT2JqID0ge307XG4gICAgcmVwbGFjZW1lbnRTdGFjay5wdXNoKGNhbm9uaWNhbGl6ZWRPYmopO1xuICAgIGxldCBzb3J0ZWRLZXlzID0gW10sXG4gICAgICAgIGtleTtcbiAgICBmb3IgKGtleSBpbiBvYmopIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkge1xuICAgICAgICBzb3J0ZWRLZXlzLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgc29ydGVkS2V5cy5zb3J0KCk7XG4gICAgZm9yIChpID0gMDsgaSA8IHNvcnRlZEtleXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGtleSA9IHNvcnRlZEtleXNbaV07XG4gICAgICBjYW5vbmljYWxpemVkT2JqW2tleV0gPSBjYW5vbmljYWxpemUob2JqW2tleV0sIHN0YWNrLCByZXBsYWNlbWVudFN0YWNrLCByZXBsYWNlciwga2V5KTtcbiAgICB9XG4gICAgc3RhY2sucG9wKCk7XG4gICAgcmVwbGFjZW1lbnRTdGFjay5wb3AoKTtcbiAgfSBlbHNlIHtcbiAgICBjYW5vbmljYWxpemVkT2JqID0gb2JqO1xuICB9XG4gIHJldHVybiBjYW5vbmljYWxpemVkT2JqO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLElBQUFBLEtBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLEtBQUEsR0FBQUQsT0FBQTtBQUFnQyxTQUFBRCx1QkFBQUcsQ0FBQSxXQUFBQSxDQUFBLElBQUFBLENBQUEsQ0FBQUMsVUFBQSxHQUFBRCxDQUFBLGdCQUFBQSxDQUFBO0FBQUEsU0FBQUUsUUFBQUMsQ0FBQSxzQ0FBQUQsT0FB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