sahara
Version:
An inversion-of-control container for managing dependencies. Supports constructor, property and method injection
32 lines (31 loc) • 1.32 kB
TypeScript
import { ResolveContext } from './container';
export type RegisteringEventType = 'type' | 'instance' | 'factory';
export type ContainerEventMap = {
registering: [string, RegisteringEventType];
resolving: [string];
resolved: [string, unknown];
};
export type ContainerEvent = keyof ContainerEventMap;
export type BuilderEventMap = {
building: [TypeInfo];
built: [TypeInfo, unknown];
};
export type BuilderEvent = keyof BuilderEventMap;
export interface Resolvable<TResolveMap extends Record<string, unknown> = Record<string, unknown>> {
resolve<T = never, K extends keyof TResolveMap = never>(key: [T] extends [never] ? K : Constructor<T> | string, context?: ResolveContext): Promise<[T] extends [never] ? TResolveMap[K] : T>;
resolveSync<T = never, K extends keyof TResolveMap = never>(key: [T] extends [never] ? K : Constructor<T> | string, context?: ResolveContext): [T] extends [never] ? TResolveMap[K] : T;
}
export type Constructor<T = unknown> = new (...args: any[]) => T;
export type TypeInfoParseType = 'arg' | 'doc-comment';
export interface TypeInfoArgument {
position: number;
type: string;
name: string;
parsedAs: TypeInfoParseType;
}
export interface TypeInfo {
args: TypeInfoArgument[];
ctor: Function;
name: string;
constructable: boolean;
}