-
-
Notifications
You must be signed in to change notification settings - Fork 286
/
useOpts.ts
64 lines (60 loc) · 1.76 KB
/
useOpts.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import {DecoratorTypes, getDecoratorType, Store, UnsupportedDecoratorType} from "@tsed/core";
import {DI_PARAM_OPTIONS, INJECTABLE_PROP} from "../constants";
/**
* Add options to invoke the Service.
*
* ```typescript
* import {Injectable, Opts, UseOpts} from "@tsed/di";
*
* @Injectable()
* class MyConfigurableService {
* source: string;
* constructor(@Opts options: any = {}) {
* console.log("Hello ", options.source); // log: Hello Service1 then Hello Service2
*
* this.source = options.source;
* }
* }
*
* @Injectable()
* class MyService1 {
* constructor(@UseOpts({source: 'Service1'}) service: MyConfigurableService) {
* console.log(service.source) // log: Service1
* }
* }
*
* @Injectable()
* class MyService2 {
* constructor(@UseOpts({source: 'Service2'}) service: MyConfigurableService) {
* console.log(service.source) // log: Service2
* }
* }
* ```
*
* ::: warning
* Using @@Opts@@ decorator on a constructor parameter change the Scope of the provider to `ProviderScope.INSTANCE`.
* :::
*
* @returns {Function}
* @decorator
* @param options
*/
export function UseOpts(options: {[key: string]: any}): Function {
return (target: Object, propertyKey: string | symbol, index?: number): any => {
const bindingType = getDecoratorType([target, propertyKey, index], true);
switch (bindingType) {
case DecoratorTypes.PARAM_CTOR:
Store.from(target).merge(`${DI_PARAM_OPTIONS}:${index}`, options);
break;
case DecoratorTypes.PROP:
Store.from(target).merge(INJECTABLE_PROP, {
[propertyKey as string]: {
options
}
});
break;
default:
throw new UnsupportedDecoratorType(UseOpts, [target, propertyKey, index]);
}
};
}