File size: 1,437 Bytes
d6986d3
 
 
 
 
 
 
 
 
 
 
a484614
 
d6986d3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a484614
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d6986d3
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64


enum Color {
  Reset = "\x1b[0m",
  Gray = "\x1b[90m",
  Blue = "\x1b[34m",
  Yellow = "\x1b[33m",
  Red = "\x1b[31m",
}

export class Logger {
  private timers = new Map<string, number>();

  constructor(private readonly context?: string) {}

  debug(message: string, ...meta: unknown[]): void {
    this.log("DEBUG", Color.Gray, message, meta);
  }

  info(message: string, ...meta: unknown[]): void {
    this.log("INFO ", Color.Blue, message, meta);
  }

  warn(message: string, ...meta: unknown[]): void {
    this.log("WARN ", Color.Yellow, message, meta);
  }

  error(message: string, ...meta: unknown[]): void {
    this.log("ERROR", Color.Red, message, meta);
  }

  time(label: string = "default"): void {
    this.timers.set(label, performance.now());
  }

  timeEnd(label: string = "default"): void {
    const start = this.timers.get(label);

    if (start === undefined) {
      this.warn(`Timer '${label}' does not exist`);
      return;
    }

    const duration = performance.now() - start;
    this.timers.delete(label);

    this.info(`${label}: ${duration.toFixed(3)}ms`);
  }

  private log(
    level: string,
    color: Color,
    message: string,
    meta: unknown[]
  ): void {
    const timestamp = new Date().toISOString();
    const context = this.context ? ` [${this.context}]` : "";

    console.log(
      `${color}[${timestamp}] ${level}${context}: ${message}${Color.Reset}`,
      ...meta
    );
  }
}