import type { TokenInterface, ExtractTokenType, OptionalTokenDependency, ExtractDependencyType } from './createToken/createToken'; type Provide = TokenInterface | string | any; export type ScopeVariants = 'request' | 'singleton'; type ProviderOptions = { token: Provide; optional?: boolean; multi?: boolean; }; export type ProviderDep = Provide | OptionalTokenDependency | ProviderOptions; export type ProviderDeps = Record; type MultiEnhance = Option extends true ? Value[] : Value; type OptionalEnhance = Option extends true ? Value | null : Value; export type OptionsType = OptionsToken extends string ? OptionalEnhance> : OptionalEnhance>; export type ProvideDepsIterator = { [P in keyof T]: T[P] extends OptionalTokenDependency ? (ExtractDependencyType | null) : T[P] extends TokenInterface ? ExtractDependencyType : T[P] extends string ? any : T[P] extends { token: infer OptionsToken; optional?: infer OptionsOptional; multi?: infer OptionsMulti; } ? OptionsType : ExtractDependencyType; }; type ClassCreator = new (deps: ProvideDepsIterator) => P extends TokenInterface ? ExtractTokenType

: P extends string ? any : P; type FactoryCreator = (deps: ProvideDepsIterator) => P extends TokenInterface ? ExtractTokenType

: P extends string ? any : P; interface FactoryProviderBase

{ /** * Идентификатор токена */ provide: P extends TokenInterface ? P : Provide; /** * Тип регистрации провайдера, будет ли глобальный синглтон или инстанс для клиента */ scope?: ScopeVariants; /** * Если true, то позволяет зарегистрировать несколько провайдеров на одном токен. Придет массив как значение */ multi?: boolean; } export interface FactoryProviderWithoutDeps

extends FactoryProviderBase

{ /** * Функция которая будет вызвана при инициализации провайдера и получит зависимости, если они были заданы */ useFactory: () => P extends TokenInterface ? ExtractTokenType

: Provide; } export interface FactoryProviderWithDeps extends FactoryProviderBase

{ /** * Список токенов которые нужны сервису. При получении зависимости * эти зависимости будут проинициализованы и переданны в функцию/класс */ deps: Deps; /** * Функция которая будет вызвана при инициализации провайдера и получит зависимости, если они были заданы */ useFactory: FactoryCreator; } export type FactoryProvider = FactoryProviderWithDeps | FactoryProviderWithoutDeps

; interface ClassProviderBase

{ /** * Идентификатор токена */ provide: P extends TokenInterface ? P : Provide; /** * Тип регистрации провайдера, будет ли глобальный синглтон или инстанс для клиента */ scope?: ScopeVariants; /** * Если true, то позволяет зарегистрировать несколько провайдеров на одном токен. Придет массив как значение */ multi?: boolean; } export interface ClassProviderWithoutDeps

extends ClassProviderBase

{ /** * Класс который будет создана при инициализации провайдера и получит зависимости, если они были заданы */ useClass: new () => P extends TokenInterface ? ExtractTokenType

: Provide; } export interface ClassProviderWithDeps extends ClassProviderBase

{ /** * Список токенов которые нужны сервису. При получении зависимости * эти зависимости будут проинициализованы и переданны в функцию/класс */ deps: Deps; /** * Класс который будет создана при инициализации провайдера и получит зависимости, если они были заданы */ useClass: ClassCreator; } export type ClassProvider = ClassProviderWithDeps | ClassProviderWithoutDeps

; export interface ValueProvider

{ /** * Идентификатор токена */ provide: P extends TokenInterface ? P : Provide; /** * Тип регистрации провайдера, будет ли глобальный синглтон или инстанс для клиента */ scope?: ScopeVariants; /** * Если true, то позволяет зарегистрировать несколько провайдеров на одном токен. Придет массив как значение */ multi?: boolean; /** * Простое значение, которое будет доступно */ useValue: P extends TokenInterface ? ExtractTokenType

: P extends string ? any : P; } export type Provider = ValueProvider

| ClassProvider | FactoryProvider; export {}; //# sourceMappingURL=Provider.d.ts.map