@dkoul/auto-testid-core
Version:
Core AST parsing and transformation logic for React and Vue.js attribute generation
203 lines • 6.81 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.log = exports.logger = exports.Logger = void 0;
class Logger {
constructor(prefix, options = {}) {
this.LOG_LEVELS = {
error: 0,
warn: 1,
info: 2,
debug: 3,
verbose: 4,
};
this.COLORS = {
error: '\x1b[31m', // Red
warn: '\x1b[33m', // Yellow
info: '\x1b[36m', // Cyan
debug: '\x1b[35m', // Magenta
verbose: '\x1b[37m', // White
reset: '\x1b[0m', // Reset
dim: '\x1b[2m', // Dim
bold: '\x1b[1m', // Bold
};
this.options = {
level: options.level || Logger.globalLevel,
prefix: options.prefix || prefix || 'AutoTestID',
timestamp: options.timestamp ?? true,
colorize: options.colorize ?? true,
};
}
static setGlobalLevel(level) {
Logger.globalLevel = level;
}
static getGlobalLevel() {
return Logger.globalLevel;
}
error(message, ...args) {
this.log('error', message, ...args);
}
warn(message, ...args) {
this.log('warn', message, ...args);
}
info(message, ...args) {
this.log('info', message, ...args);
}
debug(message, ...args) {
this.log('debug', message, ...args);
}
verbose(message, ...args) {
this.log('verbose', message, ...args);
}
time(label) {
console.time(`${this.options.prefix}:${label}`);
}
timeEnd(label) {
console.timeEnd(`${this.options.prefix}:${label}`);
}
group(label) {
if (this.shouldLog('info')) {
console.group(this.formatMessage('info', label));
}
}
groupEnd() {
if (this.shouldLog('info')) {
console.groupEnd();
}
}
table(data) {
if (this.shouldLog('info')) {
console.table(data);
}
}
log(level, message, ...args) {
if (!this.shouldLog(level)) {
return;
}
const formattedMessage = this.formatMessage(level, message);
const logMethod = this.getLogMethod(level);
if (args.length > 0) {
logMethod(formattedMessage, ...args);
}
else {
logMethod(formattedMessage);
}
}
shouldLog(level) {
return this.LOG_LEVELS[level] <= this.LOG_LEVELS[this.options.level];
}
formatMessage(level, message) {
let formatted = '';
// Add timestamp
if (this.options.timestamp) {
const timestamp = new Date().toISOString();
formatted += this.options.colorize
? `${this.COLORS.dim}${timestamp}${this.COLORS.reset} `
: `${timestamp} `;
}
// Add level indicator
const levelIndicator = `[${level.toUpperCase()}]`;
if (this.options.colorize) {
const color = this.COLORS[level];
formatted += `${color}${this.COLORS.bold}${levelIndicator}${this.COLORS.reset} `;
}
else {
formatted += `${levelIndicator} `;
}
// Add prefix
if (this.options.prefix) {
if (this.options.colorize) {
formatted += `${this.COLORS.dim}${this.options.prefix}:${this.COLORS.reset} `;
}
else {
formatted += `${this.options.prefix}: `;
}
}
// Add message
formatted += message;
return formatted;
}
getLogMethod(level) {
switch (level) {
case 'error':
return console.error;
case 'warn':
return console.warn;
case 'info':
return console.info;
case 'debug':
case 'verbose':
return console.log;
default:
return console.log;
}
}
// Create child logger with additional prefix
child(prefix, options) {
const childPrefix = `${this.options.prefix}:${prefix}`;
return new Logger(childPrefix, { ...this.options, ...options });
}
// Progress logging utilities
progress(current, total, message) {
const percentage = Math.round((current / total) * 100);
const progressBar = this.createProgressBar(percentage);
const progressMessage = message
? `${progressBar} ${percentage}% ${message}`
: `${progressBar} ${percentage}% (${current}/${total})`;
if (this.shouldLog('info')) {
// Use process.stdout.write to overwrite the same line
process.stdout.write(`\r${this.formatMessage('info', progressMessage)}`);
// Add newline when complete
if (current === total) {
process.stdout.write('\n');
}
}
}
createProgressBar(percentage, length = 20) {
const filled = Math.round((percentage / 100) * length);
const empty = length - filled;
if (this.options.colorize) {
return `${this.COLORS.dim}[${'█'.repeat(filled)}${'░'.repeat(empty)}]${this.COLORS.reset}`;
}
else {
return `[${'#'.repeat(filled)}${'-'.repeat(empty)}]`;
}
}
// Metrics and performance logging
metrics(label, metrics) {
if (!this.shouldLog('info'))
return;
this.info(`${label} Metrics:`);
Object.entries(metrics).forEach(([key, value]) => {
const formattedValue = typeof value === 'number'
? value.toLocaleString()
: value;
this.info(` ${key}: ${formattedValue}`);
});
}
// Error logging with stack traces
exception(error, context) {
if (error instanceof Error) {
this.error(`${context ? context + ': ' : ''}${error.message}`);
if (error.stack && this.shouldLog('debug')) {
this.debug('Stack trace:', error.stack);
}
}
else {
this.error(`${context ? context + ': ' : ''}${String(error)}`);
}
}
}
exports.Logger = Logger;
Logger.globalLevel = 'info';
// Default logger instance
exports.logger = new Logger();
// Convenience functions for global logging
exports.log = {
error: (message, ...args) => exports.logger.error(message, ...args),
warn: (message, ...args) => exports.logger.warn(message, ...args),
info: (message, ...args) => exports.logger.info(message, ...args),
debug: (message, ...args) => exports.logger.debug(message, ...args),
verbose: (message, ...args) => exports.logger.verbose(message, ...args),
setLevel: (level) => Logger.setGlobalLevel(level),
};
//# sourceMappingURL=logger.js.map