UNPKG

@httpc/kit

Version:

httpc toolbox for building function-based API with minimal code and end-to-end type safety

28 lines (27 loc) 1.84 kB
import { DependencyContainer, InjectionToken } from "tsyringe"; export type Constructor<T = any> = new (...args: any) => T; export type ServiceKey = keyof ServiceTypes; export type ServiceKeyGroup = "ENV" | "OPTIONS"; type ServiceGroups = { ENV: IEnvVariables; OPTIONS: string | Constructor; }; type IsStrict<T> = T extends { $strict: true; } ? true : false; type KeysOf<T> = IsStrict<T> extends true ? Exclude<keyof T, "$strict"> : (Exclude<keyof T, "$strict"> | (string & {})); type ServiceGroupsKeys<T extends ServiceKeyGroup> = ServiceGroups[T] extends object ? KeysOf<ServiceGroups[T]> : ServiceGroups[T]; export type ServiceInjectToken = Constructor | ServiceKey | `ENV:${string}`; export type ServiceInstance<T extends ServiceInjectToken> = T extends Constructor<infer I> ? I : T extends ServiceKey ? ServiceTypes[T] : T extends `ENV:${string}` ? string : unknown; export type ServiceInstances<T extends ServiceInjectToken[]> = { [k in keyof T]: ServiceInstance<T[k]>; }; export declare const CONTAINER_KEY = "$CONTAINER"; export declare function KEY<T extends ServiceKey>(service: T): T; export declare function KEY<T extends ServiceKeyGroup>(group: T, key: ServiceGroupsKeys<T>): `${T}:${string}`; export declare function RESOLVE<T extends ServiceInjectToken>(container: DependencyContainer, service: T): ServiceInstance<T>; export declare function RESOLVE_ALL<T extends ServiceInjectToken>(container: DependencyContainer, service: T): ServiceInstance<T>[]; export declare function RESOLVE_MANY<T extends ServiceInjectToken[]>(container: DependencyContainer, ...types: T): ServiceInstances<T>; export declare function REGISTER_INSTANCE<T>(token: InjectionToken, value: T): void; export declare function REGISTER_OPTIONS<TOption>(service: Constructor, options: TOption): void; export {};