123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257 |
- 'use strict';
- Object.defineProperty(exports, '__esModule', {
- value: true
- });
- exports.diffStringsRaw = exports.diffStringsUnified = exports.createPatchMark = exports.printDiffLines = exports.printAnnotation = exports.countChanges = exports.hasCommonDiff = exports.printCommonLine = exports.printInsertLine = exports.printDeleteLine = void 0;
- var _cleanupSemantic = require('./cleanupSemantic');
- var _diffLines = require('./diffLines');
- var _diffStrings = _interopRequireDefault(require('./diffStrings'));
- var _getAlignedDiffs = _interopRequireDefault(require('./getAlignedDiffs'));
- var _joinAlignedDiffs = require('./joinAlignedDiffs');
- var _normalizeDiffOptions = require('./normalizeDiffOptions');
- function _interopRequireDefault(obj) {
- return obj && obj.__esModule ? obj : {default: obj};
- }
- /**
- * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- */
- const formatTrailingSpaces = (line, trailingSpaceFormatter) =>
- line.replace(/\s+$/, match => trailingSpaceFormatter(match));
- const printDiffLine = (
- line,
- isFirstOrLast,
- color,
- indicator,
- trailingSpaceFormatter,
- emptyFirstOrLastLinePlaceholder
- ) =>
- line.length !== 0
- ? color(
- indicator + ' ' + formatTrailingSpaces(line, trailingSpaceFormatter)
- )
- : indicator !== ' '
- ? color(indicator)
- : isFirstOrLast && emptyFirstOrLastLinePlaceholder.length !== 0
- ? color(indicator + ' ' + emptyFirstOrLastLinePlaceholder)
- : '';
- const printDeleteLine = (
- line,
- isFirstOrLast,
- {
- aColor,
- aIndicator,
- changeLineTrailingSpaceColor,
- emptyFirstOrLastLinePlaceholder
- }
- ) =>
- printDiffLine(
- line,
- isFirstOrLast,
- aColor,
- aIndicator,
- changeLineTrailingSpaceColor,
- emptyFirstOrLastLinePlaceholder
- );
- exports.printDeleteLine = printDeleteLine;
- const printInsertLine = (
- line,
- isFirstOrLast,
- {
- bColor,
- bIndicator,
- changeLineTrailingSpaceColor,
- emptyFirstOrLastLinePlaceholder
- }
- ) =>
- printDiffLine(
- line,
- isFirstOrLast,
- bColor,
- bIndicator,
- changeLineTrailingSpaceColor,
- emptyFirstOrLastLinePlaceholder
- );
- exports.printInsertLine = printInsertLine;
- const printCommonLine = (
- line,
- isFirstOrLast,
- {
- commonColor,
- commonIndicator,
- commonLineTrailingSpaceColor,
- emptyFirstOrLastLinePlaceholder
- }
- ) =>
- printDiffLine(
- line,
- isFirstOrLast,
- commonColor,
- commonIndicator,
- commonLineTrailingSpaceColor,
- emptyFirstOrLastLinePlaceholder
- );
- exports.printCommonLine = printCommonLine;
- const hasCommonDiff = (diffs, isMultiline) => {
- if (isMultiline) {
- // Important: Ignore common newline that was appended to multiline strings!
- const iLast = diffs.length - 1;
- return diffs.some(
- (diff, i) =>
- diff[0] === _cleanupSemantic.DIFF_EQUAL &&
- (i !== iLast || diff[1] !== '\n')
- );
- }
- return diffs.some(diff => diff[0] === _cleanupSemantic.DIFF_EQUAL);
- };
- exports.hasCommonDiff = hasCommonDiff;
- const countChanges = diffs => {
- let a = 0;
- let b = 0;
- diffs.forEach(diff => {
- switch (diff[0]) {
- case _cleanupSemantic.DIFF_DELETE:
- a += 1;
- break;
- case _cleanupSemantic.DIFF_INSERT:
- b += 1;
- break;
- }
- });
- return {
- a,
- b
- };
- };
- exports.countChanges = countChanges;
- const printAnnotation = (
- {
- aAnnotation,
- aColor,
- aIndicator,
- bAnnotation,
- bColor,
- bIndicator,
- includeChangeCounts,
- omitAnnotationLines
- },
- changeCounts
- ) => {
- if (omitAnnotationLines) {
- return '';
- }
- let aRest = '';
- let bRest = '';
- if (includeChangeCounts) {
- const aCount = String(changeCounts.a);
- const bCount = String(changeCounts.b); // Padding right aligns the ends of the annotations.
- const baAnnotationLengthDiff = bAnnotation.length - aAnnotation.length;
- const aAnnotationPadding = ' '.repeat(Math.max(0, baAnnotationLengthDiff));
- const bAnnotationPadding = ' '.repeat(Math.max(0, -baAnnotationLengthDiff)); // Padding left aligns the ends of the counts.
- const baCountLengthDiff = bCount.length - aCount.length;
- const aCountPadding = ' '.repeat(Math.max(0, baCountLengthDiff));
- const bCountPadding = ' '.repeat(Math.max(0, -baCountLengthDiff));
- aRest =
- aAnnotationPadding + ' ' + aIndicator + ' ' + aCountPadding + aCount;
- bRest =
- bAnnotationPadding + ' ' + bIndicator + ' ' + bCountPadding + bCount;
- }
- return (
- aColor(aIndicator + ' ' + aAnnotation + aRest) +
- '\n' +
- bColor(bIndicator + ' ' + bAnnotation + bRest) +
- '\n\n'
- );
- };
- exports.printAnnotation = printAnnotation;
- const printDiffLines = (diffs, options) =>
- printAnnotation(options, countChanges(diffs)) +
- (options.expand
- ? (0, _joinAlignedDiffs.joinAlignedDiffsExpand)(diffs, options)
- : (0, _joinAlignedDiffs.joinAlignedDiffsNoExpand)(diffs, options)); // In GNU diff format, indexes are one-based instead of zero-based.
- exports.printDiffLines = printDiffLines;
- const createPatchMark = (aStart, aEnd, bStart, bEnd, {patchColor}) =>
- patchColor(
- `@@ -${aStart + 1},${aEnd - aStart} +${bStart + 1},${bEnd - bStart} @@`
- ); // Compare two strings character-by-character.
- // Format as comparison lines in which changed substrings have inverse colors.
- exports.createPatchMark = createPatchMark;
- const diffStringsUnified = (a, b, options) => {
- if (a !== b && a.length !== 0 && b.length !== 0) {
- const isMultiline = a.includes('\n') || b.includes('\n'); // getAlignedDiffs assumes that a newline was appended to the strings.
- const diffs = diffStringsRaw(
- isMultiline ? a + '\n' : a,
- isMultiline ? b + '\n' : b,
- true // cleanupSemantic
- );
- if (hasCommonDiff(diffs, isMultiline)) {
- const optionsNormalized = (0, _normalizeDiffOptions.normalizeDiffOptions)(
- options
- );
- const lines = (0, _getAlignedDiffs.default)(
- diffs,
- optionsNormalized.changeColor
- );
- return printDiffLines(lines, optionsNormalized);
- }
- } // Fall back to line-by-line diff.
- return (0, _diffLines.diffLinesUnified)(
- a.split('\n'),
- b.split('\n'),
- options
- );
- }; // Compare two strings character-by-character.
- // Optionally clean up small common substrings, also known as chaff.
- exports.diffStringsUnified = diffStringsUnified;
- const diffStringsRaw = (a, b, cleanup) => {
- const diffs = (0, _diffStrings.default)(a, b);
- if (cleanup) {
- (0, _cleanupSemantic.cleanupSemantic)(diffs); // impure function
- }
- return diffs;
- };
- exports.diffStringsRaw = diffStringsRaw;
|