Skip to content

Commit 06d05da

Browse files
Copilotkobenguyent
andcommitted
Changes before error encountered
Co-authored-by: kobenguyent <[email protected]>
1 parent e12ae78 commit 06d05da

File tree

16 files changed

+309
-346
lines changed

16 files changed

+309
-346
lines changed

lib/codecept.js

Lines changed: 58 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,20 @@
1-
const { existsSync, readFileSync } = require('fs')
2-
const { globSync } = require('glob')
3-
const shuffle = require('lodash.shuffle')
4-
const fsPath = require('path')
5-
const { resolve } = require('path')
6-
7-
const container = require('./container')
8-
const Config = require('./config')
9-
const event = require('./event')
10-
const runHook = require('./hooks')
11-
const output = require('./output')
12-
const { emptyFolder } = require('./utils')
1+
import { existsSync, readFileSync } from 'fs';
2+
import { globSync } from 'glob';
3+
import shuffle from 'lodash.shuffle';
4+
import fsPath from 'path';
5+
import { resolve } from 'path';
6+
import { fileURLToPath } from 'url';
7+
import path from 'path';
8+
9+
import container from './container.js';
10+
import Config from './config.js';
11+
import event from './event.js';
12+
import runHook from './hooks.js';
13+
import output from './output.js';
14+
import { emptyFolder } from './utils.js';
15+
16+
const __filename = fileURLToPath(import.meta.url);
17+
const __dirname = path.dirname(__filename);
1318

1419
/**
1520
* CodeceptJS runner
@@ -26,23 +31,24 @@ class Codecept {
2631
this.config = Config.create(config)
2732
this.opts = opts
2833
this.testFiles = new Array(0)
29-
this.requireModules(config.require)
34+
// Note: requireModules is now async and should be called after construction
3035
}
3136

3237
/**
3338
* Require modules before codeceptjs running
3439
*
3540
* @param {string[]} requiringModules
3641
*/
37-
requireModules(requiringModules) {
42+
async requireModules(requiringModules) {
3843
if (requiringModules) {
39-
requiringModules.forEach(requiredModule => {
44+
for (const requiredModule of requiringModules) {
45+
let modulePath = requiredModule;
4046
const isLocalFile = existsSync(requiredModule) || existsSync(`${requiredModule}.js`)
4147
if (isLocalFile) {
42-
requiredModule = resolve(requiredModule)
48+
modulePath = resolve(requiredModule)
4349
}
44-
require(requiredModule)
45-
})
50+
await import(modulePath);
51+
}
4652
}
4753
}
4854

@@ -52,8 +58,9 @@ class Codecept {
5258
*
5359
* @param {string} dir
5460
*/
55-
init(dir) {
56-
this.initGlobals(dir)
61+
async init(dir) {
62+
await this.requireModules(this.config.require);
63+
await this.initGlobals(dir)
5764
// initializing listeners
5865
container.create(this.config, this.opts)
5966
this.runHooks()
@@ -64,28 +71,47 @@ class Codecept {
6471
*
6572
* @param {string} dir
6673
*/
67-
initGlobals(dir) {
74+
async initGlobals(dir) {
6875
global.codecept_dir = dir
6976
global.output_dir = fsPath.resolve(dir, this.config.output)
7077

7178
if (this.config.emptyOutputFolder) emptyFolder(global.output_dir)
7279

7380
if (!this.config.noGlobals) {
74-
global.Helper = global.codecept_helper = require('@codeceptjs/helper')
75-
global.actor = global.codecept_actor = require('./actor')
76-
global.pause = require('./pause')
77-
global.within = require('./within')
78-
global.session = require('./session')
79-
global.DataTable = require('./data/table')
80-
global.locate = locator => require('./locator').build(locator)
81+
const helper = await import('@codeceptjs/helper');
82+
global.Helper = global.codecept_helper = helper.default || helper;
83+
84+
const actor = await import('./actor.js');
85+
global.actor = global.codecept_actor = actor.default || actor;
86+
87+
const pause = await import('./pause.js');
88+
global.pause = pause.default || pause;
89+
90+
const within = await import('./within.js');
91+
global.within = within.default || within;
92+
93+
const session = await import('./session.js');
94+
global.session = session.default || session;
95+
96+
const DataTable = await import('./data/table.js');
97+
global.DataTable = DataTable.default || DataTable;
98+
99+
const locator = await import('./locator.js');
100+
global.locate = loc => (locator.default || locator).build(loc);
101+
81102
global.inject = container.support
82103
global.share = container.share
83-
global.secret = require('./secret').secret
104+
105+
const secret = await import('./secret.js');
106+
global.secret = secret.secret;
107+
84108
global.codecept_debug = output.debug
85-
global.codeceptjs = require('./index') // load all objects
109+
110+
const codeceptjs = await import('./index.js');
111+
global.codeceptjs = codeceptjs.default || codeceptjs; // load all objects
86112

87113
// BDD
88-
const stepDefinitions = require('./mocha/bdd')
114+
const stepDefinitions = await import('./mocha/bdd.js');
89115
global.Given = stepDefinitions.Given
90116
global.When = stepDefinitions.When
91117
global.Then = stepDefinitions.Then
@@ -226,4 +252,4 @@ class Codecept {
226252
}
227253
}
228254

229-
module.exports = Codecept
255+
export default Codecept;

lib/colorUtils.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ function isColorProperty(prop) {
248248
].indexOf(prop) > -1;
249249
}
250250

251-
module.exports = {
251+
export {
252252
isColorProperty,
253253
convertColorToRGBA,
254254
convertColorNameToHex,

lib/config.js

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
const fs = require('fs')
2-
const path = require('path')
3-
const { fileExists, isFile, deepMerge, deepClone } = require('./utils')
1+
import fs from 'fs';
2+
import path from 'path';
3+
import { fileExists, isFile, deepMerge, deepClone } from './utils.js';
44

55
const defaultConfig = {
66
output: './_output',
@@ -167,7 +167,9 @@ class Config {
167167
}
168168
}
169169

170-
module.exports = Config
170+
export default Config;
171+
172+
export { loadConfigFile, loadConfigFileSync };
171173

172174
/**
173175
* Check if a file should be treated as ESM
@@ -221,7 +223,7 @@ async function loadConfigFile(configFile) {
221223

222224
if (extensionName === '.ts') {
223225
try {
224-
require('ts-node/register')
226+
await import('ts-node/register');
225227
} catch (err) {
226228
console.log('ts-node package is required to parse codecept.conf.ts config correctly')
227229
}
@@ -244,8 +246,10 @@ async function loadConfigFile(configFile) {
244246
throw err
245247
}
246248
} else {
247-
// Use require for CommonJS modules
248-
return Config.create(require(configFile).config)
249+
// Use dynamic import for CommonJS modules too in ESM context
250+
const module = await import(path.resolve(configFile))
251+
const configObject = module.config || module.default || module
252+
return Config.create(configObject)
249253
}
250254
}
251255

@@ -257,12 +261,12 @@ async function loadConfigFile(configFile) {
257261
throw new Error(`Config file ${configFile} can't be loaded`)
258262
}
259263

260-
function loadConfigFileSync(configFile) {
264+
async function loadConfigFileSync(configFile) {
261265
const extensionName = path.extname(configFile)
262266

263267
if (extensionName === '.ts') {
264268
try {
265-
require('ts-node/register')
269+
await import('ts-node/register');
266270
} catch (err) {
267271
console.log('ts-node package is required to parse codecept.conf.ts config correctly')
268272
}
@@ -276,8 +280,10 @@ function loadConfigFileSync(configFile) {
276280
`Config file ${configFile} is an ES module and cannot be loaded synchronously. The file contains 'type: module' in package.json or uses .mjs extension. Please use async configuration loading or switch your config to CommonJS format.`,
277281
)
278282
} else {
279-
// Use require for CommonJS modules
280-
return Config.create(require(configFile).config)
283+
// Use dynamic import for CommonJS modules too in ESM context
284+
const module = await import(path.resolve(configFile))
285+
const configObject = module.config || module.default || module
286+
return Config.create(configObject)
281287
}
282288
}
283289

0 commit comments

Comments
 (0)