Thanks to visit codestin.com
Credit goes to github.com

Skip to content

fix: make coverage work when using projects option#16140

Merged
SimenB merged 1 commit into
jestjs:mainfrom
ahnpnl:fix/projects-coverage-5417
May 7, 2026
Merged

fix: make coverage work when using projects option#16140
SimenB merged 1 commit into
jestjs:mainfrom
ahnpnl:fix/projects-coverage-5417

Conversation

@ahnpnl
Copy link
Copy Markdown
Contributor

@ahnpnl ahnpnl commented May 7, 2026

Summary

  • Fix coverage report not showing correct code coverage when using projects config option
  • Root cause: collectCoverageFrom globs were resolved relative to project rootDir instead of global rootDir, causing files to not match when projects have different root directories
  • Added globalRootDir option to ShouldInstrumentOptions and pass it from jest-runner so glob matching uses the correct base directory

Changes

  • packages/jest-runner/src/runTest.ts: Pass globalConfig.rootDir as globalRootDir
  • packages/jest-transform/src/shouldInstrument.ts: Use globalRootDir (falling back to config.rootDir) when matching collectCoverageFrom globs
  • packages/jest-transform/src/types.ts: Add globalRootDir to ShouldInstrumentOptions
  • Added unit tests for the new behavior
  • Added e2e test with multi-project setup validating coverage output

Fixes #5417

@netlify
Copy link
Copy Markdown

netlify Bot commented May 7, 2026

Deploy Preview for jestjs ready!

Built without sensitive environment variables

Name Link
🔨 Latest commit 3206815
🔍 Latest deploy log https://app.netlify.com/projects/jestjs/deploys/69fc9b899c4cab0008ca3b16
😎 Deploy Preview https://deploy-preview-16140--jestjs.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@pkg-pr-new
Copy link
Copy Markdown

pkg-pr-new Bot commented May 7, 2026

Open in StackBlitz

babel-jest

npm i https://pkg.pr.new/babel-jest@16140

babel-plugin-jest-hoist

npm i https://pkg.pr.new/babel-plugin-jest-hoist@16140

babel-preset-jest

npm i https://pkg.pr.new/babel-preset-jest@16140

create-jest

npm i https://pkg.pr.new/create-jest@16140

@jest/diff-sequences

npm i https://pkg.pr.new/@jest/diff-sequences@16140

expect

npm i https://pkg.pr.new/expect@16140

@jest/expect-utils

npm i https://pkg.pr.new/@jest/expect-utils@16140

jest

npm i https://pkg.pr.new/jest@16140

jest-changed-files

npm i https://pkg.pr.new/jest-changed-files@16140

jest-circus

npm i https://pkg.pr.new/jest-circus@16140

jest-cli

npm i https://pkg.pr.new/jest-cli@16140

jest-config

npm i https://pkg.pr.new/jest-config@16140

@jest/console

npm i https://pkg.pr.new/@jest/console@16140

@jest/core

npm i https://pkg.pr.new/@jest/core@16140

@jest/create-cache-key-function

npm i https://pkg.pr.new/@jest/create-cache-key-function@16140

jest-diff

npm i https://pkg.pr.new/jest-diff@16140

jest-docblock

npm i https://pkg.pr.new/jest-docblock@16140

jest-each

npm i https://pkg.pr.new/jest-each@16140

@jest/environment

npm i https://pkg.pr.new/@jest/environment@16140

jest-environment-jsdom

npm i https://pkg.pr.new/jest-environment-jsdom@16140

@jest/environment-jsdom-abstract

npm i https://pkg.pr.new/@jest/environment-jsdom-abstract@16140

jest-environment-node

npm i https://pkg.pr.new/jest-environment-node@16140

@jest/expect

npm i https://pkg.pr.new/@jest/expect@16140

@jest/fake-timers

npm i https://pkg.pr.new/@jest/fake-timers@16140

@jest/get-type

npm i https://pkg.pr.new/@jest/get-type@16140

@jest/globals

npm i https://pkg.pr.new/@jest/globals@16140

jest-haste-map

npm i https://pkg.pr.new/jest-haste-map@16140

jest-jasmine2

npm i https://pkg.pr.new/jest-jasmine2@16140

jest-leak-detector

npm i https://pkg.pr.new/jest-leak-detector@16140

jest-matcher-utils

npm i https://pkg.pr.new/jest-matcher-utils@16140

jest-message-util

npm i https://pkg.pr.new/jest-message-util@16140

jest-mock

npm i https://pkg.pr.new/jest-mock@16140

@jest/pattern

npm i https://pkg.pr.new/@jest/pattern@16140

jest-phabricator

npm i https://pkg.pr.new/jest-phabricator@16140

jest-regex-util

npm i https://pkg.pr.new/jest-regex-util@16140

@jest/reporters

npm i https://pkg.pr.new/@jest/reporters@16140

jest-resolve

npm i https://pkg.pr.new/jest-resolve@16140

jest-resolve-dependencies

npm i https://pkg.pr.new/jest-resolve-dependencies@16140

jest-runner

npm i https://pkg.pr.new/jest-runner@16140

jest-runtime

npm i https://pkg.pr.new/jest-runtime@16140

@jest/schemas

npm i https://pkg.pr.new/@jest/schemas@16140

jest-snapshot

npm i https://pkg.pr.new/jest-snapshot@16140

@jest/snapshot-utils

npm i https://pkg.pr.new/@jest/snapshot-utils@16140

@jest/source-map

npm i https://pkg.pr.new/@jest/source-map@16140

@jest/test-result

npm i https://pkg.pr.new/@jest/test-result@16140

@jest/test-sequencer

npm i https://pkg.pr.new/@jest/test-sequencer@16140

@jest/transform

npm i https://pkg.pr.new/@jest/transform@16140

@jest/types

npm i https://pkg.pr.new/@jest/types@16140

jest-util

npm i https://pkg.pr.new/jest-util@16140

jest-validate

npm i https://pkg.pr.new/jest-validate@16140

jest-watcher

npm i https://pkg.pr.new/jest-watcher@16140

jest-worker

npm i https://pkg.pr.new/jest-worker@16140

pretty-format

npm i https://pkg.pr.new/pretty-format@16140

commit: 3206815

@ahnpnl ahnpnl marked this pull request as ready for review May 7, 2026 10:19
Copilot AI review requested due to automatic review settings May 7, 2026 10:19
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR fixes coverage instrumentation/glob matching when running Jest with the projects option, by ensuring collectCoverageFrom patterns are evaluated relative to the global root directory rather than each project’s rootDir.

Changes:

  • Add globalRootDir to @jest/transform’s ShouldInstrumentOptions and use it as the base for collectCoverageFrom matching in shouldInstrument.
  • Thread globalConfig.rootDir from jest-runner into the runtime/transform coverage options.
  • Add unit coverage for the new matching behavior and an e2e multi-project fixture + snapshot to validate the CLI coverage report.

Reviewed changes

Copilot reviewed 14 out of 14 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
packages/jest-transform/src/types.ts Extends ShouldInstrumentOptions with optional globalRootDir.
packages/jest-transform/src/shouldInstrument.ts Uses globalRootDir (fallback config.rootDir) for collectCoverageFrom glob matching.
packages/jest-transform/src/tests/shouldInstrument.test.ts Adds unit tests validating globalRootDir behavior.
packages/jest-runner/src/runTest.ts Passes globalConfig.rootDir as globalRootDir in coverage options.
e2e/coverage-with-projects/package.json Adds new multi-project e2e fixture with global collectCoverageFrom.
e2e/coverage-with-projects/packages/client/package.json Client project config for e2e fixture.
e2e/coverage-with-projects/packages/client/client.js Simple source file for coverage in client project.
e2e/coverage-with-projects/packages/client/client.test.js Test exercising client module.
e2e/coverage-with-projects/packages/server/package.json Server project config for e2e fixture.
e2e/coverage-with-projects/packages/server/server.js Simple source file for coverage in server project.
e2e/coverage-with-projects/packages/server/server.test.js Test exercising server module.
e2e/tests/coverageReport.test.ts Adds e2e assertion for coverage output with projects.
e2e/tests/snapshots/coverageReport.test.ts.snap Snapshot for the new e2e coverage output.
CHANGELOG.md Adds a Fixes entry for the behavior change.

Comment thread packages/jest-transform/src/shouldInstrument.ts
Comment thread CHANGELOG.md Outdated
Comment thread CHANGELOG.md Outdated
Copy link
Copy Markdown
Member

@SimenB SimenB left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks again for tackling these!


shouldInstrument(
res.url,
this.coverageOptions,
this.config,
/* loadedFilenames */ [...sources.keys()],
),
should probably ad dit as well for v8 coverage? a test for that would also be lovely 😀

@ahnpnl ahnpnl force-pushed the fix/projects-coverage-5417 branch from cab9a3c to 110f9bc Compare May 7, 2026 11:37
@ahnpnl
Copy link
Copy Markdown
Contributor Author

ahnpnl commented May 7, 2026

Thanks again for tackling these!

shouldInstrument(
res.url,
this.coverageOptions,
this.config,
/* loadedFilenames */ [...sources.keys()],
),

should probably ad dit as well for v8 coverage? a test for that would also be lovely 😀

Thanks for pointing out, I pushed the updates ✅

Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 17 out of 17 changed files in this pull request and generated 3 comments.

Comment thread packages/jest-reporters/src/generateEmptyCoverage.ts
Comment thread e2e/__tests__/coverageReport.test.ts
Comment thread CHANGELOG.md Outdated
@ahnpnl ahnpnl force-pushed the fix/projects-coverage-5417 branch 3 times, most recently from da16932 to 37c9fff Compare May 7, 2026 13:46
@ahnpnl ahnpnl force-pushed the fix/projects-coverage-5417 branch from 37c9fff to 3206815 Compare May 7, 2026 14:02
@SimenB SimenB requested a review from Copilot May 7, 2026 16:54
Copy link
Copy Markdown
Member

@SimenB SimenB left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

awesome, thanks!

Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 19 out of 19 changed files in this pull request and generated no new comments.

@SimenB SimenB merged commit 11fd5fc into jestjs:main May 7, 2026
94 checks passed
@ahnpnl ahnpnl deleted the fix/projects-coverage-5417 branch May 7, 2026 17:07
renovate Bot added a commit to andrei-picus-tink/auto-renovate that referenced this pull request May 8, 2026
| datasource | package | from   | to     |
| ---------- | ------- | ------ | ------ |
| npm        | jest    | 30.3.0 | 30.4.0 |


## [v30.4.0](https://github.com/jestjs/jest/blob/HEAD/CHANGELOG.md#3040)

##### Features

- `[babel-jest]` Support collecting coverage from `.mts`, `.cts` (and other) files ([#15994](jestjs/jest#15994))
- `[jest-circus, jest-cli, jest-config, jest-core, jest-jasmine2, jest-types]` Add `--collect-tests` flag to discover and list tests without executing them ([#16006](jestjs/jest#16006))
- `[jest-config, jest-runner, jest-worker]` Add `workerGracefulExitTimeout` config option to control how long workers are given to exit before being force-killed ([#15984](jestjs/jest#15984))
- `[jest-config]` Add support for `jest.config.mts` as a valid configuration file ([#16005](jestjs/jest#16005))
- `[jest-config, jest-core, jest-reporters, jest-runner]` `verbose` and `silent` can now be set per-project; the project-level value overrides the global value for that project's tests ([#16133](jestjs/jest#16133))
- `[@jest/fake-timers]` Accept `Temporal.Duration` in `jest.advanceTimersByTime()` and `jest.advanceTimersByTimeAsync()` ([#16128](jestjs/jest#16128))
- `[@jest/fake-timers]` Accept `Temporal.Instant` and `Temporal.ZonedDateTime` in `jest.setSystemTime()` and `useFakeTimers({now})` ([#16128](jestjs/jest#16128))
- `[@jest/fake-timers]` Support faking `Temporal.Now.*` ([#16131](jestjs/jest#16131))
- `[jest-mock]` Add `clearMocksOnScope(scope)` on `ModuleMocker` for clearing every mock function exposed on a scope object ([#16088](jestjs/jest#16088))
- `[jest-resolve]` Add `canResolveSync()` on `Resolver` so callers can detect when a user-configured resolver only exports an `async` hook ([#16064](jestjs/jest#16064))
- `[jest-runtime]` Use synchronous `evaluate()` for ES modules without top-level `await` on Node versions that support it (v24.9+), and prefer the synchronous transform path when a sync transformer is configured ([#16062](jestjs/jest#16062))
- `[jest-runtime]` Support `require()` of ES modules on Node v24.9+ ([#16074](jestjs/jest#16074))
- `[jest-runtime]` Validate TC39 import attributes (`with { type: 'json' }`) on ESM imports ([#16127](jestjs/jest#16127))
- `[@jest/transform]` Add `canTransformSync(filename)` on `ScriptTransformer` so callers can pick the sync vs async transform path ([#16062](jestjs/jest#16062))
- `[jest-util]` Add `isError` helper ([#16076](jestjs/jest#16076))
- `[pretty-format]` Support React 19 ([#16123](jestjs/jest#16123))

##### Fixes

- `[expect-utils]` Fix `toStrictEqual` failing on `structuredClone` results due to cross-realm constructor mismatch ([#15959](jestjs/jest#15959))
- `[@jest/expect-utils]` Prevent `toMatchObject`/subset matching from throwing when encountering exotic iterables ([#15952](jestjs/jest#15952))
- `[fake-timers]` Convert `Date` to milliseconds before passing to `@sinonjs/fake-timers` ([#16029](jestjs/jest#16029))
- `[jest]` Export `GlobalConfig` and `ProjectConfig` TypeScript types ([#16132](jestjs/jest#16132))
- `[jest-circus]` Prevent crash when `asyncError` is undefined for non-Error throws ([#16003](jestjs/jest#16003))
- `[jest-circus, jest-jasmine2]` Include `Error.cause` in JSON `failureMessages` output ([#15967](jestjs/jest#15967))
- `[jest-config]` Fix preset path resolution on Windows when the preset uses subpath `exports` ([#15961](jestjs/jest#15961))
- `[jest-config]` Allow `collectCoverage` and `coverageProvider` in project config without a validation warning ([#16132](jestjs/jest#16132))
- `[jest-config]` Project config validator now emits "is not supported in an individual project configuration" instead of "probably a typing mistake" for known global-only options ([#16132](jestjs/jest#16132))
- `[jest-environment-node]` Fix `--localstorage-file` warning on Node 25+ ([#16086](jestjs/jest#16086))
- `[jest-reporters]` Apply global coverage threshold to unmatched pattern files in addition to glob/path thresholds ([#16137](jestjs/jest#16137))
- `[jest-reporters, jest-runner, jest-runtime, jest-transform]` Fix coverage report not showing correct code coverage when using `projects` config option ([#16140](jestjs/jest#16140))
- `[jest-runtime]` Resolve `expect` and `@jest/expect` from the internal module registry so test-file imports share the same `JestAssertionError` as the global `expect` ([#16130](jestjs/jest#16130))
- `[jest-runtime]` Improve CJS-from-ESM interop: `__esModule`/Babel default unwrap, broader named-export coverage, and shared CJS singleton across importers ([#16050](jestjs/jest#16050))
- `[jest-runtime]` Load `.js` files with ESM syntax but no `"type":"module"` marker as native ESM ([#16050](jestjs/jest#16050))
- `[jest-runtime]` Extend the `.js`-with-ESM-syntax fallback to `require()` on Node v24.9+ - falls back to `require(esm)` when the CJS parser rejects ESM syntax ([#16078](jestjs/jest#16078))
- `[jest-runtime]` Fix deadlocks and double-evaluation in concurrent ESM and wasm imports ([#16050](jestjs/jest#16050))
- `[jest-runtime]` Fix error when `require()` is called after the Jest environment has been torn down ([#15951](jestjs/jest#15951))
- `[jest-runtime]` Fix missing error when `import()` is called after the Jest environment has been torn down ([#16080](jestjs/jest#16080))
- `[jest-runtime]` Fix virtual `unstable_mockModule` registrations not respected in ESM ([#16081](jestjs/jest#16081))
- `[jest-runtime]` Apply `moduleNameMapper` when resolving modules with `require.resolve()` and the `paths` option ([#16135](jestjs/jest#16135))

##### Chore & Maintenance

- `[@jest/fake-timers]` Upgrade `@sinonjs/fake-timers` ([#16139](jestjs/jest#16139))
- `[jest-runtime]` Use synchronous `linkRequests` / `instantiate` for ESM linking on Node v24.9+ ([#16063](jestjs/jest#16063))
renovate Bot added a commit to andrei-picus-tink/auto-renovate that referenced this pull request May 10, 2026
| datasource | package | from   | to     |
| ---------- | ------- | ------ | ------ |
| npm        | jest    | 30.3.0 | 30.4.2 |


## [v30.4.2](https://github.com/jestjs/jest/blob/HEAD/CHANGELOG.md#3042)

##### Fixes

- `[jest-runtime]` Fix named imports from CJS modules whose `module.exports` is a function with own-property exports ([#16150](jestjs/jest#16150))


## [v30.4.1](https://github.com/jestjs/jest/blob/HEAD/CHANGELOG.md#3041)

##### Features

- `[jest-config, jest-core, jest-runner, jest-schemas, jest-types]` Allow custom runner configuration options via tuple format `['runner-path', {options}]` ([#16141](jestjs/jest#16141))

##### Fixes

- `[jest-runtime]` Align CJS-from-ESM default export with Node: `module.exports` is always the ESM default, `__esModule` unwrapping is no longer applied ([#16143](jestjs/jest#16143))


## [v30.4.0](https://github.com/jestjs/jest/blob/HEAD/CHANGELOG.md#3040)

##### Features

- `[babel-jest]` Support collecting coverage from `.mts`, `.cts` (and other) files ([#15994](jestjs/jest#15994))
- `[jest-circus, jest-cli, jest-config, jest-core, jest-jasmine2, jest-types]` Add `--collect-tests` flag to discover and list tests without executing them ([#16006](jestjs/jest#16006))
- `[jest-config, jest-runner, jest-worker]` Add `workerGracefulExitTimeout` config option to control how long workers are given to exit before being force-killed ([#15984](jestjs/jest#15984))
- `[jest-config]` Add support for `jest.config.mts` as a valid configuration file ([#16005](jestjs/jest#16005))
- `[jest-config, jest-core, jest-reporters, jest-runner]` `verbose` and `silent` can now be set per-project; the project-level value overrides the global value for that project's tests ([#16133](jestjs/jest#16133))
- `[@jest/fake-timers]` Accept `Temporal.Duration` in `jest.advanceTimersByTime()` and `jest.advanceTimersByTimeAsync()` ([#16128](jestjs/jest#16128))
- `[@jest/fake-timers]` Accept `Temporal.Instant` and `Temporal.ZonedDateTime` in `jest.setSystemTime()` and `useFakeTimers({now})` ([#16128](jestjs/jest#16128))
- `[@jest/fake-timers]` Support faking `Temporal.Now.*` ([#16131](jestjs/jest#16131))
- `[jest-mock]` Add `clearMocksOnScope(scope)` on `ModuleMocker` for clearing every mock function exposed on a scope object ([#16088](jestjs/jest#16088))
- `[jest-resolve]` Add `canResolveSync()` on `Resolver` so callers can detect when a user-configured resolver only exports an `async` hook ([#16064](jestjs/jest#16064))
- `[jest-runtime]` Use synchronous `evaluate()` for ES modules without top-level `await` on Node versions that support it (v24.9+), and prefer the synchronous transform path when a sync transformer is configured ([#16062](jestjs/jest#16062))
- `[jest-runtime]` Support `require()` of ES modules on Node v24.9+ ([#16074](jestjs/jest#16074))
- `[jest-runtime]` Validate TC39 import attributes (`with { type: 'json' }`) on ESM imports ([#16127](jestjs/jest#16127))
- `[@jest/transform]` Add `canTransformSync(filename)` on `ScriptTransformer` so callers can pick the sync vs async transform path ([#16062](jestjs/jest#16062))
- `[jest-util]` Add `isError` helper ([#16076](jestjs/jest#16076))
- `[pretty-format]` Support React 19 ([#16123](jestjs/jest#16123))

##### Fixes

- `[expect-utils]` Fix `toStrictEqual` failing on `structuredClone` results due to cross-realm constructor mismatch ([#15959](jestjs/jest#15959))
- `[@jest/expect-utils]` Prevent `toMatchObject`/subset matching from throwing when encountering exotic iterables ([#15952](jestjs/jest#15952))
- `[fake-timers]` Convert `Date` to milliseconds before passing to `@sinonjs/fake-timers` ([#16029](jestjs/jest#16029))
- `[jest]` Export `GlobalConfig` and `ProjectConfig` TypeScript types ([#16132](jestjs/jest#16132))
- `[jest-circus]` Prevent crash when `asyncError` is undefined for non-Error throws ([#16003](jestjs/jest#16003))
- `[jest-circus, jest-jasmine2]` Include `Error.cause` in JSON `failureMessages` output ([#15967](jestjs/jest#15967))
- `[jest-config]` Fix preset path resolution on Windows when the preset uses subpath `exports` ([#15961](jestjs/jest#15961))
- `[jest-config]` Allow `collectCoverage` and `coverageProvider` in project config without a validation warning ([#16132](jestjs/jest#16132))
- `[jest-config]` Project config validator now emits "is not supported in an individual project configuration" instead of "probably a typing mistake" for known global-only options ([#16132](jestjs/jest#16132))
- `[jest-environment-node]` Fix `--localstorage-file` warning on Node 25+ ([#16086](jestjs/jest#16086))
- `[jest-reporters]` Apply global coverage threshold to unmatched pattern files in addition to glob/path thresholds ([#16137](jestjs/jest#16137))
- `[jest-reporters, jest-runner, jest-runtime, jest-transform]` Fix coverage report not showing correct code coverage when using `projects` config option ([#16140](jestjs/jest#16140))
- `[jest-runtime]` Resolve `expect` and `@jest/expect` from the internal module registry so test-file imports share the same `JestAssertionError` as the global `expect` ([#16130](jestjs/jest#16130))
- `[jest-runtime]` Improve CJS-from-ESM interop: `__esModule`/Babel default unwrap, broader named-export coverage, and shared CJS singleton across importers ([#16050](jestjs/jest#16050))
- `[jest-runtime]` Load `.js` files with ESM syntax but no `"type":"module"` marker as native ESM ([#16050](jestjs/jest#16050))
- `[jest-runtime]` Extend the `.js`-with-ESM-syntax fallback to `require()` on Node v24.9+ - falls back to `require(esm)` when the CJS parser rejects ESM syntax ([#16078](jestjs/jest#16078))
- `[jest-runtime]` Fix deadlocks and double-evaluation in concurrent ESM and wasm imports ([#16050](jestjs/jest#16050))
- `[jest-runtime]` Fix error when `require()` is called after the Jest environment has been torn down ([#15951](jestjs/jest#15951))
- `[jest-runtime]` Fix missing error when `import()` is called after the Jest environment has been torn down ([#16080](jestjs/jest#16080))
- `[jest-runtime]` Fix virtual `unstable_mockModule` registrations not respected in ESM ([#16081](jestjs/jest#16081))
- `[jest-runtime]` Apply `moduleNameMapper` when resolving modules with `require.resolve()` and the `paths` option ([#16135](jestjs/jest#16135))

##### Chore & Maintenance

- `[@jest/fake-timers]` Upgrade `@sinonjs/fake-timers` ([#16139](jestjs/jest#16139))
- `[jest-runtime]` Use synchronous `linkRequests` / `instantiate` for ESM linking on Node v24.9+ ([#16063](jestjs/jest#16063))
renovate Bot added a commit to andrei-picus-tink/auto-renovate that referenced this pull request May 10, 2026
| datasource | package | from   | to     |
| ---------- | ------- | ------ | ------ |
| npm        | jest    | 30.3.0 | 30.4.2 |


## [v30.4.2](https://github.com/jestjs/jest/blob/HEAD/CHANGELOG.md#3042)

##### Fixes

- `[jest-runtime]` Fix named imports from CJS modules whose `module.exports` is a function with own-property exports ([#16150](jestjs/jest#16150))


## [v30.4.1](https://github.com/jestjs/jest/blob/HEAD/CHANGELOG.md#3041)

##### Features

- `[jest-config, jest-core, jest-runner, jest-schemas, jest-types]` Allow custom runner configuration options via tuple format `['runner-path', {options}]` ([#16141](jestjs/jest#16141))

##### Fixes

- `[jest-runtime]` Align CJS-from-ESM default export with Node: `module.exports` is always the ESM default, `__esModule` unwrapping is no longer applied ([#16143](jestjs/jest#16143))


## [v30.4.0](https://github.com/jestjs/jest/blob/HEAD/CHANGELOG.md#3040)

##### Features

- `[babel-jest]` Support collecting coverage from `.mts`, `.cts` (and other) files ([#15994](jestjs/jest#15994))
- `[jest-circus, jest-cli, jest-config, jest-core, jest-jasmine2, jest-types]` Add `--collect-tests` flag to discover and list tests without executing them ([#16006](jestjs/jest#16006))
- `[jest-config, jest-runner, jest-worker]` Add `workerGracefulExitTimeout` config option to control how long workers are given to exit before being force-killed ([#15984](jestjs/jest#15984))
- `[jest-config]` Add support for `jest.config.mts` as a valid configuration file ([#16005](jestjs/jest#16005))
- `[jest-config, jest-core, jest-reporters, jest-runner]` `verbose` and `silent` can now be set per-project; the project-level value overrides the global value for that project's tests ([#16133](jestjs/jest#16133))
- `[@jest/fake-timers]` Accept `Temporal.Duration` in `jest.advanceTimersByTime()` and `jest.advanceTimersByTimeAsync()` ([#16128](jestjs/jest#16128))
- `[@jest/fake-timers]` Accept `Temporal.Instant` and `Temporal.ZonedDateTime` in `jest.setSystemTime()` and `useFakeTimers({now})` ([#16128](jestjs/jest#16128))
- `[@jest/fake-timers]` Support faking `Temporal.Now.*` ([#16131](jestjs/jest#16131))
- `[jest-mock]` Add `clearMocksOnScope(scope)` on `ModuleMocker` for clearing every mock function exposed on a scope object ([#16088](jestjs/jest#16088))
- `[jest-resolve]` Add `canResolveSync()` on `Resolver` so callers can detect when a user-configured resolver only exports an `async` hook ([#16064](jestjs/jest#16064))
- `[jest-runtime]` Use synchronous `evaluate()` for ES modules without top-level `await` on Node versions that support it (v24.9+), and prefer the synchronous transform path when a sync transformer is configured ([#16062](jestjs/jest#16062))
- `[jest-runtime]` Support `require()` of ES modules on Node v24.9+ ([#16074](jestjs/jest#16074))
- `[jest-runtime]` Validate TC39 import attributes (`with { type: 'json' }`) on ESM imports ([#16127](jestjs/jest#16127))
- `[@jest/transform]` Add `canTransformSync(filename)` on `ScriptTransformer` so callers can pick the sync vs async transform path ([#16062](jestjs/jest#16062))
- `[jest-util]` Add `isError` helper ([#16076](jestjs/jest#16076))
- `[pretty-format]` Support React 19 ([#16123](jestjs/jest#16123))

##### Fixes

- `[expect-utils]` Fix `toStrictEqual` failing on `structuredClone` results due to cross-realm constructor mismatch ([#15959](jestjs/jest#15959))
- `[@jest/expect-utils]` Prevent `toMatchObject`/subset matching from throwing when encountering exotic iterables ([#15952](jestjs/jest#15952))
- `[fake-timers]` Convert `Date` to milliseconds before passing to `@sinonjs/fake-timers` ([#16029](jestjs/jest#16029))
- `[jest]` Export `GlobalConfig` and `ProjectConfig` TypeScript types ([#16132](jestjs/jest#16132))
- `[jest-circus]` Prevent crash when `asyncError` is undefined for non-Error throws ([#16003](jestjs/jest#16003))
- `[jest-circus, jest-jasmine2]` Include `Error.cause` in JSON `failureMessages` output ([#15967](jestjs/jest#15967))
- `[jest-config]` Fix preset path resolution on Windows when the preset uses subpath `exports` ([#15961](jestjs/jest#15961))
- `[jest-config]` Allow `collectCoverage` and `coverageProvider` in project config without a validation warning ([#16132](jestjs/jest#16132))
- `[jest-config]` Project config validator now emits "is not supported in an individual project configuration" instead of "probably a typing mistake" for known global-only options ([#16132](jestjs/jest#16132))
- `[jest-environment-node]` Fix `--localstorage-file` warning on Node 25+ ([#16086](jestjs/jest#16086))
- `[jest-reporters]` Apply global coverage threshold to unmatched pattern files in addition to glob/path thresholds ([#16137](jestjs/jest#16137))
- `[jest-reporters, jest-runner, jest-runtime, jest-transform]` Fix coverage report not showing correct code coverage when using `projects` config option ([#16140](jestjs/jest#16140))
- `[jest-runtime]` Resolve `expect` and `@jest/expect` from the internal module registry so test-file imports share the same `JestAssertionError` as the global `expect` ([#16130](jestjs/jest#16130))
- `[jest-runtime]` Improve CJS-from-ESM interop: `__esModule`/Babel default unwrap, broader named-export coverage, and shared CJS singleton across importers ([#16050](jestjs/jest#16050))
- `[jest-runtime]` Load `.js` files with ESM syntax but no `"type":"module"` marker as native ESM ([#16050](jestjs/jest#16050))
- `[jest-runtime]` Extend the `.js`-with-ESM-syntax fallback to `require()` on Node v24.9+ - falls back to `require(esm)` when the CJS parser rejects ESM syntax ([#16078](jestjs/jest#16078))
- `[jest-runtime]` Fix deadlocks and double-evaluation in concurrent ESM and wasm imports ([#16050](jestjs/jest#16050))
- `[jest-runtime]` Fix error when `require()` is called after the Jest environment has been torn down ([#15951](jestjs/jest#15951))
- `[jest-runtime]` Fix missing error when `import()` is called after the Jest environment has been torn down ([#16080](jestjs/jest#16080))
- `[jest-runtime]` Fix virtual `unstable_mockModule` registrations not respected in ESM ([#16081](jestjs/jest#16081))
- `[jest-runtime]` Apply `moduleNameMapper` when resolving modules with `require.resolve()` and the `paths` option ([#16135](jestjs/jest#16135))

##### Chore & Maintenance

- `[@jest/fake-timers]` Upgrade `@sinonjs/fake-timers` ([#16139](jestjs/jest#16139))
- `[jest-runtime]` Use synchronous `linkRequests` / `instantiate` for ESM linking on Node v24.9+ ([#16063](jestjs/jest#16063))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Code coverage is missing when using projects, if each project's rootDir is not set to the root rootDir's value

3 participants