@logistically/i18n-cli
Version:
Enterprise-grade CLI tool for extracting and managing translations in Logistically microservices
217 lines • 7.92 kB
JavaScript
;
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