Skip to content

Commit e3c1102

Browse files
clydinhansl
authored andcommitted
refactor(@ngtools/logger): support strict null checks
1 parent a3d062e commit e3c1102

File tree

3 files changed

+53
-29
lines changed

3 files changed

+53
-29
lines changed

packages/@ngtools/logger/src/console-logger-stack.ts

Lines changed: 40 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,48 @@
11
import {Logger} from './logger';
22

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;
84

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+
}
916

10-
function _push(logger: Logger) {
1117
if (globalConsoleStack.length == 0) {
1218
originalConsoleDebug = (console as any).debug; // Some environment (node) don't have debug.
1319
originalConsoleLog = console.log;
1420
originalConsoleWarn = console.warn;
1521
originalConsoleError = console.error;
1622

1723
(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+
}
1928
};
2029
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+
}
2234
};
2335
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+
}
2540
};
2641
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+
}
2846
};
2947
}
3048
globalConsoleStack.push(logger);
@@ -33,6 +51,9 @@ function _push(logger: Logger) {
3351
}
3452

3553
function _pop() {
54+
if (!globalConsoleStack) {
55+
return;
56+
}
3657
globalConsoleStack[globalConsoleStack.length - 1].complete();
3758
globalConsoleStack.pop();
3859
if (globalConsoleStack.length == 0) {
@@ -55,18 +76,16 @@ export class ConsoleLoggerStack {
5576
static push(logger: Logger): Logger;
5677
static push<T extends Logger>(loggerClass: LoggerConstructor<T>, ...args: any[]): Logger;
5778
static push<T extends Logger>(nameOrLogger: string | Logger | LoggerConstructor<T> = '',
58-
...args: any[]) {
79+
...args: any[]): Logger {
5980
if (typeof nameOrLogger == 'string') {
60-
return _push(new Logger(nameOrLogger as string, this.top()));
81+
return _push(new Logger(nameOrLogger, this.top()));
6182
} else if (nameOrLogger instanceof Logger) {
62-
const logger = nameOrLogger as Logger;
63-
if (logger.parent !== this.top()) {
83+
if (nameOrLogger.parent !== this.top()) {
6484
throw new Error('Pushing a logger that is not a direct child of the top of the stack.');
6585
}
66-
return _push(logger);
86+
return _push(nameOrLogger);
6787
} else {
68-
const klass = nameOrLogger as LoggerConstructor<T>;
69-
return _push(new klass(...args, this.top()));
88+
return _push(new nameOrLogger(...args, this.top()));
7089
}
7190
}
7291
static pop(): Logger | null {
@@ -82,19 +101,18 @@ export class ConsoleLoggerStack {
82101
static start(logger: Logger): Logger;
83102
static start<T extends Logger>(loggerClass: LoggerConstructor<T>, ...args: any[]): Logger;
84103
static start<T extends Logger>(nameOrLogger: string | Logger | LoggerConstructor<T> = '',
85-
...args: any[]) {
104+
...args: any[]): Logger {
86105
if (globalConsoleStack !== null) {
87106
throw new Error('Cannot start a new console logger stack while one is already going.');
88107
}
89108

90109
globalConsoleStack = [];
91110
if (typeof nameOrLogger == 'string') {
92-
return _push(new Logger(nameOrLogger as string, this.top()));
111+
return _push(new Logger(nameOrLogger, this.top()));
93112
} else if (nameOrLogger instanceof Logger) {
94-
return _push(nameOrLogger as Logger);
113+
return _push(nameOrLogger);
95114
} else {
96-
const klass = nameOrLogger as LoggerConstructor<T>;
97-
return _push(new klass(...args, this.top()));
115+
return _push(new nameOrLogger(...args, this.top()));
98116
}
99117
}
100118
static end() {

packages/@ngtools/logger/src/logger.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ describe('Logger', () => {
3838
.then(() => done(), (err: any) => done.fail(err));
3939

4040
const childLogger = new Logger('child', logger);
41-
childLogger.subscribe(null, null, () => hasCompleted = true);
41+
childLogger.subscribe(undefined, undefined, () => hasCompleted = true);
4242
childLogger.debug('hello');
4343
childLogger.info('world');
4444
logger.complete();

packages/@ngtools/logger/src/logger.ts

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ export class Logger extends Observable<LogEntry> {
2929
protected _metadata: LoggerMetadata;
3030

3131
private _obs: Observable<LogEntry>;
32-
private _subscription: Subscription;
32+
private _subscription: Subscription | null;
3333

3434
protected get _observable() { return this._obs; }
3535
protected set _observable(v: Observable<LogEntry>) {
@@ -39,11 +39,17 @@ export class Logger extends Observable<LogEntry> {
3939
this._obs = v;
4040
if (this.parent) {
4141
this._subscription = this.subscribe((value: LogEntry) => {
42-
this.parent._subject.next(value);
42+
if (this.parent) {
43+
this.parent._subject.next(value);
44+
}
4345
}, (error: any) => {
44-
this.parent._subject.error(error);
46+
if (this.parent) {
47+
this.parent._subject.error(error);
48+
}
4549
}, () => {
46-
this._subscription.unsubscribe();
50+
if (this._subscription) {
51+
this._subscription.unsubscribe();
52+
}
4753
this._subscription = null;
4854
});
4955
}
@@ -60,9 +66,9 @@ export class Logger extends Observable<LogEntry> {
6066
}
6167
this._metadata = { name, path };
6268
this._observable = this._subject.asObservable();
63-
if (parent) {
69+
if (this.parent) {
6470
// When the parent completes, complete us as well.
65-
this.parent._subject.subscribe(null, null, () => this.complete());
71+
this.parent._subject.subscribe(undefined, undefined, () => this.complete());
6672
}
6773
}
6874

0 commit comments

Comments
 (0)