1*f194f574SWojciech Kozyraimport chalk from 'chalk'; 2*f194f574SWojciech Kozyraimport { diffLines } from 'diff'; 3*f194f574SWojciech Kozyra 4*f194f574SWojciech Kozyraconst CONTEXT_SIZE = 5; 5*f194f574SWojciech Kozyra 6*f194f574SWojciech Kozyraexport function printDiff(before: string, after: string): void { 7*f194f574SWojciech Kozyra const diff = diffLines(before, after); 8*f194f574SWojciech Kozyra diff.forEach((part, index) => { 9*f194f574SWojciech Kozyra const isContextEnd = index > 0 && (diff[index - 1].added || diff[index - 1].removed); 10*f194f574SWojciech Kozyra const isContextStart = 11*f194f574SWojciech Kozyra index < diff.length - 1 && (diff[index + 1].added || diff[index + 1].removed); 12*f194f574SWojciech Kozyra let result = ''; 13*f194f574SWojciech Kozyra if (part.added) { 14*f194f574SWojciech Kozyra result = chalk.green(part.value); 15*f194f574SWojciech Kozyra } else if (part.removed) { 16*f194f574SWojciech Kozyra result = chalk.red(part.value); 17*f194f574SWojciech Kozyra } else if (isContextEnd && isContextStart) { 18*f194f574SWojciech Kozyra const split = part.value.split('\n'); 19*f194f574SWojciech Kozyra if (split.length - 1 > 2 * CONTEXT_SIZE) { 20*f194f574SWojciech Kozyra result = [ 21*f194f574SWojciech Kozyra split.slice(0, CONTEXT_SIZE).join('\n'), 22*f194f574SWojciech Kozyra '...', 23*f194f574SWojciech Kozyra split.slice(-CONTEXT_SIZE - 1).join('\n'), 24*f194f574SWojciech Kozyra ].join('\n'); 25*f194f574SWojciech Kozyra } else { 26*f194f574SWojciech Kozyra result = part.value; 27*f194f574SWojciech Kozyra } 28*f194f574SWojciech Kozyra } else if (isContextEnd) { 29*f194f574SWojciech Kozyra result = part.value 30*f194f574SWojciech Kozyra .split('\n') 31*f194f574SWojciech Kozyra .slice(0, CONTEXT_SIZE + 1) 32*f194f574SWojciech Kozyra .join('\n'); 33*f194f574SWojciech Kozyra } else if (isContextStart) { 34*f194f574SWojciech Kozyra result = part.value 35*f194f574SWojciech Kozyra .split('\n') 36*f194f574SWojciech Kozyra .slice(-CONTEXT_SIZE - 1) 37*f194f574SWojciech Kozyra .join('\n'); 38*f194f574SWojciech Kozyra } 39*f194f574SWojciech Kozyra process.stdout.write(result); 40*f194f574SWojciech Kozyra }); 41*f194f574SWojciech Kozyra console.log(); 42*f194f574SWojciech Kozyra} 43