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

Skip to content

fix(jest-reporters): apply global coverage threshold to unmatched pattern files#16137

Merged
SimenB merged 2 commits into
jestjs:mainfrom
ahnpnl:fix/coverage-threshold-5247
May 7, 2026
Merged

fix(jest-reporters): apply global coverage threshold to unmatched pattern files#16137
SimenB merged 2 commits into
jestjs:mainfrom
ahnpnl:fix/coverage-threshold-5247

Conversation

@ahnpnl
Copy link
Copy Markdown
Contributor

@ahnpnl ahnpnl commented May 7, 2026

Summary

Test plan

  • Added e2e tests for coverage threshold behavior with unmatched files
  • Updated existing snapshot tests

@netlify
Copy link
Copy Markdown

netlify Bot commented May 7, 2026

Deploy Preview for jestjs ready!

Name Link
🔨 Latest commit 65120bc
🔍 Latest deploy log https://app.netlify.com/projects/jestjs/deploys/69fc7056eb8279000807055e
😎 Deploy Preview https://deploy-preview-16137--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@16137

babel-plugin-jest-hoist

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

babel-preset-jest

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

create-jest

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

@jest/diff-sequences

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

expect

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

@jest/expect-utils

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

jest

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

jest-changed-files

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

jest-circus

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

jest-cli

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

jest-config

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

@jest/console

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

@jest/core

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

@jest/create-cache-key-function

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

jest-diff

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

jest-docblock

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

jest-each

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

@jest/environment

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

jest-environment-jsdom

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

@jest/environment-jsdom-abstract

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

jest-environment-node

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

@jest/expect

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

@jest/fake-timers

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

@jest/get-type

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

@jest/globals

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

jest-haste-map

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

jest-jasmine2

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

jest-leak-detector

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

jest-matcher-utils

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

jest-message-util

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

jest-mock

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

@jest/pattern

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

jest-phabricator

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

jest-regex-util

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

@jest/reporters

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

jest-resolve

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

jest-resolve-dependencies

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

jest-runner

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

jest-runtime

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

@jest/schemas

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

jest-snapshot

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

@jest/snapshot-utils

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

@jest/source-map

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

@jest/test-result

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

@jest/test-sequencer

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

@jest/transform

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

@jest/types

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

jest-util

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

jest-validate

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

jest-watcher

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

jest-worker

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

pretty-format

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

commit: 900aa45

@ahnpnl ahnpnl marked this pull request as ready for review May 7, 2026 05:21
@SimenB
Copy link
Copy Markdown
Member

SimenB commented May 7, 2026

Fixing an issue from 2018, I love it 😀

Copilot AI review requested due to automatic review settings May 7, 2026 05:27
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

Note

Copilot was unable to run its full agentic suite in this review.

Updates Jest’s coverage threshold enforcement so the global threshold is applied consistently when threshold patterns (globs/paths) are present, and refreshes tests/docs to reflect the new behavior.

Changes:

  • Apply the global coverage threshold to all covered files (rather than only a subset derived from threshold grouping).
  • Update unit + e2e tests and snapshots to validate the revised threshold behavior and updated error text.
  • Expand configuration documentation and add a changelog entry.

Reviewed changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated 8 comments.

Show a summary per file
File Description
packages/jest-reporters/src/tests/CoverageReporter.test.js Migrates threshold tests to async/await and adjusts expectations for updated behavior.
packages/jest-reporters/src/CoverageReporter.ts Changes threshold grouping so global is handled separately and computed from all covered files; updates error message wording.
e2e/tests/coverageThreshold.test.ts Adds/updates e2e cases for global threshold behavior with glob/path thresholds.
e2e/tests/snapshots/coverageThreshold.test.ts.snap Updates snapshots for new error messages and new e2e scenarios.
docs/Configuration.md Reworks coverageThreshold documentation (but currently contradicts the new behavior in-code).
CHANGELOG.md Documents the reporter behavior change.

Comment thread packages/jest-reporters/src/CoverageReporter.ts Outdated
Comment thread docs/Configuration.md
Comment thread docs/Configuration.md Outdated
Comment thread packages/jest-reporters/src/__tests__/CoverageReporter.test.js Outdated
Comment thread packages/jest-reporters/src/__tests__/CoverageReporter.test.js Outdated
Comment thread packages/jest-reporters/src/__tests__/CoverageReporter.test.js Outdated
Comment thread e2e/__tests__/coverageThreshold.test.ts Outdated
Comment thread e2e/__tests__/coverageThreshold.test.ts Outdated
const coverage = combineCoverage(
getFilesInThresholdGroup(THRESHOLD_GROUP_TYPES.GLOBAL),
);
// Global threshold applies to ALL covered files
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I don't think this is the correct behaviour.

Before this PR, global was computed only over files that weren't claimed by a path/glob threshold - the "everything else" bucket. After, it's combineCoverage(coveredFiles), i.e. the full file list, so global now re-checks files that already have their own path/glob threshold.

I think this breaks anyone who relied on the subtraction semantics. If you had:

coverageThreshold: {
  'src/critical.js': {lines: 100},
  global: {lines: 80},
}

The intent was "critical.js must hit 100%, and the rest of the codebase must average 80%." After this PR, global also folds src/critical.js back into its aggregate. This is both a breaking change and I believe the wrong behaviour.

Failing test:

test("getLastError() returns 'undefined' when all files are matched by a path threshold and the global threshold would only fail if applied to those same files", async () => {
  const testReporter = new CoverageReporter(
    {
      collectCoverage: true,
      coverageThreshold: {
        './path-test-files/': {
          statements: 0, // passes for every file in the mock data
        },
        global: {
          statements: 100, // ~50% aggregate would fail if applied to all files
        },
      },
    },
    {maxWorkers: 2},
  );
  testReporter.log = jest.fn();

  await testReporter.onRunComplete(new Set(), mockAggResults);

  expect(testReporter.getLastError()).toBeUndefined();
});

What about something like this?

case THRESHOLD_GROUP_TYPES.GLOBAL: {
  const globalFiles = getFilesInThresholdGroup(
    THRESHOLD_GROUP_TYPES.GLOBAL,
  );
  const coverage = combineCoverage(
    globalFiles.length > 0 ? globalFiles : coveredFiles,
  );

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

pushed the change, would you pls check again?

Comment thread packages/jest-reporters/src/__tests__/CoverageReporter.test.js
@ahnpnl ahnpnl force-pushed the fix/coverage-threshold-5247 branch 6 times, most recently from 60a2ac0 to 3307696 Compare May 7, 2026 08:38
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.

LGTM minus tiny typo. Thanks!

Could you also add a unit test that fails if the threshold is below? would assert the same as the e2e test, but still valuable I think 🙂 I think just the test you changed threshold from 100 to 50, but asserting that it _fails`

Comment thread e2e/__tests__/coverageThreshold.test.ts Outdated
});

test('excludes tests matched by path threshold groups from global group', () => {
test('exists with 1 if coverage threshold of the rest of non matched paths is not met', () => {
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Suggested change
test('exists with 1 if coverage threshold of the rest of non matched paths is not met', () => {
test('exits with 1 if coverage threshold of the rest of non matched paths is not met', () => {

same for the other one

Copy link
Copy Markdown
Contributor Author

@ahnpnl ahnpnl May 7, 2026

Choose a reason for hiding this comment

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

done ✅

@ahnpnl ahnpnl force-pushed the fix/coverage-threshold-5247 branch from 3307696 to a2b7ba5 Compare May 7, 2026 09:04
@ahnpnl ahnpnl force-pushed the fix/coverage-threshold-5247 branch from a2b7ba5 to 900aa45 Compare May 7, 2026 09:06
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!

@SimenB SimenB merged commit 79876b0 into jestjs:main May 7, 2026
8 of 9 checks passed
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))
@ahnpnl ahnpnl deleted the fix/coverage-threshold-5247 branch May 8, 2026 07:00
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.

Global and single file coverage thresholds

3 participants