File size: 2,265 Bytes
a27839e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import { diffLines, Change } from 'diff';

export interface DiffResult {
  added: number;
  removed: number;
  changes: Change[];
}

export interface DiffSummary {
  added: number;
  removed: number;
  summary: string;
}

export const generateDiff = (oldCode: string, newCode: string): DiffResult => {
  const changes = diffLines(oldCode, newCode);
  let added = 0;
  let removed = 0;
  
  changes.forEach(change => {
    if (change.added) {
      added += change.count || 0;
    } else if (change.removed) {
      removed += change.count || 0;
    }
  });
  
  return { added, removed, changes };
};

export const applyPatch = (oldCode: string, changes: Change[]): string => {
  const lines = oldCode.split('\n');
  let result: string[] = [];
  let lineIndex = 0;
  
  changes.forEach(change => {
    if (change.removed) {
      // Skip removed lines
      lineIndex += change.count || 0;
    } else if (change.added) {
      // Add new lines
      const newLines = change.value.split('\n').filter(line => line !== '');
      result.push(...newLines);
    } else {
      // Keep unchanged lines
      const unchangedLines = lines.slice(lineIndex, lineIndex + (change.count || 0));
      result.push(...unchangedLines);
      lineIndex += change.count || 0;
    }
  });
  
  return result.join('\n');
};

export const generateDiffSummary = (diffResult: DiffResult): DiffSummary => {
  return {
    added: diffResult.added,
    removed: diffResult.removed,
    summary: `Modified code: ${diffResult.added} lines added, ${diffResult.removed} lines removed`
  };
};

export const formatDiffForDisplay = (changes: Change[]): string => {
  let formattedDiff = '';
  
  changes.forEach(change => {
    if (change.added) {
      const lines = change.value.split('\n').filter(line => line !== '');
      lines.forEach(line => {
        formattedDiff += `+ ${line}\n`;
      });
    } else if (change.removed) {
      const lines = change.value.split('\n').filter(line => line !== '');
      lines.forEach(line => {
        formattedDiff += `- ${line}\n`;
      });
    } else {
      const lines = change.value.split('\n').filter(line => line !== '');
      lines.forEach(line => {
        formattedDiff += `  ${line}\n`;
      });
    }
  });
  
  return formattedDiff;
};