Skip to content

Commit 4e413d9

Browse files
AndrewKushnirdylhunn
authored andcommitted
fix(core): support nested arrays of providers in EnvironmentInjector (#45789)
This commit updates the `EnvironmentInjector` logic to support arrays of providers as an argument(for example, when an injector is created via `createEnvironmentInjector` function). PR Close #45789
1 parent 2941793 commit 4e413d9

File tree

2 files changed

+27
-4
lines changed

2 files changed

+27
-4
lines changed

packages/core/src/di/r3_injector.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import {Type} from '../interface/type';
1414
import {getComponentDef} from '../render3/definition';
1515
import {FactoryFn, getFactoryDef} from '../render3/definition_factory';
1616
import {throwCyclicDependencyError, throwInvalidProviderError, throwMixedMultiProviderError} from '../render3/errors_di';
17-
import {flatten, newArray} from '../util/array_utils';
17+
import {deepForEach, flatten, newArray} from '../util/array_utils';
1818
import {EMPTY_ARRAY} from '../util/empty';
1919
import {stringify} from '../util/stringify';
2020

@@ -125,9 +125,9 @@ export class R3Injector extends EnvironmentInjector {
125125
readonly scopes: Set<InjectorScope>) {
126126
super();
127127
// Start off by creating Records for every provider.
128-
for (const provider of providers) {
128+
deepForEach(providers, provider => {
129129
this.processProvider(provider as SingleProvider);
130-
}
130+
});
131131

132132
// Make sure the INJECTOR token provides this injector.
133133
this.records.set(INJECTOR, makeRecord(undefined, this));

packages/core/test/acceptance/env_injector_standalone_spec.ts

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
* found in the LICENSE file at https://angular.io/license
77
*/
88

9-
import {Component, createEnvironmentInjector, importProvidersFrom, NgModule} from '@angular/core';
9+
import {Component, createEnvironmentInjector, importProvidersFrom, InjectionToken, NgModule} from '@angular/core';
1010

1111
describe('environement injector and standalone components', () => {
1212
it('should see providers from modules imported by standalone components', () => {
@@ -70,4 +70,27 @@ describe('environement injector and standalone components', () => {
7070

7171
expect(services.length).toBe(1);
7272
});
73+
74+
it('should support nested arrays of providers', () => {
75+
const A = new InjectionToken('A');
76+
const B = new InjectionToken('B');
77+
const C = new InjectionToken('C');
78+
const MULTI = new InjectionToken('D');
79+
80+
const providers = [
81+
{provide: MULTI, useValue: 1, multi: true}, {provide: A, useValue: 'A'}, //
82+
[
83+
{provide: B, useValue: 'B'},
84+
[
85+
{provide: C, useValue: 'C'},
86+
{provide: MULTI, useValue: 2, multi: true},
87+
]
88+
]
89+
];
90+
const envInjector = createEnvironmentInjector(providers);
91+
expect(envInjector.get(A)).toBe('A');
92+
expect(envInjector.get(B)).toBe('B');
93+
expect(envInjector.get(C)).toBe('C');
94+
expect(envInjector.get(MULTI)).toEqual([1, 2]);
95+
});
7396
});

0 commit comments

Comments
 (0)