From e76465dd21181939d65b6ebb0919a6198e8f4260 Mon Sep 17 00:00:00 2001 From: Robert Rhoades Date: Fri, 1 Oct 2021 16:47:49 +0100 Subject: [PATCH 1/3] fix(angular): config.get not a function in karma (#22853) When karma runs each test case the window object persists. Ionic does some initial setup in angular first before handing over to core. On each test case in karma angular bootstraps itself again, during this bootstrap we set Ionic.config. On the first test case this is fine as Ionic core is also bootstrapped but on the second test case this overwrites legitimate config which causes parts of Ionic to fail as the config is no longer in the expected format. This fix works by only setting Ionic.config if it does not already exist. If it does exist then we do not replace it with an object thats not compatible with core. There may be better ways to solve this issue but I didn't want to change too much of ionic/angular so this felt like the safest change --- angular/src/app-initialize.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/angular/src/app-initialize.ts b/angular/src/app-initialize.ts index 610d608e03f..97a292f2a8b 100644 --- a/angular/src/app-initialize.ts +++ b/angular/src/app-initialize.ts @@ -11,10 +11,14 @@ export const appInitialize = (config: Config, doc: Document, zone: NgZone) => { if (win && typeof (window as any) !== 'undefined') { const Ionic = win.Ionic = win.Ionic || {}; - Ionic.config = { - ...config, - _zoneGate: (h: any) => zone.run(h) - }; + // Only set the config key/value if one does not already exist + // Subsequent initilizations (eg in karma) should not overwrite the config if exists already in the window + if (!Ionic.config) { + Ionic.config = { + ...config, + _zoneGate: (h: any) => zone.run(h) + }; + } const aelFn = '__zone_symbol__addEventListener' in (doc.body as any) ? '__zone_symbol__addEventListener' From 519054b05663228dfb9f0baa3da90d002b57b46c Mon Sep 17 00:00:00 2001 From: Liam DeBeasi Date: Fri, 1 Oct 2021 20:19:49 +0000 Subject: [PATCH 2/3] fix(angular): reinitializing config no longer causes errors during tests --- angular/src/app-initialize.ts | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/angular/src/app-initialize.ts b/angular/src/app-initialize.ts index 97a292f2a8b..f4af96b411d 100644 --- a/angular/src/app-initialize.ts +++ b/angular/src/app-initialize.ts @@ -1,5 +1,6 @@ import { NgZone } from '@angular/core'; import { applyPolyfills, defineCustomElements } from '@ionic/core/loader'; +import { initialize } from '@ionic/core'; import { Config } from './providers/config'; import { IonicWindow } from './types/interfaces'; @@ -9,16 +10,11 @@ export const appInitialize = (config: Config, doc: Document, zone: NgZone) => { return (): any => { const win: IonicWindow | undefined = doc.defaultView as any; if (win && typeof (window as any) !== 'undefined') { - const Ionic = win.Ionic = win.Ionic || {}; - // Only set the config key/value if one does not already exist - // Subsequent initilizations (eg in karma) should not overwrite the config if exists already in the window - if (!Ionic.config) { - Ionic.config = { - ...config, - _zoneGate: (h: any) => zone.run(h) - }; - } + initialize({ + ...config, + _zoneGate: (h: any) => zone.run(h) + }); const aelFn = '__zone_symbol__addEventListener' in (doc.body as any) ? '__zone_symbol__addEventListener' From efb4ce12f5a9fad2174ec8ed5c7b105aa0d2b58c Mon Sep 17 00:00:00 2001 From: Liam DeBeasi Date: Fri, 1 Oct 2021 20:37:44 +0000 Subject: [PATCH 3/3] chore(angular): lint --- angular/src/app-initialize.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/angular/src/app-initialize.ts b/angular/src/app-initialize.ts index f4af96b411d..a280bc6b17d 100644 --- a/angular/src/app-initialize.ts +++ b/angular/src/app-initialize.ts @@ -1,6 +1,6 @@ import { NgZone } from '@angular/core'; -import { applyPolyfills, defineCustomElements } from '@ionic/core/loader'; import { initialize } from '@ionic/core'; +import { applyPolyfills, defineCustomElements } from '@ionic/core/loader'; import { Config } from './providers/config'; import { IonicWindow } from './types/interfaces';