UNPKG

@circuitly/diff

Version:

A javascript text diff implementation.

86 lines (84 loc) 12.4 kB
"use strict"; 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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