Skip to content

Commit

Permalink
feature(logger): ScopedLogger provider
Browse files Browse the repository at this point in the history
  • Loading branch information
timvandam committed Sep 21, 2023
1 parent 29a8dbb commit 8cbfcad
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 3 deletions.
6 changes: 4 additions & 2 deletions packages/logger/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,15 +24,17 @@
"author": "Marc J. Schmidt <[email protected]>",
"license": "MIT",
"peerDependencies": {
"@deepkit/core": "^1.0.1-alpha.13"
"@deepkit/core": "^1.0.1-alpha.13",
"@deepkit/injector": "^1.0.1-alpha.97"
},
"dependencies": {
"@types/format-util": "^1.0.1",
"ansi-styles": "^4.3.0",
"format-util": "^1.0.5"
},
"devDependencies": {
"@deepkit/core": "^1.0.1-alpha.97"
"@deepkit/core": "^1.0.1-alpha.97",
"@deepkit/injector": "^1.0.1-alpha.97"
},
"jest": {
"testEnvironment": "node",
Expand Down
9 changes: 9 additions & 0 deletions packages/logger/src/logger.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import style from 'ansi-styles';
import format from 'format-util';
import { arrayRemoveItem, ClassType } from '@deepkit/core';
import { Inject, Provider, TransientInjectionTarget } from '@deepkit/injector';

export enum LoggerLevel {
none,
Expand Down Expand Up @@ -309,3 +310,11 @@ export class Logger implements LoggerInterface {
this.send(message, LoggerLevel.debug);
}
}

export type ScopedLogger = Inject<Logger, 'scoped-logger'>;
export const ScopedLogger: Provider<Logger> = {
provide: 'scoped-logger',
transient: true,
useFactory: (target: TransientInjectionTarget, logger: Logger = new Logger()) =>
logger.scoped(target.token?.name ?? String(target.token)),
};
33 changes: 32 additions & 1 deletion packages/logger/tests/logger.spec.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { expect, test } from '@jest/globals';
import { JSONTransport, Logger, LoggerLevel, ScopeFormatter } from '../src/logger.js';
import { JSONTransport, Logger, LoggerLevel, ScopedLogger, ScopeFormatter } from '../src/logger.js';
import { MemoryLoggerTransport } from '../src/memory-logger.js';
import { Injector, ServiceNotFoundError } from '@deepkit/injector';

test('log level', () => {
const logger = new Logger();
Expand Down Expand Up @@ -79,3 +80,33 @@ test('colorless', () => {

logger.log('This is a <yellow>color</yellow> test');
});

test('scoped logger', () => {
class MyProvider {
constructor (public logger: ScopedLogger) {
}
}

{
const injector = Injector.from([
MyProvider,
Logger, // optional base logger used by ScopedLogger
ScopedLogger,
]);
const logger = injector.get(Logger);
const provider = injector.get(MyProvider);
expect(logger).toBeInstanceOf(Logger);
expect(provider.logger).toBeInstanceOf(Logger);
expect(provider.logger).toBe(logger.scoped('MyProvider'));
}

{
const injector = Injector.from([
MyProvider,
ScopedLogger,
]);
expect(() => injector.get(Logger)).toThrow(ServiceNotFoundError);
const provider = injector.get(MyProvider);
expect(provider.logger).toBeInstanceOf(Logger);
}
});

0 comments on commit 8cbfcad

Please sign in to comment.