import { PublicOnlyIfObject } from '../shared/types.js'; import { Constructable, InjectionToken, Scope } from './inject.js'; export interface FactoryRegistration { token: InjectionToken; useFactory: (...deps: Deps) => PublicOnlyIfObject; inject?: InjectionToken[]; scope?: Scope; } export type ModuleRegistryEntry = Constructable | FactoryRegistration; export interface ModuleOptions { imports?: ModuleMetadata[]; register?: ModuleRegistryEntry[]; } export interface ProviderDefinition { token: InjectionToken; scope: Scope; inject: InjectionToken[]; create: (...deps: unknown[]) => T; } export interface ModuleMetadata { providers: Map, ProviderDefinition>; } /** * Describes an injection token for error messages. */ export declare function describeToken(token: InjectionToken): string; /** * Creates metadata for a dependency injection module. * * @example * ```ts * const myModule = module({ * register: [ * MyClass, * { token: myToken, useFactory: () => new Dependency() }, * { * token: otherToken, * useFactory: (MyClass) => ..., * inject: [MyClass], * }, * ], * }); * ``` * @param options Module options. */ export declare function module(options?: ModuleOptions): ModuleMetadata; /** * Shorthand to create a factory registration that does not require dependencies. */ export declare function provideValue(token: InjectionToken, factory: () => PublicOnlyIfObject, scope?: Scope): FactoryRegistration; /** * Shorthand to create a factory registration that does not require dependencies. * Allows providing a partial implementation of an object type. */ export declare function provideTestValue(token: InjectionToken, factory: () => Partial>, scope?: Scope): FactoryRegistration;