xref: /expo/tools/src/Diff.ts (revision f194f574)
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