offset = diagonalIndex + max; let prevDiagonalIndex; if ( diagonalIndex === -diffLevel || (diagonalIndex !== diffLevel && v[offset - 1] < v[offset + 1]) ) { prevDiagonalIndex = diagonalIndex + 1; } else { prevDiagonalIndex = diagonalIndex - 1; } const prevX = v[prevDiagonalIndex + max]; const prevY = prevX - prevDiagonalIndex; while (x > prevX && y > prevY) { const actualItem = actual[x - 1]; const value = !checkCommaDisparity || StringPrototypeEndsWith(actualItem, ',') ? actualItem : expected[y - 1]; ArrayPrototypePush(result, { __proto__: null, type: 'nop', value }); x--; y--; } if (diffLevel > 0) { if (x > prevX) { ArrayPrototypePush(result, { __proto__: null, type: 'insert', value: actual[x - 1] }); x--; } else { ArrayPrototypePush(result, { __proto__: null, type: 'delete', value: expected[y - 1] }); y--; } } } return result; } function printSimpleMyersDiff(diff) { let message = ''; for (let diffIdx = diff.length - 1; diffIdx >= 0; diffIdx--) { const { type, value } = diff[diffIdx]; let color = colors.white; if (type === 'insert') { color = colors.green; } else if (type === 'delete') { color = colors.red; } message += `${color}${value}${colors.white}`; } return `\n${message}`; } function printMyersDiff(diff, operator) { let message = ''; let skipped = false; let nopCount = 0; for (let diffIdx = diff.length - 1; diffIdx >= 0; diffIdx--) { const { type, value } = diff[diffIdx]; const previousType = diffIdx < diff.length - 1 ? diff[diffIdx + 1].type : null; // Avoid grouping if only one line would have been grouped otherwise if (previousType === 'nop' && type !== previousType) { if (nopCount === kNopLinesToCollapse + 1) { message += `${colors.white} ${diff[diffIdx + 1].value}\n`; } else if (nopCount === kNopLinesToCollapse + 2) { message += `${colors.white} ${diff[diffIdx + 2].value}\n`; message += `${colors.white} ${diff[diffIdx + 1].value}\n`; } else if (nopCount >= kNopLinesToCollapse + 3) { message += `${colors.blue}...${colors.white}\n`; message += `${colors.white} ${diff[diffIdx + 1].value}\n`; skipped = true; } nopCount = 0; } if (type === 'insert') { if (operator === 'partialDeepStrictEqual') { message += `${colors.gray}${colors.hasColors ? ' ' : '+'} ${value}${colors.white}\n`; } else { message += `${colors.green}+${colors.white} ${value}\n`; } } else if (type === 'delete') { message += `${colors.red}-${colors.white} ${value}\n`; } else if (type === 'nop') { if (nopCount < kNopLinesToCollapse) { message += `${colors.white} ${value}\n`; } nopCount++; } } message = message.trimEnd(); return { message: `\n${message}`, skipped }; } module.exports = { myersDiff, printMyersDiff, printSimpleMyersDiff };