197 lines
4.9 KiB
TypeScript
197 lines
4.9 KiB
TypeScript
import { logger } from '../gitzone.logging.js';
|
||
|
||
/**
|
||
* UI helper module for beautiful CLI output
|
||
*/
|
||
|
||
interface ICommitSummary {
|
||
projectType: string;
|
||
branch: string;
|
||
commitType: string;
|
||
commitScope: string;
|
||
commitMessage: string;
|
||
newVersion: string;
|
||
commitSha?: string;
|
||
pushed: boolean;
|
||
repoUrl?: string;
|
||
}
|
||
|
||
interface IRecommendation {
|
||
recommendedNextVersion: string;
|
||
recommendedNextVersionLevel: string;
|
||
recommendedNextVersionScope: string;
|
||
recommendedNextVersionMessage: string;
|
||
}
|
||
|
||
/**
|
||
* Print a header with a box around it
|
||
*/
|
||
export function printHeader(title: string): void {
|
||
const width = 57;
|
||
const padding = Math.max(0, width - title.length - 2);
|
||
const leftPad = Math.floor(padding / 2);
|
||
const rightPad = padding - leftPad;
|
||
|
||
console.log('');
|
||
console.log('╭─' + '─'.repeat(width) + '─╮');
|
||
console.log('│ ' + title + ' '.repeat(rightPad + leftPad) + ' │');
|
||
console.log('╰─' + '─'.repeat(width) + '─╯');
|
||
console.log('');
|
||
}
|
||
|
||
/**
|
||
* Print a section with a border
|
||
*/
|
||
export function printSection(title: string, lines: string[]): void {
|
||
const width = 59;
|
||
|
||
console.log('┌─ ' + title + ' ' + '─'.repeat(Math.max(0, width - title.length - 3)) + '┐');
|
||
console.log('│' + ' '.repeat(width) + '│');
|
||
|
||
for (const line of lines) {
|
||
const padding = width - line.length;
|
||
console.log('│ ' + line + ' '.repeat(Math.max(0, padding - 2)) + '│');
|
||
}
|
||
|
||
console.log('│' + ' '.repeat(width) + '│');
|
||
console.log('└─' + '─'.repeat(width) + '─┘');
|
||
console.log('');
|
||
}
|
||
|
||
/**
|
||
* Print AI recommendations in a nice box
|
||
*/
|
||
export function printRecommendation(recommendation: IRecommendation): void {
|
||
const lines = [
|
||
`Suggested Version: v${recommendation.recommendedNextVersion}`,
|
||
`Suggested Type: ${recommendation.recommendedNextVersionLevel}`,
|
||
`Suggested Scope: ${recommendation.recommendedNextVersionScope}`,
|
||
`Suggested Message: ${recommendation.recommendedNextVersionMessage}`,
|
||
];
|
||
|
||
printSection('📊 AI Recommendations', lines);
|
||
}
|
||
|
||
/**
|
||
* Print a progress step
|
||
*/
|
||
export function printStep(
|
||
current: number,
|
||
total: number,
|
||
description: string,
|
||
status: 'in-progress' | 'done' | 'error'
|
||
): void {
|
||
const statusIcon = status === 'done' ? '✓' : status === 'error' ? '✗' : '⏳';
|
||
const dots = '.'.repeat(Math.max(0, 40 - description.length));
|
||
|
||
console.log(` [${current}/${total}] ${description}${dots} ${statusIcon}`);
|
||
|
||
// Clear the line on next update if in progress
|
||
if (status === 'in-progress') {
|
||
process.stdout.write('\x1b[1A'); // Move cursor up one line
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Get emoji for project type
|
||
*/
|
||
function getProjectTypeEmoji(projectType: string): string {
|
||
switch (projectType) {
|
||
case 'npm':
|
||
return '📦 npm';
|
||
case 'deno':
|
||
return '🦕 Deno';
|
||
case 'both':
|
||
return '🔀 npm + Deno';
|
||
default:
|
||
return '❓ Unknown';
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Get emoji for commit type
|
||
*/
|
||
function getCommitTypeEmoji(commitType: string): string {
|
||
switch (commitType) {
|
||
case 'fix':
|
||
return '🔧 fix';
|
||
case 'feat':
|
||
return '✨ feat';
|
||
case 'BREAKING CHANGE':
|
||
return '💥 BREAKING CHANGE';
|
||
default:
|
||
return commitType;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Print final commit summary
|
||
*/
|
||
export function printSummary(summary: ICommitSummary): void {
|
||
const lines = [
|
||
`Project Type: ${getProjectTypeEmoji(summary.projectType)}`,
|
||
`Branch: 🌿 ${summary.branch}`,
|
||
`Commit Type: ${getCommitTypeEmoji(summary.commitType)}`,
|
||
`Scope: 📍 ${summary.commitScope}`,
|
||
`New Version: 🏷️ v${summary.newVersion}`,
|
||
];
|
||
|
||
if (summary.commitSha) {
|
||
lines.push(`Commit SHA: 📌 ${summary.commitSha}`);
|
||
}
|
||
|
||
if (summary.pushed) {
|
||
lines.push(`Remote: ✓ Pushed successfully`);
|
||
} else {
|
||
lines.push(`Remote: ⊘ Not pushed (local only)`);
|
||
}
|
||
|
||
if (summary.repoUrl && summary.commitSha) {
|
||
lines.push('');
|
||
lines.push(`View at: ${summary.repoUrl}/commit/${summary.commitSha}`);
|
||
}
|
||
|
||
printSection('✅ Commit Summary', lines);
|
||
|
||
if (summary.pushed) {
|
||
console.log('🎉 All done! Your changes are committed and pushed.\n');
|
||
} else {
|
||
console.log('✓ Commit created successfully.\n');
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Print an info message with consistent formatting
|
||
*/
|
||
export function printInfo(message: string): void {
|
||
console.log(` ℹ️ ${message}`);
|
||
}
|
||
|
||
/**
|
||
* Print a success message
|
||
*/
|
||
export function printSuccess(message: string): void {
|
||
console.log(` ✓ ${message}`);
|
||
}
|
||
|
||
/**
|
||
* Print a warning message
|
||
*/
|
||
export function printWarning(message: string): void {
|
||
logger.log('warn', `⚠️ ${message}`);
|
||
}
|
||
|
||
/**
|
||
* Print an error message
|
||
*/
|
||
export function printError(message: string): void {
|
||
logger.log('error', `✗ ${message}`);
|
||
}
|
||
|
||
/**
|
||
* Print commit message being created
|
||
*/
|
||
export function printCommitMessage(commitString: string): void {
|
||
console.log(`\n 📝 Commit: ${commitString}\n`);
|
||
}
|