1
1
import {
2
2
ContainerKey ,
3
- DependencyFactory ,
4
3
ReadableContainer ,
4
+ SyncDependencyFactory ,
5
5
} from './container.ts' ;
6
6
import { ParamsToResolverKeys , TupleO , Zip } from './util.ts' ;
7
7
@@ -13,13 +13,15 @@ export function singleton<
13
13
TVal ,
14
14
TDependencies extends Record < ContainerKey , unknown > ,
15
15
> (
16
- factory : DependencyFactory < TVal , ReadableContainer < TDependencies > > ,
17
- ) : DependencyFactory < TVal , ReadableContainer < TDependencies > > {
18
- let result : TVal | undefined
16
+ // eslint-disable-next-line @typescript-eslint/ban-types
17
+ factory : SyncDependencyFactory < TVal , ReadableContainer < TDependencies , { } > > ,
18
+ // eslint-disable-next-line @typescript-eslint/ban-types
19
+ ) : SyncDependencyFactory < TVal , ReadableContainer < TDependencies , { } > > {
20
+ let result : Awaited < TVal > | undefined
19
21
20
- return async ( container ) => {
22
+ return ( container ) => {
21
23
if ( ! result ) {
22
- result = await factory ( container )
24
+ result = factory ( container )
23
25
}
24
26
return result
25
27
}
@@ -37,17 +39,19 @@ export function func<
37
39
> (
38
40
fn : ( ...args : TParams ) => Awaited < TReturn > ,
39
41
...args : TDependencies
40
- ) : DependencyFactory < ( ) => TReturn , FuncContainer < TParams , TDependencies > > {
41
- return async ( container : FuncContainer < TParams , TDependencies > ) => {
42
- const argPromises = args . map ( ( arg ) =>
42
+ ) : SyncDependencyFactory <
43
+ ( ) => TReturn ,
44
+ SyncFuncContainer < TParams , TDependencies >
45
+ > {
46
+ return ( container : SyncFuncContainer < TParams , TDependencies > ) => {
47
+ const resolvedArgs = args . map ( ( arg ) =>
43
48
container . resolve (
44
49
// This is ugly as hell, but I did not want to apply ts-ignore
45
- arg as Parameters < FuncContainer < TParams , TDependencies > [ 'resolve' ] > [ 0 ] ,
50
+ arg as Parameters <
51
+ SyncFuncContainer < TParams , TDependencies > [ 'resolve' ]
52
+ > [ 0 ] ,
46
53
) ,
47
- )
48
- const resolvedArgs = ( await Promise . all (
49
- argPromises as Promise < unknown > [ ] ,
50
- ) ) as unknown as TParams
54
+ ) as unknown as TParams
51
55
52
56
return ( ) => fn ( ...resolvedArgs )
53
57
}
@@ -62,19 +66,18 @@ export function constructor<
62
66
TClass ,
63
67
TDependencies extends ParamsToResolverKeys < TParams > ,
64
68
> (
65
- constructor : new ( ...args : TParams ) => TClass ,
69
+ constructor : new ( ...args : TParams ) => Awaited < TClass > ,
66
70
...args : TDependencies
67
- ) : DependencyFactory < TClass , FuncContainer < TParams , TDependencies > > {
68
- return async ( container : FuncContainer < TParams , TDependencies > ) => {
69
- const argPromises = args . map ( ( arg ) =>
71
+ ) : SyncDependencyFactory < TClass , SyncFuncContainer < TParams , TDependencies > > {
72
+ return ( container : SyncFuncContainer < TParams , TDependencies > ) => {
73
+ const resolvedArgs = args . map ( ( arg ) =>
70
74
container . resolve (
71
75
// This is ugly as hell, but I did not want to apply ts-ignore
72
- arg as Parameters < FuncContainer < TParams , TDependencies > [ 'resolve' ] > [ 0 ] ,
76
+ arg as Parameters <
77
+ SyncFuncContainer < TParams , TDependencies > [ 'resolve' ]
78
+ > [ 0 ] ,
73
79
) ,
74
- )
75
- const resolvedArgs = ( await Promise . all (
76
- argPromises as Promise < unknown > [ ] ,
77
- ) ) as unknown as TParams
80
+ ) as unknown as TParams
78
81
79
82
return new constructor ( ...resolvedArgs )
80
83
}
@@ -83,10 +86,14 @@ export function constructor<
83
86
// -----------------------------------------------------------------------------
84
87
// Private Types
85
88
// -----------------------------------------------------------------------------
86
- type FuncContainer <
89
+ type SyncFuncContainer <
87
90
TParams extends readonly unknown [ ] ,
88
- TDependencies extends ParamsToResolverKeys < TParams > ,
91
+ TSyncDependencies extends ParamsToResolverKeys < TParams > ,
89
92
> = ReadableContainer <
90
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
91
- TupleO < Extract < Zip < TDependencies , TParams > , readonly [ ContainerKey , any ] [ ] > >
93
+ TupleO <
94
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
95
+ Extract < Zip < TSyncDependencies , TParams > , readonly [ ContainerKey , any ] [ ] >
96
+ > ,
97
+ // eslint-disable-next-line @typescript-eslint/ban-types
98
+ { }
92
99
>
0 commit comments