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; };