diff --git a/lib/codecept.js b/lib/codecept.js index e9acd584c..05203d241 100644 --- a/lib/codecept.js +++ b/lib/codecept.js @@ -19,7 +19,7 @@ import ActorFactory from './actor.js' import output from './output.js' import { emptyFolder } from './utils.js' import { initCodeceptGlobals } from './globals.js' -import { validateTypeScriptSetup } from './utils/loaderCheck.js' +import { validateTypeScriptSetup, getTSNodeESMWarning } from './utils/loaderCheck.js' import recorder from './recorder.js' import storeListener from './listener/store.js' @@ -270,6 +270,12 @@ class Codecept { process.exit(1) } + // Show warning if ts-node/esm is being used + const tsWarning = getTSNodeESMWarning(this.requiringModules || []) + if (tsWarning) { + output.print(output.colors.yellow(tsWarning)) + } + // Ensure translations are loaded for Gherkin features try { const { loadTranslations } = await import('./mocha/gherkin.js') diff --git a/lib/utils/loaderCheck.js b/lib/utils/loaderCheck.js index 9a8e10349..fce847772 100644 --- a/lib/utils/loaderCheck.js +++ b/lib/utils/loaderCheck.js @@ -106,6 +106,26 @@ Note: TypeScript config files (codecept.conf.ts) and helpers are automatically ` } +/** + * Get warning message if ts-node/esm is being used + * @param {string[]} requiredModules - Array of required modules from config + * @returns {string|null} Warning message or null + */ +export function getTSNodeESMWarning(requiredModules = []) { + if (!requiredModules.includes('ts-node/esm')) { + return null + } + + return ` +⚠️ Warning: ts-node/esm with "module": "esnext" requires explicit file extensions in all imports. + +This is a known limitation. Use tsx/cjs instead to write imports without extensions. + +📚 Documentation: https://codecept.io/typescript + +` +} + /** * Check if user is trying to run TypeScript tests without proper loader * @param {string[]} testFiles - Array of test file paths