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