udic 1.0.0 → 1.2.0

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.
Files changed (3) hide show
  1. package/index.d.ts +19 -21
  2. package/index.js +1 -1
  3. package/package.json +1 -1
package/index.d.ts CHANGED
@@ -1,51 +1,49 @@
1
1
  declare const _t: unique symbol;
2
2
  declare const _d: unique symbol;
3
- type UnionToIntersection<U> = (U extends any ? (x: U) => void : never) extends (x: infer I) => void ? I : never;
3
+ type MergeUnion<U> = (U extends any ? (x: U) => void : never) extends (x: infer I) => void ? I : never;
4
+ type UnwrapReturn<T> = T extends () => infer R ? R : T;
4
5
  type Prettify<T> = { [K in keyof T] : T[K] } & {};
5
6
  type List<T> = [T, ...T[]];
7
+ export type Dependency = (() => Service) | Compute;
8
+ export type TDependency<T extends Dependency | Impl> = MergeUnion<UnwrapReturn<T>[typeof _d]>;
9
+ export type TResult<T extends Dependency | Impl> = UnwrapReturn<T>[typeof _t];
6
10
  export interface Service<
7
- K extends string,
8
- T
11
+ K extends string = any,
12
+ T = any
9
13
  > {
10
14
  [_t]: T;
11
15
  [_d]: undefined extends T ? { [k in K]? : T } : { [k in K] : T };
12
16
  }
13
17
  export interface Compute<
14
- T,
15
- R
18
+ T = any,
19
+ R = any
16
20
  > {
17
21
  [_t]: R;
18
22
  [_d]: T;
19
23
  (c: T): R;
20
24
  }
21
25
  export interface Impl<
22
- K extends string,
23
- D,
24
- R
26
+ K extends string = any,
27
+ D = any,
28
+ R = any
25
29
  > {
26
30
  [_t]: { [k in K] : R };
27
31
  [_d]: D;
28
32
  }
29
- export type InferResult<T extends {
30
- [_t]: any
31
- }> = T[typeof _t];
32
- export type InferDependency<T extends {
33
- [_d]: any
34
- }> = Prettify<UnionToIntersection<T[typeof _d]>>;
35
33
  /**
36
34
  * Create a service
37
35
  * @param name - The service name
38
36
  */
39
- export declare const service: <const T extends string>(name: T) => (<K>() => Service<T, K> & T);
37
+ export declare const service: <const T extends string>(name: T) => (<K>() => Service<T, K>);
40
38
  /**
41
39
  * Create a compute that relies on other services or computes
42
40
  * @param deps - The service dependencies
43
41
  * @param f
44
42
  */
45
43
  export declare const use: <
46
- const T extends List<Service<any, any> | Compute<any, any>>,
44
+ const T extends List<Dependency>,
47
45
  R
48
- >(deps: T, f: (...args: { [K in keyof T] : InferResult<T[K]> }) => R) => Compute<InferDependency<T[number]>, R>;
46
+ >(deps: T, f: (...args: { [K in keyof T] : TResult<T[K]> }) => R) => Compute<TDependency<T[number]>, R>;
49
47
  /**
50
48
  * Inject dependencies to the compute
51
49
  * @param compute
@@ -65,14 +63,14 @@ export declare const impl: <
65
63
  K extends string,
66
64
  T,
67
65
  D
68
- >(service: Service<K, T>, compute: Compute<D, T>) => Impl<K, D, T>;
66
+ >(service: () => Service<K, T>, compute: Compute<D, T>) => Impl<K, D, T>;
69
67
  /**
70
68
  * Provide dependencies to implementations
71
69
  * @param impls
72
70
  * @param deps
73
71
  */
74
72
  export declare const link: <
75
- const T extends List<Impl<any, any, any>>,
76
- D extends InferDependency<T[number]>
77
- >(impls: T, deps: D) => Prettify<D & InferResult<T[number]>>;
73
+ const T extends List<Impl>,
74
+ D extends TDependency<T[number]>
75
+ >(impls: T, deps: D) => Prettify<D & TResult<T[number]>>;
78
76
  export {};
package/index.js CHANGED
@@ -1 +1 @@
1
- let _t=Symbol();export let service=e=>()=>e;let tag=i=>(i[_t]=Symbol(),i);export let use=(i,o)=>tag(a=>o(...i.map(i=>typeof i===`function`?a[i[_t]]??=i(a):a[i])));export let inject=(e,i)=>tag(a=>e({...a,...i}));export let impl=(e,i)=>[e,i];export let link=(e,i)=>{i={...i};for(let a=0;a<e.length;a++)i[e[a][0]]=e[a][1](i);return i};
1
+ let _t=Symbol();export let service=e=>e;let _=i=>(i[_t]=Symbol(),i);export let use=(i,o)=>_(a=>o(...i.map(i=>typeof i===`function`?a[i[_t]]??=i(a):a[i])));export let inject=(e,i)=>_(a=>e({...a,...i}));export let impl=(e,i)=>[e,i];export let link=(e,i)=>{i={...i};for(let a=0;a<e.length;a++)i[e[a][0]]=e[a][1](i);return i};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "udic",
3
- "version": "1.0.0",
3
+ "version": "1.2.0",
4
4
  "description": "A simple dependency injection library",
5
5
  "keywords": ["di"],
6
6
  "license": "MIT",