You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							231 lines
						
					
					
						
							5.9 KiB
						
					
					
				
			
		
		
	
	
							231 lines
						
					
					
						
							5.9 KiB
						
					
					
				'use strict'; | 
						|
 | 
						|
Object.defineProperty(exports, '__esModule', { | 
						|
  value: true | 
						|
}); | 
						|
exports.joinAlignedDiffsExpand = exports.joinAlignedDiffsNoExpand = void 0; | 
						|
 | 
						|
var _cleanupSemantic = require('./cleanupSemantic'); | 
						|
 | 
						|
var _printDiffs = require('./printDiffs'); | 
						|
 | 
						|
/** | 
						|
 * 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 DIFF_CONTEXT_DEFAULT = 5; // same as diffLines | 
						|
// jest --no-expand | 
						|
// | 
						|
// Given array of aligned strings with inverse highlight formatting, | 
						|
// return joined lines with diff formatting (and patch marks, if needed). | 
						|
 | 
						|
const joinAlignedDiffsNoExpand = ( | 
						|
  diffs, | 
						|
  nContextLines = DIFF_CONTEXT_DEFAULT | 
						|
) => { | 
						|
  const iLength = diffs.length; | 
						|
  const nContextLines2 = nContextLines + nContextLines; // First pass: count output lines and see if it has patches. | 
						|
 | 
						|
  let jLength = iLength; | 
						|
  let hasExcessAtStartOrEnd = false; | 
						|
  let nExcessesBetweenChanges = 0; | 
						|
  let i = 0; | 
						|
 | 
						|
  while (i !== iLength) { | 
						|
    const iStart = i; | 
						|
 | 
						|
    while (i !== iLength && diffs[i][0] === _cleanupSemantic.DIFF_EQUAL) { | 
						|
      i += 1; | 
						|
    } | 
						|
 | 
						|
    if (iStart !== i) { | 
						|
      if (iStart === 0) { | 
						|
        // at start | 
						|
        if (i > nContextLines) { | 
						|
          jLength -= i - nContextLines; // subtract excess common lines | 
						|
 | 
						|
          hasExcessAtStartOrEnd = true; | 
						|
        } | 
						|
      } else if (i === iLength) { | 
						|
        // at end | 
						|
        const n = i - iStart; | 
						|
 | 
						|
        if (n > nContextLines) { | 
						|
          jLength -= n - nContextLines; // subtract excess common lines | 
						|
 | 
						|
          hasExcessAtStartOrEnd = true; | 
						|
        } | 
						|
      } else { | 
						|
        // between changes | 
						|
        const n = i - iStart; | 
						|
 | 
						|
        if (n > nContextLines2) { | 
						|
          jLength -= n - nContextLines2; // subtract excess common lines | 
						|
 | 
						|
          nExcessesBetweenChanges += 1; | 
						|
        } | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    while (i !== iLength && diffs[i][0] !== _cleanupSemantic.DIFF_EQUAL) { | 
						|
      i += 1; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  const hasPatch = nExcessesBetweenChanges !== 0 || hasExcessAtStartOrEnd; | 
						|
 | 
						|
  if (nExcessesBetweenChanges !== 0) { | 
						|
    jLength += nExcessesBetweenChanges + 1; // add patch lines | 
						|
  } else if (hasExcessAtStartOrEnd) { | 
						|
    jLength += 1; // add patch line | 
						|
  } | 
						|
 | 
						|
  const jLast = jLength - 1; | 
						|
  const lines = []; | 
						|
  let jPatchMark = 0; // index of placeholder line for current patch mark | 
						|
 | 
						|
  if (hasPatch) { | 
						|
    lines.push(''); // placeholder line for first patch mark | 
						|
  } // Indexes of expected or received lines in current patch: | 
						|
 | 
						|
  let aStart = 0; | 
						|
  let bStart = 0; | 
						|
  let aEnd = 0; | 
						|
  let bEnd = 0; | 
						|
 | 
						|
  const pushCommonLine = line => { | 
						|
    const j = lines.length; | 
						|
    lines.push((0, _printDiffs.printCommonLine)(line, j === 0 || j === jLast)); | 
						|
    aEnd += 1; | 
						|
    bEnd += 1; | 
						|
  }; | 
						|
 | 
						|
  const pushDeleteLine = line => { | 
						|
    lines.push((0, _printDiffs.printDeleteLine)(line)); | 
						|
    aEnd += 1; | 
						|
  }; | 
						|
 | 
						|
  const pushInsertLine = line => { | 
						|
    lines.push((0, _printDiffs.printInsertLine)(line)); | 
						|
    bEnd += 1; | 
						|
  }; // Second pass: push lines with diff formatting (and patch marks, if needed). | 
						|
 | 
						|
  i = 0; | 
						|
 | 
						|
  while (i !== iLength) { | 
						|
    let iStart = i; | 
						|
 | 
						|
    while (i !== iLength && diffs[i][0] === _cleanupSemantic.DIFF_EQUAL) { | 
						|
      i += 1; | 
						|
    } | 
						|
 | 
						|
    if (iStart !== i) { | 
						|
      if (iStart === 0) { | 
						|
        // at beginning | 
						|
        if (i > nContextLines) { | 
						|
          iStart = i - nContextLines; | 
						|
          aStart = iStart; | 
						|
          bStart = iStart; | 
						|
          aEnd = aStart; | 
						|
          bEnd = bStart; | 
						|
        } | 
						|
 | 
						|
        for (let iCommon = iStart; iCommon !== i; iCommon += 1) { | 
						|
          pushCommonLine(diffs[iCommon][1]); | 
						|
        } | 
						|
      } else if (i === iLength) { | 
						|
        // at end | 
						|
        const iEnd = i - iStart > nContextLines ? iStart + nContextLines : i; | 
						|
 | 
						|
        for (let iCommon = iStart; iCommon !== iEnd; iCommon += 1) { | 
						|
          pushCommonLine(diffs[iCommon][1]); | 
						|
        } | 
						|
      } else { | 
						|
        // between changes | 
						|
        const nCommon = i - iStart; | 
						|
 | 
						|
        if (nCommon > nContextLines2) { | 
						|
          const iEnd = iStart + nContextLines; | 
						|
 | 
						|
          for (let iCommon = iStart; iCommon !== iEnd; iCommon += 1) { | 
						|
            pushCommonLine(diffs[iCommon][1]); | 
						|
          } | 
						|
 | 
						|
          lines[jPatchMark] = (0, _printDiffs.createPatchMark)( | 
						|
            aStart, | 
						|
            aEnd, | 
						|
            bStart, | 
						|
            bEnd | 
						|
          ); | 
						|
          jPatchMark = lines.length; | 
						|
          lines.push(''); // placeholder line for next patch mark | 
						|
 | 
						|
          const nOmit = nCommon - nContextLines2; | 
						|
          aStart = aEnd + nOmit; | 
						|
          bStart = bEnd + nOmit; | 
						|
          aEnd = aStart; | 
						|
          bEnd = bStart; | 
						|
 | 
						|
          for (let iCommon = i - nContextLines; iCommon !== i; iCommon += 1) { | 
						|
            pushCommonLine(diffs[iCommon][1]); | 
						|
          } | 
						|
        } else { | 
						|
          for (let iCommon = iStart; iCommon !== i; iCommon += 1) { | 
						|
            pushCommonLine(diffs[iCommon][1]); | 
						|
          } | 
						|
        } | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    while (i !== iLength && diffs[i][0] === _cleanupSemantic.DIFF_DELETE) { | 
						|
      pushDeleteLine(diffs[i][1]); | 
						|
      i += 1; | 
						|
    } | 
						|
 | 
						|
    while (i !== iLength && diffs[i][0] === _cleanupSemantic.DIFF_INSERT) { | 
						|
      pushInsertLine(diffs[i][1]); | 
						|
      i += 1; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  if (hasPatch) { | 
						|
    lines[jPatchMark] = (0, _printDiffs.createPatchMark)( | 
						|
      aStart, | 
						|
      aEnd, | 
						|
      bStart, | 
						|
      bEnd | 
						|
    ); | 
						|
  } | 
						|
 | 
						|
  return lines.join('\n'); | 
						|
}; // jest --expand | 
						|
// | 
						|
// Given array of aligned strings with inverse highlight formatting, | 
						|
// return joined lines with diff formatting. | 
						|
 | 
						|
exports.joinAlignedDiffsNoExpand = joinAlignedDiffsNoExpand; | 
						|
 | 
						|
const joinAlignedDiffsExpand = diffs => | 
						|
  diffs | 
						|
    .map((diff, i, diffs) => { | 
						|
      const line = diff[1]; | 
						|
 | 
						|
      switch (diff[0]) { | 
						|
        case _cleanupSemantic.DIFF_DELETE: | 
						|
          return (0, _printDiffs.printDeleteLine)(line); | 
						|
 | 
						|
        case _cleanupSemantic.DIFF_INSERT: | 
						|
          return (0, _printDiffs.printInsertLine)(line); | 
						|
 | 
						|
        default: | 
						|
          return (0, _printDiffs.printCommonLine)( | 
						|
            line, | 
						|
            i === 0 || i === diffs.length - 1 | 
						|
          ); | 
						|
      } | 
						|
    }) | 
						|
    .join('\n'); | 
						|
 | 
						|
exports.joinAlignedDiffsExpand = joinAlignedDiffsExpand;
 | 
						|
 |