• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

dev-ignis / cross-log / 16982792483

15 Aug 2025 04:15AM UTC coverage: 85.706% (-9.9%) from 95.62%
16982792483

push

github

dev-ignis
test: - ci;

489 of 647 branches covered (75.58%)

Branch coverage included in aggregate %.

944 of 1025 relevant lines covered (92.1%)

357.96 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

97.83
/src/loggers/node.ts
1
/**
2
 * Node.js-specific logger implementation
3
 */
4

5
import { BaseLogger } from './base';
27✔
6
import { LogLevel, LogEntry, PartialLoggerConfig } from '../core/types';
27✔
7
import { createAnsiColor, resetAnsiColor } from '../core/utils';
27✔
8

9
export class NodeLogger extends BaseLogger {
27✔
10
  private originalConsole: {
11
    debug: typeof console.debug;
12
    info: typeof console.info;
13
    warn: typeof console.warn;
14
    error: typeof console.error;
15
    log: typeof console.log;
16
  };
17

18
  constructor(initialConfig?: PartialLoggerConfig) {
19
    super(initialConfig);
411✔
20

21
    // Store references to original console methods to prevent infinite recursion
22
    this.originalConsole = {
411✔
23
      debug: console.debug.bind(console),
24
      info: console.info.bind(console),
25
      warn: console.warn.bind(console),
26
      error: console.error.bind(console),
27
      log: console.log.bind(console)
28
    };
29
  }
30

31
  /**
32
   * Output log with Node.js-specific ANSI coloring
33
   */
34
  protected outputLog(
35
    level: LogLevel,
36
    formattedMessage: string,
37
    _logEntry: LogEntry,
38
    ...args: unknown[]
39
  ): void {
40
    const config = this.configManager.getConfig();
1,056✔
41

42
    // Get the original console method to avoid infinite recursion
43
    // when logger methods are used to replace console methods
44
    const originalConsole = this.getOriginalConsoleMethod(level);
1,056✔
45

46
    if (config.colors.enabled) {
1,056✔
47
      const colorCode = this.getAnsiColorForLevel(level);
525✔
48
      const colorStart = createAnsiColor(colorCode);
525✔
49
      const colorEnd = resetAnsiColor();
525✔
50
      originalConsole(`${colorStart}${formattedMessage}${colorEnd}`, ...args);
525✔
51
    } else {
52
      originalConsole(formattedMessage, ...args);
531✔
53
    }
54
  }
55

56
  /**
57
   * Output stack trace for errors
58
   */
59
  protected outputStackTrace(error: Error): void {
60
    if (error.stack) {
18✔
61
      // Use original console.error to avoid infinite recursion
62
      const originalError = this.getOriginalConsoleMethod(LogLevel.ERROR);
15✔
63
      originalError(error.stack);
15✔
64
    }
65
  }
66

67
  /**
68
   * Get original console method to avoid infinite recursion
69
   */
70
  private getOriginalConsoleMethod(level: LogLevel): (message?: unknown, ...optionalParams: unknown[]) => void {
71
    switch (level) {
1,071✔
72
      case LogLevel.DEBUG:
73
        return this.originalConsole.debug;
300✔
74
      case LogLevel.INFO:
75
        return this.originalConsole.info;
591✔
76
      case LogLevel.WARN:
77
        return this.originalConsole.warn;
78✔
78
      case LogLevel.ERROR:
79
        return this.originalConsole.error;
99✔
80
      default:
81
        return this.originalConsole.log;
3✔
82
    }
83
  }
84

85
  /**
86
   * Get ANSI color code for log level
87
   */
88
  private getAnsiColorForLevel(level: LogLevel): number {
89
    const config = this.configManager.getConfig();
525✔
90
    const colors = config.colors.ansi;
525✔
91

92
    switch (level) {
525✔
93
      case LogLevel.DEBUG:
94
        return colors.debug;
273✔
95
      case LogLevel.INFO:
96
        return colors.info;
102✔
97
      case LogLevel.WARN:
98
        return colors.warn;
72✔
99
      case LogLevel.ERROR:
100
        return colors.error;
75✔
101
      default:
102
        return colors.info;
3✔
103
    }
104
  }
105
}
106

107
/**
108
 * Factory function to create a node logger instance
109
 */
110
export function createLogger(config?: PartialLoggerConfig): NodeLogger {
27✔
111
  return new NodeLogger(config);
×
112
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc