From 57464e380278c39f4e991a15417364069844a491 Mon Sep 17 00:00:00 2001 From: Sonu Kapoor Date: Sat, 22 Aug 2020 08:38:05 -0400 Subject: [PATCH] fix(upgrade): add try/catch when downgrading injectables This commit improves the error thrown by the downgrade module with a more descriptive message on why the downgrade is failing. Closes #37579 --- .../src/common/src/downgrade_injectable.ts | 10 ++++++++-- .../src/common/test/downgrade_injectable_spec.ts | 15 ++++++++++++++- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/packages/upgrade/src/common/src/downgrade_injectable.ts b/packages/upgrade/src/common/src/downgrade_injectable.ts index 35a6e113531e7..ec4e7f2509b92 100644 --- a/packages/upgrade/src/common/src/downgrade_injectable.ts +++ b/packages/upgrade/src/common/src/downgrade_injectable.ts @@ -79,8 +79,14 @@ export function downgradeInjectable(token: any, downgradedModule: string = ''): validateInjectionKey($injector, downgradedModule, injectorKey, attemptedAction); - const injector: Injector = $injector.get(injectorKey); - return injector.get(token); + try { + const injector: Injector = $injector.get(injectorKey); + return injector.get(token); + } catch (e) { + throw new Error( + `Trying to get the Angular injector before bootstrapping the corresponding Angular module. Injector name: ${ + token}`); + } }; (factory as any)['$inject'] = [$INJECTOR]; diff --git a/packages/upgrade/src/common/test/downgrade_injectable_spec.ts b/packages/upgrade/src/common/test/downgrade_injectable_spec.ts index 45f6ddb10e780..011e79d22a26b 100644 --- a/packages/upgrade/src/common/test/downgrade_injectable_spec.ts +++ b/packages/upgrade/src/common/test/downgrade_injectable_spec.ts @@ -29,7 +29,7 @@ describe('downgradeInjectable', () => { return {mockNg1Injector, mockNg2Injector}; }; - it('should return an AngularJS annotated factory for the token', () => { + it('should return an AngularJS annotated factory for the token', (done: DoneFn) => { const factory = downgradeInjectable('someToken'); expect(factory).toEqual(jasmine.any(Function)); expect((factory as any).$inject).toEqual([$INJECTOR]); @@ -37,6 +37,7 @@ describe('downgradeInjectable', () => { const {mockNg1Injector, mockNg2Injector} = setupMockInjectors(); expect(factory(mockNg1Injector)).toEqual('service value'); expect(mockNg2Injector.get).toHaveBeenCalledWith('someToken'); + done(); }); it('should inject the specified module\'s injector when specifying a module name', () => { @@ -48,4 +49,16 @@ describe('downgradeInjectable', () => { expect(factory(mockNg1Injector)).toEqual('service value'); expect(mockNg2Injector.get).toHaveBeenCalledWith('someToken'); }); + + it('should throw error if injector is undefined', () => { + const factory = downgradeInjectable('someToken', 'someModule'); + expect(factory).toEqual(jasmine.any(Function)); + expect((factory as any).$inject).toEqual([$INJECTOR]); + + const {mockNg1Injector} = setupMockInjectors('someModule'); + const error = + 'Trying to get the Angular injector before bootstrapping the corresponding Angular module. Injector name: someToken'; + mockNg1Injector.get.and.throwError(error); + expect(() => factory(mockNg1Injector)).toThrowError(error); + }); });