From 0e6828cc813647b93b1e6421c8d8debaaffcf0a9 Mon Sep 17 00:00:00 2001 From: Jay McDoniel Date: Sat, 21 Aug 2021 12:28:51 -0700 Subject: [PATCH 01/17] feat(core): add new logger for injector logging --- integration/hello-world/e2e/hello-world.spec.ts | 4 ++-- packages/core/injector/injector-logger.ts | 12 ++++++++++++ packages/core/injector/injector.ts | 7 +++++++ scripts/prepare.sh | 0 4 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 packages/core/injector/injector-logger.ts mode change 100644 => 100755 scripts/prepare.sh diff --git a/integration/hello-world/e2e/hello-world.spec.ts b/integration/hello-world/e2e/hello-world.spec.ts index 531a6516084..39f5c22498e 100644 --- a/integration/hello-world/e2e/hello-world.spec.ts +++ b/integration/hello-world/e2e/hello-world.spec.ts @@ -1,6 +1,6 @@ import * as request from 'supertest'; import { Test } from '@nestjs/testing'; -import { INestApplication } from '@nestjs/common'; +import { INestApplication, Logger } from '@nestjs/common'; import { ApplicationModule } from '../src/app.module'; describe('Hello world (default adapter)', () => { @@ -12,7 +12,7 @@ describe('Hello world (default adapter)', () => { imports: [ApplicationModule], }).compile(); - app = module.createNestApplication(); + app = module.createNestApplication(undefined, { logger: new Logger('Testing')}); server = app.getHttpServer(); await app.init(); }); diff --git a/packages/core/injector/injector-logger.ts b/packages/core/injector/injector-logger.ts new file mode 100644 index 00000000000..1d7172217f7 --- /dev/null +++ b/packages/core/injector/injector-logger.ts @@ -0,0 +1,12 @@ +import { Logger } from '@nestjs/common'; + +export class InjectorLogger extends Logger { + constructor() { + super(InjectorLogger.name, { timestamp: true }); + } + log(message: any, context?: string): void { + if (process.env.DEBUG) { + super.log(message, context); + } + } +} diff --git a/packages/core/injector/injector.ts b/packages/core/injector/injector.ts index 635dd18a7b4..9df394db5f1 100644 --- a/packages/core/injector/injector.ts +++ b/packages/core/injector/injector.ts @@ -1,3 +1,4 @@ +import { LoggerService } from '@nestjs/common'; import { OPTIONAL_DEPS_METADATA, OPTIONAL_PROPERTY_DEPS_METADATA, @@ -19,6 +20,7 @@ import { RuntimeException } from '../errors/exceptions/runtime.exception'; import { UndefinedDependencyException } from '../errors/exceptions/undefined-dependency.exception'; import { UnknownDependenciesException } from '../errors/exceptions/unknown-dependencies.exception'; import { STATIC_CONTEXT } from './constants'; +import { InjectorLogger } from './injector-logger'; import { INQUIRER } from './inquirer'; import { ContextId, @@ -68,6 +70,8 @@ export interface InjectorDependencyContext { } export class Injector { + + private logger: LoggerService = new InjectorLogger(); public loadPrototype( { token }: InstanceWrapper, collection: Map>, @@ -351,6 +355,9 @@ export class Injector { inquirer?: InstanceWrapper, keyOrIndex?: string | number, ): Promise { + const log = this.logger.debug.bind(this) ?? this.logger.log.bind(this); + const tokenName = token.toString().includes(' ') ? token.toString().split(' ')[1] : token.toString(); + log(`Resolving dependency ${tokenName} in the ${inquirer.name} provider.`); const providers = moduleRef.providers; const instanceWrapper = await this.lookupComponent( providers, diff --git a/scripts/prepare.sh b/scripts/prepare.sh old mode 100644 new mode 100755 From 3a465aa2c3c2b29f6a4898b07a837d5c6a830c4a Mon Sep 17 00:00:00 2001 From: Jay McDoniel Date: Sat, 21 Aug 2021 13:08:11 -0700 Subject: [PATCH 02/17] feat: finish up the resolution logs --- integration/hello-world/e2e/hello-world.spec.ts | 3 +-- packages/core/injector/injector.ts | 9 +++++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/integration/hello-world/e2e/hello-world.spec.ts b/integration/hello-world/e2e/hello-world.spec.ts index 39f5c22498e..72a772f860c 100644 --- a/integration/hello-world/e2e/hello-world.spec.ts +++ b/integration/hello-world/e2e/hello-world.spec.ts @@ -1,6 +1,6 @@ import * as request from 'supertest'; import { Test } from '@nestjs/testing'; -import { INestApplication, Logger } from '@nestjs/common'; +import { INestApplication } from '@nestjs/common'; import { ApplicationModule } from '../src/app.module'; describe('Hello world (default adapter)', () => { @@ -12,7 +12,6 @@ describe('Hello world (default adapter)', () => { imports: [ApplicationModule], }).compile(); - app = module.createNestApplication(undefined, { logger: new Logger('Testing')}); server = app.getHttpServer(); await app.init(); }); diff --git a/packages/core/injector/injector.ts b/packages/core/injector/injector.ts index 9df394db5f1..1a1735abd63 100644 --- a/packages/core/injector/injector.ts +++ b/packages/core/injector/injector.ts @@ -355,9 +355,9 @@ export class Injector { inquirer?: InstanceWrapper, keyOrIndex?: string | number, ): Promise { - const log = this.logger.debug.bind(this) ?? this.logger.log.bind(this); const tokenName = token.toString().includes(' ') ? token.toString().split(' ')[1] : token.toString(); - log(`Resolving dependency ${tokenName} in the ${inquirer.name} provider.`); + this.logger.log(`Resolving dependency ${tokenName} in the ${inquirer.name} provider.`); + this.logger.log(`Looking in ${moduleRef.metatype.name} for ${tokenName}`) const providers = moduleRef.providers; const instanceWrapper = await this.lookupComponent( providers, @@ -428,6 +428,7 @@ export class Injector { keyOrIndex?: string | number, ): Promise> { const { name } = dependencyContext; + const tokenName = name.toString().includes(' ') ? name.toString().split(' ')[1] : name.toString(); if (wrapper && wrapper.name === name) { throw new UnknownDependenciesException( wrapper.name, @@ -437,6 +438,7 @@ export class Injector { } if (providers.has(name)) { const instanceWrapper = providers.get(name); + this.logger.log(`Found ${tokenName} in ${moduleRef.metatype.name}`) this.addDependencyMetadata(keyOrIndex, wrapper, instanceWrapper); return instanceWrapper; } @@ -488,6 +490,7 @@ export class Injector { isTraversing?: boolean, ): Promise { let instanceWrapperRef: InstanceWrapper = null; + const tokenName = name.toString().includes(' ') ? name.toString().split(' ')[1] : name.toString(); const imports = moduleRef.imports || new Set(); const identity = (item: any) => item; @@ -503,6 +506,7 @@ export class Injector { if (moduleRegistry.includes(relatedModule.id)) { continue; } + this.logger.log(`Looking in ${relatedModule.metatype.name} for ${tokenName}`) moduleRegistry.push(relatedModule.id); const { providers, exports } = relatedModule; if (!exports.has(name) || !providers.has(name)) { @@ -522,6 +526,7 @@ export class Injector { } continue; } + this.logger.log(`Found ${tokenName} in ${relatedModule.metatype.name}`); instanceWrapperRef = providers.get(name); this.addDependencyMetadata(keyOrIndex, wrapper, instanceWrapperRef); From 1809667800340ca3dc503be50af0bde36ece1322 Mon Sep 17 00:00:00 2001 From: Jay McDoniel Date: Sat, 21 Aug 2021 13:22:07 -0700 Subject: [PATCH 03/17] feat(core): add return to injector logger which fixes undefined log --- packages/core/injector/injector-logger.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/core/injector/injector-logger.ts b/packages/core/injector/injector-logger.ts index 1d7172217f7..712e186962c 100644 --- a/packages/core/injector/injector-logger.ts +++ b/packages/core/injector/injector-logger.ts @@ -1,12 +1,12 @@ -import { Logger } from '@nestjs/common'; +import { ConsoleLogger } from '@nestjs/common'; -export class InjectorLogger extends Logger { +export class InjectorLogger extends ConsoleLogger { constructor() { super(InjectorLogger.name, { timestamp: true }); } - log(message: any, context?: string): void { + log(message: any): void { if (process.env.DEBUG) { - super.log(message, context); + return super.log(message); } } } From 3d6d17c6184d393d5af6a1aaa8aecc211437983a Mon Sep 17 00:00:00 2001 From: Jay McDoniel Date: Sat, 21 Aug 2021 13:26:47 -0700 Subject: [PATCH 04/17] fix: put back an accidentally removed line --- integration/hello-world/e2e/hello-world.spec.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/integration/hello-world/e2e/hello-world.spec.ts b/integration/hello-world/e2e/hello-world.spec.ts index 72a772f860c..531a6516084 100644 --- a/integration/hello-world/e2e/hello-world.spec.ts +++ b/integration/hello-world/e2e/hello-world.spec.ts @@ -12,6 +12,7 @@ describe('Hello world (default adapter)', () => { imports: [ApplicationModule], }).compile(); + app = module.createNestApplication(); server = app.getHttpServer(); await app.init(); }); From 3f51facdc2c6f6158ccd47e29243d935e0e088a6 Mon Sep 17 00:00:00 2001 From: Jay McDoniel Date: Sat, 21 Aug 2021 18:17:15 -0700 Subject: [PATCH 05/17] fix(core): make the logs work for the tests I believe most if not all of these failures stem from creating the module and inquirer objects manually. If i'm wrong about that let me know and I can update the code accordingly. --- packages/core/injector/injector.ts | 10 +++++----- packages/core/test/injector/injector.spec.ts | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/core/injector/injector.ts b/packages/core/injector/injector.ts index 1a1735abd63..d99ddd04561 100644 --- a/packages/core/injector/injector.ts +++ b/packages/core/injector/injector.ts @@ -356,8 +356,8 @@ export class Injector { keyOrIndex?: string | number, ): Promise { const tokenName = token.toString().includes(' ') ? token.toString().split(' ')[1] : token.toString(); - this.logger.log(`Resolving dependency ${tokenName} in the ${inquirer.name} provider.`); - this.logger.log(`Looking in ${moduleRef.metatype.name} for ${tokenName}`) + this.logger.log(`Resolving dependency ${tokenName} in the ${inquirer?.name ?? 'unknown'} provider.`); + this.logger.log(`Looking in ${moduleRef?.metatype?.name ?? 'unknown'} for ${tokenName}`) const providers = moduleRef.providers; const instanceWrapper = await this.lookupComponent( providers, @@ -438,7 +438,7 @@ export class Injector { } if (providers.has(name)) { const instanceWrapper = providers.get(name); - this.logger.log(`Found ${tokenName} in ${moduleRef.metatype.name}`) + this.logger.log(`Found ${tokenName} in ${moduleRef?.metatype.name ?? 'unknown'}`) this.addDependencyMetadata(keyOrIndex, wrapper, instanceWrapper); return instanceWrapper; } @@ -506,7 +506,7 @@ export class Injector { if (moduleRegistry.includes(relatedModule.id)) { continue; } - this.logger.log(`Looking in ${relatedModule.metatype.name} for ${tokenName}`) + this.logger.log(`Looking in ${relatedModule?.metatype?.name ?? 'unknown'} for ${tokenName}`) moduleRegistry.push(relatedModule.id); const { providers, exports } = relatedModule; if (!exports.has(name) || !providers.has(name)) { @@ -526,7 +526,7 @@ export class Injector { } continue; } - this.logger.log(`Found ${tokenName} in ${relatedModule.metatype.name}`); + this.logger.log(`Found ${tokenName} in ${relatedModule?.metatype?.name ?? 'unknown'}`); instanceWrapperRef = providers.get(name); this.addDependencyMetadata(keyOrIndex, wrapper, instanceWrapperRef); diff --git a/packages/core/test/injector/injector.spec.ts b/packages/core/test/injector/injector.spec.ts index 08c5dd8bd52..8c7d54c2e6d 100644 --- a/packages/core/test/injector/injector.spec.ts +++ b/packages/core/test/injector/injector.spec.ts @@ -375,7 +375,7 @@ describe('Injector', () => { it('should return null when there is no related modules', async () => { const result = await injector.lookupComponentInImports( module as any, - null, + 'testToken', new InstanceWrapper(), ); expect(result).to.be.eq(null); From 8a1e89e637bba7853e2c6b5aec602192bed28f39 Mon Sep 17 00:00:00 2001 From: Jay McDoniel Date: Sun, 22 Aug 2021 11:55:44 -0700 Subject: [PATCH 06/17] feat: change DEBUG to NEST_DEBUG --- packages/core/injector/injector-logger.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/injector/injector-logger.ts b/packages/core/injector/injector-logger.ts index 712e186962c..04af08684a9 100644 --- a/packages/core/injector/injector-logger.ts +++ b/packages/core/injector/injector-logger.ts @@ -5,7 +5,7 @@ export class InjectorLogger extends ConsoleLogger { super(InjectorLogger.name, { timestamp: true }); } log(message: any): void { - if (process.env.DEBUG) { + if (process.env.NEST_DEBUG) { return super.log(message); } } From 3b617962dc4dcd510b999da1453f587dd3cd0948 Mon Sep 17 00:00:00 2001 From: Jay McDoniel Date: Sat, 28 Aug 2021 19:18:06 -0700 Subject: [PATCH 07/17] feat: refactor the logs to be more consolidated and have color --- packages/core/injector/injector.ts | 55 ++++++++++++++++++++++++------ 1 file changed, 45 insertions(+), 10 deletions(-) diff --git a/packages/core/injector/injector.ts b/packages/core/injector/injector.ts index d99ddd04561..911eca8e3ce 100644 --- a/packages/core/injector/injector.ts +++ b/packages/core/injector/injector.ts @@ -15,6 +15,7 @@ import { isString, isUndefined, } from '@nestjs/common/utils/shared.utils'; +import { clc } from '@nestjs/common/utils/cli-colors.util'; import { iterate } from 'iterare'; import { RuntimeException } from '../errors/exceptions/runtime.exception'; import { UndefinedDependencyException } from '../errors/exceptions/undefined-dependency.exception'; @@ -70,7 +71,6 @@ export interface InjectorDependencyContext { } export class Injector { - private logger: LoggerService = new InjectorLogger(); public loadPrototype( { token }: InstanceWrapper, @@ -355,9 +355,8 @@ export class Injector { inquirer?: InstanceWrapper, keyOrIndex?: string | number, ): Promise { - const tokenName = token.toString().includes(' ') ? token.toString().split(' ')[1] : token.toString(); - this.logger.log(`Resolving dependency ${tokenName} in the ${inquirer?.name ?? 'unknown'} provider.`); - this.logger.log(`Looking in ${moduleRef?.metatype?.name ?? 'unknown'} for ${tokenName}`) + this.resolvingDependenciesLog(token, inquirer); + this.lookingForLog(token, moduleRef); const providers = moduleRef.providers; const instanceWrapper = await this.lookupComponent( providers, @@ -428,7 +427,6 @@ export class Injector { keyOrIndex?: string | number, ): Promise> { const { name } = dependencyContext; - const tokenName = name.toString().includes(' ') ? name.toString().split(' ')[1] : name.toString(); if (wrapper && wrapper.name === name) { throw new UnknownDependenciesException( wrapper.name, @@ -438,7 +436,7 @@ export class Injector { } if (providers.has(name)) { const instanceWrapper = providers.get(name); - this.logger.log(`Found ${tokenName} in ${moduleRef?.metatype.name ?? 'unknown'}`) + this.foundInLog(name, moduleRef); this.addDependencyMetadata(keyOrIndex, wrapper, instanceWrapper); return instanceWrapper; } @@ -490,8 +488,6 @@ export class Injector { isTraversing?: boolean, ): Promise { let instanceWrapperRef: InstanceWrapper = null; - const tokenName = name.toString().includes(' ') ? name.toString().split(' ')[1] : name.toString(); - const imports = moduleRef.imports || new Set(); const identity = (item: any) => item; @@ -506,7 +502,7 @@ export class Injector { if (moduleRegistry.includes(relatedModule.id)) { continue; } - this.logger.log(`Looking in ${relatedModule?.metatype?.name ?? 'unknown'} for ${tokenName}`) + this.lookingForLog(name, relatedModule); moduleRegistry.push(relatedModule.id); const { providers, exports } = relatedModule; if (!exports.has(name) || !providers.has(name)) { @@ -526,7 +522,7 @@ export class Injector { } continue; } - this.logger.log(`Found ${tokenName} in ${relatedModule?.metatype?.name ?? 'unknown'}`); + this.foundInLog(name, relatedModule); instanceWrapperRef = providers.get(name); this.addDependencyMetadata(keyOrIndex, wrapper, instanceWrapperRef); @@ -791,4 +787,43 @@ export class Injector { ? hostWrapper.addPropertiesMetadata(keyOrIndex, instanceWrapper) : hostWrapper.addCtorMetadata(keyOrIndex, instanceWrapper); } + + private getTokenName(token: InstanceToken): string { + return token.toString().includes(' ') + ? token.toString().split(' ')[1] + : token.toString(); + } + + private resolvingDependenciesLog( + token: InstanceToken, + inquirer?: InstanceWrapper, + ): void { + const tokenName = this.getTokenName(token); + const dependentName = inquirer?.name ?? 'unknown'; + this.logger.log( + `Resolving dependency ${clc.cyanBright(tokenName)}${clc.green( + ' in the ', + )}${clc.yellow(dependentName)}${clc.green(' provider ')}`, + ); + } + + private lookingForLog(token: InstanceToken, moduleRef: Module): void { + const tokenName = this.getTokenName(token); + const moduleRefName = moduleRef?.metatype?.name ?? 'unknown'; + this.logger.log( + `Looking for ${clc.cyanBright(tokenName)}${clc.green(' in ')}${clc.magentaBright( + moduleRefName, + )}`, + ); + } + + private foundInLog(token: InstanceToken, moduleRef: Module): void { + const tokenName = this.getTokenName(token); + const moduleRefName = moduleRef?.metatype?.name ?? 'unknown'; + this.logger.log( + `Found ${clc.cyanBright(tokenName)}${clc.green( + ' in ', + )}${clc.magentaBright(moduleRefName)}`, + ); + } } From daa39dbe687144fe3dae9057f6bba043ee4f37ae Mon Sep 17 00:00:00 2001 From: Jay McDoniel Date: Sun, 29 Aug 2021 19:13:42 -0700 Subject: [PATCH 08/17] feat: better way to track complex token --- packages/core/injector/injector.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/injector/injector.ts b/packages/core/injector/injector.ts index 911eca8e3ce..f952567e614 100644 --- a/packages/core/injector/injector.ts +++ b/packages/core/injector/injector.ts @@ -789,7 +789,7 @@ export class Injector { } private getTokenName(token: InstanceToken): string { - return token.toString().includes(' ') + return typeof token === 'function' ? token.toString().split(' ')[1] : token.toString(); } From f673a221b3ef9c095b89f4be3eebfb6db7b3d850 Mon Sep 17 00:00:00 2001 From: Jay McDoniel Date: Sun, 29 Aug 2021 19:20:30 -0700 Subject: [PATCH 09/17] refactor: use isFunction over typeof --- packages/core/injector/injector.ts | 3 ++- sample/01-cats-app/src/core/constants.ts | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 sample/01-cats-app/src/core/constants.ts diff --git a/packages/core/injector/injector.ts b/packages/core/injector/injector.ts index f952567e614..ce863ef4153 100644 --- a/packages/core/injector/injector.ts +++ b/packages/core/injector/injector.ts @@ -10,6 +10,7 @@ import { Controller } from '@nestjs/common/interfaces/controllers/controller.int import { Injectable } from '@nestjs/common/interfaces/injectable.interface'; import { Type } from '@nestjs/common/interfaces/type.interface'; import { + isFunction, isNil, isObject, isString, @@ -789,7 +790,7 @@ export class Injector { } private getTokenName(token: InstanceToken): string { - return typeof token === 'function' + return isFunction(token) ? token.toString().split(' ')[1] : token.toString(); } diff --git a/sample/01-cats-app/src/core/constants.ts b/sample/01-cats-app/src/core/constants.ts new file mode 100644 index 00000000000..b786213e704 --- /dev/null +++ b/sample/01-cats-app/src/core/constants.ts @@ -0,0 +1,2 @@ +export const LoggerSymbol = Symbol('Logger'); +export const LoggerString = 'Logger'; \ No newline at end of file From 9a15936e4c6cf7baab6911829d9fa07f9eb43a73 Mon Sep 17 00:00:00 2001 From: Jay McDoniel Date: Sun, 29 Aug 2021 19:22:26 -0700 Subject: [PATCH 10/17] chore: delete needless file --- sample/01-cats-app/src/core/constants.ts | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 sample/01-cats-app/src/core/constants.ts diff --git a/sample/01-cats-app/src/core/constants.ts b/sample/01-cats-app/src/core/constants.ts deleted file mode 100644 index b786213e704..00000000000 --- a/sample/01-cats-app/src/core/constants.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const LoggerSymbol = Symbol('Logger'); -export const LoggerString = 'Logger'; \ No newline at end of file From e1392a892d5db4069a7ae410ff72fbe6e474a66d Mon Sep 17 00:00:00 2001 From: Jay McDoniel Date: Sun, 29 Aug 2021 19:23:33 -0700 Subject: [PATCH 11/17] chore: fix up prepare file --- scripts/prepare.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 scripts/prepare.sh diff --git a/scripts/prepare.sh b/scripts/prepare.sh old mode 100755 new mode 100644 From 039928983fc2801bb9e40b28ebe4d448ab2843a8 Mon Sep 17 00:00:00 2001 From: Jay McDoniel Date: Sun, 29 Aug 2021 19:29:01 -0700 Subject: [PATCH 12/17] refactor: remove InjectorLogger as it wouldn't allow for logger overrides --- packages/core/injector/injector-logger.ts | 12 ------------ packages/core/injector/injector.ts | 17 +++++++++++------ sample/01-cats-app/src/main.ts | 2 +- 3 files changed, 12 insertions(+), 19 deletions(-) delete mode 100644 packages/core/injector/injector-logger.ts diff --git a/packages/core/injector/injector-logger.ts b/packages/core/injector/injector-logger.ts deleted file mode 100644 index 04af08684a9..00000000000 --- a/packages/core/injector/injector-logger.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { ConsoleLogger } from '@nestjs/common'; - -export class InjectorLogger extends ConsoleLogger { - constructor() { - super(InjectorLogger.name, { timestamp: true }); - } - log(message: any): void { - if (process.env.NEST_DEBUG) { - return super.log(message); - } - } -} diff --git a/packages/core/injector/injector.ts b/packages/core/injector/injector.ts index ce863ef4153..50554c059f7 100644 --- a/packages/core/injector/injector.ts +++ b/packages/core/injector/injector.ts @@ -1,4 +1,4 @@ -import { LoggerService } from '@nestjs/common'; +import { Logger, LoggerService } from '@nestjs/common'; import { OPTIONAL_DEPS_METADATA, OPTIONAL_PROPERTY_DEPS_METADATA, @@ -22,7 +22,6 @@ import { RuntimeException } from '../errors/exceptions/runtime.exception'; import { UndefinedDependencyException } from '../errors/exceptions/undefined-dependency.exception'; import { UnknownDependenciesException } from '../errors/exceptions/unknown-dependencies.exception'; import { STATIC_CONTEXT } from './constants'; -import { InjectorLogger } from './injector-logger'; import { INQUIRER } from './inquirer'; import { ContextId, @@ -72,7 +71,7 @@ export interface InjectorDependencyContext { } export class Injector { - private logger: LoggerService = new InjectorLogger(); + private logger: LoggerService = new Logger('InjectorLogger'); public loadPrototype( { token }: InstanceWrapper, collection: Map>, @@ -801,7 +800,7 @@ export class Injector { ): void { const tokenName = this.getTokenName(token); const dependentName = inquirer?.name ?? 'unknown'; - this.logger.log( + this.log( `Resolving dependency ${clc.cyanBright(tokenName)}${clc.green( ' in the ', )}${clc.yellow(dependentName)}${clc.green(' provider ')}`, @@ -811,7 +810,7 @@ export class Injector { private lookingForLog(token: InstanceToken, moduleRef: Module): void { const tokenName = this.getTokenName(token); const moduleRefName = moduleRef?.metatype?.name ?? 'unknown'; - this.logger.log( + this.log( `Looking for ${clc.cyanBright(tokenName)}${clc.green(' in ')}${clc.magentaBright( moduleRefName, )}`, @@ -821,10 +820,16 @@ export class Injector { private foundInLog(token: InstanceToken, moduleRef: Module): void { const tokenName = this.getTokenName(token); const moduleRefName = moduleRef?.metatype?.name ?? 'unknown'; - this.logger.log( + this.log( `Found ${clc.cyanBright(tokenName)}${clc.green( ' in ', )}${clc.magentaBright(moduleRefName)}`, ); } + + private log(message: string): void { + if (process.env.NEST_DEBUG) { + this.logger.log(message); + } + } } diff --git a/sample/01-cats-app/src/main.ts b/sample/01-cats-app/src/main.ts index ac2486c640c..18b91c6b8dc 100644 --- a/sample/01-cats-app/src/main.ts +++ b/sample/01-cats-app/src/main.ts @@ -3,7 +3,7 @@ import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; async function bootstrap() { - const app = await NestFactory.create(AppModule); + const app = await NestFactory.create(AppModule, { logger: console }); app.useGlobalPipes(new ValidationPipe()); await app.listen(3000); From cdfee483eec1f84f1b708e0c6ca0925a33203ab6 Mon Sep 17 00:00:00 2001 From: Jay McDoniel Date: Fri, 3 Sep 2021 13:15:28 -0700 Subject: [PATCH 13/17] fix: use .name instead of a toString split for class token names --- packages/core/injector/injector.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/injector/injector.ts b/packages/core/injector/injector.ts index 50554c059f7..717949fb449 100644 --- a/packages/core/injector/injector.ts +++ b/packages/core/injector/injector.ts @@ -790,7 +790,7 @@ export class Injector { private getTokenName(token: InstanceToken): string { return isFunction(token) - ? token.toString().split(' ')[1] + ? token.name : token.toString(); } From 9064a29081fb6e2ef491aa78214b3979b56c3cfd Mon Sep 17 00:00:00 2001 From: Jay McDoniel Date: Fri, 3 Sep 2021 13:17:12 -0700 Subject: [PATCH 14/17] chore: remove logger change in cats sample --- sample/01-cats-app/src/main.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sample/01-cats-app/src/main.ts b/sample/01-cats-app/src/main.ts index 18b91c6b8dc..ac2486c640c 100644 --- a/sample/01-cats-app/src/main.ts +++ b/sample/01-cats-app/src/main.ts @@ -3,7 +3,7 @@ import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; async function bootstrap() { - const app = await NestFactory.create(AppModule, { logger: console }); + const app = await NestFactory.create(AppModule); app.useGlobalPipes(new ValidationPipe()); await app.listen(3000); From b208b74f4010ee4ff91008faf5630cf5e903ca1e Mon Sep 17 00:00:00 2001 From: Jay McDoniel Date: Fri, 3 Sep 2021 21:55:04 -0700 Subject: [PATCH 15/17] chore: add type-cast to token as we know it will be function --- packages/core/injector/injector.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/injector/injector.ts b/packages/core/injector/injector.ts index 717949fb449..43d6da5ae93 100644 --- a/packages/core/injector/injector.ts +++ b/packages/core/injector/injector.ts @@ -790,7 +790,7 @@ export class Injector { private getTokenName(token: InstanceToken): string { return isFunction(token) - ? token.name + ? (token as Function).name : token.toString(); } From 99a884a64eda5efd47aa41bb40f51823c136f749 Mon Sep 17 00:00:00 2001 From: Jay McDoniel Date: Sat, 9 Oct 2021 16:51:25 -0700 Subject: [PATCH 16/17] fix: update method names and fast exit if not debug mode --- packages/core/injector/injector.ts | 43 +++++++++++++++++------------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/packages/core/injector/injector.ts b/packages/core/injector/injector.ts index 43d6da5ae93..f9b2597fa19 100644 --- a/packages/core/injector/injector.ts +++ b/packages/core/injector/injector.ts @@ -356,7 +356,7 @@ export class Injector { keyOrIndex?: string | number, ): Promise { this.resolvingDependenciesLog(token, inquirer); - this.lookingForLog(token, moduleRef); + this.lookingForProviderLog(token, moduleRef); const providers = moduleRef.providers; const instanceWrapper = await this.lookupComponent( providers, @@ -436,7 +436,7 @@ export class Injector { } if (providers.has(name)) { const instanceWrapper = providers.get(name); - this.foundInLog(name, moduleRef); + this.foundInModuleLog(name, moduleRef); this.addDependencyMetadata(keyOrIndex, wrapper, instanceWrapper); return instanceWrapper; } @@ -502,7 +502,7 @@ export class Injector { if (moduleRegistry.includes(relatedModule.id)) { continue; } - this.lookingForLog(name, relatedModule); + this.lookingForProviderLog(name, relatedModule); moduleRegistry.push(relatedModule.id); const { providers, exports } = relatedModule; if (!exports.has(name) || !providers.has(name)) { @@ -522,7 +522,7 @@ export class Injector { } continue; } - this.foundInLog(name, relatedModule); + this.foundInModuleLog(name, relatedModule); instanceWrapperRef = providers.get(name); this.addDependencyMetadata(keyOrIndex, wrapper, instanceWrapperRef); @@ -789,47 +789,52 @@ export class Injector { } private getTokenName(token: InstanceToken): string { - return isFunction(token) - ? (token as Function).name - : token.toString(); + return isFunction(token) ? (token as Function).name : token.toString(); } private resolvingDependenciesLog( token: InstanceToken, inquirer?: InstanceWrapper, ): void { + if (!this.isDebugMode()) { + return; + } const tokenName = this.getTokenName(token); const dependentName = inquirer?.name ?? 'unknown'; - this.log( + this.logger.log( `Resolving dependency ${clc.cyanBright(tokenName)}${clc.green( ' in the ', )}${clc.yellow(dependentName)}${clc.green(' provider ')}`, ); } - private lookingForLog(token: InstanceToken, moduleRef: Module): void { + private lookingForProviderLog(token: InstanceToken, moduleRef: Module): void { + if (!this.isDebugMode()) { + return; + } const tokenName = this.getTokenName(token); const moduleRefName = moduleRef?.metatype?.name ?? 'unknown'; - this.log( - `Looking for ${clc.cyanBright(tokenName)}${clc.green(' in ')}${clc.magentaBright( - moduleRefName, - )}`, + this.logger.log( + `Looking for ${clc.cyanBright(tokenName)}${clc.green( + ' in ', + )}${clc.magentaBright(moduleRefName)}`, ); } - private foundInLog(token: InstanceToken, moduleRef: Module): void { + private foundInModuleLog(token: InstanceToken, moduleRef: Module): void { + if (!this.isDebugMode()) { + return; + } const tokenName = this.getTokenName(token); const moduleRefName = moduleRef?.metatype?.name ?? 'unknown'; - this.log( + this.logger.log( `Found ${clc.cyanBright(tokenName)}${clc.green( ' in ', )}${clc.magentaBright(moduleRefName)}`, ); } - private log(message: string): void { - if (process.env.NEST_DEBUG) { - this.logger.log(message); - } + private isDebugMode(): boolean { + return !!process.env.NEST_DEBUG; } } From 04f4cdb01b58276b7bd7bb609d1be41c7f87f0a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20My=C5=9Bliwiec?= Date: Wed, 13 Oct 2021 14:32:54 +0200 Subject: [PATCH 17/17] refactor(core): minor tweaks --- packages/core/injector/injector.ts | 36 ++++++++++++++++++------------ 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/packages/core/injector/injector.ts b/packages/core/injector/injector.ts index f9b2597fa19..782d871d7a7 100644 --- a/packages/core/injector/injector.ts +++ b/packages/core/injector/injector.ts @@ -9,6 +9,7 @@ import { import { Controller } from '@nestjs/common/interfaces/controllers/controller.interface'; import { Injectable } from '@nestjs/common/interfaces/injectable.interface'; import { Type } from '@nestjs/common/interfaces/type.interface'; +import { clc } from '@nestjs/common/utils/cli-colors.util'; import { isFunction, isNil, @@ -16,7 +17,6 @@ import { isString, isUndefined, } from '@nestjs/common/utils/shared.utils'; -import { clc } from '@nestjs/common/utils/cli-colors.util'; import { iterate } from 'iterare'; import { RuntimeException } from '../errors/exceptions/runtime.exception'; import { UndefinedDependencyException } from '../errors/exceptions/undefined-dependency.exception'; @@ -72,6 +72,7 @@ export interface InjectorDependencyContext { export class Injector { private logger: LoggerService = new Logger('InjectorLogger'); + public loadPrototype( { token }: InstanceWrapper, collection: Map>, @@ -355,8 +356,8 @@ export class Injector { inquirer?: InstanceWrapper, keyOrIndex?: string | number, ): Promise { - this.resolvingDependenciesLog(token, inquirer); - this.lookingForProviderLog(token, moduleRef); + this.printResolvingDependenciesLog(token, inquirer); + this.printLookingForProviderLog(token, moduleRef); const providers = moduleRef.providers; const instanceWrapper = await this.lookupComponent( providers, @@ -436,7 +437,7 @@ export class Injector { } if (providers.has(name)) { const instanceWrapper = providers.get(name); - this.foundInModuleLog(name, moduleRef); + this.printFoundInModuleLog(name, moduleRef); this.addDependencyMetadata(keyOrIndex, wrapper, instanceWrapper); return instanceWrapper; } @@ -502,7 +503,7 @@ export class Injector { if (moduleRegistry.includes(relatedModule.id)) { continue; } - this.lookingForProviderLog(name, relatedModule); + this.printLookingForProviderLog(name, relatedModule); moduleRegistry.push(relatedModule.id); const { providers, exports } = relatedModule; if (!exports.has(name) || !providers.has(name)) { @@ -522,7 +523,7 @@ export class Injector { } continue; } - this.foundInModuleLog(name, relatedModule); + this.printFoundInModuleLog(name, relatedModule); instanceWrapperRef = providers.get(name); this.addDependencyMetadata(keyOrIndex, wrapper, instanceWrapperRef); @@ -792,7 +793,7 @@ export class Injector { return isFunction(token) ? (token as Function).name : token.toString(); } - private resolvingDependenciesLog( + private printResolvingDependenciesLog( token: InstanceToken, inquirer?: InstanceWrapper, ): void { @@ -801,14 +802,21 @@ export class Injector { } const tokenName = this.getTokenName(token); const dependentName = inquirer?.name ?? 'unknown'; - this.logger.log( - `Resolving dependency ${clc.cyanBright(tokenName)}${clc.green( - ' in the ', - )}${clc.yellow(dependentName)}${clc.green(' provider ')}`, - ); + const isAlias = dependentName === tokenName; + + const messageToPrint = `Resolving dependency ${clc.cyanBright( + tokenName, + )}${clc.green(' in the ')}${clc.yellow(dependentName)}${clc.green( + ` provider ${isAlias ? '(alias)' : ''}`, + )}`; + + this.logger.log(messageToPrint); } - private lookingForProviderLog(token: InstanceToken, moduleRef: Module): void { + private printLookingForProviderLog( + token: InstanceToken, + moduleRef: Module, + ): void { if (!this.isDebugMode()) { return; } @@ -821,7 +829,7 @@ export class Injector { ); } - private foundInModuleLog(token: InstanceToken, moduleRef: Module): void { + private printFoundInModuleLog(token: InstanceToken, moduleRef: Module): void { if (!this.isDebugMode()) { return; }