import { ClassDecoratorFunction } from './types.js'; import { Token } from './tokens.js'; export type Scope = 'singleton' | 'transient'; export type Constructable = abstract new (...args: any[]) => T; export interface InjectMetadata { scope: Scope; inject: InjectionToken[]; } type InjectionTokenTuple = TParameters extends [] ? [] : TParameters extends [infer Head, ...infer Tail] ? [InjectionToken, ...InjectionTokenTuple] : InjectionToken[]; export interface InjectOptions> { scope?: Scope; inject?: InjectionTokenTuple>; } export type InjectFunction = Constructable & { __injectMetadata__: InjectMetadata; }; export type InjectionToken = Token | Constructable; export type ResolvedToken = TToken extends Token ? R : TToken extends Constructable ? R : never; export type ResolvedTokens = { [Index in keyof TTokens]: TTokens[Index] extends InjectionToken ? R : never; }; /** * Indicates that a class has dependencies to be injected by the DI container. * * @example * ```ts * @inject({ * scope: 'singleton', * inject: [ * ClassDependency, * dependencyToken, * ], * }) * class MyClass { * constructor( * classDep: ClassDependency, * dependency: DependencyType, * ) { * // ... * } * } */ export declare function inject any>(options?: InjectOptions): ClassDecoratorFunction; /** * Retrieves injection metadata from a class, if available. */ export declare function getInjectMetadata(func: Constructable): InjectMetadata | undefined; export {};