jest
jest copied to clipboard
[Bug]: jest-config can't import TS file with moduleResolution: node16
Version
29.1.2
Steps to reproduce
-
git clone https://github.com/Maxim-Mazurok/jest-config-bug-repro
-
cd jest-config-bug-repro
- (optional)
nvm i
-
npm ci
-
tsc --noEmit
- works -
npm run test:unit
- works -
npm run test:integration
- doesn't work
Expected behavior
Parse config just fine and exit with No tests found, exiting with code 0
Actual behavior
gives error:
Error: Jest: Failed to parse the TypeScript config file /home/maxim/jest-config-bug-repro/jest.integration.config.ts
Error: Cannot find module './jest.config.js'
Require stack:
- /home/maxim/jest-config-bug-repro/jest.integration.config.ts
- /home/maxim/jest-config-bug-repro/node_modules/jest-config/build/readConfigFileAndSetRootDir.js
- /home/maxim/jest-config-bug-repro/node_modules/jest-config/build/index.js
- /home/maxim/jest-config-bug-repro/node_modules/jest-cli/build/init/index.js
- /home/maxim/jest-config-bug-repro/node_modules/jest-cli/build/cli/index.js
- /home/maxim/jest-config-bug-repro/node_modules/jest-cli/build/index.js
- /home/maxim/jest-config-bug-repro/node_modules/jest-cli/bin/jest.js
- /home/maxim/jest-config-bug-repro/node_modules/jest/bin/jest.js
at readConfigFileAndSetRootDir (/home/maxim/jest-config-bug-repro/node_modules/jest-config/build/readConfigFileAndSetRootDir.js:136:13)
at async readConfig (/home/maxim/jest-config-bug-repro/node_modules/jest-config/build/index.js:208:18)
at async readConfigs (/home/maxim/jest-config-bug-repro/node_modules/jest-config/build/index.js:404:26)
at async runCLI (/home/maxim/jest-config-bug-repro/node_modules/@jest/core/build/cli/index.js:182:59)
at async Object.run (/home/maxim/jest-config-bug-repro/node_modules/jest-cli/build/cli/index.js:155:37)
Additional context
Had to make the switch in https://github.com/Maxim-Mazurok/google-api-typings-generator because https://github.com/sindresorhus/got/issues/2051#issuecomment-1259401339
Environment
System:
OS: Linux 5.10 Ubuntu 22.04.1 LTS 22.04.1 LTS (Jammy Jellyfish)
CPU: (20) x64 12th Gen Intel(R) Core(TM) i9-12900H
Binaries:
Node: 18.10.0 - ~/.nvm/versions/node/v18.10.0/bin/node
npm: 8.19.2 - ~/.nvm/versions/node/v18.10.0/bin/npm
npmPackages:
jest: ^29.1.2 => 29.1.2
@Maxim-Mazurok Your script in package.json is incorrect
Current
"test:integration": "npm run jest -- --config jest.integration.config.ts",
Should be
"test:integration": "npm run jest --config jest.integration.config.ts",
@Maxim-Mazurok Your script in package.json is incorrect
Current
"test:integration": "npm run jest -- --config jest.integration.config.ts",
Should be
"test:integration": "npm run jest --config jest.integration.config.ts",
No, using --
allows to pass cli arguments to npm script as per this answer, I've been using it for years in many projects.
You can even see this from log:
> npm run jest -- --config jest.integration.config.ts
> jest
> node --experimental-vm-modules node_modules/jest/bin/jest.js --passWithNoTests "--config" "jest.integration.config.ts"
Error: Jest: Failed to parse the TypeScript config file /home/maxim/jest-config-bug-repro/jest.integration.config.ts
Notice how it has jest.js --passWithNoTests "--config" "jest.integration.config.ts"
part where config argument is getting passed.
And without --
it's not being passed:
> npm run jest --config jest.integration.config.ts
> jest
> node --experimental-vm-modules node_modules/jest/bin/jest.js --passWithNoTests "jest.integration.config.ts"
You see jest.js --passWithNoTests "jest.integration.config.ts"
- the --config
disappeared.
This is an unrelated matter, perhaps you just didn't notice that I'm not doing jest --config bla
but npm run jest --config bla
because I have added the jest
script. In any case, let's not focus on this as this is not the issue at hand.
One can get the same reproduction by changing jest.config.ts
to be:
import { JestConfigWithTsJest } from "ts-jest";
import integrationConfig from "./jest.integration.config.js";
const config: JestConfigWithTsJest = { ...integrationConfig };
export default config;
And then run npm run jest
with no arguments and get the same error:
Error: Jest: Failed to parse the TypeScript config file /home/maxim/jest-config-bug-repro/jest.config.ts
Error: Cannot find module './jest.integration.config.js'
Hope that clears it up, cheers!
This issue is stale because it has been open 30 days with no activity. Remove stale label or comment or this will be closed in 30 days.
Occurring an activity
Same problem for me. tsc and esbuild work fine, jest can't resolve the import.
This issue is stale because it has been open 30 days with no activity. Remove stale label or comment or this will be closed in 30 days.
unstaling
same problem here. Any workarounds?
Maybe try switching to vitest, same API, even same plugins usually work, but TS and ESM stuff generally works much better with it.
Excellent tip. I was using vite but didn’t know about vitest! Now “fixed”. And resolve works like a charm. Problem fixed as well. 😜
This issue is stale because it has been open 30 days with no activity. Remove stale label or comment or this will be closed in 30 days.
No worries! Also, unstaling the issue
This issue is stale because it has been open 30 days with no activity. Remove stale label or comment or this will be closed in 30 days.
Unstale
This issue is stale because it has been open 30 days with no activity. Remove stale label or comment or this will be closed in 30 days.
I've migrated to vitest and also using module resolution "bundle" so this issue is no longer relevant to me.
This issue is stale because it has been open 30 days with no activity. Remove stale label or comment or this will be closed in 30 days.
As I mention it's no relevant to me, so I'll unstale it and unsubscribe, perhaps someone else can take it over, cheers
This issue is stale because it has been open 30 days with no activity. Remove stale label or comment or this will be closed in 30 days.
unstale
This issue is stale because it has been open 30 days with no activity. Remove stale label or comment or this will be closed in 30 days.
unstale
still the same
I looked at this issue again and found that this was not the case I was having.
For this issue, I think you probably need to compile TS jest config (jest.config.ts
and jest.integration.config.ts
) to JS jest config (jest.config.js
and jest.integration.config.js
) and then pass the js file to --config
in the command.
I don't think jest does any transformations on the config files.
Why is this being ignored?
This issue is stale because it has been open 30 days with no activity. Remove stale label or comment or this will be closed in 30 days.
This is still an issue. @SimenB Is there a label that can be added so this doesn't get marked as stale? (it's adding unnecessary "bump" comments that's making it hard to follow along for updates)
It looks like compilerOptions.module
is hardcoded here: https://github.com/jestjs/jest/blob/f9398b12dfc235695e9a055d27a8f77936d07b01/packages/jest-config/src/readConfigFileAndSetRootDir.ts#L118
a quick fix would be to update jest-config to also set moduleResolution. Alternatively, respecting any existing tsconfig for the project would be nice.
As a workaround, you can create a second tsconfig file for test, e.g. tsconfig.test.json
:
{
"extends": "./tsconfig.json",
"compilerOptions": {
"moduleResolution": "Node10",
"module": "CommonJS",
}
}
and then when running jest (I'm using yarn):
TS_NODE_PROJECT=./tsconfig.test.json yarn jest --config jest.config.ts
This issue is stale because it has been open 30 days with no activity. Remove stale label or comment or this will be closed in 30 days.
Still relevant.
Still relevant.