Spaces:
Running
Running
| 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; | |
| }; |