UNPKG

titanium

Version:

Command line interface for building Titanium SDK apps

145 lines (117 loc) 3.18 kB
import chalk from 'chalk'; import { EventEmitter } from 'node:events'; import { format } from 'node:util'; const { bold, cyan, gray, green, magenta, red, yellow } = chalk; // eslint-disable-next-line no-control-regex const ansiRE = /\x1B\[\d+m/g; export class Logger extends EventEmitter { #banner = ''; #bannerEnabled = true; #skipBanner = false; #bannerRendered = false; #level = 3; #timestampEnabled = false; levels = { trace: 1, debug: 2, info: 3, warn: 4, error: 5 // log: 9 // silent: 10 }; constructor(logLevel, opts = {}) { super(); this.stdout = opts.stdout || process.stdout; this.stderr = opts.stderr || process.stderr; this.log = (msg = '', ...args) => { this.render(9, this.stdout, format(msg, ...args)); }; this.logerr = (msg = '', ...args) => { this.render(9, this.stderr, format(msg, ...args)); }; this.trace = (msg = '', ...args) => { this.render(1, this.stderr, gray(`[TRACE] ${format(msg, ...args)}`)); }; this.debug = (msg = '', ...args) => { this.render(2, this.stderr, `${magenta('[DEBUG]')} ${format(msg, ...args)}`); }; this.info = (msg = '', ...args) => { this.render(3, this.stdout, `${green('[INFO]')} ${format(msg, ...args)}`); }; this.warn = (msg = '', ...args) => { this.render(4, this.stderr, `${yellow(`[WARN] ${format(msg, ...args).replace(ansiRE, '')}`)}`); }; this.error = (msg = '', ...args) => { this.render(5, this.stderr, red(`[ERROR] ${format(msg, ...args).replace(ansiRE, '')}`)); }; if (logLevel !== undefined) { this.setLevel(logLevel); } } banner() { if (this.#bannerEnabled && !this.#skipBanner && this.#level && !this.#bannerRendered) { this.stdout.write(this.#banner); this.stdout.write('\n'); this.#bannerRendered = true; this.emit('cli:logger-banner'); } } // get or set the bannerEnabled flag bannerEnabled(b) { if (b !== undefined) { this.#bannerEnabled = !!b; } return this.#bannerEnabled; } bannerWasRendered() { return this.#bannerRendered; } getBanner() { return this.#banner; } getLevels() { return Object.keys(this.levels); } render(level, out, msg) { if (level >= this.#level) { if (this.#timestampEnabled) { out.write(gray(`${new Date().toISOString()} - `)); } out.write(msg); out.write('\n'); } } setBanner({ name, copyright, version, sdkVersion }) { this.#banner = `${bold(cyan(name))} v${version}${ sdkVersion ? ` SDK v${sdkVersion}` : '' } ${copyright} Please star us on GitHub! ${cyan('https://github.com/tidev/titanium-cli')} and ${cyan('https://github.com/tidev/titanium-sdk')} Want to help? ${cyan('https://tidev.io/donate')} or ${cyan('https://tidev.io/contribute')} `; } setLevel(level) { if (typeof level === 'string' && this.levels[level]) { this.#level = this.levels[level]; } else if (typeof level === 'number') { this.#level = level; } } silence() { this.#level = 10; } skipBanner(b) { if (b !== undefined) { this.#skipBanner = !!b; } return this.#skipBanner; } timestampEnabled(b) { if (b !== undefined) { this.#timestampEnabled = !!b; } return this.#timestampEnabled; } }