@@ -44,23 +44,25 @@ class Codecept {
4444 this . config = Config . create ( config )
4545 this . opts = opts
4646 this . testFiles = new Array ( 0 )
47- this . requireModules ( config . require )
47+ this . requiringModules = config . require
4848 }
4949
5050 /**
5151 * Require modules before codeceptjs running
5252 *
5353 * @param {string[] } requiringModules
5454 */
55- requireModules ( requiringModules ) {
55+ async requireModules ( requiringModules ) {
5656 if ( requiringModules ) {
57- requiringModules . forEach ( requiredModule => {
58- const isLocalFile = existsSync ( requiredModule ) || existsSync ( `${ requiredModule } .js` )
57+ for ( const requiredModule of requiringModules ) {
58+ let modulePath = requiredModule
59+ const isLocalFile = existsSync ( modulePath ) || existsSync ( `${ modulePath } .js` )
5960 if ( isLocalFile ) {
60- requiredModule = resolve ( requiredModule )
61+ modulePath = resolve ( modulePath )
6162 }
62- require ( requiredModule )
63- } )
63+ // Use dynamic import for ESM
64+ await import ( modulePath )
65+ }
6466 }
6567 }
6668
@@ -72,6 +74,8 @@ class Codecept {
7274 */
7375 async init ( dir ) {
7476 await this . initGlobals ( dir )
77+ // Require modules before initializing
78+ await this . requireModules ( this . requiringModules )
7579 // initializing listeners
7680 await container . create ( this . config , this . opts )
7781 // Store container globally for easy access
@@ -92,17 +96,24 @@ class Codecept {
9296 * Executes hooks.
9397 */
9498 async runHooks ( ) {
95- // default hooks
96- runHook ( require ( './listener/store' ) )
97- runHook ( require ( './listener/steps' ) )
98- runHook ( require ( './listener/config' ) )
99- runHook ( require ( './listener/result' ) )
100- runHook ( require ( './listener/helpers' ) )
101- runHook ( require ( './listener/globalTimeout' ) )
102- runHook ( require ( './listener/globalRetry' ) )
103- runHook ( require ( './listener/retryEnhancer' ) )
104- runHook ( require ( './listener/exit' ) )
105- runHook ( require ( './listener/emptyRun' ) )
99+ // default hooks - dynamic imports for ESM
100+ const listenerModules = [
101+ './listener/store.js' ,
102+ './listener/steps.js' ,
103+ './listener/config.js' ,
104+ './listener/result.js' ,
105+ './listener/helpers.js' ,
106+ './listener/globalTimeout.js' ,
107+ './listener/globalRetry.js' ,
108+ './listener/retryEnhancer.js' ,
109+ './listener/exit.js' ,
110+ './listener/emptyRun.js' ,
111+ ]
112+
113+ for ( const modulePath of listenerModules ) {
114+ const module = await import ( modulePath )
115+ runHook ( module . default || module )
116+ }
106117
107118 // custom hooks (previous iteration of plugins)
108119 this . config . hooks . forEach ( hook => runHook ( hook ) )
0 commit comments