UNPKG

@logistically/i18n-cli

Version:

Enterprise-grade CLI tool for extracting and managing translations in Logistically microservices

217 lines 7.92 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Logger = void 0; const chalk_1 = __importDefault(require("chalk")); const fs_extra_1 = __importDefault(require("fs-extra")); const path_1 = __importDefault(require("path")); class Logger { constructor() { this.verbose = false; this.logLevel = 'info'; this.logFormat = 'text'; this.logOutput = 'console'; this.logBuffer = []; this.maxBufferSize = 1000; } static getInstance() { if (!Logger.instance) { Logger.instance = new Logger(); } return Logger.instance; } configure(config) { if (config.level) this.logLevel = config.level; if (config.format) this.logFormat = config.format; if (config.output) this.logOutput = config.output; if (config.filePath) this.logFilePath = config.filePath; } setVerbose(verbose) { this.verbose = verbose; if (verbose) { this.logLevel = 'debug'; } else { this.logLevel = 'info'; } } shouldLog(level) { const levels = { debug: 0, info: 1, warn: 2, error: 3 }; return levels[level] >= levels[this.logLevel]; } createLogEntry(level, message, context, metadata) { return { timestamp: new Date().toISOString(), level, message, context, metadata, }; } async writeLog(entry) { // Add to buffer this.logBuffer.push(entry); if (this.logBuffer.length > this.maxBufferSize) { this.logBuffer.shift(); } // Write to file if configured if ((this.logOutput === 'file' || this.logOutput === 'both') && this.logFilePath) { try { await fs_extra_1.default.ensureDir(path_1.default.dirname(this.logFilePath)); const logLine = this.logFormat === 'json' ? JSON.stringify(entry) + '\n' : `${entry.timestamp} [${entry.level.toUpperCase()}] ${entry.message}\n`; await fs_extra_1.default.appendFile(this.logFilePath, logLine); } catch (error) { // Fallback to console if file writing fails console.error(`Failed to write to log file: ${error}`); } } // Write to console if configured if (this.logOutput === 'console' || this.logOutput === 'both') { this.writeToConsole(entry); } } writeToConsole(entry) { const { level, message, context } = entry; const contextStr = context ? ` [${context}]` : ''; switch (level) { case 'debug': console.log(chalk_1.default.gray('🔍'), message + contextStr); break; case 'info': console.log(chalk_1.default.blue('ℹ'), message + contextStr); break; case 'warn': console.log(chalk_1.default.yellow('⚠️'), message + contextStr); break; case 'error': console.log(chalk_1.default.red('❌'), message + contextStr); break; } } info(message, context, metadata) { if (this.shouldLog('info')) { const entry = this.createLogEntry('info', message, context, metadata); this.writeLog(entry); } } success(message, context, metadata) { if (this.shouldLog('info')) { const entry = this.createLogEntry('info', message, context, metadata); this.writeLog(entry); console.log(chalk_1.default.green('✅'), message); } } warning(message, context, metadata) { if (this.shouldLog('warn')) { const entry = this.createLogEntry('warn', message, context, metadata); this.writeLog(entry); } } error(message, context, metadata) { if (this.shouldLog('error')) { const entry = this.createLogEntry('error', message, context, metadata); this.writeLog(entry); } } debug(message, context, metadata) { if (this.shouldLog('debug')) { const entry = this.createLogEntry('debug', message, context, metadata); this.writeLog(entry); } } progress(message, context) { if (this.shouldLog('info')) { console.log(chalk_1.default.cyan('🔄'), message); } } header(message) { console.log(chalk_1.default.bold.cyan('\n' + '='.repeat(50))); console.log(chalk_1.default.bold.cyan(message)); console.log(chalk_1.default.bold.cyan('='.repeat(50))); } section(message) { console.log(chalk_1.default.bold.blue('\n' + message)); console.log(chalk_1.default.blue('-'.repeat(message.length))); } table(data) { if (data.length === 0) { this.info('No data to display'); return; } const headers = Object.keys(data[0]); const maxLengths = headers.map(header => Math.max(header.length, ...data.map(row => String(row[header]).length))); // Print header const headerRow = headers.map((header, i) => chalk_1.default.bold(header.padEnd(maxLengths[i]))).join(' | '); console.log(headerRow); console.log('-'.repeat(headerRow.length)); // Print data data.forEach(row => { const dataRow = headers.map((header, i) => String(row[header]).padEnd(maxLengths[i])).join(' | '); console.log(dataRow); }); } // Enterprise-grade logging methods logValidationErrors(errors, context) { if (errors.length > 0) { this.error(`Validation failed with ${errors.length} errors`, context); errors.forEach((error, index) => { this.error(`${index + 1}. ${error.message}`, context, { type: error.type, file: error.file, line: error.line }); }); } } logValidationWarnings(warnings, context) { if (warnings.length > 0) { this.warning(`Found ${warnings.length} warnings`, context); warnings.forEach((warning, index) => { this.warning(`${index + 1}. ${warning.message}`, context, { suggestion: warning.suggestion, file: warning.file, line: warning.line }); }); } } logPerformanceMetrics(metrics, context) { this.info('Performance metrics', context, { duration: `${metrics.duration}ms`, filesProcessed: metrics.filesProcessed, totalKeys: metrics.totalKeys, memoryUsage: `${metrics.memoryUsage.toFixed(2)}MB`, cpuUsage: `${metrics.cpuUsage.toFixed(2)}s` }); } // Get log buffer for analysis getLogBuffer() { return [...this.logBuffer]; } // Clear log buffer clearLogBuffer() { this.logBuffer = []; } // Export logs to file async exportLogs(outputPath) { try { const logData = this.logBuffer.map(entry => this.logFormat === 'json' ? JSON.stringify(entry) : `${entry.timestamp} [${entry.level.toUpperCase()}] ${entry.message}`).join('\n'); await fs_extra_1.default.writeFile(outputPath, logData); this.success(`Logs exported to ${outputPath}`); } catch (error) { this.error(`Failed to export logs: ${error}`); } } } exports.Logger = Logger; //# sourceMappingURL=logger.js.map