import type { LogLevel } from './types.js'; export function getEnv(name: string, defaultValue?: string): string | undefined { return process.env[name] || defaultValue; } export function getLogLevel(prefix?: string): LogLevel { const envName = prefix ? `${prefix}_LOG_LEVEL` : 'LOG_LEVEL'; const val = getEnv(envName, 'info') as LogLevel; const validLevels: LogLevel[] = ['verbose', 'debug', 'info', 'warn', 'error']; return validLevels.includes(val) ? val : 'info'; } export function getThrowError(prefix?: string): boolean { const envName = prefix ? `${prefix}_THROW_ERROR` : 'THROW_ERROR'; const val = getEnv(envName); if (val === undefined) return true; return val.toLowerCase() === 'true'; } export function matchesDebug(namespace: string): boolean { const debugEnv = getEnv('DEBUG'); if (!debugEnv) return false; const patterns = debugEnv.split(',').map(p => p.trim()); for (const pattern of patterns) { if (pattern === '*') return true; const regex = new RegExp('^' + pattern.replace(/\*/g, '.*') + '$'); if (regex.test(namespace)) return true; } return false; } export const LevelSeverity: Record = { verbose: 0, debug: 1, info: 2, warn: 3, error: 4, }; export function shouldLog(level: LogLevel, threshold: LogLevel, namespace?: string): boolean { if (LevelSeverity[level] >= LevelSeverity[threshold]) { return true; } if ((level === 'verbose' || level === 'debug') && namespace && matchesDebug(namespace)) { return true; } return false; }