From 5de2ac3e1be0ce46faa73e7ca291b322029bb32e 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 (#38671) This commit improves the error thrown by the downgrade module with a more descriptive message on why the downgrade is failing. Closes #37579 PR Close #38671 --- .../upgrade/src/common/src/downgrade_injectable.ts | 8 ++++++-- .../src/common/test/downgrade_injectable_spec.ts | 12 ++++++++++++ 2 files changed, 18 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..af2c7a20bd623 100644 --- a/packages/upgrade/src/common/src/downgrade_injectable.ts +++ b/packages/upgrade/src/common/src/downgrade_injectable.ts @@ -79,8 +79,12 @@ 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 (err) { + throw new Error(`Error while ${attemptedAction}: ${err.message || err}`); + } }; (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..b2ea6a602e089 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 mention the injectable\'s name in the error thrown when failing to retrieve injectable', + () => { + const factory = downgradeInjectable('someToken'); + expect(factory).toEqual(jasmine.any(Function)); + expect((factory as any).$inject).toEqual([$INJECTOR]); + + const {mockNg1Injector, mockNg2Injector} = setupMockInjectors(); + mockNg2Injector.get.and.throwError('Mock failure'); + expect(() => factory(mockNg1Injector)) + .toThrowError(/^Error while instantiating injectable 'someToken': Mock failure/); + }); });