Skip to content

Commit 2a7a5de

Browse files
atscottAndrewKushnir
authored andcommitted
feat(core): Allow passing application providers in bootstrapModule options (#64354)
This commit adds `applicationProviders` to the `bootstrapModule` options object. This allows specifying additional providers at the location of bootstrap, which makes default providers much easier to accomplish. Using this, we can refine the approach taken for downgrade_module to use this more direct API rather than the additional provider variable dance. PR Close #64354
1 parent 693b81f commit 2a7a5de

File tree

9 files changed

+94
-76
lines changed

9 files changed

+94
-76
lines changed

goldens/public-api/core/index.api.md

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1421,9 +1421,15 @@ export const platformCore: (extraProviders?: StaticProvider[] | undefined) => Pl
14211421

14221422
// @public
14231423
export class PlatformRef {
1424-
bootstrapModule<M>(moduleType: Type<M>, compilerOptions?: (CompilerOptions & BootstrapOptions) | Array<CompilerOptions & BootstrapOptions>): Promise<NgModuleRef<M>>;
1424+
bootstrapModule<M>(moduleType: Type<M>, compilerOptions?: (CompilerOptions & BootstrapOptions & {
1425+
applicationProviders?: Array<Provider | EnvironmentProviders>;
1426+
}) | Array<CompilerOptions & BootstrapOptions & {
1427+
applicationProviders?: Array<Provider | EnvironmentProviders>;
1428+
}>): Promise<NgModuleRef<M>>;
14251429
// @deprecated
1426-
bootstrapModuleFactory<M>(moduleFactory: NgModuleFactory<M>, options?: BootstrapOptions): Promise<NgModuleRef<M>>;
1430+
bootstrapModuleFactory<M>(moduleFactory: NgModuleFactory<M>, options?: BootstrapOptions & {
1431+
applicationProviders?: Array<Provider | EnvironmentProviders>;
1432+
}): Promise<NgModuleRef<M>>;
14271433
destroy(): void;
14281434
get destroyed(): boolean;
14291435
get injector(): Injector;

packages/core/src/core_private_export.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,4 +175,3 @@ export {TimerScheduler as ɵTimerScheduler} from './defer/timer_scheduler';
175175
export {ɵassertType} from './type_checking';
176176
export {ANIMATIONS_DISABLED as ɵANIMATIONS_DISABLED} from './animation/interfaces';
177177
export {allLeavingAnimations as ɵallLeavingAnimations} from './animation/longest_animation';
178-
export {setZoneProvidersForNextBootstrap as ɵsetZoneProvidersForNextBootstrap} from './platform/platform_ref';

packages/core/src/di/create_injector.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import {EMPTY_ARRAY} from '../util/empty';
1010
import {stringify} from '../util/stringify';
1111

1212
import type {Injector} from './injector';
13-
import type {Provider, StaticProvider} from './interface/provider';
13+
import type {EnvironmentProviders, Provider, StaticProvider} from './interface/provider';
1414
import {importProvidersFrom} from './provider_collection';
1515
import {getNullInjector, R3Injector} from './r3_injector';
1616
import {InjectorScope} from './scope';
@@ -42,7 +42,7 @@ export function createInjector(
4242
export function createInjectorWithoutInjectorInstances(
4343
defType: /* InjectorType<any> */ any,
4444
parent: Injector | null = null,
45-
additionalProviders: Array<Provider | StaticProvider> | null = null,
45+
additionalProviders: Array<Provider | EnvironmentProviders> | null = null,
4646
name?: string,
4747
scopes = new Set<InjectorScope>(),
4848
): R3Injector {

packages/core/src/platform/platform_ref.ts

Lines changed: 10 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import {compileNgModuleFactory} from '../application/application_ngmodule_factor
1010
import {BootstrapOptions, optionsReducer} from '../application/application_ref';
1111
import {validAppIdInitializer} from '../application/application_tokens';
1212
import {provideZonelessChangeDetectionInternal} from '../change_detection/scheduling/zoneless_scheduling_impl';
13-
import {Injectable, Injector, StaticProvider} from '../di';
13+
import {EnvironmentProviders, Injectable, Injector, Provider, StaticProvider} from '../di';
1414
import {errorHandlerEnvironmentInitializer} from '../error_handler';
1515
import {RuntimeError, RuntimeErrorCode} from '../errors';
1616
import {Type} from '../interface/type';
@@ -27,18 +27,6 @@ import {getNgZone} from '../zone/ng_zone';
2727

2828
const ZONELESS_BY_DEFAULT = true;
2929

30-
// Holds the set of providers to be used for the *next* application to be bootstrapped.
31-
// Used only for providing the zone related providers by default with `downgradeModule`.
32-
let _additionalApplicationProviders: StaticProvider[] | undefined = undefined;
33-
export function setZoneProvidersForNextBootstrap(): void {
34-
_additionalApplicationProviders = internalProvideZoneChangeDetection({});
35-
}
36-
function getAndClearAdditionalProviders(): StaticProvider[] | undefined {
37-
const providers = _additionalApplicationProviders;
38-
_additionalApplicationProviders = undefined;
39-
return providers;
40-
}
41-
4230
/**
4331
* The Angular platform is the entry point for Angular on a web page.
4432
* Each page has exactly one platform. Services (such as reflection) which are common
@@ -65,19 +53,7 @@ export class PlatformRef {
6553
*/
6654
bootstrapModuleFactory<M>(
6755
moduleFactory: NgModuleFactory<M>,
68-
options?: BootstrapOptions,
69-
): Promise<NgModuleRef<M>> {
70-
return this.bootstrapModuleFactoryWithApplicationProviders(
71-
moduleFactory,
72-
options,
73-
getAndClearAdditionalProviders(),
74-
);
75-
}
76-
77-
private bootstrapModuleFactoryWithApplicationProviders<M>(
78-
moduleFactory: NgModuleFactory<M>,
79-
options?: BootstrapOptions,
80-
applicationProviders?: StaticProvider[],
56+
options?: BootstrapOptions & {applicationProviders?: Array<Provider | EnvironmentProviders>},
8157
): Promise<NgModuleRef<M>> {
8258
const defaultZoneCdProviders = [];
8359
if (!ZONELESS_BY_DEFAULT) {
@@ -93,7 +69,7 @@ export class PlatformRef {
9369
const allAppProviders = [
9470
provideZonelessChangeDetectionInternal(),
9571
...defaultZoneCdProviders,
96-
...(applicationProviders ?? []),
72+
...(options?.applicationProviders ?? []),
9773
errorHandlerEnvironmentInitializer,
9874
...(ngDevMode ? [validAppIdInitializer] : []),
9975
];
@@ -130,18 +106,17 @@ export class PlatformRef {
130106
bootstrapModule<M>(
131107
moduleType: Type<M>,
132108
compilerOptions:
133-
| (CompilerOptions & BootstrapOptions)
134-
| Array<CompilerOptions & BootstrapOptions> = [],
109+
| (CompilerOptions &
110+
BootstrapOptions & {applicationProviders?: Array<Provider | EnvironmentProviders>})
111+
| Array<
112+
CompilerOptions &
113+
BootstrapOptions & {applicationProviders?: Array<Provider | EnvironmentProviders>}
114+
> = [],
135115
): Promise<NgModuleRef<M>> {
136-
const additionalApplicationProviders = getAndClearAdditionalProviders();
137116
const options = optionsReducer({}, compilerOptions);
138117
setModuleBootstrapImpl();
139118
return compileNgModuleFactory(this.injector, options, moduleType).then((moduleFactory) =>
140-
this.bootstrapModuleFactoryWithApplicationProviders(
141-
moduleFactory,
142-
options,
143-
additionalApplicationProviders,
144-
),
119+
this.bootstrapModuleFactory(moduleFactory, options),
145120
);
146121
}
147122

packages/core/src/render3/ng_module_ref.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ export class NgModuleRef<T> extends viewEngine_NgModuleRef<T> implements Interna
6767
constructor(
6868
private readonly ngModuleType: Type<T>,
6969
public _parent: Injector | null,
70-
additionalProviders: StaticProvider[],
70+
additionalProviders: Array<Provider | EnvironmentProviders>,
7171
runInjectorInitializers = true,
7272
) {
7373
super();
@@ -137,7 +137,7 @@ export class NgModuleFactory<T> extends viewEngine_NgModuleFactory<T> {
137137
export function createNgModuleRefWithProviders<T>(
138138
moduleType: Type<T>,
139139
parentInjector: Injector | null,
140-
additionalProviders: StaticProvider[],
140+
additionalProviders: Array<Provider | EnvironmentProviders>,
141141
): InternalNgModuleRef<T> {
142142
return new NgModuleRef(moduleType, parentInjector, additionalProviders, false);
143143
}

packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,6 @@
315315
"__spreadProps",
316316
"__spreadValues",
317317
"__values",
318-
"_additionalApplicationProviders",
319318
"_applyRootElementTransformImpl",
320319
"_arrayIndexOfSorted",
321320
"_bind",
@@ -542,7 +541,6 @@
542541
"fromPromise",
543542
"fromReadableStreamLike",
544543
"getActiveConsumer",
545-
"getAndClearAdditionalProviders",
546544
"getBaseElementHref",
547545
"getBeforeNodeForView",
548546
"getBindingsEnabled",

packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -319,7 +319,6 @@
319319
"__spreadProps",
320320
"__spreadValues",
321321
"__values",
322-
"_additionalApplicationProviders",
323322
"_applyRootElementTransformImpl",
324323
"_arrayIndexOfSorted",
325324
"_bind",
@@ -543,7 +542,6 @@
543542
"fromPromise",
544543
"fromReadableStreamLike",
545544
"getActiveConsumer",
546-
"getAndClearAdditionalProviders",
547545
"getBaseElementHref",
548546
"getBeforeNodeForView",
549547
"getBindingsEnabled",

packages/upgrade/static/src/downgrade_module.ts

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import {
1313
PlatformRef,
1414
StaticProvider,
1515
Type,
16-
ɵsetZoneProvidersForNextBootstrap,
16+
ɵinternalProvideZoneChangeDetection as internalProvideZoneChangeDetection,
1717
} from '@angular/core';
1818
import {platformBrowser} from '@angular/platform-browser';
1919

@@ -384,21 +384,20 @@ export function downgradeModule<T>(
384384
if (ɵutil.isNgModuleType(moduleOrBootstrapFn)) {
385385
// NgModule class
386386
bootstrapFn = (extraProviders: StaticProvider[]) =>
387-
platformBrowser(extraProviders).bootstrapModule(moduleOrBootstrapFn);
387+
platformBrowser(extraProviders).bootstrapModule(moduleOrBootstrapFn, {
388+
applicationProviders: [internalProvideZoneChangeDetection({})],
389+
});
388390
} else if (!ɵutil.isFunction(moduleOrBootstrapFn)) {
389391
// NgModule factory
390392
bootstrapFn = (extraProviders: StaticProvider[]) =>
391-
platformBrowser(extraProviders).bootstrapModuleFactory(moduleOrBootstrapFn);
393+
platformBrowser(extraProviders).bootstrapModuleFactory(moduleOrBootstrapFn, {
394+
applicationProviders: [internalProvideZoneChangeDetection({})],
395+
});
392396
} else {
393397
// bootstrap function
394398
bootstrapFn = moduleOrBootstrapFn;
395399
}
396400

397-
const wrappedBootstrapFn = (extraProviders: StaticProvider[]) => {
398-
ɵsetZoneProvidersForNextBootstrap();
399-
return bootstrapFn(extraProviders);
400-
};
401-
402401
let injector: Injector;
403402

404403
// Create an ng1 module to bootstrap.
@@ -421,7 +420,7 @@ export function downgradeModule<T>(
421420
($injector: ɵangular1.IInjectorService) => {
422421
setTempInjectorRef($injector);
423422
const result: ɵutil.LazyModuleRef = {
424-
promise: wrappedBootstrapFn(angular1Providers).then((ref) => {
423+
promise: bootstrapFn(angular1Providers).then((ref) => {
425424
injector = result.injector = new NgAdapterInjector(ref.injector);
426425
injector.get(ɵconstants.$INJECTOR);
427426

0 commit comments

Comments
 (0)