@teaui/core
Version:
A high-level terminal UI library for Node
71 lines • 1.97 kB
JavaScript
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