import { primitive } from "../../safe"; import { AnnotationBuilder } from "../Annotations"; import { ILifetime, TypeOfService, ContainerKeys } from "../interfaces"; export interface DependencyOptions { optional?: boolean; default?: any; } export interface LazyDependencyOptions extends DependencyOptions { lazy: true; } export type ExtractService = K extends keyof S ? S[K] : never; export type ExtractDependency = D extends { $dependency: infer K } ? D extends { lazy: true } ? () => ExtractService : ExtractService : D extends { $type: new (...args: any[]) => infer I } ? I : D extends { $factory: (...args: any[]) => infer R } ? R : WalkDependencies; export type WalkDependencies = D extends primitive ? D : { [K in keyof D]: ExtractDependency }; export type ServiceModule = { [m in M]: AnnotationBuilder; }; export type InferReferenceType, O> = O extends { default: infer X } ? (TypeOfService | X) : O extends { optional: true } ? (TypeOfService | undefined) : TypeOfService; export interface Resolver { , O extends LazyDependencyOptions>(this: void, name: K, opts: O): () => InferReferenceType; , O extends DependencyOptions>(this: void, name: K, opts?: O): InferReferenceType; } export interface DescriptorBuilder { service(service: AnnotationBuilder | ServiceModule): void; factory(f: (resolve: Resolver, activate: (lifetime: ILifetime, factory: () => T2, cleanup?: (item: T2) => void) => T2) => T): void; value(v: T): void; } export interface Configuration { register(name: K, builder: (d: DescriptorBuilder) => void): Configuration>; }