Skip to content

Add --collect-only flag to list tests without running them#16006

Merged
SimenB merged 7 commits into
jestjs:mainfrom
alexander-turner:claude/add-jest-collect-only-2ea6Q
Apr 30, 2026
Merged

Add --collect-only flag to list tests without running them#16006
SimenB merged 7 commits into
jestjs:mainfrom
alexander-turner:claude/add-jest-collect-only-2ea6Q

Conversation

@alexander-turner
Copy link
Copy Markdown
Contributor

@alexander-turner alexander-turner commented Mar 25, 2026

Summary

The --collect-tests flag discovers and reports all test cases without executing any test callbacks — similar to pytest's --collect-only. Complements the existing --list-tests (which lists test files) by looking inside files to list individual test cases.

Running jest --collect-tests loads test files and registers all describe/test/it blocks, then prints a tree of discovered tests and exits with code 0:

src/tests/math.test.ts
  add
    adds positive numbers
    adds negative numbers
  subtract
    subtracts positive numbers

With --json, it outputs the standard formatTestResults JSON format with all tests marked as pending. Works with --testNamePattern and --testPathPatterns for filtering.

Implementation

  • jest-cli / jest-config / jest-types / jest-schemas: Thread collectTests as a GlobalConfig boolean option
  • jest-circus: After loading test files, the adapter calls collectTestsWithoutRunning() which walks the describe tree recursively, filters by testNamePattern using the existing getTestID utility, and returns all matching tests as pending assertion results
  • jest-jasmine2: Equivalent support — walks the jasmine suite tree via env.topSuite(), collects specs with ancestor titles, and filters by testNamePattern
  • jest-core: runJest schedules tests with reporters suppressed and coverage disabled, prints the tree via VerboseReporter.groupTestsBySuites, and delegates JSON/file output to the existing processResults helper
  • jest-circus/utils: Exports the previously-private getTestNamesPath for use by the collection function

Testing

  • E2e tests (e2e/__tests__/collectTests.test.ts) using the existing e2e/each fixture verify: tree output, valid JSON structure, --testNamePattern filtering, empty result handling, and that deliberately failing tests still exit 0 (confirming no execution). Pass under both jest-circus and jest-jasmine2.
  • Unit tests (collectTestsWithoutRunning.test.ts) verify: flat/nested collection, ancestor titles, source order preservation across describe blocks, testNamePattern filtering, and empty results
  • Updated logDebugMessages snapshot for the new config key

@netlify
Copy link
Copy Markdown

netlify Bot commented Mar 25, 2026

Deploy Preview for jestjs ready!

Name Link
🔨 Latest commit be76e52
🔍 Latest deploy log https://app.netlify.com/projects/jestjs/deploys/69f2e3ad6348280008f0e864
😎 Deploy Preview https://deploy-preview-16006--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.

@linux-foundation-easycla
Copy link
Copy Markdown

linux-foundation-easycla Bot commented Mar 25, 2026

CLA Signed

The committers listed above are authorized under a signed CLA.

@pkg-pr-new
Copy link
Copy Markdown

pkg-pr-new Bot commented Mar 27, 2026

Open in StackBlitz

babel-jest

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

babel-plugin-jest-hoist

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

babel-preset-jest

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

create-jest

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

@jest/diff-sequences

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

expect

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

@jest/expect-utils

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

jest

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

jest-changed-files

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

jest-circus

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

jest-cli

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

jest-config

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

@jest/console

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

@jest/core

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

@jest/create-cache-key-function

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

jest-diff

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

jest-docblock

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

jest-each

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

@jest/environment

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

jest-environment-jsdom

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

@jest/environment-jsdom-abstract

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

jest-environment-node

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

@jest/expect

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

@jest/fake-timers

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

@jest/get-type

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

@jest/globals

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

jest-haste-map

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

jest-jasmine2

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

jest-leak-detector

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

jest-matcher-utils

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

jest-message-util

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

jest-mock

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

@jest/pattern

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

jest-phabricator

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

jest-regex-util

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

@jest/reporters

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

jest-resolve

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

jest-resolve-dependencies

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

jest-runner

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

jest-runtime

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

@jest/schemas

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

jest-snapshot

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

@jest/snapshot-utils

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

@jest/source-map

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

@jest/test-result

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

@jest/test-sequencer

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

@jest/transform

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

@jest/types

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

jest-util

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

jest-validate

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

jest-watcher

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

jest-worker

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

pretty-format

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

commit: be76e52

alexander-turner added a commit to alexander-turner/jest that referenced this pull request Mar 27, 2026
- Fix bug: stack-based (LIFO) traversal reversed describe block order;
  switch back to recursive traversal to preserve source order
- Fix CHANGELOG link: point to jestjs#16006 not fork PR
- Disable coverage collection in collectOnly mode (wasted work)
- Add "preserves source order" regression test
- Tighten unit tests: simplify helper, remove over-assertions,
  extract collect() shorthand, reduce from 111 to 96 lines

https://claude.ai/code/session_018SbTXFCAujDRRjBFtMTFXU
@alexander-turner alexander-turner force-pushed the claude/add-jest-collect-only-2ea6Q branch from fc5fefe to 44b35ce Compare March 27, 2026 16:52
@SimenB
Copy link
Copy Markdown
Member

SimenB commented Mar 27, 2026

Thanks for the PR!

we have --list-tests already (which just lists the test files, doesn't look in them). should this be --collect-tests to keep somewhat the same name?

@alexander-turner alexander-turner force-pushed the claude/add-jest-collect-only-2ea6Q branch from a0e9f1d to 129e6a1 Compare March 31, 2026 17:22
@alexander-turner alexander-turner changed the title Add --collectOnly flag to list tests without running them Add --collect-only flag to list tests without running them Mar 31, 2026
@alexander-turner alexander-turner force-pushed the claude/add-jest-collect-only-2ea6Q branch 4 times, most recently from 2d2a5b3 to de23b06 Compare April 1, 2026 01:01
@alexander-turner
Copy link
Copy Markdown
Contributor Author

@SimenB Thanks for the feedback; integrated. Thoughts?

@alexander-turner alexander-turner force-pushed the claude/add-jest-collect-only-2ea6Q branch from 2020562 to 5d6726d Compare April 1, 2026 17:16
@alexander-turner alexander-turner force-pushed the claude/add-jest-collect-only-2ea6Q branch from 5d6726d to 06b748f Compare April 1, 2026 17:22
@alexander-turner
Copy link
Copy Markdown
Contributor Author

Update on this?

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!

I don't think we necessarily need to support this for jasmine, but doesn't make sense to remove it since you've done the work 🙂

Could you add some docs as well?

@SimenB
Copy link
Copy Markdown
Member

SimenB commented Apr 29, 2026

Easy enough to add docs myself, haha.

Thanks for this! And sorry for the slow response

@SimenB
Copy link
Copy Markdown
Member

SimenB commented Apr 29, 2026

Bah. Afk now, will update when I'm next in front of a computer 😀

@SimenB SimenB merged commit dcd3c79 into jestjs:main Apr 30, 2026
73 of 74 checks passed
@alexander-turner alexander-turner deleted the claude/add-jest-collect-only-2ea6Q branch May 4, 2026 16:51
@SimenB
Copy link
Copy Markdown
Member

SimenB commented May 7, 2026

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.

2 participants