UNPKG

@ui18n/cli

Version:

🌍 UI18n CLI工具 - 强大的国际化命令行工具

233 lines 6.3 kB
import { appendFileSync, existsSync, mkdirSync } from 'fs'; import { dirname } from 'path'; /** * 日志工具类 */ export class Logger { constructor(options) { this.level = 'info'; this.useColors = true; this.showTimestamp = true; this.levels = { debug: 0, info: 1, warn: 2, error: 3, silent: 4 }; if (options) { this.level = options.level || 'info'; this.useColors = options.colors !== false; this.showTimestamp = options.timestamp !== false; this.logFile = options.logFile; } } /** * 设置日志级别 */ setLevel(level) { this.level = level; } /** * 设置是否使用颜色 */ setColors(useColors) { this.useColors = useColors; } /** * 设置日志文件 */ setLogFile(logFile) { this.logFile = logFile; // 确保日志目录存在 const dir = dirname(logFile); if (!existsSync(dir)) { mkdirSync(dir, { recursive: true }); } } /** * 调试日志 */ debug(message, ...args) { this.log('debug', message, ...args); } /** * 信息日志 */ info(message, ...args) { this.log('info', message, ...args); } /** * 警告日志 */ warn(message, ...args) { this.log('warn', message, ...args); } /** * 错误日志 */ error(message, ...args) { this.log('error', message, ...args); } /** * 成功日志 */ success(message, ...args) { this.log('info', `✅ ${message}`, ...args); } /** * 失败日志 */ fail(message, ...args) { this.log('error', `❌ ${message}`, ...args); } /** * 步骤日志 */ step(message, ...args) { this.log('info', `🔄 ${message}`, ...args); } /** * 完成日志 */ done(message, ...args) { this.log('info', `🎉 ${message}`, ...args); } /** * 核心日志方法 */ log(level, message, ...args) { if (this.levels[level] < this.levels[this.level]) { return; } const timestamp = this.showTimestamp ? this.getTimestamp() : ''; const levelLabel = this.getLevelLabel(level); const formattedMessage = this.formatMessage(timestamp, levelLabel, message, ...args); // 输出到控制台 if (level === 'error') { console.error(formattedMessage); } else { console.log(formattedMessage); } // 写入日志文件 if (this.logFile) { const plainMessage = this.formatMessage(timestamp, level.toUpperCase(), message, ...args, false); try { appendFileSync(this.logFile, plainMessage + '\n'); } catch { // 忽略文件写入错误 } } } /** * 获取时间戳 */ getTimestamp() { return new Date().toISOString(); } /** * 获取级别标签 */ getLevelLabel(level) { // 简化版本,不使用chalk,直接返回大写标签 return level.toUpperCase(); } formatMessage(timestamp, levelLabel, message, ...args) { const useColors = typeof args[args.length - 1] === 'boolean' ? args.pop() : this.useColors; let parts = []; if (timestamp) { parts.push(`[${timestamp}]`); } parts.push(`[${levelLabel}]`); // 格式化主消息 let formattedMessage = message; if (args.length > 0) { formattedMessage += ' ' + args.map(arg => typeof arg === 'object' ? JSON.stringify(arg, null, 2) : String(arg)).join(' '); } parts.push(formattedMessage); return parts.join(' '); } /** * 创建子日志器 */ child(prefix) { const childLogger = new Logger({ level: this.level, colors: this.useColors, timestamp: this.showTimestamp, logFile: this.logFile }); // 重写日志方法以添加前缀 const originalLog = childLogger.log.bind(childLogger); childLogger.log = (level, message, ...args) => { originalLog(level, `[${prefix}] ${message}`, ...args); }; return childLogger; } /** * 创建进度日志器 */ progress(total) { return new ProgressLogger(this, total); } } /** * 进度日志器 */ export class ProgressLogger { constructor(logger, total) { this.logger = logger; this.total = total; this.current = 0; this.startTime = Date.now(); } /** * 更新进度 */ update(current, message) { this.current = current; const percentage = Math.round((current / this.total) * 100); const elapsed = Date.now() - this.startTime; const eta = current > 0 ? Math.round((elapsed / current) * (this.total - current)) : 0; let progressMessage = `进度: ${current}/${this.total} (${percentage}%)`; if (eta > 0) { progressMessage += ` - 预计剩余: ${this.formatTime(eta)}`; } if (message) { progressMessage += ` - ${message}`; } this.logger.info(progressMessage); } /** * 完成进度 */ complete(message) { const elapsed = Date.now() - this.startTime; const completionMessage = message || `完成! 总用时: ${this.formatTime(elapsed)}`; this.logger.success(completionMessage); } /** * 格式化时间 */ formatTime(ms) { if (ms < 1000) { return `${ms}ms`; } else if (ms < 60000) { return `${Math.round(ms / 1000)}s`; } else { const minutes = Math.floor(ms / 60000); const seconds = Math.round((ms % 60000) / 1000); return `${minutes}m ${seconds}s`; } } } // 默认导出 export default Logger; // 确保模块正确导出 // 导出类 // Logger 和 ProgressLogger 已经在上面导出了 //# sourceMappingURL=logger.js.map