Skip to content

Commit 2d1aaec

Browse files
committed
refactor: simplify Logger in schematics context
Before it was a full Logger, now we properly export a new LoggerApi that only contain logging APIs. We also added a facade to avoid recasting shenanigans.
1 parent ca4105b commit 2d1aaec

File tree

5 files changed

+62
-5
lines changed

5 files changed

+62
-5
lines changed

packages/angular_devkit/core/src/logger/logger.ts

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,20 @@ export interface LogEntry extends LoggerMetadata {
2222
message: string;
2323
timestamp: number;
2424
}
25+
export interface LoggerApi {
26+
createChild(name: string): Logger;
27+
log(level: LogLevel, message: string, metadata?: JsonObject): void;
28+
debug(message: string, metadata?: JsonObject): void;
29+
info(message: string, metadata?: JsonObject): void;
30+
warn(message: string, metadata?: JsonObject): void;
31+
error(message: string, metadata?: JsonObject): void;
32+
fatal(message: string, metadata?: JsonObject): void;
33+
}
2534

2635
export type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'fatal';
2736

2837

29-
export class Logger extends Observable<LogEntry> {
38+
export class Logger extends Observable<LogEntry> implements LoggerApi {
3039
protected readonly _subject: Subject<LogEntry> = new Subject<LogEntry>();
3140
protected _metadata: LoggerMetadata;
3241

@@ -74,6 +83,24 @@ export class Logger extends Observable<LogEntry> {
7483
}
7584
}
7685

86+
asApi(): LoggerApi {
87+
return {
88+
createChild: (name: string) => this.createChild(name),
89+
log: (level: LogLevel, message: string, metadata?: JsonObject) => {
90+
return this.log(level, message, metadata);
91+
},
92+
debug: (message: string, metadata?: JsonObject) => this.debug(message, metadata),
93+
info: (message: string, metadata?: JsonObject) => this.info(message, metadata),
94+
warn: (message: string, metadata?: JsonObject) => this.warn(message, metadata),
95+
error: (message: string, metadata?: JsonObject) => this.error(message, metadata),
96+
fatal: (message: string, metadata?: JsonObject) => this.fatal(message, metadata),
97+
};
98+
}
99+
100+
createChild(name: string) {
101+
return new Logger(name, this);
102+
}
103+
77104
complete() {
78105
this._subject.complete();
79106
}

packages/angular_devkit/core/src/logger/logger_spec.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,4 +52,22 @@ describe('Logger', () => {
5252
childLogger.info('world');
5353
logger.complete();
5454
});
55+
56+
it('misses messages if not subscribed', (done: DoneFn) => {
57+
const logger = new Logger('test');
58+
logger.debug('woah');
59+
60+
logger
61+
.toArray()
62+
.toPromise()
63+
.then((observed: JsonValue[]) => {
64+
expect(observed).toEqual([
65+
jasmine.objectContaining({ message: 'hello', level: 'debug', name: 'test' }) as any,
66+
]);
67+
})
68+
.then(() => done(), err => done.fail(err));
69+
70+
logger.debug('hello');
71+
logger.complete();
72+
});
5573
});

packages/angular_devkit/core/src/logger/null-logger.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,24 @@
77
*/
88
import { Observable } from 'rxjs/Observable';
99
import 'rxjs/add/observable/empty';
10-
import { Logger } from './logger';
10+
import { Logger, LoggerApi } from './logger';
1111

1212

1313
export class NullLogger extends Logger {
1414
constructor(parent: Logger | null = null) {
1515
super('', parent);
1616
this._observable = Observable.empty();
1717
}
18+
19+
asApi(): LoggerApi {
20+
return {
21+
createChild: () => new NullLogger(this),
22+
log() {},
23+
debug() {},
24+
info() {},
25+
warn() {},
26+
error() {},
27+
fatal() {},
28+
} as LoggerApi;
29+
}
1830
}

packages/angular_devkit/schematics/bin/schematics.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ delete args._;
244244
* Then we proceed to run the dryRun commit. We run this before we then commit to the filesystem
245245
* (if --dry-run was not passed or an error was detected by dryRun).
246246
*/
247-
schematic.call(args, host, { debug, logger })
247+
schematic.call(args, host, { debug, logger: logger.asApi() })
248248
.map((tree: Tree) => Tree.optimize(tree))
249249
.concatMap((tree: Tree) => {
250250
return dryRunSink.commit(tree).ignoreElements().concat(Observable.of(tree));

packages/angular_devkit/schematics/src/engine/interface.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
* Use of this source code is governed by an MIT-style license that can be
66
* found in the LICENSE file at https://angular.io/license
77
*/
8-
import { Logger } from '@angular-devkit/core';
8+
import { LoggerApi } from '@angular-devkit/core';
99
import { Observable } from 'rxjs/Observable';
1010
import { Url } from 'url';
1111
import { FileEntry, MergeStrategy, Tree } from '../tree/interface';
@@ -128,7 +128,7 @@ export interface TypedSchematicContext<CollectionMetadataT extends object,
128128
SchematicMetadataT extends object> {
129129
readonly debug: boolean;
130130
readonly engine: Engine<CollectionMetadataT, SchematicMetadataT>;
131-
readonly logger: Logger;
131+
readonly logger: LoggerApi;
132132
readonly schematic: Schematic<CollectionMetadataT, SchematicMetadataT>;
133133
readonly strategy: MergeStrategy;
134134
}

0 commit comments

Comments
 (0)