@@ -17,6 +17,7 @@ import {
1717} from "./registry.js" ;
1818import { ensureSync } from "./utils/async.js" ;
1919import { iocKind , KindMap } from "./utils/kind.js" ;
20+ import { isPlainObject } from "./utils/object.js" ;
2021import { capitalize } from "./utils/string.js" ;
2122import type { AbstractConstructor , Constructor } from "./utils/ts.js" ;
2223import { is } from "@dreamkit/kind" ;
@@ -323,7 +324,7 @@ export class IocContext {
323324 if ( ! onResolveIocObject || onResolveIocObject ( input ) ) {
324325 return {
325326 paramOptions : { context, parent : input } ,
326- params : normalizeIocParams ( iocObject . $ioc . params ) ,
327+ params : iocObject . $ioc . params ,
327328 create,
328329 } ;
329330 }
@@ -340,22 +341,45 @@ export class IocContext {
340341 ? this . resolveAsync ( input , options )
341342 : this . resolve ( input , options ) ;
342343 }
343- resolveParams < T extends IocParamsUserConfig > ( input : T ) : IocParams < T > {
344- const config = normalizeIocParams ( input ) ;
344+ resolveParams < T extends IocParamsUserConfig > (
345+ input : T ,
346+ options : {
347+ parent ?: unknown ;
348+ context ?: IocContext ;
349+ } = { } ,
350+ ) : IocParams < T > {
351+ const config = normalizeIocParams ( input , false ) ;
345352 const params : Record < string , any > = { } ;
346353 for ( const name in config ) {
347- params [ name ] = ensureSync ( this . createParam ( config [ name ] ) ) ;
354+ const value = config [ name ] ;
355+ if ( isPlainObject ( value ) ) {
356+ params [ name ] = this . resolveParams ( value , options ) ;
357+ } else {
358+ params [ name ] = ensureSync ( this . createParam ( value , options ) ) ;
359+ }
348360 }
349361 return params as any ;
350362 }
351363
352364 async resolveAsyncParams < T extends IocParamsUserConfig > (
353365 input : T ,
366+ options : {
367+ parent ?: unknown ;
368+ context ?: IocContext ;
369+ } = { } ,
354370 ) : Promise < IocParams < T > > {
355- const config = normalizeIocParams ( input ) ;
371+ const config = normalizeIocParams ( input , false ) ;
356372 const params : Record < string , any > = { } ;
357373 for ( const name in config ) {
358- params [ name ] = await this . createParam ( config [ name ] ) ;
374+ const value = config [ name ] ;
375+ if ( isPlainObject ( value ) ) {
376+ params [ name ] = await this . resolveAsyncParams ( value , options ) ;
377+ } else {
378+ params [ name ] = await this . createParam ( value , {
379+ ...options ,
380+ async : true ,
381+ } ) ;
382+ }
359383 }
360384 return params as any ;
361385 }
@@ -400,12 +424,7 @@ export class IocContext {
400424 const object = this . tryParseIocObject ( input , options ) ;
401425
402426 if ( object ) {
403- const params : Record < string , any > = { } ;
404- for ( const name in object . params ) {
405- params [ name ] = ensureSync (
406- this . createParam ( object . params [ name ] , object . paramOptions ) ,
407- ) ;
408- }
427+ const params = this . resolveParams ( object . params , object . paramOptions ) ;
409428 return object . create ( params ) ;
410429 }
411430 }
@@ -451,13 +470,10 @@ export class IocContext {
451470 const object = this . tryParseIocObject ( input , options ) ;
452471
453472 if ( object ) {
454- const params : Record < string , any > = { } ;
455- for ( const name in object . params ) {
456- params [ name ] = await this . createParam ( object . params [ name ] , {
457- ...object . paramOptions ,
458- async : true ,
459- } ) ;
460- }
473+ const params = await this . resolveAsyncParams (
474+ object . params ,
475+ object . paramOptions ,
476+ ) ;
461477 return object . create ( params ) ;
462478 }
463479 }
0 commit comments