@@ -85,18 +85,39 @@ export interface ModulesRecord<
85
85
[ name : string ] : ModuleType ;
86
86
}
87
87
88
- // config record derived from the provided modules and their config types
89
- export type ModulesConfig < Modules extends ModulesRecord > = {
90
- // this will translate into = key: module name, value: module.config
91
- [ ConfigKey in StringKeyOf < Modules > ] : InstanceType <
92
- Modules [ ConfigKey ]
93
- > extends Configurable < infer Config >
88
+ type ExtractConfig < Module extends BaseModuleType > =
89
+ InstanceType < Module > extends Configurable < infer Config >
94
90
? Config extends NoConfig
95
91
? Config | undefined
96
92
: Config
97
93
: never ;
94
+
95
+ type OnlyDefined < R extends Record < string , unknown > > = {
96
+ [ Key in keyof R as NoConfig extends R [ Key ] ? never : Key ] : R [ Key ] ;
97
+ } ;
98
+ type OptionalUndefined < R extends Record < string , unknown > > = {
99
+ [ Key in keyof R as NoConfig extends R [ Key ] ? Key : never ] ?: R [ Key ] ;
100
+ } ;
101
+
102
+ type MakeNoConfigOptional < A extends Record < string , unknown > > = OnlyDefined < A > &
103
+ OptionalUndefined < A > ;
104
+
105
+ export type CompletedModulesConfig < Modules extends ModulesRecord > = {
106
+ // this will translate into = key: module name, value: module.config
107
+ [ ConfigKey in StringKeyOf < Modules > ] : ExtractConfig < Modules [ ConfigKey ] > ;
98
108
} ;
99
109
110
+ // config record derived from the provided modules and their config types
111
+ export type ModulesConfig < Modules extends ModulesRecord > = MakeNoConfigOptional <
112
+ CompletedModulesConfig < Modules >
113
+ > ;
114
+
115
+ // export type MakeNeeded<R extends { }>
116
+
117
+ // export type ShortConfig<Modules extends ModulesRecord> =
118
+ // ModulesConfig<Modules>
119
+ // >;
120
+
100
121
/**
101
122
* This type make any config partial (i.e. optional) up to the first level
102
123
* So { Module: { a: { b: string } } }
@@ -289,6 +310,26 @@ export class ModuleContainer<
289
310
} ) ;
290
311
}
291
312
313
+ private completeConfig (
314
+ config : ModulesConfig < Modules >
315
+ ) : ModulesConfig < Modules > {
316
+ const keys = Object . keys ( config ) ;
317
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
318
+ const moduleNames = this . moduleNames as StringKeyOf < Modules > [ ] ;
319
+ const noConfigParts = moduleNames
320
+ . filter ( ( moduleName ) => ! keys . includes ( moduleName ) )
321
+ . reduce < Record < string , NoConfig > > ( ( obj , moduleName ) => {
322
+ obj [ moduleName ] = { } ;
323
+ return obj ;
324
+ } , { } ) ;
325
+
326
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
327
+ return {
328
+ ...config ,
329
+ ...noConfigParts ,
330
+ } as unknown as ModulesConfig < Modules > ;
331
+ }
332
+
292
333
/**
293
334
* Provide additional configuration after the ModuleContainer was created.
294
335
*
@@ -298,7 +339,7 @@ export class ModuleContainer<
298
339
* @param config
299
340
*/
300
341
public configure ( config : ModulesConfig < Modules > ) {
301
- this . config = config ;
342
+ this . config = this . completeConfig ( config ) ;
302
343
}
303
344
304
345
public configurePartial ( config : RecursivePartial < ModulesConfig < Modules > > ) {
@@ -316,8 +357,14 @@ export class ModuleContainer<
316
357
super . config = merge <
317
358
ModulesConfig < Modules > | NoConfig ,
318
359
ModulesConfig < Modules >
319
- > ( this . currentConfig ?? { } , config ) ;
360
+ > ( this . currentConfig ?? { } , this . completeConfig ( config ) ) ;
320
361
}
362
+ // public set config(config: ShortConfig<Modules>) {
363
+ // super.config = merge<ShortConfig<Modules> | NoConfig, ShortConfig<Modules>>(
364
+ // this.currentConfig ?? {},
365
+ // config
366
+ // );
367
+ // }
321
368
322
369
/**
323
370
* Resolves a module from the current module container
@@ -359,7 +406,11 @@ export class ModuleContainer<
359
406
moduleName : StringKeyOf < Modules > ,
360
407
containedModule : InstanceType < Modules [ StringKeyOf < Modules > ] >
361
408
) {
362
- const config = super . config ?. [ moduleName ] ;
409
+ const config =
410
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
411
+ ( super . config as unknown as CompletedModulesConfig < Modules > ) ?. [
412
+ moduleName
413
+ ] ;
363
414
// eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
364
415
if ( ! config ) {
365
416
throw errors . configNotSetInContainer ( moduleName . toString ( ) ) ;
0 commit comments