UNPKG

gitlify

Version:

A powerful CLI tool to analyze uncommitted git changes with detailed reports, function detection, and beautiful terminal output

156 lines (133 loc) โ€ข 5.1 kB
const termcolorized = require('termcolorized'); class Formatter { display(files, options = {}) { if (options.json) { this.displayJson(files); } else if (options.files) { this.displayFilesOnly(files); } else if (options.summary) { this.displaySummary(files); } else { this.displayFull(files, options.verbose); } } displayFull(files, verbose = false) { if (files.length === 0) { console.log(termcolorized.info('โœจ No changes found.')); return; } // Sort files by total changes (additions + deletions) const sortedFiles = files.sort((a, b) => (b.totalAdditions + b.totalDeletions) - (a.totalAdditions + a.totalDeletions) ); // Display each file for (const file of sortedFiles) { this.displayFile(file, verbose); } // Display summary this.displaySummary(files); } displayFile(file, verbose = false) { const totalChanges = file.totalAdditions + file.totalDeletions; // File header console.log(termcolorized.style(`๐Ÿ“ ${file.filePath}`, { color: '#3498db', bold: true })); // Changes summary const additionsText = file.totalAdditions > 0 ? termcolorized.style(`โž• ${file.totalAdditions} additions`, { color: '#27ae60' }) : ''; const deletionsText = file.totalDeletions > 0 ? termcolorized.style(`โž– ${file.totalDeletions} deletions`, { color: '#e74c3c' }) : ''; if (additionsText && deletionsText) { console.log(` ${additionsText} ${deletionsText}`); } else if (additionsText) { console.log(` ${additionsText}`); } else if (deletionsText) { console.log(` ${deletionsText}`); } // Function information if (file.changedFunctions && file.changedFunctions.length > 0) { const functionNames = file.changedFunctions.map(f => f.name).join(', '); console.log(termcolorized.style(` ๐Ÿ“Œ Changed in: ${functionNames}()`, { color: '#f39c12' })); } // Line numbers (verbose mode) if (verbose && file.changedLines.length > 0) { const lineNumbers = file.changedLines.map(line => line.lineNumber); const minLine = Math.min(...lineNumbers); const maxLine = Math.max(...lineNumbers); console.log(termcolorized.style(` ๐Ÿ“ Lines: ${minLine}-${maxLine}`, { color: '#9b59b6' })); } console.log(); // Empty line for spacing } displaySummary(files) { if (files.length === 0) return; const totalFiles = files.length; const totalAdditions = files.reduce((sum, file) => sum + file.totalAdditions, 0); const totalDeletions = files.reduce((sum, file) => sum + file.totalDeletions, 0); const totalChanges = totalAdditions + totalDeletions; // Find most changed file const mostChangedFile = files.reduce((max, file) => { const fileChanges = file.totalAdditions + file.totalDeletions; const maxChanges = max.totalAdditions + max.totalDeletions; return fileChanges > maxChanges ? file : max; }); console.log(termcolorized.style('๐Ÿงพ Summary:', { color: '#2c3e50', bold: true })); console.log(termcolorized.style(` - Total files changed: ${totalFiles}`, { color: '#34495e' })); console.log(termcolorized.style(` - Total lines added: ${totalAdditions}`, { color: '#27ae60' })); console.log(termcolorized.style(` - Total lines removed: ${totalDeletions}`, { color: '#e74c3c' })); if (files.length > 1) { const mostChangedChanges = mostChangedFile.totalAdditions + mostChangedFile.totalDeletions; console.log(termcolorized.style(` - Most changed file: ${mostChangedFile.filePath} (${mostChangedChanges} changes)`, { color: '#f39c12' })); } } displayFilesOnly(files) { if (files.length === 0) { console.log(termcolorized.info('No files changed.')); return; } console.log(termcolorized.style('๐Ÿ“ Changed Files:', { color: '#3498db', bold: true })); for (const file of files) { const changes = file.totalAdditions + file.totalDeletions; console.log(termcolorized.style(` ${file.filePath} (${changes} changes)`, { color: '#34495e' })); } } displayJson(files) { const result = { files: files.map(file => ({ filePath: file.filePath, totalAdditions: file.totalAdditions, totalDeletions: file.totalDeletions, changedFunctions: file.changedFunctions.map(f => f.name), changedLines: file.changedLines.length })), summary: { totalFiles: files.length, totalAdditions: files.reduce((sum, file) => sum + file.totalAdditions, 0), totalDeletions: files.reduce((sum, file) => sum + file.totalDeletions, 0) } }; console.log(JSON.stringify(result, null, 2)); } } module.exports = Formatter;