From 92bb8d974bb47035e292f436604bf0f2b05bbbef Mon Sep 17 00:00:00 2001 From: iteriani Date: Fri, 28 Feb 2025 16:15:30 -0800 Subject: [PATCH] refactor(core): Use the retrieve method in the implementation of injectInjectorOnly (#60192) This should keep the existing behavior intact. Right now retrieve never returns back NOT_FOUND. This should not be the case, but tests fail if I do add this behavior so itll have to be later. PR Close #60192 --- .../core/primitives/di/index.api.md | 2 +- .../core/primitives/di/src/injection_token.ts | 2 +- .../core/src/di/injector_compatibility.ts | 34 ++++++++++++------- packages/core/src/di/r3_injector.ts | 13 +++++-- .../bundle.golden_symbols.json | 1 - .../animations/bundle.golden_symbols.json | 1 - .../cyclic_import/bundle.golden_symbols.json | 1 - .../bundling/defer/bundle.golden_symbols.json | 1 - .../forms_reactive/bundle.golden_symbols.json | 1 - .../bundle.golden_symbols.json | 1 - .../hello_world/bundle.golden_symbols.json | 1 - .../hydration/bundle.golden_symbols.json | 1 - .../injection/bundle.golden_symbols.json | 4 +-- .../router/bundle.golden_symbols.json | 1 - .../bundle.golden_symbols.json | 1 - .../bundling/todo/bundle.golden_symbols.json | 1 - 16 files changed, 35 insertions(+), 31 deletions(-) diff --git a/goldens/public-api/core/primitives/di/index.api.md b/goldens/public-api/core/primitives/di/index.api.md index 95276e3288c..80f08907e2e 100644 --- a/goldens/public-api/core/primitives/di/index.api.md +++ b/goldens/public-api/core/primitives/di/index.api.md @@ -8,7 +8,7 @@ export function getCurrentInjector(): Injector | undefined | null; // @public -export interface InjectionToken extends Type { +export interface InjectionToken { // (undocumented) ɵprov: ɵɵInjectableDeclaration; } diff --git a/packages/core/primitives/di/src/injection_token.ts b/packages/core/primitives/di/src/injection_token.ts index 2b3998664a0..5ca61eb8d0e 100644 --- a/packages/core/primitives/di/src/injection_token.ts +++ b/packages/core/primitives/di/src/injection_token.ts @@ -49,6 +49,6 @@ export interface ɵɵInjectableDeclaration { * * @publicApi */ -export interface InjectionToken extends Type { +export interface InjectionToken { ɵprov: ɵɵInjectableDeclaration; } diff --git a/packages/core/src/di/injector_compatibility.ts b/packages/core/src/di/injector_compatibility.ts index cacd787f647..e2dbed9906e 100644 --- a/packages/core/src/di/injector_compatibility.ts +++ b/packages/core/src/di/injector_compatibility.ts @@ -27,10 +27,10 @@ import type {HostAttributeToken} from './host_attribute_token'; import { Injector as PrimitivesInjector, NotFound, - NOT_FOUND, InjectionToken as PrimitivesInjectionToken, getCurrentInjector, } from '@angular/core/primitives/di'; +import {InjectionToken} from './injection_token'; const _THROW_IF_NOT_FOUND = {}; export const THROW_IF_NOT_FOUND = _THROW_IF_NOT_FOUND; @@ -44,11 +44,25 @@ export {getCurrentInjector, setCurrentInjector} from '@angular/core/primitives/d */ const DI_DECORATOR_FLAG = '__NG_DI_FLAG__'; +/** + * A wrapper around an `Injector` that implements the `PrimitivesInjector` interface. + * + * This is used to allow the `inject` function to be used with the new primitives-based DI system. + */ export class RetrievingInjector implements PrimitivesInjector { constructor(readonly injector: Injector) {} retrieve(token: PrimitivesInjectionToken, options: unknown): T | NotFound { - const ngOptions = options as InjectOptions; - return this.injector.get(token, ngOptions.optional ? NOT_FOUND : THROW_IF_NOT_FOUND, ngOptions); + let flags: InjectFlags; + if (options && (options as {flags: InjectFlags}).flags) { + flags = (options as {flags: InjectFlags}).flags; + } else { + flags = convertToBitFlags(options as InjectOptions | undefined) || InjectFlags.Default; + } + return this.injector.get( + token as unknown as InjectionToken, + flags & InjectFlags.Optional ? null : undefined, + flags, + ) as T; } } @@ -64,23 +78,17 @@ export function injectInjectorOnly( token: ProviderToken, flags = InjectFlags.Default, ): T | null { - if (getCurrentInjector() === undefined) { + const currentInjector = getCurrentInjector(); + if (currentInjector === undefined) { throw new RuntimeError( RuntimeErrorCode.MISSING_INJECTION_CONTEXT, ngDevMode && `The \`${stringify(token)}\` token injection failed. \`inject()\` function must be called from an injection context such as a constructor, a factory function, a field initializer, or a function used with \`runInInjectionContext\`.`, ); - } else if (getCurrentInjector() === null) { + } else if (currentInjector === null) { return injectRootLimpMode(token, undefined, flags); } else { - const currentInjector = getCurrentInjector(); - let injector: Injector; - if (currentInjector instanceof RetrievingInjector) { - injector = currentInjector.injector; - } else { - injector = currentInjector as unknown as Injector; - } - const value = injector.get(token, flags & InjectFlags.Optional ? null : undefined, flags); + const value = currentInjector.retrieve(token as PrimitivesInjectionToken, {flags}) as T; ngDevMode && emitInjectEvent(token as Type, value, flags); return value; } diff --git a/packages/core/src/di/r3_injector.ts b/packages/core/src/di/r3_injector.ts index 31720cb6987..fb17c8ef1af 100644 --- a/packages/core/src/di/r3_injector.ts +++ b/packages/core/src/di/r3_injector.ts @@ -242,8 +242,17 @@ export class R3Injector extends EnvironmentInjector implements PrimitivesInjecto } retrieve(token: PrimitivesInjectionToken, options?: unknown): T | NotFound { - const ngOptions = options as InjectOptions; - return this.get(token, ngOptions.optional ? NOT_FOUND : THROW_IF_NOT_FOUND, ngOptions); + let flags: InjectFlags; + if (options && (options as {flags: InjectFlags}).flags) { + flags = (options as {flags: InjectFlags}).flags; + } else { + flags = convertToBitFlags(options as InjectOptions | undefined) || InjectFlags.Default; + } + return this.get( + token as unknown as InjectionToken, + flags & InjectFlags.Optional ? null : undefined, + flags, + ); } /** diff --git a/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json b/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json index 0a9bca51c9a..5311f869d42 100644 --- a/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json +++ b/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json @@ -107,7 +107,6 @@ "NG_INJ_DEF", "NG_PIPE_DEF", "NG_PROV_DEF", - "NOT_FOUND", "NOT_FOUND2", "NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR", "NOT_YET", diff --git a/packages/core/test/bundling/animations/bundle.golden_symbols.json b/packages/core/test/bundling/animations/bundle.golden_symbols.json index 374c49b7abf..7687e4d67d6 100644 --- a/packages/core/test/bundling/animations/bundle.golden_symbols.json +++ b/packages/core/test/bundling/animations/bundle.golden_symbols.json @@ -114,7 +114,6 @@ "NG_MOD_DEF", "NG_PIPE_DEF", "NG_PROV_DEF", - "NOT_FOUND", "NOT_FOUND2", "NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR", "NOT_YET", diff --git a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json index 007fcf58727..b5ec1bfb4e8 100644 --- a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json +++ b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json @@ -83,7 +83,6 @@ "NG_MOD_DEF", "NG_PIPE_DEF", "NG_PROV_DEF", - "NOT_FOUND", "NOT_FOUND2", "NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR", "NOT_YET", diff --git a/packages/core/test/bundling/defer/bundle.golden_symbols.json b/packages/core/test/bundling/defer/bundle.golden_symbols.json index 83e0bf19aac..073950de852 100644 --- a/packages/core/test/bundling/defer/bundle.golden_symbols.json +++ b/packages/core/test/bundling/defer/bundle.golden_symbols.json @@ -112,7 +112,6 @@ "NG_TEMPLATE_SELECTOR", "NG_TEMP_TOKEN_PATH", "NG_TOKEN_PATH", - "NOT_FOUND", "NOT_FOUND2", "NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR", "NOT_YET", diff --git a/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json b/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json index 73ff4682984..67879aeb6bd 100644 --- a/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json +++ b/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json @@ -119,7 +119,6 @@ "NG_PROV_DEF", "NG_VALIDATORS", "NG_VALUE_ACCESSOR", - "NOT_FOUND", "NOT_FOUND2", "NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR", "NOT_YET", diff --git a/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json b/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json index 83d193e7e65..1021a14ac59 100644 --- a/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json +++ b/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json @@ -111,7 +111,6 @@ "NG_PROV_DEF", "NG_VALIDATORS", "NG_VALUE_ACCESSOR", - "NOT_FOUND", "NOT_FOUND2", "NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR", "NOT_YET", diff --git a/packages/core/test/bundling/hello_world/bundle.golden_symbols.json b/packages/core/test/bundling/hello_world/bundle.golden_symbols.json index 29b0b998473..ca552ffb4cf 100644 --- a/packages/core/test/bundling/hello_world/bundle.golden_symbols.json +++ b/packages/core/test/bundling/hello_world/bundle.golden_symbols.json @@ -58,7 +58,6 @@ "NG_INJ_DEF", "NG_MOD_DEF", "NG_PROV_DEF", - "NOT_FOUND", "NOT_FOUND2", "NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR", "NOT_YET", diff --git a/packages/core/test/bundling/hydration/bundle.golden_symbols.json b/packages/core/test/bundling/hydration/bundle.golden_symbols.json index fa184c11a12..4511f2255d2 100644 --- a/packages/core/test/bundling/hydration/bundle.golden_symbols.json +++ b/packages/core/test/bundling/hydration/bundle.golden_symbols.json @@ -89,7 +89,6 @@ "NG_INJ_DEF", "NG_PIPE_DEF", "NG_PROV_DEF", - "NOT_FOUND", "NOT_FOUND2", "NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR", "NOT_YET", diff --git a/packages/core/test/bundling/injection/bundle.golden_symbols.json b/packages/core/test/bundling/injection/bundle.golden_symbols.json index 6608d9404b3..9073fd66af8 100644 --- a/packages/core/test/bundling/injection/bundle.golden_symbols.json +++ b/packages/core/test/bundling/injection/bundle.golden_symbols.json @@ -16,12 +16,10 @@ "NG_INJECTOR_DEF", "NG_INJ_DEF", "NG_PROV_DEF", - "NOT_FOUND", "NOT_YET", "NULL_INJECTOR", "NullInjector", "R3Injector", - "RetrievingInjector", "RuntimeError", "ScopedService", "Subscription", @@ -36,6 +34,7 @@ "activeConsumer", "arrRemove", "assertNotDestroyed", + "convertToBitFlags", "createErrorClass", "createInjector", "createLFrame", @@ -45,7 +44,6 @@ "forEachSingleProvider", "forwardRef", "getClosureSafeProperty", - "getCurrentInjector", "getFactoryDef", "getInjectableDef", "getInjectorDef", diff --git a/packages/core/test/bundling/router/bundle.golden_symbols.json b/packages/core/test/bundling/router/bundle.golden_symbols.json index e401f25bdb4..e49d5bdd257 100644 --- a/packages/core/test/bundling/router/bundle.golden_symbols.json +++ b/packages/core/test/bundling/router/bundle.golden_symbols.json @@ -124,7 +124,6 @@ "NG_MOD_DEF", "NG_PIPE_DEF", "NG_PROV_DEF", - "NOT_FOUND", "NOT_FOUND2", "NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR", "NOT_YET", diff --git a/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json b/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json index 78e111ba9c5..e1cd7d46d09 100644 --- a/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json +++ b/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json @@ -77,7 +77,6 @@ "NG_INJ_DEF", "NG_PIPE_DEF", "NG_PROV_DEF", - "NOT_FOUND", "NOT_FOUND2", "NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR", "NOT_YET", diff --git a/packages/core/test/bundling/todo/bundle.golden_symbols.json b/packages/core/test/bundling/todo/bundle.golden_symbols.json index b2aaa9d6600..6f1448178ef 100644 --- a/packages/core/test/bundling/todo/bundle.golden_symbols.json +++ b/packages/core/test/bundling/todo/bundle.golden_symbols.json @@ -85,7 +85,6 @@ "NG_MOD_DEF", "NG_PIPE_DEF", "NG_PROV_DEF", - "NOT_FOUND", "NOT_FOUND2", "NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR", "NOT_YET",