# Angular: what changed from 21 to 22 - Product: Angular (https://whatsnew.fyi/product/angular) - Vendor: Google - Range: changelog entries numbered after v21.2.22 up to and including v22.1.5, stable releases only - Entries below: 9 releases (newest first) - Resolved: 21 is v21.2.22 and 22 is v22.1.5, the newest stable release of each major we track - Not shown: 1 release whose version could not be placed against this range - Carrying security changes: 0 · CVEs mentioned: 0 · Mentioning breaking changes: 0 · Removing or deprecating something: 1 - Page: https://whatsnew.fyi/product/angular/compare/21...22 What's New is an index, not a publisher: every entry below links to the vendor's own release notes, which are the authoritative source. Entries are labelled where they are hand-curated sample data, pre-releases, or drawn from a secondary source such as a developer blog. Reuse: the summaries, labels and curation here are © What's New. Quote freely with attribution and a link back; wholesale republication of the corpus is not permitted — terms: https://whatsnew.fyi/terms. The vendors' own release notes remain their publishers'. ## What changed (105 changes, grouped by kind) ### Added #### v22.1.0 (2026-07-29) - add an error for --global-foo cases - namespace CSS variables to the app - support css var namespacing in properties - add custom set option to linkedSignal - add deep linking from Performance panel to DevTools - add options to allow caching of credentialed and non-cacheable HTTP requests ### Fixed #### v22.1.5 (2026-09-03) - Check uninvoked signal aliases in extended diagnostic - Cancel stale debounce timers to prevent timer leaks - Don't fail NgModule checks for a pipe that extends a base class - Validate SVG animation attributes outside the SVG namespace - Avoid writing to name input on ControlValueAccessor - Skip tsconfig files of non-Angular projects - Resolve HTTP(S) URLs without authority as relative during SSR - Avoid view transitions when the user agent provides one #### v22.1.4 (2026-08-27) - avoid prototype member collisions in common - use locale NaN symbol in number formatting - scope animations declared in minified nested rules - default template diagnostic related message source file to template - produce correct tcb expression for optional chaining - retain metadata for strict standalone errors - avoid prototype member collisions in core - explicitly reject foreign components in JIT mode - preserve namespace for dynamic component hosts - prevent TransferState prototype pollution - throw coded RuntimeErrors instead of crashing when hydration/rendering cannot find an expected DOM node - use dot-access for readonly rule configuration - honor quote style preference when generating imports - preserve registerLocaleData calls in standalone bootstrap migration - avoid stripping unicode whitespace during url resolution #### v22.1.3 (2026-08-19) - Detect object trigger values with Object.hasOwn in animations - Preserve literal key union in KeyValuePipe.transform() - Preserve &ngsp; between sibling control flow blocks in compiler - Accept readonly arrays for setClassMetadata decorators - Allow readonly arrays in RawScopeInfoFromDecorator - Expose debuggableFn for non-computed signal graph nodes - Prevent orphaned requestIdleCallback handle from re-entrant scheduling - Replace all hasOwnProperty usages with Object.hasOwn - Stop running further effects once one destroys the view mid-flush - Throw a descriptive error instead of crashing when a hydration node is missing - Throw NG0500 instead of a raw TypeError on element hydration mismatch - Report forbidden 2way bindings on when FormField is applied - Warn in dev mode when ngModel cannot reach parent NgForm across component boundary - Cancel oversized fetch response bodies - Recover project for external templates in solution-style workspaces - Disallow event handler attributes in Meta - Throw a descriptive error when insertBefore reference node is missing - Pass correct component to canDeactivate for named outlets in componentless parent routes #### v22.1.2 (2026-08-13) - Generate correct expression for optional chaining - Remove namespaced MathML script elements - Correctly resolve symbol for SafePropertyRead in chained optional navigation - Record class extends clause references in DeferredSymbolTracker - Ensure i18n_util hasOwnProperty checks are safe for property renaming - Fix incorrect loop in defer blocks - Reject prefixed SVG script hosts - Keep radio inputs in sync when values change - Always decode JSON responses as UTF-8 - Limit protocol-relative URL handling to serialization #### v22.1.1 (2026-08-07) - Initialize hydration triggers after late runtime activation - Warn when style property bindings receive invalid values - Avoid aborting completed requests in FetchBackend - Respect content-type charset in fetch backend text decoder - Run root interceptors in the terminal request chain - Strip RFC 6265 DQUOTE characters and handle URIError in parseCookieValue #### v22.1.0 (2026-07-29) - skip transfer cache for uncacheable HTTP traffic - permissive whitespace parsing in default never blocks - support foreign components defined outside top-level scope - support foreign components inside control flow blocks - allow passing uninvoked signals as foreign component props - support import aliases in foreignImports - account for namespaces in host binding sanitization - correct container anchor collection order to match DOM layout - introduce disposal mechanism for Angular views in foreign @content - introduce logical-only containers for foreign content - sanitize host bindings on concrete hosts - set current tnode in foreign component instruction on reuse - enable xsrf for root-provided HttpClient - match header values exactly when deleting #### v22.0.8 (2026-07-22) - Preserve crossorigin on image preloads - Ensure SVG animation attributeName is checked case-insensitively - Ensure pending status propagates to the root form in signal forms - Prevent transfer cache key collisions - Correctly migrate ngClass with mixed space-separated keys - Preserve NgClass import on partial migration #### v22.0.7 (2026-07-16) - avoid prototype lookups in date format caches - parsing of an empty template literal interpolation - re-tag SourceFiles after TsCreateProgramDriver.updateFiles() - allow static attributes for explicit input transforms - ignore processing instruction syntax in templates - preserve explicit input transform write type - allow multiple async validators - preserve intermediate number values in signal forms - prevent stale CVA writeback during debounce - prevent interceptor signal reads from leaking into calling reactive contexts - build runtime translations map with a null prototype - use Object.hasOwn for placeholder lookup in translate - prevent ReDoS in SOURCEMAP_URL_REGEXP #### v22.0.6 (2026-07-08) - Use regular optional chaining expression for safe function calls in template checking blocks - Apply debugName transform to required signal queries - Detect uninvoked signals in bound expressions using ternary - Make extractValue reactive for compat AbstractControl values - Preserve transitive NgModule references when pruning - Remove stale model import in model-output migration - Handle outlet named __proto__ in segment group maps - Use safe hasOwnProperty when parsing query params ### Deprecated #### v22.1.0 (2026-07-29) - deprecate jsonp support ## Release notes ### v22.1.5 — 22.1.5 - Date: 2026-09-03 - Version: v22.1.5 - Original notes: https://github.com/angular/angular/releases/tag/v22.1.5 - Permalink: https://whatsnew.fyi/product/angular/releases/v22.1.5 - **fixed** — Check uninvoked signal aliases in extended diagnostic - **fixed** — Cancel stale debounce timers to prevent timer leaks - **fixed** — Don't fail NgModule checks for a pipe that extends a base class - **fixed** — Validate SVG animation attributes outside the SVG namespace - **fixed** — Avoid writing to name input on ControlValueAccessor - **fixed** — Skip tsconfig files of non-Angular projects - **fixed** — Resolve HTTP(S) URLs without authority as relative during SSR - **fixed** — Avoid view transitions when the user agent provides one ###### compiler-cli | Commit | Description | | -- | -- | | [![fix - d90698dae7](https://img.shields.io/badge/d90698dae7-fix-green)](https://github.com/angular/angular/commit/d90698dae759f21f29052e521ffaec6c3a79f6d1) | check uninvoked signal aliases in extended diagnostic | ###### core | Commit | Description | | -- | -- | | [![fix - 2ceeb27078](https://img.shields.io/badge/2ceeb27078-fix-green)](https://github.com/angular/angular/commit/2ceeb27078d890514a1e87b0d99f366d9a4a796f) | cancel stale debounce timers to prevent timer leaks | | [![fix - ed2e401d2d](https://img.shields.io/badge/ed2e401d2d-fix-green)](https://github.com/angular/angular/commit/ed2e401d2da9a6dd5c87006573a8e42934f58f62) | don't fail NgModule checks for a pipe that extends a base class | | [![fix - c65d378bb4](https://img.shields.io/badge/c65d378bb4-fix-green)](https://github.com/angular/angular/commit/c65d378bb4fded436f197aa7bc52c03f507b8bd4) | validate SVG animation attributes outside the SVG namespace | ###### forms | Commit | Description | | -- | -- | | [![fix - 43aaeaec29](https://img.shields.io/badge/43aaeaec29-fix-green)](https://github.com/angular/angular/commit/43aaeaec29e15d7b2504e8930c92c94b898ca200) | avoid writing to `name` input on ControlValueAccessor | ###### migrations | Commit | Description | | -- | -- | | [![fix - d85288d75f](https://img.shields.io/badge/d85288d75f-fix-green)](https://github.com/angular/angular/commit/d85288d75f3f85dc6b10bf813c805b1b7fed7329) | skip tsconfig files of non-Angular projects | ###### platform-server | Commit | Description | | -- | -- | | [![fix - 3b8723ce3d](https://img.shields.io/badge/3b8723ce3d-fix-green)](https://github.com/angular/angular/commit/3b8723ce3d88b2bf871185736bc33e3cf9a189f4) | resolve HTTP(S) URLs without authority as relative during SSR | ###### router | Commit | Description | | -- | -- | | [![fix - 4340a63c52](https://img.shields.io/badge/4340a63c52-fix-green)](https://github.com/angular/angular/commit/4340a63c52fca4d08ef258a3c053f50932eab27e) | avoid view transitions when the user agent provides one | ### v22.1.4 — 22.1.4 - Date: 2026-08-27 - Version: v22.1.4 - Original notes: https://github.com/angular/angular/releases/tag/v22.1.4 - Permalink: https://whatsnew.fyi/product/angular/releases/v22.1.4 - **fixed** — avoid prototype member collisions in common - **fixed** — use locale NaN symbol in number formatting - **fixed** — scope animations declared in minified nested rules - **fixed** — default template diagnostic related message source file to template - **fixed** — produce correct tcb expression for optional chaining - **fixed** — retain metadata for strict standalone errors - **fixed** — avoid prototype member collisions in core - **fixed** — explicitly reject foreign components in JIT mode - **fixed** — preserve namespace for dynamic component hosts - **fixed** — prevent TransferState prototype pollution - **fixed** — throw coded RuntimeErrors instead of crashing when hydration/rendering cannot find an expected DOM node - **fixed** — use dot-access for readonly rule configuration - **fixed** — honor quote style preference when generating imports - **fixed** — preserve registerLocaleData calls in standalone bootstrap migration - **fixed** — avoid stripping unicode whitespace during url resolution ###### common | Commit | Description | | -- | -- | | [![fix - 60a874c3fb](https://img.shields.io/badge/60a874c3fb-fix-green)](https://github.com/angular/angular/commit/60a874c3fbedc2ce216bcf783325f4e1291edcb0) | avoid prototype member collisions | | [![fix - e8378dfeab](https://img.shields.io/badge/e8378dfeab-fix-green)](https://github.com/angular/angular/commit/e8378dfeab39fca5bcdc47126b7859c8fdab7a28) | use locale NaN symbol in number formatting | ###### compiler | Commit | Description | | -- | -- | | [![fix - 05c7c725a5](https://img.shields.io/badge/05c7c725a5-fix-green)](https://github.com/angular/angular/commit/05c7c725a534f4ea14c718503966423133474bbf) | scope animations declared in minified nested rules | ###### compiler-cli | Commit | Description | | -- | -- | | [![fix - afe8499a14](https://img.shields.io/badge/afe8499a14-fix-green)](https://github.com/angular/angular/commit/afe8499a14c1bf8ab42e6e30b35917a873745540) | default template diagnostic related message source file to template | | [![fix - 079a846263](https://img.shields.io/badge/079a846263-fix-green)](https://github.com/angular/angular/commit/079a846263599daf38cc1903c46ccea99c5758f8) | Produce correct tcb expression for optional chaining | | [![fix - 55eeb46418](https://img.shields.io/badge/55eeb46418-fix-green)](https://github.com/angular/angular/commit/55eeb46418080e2faf64c84eac389c21abea6df8) | retain metadata for strict standalone errors | ###### core | Commit | Description | | -- | -- | | [![fix - 3da35cbab9](https://img.shields.io/badge/3da35cbab9-fix-green)](https://github.com/angular/angular/commit/3da35cbab94777230871a3e9289455089b80fe7f) | avoid prototype member collisions | | [![fix - b199bdfa2a](https://img.shields.io/badge/b199bdfa2a-fix-green)](https://github.com/angular/angular/commit/b199bdfa2ad8b3fe189e7b4cef9dbea600cd4732) | explicitly reject foreign components in JIT mode | | [![fix - 9a8e4826b9](https://img.shields.io/badge/9a8e4826b9-fix-green)](https://github.com/angular/angular/commit/9a8e4826b9db4359c3f0e7185e9582b7bd08a3ef) | preserve namespace for dynamic component hosts | | [![fix - 7c752d4815](https://img.shields.io/badge/7c752d4815-fix-green)](https://github.com/angular/angular/commit/7c752d4815db41ee04e43d38cc826dd63214432b) | prevent TransferState prototype pollution | | [![fix - 7546b7a805](https://img.shields.io/badge/7546b7a805-fix-green)](https://github.com/angular/angular/commit/7546b7a80549c9620d52692cb0f5cab4c69b546c) | throw coded RuntimeErrors instead of crashing when hydration/rendering can't find an expected DOM node | ###### forms | Commit | Description | | -- | -- | | [![fix - c8eb7f0056](https://img.shields.io/badge/c8eb7f0056-fix-green)](https://github.com/angular/angular/commit/c8eb7f00564beceb21445b1f0374c93854b513d1) | use dot-access for readonly rule configuration | ###### language-service | Commit | Description | | -- | -- | | [![fix - 93d7f718d2](https://img.shields.io/badge/93d7f718d2-fix-green)](https://github.com/angular/angular/commit/93d7f718d2e057e37deda42d197e46672fe7f7f5) | honor quote style preference when generating imports | ###### migrations | Commit | Description | | -- | -- | | [![fix - 85c8829ac1](https://img.shields.io/badge/85c8829ac1-fix-green)](https://github.com/angular/angular/commit/85c8829ac189b0f47b865b036dad98905e576dc9) | preserve registerLocaleData calls in standalone bootstrap migration | ###### platform-server | Commit | Description | | -- | -- | | [![fix - 71e52d1396](https://img.shields.io/badge/71e52d1396-fix-green)](https://github.com/angular/angular/commit/71e52d1396b9cef98652929b73e08c4cde645970) | avoid stripping unicode whitespace during url resolution | ### v22.1.3 — 22.1.3 - Date: 2026-08-19 - Version: v22.1.3 - Original notes: https://github.com/angular/angular/releases/tag/v22.1.3 - Permalink: https://whatsnew.fyi/product/angular/releases/v22.1.3 - **fixed** — Detect object trigger values with Object.hasOwn in animations - **fixed** — Preserve literal key union in KeyValuePipe.transform() - **fixed** — Preserve &ngsp; between sibling control flow blocks in compiler - **fixed** — Accept readonly arrays for setClassMetadata decorators - **fixed** — Allow readonly arrays in RawScopeInfoFromDecorator - **fixed** — Expose debuggableFn for non-computed signal graph nodes - **fixed** — Prevent orphaned requestIdleCallback handle from re-entrant scheduling - **fixed** — Replace all hasOwnProperty usages with Object.hasOwn - **fixed** — Stop running further effects once one destroys the view mid-flush - **fixed** — Throw a descriptive error instead of crashing when a hydration node is missing - **fixed** — Throw NG0500 instead of a raw TypeError on element hydration mismatch - **fixed** — Report forbidden 2way bindings on when FormField is applied - **fixed** — Warn in dev mode when ngModel cannot reach parent NgForm across component boundary - **fixed** — Cancel oversized fetch response bodies - **fixed** — Recover project for external templates in solution-style workspaces - **fixed** — Disallow event handler attributes in Meta - **fixed** — Throw a descriptive error when insertBefore reference node is missing - **fixed** — Pass correct component to canDeactivate for named outlets in componentless parent routes ###### animations | Commit | Description | | -- | -- | | [![fix - d9620e0f1b](https://img.shields.io/badge/d9620e0f1b-fix-green)](https://github.com/angular/angular/commit/d9620e0f1b85ff5896e4d725c52c5ad6c30e1af9) | detect object trigger values with Object.hasOwn | ###### common | Commit | Description | | -- | -- | | [![fix - b3c78a5081](https://img.shields.io/badge/b3c78a5081-fix-green)](https://github.com/angular/angular/commit/b3c78a50816af5685b2a6ed51166d08941c09946) | preserve literal key union in KeyValuePipe.transform() | ###### compiler | Commit | Description | | -- | -- | | [![fix - 94f0b9a371](https://img.shields.io/badge/94f0b9a371-fix-green)](https://github.com/angular/angular/commit/94f0b9a3710ad000cf927caf5333db3582db1126) | preserve &ngsp; between sibling control flow blocks | ###### core | Commit | Description | | -- | -- | | [![fix - afe529cb2d](https://img.shields.io/badge/afe529cb2d-fix-green)](https://github.com/angular/angular/commit/afe529cb2d97e766b4f9014c3b6864420b7c8deb) | accept readonly arrays for setClassMetadata decorators | | [![fix - 2c72fe3797](https://img.shields.io/badge/2c72fe3797-fix-green)](https://github.com/angular/angular/commit/2c72fe3797ff92ead7a2531d32665fac370b4688) | allow readonly arrays in RawScopeInfoFromDecorator | | [![fix - ef2ce9a098](https://img.shields.io/badge/ef2ce9a098-fix-green)](https://github.com/angular/angular/commit/ef2ce9a09802faa5ffff0860f473c4018f25f2ac) | expose debuggableFn for non-computed signal graph nodes | | [![fix - 7bcce260f5](https://img.shields.io/badge/7bcce260f5-fix-green)](https://github.com/angular/angular/commit/7bcce260f51dc8a099c8e63f1e1e3ff8f580dcf1) | prevent orphaned requestIdleCallback handle from re-entrant scheduling | | [![fix - 44137117b3](https://img.shields.io/badge/44137117b3-fix-green)](https://github.com/angular/angular/commit/44137117b361f5bbad64e3d488e9aefd2f9ec5cb) | replace all hasOwnProperty usages with Object.hasOwn | | [![fix - 85f12a5a13](https://img.shields.io/badge/85f12a5a13-fix-green)](https://github.com/angular/angular/commit/85f12a5a130aa7fd5cd21fce3eb786a2262480e1) | stop running further effects once one destroys the view mid-flush | | [![fix - c04931c88b](https://img.shields.io/badge/c04931c88b-fix-green)](https://github.com/angular/angular/commit/c04931c88b1c7959cb95abd28cf5b3614d97e168) | throw a descriptive error instead of crashing when a hydration node is missing | | [![fix - 601d1f6576](https://img.shields.io/badge/601d1f6576-fix-green)](https://github.com/angular/angular/commit/601d1f6576b296748f56ffb50646bb1808a7c0fc) | throw NG0500 instead of a raw TypeError on element hydration mismatch | ###### forms | Commit | Description | | -- | -- | | [![fix - 83450d2924](https://img.shields.io/badge/83450d2924-fix-green)](https://github.com/angular/angular/commit/83450d292443cae811e87ab61020f3ed72d27d77) | report forbidden 2way bindings on when `FormField` is applied | | [![fix - 5cb4ea7e35](https://img.shields.io/badge/5cb4ea7e35-fix-green)](https://github.com/angular/angular/commit/5cb4ea7e355bb9ea43efa15a03dc38c53d2e4faf) | warn in dev mode when ngModel cannot reach parent NgForm across component boundary | ###### http | Commit | Description | | -- | -- | | [![fix - 0cd635e9e2](https://img.shields.io/badge/0cd635e9e2-fix-green)](https://github.com/angular/angular/commit/0cd635e9e2c409a045eaeaf920a226ef54aecc48) | cancel oversized fetch response bodies | ###### language-server | Commit | Description | | -- | -- | | [![fix - 14fbe04612](https://img.shields.io/badge/14fbe04612-fix-green)](https://github.com/angular/angular/commit/14fbe04612d29460c5d01d6c65cde579f0a42e95) | recover project for external templates in solution-style workspaces | ###### platform-browser | Commit | Description | | -- | -- | | [![fix - 3ddcb1a101](https://img.shields.io/badge/3ddcb1a101-fix-green)](https://github.com/angular/angular/commit/3ddcb1a10168ead616e523bbe044f4c39ada4cca) | disallow event handler attributes in Meta | | [![fix - _[Truncated at 4000 characters — full notes: https://github.com/angular/angular/releases/tag/v22.1.3]_ ### v22.1.2 — 22.1.2 - Date: 2026-08-13 - Version: v22.1.2 - Original notes: https://github.com/angular/angular/releases/tag/v22.1.2 - Permalink: https://whatsnew.fyi/product/angular/releases/v22.1.2 - **fixed** — Generate correct expression for optional chaining - **fixed** — Remove namespaced MathML script elements - **fixed** — Correctly resolve symbol for SafePropertyRead in chained optional navigation - **fixed** — Record class extends clause references in DeferredSymbolTracker - **fixed** — Ensure i18n_util hasOwnProperty checks are safe for property renaming - **fixed** — Fix incorrect loop in defer blocks - **fixed** — Reject prefixed SVG script hosts - **fixed** — Keep radio inputs in sync when values change - **fixed** — Always decode JSON responses as UTF-8 - **fixed** — Limit protocol-relative URL handling to serialization ###### compiler | Commit | Description | | -- | -- | | [![fix - 76dff307b4](https://img.shields.io/badge/76dff307b4-fix-green)](https://github.com/angular/angular/commit/76dff307b4c34bc4ceefcb1c7aa86c39daa5ea45) | Generate correct expression for optional chaning. | | [![fix - 6f9a64e6f5](https://img.shields.io/badge/6f9a64e6f5-fix-green)](https://github.com/angular/angular/commit/6f9a64e6f5b1e3faada6514e8b090f9d61aa8e54) | remove namespaced MathML script elements | ###### compiler-cli | Commit | Description | | -- | -- | | [![fix - e9660b1801](https://img.shields.io/badge/e9660b1801-fix-green)](https://github.com/angular/angular/commit/e9660b1801a0280fa5ba41e7c330cb6d597199ec) | correctly resolve symbol for SafePropertyRead in chained optional navigation | | [![fix - ec6deea513](https://img.shields.io/badge/ec6deea513-fix-green)](https://github.com/angular/angular/commit/ec6deea51329b0c8410c75943d90ce823081e216) | record class extends clause references in DeferredSymbolTracker | ###### core | Commit | Description | | -- | -- | | [![fix - 0df9d5eb65](https://img.shields.io/badge/0df9d5eb65-fix-green)](https://github.com/angular/angular/commit/0df9d5eb6516106188b879536f7f813a9ca8811c) | ensure i18n_util hasOwnProperty checks are safe for property renaming | | [![fix - 4d985a179e](https://img.shields.io/badge/4d985a179e-fix-green)](https://github.com/angular/angular/commit/4d985a179e66428d46e60b4622435f88c39e1d2b) | incorrect loop in defer blocks | | [![fix - 7b40456792](https://img.shields.io/badge/7b40456792-fix-green)](https://github.com/angular/angular/commit/7b404567924840aabdb955704a9bc04778b14f73) | reject prefixed SVG script hosts | ###### forms | Commit | Description | | -- | -- | | [![fix - 3b5c798072](https://img.shields.io/badge/3b5c798072-fix-green)](https://github.com/angular/angular/commit/3b5c798072a3cf43b5e0ec0b3f4abc18bc6196a5) | keep radio inputs in sync when values change | ###### http | Commit | Description | | -- | -- | | [![fix - 4f7e9987fa](https://img.shields.io/badge/4f7e9987fa-fix-green)](https://github.com/angular/angular/commit/4f7e9987fa35888de43895bfd859382dfa436e51) | always decode JSON responses as UTF-8 | ###### router | Commit | Description | | -- | -- | | [![fix - 2f82601662](https://img.shields.io/badge/2f82601662-fix-green)](https://github.com/angular/angular/commit/2f82601662a958b3accd4d22dff7ad4ec7c56d77) | limit protocol-relative URL handling to serialization | ### v22.1.1 — 22.1.1 - Date: 2026-08-07 - Version: v22.1.1 - Original notes: https://github.com/angular/angular/releases/tag/v22.1.1 - Permalink: https://whatsnew.fyi/product/angular/releases/v22.1.1 - **fixed** — Initialize hydration triggers after late runtime activation - **fixed** — Warn when style property bindings receive invalid values - **fixed** — Avoid aborting completed requests in FetchBackend - **fixed** — Respect content-type charset in fetch backend text decoder - **fixed** — Run root interceptors in the terminal request chain - **fixed** — Strip RFC 6265 DQUOTE characters and handle URIError in parseCookieValue ###### core | Commit | Description | | -- | -- | | [![fix - aa6d3189c1](https://img.shields.io/badge/aa6d3189c1-fix-green)](https://github.com/angular/angular/commit/aa6d3189c141a9247615ed14d856813ea1b95c8d) | initialize hydration triggers after late runtime activation | | [![fix - deecb301c8](https://img.shields.io/badge/deecb301c8-fix-green)](https://github.com/angular/angular/commit/deecb301c8aab4c22b80eaa505042311ee938b67) | warn when style property bindings receive invalid values | ###### http | Commit | Description | | -- | -- | | [![fix - ac3728e79f](https://img.shields.io/badge/ac3728e79f-fix-green)](https://github.com/angular/angular/commit/ac3728e79fd8fae7a4b38e20d152c5a734a6e3fc) | avoid aborting completed requests in FetchBackend | | [![fix - 688a0a7118](https://img.shields.io/badge/688a0a7118-fix-green)](https://github.com/angular/angular/commit/688a0a7118215bcab10004a3bf2667773fefdf74) | respect content-type charset in fetch backend text decoder | | [![fix - a13b968451](https://img.shields.io/badge/a13b968451-fix-green)](https://github.com/angular/angular/commit/a13b9684510dfd04e18f3e1d6686d556c051f34e) | run root interceptors in the terminal request chain | | [![fix - 32af9b525e](https://img.shields.io/badge/32af9b525e-fix-green)](https://github.com/angular/angular/commit/32af9b525efe005998a9cd02aebfcc08e6793cf2) | strip RFC 6265 DQUOTE characters and handle URIError in parseCookieValue | ### v22.1.0 — 22.1.0 - Date: 2026-07-29 - Version: v22.1.0 - Original notes: https://github.com/angular/angular/releases/tag/v22.1.0 - Permalink: https://whatsnew.fyi/product/angular/releases/v22.1.0 - **fixed** — skip transfer cache for uncacheable HTTP traffic - **added** — add an error for --global-foo cases - **added** — namespace CSS variables to the app - **added** — support css var namespacing in properties - **fixed** — permissive whitespace parsing in default never blocks - **fixed** — support foreign components defined outside top-level scope - **fixed** — support foreign components inside control flow blocks - **fixed** — allow passing uninvoked signals as foreign component props - **fixed** — support import aliases in foreignImports - **added** — add custom set option to linkedSignal - **added** — add deep linking from Performance panel to DevTools - **fixed** — account for namespaces in host binding sanitization - **fixed** — correct container anchor collection order to match DOM layout - **fixed** — introduce disposal mechanism for Angular views in foreign @content - **fixed** — introduce logical-only containers for foreign content - **fixed** — sanitize host bindings on concrete hosts - **fixed** — set current tnode in foreign component instruction on reuse - **added** — add options to allow caching of credentialed and non-cacheable HTTP requests - **fixed** — enable xsrf for root-provided HttpClient - **fixed** — match header values exactly when deleting - **deprecated** — deprecate jsonp support ###### common | Commit | Description | | -- | -- | | [![fix - 1ad6824d0d](https://img.shields.io/badge/1ad6824d0d-fix-green)](https://github.com/angular/angular/commit/1ad6824d0dd17a0515ad0544cf435d1e3af6982e) | skip transfer cache for uncacheable HTTP traffic (#69017) | ###### compiler | Commit | Description | | -- | -- | | [![feat - af5e4e1131](https://img.shields.io/badge/af5e4e1131-feat-blue)](https://github.com/angular/angular/commit/af5e4e113130427ba8152166b4d904dd177c982e) | Add an error for --global-foo cases (#68846) | | [![feat - d579ecaf73](https://img.shields.io/badge/d579ecaf73-feat-blue)](https://github.com/angular/angular/commit/d579ecaf733db325f628cc11a28688fa0dad85ee) | Disable '--global-' error outside of g3 (#68846) | | [![feat - f98547675c](https://img.shields.io/badge/f98547675c-feat-blue)](https://github.com/angular/angular/commit/f98547675cd2026bb755671b28dea4e6d48eb7bb) | Namespace CSS variables to the app (#68846) | | [![feat - 8c8b2f7783](https://img.shields.io/badge/8c8b2f7783-feat-blue)](https://github.com/angular/angular/commit/8c8b2f77831236b23ca99ccb62e6197ff43b400d) | Support css var namespacing in properties (#68846) | | [![fix - 292199aa4d](https://img.shields.io/badge/292199aa4d-fix-green)](https://github.com/angular/angular/commit/292199aa4dd4cbf09f14c20bd7049d6ab55d83f4) | permissive whitespace parsing in default never blocks | | [![fix - 25c744c4d0](https://img.shields.io/badge/25c744c4d0-fix-green)](https://github.com/angular/angular/commit/25c744c4d0abd3bfe863ed2d528fea756ec5801b) | support foreign components defined outside top-level scope | | [![fix - 5bd00add07](https://img.shields.io/badge/5bd00add07-fix-green)](https://github.com/angular/angular/commit/5bd00add071e404ddab318eea82db81b5715a194) | support foreign components inside control flow blocks (#69674) | | [![perf - 2e442f7876](https://img.shields.io/badge/2e442f7876-perf-orange)](https://github.com/angular/angular/commit/2e442f787627a1f44d8b6463a1cb979ef6f7e049) | do not emit tag name when control flow root is foreign component (#69674) | ###### compiler-cli | Commit | Description | | -- | -- | | [![fix - aeb55c8bc1](https://img.shields.io/badge/aeb55c8bc1-fix-green)](https://github.com/angular/angular/commit/aeb55c8bc101dc313dc64f83f4428ddfad28d54e) | allow passing uninvoked signals as foreign component props | | [![fix - 7c60a98b3c](https://img.shields.io/badge/7c60a98b3c-fix-green)](https://github.com/angular/angular/commit/7c60a98b3ccc2090f3bfb3c76d6207f37a5df0ff) | support import aliases in foreignImports (#68674) | ###### core | Commit | Description | | -- | -- | | [![feat - 124ba10ead](https://img.shields.io/badge/124ba10ead-feat-blue)](https://github.com/angular/angular/commit/124ba10ead58c9f93b0b74c4102022c4674db1f5) | add custom set option to linkedSignal | | [![feat - eab4847a8b](https://img.shields.io/badge/eab4847a8b-feat-blue)](https://github.com/angular/angular/commit/eab4847a8bd1b47ba630ca9b20c85770f990c717) | Adds deep linking from Performance panel to DevTools | | [![fix - 091456a214](https://img.shields.io/badge/091456a214-fix-green)](https://github.com/angular/angular/commit/091456a2146d81b225fa9322a9ebde24695aaad0) | account for namespaces in host binding sanitization (#69558) | | [![fix - b3748e9fe4](https://img.shields.io/badge/b3748e9fe4-fix-green)](https://github.com/angular/angular/commit/b3748e9fe4a4f9f56f9843b448db59674ad01452) | correct container anchor collection order to match DOM layout | | [![fix - 11b206b919](https://img.shields.io/badge/11b206b919-fix-green)](https://github.com/angular/angular/commit/11b206b919074149f2db6e3640a55284aecfe48a) | introduce disposal mechanism for Angular views in foreign `@content` | | [![fix - 56607967db](https://img.shields.io/badge/56607967db-fix-green)](https://github.com/angular/angular/commit/56607967dbba25e63f86fd128ec0c1c4ce3e5232) | introduce logical-only containers for foreign content | | [![fix - 23cf1a828b](https://img.shields.io/badge/23cf1 _[Truncated at 4000 characters — full notes: https://github.com/angular/angular/releases/tag/v22.1.0]_ ### v22.0.8 — 22.0.8 - Date: 2026-07-22 - Version: v22.0.8 - Original notes: https://github.com/angular/angular/releases/tag/v22.0.8 - Permalink: https://whatsnew.fyi/product/angular/releases/v22.0.8 - **fixed** — Preserve crossorigin on image preloads - **fixed** — Ensure SVG animation attributeName is checked case-insensitively - **fixed** — Ensure pending status propagates to the root form in signal forms - **fixed** — Prevent transfer cache key collisions - **fixed** — Correctly migrate ngClass with mixed space-separated keys - **fixed** — Preserve NgClass import on partial migration ###### common | Commit | Description | | -- | -- | | [![fix - c0368f2278](https://img.shields.io/badge/c0368f2278-fix-green)](https://github.com/angular/angular/commit/c0368f227846024bb26d3628c59541e870bb36e4) | preserve crossorigin on image preloads | ###### core | Commit | Description | | -- | -- | | [![fix - 8616ba9db6](https://img.shields.io/badge/8616ba9db6-fix-green)](https://github.com/angular/angular/commit/8616ba9db6240f3fbf8b905342d07326e096302b) | ensure SVG animation attributeName is checked case-insensitively | ###### forms | Commit | Description | | -- | -- | | [![fix - d302c7ab83](https://img.shields.io/badge/d302c7ab83-fix-green)](https://github.com/angular/angular/commit/d302c7ab833c0bd3bba951135e76e0c48273b3d7) | ensure `pending` status propagates to the root form in signal forms | ###### http | Commit | Description | | -- | -- | | [![fix - 9d40f8aefe](https://img.shields.io/badge/9d40f8aefe-fix-green)](https://github.com/angular/angular/commit/9d40f8aefef9dcd893db5d01bc58d3e65e1cb4c2) | prevent transfer cache key collisions | ###### migrations | Commit | Description | | -- | -- | | [![fix - 388daea2fc](https://img.shields.io/badge/388daea2fc-fix-green)](https://github.com/angular/angular/commit/388daea2fc188aad3ab69fb81bd3f893ac3cd846) | correctly migrate ngClass with mixed space-separated keys | | [![fix - bb39cda648](https://img.shields.io/badge/bb39cda648-fix-green)](https://github.com/angular/angular/commit/bb39cda6483de2edab2f8221459b0ed5b73ef221) | preserve NgClass import on partial migration | ### v22.0.7 — 22.0.7 - Date: 2026-07-16 - Version: v22.0.7 - Original notes: https://github.com/angular/angular/releases/tag/v22.0.7 - Permalink: https://whatsnew.fyi/product/angular/releases/v22.0.7 - **fixed** — avoid prototype lookups in date format caches - **fixed** — parsing of an empty template literal interpolation - **fixed** — re-tag SourceFiles after TsCreateProgramDriver.updateFiles() - **fixed** — allow static attributes for explicit input transforms - **fixed** — ignore processing instruction syntax in templates - **fixed** — preserve explicit input transform write type - **fixed** — allow multiple async validators - **fixed** — preserve intermediate number values in signal forms - **fixed** — prevent stale CVA writeback during debounce - **fixed** — prevent interceptor signal reads from leaking into calling reactive contexts - **fixed** — build runtime translations map with a null prototype - **fixed** — use Object.hasOwn for placeholder lookup in translate - **fixed** — prevent ReDoS in SOURCEMAP_URL_REGEXP ###### common | Commit | Description | | -- | -- | | [![fix - 91e33aa1de](https://img.shields.io/badge/91e33aa1de-fix-green)](https://github.com/angular/angular/commit/91e33aa1de47d250d8cde21047597e8df771f07d) | avoid prototype lookups in date format caches | ###### compiler | Commit | Description | | -- | -- | | [![fix - 5b516e3a58](https://img.shields.io/badge/5b516e3a58-fix-green)](https://github.com/angular/angular/commit/5b516e3a58e1233f2e01cbb53267b9563a72d5f1) | parsing of an empty template literal interpolation | ###### compiler-cli | Commit | Description | | -- | -- | | [![fix - c88ddde1c9](https://img.shields.io/badge/c88ddde1c9-fix-green)](https://github.com/angular/angular/commit/c88ddde1c9f56e3b5c5cf264e87217b86a036a58) | re-tag SourceFiles after TsCreateProgramDriver.updateFiles() | ###### core | Commit | Description | | -- | -- | | [![fix - 94d9591b51](https://img.shields.io/badge/94d9591b51-fix-green)](https://github.com/angular/angular/commit/94d9591b512c94577080c77911dbd1c3516a8a81) | allow static attributes for explicit input transforms | | [![fix - c89f71a74c](https://img.shields.io/badge/c89f71a74c-fix-green)](https://github.com/angular/angular/commit/c89f71a74ce312f9f6522796a106eac48bd33ebb) | ignore processing instruction syntax in templates | | [![fix - 70500e4067](https://img.shields.io/badge/70500e4067-fix-green)](https://github.com/angular/angular/commit/70500e4067e74e5b5f79a15774b5d2f01524f397) | preserve explicit input transform write type | ###### forms | Commit | Description | | -- | -- | | [![fix - 1b9964675f](https://img.shields.io/badge/1b9964675f-fix-green)](https://github.com/angular/angular/commit/1b9964675f0cfee30a0e8f6df664d1961a3dc3ae) | allow multiple async validators | | [![fix - 64d6d47a0c](https://img.shields.io/badge/64d6d47a0c-fix-green)](https://github.com/angular/angular/commit/64d6d47a0c67709ce887a90666fc214c40a283c4) | preserve intermediate number values in signal forms | | [![fix - 6cf7446afa](https://img.shields.io/badge/6cf7446afa-fix-green)](https://github.com/angular/angular/commit/6cf7446afaedd461b9e28291e326f6f2372fa157) | prevent stale CVA writeback during debounce | ###### http | Commit | Description | | -- | -- | | [![fix - 20b7dc3023](https://img.shields.io/badge/20b7dc3023-fix-green)](https://github.com/angular/angular/commit/20b7dc3023df9ccde232cf9fef1d2b1d3ae68b23) | prevent interceptor signal reads from leaking into calling reactive contexts | ###### localize | Commit | Description | | -- | -- | | [![fix - 22d5a091d1](https://img.shields.io/badge/22d5a091d1-fix-green)](https://github.com/angular/angular/commit/22d5a091d10ac70ece469a4bf69b03c51805614b) | build runtime translations map with a null prototype | | [![fix - 8ce1fcf7fa](https://img.shields.io/badge/8ce1fcf7fa-fix-green)](https://github.com/angular/angular/commit/8ce1fcf7faef3ef4b3612e0faeac2701a82c5434) | use Object.hasOwn for placeholder lookup in translate | ###### platform-browser | Commit | Description | | -- | -- | | [![fix - b34bf0dce8](https://img.shields.io/badge/b34bf0dce8-fix-green)](https://github.com/angular/angular/commit/b34bf0dce855bca3c6dfcf7e19d38b3b39288a16) | prevent ReDoS in SOURCEMAP_URL_REGEXP | ### v22.0.6 — 22.0.6 - Date: 2026-07-08 - Version: v22.0.6 - Original notes: https://github.com/angular/angular/releases/tag/v22.0.6 - Permalink: https://whatsnew.fyi/product/angular/releases/v22.0.6 - **fixed** — Use regular optional chaining expression for safe function calls in template checking blocks - **fixed** — Apply debugName transform to required signal queries - **fixed** — Detect uninvoked signals in bound expressions using ternary - **fixed** — Make extractValue reactive for compat AbstractControl values - **fixed** — Preserve transitive NgModule references when pruning - **fixed** — Remove stale model import in model-output migration - **fixed** — Handle outlet named __proto__ in segment group maps - **fixed** — Use safe hasOwnProperty when parsing query params ###### compiler | Commit | Description | | -- | -- | | [![fix - fd4ddcafed](https://img.shields.io/badge/fd4ddcafed-fix-green)](https://github.com/angular/angular/commit/fd4ddcafed340dbc116df9718f03ee9e16c41c18) | use regular optional chaining expression for safe function calls in TCBs | ###### compiler-cli | Commit | Description | | -- | -- | | [![fix - 534fe81a89](https://img.shields.io/badge/534fe81a89-fix-green)](https://github.com/angular/angular/commit/534fe81a8904408f252cbbbd90ca3e46bf5df3c9) | apply debugName transform to required signal queries | | [![fix - 3b08201bfb](https://img.shields.io/badge/3b08201bfb-fix-green)](https://github.com/angular/angular/commit/3b08201bfb63227b9a30e7c40b966412496f115d) | detect uninvoked signals in bound expressions using ternary | ###### forms/signals | Commit | Description | | -- | -- | | [![fix - 171669f7b2](https://img.shields.io/badge/171669f7b2-fix-green)](https://github.com/angular/angular/commit/171669f7b25343b10143cff04f69e2f46c6bf43f) | make extractValue reactive for compat AbstractControl values | ###### migrations | Commit | Description | | -- | -- | | [![fix - 0a6af1496b](https://img.shields.io/badge/0a6af1496b-fix-green)](https://github.com/angular/angular/commit/0a6af1496b0bc2e3685018124eba6128875a2102) | preserve transitive NgModule references when pruning | | [![fix - d4a926a762](https://img.shields.io/badge/d4a926a762-fix-green)](https://github.com/angular/angular/commit/d4a926a7621e9c421e537377fffc78e553bb69a8) | remove stale model import in model-output migration | ###### router | Commit | Description | | -- | -- | | [![fix - c238bd2ad7](https://img.shields.io/badge/c238bd2ad7-fix-green)](https://github.com/angular/angular/commit/c238bd2ad7adf9cd5d74adda5a665b6481661a62) | handle outlet named __proto__ in segment group maps | | [![fix - 8e6d7f7190](https://img.shields.io/badge/8e6d7f7190-fix-green)](https://github.com/angular/angular/commit/8e6d7f71906e35181577b9e66474695ba3077599) | use safe hasOwnProperty when parsing query params |