1 | import { Exception } from './logger';
|
2 |
|
3 | const map = new WeakMap<object, object>();
|
4 | export 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 |
|
19 | export function mock<T extends object>(replace: T, to: T & {}) {
|
20 | map.set(replace, to);
|
21 | }
|
22 |
|
23 | const serviceMap = new WeakMap<object, unknown>();
|
24 | export 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 | }
|
31 | export function setService<T>(Class: new (...args: never[]) => T, instance: T) {
|
32 | serviceMap.set(Class, instance);
|
33 | }
|