import "reflect-metadata"; import type { Abstraction } from "./Abstraction.js"; export type Constructor = new (...args: any[]) => T; export type GetInterface = T extends Abstraction ? U : never; export interface DependencyOptions { multiple?: boolean; optional?: boolean; } export type Dependency = Abstraction | [Abstraction, DependencyOptions]; export interface Registration { implementation: Constructor; dependencies: Dependency[]; scope: LifetimeScope; } export interface DecoratorRegistration { decoratorClass: Constructor; dependencies: Dependency[]; } export interface InstanceRegistration { instance: T; } export declare enum LifetimeScope { Transient = 0, Singleton = 1 } export type IsOptionalValue = undefined extends T ? T : never; export type IsArray> = Array extends T ? T : never; export type GetAbstractionFromArray = T extends Array ? Abstraction : never; export type MultipleTrue = { multiple: true; }; export type OptionalTrue = { optional: true; }; export type MultipleFalse = { multiple: false; }; export type OptionalFalse = { optional: false; }; declare const implementation: unique symbol; export type Implementation = T & { [implementation]: "Implementation"; }; export type MapDependencies = { [K in keyof T]-?: T[K] extends IsArray ? [ GetAbstractionFromArray, T[K] extends IsOptionalValue ? MultipleTrue & OptionalTrue : MultipleTrue & Partial ] : T[K] extends IsOptionalValue ? [ Abstraction, OptionalTrue & Partial ] : [Abstraction, MultipleFalse & Partial] | [Abstraction] | Abstraction; }; export type Dependencies = T extends Constructor ? MapDependencies> : never; export {};