From 615e03e79dff22fd558cb6608665e03658398782 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 --- .../upgrade/src/common/src/downgrade_injectable.ts | 10 ++++++++-- .../src/common/test/downgrade_injectable_spec.ts | 12 ++++++++++++ 2 files changed, 20 insertions(+), 2 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..23940468de48c 100644 --- a/packages/upgrade/src/common/test/downgrade_injectable_spec.ts +++ b/packages/upgrade/src/common/test/downgrade_injectable_spec.ts @@ -48,4 +48,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); + }); });