22
33export type ContainerKey = string | symbol
44
5- /**
6- * Represents a dependency factory: a function that, given an IoC container, it
7- * is able to instantiate a specific dependency.
8- */
5+ type ExtractPrefix < S extends ContainerKey > =
6+ S extends `${infer Prefix } :${string } ` ? Prefix : never
7+
8+ type ExtractPrefixedValues <
9+ Prefix extends string ,
10+ Struct extends Record < ContainerKey , unknown > ,
11+ BaseKeys extends keyof Struct = keyof Struct ,
12+ > = BaseKeys extends `${Prefix } :${infer U } ` ? Struct [ `${Prefix } :${U } `] : never
913
1014export interface SyncDependencyFactory <
1115 T ,
@@ -21,12 +25,13 @@ export interface AsyncDependencyFactory<
2125 Record < ContainerKey , unknown >
2226 > ,
2327> {
24- // It might seem counterintuitive that we allow T as return type, but the
25- // factory might also "become async" because of its dependencies, not just
26- // because of its return type.
2728 ( container : TContainer ) : Promise < T >
2829}
2930
31+ /**
32+ * Represents a dependency factory: a function that, given an IoC container, it
33+ * is able to instantiate a specific dependency.
34+ */
3035export interface DependencyFactory <
3136 T ,
3237 TContainer extends ReadableContainer <
@@ -63,6 +68,33 @@ export interface ReadableContainer<
6368 ) : Promise < TAsyncDependencies [ TName ] >
6469}
6570
71+ export interface RedableGroupContainer <
72+ TSyncDependencies extends Record < ContainerKey , unknown > ,
73+ TAsyncDependencies extends Record < ContainerKey , unknown > ,
74+ > {
75+ resolveGroup <
76+ GroupName extends keyof TSyncDependencies extends ContainerKey
77+ ? ExtractPrefix < keyof TSyncDependencies >
78+ : never ,
79+ > (
80+ groupName : GroupName ,
81+ ) : keyof TSyncDependencies extends ContainerKey
82+ ? ExtractPrefixedValues < GroupName , TSyncDependencies > [ ]
83+ : never
84+
85+ resolveGroupAsync <
86+ GroupName extends keyof TAsyncDependencies extends ContainerKey
87+ ? ExtractPrefix < keyof TAsyncDependencies >
88+ : never ,
89+ > (
90+ groupName : GroupName ,
91+ ) : Promise <
92+ keyof TAsyncDependencies extends ContainerKey
93+ ? ExtractPrefixedValues < GroupName , TAsyncDependencies > [ ]
94+ : never
95+ >
96+ }
97+
6698/**
6799 * Represents a write-only version of a type-safe IoC container with
68100 * "auto-wired" dependencies resolution.
@@ -173,6 +205,7 @@ export interface Container<
173205 TSyncDependencies extends Record < ContainerKey , unknown > ,
174206 TAsyncDependencies extends Record < ContainerKey , unknown > ,
175207> extends ReadableContainer < TSyncDependencies , TAsyncDependencies > ,
208+ RedableGroupContainer < TSyncDependencies , TAsyncDependencies > ,
176209 WritableContainer < TSyncDependencies , TAsyncDependencies > { }
177210
178211/**
@@ -365,5 +398,45 @@ function __createContainer<
365398 ] as AsyncDependencyFactory < TAsyncDependencies [ TName ] , typeof this >
366399 ) ( this )
367400 } ,
401+
402+ resolveGroup < GroupName extends string > (
403+ groupName : GroupName ,
404+ ) : keyof TSyncDependencies extends ContainerKey
405+ ? ExtractPrefixedValues < GroupName , TSyncDependencies > [ ]
406+ : never {
407+ return (
408+ Object . entries ( syncDependencies )
409+ . filter ( ( [ key ] ) => {
410+ return key . startsWith ( `${ groupName } :` )
411+ } )
412+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
413+ . map ( ( [ _key , value ] ) => {
414+ return value ( this )
415+ } ) as keyof TSyncDependencies extends ContainerKey
416+ ? ExtractPrefixedValues < GroupName , TSyncDependencies > [ ]
417+ : never
418+ )
419+ } ,
420+
421+ async resolveGroupAsync < GroupName extends string > (
422+ groupName : GroupName ,
423+ ) : Promise <
424+ keyof TAsyncDependencies extends ContainerKey
425+ ? ExtractPrefixedValues < GroupName , TAsyncDependencies > [ ]
426+ : never
427+ > {
428+ return ( await Promise . all (
429+ Object . entries ( asyncDependencies )
430+ . filter ( ( [ key ] ) => {
431+ return key . startsWith ( `${ groupName } :` )
432+ } )
433+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
434+ . map ( ( [ _key , value ] ) => {
435+ return value ( this )
436+ } ) ,
437+ ) ) as keyof TAsyncDependencies extends ContainerKey
438+ ? ExtractPrefixedValues < GroupName , TAsyncDependencies > [ ]
439+ : never
440+ } ,
368441 }
369442}
0 commit comments