sync-upstream
Version:
A tool for synchronizing code with upstream repositories with incremental updates and parallel processing.
142 lines (141 loc) • 5.36 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.logger = exports.Logger = exports.LogLevel = void 0;
const node_path_1 = __importDefault(require("node:path"));
const chalk_1 = __importDefault(require("chalk"));
const consola_1 = __importDefault(require("consola"));
const date_fns_1 = require("date-fns");
const fs_extra_1 = __importDefault(require("fs-extra"));
// 定义日志级别
var LogLevel;
(function (LogLevel) {
LogLevel["DEBUG"] = "debug";
LogLevel["INFO"] = "info";
LogLevel["SUCCESS"] = "success";
LogLevel["WARN"] = "warn";
LogLevel["ERROR"] = "error";
LogLevel["VERBOSE"] = "verbose";
})(LogLevel || (exports.LogLevel = LogLevel = {}));
// 默认日志配置
const DEFAULT_CONFIG = {
level: LogLevel.INFO,
logToFile: false,
logFilePath: node_path_1.default.join(process.cwd(), 'sync-upstream.log'),
showTimestamp: true,
showLevel: true,
};
class Logger {
constructor(config = {}) {
this.logLevels = [
LogLevel.DEBUG,
LogLevel.VERBOSE,
LogLevel.INFO,
LogLevel.SUCCESS,
LogLevel.WARN,
LogLevel.ERROR,
];
this.config = { ...DEFAULT_CONFIG, ...config };
this.consola = consola_1.default.create({
level: this.logLevels.indexOf(this.config.level),
formatOptions: {
colors: true,
date: this.config.showTimestamp,
},
});
// 如果配置了日志文件,确保目录存在
if (this.config.logToFile) {
fs_extra_1.default.ensureDirSync(node_path_1.default.dirname(this.config.logFilePath));
}
}
// 获取当前时间戳
getTimestamp() {
return (0, date_fns_1.format)(new Date(), 'YYYY-MM-DD HH:mm:ss');
}
// 记录到文件
logToFile(level, message) {
if (!this.config.logToFile)
return;
const timestamp = this.getTimestamp();
const logMessage = this.config.showLevel
? `[${timestamp}] [${level.toUpperCase()}] ${message}\n`
: `[${timestamp}] ${message}\n`;
fs_extra_1.default.appendFile(this.config.logFilePath, logMessage)
.catch(error => console.error('写入日志文件失败:', error));
}
// 调试日志
debug(message) {
if (this.logLevels.indexOf(LogLevel.DEBUG) >= this.logLevels.indexOf(this.config.level)) {
this.consola.debug(chalk_1.default.blue(`[DEBUG] ${message}`));
this.logToFile(LogLevel.DEBUG, message);
}
}
// 详细日志
verbose(message) {
if (this.logLevels.indexOf(LogLevel.VERBOSE) >= this.logLevels.indexOf(this.config.level)) {
this.consola.log(chalk_1.default.grey(`[VERBOSE] ${message}`));
this.logToFile(LogLevel.VERBOSE, message);
}
}
// 设置日志级别
setLevel(level) {
this.config.level = level;
this.consola.level = this.logLevels.indexOf(level);
}
// 信息日志
info(message) {
if (this.logLevels.indexOf(LogLevel.INFO) >= this.logLevels.indexOf(this.config.level)) {
this.consola.info(chalk_1.default.cyan(`[INFO] ${message}`));
this.logToFile(LogLevel.INFO, message);
}
}
// 成功日志
success(message) {
if (this.logLevels.indexOf(LogLevel.SUCCESS) >= this.logLevels.indexOf(this.config.level)) {
this.consola.success(chalk_1.default.green(`[SUCCESS] ${message}`));
this.logToFile(LogLevel.SUCCESS, message);
}
}
// 警告日志
warn(message) {
if (this.logLevels.indexOf(LogLevel.WARN) >= this.logLevels.indexOf(this.config.level)) {
this.consola.warn(chalk_1.default.yellow(`[WARN] ${message}`));
this.logToFile(LogLevel.WARN, message);
}
}
// 错误日志
error(message, error) {
if (this.logLevels.indexOf(LogLevel.ERROR) >= this.logLevels.indexOf(this.config.level)) {
const errorMessage = error ? `${message}: ${error.message}` : message;
this.consola.error(chalk_1.default.red(`[ERROR] ${errorMessage}`));
this.logToFile(LogLevel.ERROR, errorMessage);
// 如果有错误堆栈,也记录下来
if (error?.stack) {
this.logToFile(LogLevel.ERROR, `Stack trace: ${error.stack}`);
}
}
}
// 步骤日志(用于显示同步过程中的主要步骤)
step(stepNumber, message) {
const formattedMessage = chalk_1.default.bold.magenta(`
${stepNumber}. ${message}`);
this.consola.log(formattedMessage);
this.logToFile(LogLevel.INFO, `Step ${stepNumber}: ${message}`);
}
// 更新配置
updateConfig(config) {
this.config = { ...this.config, ...config };
this.consola = consola_1.default.create({
level: this.logLevels.indexOf(this.config.level),
formatOptions: {
colors: true,
date: this.config.showTimestamp,
},
});
}
}
exports.Logger = Logger;
// 创建默认 logger 实例
exports.logger = new Logger();