fix(ivy): account for `useValue: undefined` providers in module injector (#27035)
PR Close #27035
This commit is contained in:
parent
75723d5c89
commit
6552471c49
|
@ -248,7 +248,7 @@ export class R3Injector {
|
|||
|
||||
// Track the InjectorType and add a provider for it.
|
||||
this.injectorDefTypes.add(defType);
|
||||
this.records.set(defType, makeRecord(def.factory));
|
||||
this.records.set(defType, makeRecord(def.factory, NOT_YET));
|
||||
|
||||
// Add providers in the same way that @NgModule resolution did:
|
||||
|
||||
|
@ -391,7 +391,7 @@ export function providerToFactory(provider: SingleProvider): () => any {
|
|||
}
|
||||
|
||||
function makeRecord<T>(
|
||||
factory: (() => T) | undefined, value: T | {} = NOT_YET, multi: boolean = false): Record<T> {
|
||||
factory: (() => T) | undefined, value: T | {}, multi: boolean = false): Record<T> {
|
||||
return {
|
||||
factory: factory,
|
||||
value: value,
|
||||
|
|
|
@ -44,6 +44,9 @@ describe('InjectorDef-based createInjector()', () => {
|
|||
|
||||
const LOCALE = new InjectionToken<string[]>('LOCALE');
|
||||
|
||||
const PRIMITIVE_VALUE = new InjectionToken<string>('PRIMITIVE_VALUE');
|
||||
const UNDEFINED_VALUE = new InjectionToken<undefined>('UNDEFINED_VALUE');
|
||||
|
||||
class ServiceWithDep {
|
||||
constructor(readonly service: Service) {}
|
||||
|
||||
|
@ -127,6 +130,8 @@ describe('InjectorDef-based createInjector()', () => {
|
|||
ServiceWithMultiDep,
|
||||
{provide: LOCALE, multi: true, useValue: 'en'},
|
||||
{provide: LOCALE, multi: true, useValue: 'es'},
|
||||
{provide: PRIMITIVE_VALUE, useValue: 'foo'},
|
||||
{provide: UNDEFINED_VALUE, useValue: undefined},
|
||||
Service,
|
||||
{provide: SERVICE_TOKEN, useExisting: Service},
|
||||
CircularA,
|
||||
|
@ -204,6 +209,16 @@ describe('InjectorDef-based createInjector()', () => {
|
|||
expect(instance).toBe(injector.get(Service));
|
||||
});
|
||||
|
||||
it('injects a useValue token with a primitive value', () => {
|
||||
const value = injector.get(PRIMITIVE_VALUE);
|
||||
expect(value).toEqual('foo');
|
||||
});
|
||||
|
||||
it('injects a useValue token with value undefined', () => {
|
||||
const value = injector.get(UNDEFINED_VALUE);
|
||||
expect(value).toBeUndefined();
|
||||
});
|
||||
|
||||
it('instantiates a class with useClass and deps', () => {
|
||||
const instance = injector.get(STATIC_TOKEN);
|
||||
expect(instance instanceof StaticService).toBeTruthy();
|
||||
|
|
Loading…
Reference in New Issue