@circuitly/diff
Version:
A javascript text diff implementation.
78 lines (74 loc) • 10.3 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.diffLines = diffLines;
exports.diffTrimmedLines = diffTrimmedLines;
exports.lineDiff = void 0;
var _base = _interopRequireDefault(require("./base"));
var _params = require("../util/params");
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
var lineDiff = exports.lineDiff = new _base["default"]();
lineDiff.tokenize = function (value, options) {
if (options.stripTrailingCr) {
// remove one \r before \n to match GNU diff's --strip-trailing-cr behavior
value = value.replace(/\r\n/g, '\n');
}
var retLines = [],
linesAndNewlines = value.split(/(\n|\r\n)/);
// Ignore the final empty token that occurs if the string ends with a new line
if (!linesAndNewlines[linesAndNewlines.length - 1]) {
linesAndNewlines.pop();
}
// Merge the content and line separators into single tokens
for (var i = 0; i < linesAndNewlines.length; i++) {
var line = linesAndNewlines[i];
if (i % 2 && !options.newlineIsToken) {
retLines[retLines.length - 1] += line;
} else {
retLines.push(line);
}
}
return retLines;
};
lineDiff.equals = function (left, right, options) {
// If we're ignoring whitespace, we need to normalise lines by stripping
// whitespace before checking equality. (This has an annoying interaction
// with newlineIsToken that requires special handling: if newlines get their
// own token, then we DON'T want to trim the *newline* tokens down to empty
// strings, since this would cause us to treat whitespace-only line content
// as equal to a separator between lines, which would be weird and
// inconsistent with the documented behavior of the options.)
if (options.ignoreWhitespace) {
if (!options.newlineIsToken || !left.includes('\n')) {
left = left.trim();
}
if (!options.newlineIsToken || !right.includes('\n')) {
right = right.trim();
}
} else if (options.ignoreNewlineAtEof && !options.newlineIsToken) {
if (left.endsWith('\n')) {
left = left.slice(0, -1);
}
if (right.endsWith('\n')) {
right = right.slice(0, -1);
}
}
return _base["default"].prototype.equals.call(this, left, right, options);
};
function diffLines(oldStr, newStr, callback) {
return lineDiff.diff(oldStr, newStr, callback);
}
// Kept for backwards compatibility. This is a rather arbitrary wrapper method
// that just calls `diffLines` with `ignoreWhitespace: true`. It's confusing to
// have two ways to do exactly the same thing in the API, so we no longer
// document this one (library users should explicitly use `diffLines` with
// `ignoreWhitespace: true` instead) but we keep it around to maintain
// compatibility with code that used old versions.
function diffTrimmedLines(oldStr, newStr, callback) {
var options = (0, _params.generateOptions)(callback, {
ignoreWhitespace: true
});
return lineDiff.diff(oldStr, newStr, options);
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYmFzZSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX3BhcmFtcyIsImUiLCJfX2VzTW9kdWxlIiwibGluZURpZmYiLCJleHBvcnRzIiwiRGlmZiIsInRva2VuaXplIiwidmFsdWUiLCJvcHRpb25zIiwic3RyaXBUcmFpbGluZ0NyIiwicmVwbGFjZSIsInJldExpbmVzIiwibGluZXNBbmROZXdsaW5lcyIsInNwbGl0IiwibGVuZ3RoIiwicG9wIiwiaSIsImxpbmUiLCJuZXdsaW5lSXNUb2tlbiIsInB1c2giLCJlcXVhbHMiLCJsZWZ0IiwicmlnaHQiLCJpZ25vcmVXaGl0ZXNwYWNlIiwiaW5jbHVkZXMiLCJ0cmltIiwiaWdub3JlTmV3bGluZUF0RW9mIiwiZW5kc1dpdGgiLCJzbGljZSIsInByb3RvdHlwZSIsImNhbGwiLCJkaWZmTGluZXMiLCJvbGRTdHIiLCJuZXdTdHIiLCJjYWxsYmFjayIsImRpZmYiLCJkaWZmVHJpbW1lZExpbmVzIiwiZ2VuZXJhdGVPcHRpb25zIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RpZmYvbGluZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRGlmZiBmcm9tICcuL2Jhc2UnO1xuaW1wb3J0IHtnZW5lcmF0ZU9wdGlvbnN9IGZyb20gJy4uL3V0aWwvcGFyYW1zJztcblxuZXhwb3J0IGNvbnN0IGxpbmVEaWZmID0gbmV3IERpZmYoKTtcbmxpbmVEaWZmLnRva2VuaXplID0gZnVuY3Rpb24odmFsdWUsIG9wdGlvbnMpIHtcbiAgaWYob3B0aW9ucy5zdHJpcFRyYWlsaW5nQ3IpIHtcbiAgICAvLyByZW1vdmUgb25lIFxcciBiZWZvcmUgXFxuIHRvIG1hdGNoIEdOVSBkaWZmJ3MgLS1zdHJpcC10cmFpbGluZy1jciBiZWhhdmlvclxuICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvXFxyXFxuL2csICdcXG4nKTtcbiAgfVxuXG4gIGxldCByZXRMaW5lcyA9IFtdLFxuICAgICAgbGluZXNBbmROZXdsaW5lcyA9IHZhbHVlLnNwbGl0KC8oXFxufFxcclxcbikvKTtcblxuICAvLyBJZ25vcmUgdGhlIGZpbmFsIGVtcHR5IHRva2VuIHRoYXQgb2NjdXJzIGlmIHRoZSBzdHJpbmcgZW5kcyB3aXRoIGEgbmV3IGxpbmVcbiAgaWYgKCFsaW5lc0FuZE5ld2xpbmVzW2xpbmVzQW5kTmV3bGluZXMubGVuZ3RoIC0gMV0pIHtcbiAgICBsaW5lc0FuZE5ld2xpbmVzLnBvcCgpO1xuICB9XG5cbiAgLy8gTWVyZ2UgdGhlIGNvbnRlbnQgYW5kIGxpbmUgc2VwYXJhdG9ycyBpbnRvIHNpbmdsZSB0b2tlbnNcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lc0FuZE5ld2xpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IGxpbmUgPSBsaW5lc0FuZE5ld2xpbmVzW2ldO1xuXG4gICAgaWYgKGkgJSAyICYmICFvcHRpb25zLm5ld2xpbmVJc1Rva2VuKSB7XG4gICAgICByZXRMaW5lc1tyZXRMaW5lcy5sZW5ndGggLSAxXSArPSBsaW5lO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXRMaW5lcy5wdXNoKGxpbmUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXRMaW5lcztcbn07XG5cbmxpbmVEaWZmLmVxdWFscyA9IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0LCBvcHRpb25zKSB7XG4gIC8vIElmIHdlJ3JlIGlnbm9yaW5nIHdoaXRlc3BhY2UsIHdlIG5lZWQgdG8gbm9ybWFsaXNlIGxpbmVzIGJ5IHN0cmlwcGluZ1xuICAvLyB3aGl0ZXNwYWNlIGJlZm9yZSBjaGVja2luZyBlcXVhbGl0eS4gKFRoaXMgaGFzIGFuIGFubm95aW5nIGludGVyYWN0aW9uXG4gIC8vIHdpdGggbmV3bGluZUlzVG9rZW4gdGhhdCByZXF1aXJlcyBzcGVjaWFsIGhhbmRsaW5nOiBpZiBuZXdsaW5lcyBnZXQgdGhlaXJcbiAgLy8gb3duIHRva2VuLCB0aGVuIHdlIERPTidUIHdhbnQgdG8gdHJpbSB0aGUgKm5ld2xpbmUqIHRva2VucyBkb3duIHRvIGVtcHR5XG4gIC8vIHN0cmluZ3MsIHNpbmNlIHRoaXMgd291bGQgY2F1c2UgdXMgdG8gdHJlYXQgd2hpdGVzcGFjZS1vbmx5IGxpbmUgY29udGVudFxuICAvLyBhcyBlcXVhbCB0byBhIHNlcGFyYXRvciBiZXR3ZWVuIGxpbmVzLCB3aGljaCB3b3VsZCBiZSB3ZWlyZCBhbmRcbiAgLy8gaW5jb25zaXN0ZW50IHdpdGggdGhlIGRvY3VtZW50ZWQgYmVoYXZpb3Igb2YgdGhlIG9wdGlvbnMuKVxuICBpZiAob3B0aW9ucy5pZ25vcmVXaGl0ZXNwYWNlKSB7XG4gICAgaWYgKCFvcHRpb25zLm5ld2xpbmVJc1Rva2VuIHx8ICFsZWZ0LmluY2x1ZGVzKCdcXG4nKSkge1xuICAgICAgbGVmdCA9IGxlZnQudHJpbSgpO1xuICAgIH1cbiAgICBpZiAoIW9wdGlvbnMubmV3bGluZUlzVG9rZW4gfHwgIXJpZ2h0LmluY2x1ZGVzKCdcXG4nKSkge1xuICAgICAgcmlnaHQgPSByaWdodC50cmltKCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKG9wdGlvbnMuaWdub3JlTmV3bGluZUF0RW9mICYmICFvcHRpb25zLm5ld2xpbmVJc1Rva2VuKSB7XG4gICAgaWYgKGxlZnQuZW5kc1dpdGgoJ1xcbicpKSB7XG4gICAgICBsZWZ0ID0gbGVmdC5zbGljZSgwLCAtMSk7XG4gICAgfVxuICAgIGlmIChyaWdodC5lbmRzV2l0aCgnXFxuJykpIHtcbiAgICAgIHJpZ2h0ID0gcmlnaHQuc2xpY2UoMCwgLTEpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gRGlmZi5wcm90b3R5cGUuZXF1YWxzLmNhbGwodGhpcywgbGVmdCwgcmlnaHQsIG9wdGlvbnMpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGRpZmZMaW5lcyhvbGRTdHIsIG5ld1N0ciwgY2FsbGJhY2spIHsgcmV0dXJuIGxpbmVEaWZmLmRpZmYob2xkU3RyLCBuZXdTdHIsIGNhbGxiYWNrKTsgfVxuXG4vLyBLZXB0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gVGhpcyBpcyBhIHJhdGhlciBhcmJpdHJhcnkgd3JhcHBlciBtZXRob2Rcbi8vIHRoYXQganVzdCBjYWxscyBgZGlmZkxpbmVzYCB3aXRoIGBpZ25vcmVXaGl0ZXNwYWNlOiB0cnVlYC4gSXQncyBjb25mdXNpbmcgdG9cbi8vIGhhdmUgdHdvIHdheXMgdG8gZG8gZXhhY3RseSB0aGUgc2FtZSB0aGluZyBpbiB0aGUgQVBJLCBzbyB3ZSBubyBsb25nZXJcbi8vIGRvY3VtZW50IHRoaXMgb25lIChsaWJyYXJ5IHVzZXJzIHNob3VsZCBleHBsaWNpdGx5IHVzZSBgZGlmZkxpbmVzYCB3aXRoXG4vLyBgaWdub3JlV2hpdGVzcGFjZTogdHJ1ZWAgaW5zdGVhZCkgYnV0IHdlIGtlZXAgaXQgYXJvdW5kIHRvIG1haW50YWluXG4vLyBjb21wYXRpYmlsaXR5IHdpdGggY29kZSB0aGF0IHVzZWQgb2xkIHZlcnNpb25zLlxuZXhwb3J0IGZ1bmN0aW9uIGRpZmZUcmltbWVkTGluZXMob2xkU3RyLCBuZXdTdHIsIGNhbGxiYWNrKSB7XG4gIGxldCBvcHRpb25zID0gZ2VuZXJhdGVPcHRpb25zKGNhbGxiYWNrLCB7aWdub3JlV2hpdGVzcGFjZTogdHJ1ZX0pO1xuICByZXR1cm4gbGluZURpZmYuZGlmZihvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucyk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUEsSUFBQUEsS0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBQStDLFNBQUFELHVCQUFBRyxDQUFBLFdBQUFBLENBQUEsSUFBQUEsQ0FBQSxDQUFBQyxVQUFBLEdBQUFELENBQUEsZ0JBQUFBLENBQUE7QUFFeEMsSUFBTUUsUUFBUSxHQUFBQyxPQUFBLENBQUFELFFBQUEsR0FBRyxJQUFJRSxnQkFBSSxDQUFDLENBQUM7QUFDbENGLFFBQVEsQ0FBQ0csUUFBUSxHQUFHLFVBQVNDLEtBQUssRUFBRUMsT0FBTyxFQUFFO0VBQzNDLElBQUdBLE9BQU8sQ0FBQ0MsZUFBZSxFQUFFO0lB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