UNPKG

1.02 kBPlain TextView Raw
1import { Exception } from './logger';
2
3const map = new WeakMap<object, object>();
4export function injectable<T extends object>(target: T) {
5 return new Proxy(target, {
6 get(_, key: never) {
7 const instance = map.get(target);
8 const obj = instance === undefined ? target : instance;
9 return obj[key];
10 },
11 construct(_, args: unknown[]) {
12 const instance = map.get(target);
13 const obj = instance === undefined ? target : instance;
14 return new (obj as new (...args: unknown[]) => object)(...args);
15 },
16 });
17}
18
19export function mock<T extends object>(replace: T, to: T & {}) {
20 map.set(replace, to);
21}
22
23const serviceMap = new WeakMap<object, unknown>();
24export function service<T>(Class: new (...args: never[]) => T): T {
25 const instance = serviceMap.get(Class);
26 if (instance === undefined) {
27 throw new Exception(`Instance is not setted`, { name: Class.name });
28 }
29 return instance as T;
30}
31export function setService<T>(Class: new (...args: never[]) => T, instance: T) {
32 serviceMap.set(Class, instance);
33}