import { isPrimitive, primitive } from "../safe"; import { ActivationContext } from "./ActivationContext"; import { Constructor, Factory } from "../interfaces"; export interface Descriptor { activate(context: ActivationContext): T; } export function isDescriptor(x: any): x is Descriptor { return (!isPrimitive(x)) && (x.activate instanceof Function); } export type ServiceMap = { [k in keyof S2]: Descriptor; }; export type PartialServiceMap = Partial>; export enum ActivationType { Singleton = 1, Container, Hierarchy, Context, Call } export interface RegistrationWithServices { services?: ServiceMap; } export interface ServiceRegistration extends RegistrationWithServices { activation?: "singleton" | "container" | "hierarchy" | "context" | "call"; params?: P; inject?: object | object[]; cleanup?: ((instance: T) => void) | string; } export interface TypeRegistration extends ServiceRegistration { $type: string | Constructor; } export interface FactoryRegistration extends ServiceRegistration { $factory: string | Factory; } export interface ValueRegistration { $value: T; parse?: boolean; } export interface DependencyRegistration extends RegistrationWithServices { $dependency: K; lazy?: boolean; optional?: boolean; default?: S[K]; } export type Parse = T extends primitive ? T: T extends Descriptor ? V : { [K in keyof T]: Parse }; export interface Resolver { resolve, T extends ContainerServices[K] = ContainerServices[K]>(name: K, def?: T): T; } export type ContainerServices = S & { container: Resolver; }; export function isTypeRegistration(x: any): x is TypeRegistration { return (!isPrimitive(x)) && ("$type" in x); } export function isFactoryRegistration(x: any): x is FactoryRegistration { return (!isPrimitive(x)) && ("$factory" in x); } export function isValueRegistration(x: any): x is ValueRegistration { return (!isPrimitive(x)) && ("$value" in x); } export function isDependencyRegistration(x: any): x is DependencyRegistration { return (!isPrimitive(x)) && ("$dependency" in x); }