UNPKG

@teaui/core

Version:

A high-level terminal UI library for Node

71 lines 1.97 kB
import { inspect } from '@teaui/inspect'; import { removeAnsi } from '@teaui/term'; const levels = ['debug', 'error', 'info', 'log', 'warn']; let logs = []; const builtin = {}; levels.forEach(level => { builtin[level] = console[level]; }); export function interceptConsoleLog(logListener = appendLog) { levels.forEach(level => { console[level] = function (...args) { logListener(level, args); }; }); process.on('exit', _code => { flushLogs(); }); } export function decorateConsoleLog() { levels.forEach(level => { const log = console[level]; if (log.isDecorated) { return; } ; log.isDecorated = true; console[level] = function (...args) { log(...args.map(arg => inspect(arg, true))); }; }); } const logListeners = new Set(); export function addListener(listener) { logListeners.add(listener); } export function removeListener(listener) { logListeners.delete(listener); } function appendLog(level, args) { logs.push({ level, args: args.map(arg => typeof arg === 'string' ? inspect(removeAnsi(arg), true) : inspect(arg, true)), }); if (level !== 'debug') { const logLine = logs[logs.length - 1]; for (const listener of logListeners) { listener(logLine); } } } /** * Doesn't report 'console.debug' (I don't remember why). Clears logs, but keeps * console.debug, and returns the logs. */ export function fetchLogs() { const copy = logs.filter(({ level }) => level !== 'debug'); logs = logs.filter(({ level }) => level === 'debug'); return copy; } export function flushLogs() { logs.forEach(({ level, args }) => { builtin[level].apply(console, args); }); logs.splice(0, logs.length); levels.forEach(level => { console[level] = builtin[level]; }); } //# sourceMappingURL=log.js.map