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

Skip to content

chore(runtime): final pass for splitting up god class#16088

Merged
SimenB merged 18 commits into
jestjs:mainfrom
SimenB:jest-runtime-cleanups
May 3, 2026
Merged

chore(runtime): final pass for splitting up god class#16088
SimenB merged 18 commits into
jestjs:mainfrom
SimenB:jest-runtime-cleanups

Conversation

@SimenB
Copy link
Copy Markdown
Member

@SimenB SimenB commented May 3, 2026

Summary

Had Claude do a final pass to see if we could clarify code flow to make it more obvious. it had a few suggestions - all committed as separate PRs

Test plan

Green CI

Copilot AI review requested due to automatic review settings May 3, 2026 11:44
@netlify
Copy link
Copy Markdown

netlify Bot commented May 3, 2026

Deploy Preview for jestjs ready!

Name Link
🔨 Latest commit 5e45970
🔍 Latest deploy log https://app.netlify.com/projects/jestjs/deploys/69f744952065b2000846078f
😎 Deploy Preview https://deploy-preview-16088--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 3, 2026

Open in StackBlitz

babel-jest

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

babel-plugin-jest-hoist

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

babel-preset-jest

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

create-jest

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

@jest/diff-sequences

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

expect

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

@jest/expect-utils

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

jest

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

jest-changed-files

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

jest-circus

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

jest-cli

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

jest-config

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

@jest/console

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

@jest/core

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

@jest/create-cache-key-function

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

jest-diff

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

jest-docblock

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

jest-each

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

@jest/environment

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

jest-environment-jsdom

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

@jest/environment-jsdom-abstract

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

jest-environment-node

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

@jest/expect

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

@jest/fake-timers

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

@jest/get-type

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

@jest/globals

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

jest-haste-map

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

jest-jasmine2

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

jest-leak-detector

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

jest-matcher-utils

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

jest-message-util

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

jest-mock

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

@jest/pattern

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

jest-phabricator

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

jest-regex-util

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

@jest/reporters

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

jest-resolve

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

jest-resolve-dependencies

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

jest-runner

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

jest-runtime

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

@jest/schemas

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

jest-snapshot

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

@jest/snapshot-utils

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

@jest/source-map

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

@jest/test-result

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

@jest/test-sequencer

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

@jest/transform

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

@jest/types

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

jest-util

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

jest-validate

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

jest-watcher

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

jest-worker

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

pretty-format

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

commit: 01b78b7

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

Refactors jest-runtime internals to make execution/test-lifecycle flow more explicit by extracting test lifecycle tracking into a dedicated TestState object, while also tightening a few internal call paths (mock dispatch, manual-mock resolution, CJS export analysis) and updating tests accordingly.

Changes:

  • Introduce TestState and thread it through Runtime, CjsLoader, EsmLoader, and JestGlobals to centralize “between tests” / “torn down” gating.
  • Update MockState to return {shouldMock, moduleID} from sync mock-decision APIs and reuse moduleID in mock dispatch; move generateMock into MockState.
  • Reshape CjsExportsCache construction + API to take options (incl. transformCache) and propagate importer context; cache Resolution.findManualMock; add ModuleMocker.clearMocksOnScope and use it in Runtime.resetModules.

Reviewed changes

Copilot reviewed 27 out of 27 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
packages/jest-runtime/src/internals/syntheticBuilders.ts Update CJS-as-ESM synthetic export analysis to pass importer into CjsExportsCache.
packages/jest-runtime/src/internals/cjsRequire.ts Rename “Deps” shapes to “Options” and adjust constructors accordingly.
packages/jest-runtime/src/internals/automock.ts Remove standalone automock helper module (logic relocated).
packages/jest-runtime/src/internals/tests/automock.test.ts Remove tests for deleted automock module (coverage moved).
packages/jest-runtime/src/internals/tests/TestState.test.ts Add unit tests for the new TestState lifecycle/gating behavior.
packages/jest-runtime/src/internals/tests/Resolution.test.ts Add coverage for findManualMock behavior + caching; mock graceful-fs.existsSync.
packages/jest-runtime/src/internals/tests/ModuleRegistries.test.ts Update test to match ModuleRegistries CJS registry API change.
packages/jest-runtime/src/internals/tests/ModuleExecutor.test.ts Update type name used by tests (ModuleExecutorOptions).
packages/jest-runtime/src/internals/tests/MockState.test.ts Update for new {shouldMock, moduleID} return shape; add generateMock tests.
packages/jest-runtime/src/internals/tests/JestGlobals.test.ts Update to inject TestState instance instead of getTestState callback.
packages/jest-runtime/src/internals/tests/EsmLoader.test.ts Update to inject TestState instance and validate torn-down gating.
packages/jest-runtime/src/internals/tests/CjsLoader.test.ts Update to inject TestState instance and validate torn-down gating.
packages/jest-runtime/src/internals/tests/CjsExportsCache.test.ts Update for new constructor/options + new getExportsOf(from, modulePath) signature.
packages/jest-runtime/src/internals/TestState.ts New TestState implementation (lifecycle + gating helpers).
packages/jest-runtime/src/internals/Resolution.ts Add manual-mock cache; factor mock resolution into cached wrapper + compute helper.
packages/jest-runtime/src/internals/ModuleRegistries.ts Split “active” vs “internal” CJS registry accessors.
packages/jest-runtime/src/internals/ModuleExecutor.ts Rename “Deps” interface to “Options” and adjust constructor param naming.
packages/jest-runtime/src/internals/MockState.ts Return moduleID with sync mock decisions; move generateMock here.
packages/jest-runtime/src/internals/JestGlobals.ts Replace getTestState() with TestState; cache environment globals snapshot.
packages/jest-runtime/src/internals/EsmLoader.ts Replace test-state callbacks with TestState; thread moduleID into mock import path.
packages/jest-runtime/src/internals/CjsLoader.ts Replace test-state callbacks with TestState; update CJS registry selection API.
packages/jest-runtime/src/internals/CjsExportsCache.ts Convert to options-based construction; include transform cache; propagate importer to loaders.
packages/jest-runtime/src/index.ts Wire new TestState; update mock dispatch to reuse moduleID; use clearMocksOnScope.
packages/jest-runtime/src/tests/runtime_require_module_or_mock.test.js Add assertion that dispatch computes moduleID once per requireModuleOrMock call.
packages/jest-mock/src/index.ts Add ModuleMocker.clearMocksOnScope helper used by runtime to clear global mocks.
packages/jest-mock/src/tests/index.test.ts Add unit tests for clearMocksOnScope.
CHANGELOG.md Add changelog entry documenting jest-mock’s new clearMocksOnScope.

Comment thread packages/jest-mock/src/index.ts Outdated
@SimenB SimenB changed the title extract test state chore(runtime): final pass for splitting up god class May 3, 2026
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 29 out of 29 changed files in this pull request and generated 3 comments.

Comment thread packages/jest-runtime/src/internals/MockState.ts Outdated
Comment thread packages/jest-runtime/src/internals/MockState.ts Outdated
Comment thread packages/jest-runtime/src/internals/CjsExportsCache.ts Outdated
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 29 out of 29 changed files in this pull request and generated 1 comment.

Comment thread packages/jest-runtime/src/internals/Resolution.ts Outdated
@SimenB SimenB merged commit f768319 into jestjs:main May 3, 2026
45 checks passed
@SimenB SimenB deleted the jest-runtime-cleanups branch May 3, 2026 12:58
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))
t-i-0414 added a commit to t-i-0414/music-practice-tracker that referenced this pull request May 11, 2026
Jest 30.4.0's jest-runtime calls `_moduleMocker.clearMocksOnScope()` (added
in PR jestjs/jest#16088), but [email protected] still depends on
jest-environment-node@^29.7.0, which provides an older ModuleMocker missing
this method. The mismatch caused every Jest test in apps/backend and
apps/mobile to fail with:

  TypeError: this._moduleMocker.clearMocksOnScope is not a function

Add a top-level `overrides` entry pinning jest-environment-node to 30.4.0
so transitive consumers (notably react-native's jest preset) resolve a
compatible TestEnvironment. Verified locally: mobile unit tests pass
(44/44), and the Jest mocker error is gone in backend.

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
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