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 {};
