import { RawArgument } from "./raw"; import { Token } from "./token"; import { Container } from "./container"; export type Argument = Token | RawArgument; export type Constructor = new (...args: any[]) => T; export type Func = (...args: any[]) => T; export type Creator = Constructor | Func; export type Creates = T extends Constructor ? InstanceType : T extends Func ? ReturnType : never; export type CreatorParameters = T extends Constructor ? ConstructorParameters : T extends Func ? Parameters : never; export type Arguments = ToArguments>; export type ToArguments = { [K in keyof T]: Argument; }; export type Request = { token: Token; callback: () => void; }; export type Dependency = { token: Token; creator: Creator; args: Argument[]; shared: boolean; instance?: any; }; export type ProviderCallback = (container: Container) => void; export type Provider = { tokens: Token[]; called?: boolean; callback: () => void; }; export type GetCallback = (instance: T) => void; export interface Module { provides: Token[]; register: ProviderCallback; }