Closed samydoesit closed 6 months ago
+1 Same issue here...
Thanks @samydoesit for raising, and taking the time to make that repro.
I've looked at the config there, but my understanding is that it would not work with or without Cucumber. From the relevant ts-node documentation:
...
"paths"
are intended to describe mappings that the build tool or runtime already performs, not to tell the build tool or runtime how to resolve modules. In other words, they intend us to write our imports in a waynode
already understands. For this reason, ts-node does not modifynode
's module resolution behavior to implement"paths"
mappings.
ts-config-paths tends to be used for this, but from what I can see lacks ESM support for now, so unfortunately to have path mapping like this you may need to go back to CommonJS output.
Thanks for your quick response. :) I thought maybe there is another way.
We will keep the CommonJS output for now.
To clarify, is there no way to import from the local files when using ts-node/esm? I can't seem to import even if I use a relative path, even if the files are in the same directory, but perhaps that's a different issue.
For anyone else who finds this issue, my workaround was to use compilerOptions.moduleResolution: "node"
in the tsconfig.json, and then import modules using relative paths and the .js
file extension even for .ts
files. So in tests/steps/search.ts
:
import searchRequest from '../../src/lib/searchRequest.js'; // imports $lib/searchRequest.ts
Adding my two cents as I got it to work without ts-node nor tsconfig-paths despite trying everything I could think of. I did try some custom loader scripts that worked but were a bit clunky for my taste and less than ideal from a maintenance standpoint.
I came across several others pointing out they replaced their configuration with the tsx package but couldn't get it to work following the documented ESM principles. I wanted to use TypeScript for my step definitions and path aliases within those files, plus include type: module
in my package.json
and have the module and moduleResolution in tsconfig compilerOptions set to ES2022
and Bundler
respectively. I felt obligated to use import
over require
in my cucumber config file when trying out tsx
but I wasn't having any success.
If anyone else is having the same issue, here's what I did to get everything to run successfully:
package.json
includes "type": "module"
.ts
files and use path aliases as defined in my tsconfig (in my case "baseUrl": "./src", "paths": {"@/*": ["*"]}
)module
and moduleResolution
(in my case ES2022
and Bundler
respectively)import
in the cucumber config and instead use requireModule
set to tsx/cjs
(neither loader
nor import
set to tsx
or tsx/esm
did not work for me)My cucumber.yaml
file looks like this:
default:
paths:
- "../../features/**/*.feature"
requireModule:
- tsx/cjs
require:
- "tests/**/*.ts"
Nit: I declare my step definitions outside of my features
(which rests in my repo's root directory as I intend it to target other languages in the future [hopefully with step definitions being able to be targeted outside of it, but I've read that may be wishful thinking]) and src
folders in my sub-project root called tests
(as I'm not using any other testing framework at the moment).
My tests also had a 4x performance improvement as well, which is always a plus.
👓 What did you see?
When using cucumber-js with
ts-node
as the loader in ESM mode, TypeScript path aliases specified intsconfig.json
fail to resolve.Path aliases are not resolved, resulting in module resolution errors when attempting to execute tests.
Error:
✅ What did you expect to see?
TypeScript path aliases should resolve correctly when cucumber-js is run in ESM mode using
ts-node
.📦 Which tool/library version are you using?
🔬 How could we reproduce it?
Steps to Reproduce
npm install
npm test
📚 Any additional context?
No response