level-resolver.ts 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. import { minimatch } from 'minimatch';
  2. import type { LoggerConfig } from './types';
  3. /**
  4. * Resolve the log level for a namespace.
  5. * Priority: env var match > config pattern match > config default.
  6. */
  7. export function resolveLevel(
  8. namespace: string,
  9. config: LoggerConfig,
  10. envOverrides: Omit<LoggerConfig, 'default'>,
  11. ): string {
  12. // 1. Check env overrides first (highest priority)
  13. for (const [pattern, level] of Object.entries(envOverrides)) {
  14. if (matchesPattern(namespace, pattern)) {
  15. return level;
  16. }
  17. }
  18. // 2. Check config patterns (excluding the 'default' key)
  19. for (const [pattern, level] of Object.entries(config)) {
  20. if (pattern === 'default') continue;
  21. if (matchesPattern(namespace, pattern)) {
  22. return level;
  23. }
  24. }
  25. // 3. Fall back to config default
  26. return config.default;
  27. }
  28. function matchesPattern(namespace: string, pattern: string): boolean {
  29. // Exact match
  30. if (namespace === pattern) return true;
  31. // Glob match using minimatch
  32. return minimatch(namespace, pattern);
  33. }