UNPKG

@minecraft/creator-tools

Version:

Minecraft Creator Tools command line and libraries.

193 lines (192 loc) 6.25 kB
"use strict"; /** * 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); }