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

Skip to content

fix(jest-runtime): align CJS-from-ESM default with Node, drop __esModule unwrapping#16143

Merged
SimenB merged 4 commits into
jestjs:mainfrom
SimenB:cjs-default
May 8, 2026
Merged

fix(jest-runtime): align CJS-from-ESM default with Node, drop __esModule unwrapping#16143
SimenB merged 4 commits into
jestjs:mainfrom
SimenB:cjs-default

Conversation

@SimenB
Copy link
Copy Markdown
Member

@SimenB SimenB commented May 8, 2026

Summary

Fixes #16142

Test plan

Unit tests added

Copilot AI review requested due to automatic review settings May 8, 2026 07:25
@netlify
Copy link
Copy Markdown

netlify Bot commented May 8, 2026

Deploy Preview for jestjs ready!

Name Link
🔨 Latest commit 59bde21
🔍 Latest deploy log https://app.netlify.com/projects/jestjs/deploys/69fd97e69bec1e00084b5e5c
😎 Deploy Preview https://deploy-preview-16143--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 8, 2026

Open in StackBlitz

babel-jest

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

babel-plugin-jest-hoist

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

babel-preset-jest

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

create-jest

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

@jest/diff-sequences

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

expect

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

@jest/expect-utils

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

jest

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

jest-changed-files

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

jest-circus

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

jest-cli

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

jest-config

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

@jest/console

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

@jest/core

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

@jest/create-cache-key-function

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

jest-diff

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

jest-docblock

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

jest-each

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

@jest/environment

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

jest-environment-jsdom

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

@jest/environment-jsdom-abstract

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

jest-environment-node

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

@jest/expect

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

@jest/fake-timers

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

@jest/get-type

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

@jest/globals

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

jest-haste-map

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

jest-jasmine2

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

jest-leak-detector

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

jest-matcher-utils

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

jest-message-util

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

jest-mock

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

@jest/pattern

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

jest-phabricator

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

jest-regex-util

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

@jest/reporters

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

jest-resolve

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

jest-resolve-dependencies

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

jest-runner

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

jest-runtime

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

@jest/schemas

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

jest-snapshot

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

@jest/snapshot-utils

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

@jest/source-map

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

@jest/test-result

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

@jest/test-sequencer

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

@jest/transform

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

@jest/types

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

jest-util

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

jest-validate

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

jest-watcher

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

jest-worker

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

pretty-format

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

commit: 59bde21

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

Fixes a Jest runtime regression in CJS→ESM interop where CJS modules that set __esModule: true but do not provide a .default export (e.g. tslib) ended up with an undefined ESM default export, breaking default-import consumers under VM ESM.

Changes:

  • Adjust buildCjsAsEsmSyntheticModule to only unwrap the ESM default to exports.default when a .default property is present.
  • Add VM ESM unit coverage for __esModule CJS modules without .default, asserting both default and named exports behavior.
  • Add a CHANGELOG.md fix entry for jest-runtime.

Reviewed changes

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

Show a summary per file
File Description
packages/jest-runtime/src/internals/syntheticBuilders.ts Updates CJS-as-ESM default export selection logic for __esModule modules missing .default.
packages/jest-runtime/src/tests/test_esm_interop_root/import-esmodule-no-default.mjs Adds an ESM entry point that re-exports from a __esModule CJS fixture with no .default.
packages/jest-runtime/src/tests/test_esm_interop_root/esmodule-no-default.cjs Adds a CJS fixture that sets __esModule and exports only named helpers (tslib-like).
packages/jest-runtime/src/tests/runtime_esm_cjs_interop.test.ts Adds unit tests validating correct default and named exports for tslib-style modules.
CHANGELOG.md Documents the regression fix under ## main### Fixes.

Comment thread packages/jest-runtime/src/internals/syntheticBuilders.ts Outdated
Comment on lines +139 to +146
// Honors the Babel/Webpack __esModule convention: when the CJS module sets
// __esModule and has an explicit .default property, use that as the ESM
// default. We only unwrap when 'default' is actually present — packages like
// tslib set __esModule without a .default, so without the 'in' guard their
// named exports (e.g. __extends) would become unreachable via the default.
// Note: Node core never applies this convention; it always exposes the whole
// module.exports as the ESM default. Jest diverges intentionally for
// backward compatibility with Babel-compiled code.
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

I'm thinking we align with Node in Jest 31. But it's a breaking change

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

or actually - the code was only added in #16050. Probably better to not diverge from Node at all in this case

Copy link
Copy Markdown
Member Author

@SimenB SimenB May 8, 2026

Choose a reason for hiding this comment

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

@jmuransky hello! Just FYI that I've removed the interop handling added in #16050 as it diverges from Node behaviour 🙂 First commit in this PR had a fix for it, but I think it's better to align with Node behaviour. I think we'll need to consider diverging from Node in a broader context rather than part of require(esm).

If we need the interop to better align with bundlers then that's probably a runtime option somehow rather than something we apply by default. Could quite easily be a project config option

Copy link
Copy Markdown
Contributor

@jmuransky jmuransky May 8, 2026

Choose a reason for hiding this comment

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

I understand. Sure it makes perfect sense to align with Node behavior.
I will just try out current version and see if it works against my project, because I remember I added that in because it was breaking my real use case back then with that version of the code

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

It might not align with bundlers tho. but yeah, needs some thinking about 🙂

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

It seems like a fully unrelated.

I probably just need to use new version of JSDOM (I have frozen version just for testing this feature and I am not updating anything but jest). So this error at most could result in system warning user to actually use newer JSDOM (nicer error message) and that's it. I'll try things out again once I update my dependencies

Copy link
Copy Markdown
Contributor

@jmuransky jmuransky May 8, 2026

Choose a reason for hiding this comment

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

Alright. With new JSDOM I no longer have crashes. On the other hand I do get the original error (and the reason why I wrote the unwrapping). Specifically running jest on the mixed cjs-esm repository ends up with specifically:

import thunk from 'redux-thunk'

returning to me wrapper instead of actual default function (on said frozen project, the version of redux-thunk is 2.4.2 ).

As a side note - running the project within browser works. So there is a difference between jest runtime and webpack/browser resolution.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

@SimenB should I look into this and make a fix that work both both cases (one that made you write this PR and my case)? Or you want to take care of this?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Oh sorry, missed your comments here! Please file an issue, yeah. Ideally with a reproduction 😀 but obviously feel free to attempt a fix as well 🙂 but note that if it's purely unwrapping the interop I think we'd need an option added to ProjectConfig. Bundlers apply the interop usually, but that's not really following a spec - more for backwards compat.

That said, it seems redux-thunk has a native ESM file: https://www.runpkg.com/[email protected]/package.json#24. Odd we don't pick that up 🤔

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Right. I created an issue for this: #16144

Might be version 3.1 works. What I am using for testing is not latest version of the project, but old one I deliberately froze so that I can test interoperability. It means quite a few thing will have old versions of dependencies. Still I would expect the system to work with them.

I'll have a deeper look at this during this weekend and can write you all my findings/way forward with this. Hopefully I'll find some solution that handles all the cases :)

@SimenB SimenB changed the title fix(jest-runtime): restore module.exports as ESM default for __esModule CJS without .default fix(jest-runtime): align CJS-from-ESM default with Node, drop __esModule unwrapping May 8, 2026
@SimenB SimenB requested a review from Copilot May 8, 2026 07:47
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 8 out of 8 changed files in this pull request and generated 1 comment.

Comment thread packages/jest-runtime/src/__tests__/runtime_esm_cjs_interop.test.ts
@SimenB SimenB merged commit 211cdbd into jestjs:main May 8, 2026
90 checks passed
@SimenB SimenB deleted the cjs-default branch May 8, 2026 08:10
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.

[Bug]: Jest 30.4.0 breaks CJS→ESM interop for packages with __esModule: true but no .default (e.g. tslib)

3 participants