import { throwError } from './errors.js'; type Constructor = new () => T; const registered = new Map(); const circular: Object[] = []; export const di = (Key: Constructor): T => { if (circular.includes(Key)) { circular.push(Key); throwError( `Circular dependency: ${circular .map((Key) => `${(Key as any).name}`) .join(' -> ')}` ); } circular.push(Key); const value = registered.get(Key) || registered.set(Key, new Key()).get(Key); circular.pop(); return value as T; }; export const diOverride = (Key: Constructor, value: T) => { registered.set(Key, value); }