devops-diff
Version:
devops-diff
232 lines • 9.19 kB
JavaScript
;
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.diffHighlight = exports.getFileIcon = exports.getHtmlId = exports.filenameDiff = exports.deconstructLine = exports.escapeForHtml = exports.toCSSClass = exports.defaultRenderConfig = exports.CSSLineClass = void 0;
var jsDiff = __importStar(require("diff"));
var utils_1 = require("./utils");
var rematch = __importStar(require("./rematch"));
var types_1 = require("./types");
exports.CSSLineClass = {
INSERTS: 'd2h-ins',
DELETES: 'd2h-del',
CONTEXT: 'd2h-cntx',
INFO: 'd2h-info',
INSERT_CHANGES: 'd2h-ins d2h-change',
DELETE_CHANGES: 'd2h-del d2h-change',
};
exports.defaultRenderConfig = {
matching: types_1.LineMatchingType.NONE,
matchWordsThreshold: 0.25,
maxLineLengthHighlight: 10000,
diffStyle: types_1.DiffStyleType.WORD,
};
var separator = '/';
var distance = rematch.newDistanceFn(function (change) { return change.value; });
var matcher = rematch.newMatcherFn(distance);
function isDevNullName(name) {
return name.indexOf('dev/null') !== -1;
}
function removeInsElements(line) {
return line.replace(/(<ins[^>]*>((.|\n)*?)<\/ins>)/g, '');
}
function removeDelElements(line) {
return line.replace(/(<del[^>]*>((.|\n)*?)<\/del>)/g, '');
}
function toCSSClass(lineType) {
switch (lineType) {
case types_1.LineType.CONTEXT:
return exports.CSSLineClass.CONTEXT;
case types_1.LineType.INSERT:
return exports.CSSLineClass.INSERTS;
case types_1.LineType.DELETE:
return exports.CSSLineClass.DELETES;
}
}
exports.toCSSClass = toCSSClass;
function prefixLength(isCombined) {
return isCombined ? 2 : 1;
}
function escapeForHtml(str) {
return str
.slice(0)
.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''')
.replace(/\//g, '/');
}
exports.escapeForHtml = escapeForHtml;
function deconstructLine(line, isCombined, escape) {
if (escape === void 0) { escape = true; }
var indexToSplit = prefixLength(isCombined);
return {
prefix: line.substring(0, indexToSplit),
content: escape ? escapeForHtml(line.substring(indexToSplit)) : line.substring(indexToSplit),
};
}
exports.deconstructLine = deconstructLine;
function filenameDiff(file) {
var oldFilename = utils_1.unifyPath(file.oldName);
var newFilename = utils_1.unifyPath(file.newName);
if (oldFilename !== newFilename && !isDevNullName(oldFilename) && !isDevNullName(newFilename)) {
var prefixPaths = [];
var suffixPaths = [];
var oldFilenameParts = oldFilename.split(separator);
var newFilenameParts = newFilename.split(separator);
var oldFilenamePartsSize = oldFilenameParts.length;
var newFilenamePartsSize = newFilenameParts.length;
var i = 0;
var j = oldFilenamePartsSize - 1;
var k = newFilenamePartsSize - 1;
while (i < j && i < k) {
if (oldFilenameParts[i] === newFilenameParts[i]) {
prefixPaths.push(newFilenameParts[i]);
i += 1;
}
else {
break;
}
}
while (j > i && k > i) {
if (oldFilenameParts[j] === newFilenameParts[k]) {
suffixPaths.unshift(newFilenameParts[k]);
j -= 1;
k -= 1;
}
else {
break;
}
}
var finalPrefix = prefixPaths.join(separator);
var finalSuffix = suffixPaths.join(separator);
var oldRemainingPath = oldFilenameParts.slice(i, j + 1).join(separator);
var newRemainingPath = newFilenameParts.slice(i, k + 1).join(separator);
if (finalPrefix.length && finalSuffix.length) {
return (finalPrefix + separator + '{' + oldRemainingPath + ' → ' + newRemainingPath + '}' + separator + finalSuffix);
}
else if (finalPrefix.length) {
return finalPrefix + separator + '{' + oldRemainingPath + ' → ' + newRemainingPath + '}';
}
else if (finalSuffix.length) {
return '{' + oldRemainingPath + ' → ' + newRemainingPath + '}' + separator + finalSuffix;
}
return oldFilename + ' → ' + newFilename;
}
else if (!isDevNullName(newFilename)) {
return newFilename;
}
else {
return oldFilename;
}
}
exports.filenameDiff = filenameDiff;
function getHtmlId(file) {
return "d2h-" + utils_1.hashCode(filenameDiff(file)).toString().slice(-6);
}
exports.getHtmlId = getHtmlId;
function getFileIcon(file) {
var templateName = 'file-changed';
if (file.isRename) {
templateName = 'file-renamed';
}
else if (file.isCopy) {
templateName = 'file-renamed';
}
else if (file.isNew) {
templateName = 'file-added';
}
else if (file.isDeleted) {
templateName = 'file-deleted';
}
else if (file.newName !== file.oldName) {
templateName = 'file-renamed';
}
return templateName;
}
exports.getFileIcon = getFileIcon;
function diffHighlight(diffLine1, diffLine2, isCombined, config) {
if (config === void 0) { config = {}; }
var _a = __assign(__assign({}, exports.defaultRenderConfig), config), matching = _a.matching, maxLineLengthHighlight = _a.maxLineLengthHighlight, matchWordsThreshold = _a.matchWordsThreshold, diffStyle = _a.diffStyle;
var line1 = deconstructLine(diffLine1, isCombined, false);
var line2 = deconstructLine(diffLine2, isCombined, false);
if (line1.content.length > maxLineLengthHighlight || line2.content.length > maxLineLengthHighlight) {
return {
oldLine: {
prefix: line1.prefix,
content: escapeForHtml(line1.content),
},
newLine: {
prefix: line2.prefix,
content: escapeForHtml(line2.content),
},
};
}
var diff = diffStyle === 'char'
? jsDiff.diffChars(line1.content, line2.content)
: jsDiff.diffWordsWithSpace(line1.content, line2.content);
var changedWords = [];
if (diffStyle === 'word' && matching === 'words') {
var removed = diff.filter(function (element) { return element.removed; });
var added = diff.filter(function (element) { return element.added; });
var chunks = matcher(added, removed);
chunks.forEach(function (chunk) {
if (chunk[0].length === 1 && chunk[1].length === 1) {
var dist = distance(chunk[0][0], chunk[1][0]);
if (dist < matchWordsThreshold) {
changedWords.push(chunk[0][0]);
changedWords.push(chunk[1][0]);
}
}
});
}
var highlightedLine = diff.reduce(function (highlightedLine, part) {
var elemType = part.added ? 'ins' : part.removed ? 'del' : null;
var addClass = changedWords.indexOf(part) > -1 ? ' class="d2h-change"' : '';
var escapedValue = escapeForHtml(part.value);
return elemType !== null
? highlightedLine + "<" + elemType + addClass + ">" + escapedValue + "</" + elemType + ">"
: "" + highlightedLine + escapedValue;
}, '');
return {
oldLine: {
prefix: line1.prefix,
content: removeInsElements(highlightedLine),
},
newLine: {
prefix: line2.prefix,
content: removeDelElements(highlightedLine),
},
};
}
exports.diffHighlight = diffHighlight;
//# sourceMappingURL=render-utils.js.map