diff --git a/packages/server/lib/plugins/child/run_require_async_child.js b/packages/server/lib/plugins/child/run_require_async_child.js index 4ee95c94bbb1..378bbf5ef217 100644 --- a/packages/server/lib/plugins/child/run_require_async_child.js +++ b/packages/server/lib/plugins/child/run_require_async_child.js @@ -97,10 +97,12 @@ function run (ipc, file, projectRoot) { // 3a. Yes: Use bundleRequire // 3b. No: Continue through to `await import(configFile)` // 4. Use node's dynamic import to import the configFile + let originalError try { return require(file) } catch (err) { + originalError = err if (!err.stack.includes('[ERR_REQUIRE_ESM]') && !err.stack.includes('SyntaxError: Cannot use import statement outside a module')) { throw err } @@ -122,8 +124,16 @@ function run (ipc, file, projectRoot) { debug(`User doesn't have esbuild. Going to use native node imports.`) // We cannot replace the initial `require` with `await import` because - // Certain modules cannot be dynamically imported - return await import(file) + // Certain modules cannot be dynamically imported. If this throws, however, we want + // to show the original error that was thrown, because that's ultimately the source of the problem + try { + return await import(file) + } catch (e) { + // If we aren't able to import the file at all, throw the original error, since that has more accurate information + // of what failed to begin with + debug('esbuild fallback for loading config failed, throwing original error. node import error: %o', e) + throw originalError + } } throw err diff --git a/system-tests/__snapshots__/config_modules_spec.ts.js b/system-tests/__snapshots__/config_modules_spec.ts.js new file mode 100644 index 000000000000..7b06c15a4063 --- /dev/null +++ b/system-tests/__snapshots__/config_modules_spec.ts.js @@ -0,0 +1,3 @@ +exports['cypress config with esm and cjs / does not support modules and ts without esbuild in config-cjs-and-esm/config-with-ts-module'] = ` +STDOUT_ERROR_VALIDATED +` diff --git a/system-tests/test/config_modules_spec.ts b/system-tests/test/config_modules_spec.ts index fc727a36c8ea..d6490f8d814b 100644 --- a/system-tests/test/config_modules_spec.ts +++ b/system-tests/test/config_modules_spec.ts @@ -32,6 +32,13 @@ describe('cypress config with esm and cjs', function () { spec: 'app.cy.js', browser: 'chrome', expectedExitCode: 1, + snapshot: true, + onStdout (stdout) { + expect(stdout).to.include('nearest parent package.json contains "type": "module" which defines all .ts files in that package scope as ES modules') + + // Need to make this stable b/c of filepaths, and snapshot: true is needed to invoke onStdout + return 'STDOUT_ERROR_VALIDATED' + }, }) })