@angular/service-worker
Advanced tools
Changelog
20.0.4 (2025-06-18)
| Commit | Type | Description |
| -- | -- | -- |
| e343cdfb86 | fix | Fixes template outlet hydration (#62012) |
| 67f657e4a3 | fix | inject APP_ID
before injector is destroyed (#61885) |
| ae212b51ee | fix | Wrap ErrorEvent with no error property (#62081) |
| Commit | Type | Description | | -- | -- | -- | | 82bf9848a1 | fix | more robust trailing comma removal in unused imports migration (#62118) |
<!-- CHANGELOG SPLIT MARKER --><a name="20.1.0-next.1"></a>
Changelog
20.1.0-next.1 (2025-06-11)
| Commit | Type | Description | | -- | -- | -- | | ef10aa4005 | feat | support decoding in NgOptimizedImage (#61905) |
| Commit | Type | Description | | -- | -- | -- | | b7ab5fa256 | fix | add signal checks to handle negated calls (#59970) |
| Commit | Type | Description |
| -- | -- | -- |
| 3aa933acb7 | fix | components marked for traversal resets reactive context (#61663) |
| e81ea0c3dd | fix | unregister onDestroy
in outputToObservable
(#61882) |
| Commit | Type | Description | | -- | -- | -- | | 4f0221e193 | fix | improve select performance (#61949) |
<!-- CHANGELOG SPLIT MARKER --><a name="20.0.3"></a>
Changelog
20.0.3 (2025-06-11)
<!-- CHANGELOG SPLIT MARKER --><a name="20.0.2"></a>
Changelog
20.0.2 (2025-06-06)
| Commit | Type | Description |
| -- | -- | -- |
| 1e8158baee | fix | components marked for traversal resets reactive context (#61663) |
| 1cd23be57e | fix | unregister onDestroy
in outputToObservable
(#61882) |
<a name="20.1.0-next.0"></a>
Changelog
20.1.0-next.0 (2025-06-04)
| Commit | Type | Description | | -- | -- | -- | | 5a76826d26 | fix | only report parser errors on invalid expression (#61793) | | e9fcbb8af1 | fix | remove TypeScript from linker (#61618) |
| Commit | Type | Description | | -- | -- | -- | | e62fb359d6 | feat | add experimental support for fast type declaration emission (#61334) | | 0cf1001715 | feat | support host directives with direct external references in fast type declaration emission (#61469) | | 77fa204ad1 | fix | rename flag for enabling fast type declaration emission (#61353) | | c439d6938d | fix | symbol builder duplicating host directives (#61240) | | 3e1baa5a95 | fix | typo in NG2026 message (#61325) |
| Commit | Type | Description |
| -- | -- | -- |
| 8163a8995e | feat | Add destroyed
property on DestroyRef
(#61849) |
| 4356e85456 | fix | fakeAsync should not depend on module import order (#61375) |
| 583b9a7be5 | fix | missing useExisting providers throwing for optional calls (#61137) |
| 8f65223bd8 | fix | update min Node.js support to 20.19, 22.12, and 24.0 (#61499) |
| b785256b9e | perf | avoid intermediate arrays in definition (#61445) |
| Commit | Type | Description |
| -- | -- | -- |
| 610bebfce9 | fix | Allow ControlState as reset arguments for FormGroup
/FormRecord
(#55860) |
| Commit | Type | Description | | -- | -- | -- | | cf55d1bdd4 | feat | Support importing the external module's export about the angular metadata. (#61122) |
| Commit | Type | Description | | -- | -- | -- | | c67dbda8ff | feat | support notification closes (#61442) | | 6e1df54799 | feat | support push subscription changes (#61856) |
<!-- CHANGELOG SPLIT MARKER --><a name="20.0.1"></a>
Changelog
20.0.1 (2025-06-04)
| Commit | Type | Description | | -- | -- | -- | | 66a0ec6510 | fix | move defer trigger assertions out of parser (#61747) | | 8ecb1ba027 | fix | recover invalid parenthesized expressions (#61815) |
| Commit | Type | Description |
| -- | -- | -- |
| 8c60cbfd1c | fix | takeUntilDestroyed
completes immediately if DestroyRef already destroyed (#61847) |
| b1d960d082 | fix | produce an error when incremental hydration is expected, but not configured (#61741) |
| b4ed62ddf6 | fix | properly handle the case where getSignalGraph is called on a componentless NodeInjector (#60772) |
| ddd22bea48 | fix | unregister onDestroy
in ResourceImpl
when destroy()
is called (#61870) |
| 5c31e7e28d | fix | unregister onDestroy
when observable errors in toSignal
(#61596) |
| Commit | Type | Description | | -- | -- | -- | | e9820a6d48 | fix | avoid trailing whitespaces in unused imports migration (#61698) |
| Commit | Type | Description | | -- | -- | -- | | b93fa22f25 | fix | prevent duplicate fetches during concurrent update checks (#61443) | | 9743bd1317 | fix | update service worker to handle seeking better for videos (#60029) |
<!-- CHANGELOG SPLIT MARKER --><a name="20.0.0"></a>
Changelog
20.0.0 (2025-05-28)
Blog post: https://blog.angular.dev/announcing-angular-v20-b5c9c06cf301
Y
formatter (week-numbering year) without also including w
(week number) is now detected as suspicious date pattern, as y
is typically intended.AsyncPipe
now directly catches unhandled errors in
subscriptions and promises and reports them to the application's
ErrorHandler
. For Zone-based applications, these errors would have
been caught by ZoneJS and reported to ErrorHandler
so the result is
generally the same. The change to the exact mechanism for reporting can
result in differences in test environments that will require test
updates.'in' in an expression now refers to the operator
void
in an expression now refers to the operator
Previously an expression in the template like {{void}}
referred to a
property on the component class. After this change it now refers to the
void
operator, which would make the above example invalid. If you have
existing expressions that need to refer to a property named void
,
change the expression to use this.void
instead: {{this.void}}
.
TypeScript versions less than 5.8 are no longer supported.
the TestBed.flushEffects()
was removed - use
the TestBed.tick()
instead.
provideExperimentalCheckNoChangesForDebug
has several
breaking changes:
provideCheckNoChangesConfig
useNgZoneOnStable
option is removed. This wasn't found to be generally
more useful than interval
provideExperimentalZonelessChangeDetection
is
renamed to provideZonelessChangeDetection
as it is now "Developer
Preview" rather than "Experimental".
InjectFlags
has been removed.inject
no longer accepts InjectFlags
.Injector.get
no longer accepts InjectFlags
.EnvironmentInjector.get
no longer accepts InjectFlags
.TestBed.get
no longer accepts InjectFlags
.TestBed.inject
no longer accepts InjectFlags
.TestBed.get
has been removed. Use TestBed.inject
instead.afterRender was renamed to afterEveryRender.
Before upgrading to Angular v20, ensure the Node.js version is at least 20.11.1. For the full list of supported versions, visit: https://angular.dev/reference/versions
PendingTasks.run
no longer returns the result of the
async function. If this behavior is desired, it can be re-implemented
manually with the PendingTasks.add
. Be aware, however, that promise rejections
will need to be handled or they can cause the node process to shut down
when using SSR.
Uncaught errors in listeners which were previously only reported to
ErrorHandler
are now also reported to Angular's internal error
handling machinery. For tests, this means that the error will be
rethrown by default rather than only logging the error. Developers
should fix these errors, catch them in the test if the test is
intentionally covering an error case, or use rethrowApplicationErrors: false
in configureTestingModule
as a last resort.
The any
overload has been removed from
injector.get
. It now only supports ProviderToken<T>
and (deprecated
since v4) string
.
Animations are guaranteed to be flushed when Angular
runs automatic change detection or manual calls to ApplicationRef.tick
.
Prior to this change, animations would not be flushed in some situations
if change detection did not run on any views attached to the
application. This change can affect tests which may rely on the old
behavior, often by making assertions on DOM elements that should have
been removed but weren't because DOM removal is delayed until animations
are flushed.
ApplicationRef.tick
will no longer catch and report
errors to the appplication ErrorHandler
. Errors will instead be thrown out of
the method and will allow callers to determine how to handle these
errors, such as aborting follow-up work or reporting the error and
continuing.
This commit deprecates ng-reflect-*
attributes and updates the runtime to stop producing them by default. Please refactor application and test code to avoid relying on ng-reflect-*
attributes.
To enable a more seamless upgrade to v20, we've added the provideNgReflectAttributes()
function (can be imported from the @angular/core
package), which enables the mode in which Angular would be producing those attribites (in dev mode only). You can add the provideNgReflectAttributes()
function to the list of providers within the bootstrap call.
RedirectFn
can now return Observable
or
Promise
. Any code that directly calls functions returning this type
may need to be adjusted to account for this.Route
no longer include any
in
the type union. The union includes functions for the functional guards
as well as a type matching Injector.get
: ProviderToken<T>|string
.
Note that string is still deprecated on both the route guards and
Injector.get
.ngIf
/ngFor
/ngSwitch
are deprecated. Use the control flow blocks instead (@for
/@if
/@switch
).@angular/platform-browser-dynamic
@angular/platform-server/testing
Use e2e tests to verify SSR behavior instead.
| Commit | Type | Description |
| -- | -- | -- |
| 2e5362a469 | feat | accept undefined inputs in NgTemplateOutlet (#61404) |
| b7d3f3dbfc | feat | Allow passing ScrollOptions to ViewportScroller (#61002) |
| 74cceba587 | feat | throw error for suspicious date patterns (#59798) |
| 255c79e048 | fix | cleanup updateLatestValue
if view is destroyed before promise resolves (#58041) |
| 739cadae62 | fix | Handle errors in async pipe subscriptions (#60057) |
| cbbea70fa3 | fix | issue a warning instead of an error when NgOptimizedImage
exceeds the preload limit (#60879) |
| fc4a56d5c5 | fix | rename httpResource function in factory (#60022) |
| 785a1110e6 | fix | resolve host binding type issues (#60481) |
| Commit | Type | Description |
| -- | -- | -- |
| 7a971766dc | feat | add extended diagnostic for uninvoked track function on @for
blocks (#60495) |
| f2d5cf7edd | feat | support exponentiation operator in templates (#59894) |
| 51b8ff23ce | feat | support tagged template literals in expressions (#59947) |
| 1b8e7ab9fe | feat | support the in
keyword in Binary expression (#58432) |
| 0361c2d81f | feat | support void operator in templates (#59894) |
| 8b990a31c3 | fix | error if rawText isn't estimated correctly (#60529) |
| 4fe489f1b4 | fix | exponentiation should be right-to-left associative (#60101) |
| ef1fd137a9 | fix | incorrect spans for template literals (#60323) |
| e0d378d20e | fix | incorrectly handling let declarations inside i18n (#60512) |
| b70ad3c4e6 | fix | proper handling of typeof, void in RecursiveAstVisitor (#60101) |
| e25e6c95a2 | fix | remove TypeScript from linker (#61635) |
| 768239a89c | perf | reduce allocations for let declarations only used in the same view (#60512) |
| Commit | Type | Description | | -- | -- | -- | | bec1610da2 | feat | add extended diagnostic for invalid nullish coalescing (#60279) | | c889382a20 | feat | detect missing structural directive imports (#59443) | | 1971e57a45 | feat | support type checking of host bindings (#60267) | | 9ec9c7e1b8 | fix | avoid fatal diagnostics for invalid module schemas (#61220) | | a1cacc5b17 | fix | avoid fatal diagnostics for missing template files (#58673) | | 1e6faad479 | fix | correctly parse event name in HostListener (#60561) | | ffb19e64f1 | fix | preserve required parens for nullish coalescing (#60060) | | 7c9b4892e9 | fix | preserve required parens in exponentiation expressions (#60101) | | 7e03af898e | fix | set correct target when type checking events (#60561) | | 2d51a203dc | fix | wrong event name for host listener decorators (#60460) |
| Commit | Type | Description |
| -- | -- | -- |
| 22d3f0562c | feat | add hook for producer creation side effects (#60333) |
| fe57332fc5 | feat | add input binding support to dynamically-created components (#60137) |
| 65adb3024d | feat | Add provider which reports unhandled errors on window to ErrorHandler (#60704) |
| b154fb3911 | feat | add support for two-way bindings on dynamically-created components (#60342) |
| 82aa2c1a52 | feat | add the ability to apply directives to dynamically-created components (#60137) |
| 326d48afb4 | feat | drop support for TypeScript older than 5.8 (#60197) |
| d260ca3091 | feat | emit template function for template related profiler hooks (#60174) |
| a4bad8d361 | feat | export signalGetFn from signal primitives (#60497) |
| 4812215a7b | feat | Expose Injector.destroy
on Injector
created with Injector.create
(#60054) |
| c1bcae91dd | feat | expose performance data in Chrome DevTools (#60789) |
| 809b5b4596 | feat | introduce new DI profiling event (#60158) |
| d5fd7349fb | feat | introduce TestBed.tick() (#60993) |
| 4e88e18a8e | feat | mark toObservable
as stable (#60449) |
| 727cda3856 | feat | mark linkedSignal API as public (#60865) |
| 644d9f3bbd | feat | mark the toSignal API as stable (#60442) |
| e711f99d81 | feat | move provideExperimentalCheckNoChangesForDebug
to provideCheckNoChangesConfig
(#60906) |
| 7ccec1494f | feat | move DOCUMENT token into core (#60663) |
| 953c4b2580 | feat | Move zoneless change detection to dev preview (#60748) |
| 611baaf069 | feat | remove InjectFlags from public API (#60318) |
| 5e209cb560 | feat | remove TestBed.get (#60414) |
| d8fbb909ce | feat | rename afterRender to afterEveryRender and stabilize (#60999) |
| 567522398f | feat | stabilize incremental hydration api (#60888) |
| 8d050b5bfc | feat | stabilize linkedSignal API (#60741) |
| 866cea9a05 | feat | Stabilize PendingTasks Injectable (#60716) |
| bf8492b871 | feat | stabilize withI18nSupport() api (#60889) |
| be44cc8f40 | feat | support listening to outputs on dynamically-created components (#60137) |
| fe9b79b615 | feat | update Node.js version support (#60545) |
| e170d24240 | fix | add migration away from InjectFlags (#60318) |
| 7eb59d3887 | fix | added @angular/compiler as a peer dependency (#55610) |
| 7232ce5b17 | fix | Catch and report rejections in async function of PendingTasks.run
(#60044) |
| fd12220a35 | fix | defer block render failures should report to application error handler (#60149) |
| 3459faadbf | fix | do not allow setInput to be used with inputBinding (#60137) |
| 0ac949c266 | fix | do not run change detection on global error events (#60944) |
| 4fe34f4cfe | fix | enable stashing only when withEventReplay()
is invoked (#61077) |
| 962b59b14e | fix | Ensure ComponentFixture does not duplicate error reporting from FakeAsync (#60104) |
| 7b819be83f | fix | Ensure errors in listeners report to the application error handler (#60251) |
| ff772d7800 | fix | fix typing on injector.get to omit 'any' (#60202) |
| 13d1c8ab38 | fix | fixes timing of hydration cleanup on control flow (#60425) |
| 0b69b61929 | fix | Flush animations when no component has been checked (#58089) |
| 3ba39bc28f | fix | getting resource value throws an error instead of returning undefined (#61441) |
| ca6295e90b | fix | handle different DI token types in Chrome DevTools integration (#61333) |
| 0162ceb427 | fix | inject migration should treat @Attribute
as optional (#60916) |
| ea5eb28865 | fix | input targeting not checking if input exists on host (#60137) |
| c8951159ac | fix | mark zone.js
as an optional peer dependency (#61616) |
| d62379bb13 | fix | move reload method from Resource to WritableResource (#61441) |
| a89f1cff24 | fix | narrow error type for resources API (#61441) |
| 624be2ef0c | fix | prevent stash listener conflicts (#59635) |
| 017cc0a37c | fix | properly handle app stabilization with defer blocks (#61040) |
| 6e79eaf739 | fix | reading resource value after reload in the error state (#61441) |
| 3d85d9363c | fix | reduce total memory usage of various migration schematics (#60774) |
| 1c7b356625 | fix | release hasPendingTasks
observers (#59723) |
| 43cbc58254 | fix | remove forceRoot
flag for effects (#60535) |
| 48974c3cf8 | fix | remove rejectErrors
option encourages uncaught exceptions (#60397) |
| 491b0a4ead | fix | Remove duplicate reporting of errors in CDR.detectChanges
(#60056) |
| 04d963c0a5 | fix | remove unused parameter from listener instruction (#60406) |
| 0ae1889560 | fix | run ApplicationRef.prototype.bootstrap
in NgZone
(#60720) |
| a611b234d7 | fix | run root effects in creation order (#60534) |
| 338818ce89 | fix | Surface errors from ApplicationRef.tick
to callsite (#60102) |
| 350776b412 | fix | TestBed.tick should ensure test components are synchronized (#61382) |
| 3d4ddd2247 | fix | Testing should not throw when Zone does not patch test FW APIs (#61628) |
| 30e081287d | fix | update min Node.js support to 20.19, 22.12, and 24.0 (#61500) |
| b407157ee8 | refactor | Deprecate the structural directives ngIf
/ngFor
/ngSwitch
. (#60492) |
| c2987d8402 | refactor | stop producing ng-reflect
attributes by default (#60973) |
| Commit | Type | Description | | -- | -- | -- | | a07ee60989 | feat | add markAllAsDirty to AbstractControl (#58663) | | bdfbd54932 | feat | Allow to reset a form without emitting events (#60354) | | 81fe0536fd | fix | Make sure statusChanges is emitted (#57098) | | bdd5e20423 | fix | resolve host binding type issues (#60481) |
| Commit | Type | Description | | -- | -- | -- | | ccc5cc068f | feat | add keepalive support for fetch requests (#60621) | | 5795e03cdf | fix | Delay stabilization until next app synchronization (#60656) |
| Commit | Type | Description |
| -- | -- | -- |
| bc2cab747f | refactor | Deprecate the platform-browser-dynamic
package (#61043) |
| a980ac9a6a | refactor | Deprecate the HammerJS integration (#60257) |
| Commit | Type | Description | | -- | -- | -- | | 2240a21c97 | refactor | deprecate the testing entry point (#60915) |
| Commit | Type | Description | | -- | -- | -- | | 0bb4bd661e | feat | Add ability to directly abort a navigation (#60380) | | 62de7d930a | feat | add asynchronous redirects (#60863) | | 7c12cb1df9 | feat | Allow resolvers to read resolved data from ancestors (#59860) | | ff98ccb193 | feat | support custom elements for RouterLink (#60290) | | 219f41d049 | fix | Prevent dangling promise rejections from internal navigations (#60162) | | 2419060fef | fix | relax required types on router commands to readonly array (#60345) | | c57951d58f | fix | Remove 'any' type from route guards (#60378) | | db2f2d99c8 | fix | Scroller should scroll as soon as change detection completes (#60086) |
<!-- CHANGELOG SPLIT MARKER --><a name="19.2.14"></a>