Files

60 lines
1.3 KiB
JavaScript

const util = require('util')
const levels = {
silly: -Infinity,
verbose: 1000,
info: 2000,
http: 3000,
warn: 4000,
error: 5000,
silent: Infinity,
}
const colors = {
silly: 'inverse',
verbose: 'blue',
info: 'green',
http: 'green',
warn: 'yellow',
error: 'red',
}
let currentLevel = levels.info
function log(level, prefix, message, ...args) {
if (currentLevel <= levels[level]) {
const stream = level === 'error' ? process.stderr : process.stdout
const color = colors[level]
let levelStr = level.toUpperCase()
if (process.stdout.isTTY && util.styleText) {
// util.styleText is available in Node.js >= 20.12.0
levelStr = util.styleText(color, levelStr)
if (prefix) prefix = util.styleText('magenta', prefix)
}
const formattedMessage = util.format(message, ...args)
const line = prefix
? util.format('%s %s %s', levelStr, prefix, formattedMessage)
: util.format('%s %s', levelStr, formattedMessage)
stream.write(line + '\n')
}
}
const logger = {
get level() {
return Object.keys(levels).find((key) => levels[key] === currentLevel)
},
set level(newLevel) {
if (levels[newLevel] !== undefined) {
currentLevel = levels[newLevel]
}
},
}
for (const level of Object.keys(colors)) {
logger[level] = (prefix, message, ...args) => log(level, prefix, message, ...args)
}
module.exports = logger