Skip to content

Commit 663d0cc

Browse files
committed
fix(esm): Replace require() with dynamic import() in codecept.js
- Converted runHooks() to use dynamic imports for listener modules - Made requireModules() async and use dynamic imports - Moved requireModules call from constructor to init() method This fixes 'require is not defined' errors when running tests.
1 parent a9e7e85 commit 663d0cc

File tree

1 file changed

+29
-18
lines changed

1 file changed

+29
-18
lines changed

lib/codecept.js

Lines changed: 29 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)