@minecraft/creator-tools
Version:
Minecraft Creator Tools command line and libraries.
193 lines (192 loc) • 6.25 kB
JavaScript
;
/**
* Logger - Implementation of ILogger for CLI output
*
* Provides:
* - ConsoleLogger: Standard console output with ANSI colors
* - SilentLogger: No output (for testing)
*
* Colors match the existing MCT CLI styling.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.BufferedLogger = exports.SilentLogger = exports.ConsoleLogger = void 0;
exports.createLogger = createLogger;
// ANSI color codes (matching existing index.ts style)
const RESET = "\x1b[0m";
const RED = "\x1b[31m";
const GREEN = "\x1b[32m";
const YELLOW = "\x1b[33m";
const BLUE = "\x1b[34m";
const MAGENTA = "\x1b[35m";
const CYAN = "\x1b[36m";
const DIM = "\x1b[2m";
/**
* ConsoleLogger outputs to console with ANSI colors.
*/
class ConsoleLogger {
verboseEnabled;
quietEnabled;
debugEnabled;
jsonMode;
constructor(verbose = false, quiet = false, debug = false, jsonMode = false) {
this.verboseEnabled = verbose;
this.quietEnabled = quiet;
this.debugEnabled = debug;
this.jsonMode = jsonMode;
}
info(message) {
if (!this.quietEnabled) {
// In JSON mode, non-data output goes to stderr to keep stdout clean for JSON
if (this.jsonMode) {
console.error(message);
}
else {
console.log(message);
}
}
}
warn(message) {
// In quiet mode, suppress warnings (important for --warn-only -q which
// downgrades errors to warnings and expects them to be silenced).
if (this.quietEnabled)
return;
// In JSON mode, non-data output goes to stderr to keep stdout clean for JSON
if (this.jsonMode) {
console.error(`${YELLOW}Warning: ${message}${RESET}`);
}
else {
console.log(`${YELLOW}Warning: ${message}${RESET}`);
}
}
error(message) {
// Errors always show, even in quiet mode
console.error(`${RED}Error: ${message}${RESET}`);
}
verbose(message) {
if (this.verboseEnabled) {
// In JSON mode, non-data output goes to stderr to keep stdout clean for JSON
if (this.jsonMode) {
console.error(`${DIM}${message}${RESET}`);
}
else {
console.log(`${DIM}${message}${RESET}`);
}
}
}
debug(message) {
if (this.debugEnabled) {
// In JSON mode, non-data output goes to stderr to keep stdout clean for JSON
if (this.jsonMode) {
console.error(`${MAGENTA}[DEBUG] ${message}${RESET}`);
}
else {
console.log(`${MAGENTA}[DEBUG] ${message}${RESET}`);
}
}
}
success(message) {
// In JSON mode, non-data output goes to stderr to keep stdout clean for JSON
if (this.jsonMode) {
console.error(`${GREEN}${message}${RESET}`);
}
else {
console.log(`${GREEN}${message}${RESET}`);
}
}
data(message) {
// Machine-readable output (e.g., JSON) always goes to stdout, even in quiet mode
console.log(message);
}
progress(current, total, message) {
if (this.quietEnabled || this.jsonMode) {
return; // Suppress progress in quiet mode and JSON mode
}
const percent = Math.round((current / total) * 100);
const bar = this.createProgressBar(percent);
const msg = message ? ` ${message}` : "";
process.stdout.write(`\r${CYAN}${bar} ${current}/${total} (${percent}%)${msg}${RESET}`);
if (current === total) {
console.log(); // New line when complete
}
}
createProgressBar(percent) {
const width = 20;
const filled = Math.round((percent / 100) * width);
const empty = width - filled;
return `[${"=".repeat(filled)}${" ".repeat(empty)}]`;
}
}
exports.ConsoleLogger = ConsoleLogger;
/**
* SilentLogger produces no output.
* Useful for testing or when output should be suppressed.
*/
class SilentLogger {
info(_message) { }
warn(_message) { }
error(_message) { }
verbose(_message) { }
debug(_message) { }
success(_message) { }
data(_message) { }
progress(_current, _total, _message) { }
}
exports.SilentLogger = SilentLogger;
/**
* BufferedLogger stores all log messages for later retrieval.
* Useful for testing or capturing output.
*/
class BufferedLogger {
messages = [];
info(message) {
this.messages.push({ level: "info", message });
}
warn(message) {
this.messages.push({ level: "warn", message });
}
error(message) {
this.messages.push({ level: "error", message });
}
verbose(message) {
this.messages.push({ level: "verbose", message });
}
debug(message) {
this.messages.push({ level: "debug", message });
}
success(message) {
this.messages.push({ level: "success", message });
}
data(message) {
this.messages.push({ level: "data", message });
}
progress(current, total, message) {
this.messages.push({
level: "progress",
message: `${current}/${total}${message ? ` ${message}` : ""}`,
});
}
clear() {
this.messages.length = 0;
}
getErrors() {
return this.messages.filter((m) => m.level === "error").map((m) => m.message);
}
getWarnings() {
return this.messages.filter((m) => m.level === "warn").map((m) => m.message);
}
}
exports.BufferedLogger = BufferedLogger;
/**
* Create a logger based on options.
* @param verbose Enable verbose output
* @param quiet Suppress non-essential output (errors and warnings still shown)
* @param debug Enable debug output
* @param silent Completely suppress all output (for testing)
* @param jsonMode When true, route all non-data output to stderr so stdout contains only machine-readable JSON
*/
function createLogger(verbose = false, quiet = false, debug = false, silent = false, jsonMode = false) {
if (silent) {
return new SilentLogger();
}
return new ConsoleLogger(verbose, quiet, debug, jsonMode);
}