summaryrefslogtreecommitdiff
path: root/app/assets/javascripts/ide/lib/diff/diff.js
blob: 5a6401f56ec80b0adbde817f9192c9f5a24e29e7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import { diffLines } from 'diff';
import { defaultDiffOptions } from '../editor_options';

export const computeDiff = (originalContent, newContent) => {
  // prevent EOL changes from highlighting the entire file
  const changes = diffLines(
    originalContent.replace(/\r\n/g, '\n'),
    newContent.replace(/\r\n/g, '\n'),
    defaultDiffOptions,
  );

  let lineNumber = 1;
  return changes.reduce((acc, change) => {
    const findOnLine = acc.find((c) => c.lineNumber === lineNumber);

    if (findOnLine) {
      Object.assign(findOnLine, change, {
        modified: true,
        endLineNumber: lineNumber + change.count - 1,
      });
    } else if ('added' in change || 'removed' in change) {
      acc.push({
        ...change,
        lineNumber,
        modified: undefined,
        endLineNumber: lineNumber + change.count - 1,
      });
    }

    if (!change.removed) {
      lineNumber += change.count;
    }

    return acc;
  }, []);
};