/** * @license * Copyright Google Inc. All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://angular.io/license */ import {Type} from '../interface/type'; import {TypeDecorator, makeDecorator} from '../util/decorators'; import {InjectableType, getInjectableDef, ɵɵdefineInjectable} from './interface/defs'; import {ClassSansProvider, ConstructorSansProvider, ExistingSansProvider, FactorySansProvider, StaticClassSansProvider, ValueSansProvider} from './interface/provider'; import {compileInjectable as render3CompileInjectable} from './jit/injectable'; import {convertInjectableProviderToFactory} from './util'; /** * Injectable providers used in `@Injectable` decorator. * * @publicApi */ export type InjectableProvider = ValueSansProvider | ExistingSansProvider | StaticClassSansProvider | ConstructorSansProvider | FactorySansProvider | ClassSansProvider; /** * Type of the Injectable decorator / constructor function. * * @publicApi */ export interface InjectableDecorator { /** * Decorator that marks a class as available to be * provided and injected as a dependency. * * @see [Introduction to Services and DI](guide/architecture-services) * @see [Dependency Injection Guide](guide/dependency-injection) * * @usageNotes * * Marking a class with `@Injectable` ensures that the compiler * will generate the necessary metadata to create the class's * dependencies when the class is injected. * * The following example shows how a service class is properly * marked so that a supporting service can be injected upon creation. * * * */ (): TypeDecorator; (options?: {providedIn: Type| 'root' | 'platform' | 'any' | null}& InjectableProvider): TypeDecorator; new (): Injectable; new (options?: {providedIn: Type| 'root' | 'platform' | 'any' | null}& InjectableProvider): Injectable; } /** * Type of the Injectable metadata. * * @publicApi */ export interface Injectable { /** * Determines which injectors will provide the injectable, * by either associating it with an `@NgModule` or other `InjectorType`, * or by specifying that this injectable should be provided in one of the following injectors: * - 'root' : The application-level injector in most apps. * - 'platform' : A special singleton platform injector shared by all * applications on the page. * - 'any' : Provides a unique instance in every module (including lazy modules) that injects the * token. * */ providedIn?: Type|'root'|'platform'|'any'|null; } /** * Injectable decorator and metadata. * * @Annotation * @publicApi */ export const Injectable: InjectableDecorator = makeDecorator( 'Injectable', undefined, undefined, undefined, (type: Type, meta: Injectable) => SWITCH_COMPILE_INJECTABLE(type as any, meta)); /** * Supports @Injectable() in JIT mode for Render2. */ function render2CompileInjectable(injectableType: Type, options?: { providedIn?: Type| 'root' | 'platform' | 'any' | null } & InjectableProvider): void { if (options && options.providedIn !== undefined && !getInjectableDef(injectableType)) { (injectableType as InjectableType).ɵprov = ɵɵdefineInjectable({ token: injectableType, providedIn: options.providedIn, factory: convertInjectableProviderToFactory(injectableType, options), }); } } export const SWITCH_COMPILE_INJECTABLE__POST_R3__ = render3CompileInjectable; const SWITCH_COMPILE_INJECTABLE__PRE_R3__ = render2CompileInjectable; const SWITCH_COMPILE_INJECTABLE: typeof render3CompileInjectable = SWITCH_COMPILE_INJECTABLE__PRE_R3__;