me / src /generator /utils /logger.js
cheymin's picture
Upload 136 files
e1ae2c6 verified
function parseBooleanEnv(value) {
if (value === undefined || value === null || value === '') return false;
const v = String(value).trim().toLowerCase();
return v === '1' || v === 'true' || v === 'yes' || v === 'y' || v === 'on';
}
function isVerbose() {
return parseBooleanEnv(process.env.MENAV_VERBOSE) || parseBooleanEnv(process.env.DEBUG);
}
function isColorEnabled() {
if (process.env.NO_COLOR) return false;
if (parseBooleanEnv(process.env.FORCE_COLOR)) return true;
return Boolean(
(process.stdout && process.stdout.isTTY) || (process.stderr && process.stderr.isTTY)
);
}
function colorize(text, ansiCode) {
if (!ansiCode || !isColorEnabled()) return text;
return `\x1b[${ansiCode}m${text}\x1b[0m`;
}
function formatMeta(meta) {
if (!meta || typeof meta !== 'object') return '';
const entries = Object.entries(meta)
.filter(([, value]) => value !== undefined && value !== null && value !== '')
.map(([key, value]) => `${key}=${String(value)}`);
if (entries.length === 0) return '';
return ` (${entries.join(', ')})`;
}
function formatPrefix(level) {
const base = `[${level}]`;
if (level === 'ERROR') return colorize(base, 31);
if (level === 'WARN') return colorize(base, 33);
if (level === 'OK') return colorize(base, 32);
return base;
}
function writeLine(level, scope, message, meta) {
const prefix = formatPrefix(level);
const scopePart = scope ? ` ${scope}:` : '';
const line = `${prefix}${scopePart} ${message}${formatMeta(meta)}`;
if (level === 'ERROR') {
console.error(line);
} else if (level === 'WARN') {
console.warn(line);
} else {
console.log(line);
}
}
function createLogger(scope) {
const normalized = scope ? String(scope) : '';
return {
info: (message, meta) => writeLine('INFO', normalized, message, meta),
warn: (message, meta) => writeLine('WARN', normalized, message, meta),
error: (message, meta) => writeLine('ERROR', normalized, message, meta),
ok: (message, meta) => writeLine('OK', normalized, message, meta),
};
}
function startTimer() {
const startedAt = process.hrtime.bigint();
return () => Number((process.hrtime.bigint() - startedAt) / 1_000_000n);
}
module.exports = {
createLogger,
formatMeta,
formatPrefix,
isColorEnabled,
isVerbose,
parseBooleanEnv,
startTimer,
};