Packages

@angular/platform-browser-dynamic

22.2.3 · 14 Oct 2026MIT4.2M / weekRepositoryHomepagenpmAtom feed

Your version

20.0.0

major28 May 2025Where it was published

20.3.34 is the newest release of 20.x.

In short

21 breaking4 deprecated

  • breaking

    Using the Y formatter (week-numbering year) without also including w (week number) is now detected as suspicious date pattern, as y is typically intended.

  • breaking

    AsyncPipe now directly catches unhandled errors in

  • breaking

    'in' in an expression now refers to the operator

  • breaking

    void in an expression now refers to the operator

  • breaking
    • TypeScript versions less than 5.8 are no longer supported.

  • breaking

    The TestBed.flushEffects() was removed - use

  • breaking

    provideExperimentalCheckNoChangesForDebug has several

  • breaking

    provideExperimentalZonelessChangeDetection is

Release note

Blog post: blog.angular.dev/announcing-angular-v20-b5c9c06…

common

CommitDescription
feat - 2e5362a469accept undefined inputs in NgTemplateOutlet (#61404)
feat - b7d3f3dbfcAllow passing ScrollOptions to ViewportScroller (#61002)
feat - 74cceba587throw error for suspicious date patterns (#59798)
fix - 255c79e048cleanup updateLatestValue if view is destroyed before promise resolves (#58041)
fix - 739cadae62Handle errors in async pipe subscriptions (#60057)
fix - cbbea70fa3issue a warning instead of an error when NgOptimizedImage exceeds the preload limit (#60879)
fix - fc4a56d5c5rename httpResource function in factory (#60022)
fix - 785a1110e6resolve host binding type issues (#60481)

compiler

CommitDescription
feat - 7a971766dcadd extended diagnostic for uninvoked track function on @for blocks (#60495)
feat - f2d5cf7eddsupport exponentiation operator in templates (#59894)
feat - 51b8ff23cesupport tagged template literals in expressions (#59947)
feat - 1b8e7ab9fesupport the in keyword in Binary expression (#58432)
feat - 0361c2d81fsupport void operator in templates (#59894)
fix - 8b990a31c3error if rawText isn't estimated correctly (#60529)
fix - 4fe489f1b4exponentiation should be right-to-left associative (#60101)
fix - ef1fd137a9incorrect spans for template literals (#60323)
fix - e0d378d20eincorrectly handling let declarations inside i18n (#60512)
fix - b70ad3c4e6proper handling of typeof, void in RecursiveAstVisitor (#60101)
fix - e25e6c95a2remove TypeScript from linker (#61635)
perf - 768239a89creduce allocations for let declarations only used in the same view (#60512)

compiler-cli

CommitDescription
feat - bec1610da2add extended diagnostic for invalid nullish coalescing (#60279)
feat - c889382a20detect missing structural directive imports (#59443)
feat - 1971e57a45support type checking of host bindings (#60267)
fix - 9ec9c7e1b8avoid fatal diagnostics for invalid module schemas (#61220)
fix - a1cacc5b17avoid fatal diagnostics for missing template files (#58673)
fix - 1e6faad479correctly parse event name in HostListener (#60561)
fix - ffb19e64f1preserve required parens for nullish coalescing (#60060)
fix - 7c9b4892e9preserve required parens in exponentiation expressions (#60101)
fix - 7e03af898eset correct target when type checking events (#60561)
fix - 2d51a203dcwrong event name for host listener decorators (#60460)

core

CommitDescription
feat - 22d3f0562cadd hook for producer creation side effects (#60333)
feat - fe57332fc5add input binding support to dynamically-created components (#60137)
feat - 65adb3024dAdd provider which reports unhandled errors on window to ErrorHandler (#60704)
feat - b154fb3911add support for two-way bindings on dynamically-created components (#60342)
feat - 82aa2c1a52add the ability to apply directives to dynamically-created components (#60137)
feat - 326d48afb4drop support for TypeScript older than 5.8 (#60197)
feat - d260ca3091emit template function for template related profiler hooks (#60174)
feat - a4bad8d361export signalGetFn from signal primitives (#60497)
feat - 4812215a7bExpose Injector.destroy on Injector created with Injector.create (#60054)
feat - c1bcae91ddexpose performance data in Chrome DevTools (#60789)
feat - 809b5b4596introduce new DI profiling event (#60158)
feat - d5fd7349fbintroduce TestBed.tick() (#60993)
feat - 4e88e18a8emark toObservable as stable (#60449)
feat - 727cda3856mark linkedSignal API as public (#60865)
feat - 644d9f3bbdmark the toSignal API as stable (#60442)
feat - e711f99d81move provideExperimentalCheckNoChangesForDebug to provideCheckNoChangesConfig (#60906)
feat - 7ccec1494fmove DOCUMENT token into core (#60663)
feat - 953c4b2580Move zoneless change detection to dev preview (#60748)
feat - 611baaf069remove InjectFlags from public API (#60318)
feat - 5e209cb560remove TestBed.get (#60414)
feat - d8fbb909cerename afterRender to afterEveryRender and stabilize (#60999)
feat - 567522398fstabilize incremental hydration api (#60888)
feat - 8d050b5bfcstabilize linkedSignal API (#60741)
feat - 866cea9a05Stabilize PendingTasks Injectable (#60716)
feat - bf8492b871stabilize withI18nSupport() api (#60889)
feat - be44cc8f40support listening to outputs on dynamically-created components (#60137)
feat - fe9b79b615update Node.js version support (#60545)
fix - e170d24240add migration away from InjectFlags (#60318)
fix - 7eb59d3887added @angular/compiler as a peer dependency (#55610)
fix - 5f7f04634fcall DestroyRef on destroy callback if view is destroyed (#58008)
fix - 7232ce5b17Catch and report rejections in async function of PendingTasks.run (#60044)
fix - fd12220a35defer block render failures should report to application error handler (#60149)
fix - 3459faadbfdo not allow setInput to be used with inputBinding (#60137)
fix - 0ac949c266do not run change detection on global error events (#60944)
fix - 4fe34f4cfeenable stashing only when withEventReplay() is invoked (#61077)
fix - 962b59b14eEnsure ComponentFixture does not duplicate error reporting from FakeAsync (#60104)
fix - 7b819be83fEnsure errors in listeners report to the application error handler (#60251)
fix - ff772d7800fix typing on injector.get to omit 'any' (#60202)
fix - 13d1c8ab38fixes timing of hydration cleanup on control flow (#60425)
fix - 0b69b61929Flush animations when no component has been checked (#58089)
fix - 3ba39bc28fgetting resource value throws an error instead of returning undefined (#61441)
fix - ca6295e90bhandle different DI token types in Chrome DevTools integration (#61333)
fix - 0162ceb427inject migration should treat @Attribute as optional (#60916)
fix - ea5eb28865input targeting not checking if input exists on host (#60137)
fix - c8951159acmark zone.js as an optional peer dependency (#61616)
fix - d62379bb13move reload method from Resource to WritableResource (#61441)
fix - a89f1cff24narrow error type for resources API (#61441)
fix - 624be2ef0cprevent stash listener conflicts (#59635)
fix - 017cc0a37cproperly handle app stabilization with defer blocks (#61040)
fix - 6e79eaf739reading resource value after reload in the error state (#61441)
fix - 3d85d9363creduce total memory usage of various migration schematics (#60774)
fix - 1c7b356625release hasPendingTasks observers (#59723)
fix - 43cbc58254remove forceRoot flag for effects (#60535)
fix - 48974c3cf8remove rejectErrors option encourages uncaught exceptions (#60397)
fix - 491b0a4eadRemove duplicate reporting of errors in CDR.detectChanges (#60056)
fix - 04d963c0a5remove unused parameter from listener instruction (#60406)
fix - 0ae1889560run ApplicationRef.prototype.bootstrap in NgZone (#60720)
fix - a611b234d7run root effects in creation order (#60534)
fix - 338818ce89Surface errors from ApplicationRef.tick to callsite (#60102)
fix - 350776b412TestBed.tick should ensure test components are synchronized (#61382)
fix - 3d4ddd2247Testing should not throw when Zone does not patch test FW APIs (#61628)
fix - 30e081287dupdate min Node.js support to 20.19, 22.12, and 24.0 (#61500)
refactor - b407157ee8Deprecate the structural directives ngIf/ngFor/ngSwitch. (#60492)
refactor - c2987d8402stop producing ng-reflect attributes by default (#60973)

forms

CommitDescription
feat - a07ee60989add markAllAsDirty to AbstractControl (#58663)
feat - bdfbd54932Allow to reset a form without emitting events (#60354)
fix - 81fe0536fdMake sure statusChanges is emitted (#57098)
fix - bdd5e20423resolve host binding type issues (#60481)

http

CommitDescription
feat - ccc5cc068fadd keepalive support for fetch requests (#60621)
fix - 5795e03cdfDelay stabilization until next app synchronization (#60656)

platform-browser

CommitDescription
refactor - bc2cab747fDeprecate the platform-browser-dynamic package (#61043)
refactor - a980ac9a6aDeprecate the HammerJS integration (#60257)

platform-server

CommitDescription
refactor - 2240a21c97deprecate the testing entry point (#60915)

router

CommitDescription
feat - 0bb4bd661eAdd ability to directly abort a navigation (#60380)
feat - 62de7d930aadd asynchronous redirects (#60863)
feat - 7c12cb1df9Allow resolvers to read resolved data from ancestors (#59860)
feat - ff98ccb193support custom elements for RouterLink (#60290)
fix - 219f41d049Prevent dangling promise rejections from internal navigations (#60162)
fix - 2419060fefrelax required types on router commands to readonly array (#60345)
fix - c57951d58fRemove 'any' type from route guards (#60378)
fix - db2f2d99c8Scroller should scroll as soon as change detection completes (#60086)

Breaking Changes

common

  • breaking

    Using the Y formatter (week-numbering year) without also including w (week number) is now detected as suspicious date pattern, as y is typically intended.

  • breaking

    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.

compiler

  • breaking

    'in' in an expression now refers to the operator

  • breaking

    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}}.

core

  • breaking
    • TypeScript versions less than 5.8 are no longer supported.

  • breaking

    The TestBed.flushEffects() was removed - use
    the TestBed.tick() instead.

  • breaking

    provideExperimentalCheckNoChangesForDebug has several
    breaking changes:

    • It is renamed to provideCheckNoChangesConfig

    • The behavior applies to all checkNoChanges runs

    • The useNgZoneOnStable option is removed. This wasn't found to be generally
      more useful than interval

  • breaking

    provideExperimentalZonelessChangeDetection is
    renamed to provideZonelessChangeDetection as it is now "Developer
    Preview" rather than "Experimental".

  • breaking
    • 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.

  • breaking
    • TestBed.get has been removed. Use TestBed.inject instead.

  • breaking

    afterRender was renamed to afterEveryRender.

  • breaking

    Angular no longer supports Node.js v18.

    • Node.js versions 22.0 to 22.10 are also no longer supported.

    Before upgrading to Angular v20, ensure the Node.js version is at least 20.11.1.
    For the full list of supported versions, visit: angular.dev/reference/versions

  • breaking

    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.

  • breaking

    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.

  • breaking

    The any overload has been removed from
    injector.get. It now only supports ProviderToken<T> and (deprecated
    since v4) string.

  • breaking

    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.

  • breaking

    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.

  • breaking

    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.

router

  • breaking

    The 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.

  • breaking

    Several methods in the public API of the Router which
    required writable arrays have now been updated to accept readonly
    arrays when no mutations are done.

  • breaking

    The guards arrays on 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.

Deprecations

core

  • deprecated

    ngIf/ngFor/ngSwitch are deprecated. Use the control flow blocks instead (@for/@if/@switch).

platform-browser

platform-server

  • deprecated

    @angular/platform-server/testing

    Use e2e tests to verify SSR behavior instead.