fix(ivy): ensure that `window.ng` utilities are published when NgModules are used (#32725)
Prior to this patch if any backwards-compatible Angular code was using Ivy then the built-in `window.ng` debug utilies would not be exposed. PR Close #32725
This commit is contained in:
parent
b741a1c3e7
commit
a0d04c628c
|
@ -8,6 +8,7 @@
|
||||||
|
|
||||||
import {Observable, Observer, Subscription, merge} from 'rxjs';
|
import {Observable, Observer, Subscription, merge} from 'rxjs';
|
||||||
import {share} from 'rxjs/operators';
|
import {share} from 'rxjs/operators';
|
||||||
|
|
||||||
import {ApplicationInitStatus} from './application_init';
|
import {ApplicationInitStatus} from './application_init';
|
||||||
import {APP_BOOTSTRAP_LISTENER, PLATFORM_INITIALIZER} from './application_tokens';
|
import {APP_BOOTSTRAP_LISTENER, PLATFORM_INITIALIZER} from './application_tokens';
|
||||||
import {getCompilerFacade} from './compiler/compiler_facade';
|
import {getCompilerFacade} from './compiler/compiler_facade';
|
||||||
|
@ -30,6 +31,7 @@ import {assertNgModuleType} from './render3/assert';
|
||||||
import {ComponentFactory as R3ComponentFactory} from './render3/component_ref';
|
import {ComponentFactory as R3ComponentFactory} from './render3/component_ref';
|
||||||
import {setLocaleId} from './render3/i18n';
|
import {setLocaleId} from './render3/i18n';
|
||||||
import {NgModuleFactory as R3NgModuleFactory} from './render3/ng_module_ref';
|
import {NgModuleFactory as R3NgModuleFactory} from './render3/ng_module_ref';
|
||||||
|
import {publishDefaultGlobalUtils as _publishDefaultGlobalUtils} from './render3/util/global_utils';
|
||||||
import {Testability, TestabilityRegistry} from './testability/testability';
|
import {Testability, TestabilityRegistry} from './testability/testability';
|
||||||
import {isDevMode} from './util/is_dev_mode';
|
import {isDevMode} from './util/is_dev_mode';
|
||||||
import {isPromise} from './util/lang';
|
import {isPromise} from './util/lang';
|
||||||
|
@ -81,6 +83,16 @@ export function compileNgModuleFactory__POST_R3__<M>(
|
||||||
.then(() => moduleFactory);
|
.then(() => moduleFactory);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// the `window.ng` global utilities are only available in non-VE versions of
|
||||||
|
// Angular. The function switch below will make sure that the code is not
|
||||||
|
// included into Angular when PRE mode is active.
|
||||||
|
export function publishDefaultGlobalUtils__PRE_R3__() {}
|
||||||
|
export function publishDefaultGlobalUtils__POST_R3__() {
|
||||||
|
ngDevMode && _publishDefaultGlobalUtils();
|
||||||
|
}
|
||||||
|
|
||||||
|
let publishDefaultGlobalUtils: () => any = publishDefaultGlobalUtils__PRE_R3__;
|
||||||
|
|
||||||
let isBoundToModule: <C>(cf: ComponentFactory<C>) => boolean = isBoundToModule__PRE_R3__;
|
let isBoundToModule: <C>(cf: ComponentFactory<C>) => boolean = isBoundToModule__PRE_R3__;
|
||||||
|
|
||||||
export function isBoundToModule__PRE_R3__<C>(cf: ComponentFactory<C>): boolean {
|
export function isBoundToModule__PRE_R3__<C>(cf: ComponentFactory<C>): boolean {
|
||||||
|
@ -116,6 +128,7 @@ export function createPlatform(injector: Injector): PlatformRef {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
'There can be only one platform. Destroy the previous one to create a new one.');
|
'There can be only one platform. Destroy the previous one to create a new one.');
|
||||||
}
|
}
|
||||||
|
publishDefaultGlobalUtils();
|
||||||
_platform = injector.get(PlatformRef);
|
_platform = injector.get(PlatformRef);
|
||||||
const inits = injector.get(PLATFORM_INITIALIZER, null);
|
const inits = injector.get(PLATFORM_INITIALIZER, null);
|
||||||
if (inits) inits.forEach((init: any) => init());
|
if (inits) inits.forEach((init: any) => init());
|
||||||
|
|
|
@ -10,7 +10,6 @@ import {ApplicationRef, Component, DoCheck, NgModule, OnInit, TestabilityRegistr
|
||||||
import {getTestBed} from '@angular/core/testing';
|
import {getTestBed} from '@angular/core/testing';
|
||||||
import {BrowserModule} from '@angular/platform-browser';
|
import {BrowserModule} from '@angular/platform-browser';
|
||||||
import {withBody} from '@angular/private/testing';
|
import {withBody} from '@angular/private/testing';
|
||||||
|
|
||||||
import {NgModuleFactory} from '../src/render3/ng_module_ref';
|
import {NgModuleFactory} from '../src/render3/ng_module_ref';
|
||||||
|
|
||||||
ivyEnabled && describe('ApplicationRef bootstrap', () => {
|
ivyEnabled && describe('ApplicationRef bootstrap', () => {
|
||||||
|
@ -58,4 +57,13 @@ ivyEnabled && describe('ApplicationRef bootstrap', () => {
|
||||||
registry.unregisterAllApplications();
|
registry.unregisterAllApplications();
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
it('should expose the `window.ng` global utilities',
|
||||||
|
withBody('<hello-world></hello-world>', async() => {
|
||||||
|
const MyAppModuleFactory = new NgModuleFactory(MyAppModule);
|
||||||
|
const moduleRef =
|
||||||
|
await getTestBed().platform.bootstrapModuleFactory(MyAppModuleFactory, {ngZone: 'noop'});
|
||||||
|
|
||||||
|
const ngUtils = (global as any).ng;
|
||||||
|
expect(ngUtils.getComponent).toBeTruthy();
|
||||||
|
}));
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue