@@ -15,6 +15,8 @@ import { NestContainer } from './injector/container';
1515import { ContainerScanner } from './injector/container-scanner' ;
1616import { Module } from './injector/module' ;
1717import { ModuleTokenFactory } from './injector/module-token-factory' ;
18+ import { callModuleInitHook } from './hooks/on-module-init.hook' ;
19+ import { callModuleBootstrapHook } from 'hooks/on-app-bootstrap.hook' ;
1820
1921export class NestApplicationContext implements INestApplicationContext {
2022 private readonly moduleTokenFactory = new ModuleTokenFactory ( ) ;
@@ -76,44 +78,10 @@ export class NestApplicationContext implements INestApplicationContext {
7678 protected async callInitHook ( ) : Promise < any > {
7779 const modulesContainer = this . container . getModules ( ) ;
7880 for ( const module of [ ...modulesContainer . values ( ) ] . reverse ( ) ) {
79- await this . callModuleInitHook ( module ) ;
81+ await callModuleInitHook ( module ) ;
8082 }
8183 }
8284
83- protected async callModuleInitHook ( module : Module ) : Promise < any > {
84- const providers = [ ...module . providers ] ;
85- // Module (class) instance is the first element of the providers array
86- // Lifecycle hook has to be called once all classes are properly initialized
87- const [ _ , { instance : moduleClassInstance } ] = providers . shift ( ) ;
88- const instances = [ ...module . controllers , ...providers ] ;
89- const callOperator = ( list : any ) =>
90- list
91- . filter ( instance => ! isNil ( instance ) )
92- . filter ( this . hasOnModuleInitHook )
93- . map ( async instance => ( instance as OnModuleInit ) . onModuleInit ( ) ) ;
94-
95- await Promise . all (
96- callOperator (
97- iterate ( instances )
98- . filter (
99- ( [ key , wrapper ] ) =>
100- wrapper . isDependencyTreeStatic ( ) && ! wrapper . isTransient ,
101- )
102- . map ( ( [ key , { instance } ] ) => instance ) ,
103- ) ,
104- ) ;
105- const transientInstances = this . getTransientInstances ( instances ) ;
106- await Promise . all ( callOperator ( iterate ( transientInstances ) ) ) ;
107-
108- if ( moduleClassInstance && this . hasOnModuleInitHook ( moduleClassInstance ) ) {
109- await ( moduleClassInstance as OnModuleInit ) . onModuleInit ( ) ;
110- }
111- }
112-
113- protected hasOnModuleInitHook ( instance : any ) : instance is OnModuleInit {
114- return ! isUndefined ( ( instance as OnModuleInit ) . onModuleInit ) ;
115- }
116-
11785 protected async callDestroyHook ( ) : Promise < any > {
11886 const modulesContainer = this . container . getModules ( ) ;
11987 for ( const module of modulesContainer . values ( ) ) {
@@ -161,49 +129,10 @@ export class NestApplicationContext implements INestApplicationContext {
161129 protected async callBootstrapHook ( ) : Promise < any > {
162130 const modulesContainer = this . container . getModules ( ) ;
163131 for ( const module of [ ...modulesContainer . values ( ) ] . reverse ( ) ) {
164- await this . callModuleBootstrapHook ( module ) ;
132+ await callModuleBootstrapHook ( module ) ;
165133 }
166134 }
167135
168- protected async callModuleBootstrapHook ( module : Module ) : Promise < any > {
169- const providers = [ ...module . providers ] ;
170- const [ _ , { instance : moduleClassInstance } ] = providers . shift ( ) ;
171- const instances = [ ...module . controllers , ...providers ] ;
172-
173- const callOperator = ( list : any ) =>
174- list
175- . filter ( instance => ! isNil ( instance ) )
176- . filter ( this . hasOnAppBotstrapHook )
177- . map ( async instance =>
178- ( instance as OnApplicationBootstrap ) . onApplicationBootstrap ( ) ,
179- ) ;
180-
181- await Promise . all (
182- callOperator (
183- iterate ( instances )
184- . filter (
185- ( [ key , wrapper ] ) =>
186- wrapper . isDependencyTreeStatic ( ) && ! wrapper . isTransient ,
187- )
188- . map ( ( [ key , { instance } ] ) => instance ) ,
189- ) ,
190- ) ;
191- const transientInstances = this . getTransientInstances ( instances ) ;
192- await Promise . all ( callOperator ( iterate ( transientInstances ) ) ) ;
193-
194- if ( moduleClassInstance && this . hasOnAppBotstrapHook ( moduleClassInstance ) ) {
195- await ( moduleClassInstance as OnApplicationBootstrap ) . onApplicationBootstrap ( ) ;
196- }
197- }
198-
199- protected hasOnAppBotstrapHook (
200- instance : any ,
201- ) : instance is OnApplicationBootstrap {
202- return ! isUndefined (
203- ( instance as OnApplicationBootstrap ) . onApplicationBootstrap ,
204- ) ;
205- }
206-
207136 protected find < TInput = any , TResult = TInput > (
208137 typeOrToken : Type < TInput > | string | symbol ,
209138 ) : TResult {
@@ -219,16 +148,4 @@ export class NestApplicationContext implements INestApplicationContext {
219148 TResult
220149 > ( metatypeOrToken , contextModule ) ;
221150 }
222-
223- private getTransientInstances (
224- instances : [ string , InstanceWrapper ] [ ] ,
225- ) : InstanceWrapper [ ] {
226- return iterate ( instances )
227- . filter ( ( [ key , wrapper ] ) => wrapper . isDependencyTreeStatic ( ) )
228- . map ( ( [ key , wrapper ] ) => wrapper . getStaticTransientInstances ( ) )
229- . flatten ( )
230- . filter ( item => ! ! item )
231- . map ( ( { instance } : any ) => instance )
232- . toArray ( ) as InstanceWrapper [ ] ;
233- }
234151}
0 commit comments