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