import { Exception } from './logger'; const map = new WeakMap(); export function injectable(target: T) { return new Proxy(target, { get(_, key: never) { const instance = map.get(target); const obj = instance === undefined ? target : instance; return obj[key]; }, construct(_, args: unknown[]) { const instance = map.get(target); const obj = instance === undefined ? target : instance; return new (obj as new (...args: unknown[]) => object)(...args); }, }); } export function mock(replace: T, to: T & {}) { map.set(replace, to); } const serviceMap = new WeakMap(); export function service(Class: new (...args: never[]) => T): T { const instance = serviceMap.get(Class); if (instance === undefined) { throw new Exception(`Instance is not setted`, { name: Class.name }); } return instance as T; } export function setService(Class: new (...args: never[]) => T, instance: T) { serviceMap.set(Class, instance); }