testify-universal-cli
Version:
Universal interactive CLI tool for scanning and executing tests across multiple programming languages
130 lines (117 loc) • 3.31 kB
JavaScript
import chalk from 'chalk';
/**
* Logger utility for testify
* Supports different log levels and debug mode
*/
class Logger {
constructor() {
this.debugMode = false;
this.logLevels = {
ERROR: 0,
WARN: 1,
INFO: 2,
DEBUG: 3,
TRACE: 4
};
this.currentLevel = this.logLevels.INFO;
}
/**
* Enable or disable debug mode
* @param {boolean} enabled - Whether debug mode is enabled
*/
setDebugMode(enabled) {
this.debugMode = enabled;
this.currentLevel = enabled ? this.logLevels.DEBUG : this.logLevels.INFO;
}
/**
* Set the current log level
* @param {string} level - Log level (ERROR, WARN, INFO, DEBUG, TRACE)
*/
setLogLevel(level) {
if (this.logLevels[level] !== undefined) {
this.currentLevel = this.logLevels[level];
}
}
/**
* Log an error message
* @param {string} message - Message to log
* @param {Error} [error] - Optional error object
*/
error(message, error) {
if (this.currentLevel >= this.logLevels.ERROR) {
console.error(chalk.red(`[ERROR] ${message}`));
if (error && this.debugMode) {
console.error(chalk.red(error.stack || error));
}
}
}
/**
* Log a warning message
* @param {string} message - Message to log
*/
warn(message) {
if (this.currentLevel >= this.logLevels.WARN) {
console.warn(chalk.yellow(`[WARN] ${message}`));
}
}
/**
* Log an info message
* @param {string} message - Message to log
*/
info(message) {
if (this.currentLevel >= this.logLevels.INFO) {
console.log(chalk.blue(`[INFO] ${message}`));
}
}
/**
* Log a debug message (only in debug mode)
* @param {string} message - Message to log
* @param {any} [data] - Optional data to log
*/
debug(message, data) {
if (this.currentLevel >= this.logLevels.DEBUG) {
console.log(chalk.cyan(`[DEBUG] ${message}`));
if (data !== undefined && this.debugMode) {
console.log(chalk.cyan(typeof data === 'object' ? JSON.stringify(data, null, 2) : data));
}
}
}
/**
* Log a trace message (most detailed level)
* @param {string} message - Message to log
* @param {any} [data] - Optional data to log
*/
trace(message, data) {
if (this.currentLevel >= this.logLevels.TRACE) {
console.log(chalk.gray(`[TRACE] ${message}`));
if (data !== undefined && this.debugMode) {
console.log(chalk.gray(typeof data === 'object' ? JSON.stringify(data, null, 2) : data));
}
}
}
/**
* Log a success message
* @param {string} message - Message to log
*/
success(message) {
if (this.currentLevel >= this.logLevels.INFO) {
console.log(chalk.green(`[SUCCESS] ${message}`));
}
}
/**
* Create a timer for performance logging
* @param {string} label - Timer label
* @returns {Function} - Function to end the timer
*/
timer(label) {
if (!this.debugMode) return () => {};
const start = process.hrtime();
return () => {
const [seconds, nanoseconds] = process.hrtime(start);
const duration = seconds * 1000 + nanoseconds / 1000000;
this.debug(`Timer [${label}] completed in ${duration.toFixed(2)}ms`);
};
}
}
// Export a singleton instance
export const logger = new Logger();