22.3.0 (2025-12-17)
🚀 Features
- angular: support angular v21 (#33378)
- angular: add migration to set
isolateModules: trueto jest tsconfig files (#33889) - angular: add migration to replace
jest-preset-angular/setup-jestimports (#33899) - core: add NX_DEFAULT_OUTPUT_STYLE env var (#33493, #27490)
- core: add CnwError class for typed error handling in create-nx-workspace (#33839)
- core: add hints and status messages to the tui (#33838)
- js: add option for using tsgo compiler when inferring build and typecheck tasks (#33821, #32591)
- js: improve SWC compilation error logging (#33297)
- misc: support prettier v3 (#33898, #30801)
- nx-plugin: allow customizing the location of the companion E2E project (#32073, #32069)
- rspack: add support for
cssFilenameconfig #32498 (#32506, #32498) - testing: add option to playwright preset to open html report (#31282)
- webpack: add support for merging externals to NxAppWebpackPlugin (#33833)
🩹 Fixes
- angular: process only the in progress entry points in ng-packagr-lite's write bundles transform function (#33784, #3172, #33560)
- angular: collect known tsconfig files from non-buildable angular libraries in migration (#33834, #33705)
- angular: improve error message when using esbuild-based build targets and generating cypress ct (#33846, #33329)
- angular: install compatible vitest version for angular projects (#33858, #33770)
- angular: ensure jest and jest-preset-angular are updated correctly for angular v21 (#33896)
- bundling: correct project path for createTmpTsConfig (#31314, #31522)
- core: optimize pnpm lockfile parsing with pre-built indexes (#33750, #32669, #32254, #33751)
- core: share visited Set across affected graph traversal (#33756, #32265)
- core: set max listeners for process in task orchestrator (#33596, #32439)
- core: exit with error when generator prompts fail (#33691)
- core: fix record stat on initial CNW call (#33783)
- core: ensure
terminalOutputis always a string in task results (#33782, #32675) - core: improve node creation for pnpm parser (#33788)
- core: add pnpm/yarn support for CNW templates (#33827)
- core: swc register base url missing when using tsgo (#33332)
- core: pass more error detail for CNW (#33844)
- core: create all tables upfront when creating the database (#33843)
- core: improve performance of buildExplicitPackageJsonDependencies (#33791)
- core: do not invoke prettier with
--writeand--list-differentwhen unsupported (#33857, #33658, #31951) - core: preserve command output in TUI summary for non-cached tasks (#33673)
- core: update CNW messaging and remove cancel event from SIGINT (#33872)
- core: restore linkTaskDetails param for backwards compatibility (#33874, #33843)
- core: include PNPM patches in externalDependencies hash computations (#33551)
- core: add back ability to create
cache_outputstable without a foreign key (#33880) - core: display task output in TUI when native command runner is disabled (#33881, #32803)
- core: prevent pinning the same task in multiple panes in the tui (#33863)
- core: reduce error rate with dir validation and add more debugging data (#33887)
- core: improve database initialization error handling (#33820)
- core: invalidate sync generator cache on file changes and use up-to-date project graph (#33780)
- core: convert * to workspace:* for pnpm/yarn/bun in CNW (#33893)
- expo: set projectRoot to workspaceRoot for Expo SDK 54+ compatibility (#33836, #33597)
- graph: serve full project graph when navigating from PDV (#33897)
- js: use Set for O(1) package.json root lookup (#33757, #32265)
- js: recognize NodeNext as ESM (#31508)
- js: display pnpm publish errors without requiring --verbose (#33837)
- js: make CopyAssetsHandler per-file logs opt-in via verbose mode (#33835, #33521)
- js: prevent crash when terminating task using the
@nx/js:swcexecutor (#33845, #31938) - js: handle workspace packages when nx.name differs from package.json.name (#33583, #33582)
- js: resolve nx binary from workspace root in node executor (#33842, #33776)
- js: detect changes to pnpm.overrides and overrides in package.json (#31914)
- js: check package.json for name when project.json exists but has no name (#31887)
- js: adjusted stdout and stderr handling to support the latest @swc/cli version (#32685)
- js: allow copying generated Prisma client (asset) from 'node_modules' (#33822)
- misc: send connectUrl in completion metadata (#33878)
- misc: use string type for fetchDepth in azure-pipelines.yml (#33727)
- module-federation: normalize workspace protocol versions in requiredVersion (#33733, #31397, #33734)
- module-federation: check port availability before starting remote proxies (#33871, #33470)
- nest: ensure library is generated with correct outputPath for TS Soln #32060 (#33864, #32060)
- nextjs: accept fileName option to generate page (#30013)
- node: sourceMaps option to sourceMap in webpack config (#33333)
- node: use @swc/helpers instead of tslib when compiler is swc (#33885, #31202)
- react: update template comment to be valid css (#33169, #20192639)
- release: {releaseGroupName} not interpolated in changelog tag/releaseTagPattern (#33779)
- repo: fix dotnet installation on Windows (#33786)
- repo: restore mise tools in e2e-matrix workflow (#33785, #33772)
- repo: install nightly Rust for WASM build in publish workflow (#33792, #33772)
- repo: use RUSTUP_TOOLCHAIN env var for WASM builds (#33794)
- repo: revert to older nightly Rust for WASM builds (#33797)
- repo: install correct Rust target for x86_64 macOS build (#33853)
- rspack: enable build mode for TypeScript checker in TS solution setups (#33447)
- storybook: conditionally include node imports only for non-angular frameworks (#33728)
- storybook: use helper to find correct version when pnpm catalogs are used (#33900, #29772)
- testing: update jest ci target to forward top level args (#31379)
- vite: update worker configuration in generator to follow Vite's … (#30465)
- web: update e2e test regex for SWC decorator metadata (#33892)
- webpack: show webpack chunks when verbose (#30960)
- webpack: interpolate process.env more verbosely to reduce bundle size with DefinePlugin (#30826)
❤️ Thank You
- Aaro Karell @ajkarell
- Adwait Athale @adwait1290
- AgentEnder @AgentEnder
- Alexey Balmasov
- Andreas Jagiella @AndreasJagiella-EH
- Andrew Ovens @avens19
- Ashish Shanker @AshishShanker
- Charlie Croom
- Chau Tran @nartc
- Claude
- Claude Opus 4.5
- Colum Ferry @Coly010
- Coly010 @Coly010
- Craigory Coppola @AgentEnder
- David Antoon @davidantoon
- Guilherme Siquinelli
- Hamza Khan @112khanhamza
- Jack Hsu @jaysoo
- James Kraus
- Jan Sudczak @parostatkiem
- Jason Jean @FrozenPandaz
- Jay Bell
- jaysoo @jaysoo
- Joe Prisk
- Jonathan Gelin @jogelin
- Jonathan Wilbur @JonathanWilbur
- Kamenskih Dmitriy
- Kasper Christensen
- Leosvel Pérez Espinosa @leosvelperez
- Miguel @mpsanchis
- Miroslav Jonaš @meeroslav
- Nicholas Cunningham @ndcunningham
- Raphael Araújo @raphox
- ResonAtom
- Svyatoslav Zaytsev @MillerSvt
- teawithfruit @teawithfruit
- Timo Santi @diginikkari
- Tine Kondo @tinesoft
- Yevhenii Yusenkov @YevheniiYusenkov
- Zachary DeRose @ZackDeRose