@@ -2,7 +2,6 @@ import util from "node:util"
22
33export type LoggerMeta = Record < string , unknown >
44
5- // todo: respect NO_COLOR env var, tty, TERM, etc.
65enum Color {
76 FgRed = "\x1b[31m" ,
87 FgYellow = "\x1b[33m" ,
@@ -15,25 +14,52 @@ const ConsoleSink = {
1514 error : ( it : string ) => console . info ( it ) ,
1615}
1716
17+ const shouldColor = ( isTTY : boolean ) => {
18+ if ( process . env . NO_COLOR ) {
19+ return false
20+ }
21+
22+ if ( process . env . NODE_DISABLE_COLORS ) {
23+ return false
24+ }
25+
26+ if ( process . env . TERM === "dumb" ) {
27+ return false
28+ }
29+
30+ return isTTY
31+ }
32+
1833export class Logger {
1934 private readonly startTime = this . now ( )
2035 private readonly times : [ string , bigint , ...bigint [ ] ] [ ] = [ ]
2136
2237 constructor (
38+ private readonly isTTY : boolean ,
2339 private readonly format = defaultFormat ,
2440 private readonly sink = ConsoleSink ,
2541 ) { }
2642
2743 readonly info = ( message : string , meta ?: LoggerMeta ) : void => {
28- this . sink . info ( this . format ( "info" , message , meta ) )
44+ this . sink . info ( this . format ( "info" , message , meta , shouldColor ( this . isTTY ) ) )
2945 }
3046
3147 readonly warn = ( message : string , meta ?: LoggerMeta ) : void => {
32- this . sink . warn ( this . format ( "warn" , message , meta , Color . FgYellow ) )
48+ this . sink . warn (
49+ this . format (
50+ "warn" ,
51+ message ,
52+ meta ,
53+ shouldColor ( this . isTTY ) ,
54+ Color . FgYellow ,
55+ ) ,
56+ )
3357 }
3458
3559 readonly error = ( message : string , meta ?: LoggerMeta ) : void => {
36- this . sink . error ( this . format ( "error" , message , meta , Color . FgRed ) )
60+ this . sink . error (
61+ this . format ( "error" , message , meta , shouldColor ( this . isTTY ) , Color . FgRed ) ,
62+ )
3763 }
3864
3965 readonly time = ( description : string ) : void => {
@@ -84,15 +110,16 @@ function defaultFormat(
84110 level : string ,
85111 message : string ,
86112 meta ?: LoggerMeta ,
113+ useColor : boolean = true ,
87114 color = Color . Reset ,
88115) {
89- return `${ color } [${ level } ]${ Color . Reset } ${ message } ${
90- meta ? util . inspect ( meta , false , 3 , false ) : ""
116+ return `${ useColor ? color : "" } [${ level } ]${ useColor ? Color . Reset : "" } ${ message } ${
117+ meta ? util . inspect ( meta , false , 3 , useColor ) : ""
91118 } `
92119}
93120
94121function diff ( start : bigint , end : bigint ) {
95122 return Number ( ( end - start ) / BigInt ( 1000000 ) )
96123}
97124
98- export const logger = new Logger ( )
125+ export const logger = new Logger ( process . stdout . isTTY )
0 commit comments