Fixes
[jest-runtime]Fix named imports from CJS modules whosemodule.exportsis a function with own-property exports (#16150)
Full Changelog: https://github.com/jestjs/jest/compare/v30.4.1...v30.4.2
[jest-runtime] Fix named imports from CJS modules whose module.exports is a function with own-property exports (#16150)Full Changelog: https://github.com/jestjs/jest/compare/v30.4.1...v30.4.2
[jest-config, jest-core, jest-runner, jest-schemas, jest-types] Allow custom runner configuration options via tuple format ['runner-path', {options}] (#16141)[jest-runtime] Align CJS-from-ESM default export with Node: module.exports is always the ESM default, __esModule unwrapping is no longer applied (#16143)Full Changelog: https://github.com/jestjs/jest/compare/v30.4.0...v30.4.1
Big release! 😀
Main feature is a rewrite of our custom runtime in preparation for stabilisation of native support of ESM. As part of that work require(esm) module is now supported on Node 24.9+ (still requires --experimental-vm-modules like before).
In addition we now support fake timers for the recently released Temporal API in Node v26.
React 19 is also supported properly in pretty-format, meaning snapshots of React components now work like they should.
Due to all the changes, there might be regressions that snuck in. Please report them!
Full list of changes below
[babel-jest] Support collecting coverage from .mts, .cts (and other) files (#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)[jest-config, jest-runner, jest-worker] Add workerGracefulExitTimeout config option to control how long workers are given to exit before being force-killed (#15984)[jest-config] Add support for jest.config.mts as a valid configuration file (#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)[@jest/fake-timers] Accept Temporal.Duration in jest.advanceTimersByTime() and jest.advanceTimersByTimeAsync() (#16128)[@jest/fake-timers] Accept Temporal.Instant and Temporal.ZonedDateTime in jest.setSystemTime() and useFakeTimers({now}) (#16128)[@jest/fake-timers] Support faking Temporal.Now.* (#16131)[jest-mock] Add clearMocksOnScope(scope) on ModuleMocker for clearing every mock function exposed on a scope object (#16088)[jest-resolve] Add canResolveSync() on Resolver so callers can detect when a user-configured resolver only exports an async hook (#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)[jest-runtime] Support require() of ES modules on Node v24.9+ (#16074)[jest-runtime] Validate TC39 import attributes (with { type: 'json' }) on ESM imports (#16127)[@jest/transform] Add canTransformSync(filename) on ScriptTransformer so callers can pick the sync vs async transform path (#16062)[jest-util] Add isError helper (#16076)[pretty-format] Support React 19 (#16123)[expect-utils] Fix toStrictEqual failing on structuredClone results due to cross-realm constructor mismatch (#15959)[@jest/expect-utils] Prevent toMatchObject/subset matching from throwing when encountering exotic iterables (#15952)[fake-timers] Convert Date to milliseconds before passing to @sinonjs/fake-timers (#16029)[jest] Export GlobalConfig and ProjectConfig TypeScript types (#16132)[jest-circus] Prevent crash when asyncError is undefined for non-Error throws (#16003)[jest-circus, jest-jasmine2] Include Error.cause in JSON failureMessages output (#15967)[jest-config] Fix preset path resolution on Windows when the preset uses subpath exports (#15961)[jest-config] Allow collectCoverage and coverageProvider in project config without a validation warning (#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)[jest-environment-node] Fix --localstorage-file warning on Node 25+ (#16086)[jest-reporters] Apply global coverage threshold to unmatched pattern files in addition to glob/path thresholds (#16137)[jest-reporters, jest-runner, jest-runtime, jest-transform] Fix coverage report not showing correct code coverage when using projects config option (#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)[jest-runtime] Improve CJS-from-ESM interop: __esModule/Babel default unwrap, broader named-export coverage, and shared CJS singleton across importers (#16050)[jest-runtime] Load .js files with ESM syntax but no "type":"module" marker as native ESM (#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)[jest-runtime] Fix deadlocks and double-evaluation in concurrent ESM and wasm imports (#16050)[jest-runtime] Fix error when require() is called after the Jest environment has been torn down (#15951)[jest-runtime] Fix missing error when import() is called after the Jest environment has been torn down (#16080)[jest-runtime] Fix virtual unstable_mockModule registrations not respected in ESM (#16081)[jest-runtime] Apply moduleNameMapper when resolving modules with require.resolve() and the paths option (#16135)[@jest/fake-timers] Upgrade @sinonjs/fake-timers (#16139)[jest-runtime] Use synchronous linkRequests / instantiate for ESM linking on Node v24.9+ (#16063)Full Changelog: https://github.com/jestjs/jest/compare/v30.3.0...v30.4.0
[jest-config] Add defineConfig and mergeConfig helpers for type-safe Jest config (#15844)[jest-fake-timers] Add setTimerTickMode to configure how timers advance[*] Reduce token usage when run through LLMs (3f17932)[jest-config] Keep CLI coverage output when using --json with --outputFile (#15918)[jest-mock] Use Symbol from test environment (#15858)[jest-reporters] Fix issue where console output not displayed for GHA reporter even with silent: false option (#15864)[jest-runtime] Fix issue where user cannot utilize dynamic import despite specifying --experimental-vm-modules Node option (#15842)[jest-test-sequencer] Fix issue where failed tests due to compilation errors not getting re-executed even with --onlyFailures CLI option (#15851)[jest-util] Make sure process.features.require_module is false (#15867)unstable_mockModule with node: prefixed core modules.[jest-snapshot-utils] Correct snapshot header regexp to work with newline across OSes (#15803)[jest-snapshot-utils] Fix deprecated goo.gl snapshot warning not handling Windows end-of-line sequences (#15800)[jest-leak-detector] Configurable GC aggressiveness regarding to V8 heap snapshot generation (#15793)[jest-runtime] Reduce redundant ReferenceError messages[jest-core] Include test modules that failed to load when --onlyFailures is active[jest-circus] Fix it.concurrent not working with describe.skip (#15765)[jest-snapshot] Fix mangled inline snapshot updates when used with Prettier 3 and CRLF line endings[jest-runtime] Importing from @jest/globals in more than one file no longer breaks relative paths (#15772)[expect] Update docblock for toContain() to display info on substring check (#15789)[jest-matcher-utils] Make 'deepCyclicCopyObject' safer by setting descriptors to a null-prototype object (#15689)[jest-util] Make garbage collection protection property writable (#15689)Full Changelog: https://github.com/jestjs/jest/blob/main/CHANGELOG.md