@ui18n/cli
Version:
🌍 UI18n CLI工具 - 强大的国际化命令行工具
233 lines • 6.3 kB
JavaScript
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