1
1
import { Logger } from './logger' ;
2
2
3
- let globalConsoleStack : Logger [ ] = null ;
4
- let originalConsoleDebug : ( message ?: any , ...optionalParams : any [ ] ) => void ;
5
- let originalConsoleLog : ( message ?: any , ...optionalParams : any [ ] ) => void ;
6
- let originalConsoleWarn : ( message ?: any , ...optionalParams : any [ ] ) => void ;
7
- let originalConsoleError : ( message ?: any , ...optionalParams : any [ ] ) => void ;
3
+ type ConsoleWriter = ( message ?: any , ...optionalParams : any [ ] ) => void ;
8
4
5
+ let globalConsoleStack : Logger [ ] | null = null ;
6
+ let originalConsoleDebug : ConsoleWriter ;
7
+ let originalConsoleLog : ConsoleWriter ;
8
+ let originalConsoleWarn : ConsoleWriter ;
9
+ let originalConsoleError : ConsoleWriter ;
10
+
11
+
12
+ function _push ( logger : Logger ) : Logger {
13
+ if ( ! globalConsoleStack ) {
14
+ throw new Error ( 'ConsoleLoggerStack must be started before pushing a logger.' ) ;
15
+ }
9
16
10
- function _push ( logger : Logger ) {
11
17
if ( globalConsoleStack . length == 0 ) {
12
18
originalConsoleDebug = ( console as any ) . debug ; // Some environment (node) don't have debug.
13
19
originalConsoleLog = console . log ;
14
20
originalConsoleWarn = console . warn ;
15
21
originalConsoleError = console . error ;
16
22
17
23
( console as any ) . debug = ( msg : string , ...args : any [ ] ) => {
18
- globalConsoleStack [ globalConsoleStack . length - 1 ] . debug ( msg , { args } ) ;
24
+ const logger = ConsoleLoggerStack . top ( ) ;
25
+ if ( logger ) {
26
+ logger . debug ( msg , { args } ) ;
27
+ }
19
28
} ;
20
29
console . log = ( msg : string , ...args : any [ ] ) => {
21
- globalConsoleStack [ globalConsoleStack . length - 1 ] . info ( msg , { args } ) ;
30
+ const logger = ConsoleLoggerStack . top ( ) ;
31
+ if ( logger ) {
32
+ logger . info ( msg , { args } ) ;
33
+ }
22
34
} ;
23
35
console . warn = ( msg : string , ...args : any [ ] ) => {
24
- globalConsoleStack [ globalConsoleStack . length - 1 ] . warn ( msg , { args } ) ;
36
+ const logger = ConsoleLoggerStack . top ( ) ;
37
+ if ( logger ) {
38
+ logger . warn ( msg , { args } ) ;
39
+ }
25
40
} ;
26
41
console . error = ( msg : string , ...args : any [ ] ) => {
27
- globalConsoleStack [ globalConsoleStack . length - 1 ] . error ( msg , { args } ) ;
42
+ const logger = ConsoleLoggerStack . top ( ) ;
43
+ if ( logger ) {
44
+ logger . error ( msg , { args } ) ;
45
+ }
28
46
} ;
29
47
}
30
48
globalConsoleStack . push ( logger ) ;
@@ -33,6 +51,9 @@ function _push(logger: Logger) {
33
51
}
34
52
35
53
function _pop ( ) {
54
+ if ( ! globalConsoleStack ) {
55
+ return ;
56
+ }
36
57
globalConsoleStack [ globalConsoleStack . length - 1 ] . complete ( ) ;
37
58
globalConsoleStack . pop ( ) ;
38
59
if ( globalConsoleStack . length == 0 ) {
@@ -55,18 +76,16 @@ export class ConsoleLoggerStack {
55
76
static push ( logger : Logger ) : Logger ;
56
77
static push < T extends Logger > ( loggerClass : LoggerConstructor < T > , ...args : any [ ] ) : Logger ;
57
78
static push < T extends Logger > ( nameOrLogger : string | Logger | LoggerConstructor < T > = '' ,
58
- ...args : any [ ] ) {
79
+ ...args : any [ ] ) : Logger {
59
80
if ( typeof nameOrLogger == 'string' ) {
60
- return _push ( new Logger ( nameOrLogger as string , this . top ( ) ) ) ;
81
+ return _push ( new Logger ( nameOrLogger , this . top ( ) ) ) ;
61
82
} else if ( nameOrLogger instanceof Logger ) {
62
- const logger = nameOrLogger as Logger ;
63
- if ( logger . parent !== this . top ( ) ) {
83
+ if ( nameOrLogger . parent !== this . top ( ) ) {
64
84
throw new Error ( 'Pushing a logger that is not a direct child of the top of the stack.' ) ;
65
85
}
66
- return _push ( logger ) ;
86
+ return _push ( nameOrLogger ) ;
67
87
} else {
68
- const klass = nameOrLogger as LoggerConstructor < T > ;
69
- return _push ( new klass ( ...args , this . top ( ) ) ) ;
88
+ return _push ( new nameOrLogger ( ...args , this . top ( ) ) ) ;
70
89
}
71
90
}
72
91
static pop ( ) : Logger | null {
@@ -82,19 +101,18 @@ export class ConsoleLoggerStack {
82
101
static start ( logger : Logger ) : Logger ;
83
102
static start < T extends Logger > ( loggerClass : LoggerConstructor < T > , ...args : any [ ] ) : Logger ;
84
103
static start < T extends Logger > ( nameOrLogger : string | Logger | LoggerConstructor < T > = '' ,
85
- ...args : any [ ] ) {
104
+ ...args : any [ ] ) : Logger {
86
105
if ( globalConsoleStack !== null ) {
87
106
throw new Error ( 'Cannot start a new console logger stack while one is already going.' ) ;
88
107
}
89
108
90
109
globalConsoleStack = [ ] ;
91
110
if ( typeof nameOrLogger == 'string' ) {
92
- return _push ( new Logger ( nameOrLogger as string , this . top ( ) ) ) ;
111
+ return _push ( new Logger ( nameOrLogger , this . top ( ) ) ) ;
93
112
} else if ( nameOrLogger instanceof Logger ) {
94
- return _push ( nameOrLogger as Logger ) ;
113
+ return _push ( nameOrLogger ) ;
95
114
} else {
96
- const klass = nameOrLogger as LoggerConstructor < T > ;
97
- return _push ( new klass ( ...args , this . top ( ) ) ) ;
115
+ return _push ( new nameOrLogger ( ...args , this . top ( ) ) ) ;
98
116
}
99
117
}
100
118
static end ( ) {
0 commit comments