Should I upgrade to Jest 30 now?

Teams maintaining large test suites need a current change-awareness card on Jest 30, especially Node version support changes and matcher or config breakage that can disrupt CI at scale.

Upgrade to Jest 30 once CI is on Node 20 or 22; hold on 29 only if the Node migration itself is still your immediate stability risk.

Blockers

Who this is for

Candidates

Upgrade to Jest 30 after standardizing CI on Node 20 or 22

As of 2026-03-18, Jest 30 is the current major release track on jestjs.io. The official upgrade guide says Jest 30 drops support for Node 14, 16, 19, and 21, sets the minimum supported Node version to 18.x, and raises the minimum TypeScript version to 5.4 for Jest type packages. The same guide and release blog call out blocker-level breakage: `jest-environment-jsdom` moved to JSDOM v26, alias matcher names were removed, `--testPathPattern` was renamed to `--testPathPatterns`, `jest --init` was removed, and unofficial deep imports into Jest packages may break because packages now rely on `exports` and bundled internals. The blog also reports performance and memory improvements in real projects, which matters for large CI suites.

When to choose

Use this when you have already decided to get off Node 18 in your runtime and CI fleet, and you want one coordinated test-platform upgrade instead of carrying legacy Jest behavior longer. It is the decisive choice when your bigger risk is lingering on unmaintained docs and deprecated matcher or config patterns rather than absorbing one concentrated migration.

Tradeoffs

You get the current major line, better performance potential, newer ESM and TypeScript support, and fewer false positives for asynchronously handled promise rejections. The cost is migration work across matcher aliases, snapshots, jsdom-dependent tests, CLI wrappers, custom sequencers, and any tool that touched Jest internals.

Cautions

Do not assume Node uplift alone is enough. The official migration guide says TypeScript `CalledWith` matcher inference is stricter, snapshot output can change, custom `--filter` implementations now need a `{filtered: Array<string>}` return shape, and deep imports such as internal `build/*` paths are likely to fail.

Hold on Jest 29 briefly while completing the Node migration first

As of 2026-03-18, the Jest 29.7 docs remain available, but the official site labels them as no longer actively maintained and directs readers to 30.0 as the latest version. The Jest 29 upgrade guide documents support for Node 14.15, 16.10, and 18.0 and above, which makes it a temporary compatibility plateau for older CI images or long-lived branches. Compared with Jest 30, this path avoids the immediate matcher-alias removals, JSDOM v26 jump, `--testPathPatterns` rename, and internal package export breakage. It is a deferral strategy, not a steady-state target.

When to choose

Use this when your immediate blocker is the runtime move itself and you need to narrow blast radius by separating 'Node migration' from 'Jest major upgrade.' It is most defensible for large monorepos where CI stability is worth a short-lived freeze, but only if you schedule the Jest 30 work immediately after.

Tradeoffs

You reduce simultaneous change surface and keep existing Jest 29 behavior while moving runners and containers. In exchange, you stay on documentation that the official site says is no longer actively maintained, so you preserve technical debt and delay the inevitable Jest 30 cleanup.

Cautions

This option does not solve the current-state problem permanently. If your org or platform has already dropped Node 18 as of 2026-03-18, staying on Jest 29 only helps if your remaining blockers are Jest-specific breakages rather than runtime support; check your CI platform policy separately because Jest 29 itself is not the authoritative source for Node lifecycle decisions.

Facts updated: 2026-03-18
Published: 2026-04-03

Try with your AI agent

$ npm install -g pocketlantern
$ pocketlantern init
# Restart Claude Code, Cursor, or your MCP client, then ask:
# "Should I upgrade to Jest 30 now?"
Missing something? Request coverage