From e851fdeaa61f1aaa65c7ded1325a9be1ecfe90cf Mon Sep 17 00:00:00 2001 From: "Marc J. Schmidt" Date: Sun, 8 Oct 2023 14:37:40 +0200 Subject: [PATCH] feature(app): provide scoped logger in `App` moved out from FrameworkModule to default service container of `App --- packages/app/src/service-container.ts | 14 ++++++---- packages/app/tests/application.spec.ts | 8 +++--- packages/app/tests/logger.spec.ts | 37 ++++++++++++++++++++++++++ packages/framework/src/module.ts | 8 +----- packages/logger/src/logger.ts | 2 +- 5 files changed, 52 insertions(+), 17 deletions(-) create mode 100644 packages/app/tests/logger.spec.ts diff --git a/packages/app/src/service-container.ts b/packages/app/src/service-container.ts index 69ddaca70..66bc25872 100644 --- a/packages/app/src/service-container.ts +++ b/packages/app/src/service-container.ts @@ -15,7 +15,7 @@ import { Injector, InjectorContext, InjectorModule, isProvided, ProviderWithScop import { cli } from './command.js'; import { WorkflowDefinition } from '@deepkit/workflow'; import { deserialize, ReflectionClass, ReflectionFunction, validate } from '@deepkit/type'; -import { ConsoleTransport, Logger } from '@deepkit/logger'; +import { ConsoleTransport, Logger, ScopedLogger } from '@deepkit/logger'; export interface ControllerConfig { controller?: ClassType, @@ -87,15 +87,19 @@ export class ServiceContainer { public process() { if (this.injectorContext) return; - this.setupHook(this.appModule); - this.findModules(this.appModule); - this.appModule.addProvider({ provide: ServiceContainer, useValue: this }); this.appModule.addProvider({ provide: EventDispatcher, useValue: this.eventDispatcher }); this.appModule.addProvider({ provide: CliControllerRegistry, useValue: this.cliControllerRegistry }); this.appModule.addProvider({ provide: MiddlewareRegistry, useValue: this.middlewareRegistry }); this.appModule.addProvider({ provide: InjectorContext, useFactory: () => this.injectorContext! }); - this.appModule.addProvider({ provide: Logger, useFactory: () => new Logger([new ConsoleTransport()]) }); + this.appModule.addProvider(ConsoleTransport); + if (!this.appModule.isProvided(Logger)) { + this.appModule.addProvider({ provide: Logger, useFactory: (t: ConsoleTransport) => new Logger([t]) }); + } + this.appModule.addProvider(ScopedLogger); + + this.setupHook(this.appModule); + this.findModules(this.appModule); this.processModule(this.appModule); diff --git a/packages/app/tests/application.spec.ts b/packages/app/tests/application.spec.ts index 54a9ba6b0..910012a2a 100644 --- a/packages/app/tests/application.spec.ts +++ b/packages/app/tests/application.spec.ts @@ -460,7 +460,7 @@ test('service container hooks', () => { const m = new MyModule; const app = new ServiceContainer(new AppModule({ imports: [m] })); app.process(); - expect(m.providersFound.length).toBe(6); //6 is the default, as the ServiceContainer adds default services + expect(m.providersFound.length).toBe(8); //8 is the default, as the ServiceContainer adds default services expect(m.controllersFound.length).toBe(0); } @@ -471,7 +471,7 @@ test('service container hooks', () => { const m = new MyModule; const app = new ServiceContainer(new AppModule({ controllers: [Controller], imports: [m] })); app.process(); - expect(m.providersFound.length).toBe(7); + expect(m.providersFound.length).toBe(9); expect(m.controllersFound.length).toBe(1); } @@ -482,7 +482,7 @@ test('service container hooks', () => { const m = new MyModule; const app = new ServiceContainer(new AppModule({ providers: [Controller], imports: [m] })); app.process(); - expect(m.providersFound.length).toBe(7); + expect(m.providersFound.length).toBe(9); expect(m.controllersFound.length).toBe(0); } @@ -501,7 +501,7 @@ test('service container hooks', () => { const m = new MyModule; const app = new ServiceContainer(new AppModule({ imports: [baseModule, m] })); app.process(); - expect(m.providersFound.length).toBe(8); + expect(m.providersFound.length).toBe(10); expect(m.controllersFound.length).toBe(1); } }); diff --git a/packages/app/tests/logger.spec.ts b/packages/app/tests/logger.spec.ts new file mode 100644 index 000000000..2ba9628c6 --- /dev/null +++ b/packages/app/tests/logger.spec.ts @@ -0,0 +1,37 @@ +import { Logger, MemoryLoggerTransport, ScopedLogger } from '@deepkit/logger'; +import { expect, test } from '@jest/globals'; +import { App } from '../src/app.js'; + +test('logger', () => { + const memory = new MemoryLoggerTransport(); + + const app = new App({ + providers: [{ provide: Logger, useValue: new Logger([memory]) }] + }); + + const logger = app.get(); + logger.log('hello world'); + + expect(memory.messageStrings).toEqual(['hello world']); +}); + +test('scoped logger', () => { + const memory = new MemoryLoggerTransport(); + + class Service { + constructor(public logger: ScopedLogger) { + } + } + + const app = new App({ + providers: [ + Service, + { provide: Logger, useValue: new Logger([memory]) }, + ] + }); + + const service = app.get(); + service.logger.log('hello world'); + + expect(memory.messages[0].scope).toEqual(['Service']); +}); diff --git a/packages/framework/src/module.ts b/packages/framework/src/module.ts index 44ad52f77..38d75cf79 100644 --- a/packages/framework/src/module.ts +++ b/packages/framework/src/module.ts @@ -22,7 +22,7 @@ import { registerDebugHttpController } from './debug/http-debug.controller.js'; import { HttpLogger, HttpModule, HttpRequest, serveStaticListener } from '@deepkit/http'; import { InjectorContext, injectorReference, ProviderWithScope, Token } from '@deepkit/injector'; import { FrameworkConfig } from './module.config.js'; -import { ConsoleTransport, Logger, LoggerInterface } from '@deepkit/logger'; +import { LoggerInterface } from '@deepkit/logger'; import { SessionHandler } from './session.js'; import { RpcServer, WebWorkerFactory } from './worker.js'; import { Stopwatch } from '@deepkit/stopwatch'; @@ -40,7 +40,6 @@ import { ApiConsoleModule } from '@deepkit/api-console-module'; import { AppModule, ControllerConfig, createModule } from '@deepkit/app'; import { RpcControllers, RpcInjectorContext, RpcKernelWithStopwatch } from './rpc.js'; import { normalizeDirectory } from './utils.js'; -import { ScopedLogger } from "@deepkit/logger"; export class FrameworkModule extends createModule({ config: FrameworkConfig, @@ -49,9 +48,6 @@ export class FrameworkModule extends createModule({ ApplicationServer, WebWorkerFactory, RpcServer, - ConsoleTransport, - Logger, - ScopedLogger, MigrationProvider, DebugController, { provide: DatabaseRegistry, useFactory: (ic: InjectorContext) => new DatabaseRegistry(ic) }, @@ -107,12 +103,10 @@ export class FrameworkModule extends createModule({ MigrationCreateController, ], exports: [ - ScopedLogger.provide, ProcessLocker, ApplicationServer, WebWorkerFactory, RpcServer, - ConsoleTransport, RpcKernelSecurity, RpcKernel, MigrationProvider, diff --git a/packages/logger/src/logger.ts b/packages/logger/src/logger.ts index 5500d1a8a..8e8fbcf7b 100644 --- a/packages/logger/src/logger.ts +++ b/packages/logger/src/logger.ts @@ -311,7 +311,7 @@ export class Logger implements LoggerInterface { } } -export type ScopedLogger = Inject; +export type ScopedLogger = Inject; export const ScopedLogger = { provide: 'scoped-logger', transient: true,