What changed in angular-cli from 21 to 22
13 releases numbered after v21.2.23 up to and including v22.1.7, stable releases only. v21.2.23 and v22.1.7 are the newest stable releases of 21 and 22 we track; this page follows them as new ones ship.
- 1 removes or deprecates something
97 changes across 13 releases
Added 8
- update ai-config to include Angular MCP server config
- add built-in SQLite cache store fallback
- emit debug ids for stable subresource integrity hashes
- enable chunk optimization for server builds
- migrate advanced optimization Babel plugins to oxc-parser and magic-string
- migrate i18n inliner to oxc-parser and magic-string
- share persistent build cache across git worktrees
- support the standard Forwarded header
Changed 12
- Batch prerender routes and share in-memory server bundles
- Traverse AST with iterative post-order walker in i18n inliner
- avoid eager module loading during global bootstrap
- avoid encoding the inline source map before remapping
- batch last_accessed updates in sqlite cache store
- hash the i18n inline cache key options once per locale
- optimize template string size calculation in server manifest
- share i18n translations with the inliner workers by reference
- use Map for chunk asset size lookups in budget calculator
- release build resources early in non-watch mode
- avoid buffering request body when sanitizing headers
- skip semantic affected-file walk when type checking is disabled
Fixed 75
- isolate temporary package installations from parent Yarn workspace
- add splitting option to unit-test builder
- enable code splitting for vitest browser tests
- fail build and exclude routes when prerendering fails
- keep dev-server Vite cache worktree-local
- preserve binary values in the SQLite cache store
- decode pathname when constructing server asset path
- ensure public directory containment in CommonEngine
- Ignore side-effect annotations in unit test builds
- Abort web request signal when node request is aborted
- Transform fail() to expect.fail() in refactor-jasmine-vitest
- Enforce MCP roots in get_best_practices tool
- Handle errors from isAllowedWorkspacePath in best-practices tool
- Throw on out-of-roots workspace in best-practices tool
- Correct misleading error message for top-level await
- Disable code splitting for unit test builds
- Preserve integrity and crossorigin in autoCsp loader
- generate CLAUDE.md for Claude Code instead of AGENTS.md
- import UrlSegment instead of subPath in guard generator
- disable searching current directory for bare executable names on Windows
- serialize configuration as a single argv token in run_target strategies
- count statically imported chunks in the initial total
- normalize setupFiles paths to POSIX for vitest runner
- prevent syntax corruption for Crockford-style enum IIFE
- prevent syntax corruption in oxc transform
- return direct file contents for non-Angular TypeScript files
- return only lowest version per target engine
- set target for Rolldown dependency prebundling in Vite dev server
- destroy platform when response stream is cancelled
- always install package during ng add to inspect manifest on disk for schematics
- correctly report available package updates during bare ng update
- discover migrations from installed packages when omitted by registry metadata
- normalize Windows drive-letter casing for process.cwd
- prevent build process hang on unhandled error
- retain watch files on error in load result cache
- support case-insensitive and alternative license file names
- settle writeResponseToNodeResponse when client disconnects
- add packages with built-in schematics to devDependencies only
- prevent IIFE wrapper interleaving for adjacent classes in minified files
- support npm 12 metadata array and error formats
- rewrite paths from sandboxed execroots when running under Bazel
- abort and guide manual mitigation when updating catalog packages
- prevent Yarn registry environment variable override
- remove algoliasearch dependency and support latest docs versions
- resolve correct registry name when using npm alias syntax during update
- respect client-side release age settings during update resolution
- revert package.json changes if installation tasks fail during update
- robustly parse npm manifest from array
- remove unused spec tsconfig outDir
- add bounded timeout to vitest executor disposal
- anchor debug ID comment matching and make injection idempotent
- prevent esbuild service hang on internal component stylesheet builds
- declare devserver_start and devserver_stop as isReadOnly:false
- safeguard Karma builder stream controller against closed state
- batch Prettier invocations during migration formatting
- update MCP devserver tool names to conform to spec regex
- canonicalize drive letter casing for workspace root on Windows
- ensure import map integrity keys are valid URL-like specifiers
- favor istanbul coverage provider when browser testing is enabled
- preserve custom config options in runnerConfig for vitest
- remap metafile paths when workspace root is a symlink or junction
- copy packageManager field and yarn config for temp installs
- support resolving subproject dependencies in pnpm workspaces
- fallback to build target preserveSymlinks option in karma runner
- prevent externalizing builder-injected i18n locale data
- strip all vite id prefixes from minified code with external dependencies
- replace all route parameters when resolving relative redirects
- Remove unused app tsconfig outDir
- Gracefully handle package manager errors in command handler
- Respect release age policy in update bootstrapping logic
- Auto-inject localize/init in library unit tests
- Inherit preserveSymlinks option from build target in unit-test builder
- Load zone.js dynamically for library unit tests
- Scope createRequire module resolution using paths to prevent parent paths
- Preserve response headers during redirect
Deprecated 1
- stringToFileBuffer and fileBufferToString are deprecated; use standard Web APIs (TextEncoder and TextDecoder) instead
Security 1
- Prevent OS command injection in ssr-dev-server builder
Original release notes, newest first
The list above is our reading of these notes; the originals from angular-cli are here, one fold per release.
v22.1.722.1.7
@angular/cli
| Commit | Description |
|---|---|
| fix - e9db85c0f | isolate temporary package installations from parent Yarn workspace |
@angular/build
| Commit | Description |
|---|---|
| fix - 1c9b1af61 | add splitting option to unit-test builder |
| fix - 4b861f458 | enable code splitting for vitest browser tests |
| fix - f1fd82381 | fail build and exclude routes when prerendering fails |
| fix - a84906fe3 | keep dev-server Vite cache worktree-local |
| fix - fcf883ef1 | preserve binary values in the SQLite cache store |
@angular/ssr
| Commit | Description |
|---|---|
| fix - baf1ca189 | decode pathname when constructing server asset path |
| fix - 70748ca8e | ensure public directory containment in CommonEngine |
v22.1.622.1.6
@angular/build
| Commit | Description |
|---|---|
| fix - 3f132eaa97 | ignore side-effect annotations in unit test builds |
| perf - 5b1028936f | batch prerender routes and share in-memory server bundles |
@angular/ssr
| Commit | Description |
|---|---|
| fix - 76818cb811 | abort web request signal when node request is aborted |
v22.1.522.1.5
@schematics/angular
| Commit | Description |
|---|---|
| fix - ba2b0e4c2 | transform fail() to expect.fail() in refactor-jasmine-vitest |
@angular/cli
| Commit | Description |
|---|---|
| fix - e672271f8 | enforce MCP roots in get_best_practices tool |
| fix - a14916cc4 | handle errors from isAllowedWorkspacePath in best-practices tool |
| fix - d6e1cddff | throw on out-of-roots workspace in best-practices tool |
@angular/build
| Commit | Description |
|---|---|
| fix - cba72902d | correct misleading error message for top-level await |
| fix - b4679998c | disable code splitting for unit test builds |
| fix - ff1d3565e | preserve integrity and crossorigin in autoCsp loader |
| perf - 1fc1fb05c | traverse AST with iterative post-order walker in i18n inliner |
v22.1.422.1.4
@schematics/angular
| Commit | Description |
|---|---|
| fix - d4a48e3ab | generate CLAUDE.md for Claude Code instead of AGENTS.md |
| fix - d451f15b2 | import UrlSegment instead of subPath in guard generator |
@angular/cli
| Commit | Description |
|---|---|
| fix - 67a29899b | disable searching current directory for bare executable names on Windows |
| fix - 1b0ba5c17 | serialize configuration as a single argv token in run_target strategies (#33657) |
| perf - 9440432d2 | avoid eager module loading during global bootstrap |
@angular/build
| Commit | Description |
|---|---|
| fix - 46fcb29d6 | count statically imported chunks in the initial total |
| fix - 796b57684 | normalize setupFiles paths to POSIX for vitest runner |
| fix - c805e5cfb | prevent syntax corruption for Crockford-style enum IIFE |
| fix - cc6c17716 | prevent syntax corruption in oxc transform |
| fix - a142f6f83 | return direct file contents for non-Angular TypeScript files |
| fix - 956c6578d | return only lowest version per target engine |
| fix - 689b5b116 | set target for Rolldown dependency prebundling in Vite dev server |
| perf - 70461f6ed | avoid encoding the inline source map before remapping |
| perf - 22cce7563 | batch last_accessed updates in sqlite cache store |
| perf - ab2ed18d5 | hash the i18n inline cache key options once per locale |
| perf - 34516ff73 | optimize template string size calculation in server manifest |
| perf - 712971c37 | share i18n translations with the inliner workers by reference |
| perf - 78f8c5fef | use Map for chunk asset size lookups in budget calculator |
@angular/ssr
| Commit | Description |
|---|---|
| fix - 2331c1047 | destroy platform when response stream is cancelled |
v22.1.322.1.3
@angular/cli
| Commit | Description |
|---|---|
| fix - f837b788c6 | always install package during ng add to inspect manifest on disk for schematics (#33718) |
| fix - 72ae93638d | correctly report available package updates during bare ng update |
| fix - a949e06568 | discover migrations from installed packages when omitted by registry metadata (#33718) |
| fix - 1d9122fd50 | normalize Windows drive-letter casing for process.cwd |
@angular/build
| Commit | Description |
|---|---|
| fix - a4860d505a | prevent build process hang on unhandled error (#33715) |
| fix - 7686d66cab | retain watch files on error in load result cache |
| fix - 25b7cf7504 | support case-insensitive and alternative license file names |
| perf - 4fd81402ce | release build resources early in non-watch mode (#33715) |
@angular/ssr
| Commit | Description |
|---|---|
| fix - 6af906cb94 | settle writeResponseToNodeResponse when client disconnects |
| perf - 917d3b2254 | avoid buffering request body when sanitizing headers |
v22.1.222.1.2
@angular/cli
| Commit | Description |
|---|---|
| fix - 57db27ea91 | add packages with built-in schematics to devDependencies only |
@angular/build
| Commit | Description |
|---|---|
| fix - baed978885 | prevent IIFE wrapper interleaving for adjacent classes in minified files |
v22.1.122.1.1
@angular/cli
| Commit | Description |
|---|---|
| fix - ab971a8543 | support npm 12 metadata array and error formats |
@angular/build
| Commit | Description |
|---|---|
| fix - db24220fb8 | rewrite paths from sandboxed execroots when running under Bazel |
v22.1.022.1.0
@angular/cli
| Commit | Description |
|---|---|
| fix - f59bcf529 | abort and guide manual mitigation when updating catalog packages |
| fix - 48f90f5d5 | prevent Yarn registry environment variable override |
| fix - c963ecbec | remove algoliasearch dependency and support latest docs versions |
| fix - 6859d25c3 | resolve correct registry name when using npm alias syntax during update |
| fix - 3a2589dac | respect client-side release age settings during update resolution |
| fix - 5c3101bff | revert package.json changes if installation tasks fail during update |
| fix - 7932caaf9 | robustly parse npm manifest from array |
@schematics/angular
| Commit | Description |
|---|---|
| feat - 89d7f59cd | update ai-config to include Angular MCP server config |
| fix - b345bb54d | remove unused spec tsconfig outDir |
@angular-devkit/core
| Commit | Description |
|---|---|
| refactor - fd336d365 | deprecate stringToFileBuffer and fileBufferToString |
@angular/build
| Commit | Description |
|---|---|
| feat - 34d558c3c | add built-in SQLite cache store fallback |
| feat - 0c18dc0f6 | emit debug ids for stable subresource integrity hashes |
| feat - 51f69276f | enable chunk optimization for server builds |
| feat - 10dc30f9c | migrate advanced optimization Babel plugins to oxc-parser + magic-string |
| feat - 917393a4c | migrate i18n inliner to oxc-parser + magic-string |
| feat - 52ae7f862 | share persistent build cache across git worktrees |
| fix - 95510511d | add bounded timeout to vitest executor disposal |
| fix - 62b11e316 | anchor debug ID comment matching and make injection idempotent |
| fix - 6d9b360e5 | prevent esbuild service hang on internal component stylesheet builds |
| fix - 291caab61 | prevent stripping nested sourceMappingURL comments |
| fix - 0e3ca3dfb | support hyphens and underscores when stripping chunk hash in chunk optimizer |
| perf - 585d08af8 | default chunk optimization to use Rolldown |
| perf - 09d0a11a8 | enable fast-path AST printing with sourcemaps in AotCompilation |
@angular/ssr
| Commit | Description |
|---|---|
| feat - 7ef9ed24d | support the standard Forwarded header |
Deprecations
@angular-devkit/core
-
stringToFileBufferandfileBufferToStringare deprecated. Use standard Web APIs (TextEncoderandTextDecoder) instead.Internal usages within the repository have been removed and replaced with standard Web APIs. The public API golden file for
@angular-devkit/corehas been updated to reflect the deprecations.
v22.0.922.0.9
@angular/cli
| Commit | Description |
|---|---|
| fix - 9ee8f9b669 | declare devserver_start and devserver_stop as isReadOnly:false |
@angular/build
| Commit | Description |
|---|---|
| fix - d0c776d461 | safeguard Karma builder stream controller against closed state |
v22.0.822.0.8
@angular/cli
| Commit | Description |
|---|---|
| fix - 41c356256 | batch Prettier invocations during migration formatting |
| fix - bc87c85c3 | update MCP devserver tool names to conform to spec regex |
@angular/build
| Commit | Description |
|---|---|
| fix - 5724bf632 | canonicalize drive letter casing for workspace root on Windows |
| fix - b8bdbaa1e | ensure import map integrity keys are valid URL-like specifiers |
| fix - 212a7bb21 | favor istanbul coverage provider when browser testing is enabled |
| fix - bc760b005 | preserve custom config options in runnerConfig for vitest |
| fix - 19cda7415 | remap metafile paths when workspace root is a symlink or junction |
| perf - fdcc98c79 | skip semantic affected-file walk when type checking is disabled |
v22.0.722.0.7
@angular/cli
| Commit | Description |
|---|---|
| fix - e85c10ccb | copy packageManager field and yarn config for temp installs |
| fix - b87cafec0 | support resolving subproject dependencies in pnpm workspaces |
v22.0.622.0.6
@angular/build
| Commit | Description |
|---|---|
| fix - df49966c6 | fallback to build target preserveSymlinks option in karma runner |
| fix - 9906add5b | prevent externalizing builder-injected i18n locale data |
| fix - 070155f6e | strip all vite id prefixes from minified code with external dependencies |
@angular/ssr
| Commit | Description |
|---|---|
| fix - c9aa354b1 | replace all route parameters when resolving relative redirects |
v22.0.522.0.5
@schematics/angular
| Commit | Description |
|---|---|
| fix - 862a38069 | remove unused app tsconfig outDir |
@angular/cli
| Commit | Description |
|---|---|
| fix - f099e641c | gracefully handle package manager errors in command handler |
| fix - cf033ec48 | respect release age policy in update bootstrapping logic |
@angular-devkit/build-angular
| Commit | Description |
|---|---|
| fix - f75085f4b | prevent OS command injection in ssr-dev-server builder |
@angular/build
| Commit | Description |
|---|---|
| fix - dfee1e7b1 | auto-inject localize/init in library unit tests |
| fix - aba718403 | inherit preserveSymlinks option from build target in unit-test builder |
| fix - 7c0d9f03c | load zone.js dynamically for library unit tests |
| fix - 4288e4452 | scope createRequire module resolution using paths to prevent parent paths |
@angular/ssr
| Commit | Description |
|---|---|
| fix - 5f774f891 | preserve response headers during redirect |