udic 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +85 -14
- package/index.d.ts +16 -6
- package/index.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,37 +1,108 @@
|
|
|
1
1
|
A simple dependency injection library.
|
|
2
|
+
|
|
3
|
+
# Examples
|
|
2
4
|
```ts
|
|
3
5
|
import * as di from 'udic';
|
|
6
|
+
```
|
|
7
|
+
|
|
8
|
+
Run code that depends on a service:
|
|
9
|
+
```ts
|
|
10
|
+
// Create a service that generates random number
|
|
11
|
+
const randNumber = di.service('randNumber')<() => number>();
|
|
12
|
+
|
|
13
|
+
// Use the service
|
|
14
|
+
const compute = di.derive(
|
|
15
|
+
[randNumber],
|
|
16
|
+
(getRandNumber) => getRandNumber() + 1
|
|
17
|
+
);
|
|
18
|
+
|
|
19
|
+
// 1
|
|
20
|
+
console.log(
|
|
21
|
+
compute({ randNumber: () => 0 })
|
|
22
|
+
);
|
|
23
|
+
```
|
|
4
24
|
|
|
25
|
+
Nested `derive()`:
|
|
26
|
+
```ts
|
|
5
27
|
// Create a service that generates random number
|
|
6
28
|
const randNumber = di.service('randNumber')<() => number>();
|
|
7
29
|
|
|
8
30
|
// Use the service
|
|
9
|
-
const
|
|
31
|
+
const compute = di.derive(
|
|
10
32
|
[randNumber],
|
|
11
33
|
(getRandNumber) => getRandNumber() + 1
|
|
12
34
|
);
|
|
13
35
|
|
|
36
|
+
// Use `compute()` within current context
|
|
37
|
+
const anotherCompute = di.derive(
|
|
38
|
+
[compute],
|
|
39
|
+
(computedValue) => computedValue * 2
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
// 2
|
|
43
|
+
console.log(
|
|
44
|
+
anotherCompute({ randNumber: () => 0 })
|
|
45
|
+
);
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Multiple dependencies:
|
|
49
|
+
```ts
|
|
50
|
+
// Create a service that generates random number
|
|
51
|
+
const randNumber = di.service('randNumber')<() => number>();
|
|
52
|
+
|
|
53
|
+
// Use the service
|
|
54
|
+
const computeNumber = di.derive(
|
|
55
|
+
[randNumber],
|
|
56
|
+
(getRandNumber) => getRandNumber() + 1,
|
|
57
|
+
);
|
|
58
|
+
|
|
14
59
|
// Create a service that generates random string
|
|
15
60
|
const randString = di.service('randString')<() => string>();
|
|
16
61
|
|
|
17
62
|
// Use the computed value of `computed`
|
|
18
|
-
const
|
|
19
|
-
[randString,
|
|
20
|
-
(getRandString,
|
|
63
|
+
const computeString = di.derive(
|
|
64
|
+
[randString, computeNumber],
|
|
65
|
+
(getRandString, number) => getRandString() + ': ' + number,
|
|
21
66
|
);
|
|
22
67
|
|
|
68
|
+
// 'reve: 1'
|
|
23
69
|
console.log(
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
randString: () => crypto.randomUUID(),
|
|
70
|
+
computeString({
|
|
71
|
+
randNumber: () => 0,
|
|
72
|
+
randString: () => 'reve',
|
|
28
73
|
}),
|
|
29
|
-
);
|
|
74
|
+
);
|
|
75
|
+
```
|
|
30
76
|
|
|
77
|
+
Inject not all dependencies:
|
|
78
|
+
```ts
|
|
79
|
+
// Create a service that generates random number
|
|
80
|
+
const randNumber = di.service('randNumber')<() => number>();
|
|
81
|
+
|
|
82
|
+
// Use the service
|
|
83
|
+
const computeNumber = di.derive(
|
|
84
|
+
[randNumber],
|
|
85
|
+
(getRandNumber) => getRandNumber() + 1,
|
|
86
|
+
);
|
|
87
|
+
|
|
88
|
+
// Create a service that generates random string
|
|
89
|
+
const randString = di.service('randString')<() => string>();
|
|
90
|
+
|
|
91
|
+
// Use the computed value of `computed`
|
|
92
|
+
const computeString = di.derive(
|
|
93
|
+
[randString, computeNumber],
|
|
94
|
+
(getRandString, number) => getRandString() + ': ' + number,
|
|
95
|
+
);
|
|
96
|
+
|
|
97
|
+
// Inject the randNumber service
|
|
98
|
+
const computeString1 = di.inject(computeString, {
|
|
99
|
+
randNumber: () => 0
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
// 'reve: 1'
|
|
31
103
|
console.log(
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
); // Output: 'reve: 1'
|
|
104
|
+
computeString1({
|
|
105
|
+
randString: () => 'reve',
|
|
106
|
+
}),
|
|
107
|
+
);
|
|
37
108
|
```
|
package/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
declare const _: unique symbol;
|
|
2
|
+
type _ = typeof _;
|
|
2
3
|
type UnionToIntersection<U> = (U extends any ? (x: U) => void : never) extends (x: infer I) => void ? I : never;
|
|
3
4
|
export interface Service<
|
|
4
5
|
T extends string | symbol,
|
|
@@ -8,18 +9,18 @@ export interface Service<
|
|
|
8
9
|
[_]: undefined extends K ? { [k in T]? : K } : { [k in T] : K };
|
|
9
10
|
}
|
|
10
11
|
export interface Compute<
|
|
11
|
-
T
|
|
12
|
+
T,
|
|
12
13
|
R
|
|
13
14
|
> {
|
|
14
|
-
(
|
|
15
|
+
(c: T): R;
|
|
15
16
|
0: R;
|
|
16
|
-
[_]:
|
|
17
|
+
[_]: T;
|
|
17
18
|
}
|
|
18
19
|
export type AnyService = Service<string | symbol, any>;
|
|
19
|
-
export type AnyCompute = Compute<any
|
|
20
|
+
export type AnyCompute = Compute<any, any>;
|
|
20
21
|
export type Dependency = AnyService | AnyCompute;
|
|
21
22
|
export type InferDependencies<T extends Dependency[]> = { [K in keyof T] : T[K][0] };
|
|
22
|
-
export type InferRecord<T extends Dependency[]> = UnionToIntersection<T[number][
|
|
23
|
+
export type InferRecord<T extends Dependency[]> = UnionToIntersection<T[number][_]>;
|
|
23
24
|
/**
|
|
24
25
|
* Create a service
|
|
25
26
|
* @param name - The service name
|
|
@@ -33,5 +34,14 @@ export declare const service: <T extends string | symbol>(name: T) => (<K>() =>
|
|
|
33
34
|
export declare const derive: <
|
|
34
35
|
const T extends Dependency[],
|
|
35
36
|
const R
|
|
36
|
-
>(deps: T, f: (...args: InferDependencies<T>) => R) => Compute<T
|
|
37
|
+
>(deps: T, f: (...args: InferDependencies<T>) => R) => Compute<InferRecord<T>, R>;
|
|
38
|
+
/**
|
|
39
|
+
* Inject some dependencies to the compute
|
|
40
|
+
* @param compute
|
|
41
|
+
* @param deps - Dependencies to inject
|
|
42
|
+
*/
|
|
43
|
+
export declare const inject: <
|
|
44
|
+
T extends AnyCompute,
|
|
45
|
+
D extends Partial<T[_]>
|
|
46
|
+
>(compute: T, d: D) => Compute<Omit<T[_], keyof D>, T[0]>;
|
|
37
47
|
export {};
|
package/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export let service=e=>()=>e;export let derive=(e,t)=>n=>t(...e.map(e=>typeof e===`function`?n[e]??=e(n):n[e]));
|
|
1
|
+
export let service=e=>()=>e;export let derive=(e,t)=>n=>t(...e.map(e=>typeof e===`function`?n[e]??=e(n):n[e]));export let inject=(e,t)=>n=>e(Object.assign(n,t));
|