jestjs / jest

Delightful JavaScript Testing.
https://jestjs.io
MIT License
44.01k stars 6.42k forks source link

[Bug]: jest-config can't import TS file with moduleResolution: node16 #13350

Open Maxim-Mazurok opened 1 year ago

Maxim-Mazurok commented 1 year ago

Version

29.1.2

Steps to reproduce

  1. git clone https://github.com/Maxim-Mazurok/jest-config-bug-repro
  2. cd jest-config-bug-repro
  3. (optional) nvm i
  4. npm ci
  5. tsc --noEmit - works
  6. npm run test:unit - works
  7. 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
sindrisig commented 1 year ago

@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 commented 1 year ago

@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!

github-actions[bot] commented 1 year ago

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.

Maxim-Mazurok commented 1 year ago

Occurring an activity

dsellarsnr commented 1 year ago

Same problem for me. tsc and esbuild work fine, jest can't resolve the import.

github-actions[bot] commented 1 year ago

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.

Maxim-Mazurok commented 1 year ago

unstaling

Vithanco commented 1 year ago

same problem here. Any workarounds?

Maxim-Mazurok commented 1 year ago

Maybe try switching to vitest, same API, even same plugins usually work, but TS and ESM stuff generally works much better with it.

Vithanco commented 1 year ago

Excellent tip. I was using vite but didn’t know about vitest! Now “fixed”. And resolve works like a charm. Problem fixed as well. 😜

github-actions[bot] commented 1 year ago

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.

Maxim-Mazurok commented 1 year ago

No worries! Also, unstaling the issue

github-actions[bot] commented 1 year ago

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.

Maxim-Mazurok commented 1 year ago

Unstale

github-actions[bot] commented 1 year ago

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.

Maxim-Mazurok commented 1 year ago

I've migrated to vitest and also using module resolution "bundle" so this issue is no longer relevant to me.

github-actions[bot] commented 1 year ago

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.

Maxim-Mazurok commented 1 year ago

As I mention it's no relevant to me, so I'll unstale it and unsubscribe, perhaps someone else can take it over, cheers

github-actions[bot] commented 1 year ago

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.

yifanwww commented 1 year ago

unstale

github-actions[bot] commented 1 year ago

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.

yifanwww commented 1 year ago

unstale

ddeltree commented 1 year ago

still the same

yifanwww commented 1 year ago

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.

datner commented 1 year ago

Why is this being ignored?

github-actions[bot] commented 11 months ago

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.

noahnu commented 11 months ago

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
github-actions[bot] commented 10 months ago

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.

noahnu commented 10 months ago

Still relevant.

yc-w-cn commented 9 months ago

Still relevant.

JamesKyburz commented 8 months ago

Just ran into this, wondering how jest is used with modern typescript projects using moduleResolution node16?

Overriding module resolution for tests would mean you get errors from the base tsconfig.json in your editor, or when validating types using for example tsc --noEmit.

github-actions[bot] commented 7 months ago

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.

noahnu commented 7 months ago

Still relevant

JamesKyburz commented 7 months ago

For ESM support in Node.js to work without using extra bundlers or compilers module resolution has to be node16. Otherwise the output generated by tsc --build isn't compatible with Node, importing files without extensions just doesn't work without a non standard loader.

If we for example want https://swc.rs/ to generate ESM code we have to use node16 resolution, which basically means swc + jest won't work.

phun-ky commented 6 months ago

Still an issue, and testing with @noahnu 's solution did not work for me..

datner commented 6 months ago

I managed to get a consistent fix

change in your package.json "jest": "npm:vitest@latest"

akwodkiewicz commented 3 months ago

I did not know about this issue and I have submitted a duplicate here half a year ago: #14740

I was able to propose a solution to this issue back then, but the PR is still pending (need help with a test suite or make the decision to ship it without one): https://github.com/jestjs/jest/pull/14739

Some help would be appreciated (with the suite, or even letting me know the fix works for you).

akwodkiewicz commented 3 months ago

My PR is about the TS config file with modern moduleResolution, but it does not solve the issue with .js imports inside the config.

However, I wanted to suggest a workaround that requires you to add this to the tsconfig.json in your project:

 "ts-node": {
    "experimentalResolver": true
  }
SimenB commented 2 months ago

partly addressed in https://github.com/jestjs/jest/releases/tag/v30.0.0-alpha.5 (via #14739)