Files
n8n-enterprise-unlocked/packages/@n8n/ai-workflow-builder.ee/evaluations/cli/display.ts

103 lines
2.7 KiB
TypeScript

import cliProgress from 'cli-progress';
import pc from 'picocolors';
import type { TestCase } from '../types/evaluation.js';
import type { TestResult } from '../types/test-result.js';
import {
calculateTestMetrics,
calculateCategoryAverages,
countViolationsByType,
} from '../utils/evaluation-calculator.js';
import {
displayTestResults,
displaySummaryTable,
displayViolationsDetail,
} from '../utils/evaluation-reporter.js';
/**
* Creates a progress bar for test execution
* @param total - Total number of tests
* @returns Progress bar instance
*/
export function createProgressBar(total: number): cliProgress.SingleBar {
const progressBar = new cliProgress.SingleBar(
{
format: 'Progress |{bar}| {percentage}% | {value}/{total} Tests | {status}',
barCompleteChar: '█',
barIncompleteChar: '░',
hideCursor: true,
},
cliProgress.Presets.shades_classic,
);
progressBar.start(total, 0, { status: 'Starting...' });
return progressBar;
}
/**
* Updates progress bar with current status
* @param progressBar - Progress bar instance
* @param completed - Number of completed tests
* @param total - Total number of tests
* @param status - Optional status message
*/
export function updateProgress(
progressBar: cliProgress.SingleBar,
completed: number,
total: number,
status?: string,
): void {
progressBar.update(completed, {
status: status ?? `${completed}/${total} completed`,
});
}
/**
* Displays evaluation results in the console
* @param testCases - Array of test cases
* @param results - Array of test results
* @param totalTime - Total execution time in milliseconds
*/
export function displayResults(
testCases: TestCase[],
results: TestResult[],
totalTime: number,
): void {
// Display test results
displayTestResults(testCases, results);
console.log();
console.log(pc.green(`✓ All tests completed in ${(totalTime / 1000).toFixed(1)}s`));
// Calculate metrics
const metrics = calculateTestMetrics(results);
const categoryAverages = calculateCategoryAverages(results);
const violationCounts = countViolationsByType(results);
const combinedMetrics = {
...metrics,
categoryAverages,
violationCounts,
};
// Display summary
displaySummaryTable(results, combinedMetrics);
// Display violations if any exist
if (violationCounts.critical > 0 || violationCounts.major > 0 || violationCounts.minor > 0) {
displayViolationsDetail(results);
}
}
/**
* Displays error message and exits
* @param message - Error message
* @param error - Optional error object
*/
export function displayError(message: string, error?: unknown): void {
console.error(pc.red(`${message}`));
if (error) {
console.error(error);
}
process.exit(1);
}