UNPKG

proxydi

Version:

A typed hierarchical DI container that resolves circular dependencies via Proxy

69 lines (68 loc) 2.8 kB
import { ProxyDiContainer } from './ProxyDiContainer'; export type DependencyId = string | symbol; export type DependencyClass<T> = new (...args: any[]) => T; export type Setter = (object: unknown, value: unknown) => void; export type Injection = { property: string | symbol; dependencyId: DependencyId; set: Setter; }; export type IProxyDiContainer = { id: number; settings: Required<ContainerSettings>; isKnown: (dependencyId: DependencyId) => boolean; injectDependenciesTo: (dependency: any) => void; register: (dependency: any, dependencyId: DependencyId) => any; resolve: <T>(dependencyId: DependencyId | DependencyClass<any>) => T & ContainerizedDependency; createChildContainer: () => IProxyDiContainer; children: IProxyDiContainer[]; getChild(id: number): IProxyDiContainer; remove: (dependencyId: DependencyId | ContainerizedDependency) => void; bakeInjections(): void; destroy: () => void; }; export declare const INJECTIONS: unique symbol; /** * This symbol constant defines a property name. * This property is present in each dependency instance that was registered in ProxyDiContainer. * The property stores the dependency identifier that should be used to resolve dependency from the container where it was registered. */ export declare const DEPENDENCY_ID: unique symbol; /** * This symbol constant defines a property name. * This property is present in each dependency instance that was registered in ProxyDiContainer. * The property stores a reference to the ProxyDiContainer in which the dependency was registered. */ export declare const PROXYDI_CONTAINER: unique symbol; export declare const ON_CONTAINERIZED: unique symbol; export type OnContainerizedMethod = (container: ProxyDiContainer) => void; export type Injections = Record<string | symbol, Injection>; export type Dependency = { [INJECTIONS]: Injections; }; /** * Respresent dependency instance that was registered in ProxyDi container */ export type ContainerizedDependency = Dependency & { /** * Unique identifier that could use to resolve this instance from container where it was registered */ [DEPENDENCY_ID]: DependencyId; /** * ProxyDi container in which this instance was registered */ [PROXYDI_CONTAINER]: IProxyDiContainer; }; export type ContainerSettings = { allowRegisterAnything?: boolean; allowRewriteDependencies?: boolean; resolveInContainerContext?: boolean; }; export declare const IS_INJECTION_PROXY: unique symbol; export declare const INJECTION_OWNER: unique symbol; export declare const IS_INSTANCE_PROXY: unique symbol; export type InjectionProxy = { [IS_INJECTION_PROXY]: true; [INJECTION_OWNER]: ContainerizedDependency; [PROXYDI_CONTAINER]: IProxyDiContainer; };