Thanks to visit codestin.com
Credit goes to github.com

Skip to content

20.0.0

Compare
Choose a tag to compare
@atscott atscott released this 28 May 13:52
· 508 commits to main since this release

Blog post: https://blog.angular.dev/announcing-angular-v20-b5c9c06cf301

common

Commit Description
feat - 2e5362a469 accept undefined inputs in NgTemplateOutlet (#61404)
feat - b7d3f3dbfc Allow passing ScrollOptions to ViewportScroller (#61002)
feat - 74cceba587 throw error for suspicious date patterns (#59798)
fix - 255c79e048 cleanup updateLatestValue if view is destroyed before promise resolves (#58041)
fix - 739cadae62 Handle errors in async pipe subscriptions (#60057)
fix - cbbea70fa3 issue a warning instead of an error when NgOptimizedImage exceeds the preload limit (#60879)
fix - fc4a56d5c5 rename httpResource function in factory (#60022)
fix - 785a1110e6 resolve host binding type issues (#60481)

compiler

Commit Description
feat - 7a971766dc add extended diagnostic for uninvoked track function on @for blocks (#60495)
feat - f2d5cf7edd support exponentiation operator in templates (#59894)
feat - 51b8ff23ce support tagged template literals in expressions (#59947)
feat - 1b8e7ab9fe support the in keyword in Binary expression (#58432)
feat - 0361c2d81f support void operator in templates (#59894)
fix - 8b990a31c3 error if rawText isn't estimated correctly (#60529)
fix - 4fe489f1b4 exponentiation should be right-to-left associative (#60101)
fix - ef1fd137a9 incorrect spans for template literals (#60323)
fix - e0d378d20e incorrectly handling let declarations inside i18n (#60512)
fix - b70ad3c4e6 proper handling of typeof, void in RecursiveAstVisitor (#60101)
fix - e25e6c95a2 remove TypeScript from linker (#61635)
perf - 768239a89c reduce allocations for let declarations only used in the same view (#60512)

compiler-cli

Commit Description
feat - bec1610da2 add extended diagnostic for invalid nullish coalescing (#60279)
feat - c889382a20 detect missing structural directive imports (#59443)
feat - 1971e57a45 support type checking of host bindings (#60267)
fix - 9ec9c7e1b8 avoid fatal diagnostics for invalid module schemas (#61220)
fix - a1cacc5b17 avoid fatal diagnostics for missing template files (#58673)
fix - 1e6faad479 correctly parse event name in HostListener (#60561)
fix - ffb19e64f1 preserve required parens for nullish coalescing (#60060)
fix - 7c9b4892e9 preserve required parens in exponentiation expressions (#60101)
fix - 7e03af898e set correct target when type checking events (#60561)
fix - 2d51a203dc wrong event name for host listener decorators (#60460)

core

Commit Description
feat - 22d3f0562c add hook for producer creation side effects (#60333)
feat - fe57332fc5 add input binding support to dynamically-created components (#60137)
feat - 65adb3024d Add provider which reports unhandled errors on window to ErrorHandler (#60704)
feat - b154fb3911 add support for two-way bindings on dynamically-created components (#60342)
feat - 82aa2c1a52 add the ability to apply directives to dynamically-created components (#60137)
feat - 326d48afb4 drop support for TypeScript older than 5.8 (#60197)
feat - d260ca3091 emit template function for template related profiler hooks (#60174)
feat - a4bad8d361 export signalGetFn from signal primitives (#60497)
feat - 4812215a7b Expose Injector.destroy on Injector created with Injector.create (#60054)
feat - c1bcae91dd expose performance data in Chrome DevTools (#60789)
feat - 809b5b4596 introduce new DI profiling event (#60158)
feat - d5fd7349fb introduce TestBed.tick() (#60993)
feat - 4e88e18a8e mark toObservable as stable (#60449)
feat - 727cda3856 mark linkedSignal API as public (#60865)
feat - 644d9f3bbd mark the toSignal API as stable (#60442)
feat - e711f99d81 move provideExperimentalCheckNoChangesForDebug to provideCheckNoChangesConfig (#60906)
feat - 7ccec1494f move DOCUMENT token into core (#60663)
feat - 953c4b2580 Move zoneless change detection to dev preview (#60748)
feat - 611baaf069 remove InjectFlags from public API (#60318)
feat - 5e209cb560 remove TestBed.get (#60414)
feat - d8fbb909ce rename afterRender to afterEveryRender and stabilize (#60999)
feat - 567522398f stabilize incremental hydration api (#60888)
feat - 8d050b5bfc stabilize linkedSignal API (#60741)
feat - 866cea9a05 Stabilize PendingTasks Injectable (#60716)
feat - bf8492b871 stabilize withI18nSupport() api (#60889)
feat - be44cc8f40 support listening to outputs on dynamically-created components (#60137)
feat - fe9b79b615 update Node.js version support (#60545)
fix - e170d24240 add migration away from InjectFlags (#60318)
fix - 7eb59d3887 added @angular/compiler as a peer dependency (#55610)
fix - 5f7f04634f call DestroyRef on destroy callback if view is destroyed (#58008)
fix - 7232ce5b17 Catch and report rejections in async function of PendingTasks.run (#60044)
fix - fd12220a35 defer block render failures should report to application error handler (#60149)
fix - 3459faadbf do not allow setInput to be used with inputBinding (#60137)
fix - 0ac949c266 do not run change detection on global error events (#60944)
fix - 4fe34f4cfe enable stashing only when withEventReplay() is invoked (#61077)
fix - 962b59b14e Ensure ComponentFixture does not duplicate error reporting from FakeAsync (#60104)
fix - 7b819be83f Ensure errors in listeners report to the application error handler (#60251)
fix - ff772d7800 fix typing on injector.get to omit 'any' (#60202)
fix - 13d1c8ab38 fixes timing of hydration cleanup on control flow (#60425)
fix - 0b69b61929 Flush animations when no component has been checked (#58089)
fix - 3ba39bc28f getting resource value throws an error instead of returning undefined (#61441)
fix - ca6295e90b handle different DI token types in Chrome DevTools integration (#61333)
fix - 0162ceb427 inject migration should treat @Attribute as optional (#60916)
fix - ea5eb28865 input targeting not checking if input exists on host (#60137)
fix - c8951159ac mark zone.js as an optional peer dependency (#61616)
fix - d62379bb13 move reload method from Resource to WritableResource (#61441)
fix - a89f1cff24 narrow error type for resources API (#61441)
fix - 624be2ef0c prevent stash listener conflicts (#59635)
fix - 017cc0a37c properly handle app stabilization with defer blocks (#61040)
fix - 6e79eaf739 reading resource value after reload in the error state (#61441)
fix - 3d85d9363c reduce total memory usage of various migration schematics (#60774)
fix - 1c7b356625 release hasPendingTasks observers (#59723)
fix - 43cbc58254 remove forceRoot flag for effects (#60535)
fix - 48974c3cf8 remove rejectErrors option encourages uncaught exceptions (#60397)
fix - 491b0a4ead Remove duplicate reporting of errors in CDR.detectChanges (#60056)
fix - 04d963c0a5 remove unused parameter from listener instruction (#60406)
fix - 0ae1889560 run ApplicationRef.prototype.bootstrap in NgZone (#60720)
fix - a611b234d7 run root effects in creation order (#60534)
fix - 338818ce89 Surface errors from ApplicationRef.tick to callsite (#60102)
fix - 350776b412 TestBed.tick should ensure test components are synchronized (#61382)
fix - 3d4ddd2247 Testing should not throw when Zone does not patch test FW APIs (#61628)
fix - 30e081287d update min Node.js support to 20.19, 22.12, and 24.0 (#61500)
refactor - b407157ee8 Deprecate the structural directives ngIf/ngFor/ngSwitch. (#60492)
refactor - c2987d8402 stop producing ng-reflect attributes by default (#60973)

forms

Commit Description
feat - a07ee60989 add markAllAsDirty to AbstractControl (#58663)
feat - bdfbd54932 Allow to reset a form without emitting events (#60354)
fix - 81fe0536fd Make sure statusChanges is emitted (#57098)
fix - bdd5e20423 resolve host binding type issues (#60481)

http

Commit Description
feat - ccc5cc068f add keepalive support for fetch requests (#60621)
fix - 5795e03cdf Delay stabilization until next app synchronization (#60656)

platform-browser

Commit Description
refactor - bc2cab747f Deprecate the platform-browser-dynamic package (#61043)
refactor - a980ac9a6a Deprecate the HammerJS integration (#60257)

platform-server

Commit Description
refactor - 2240a21c97 deprecate the testing entry point (#60915)

router

Commit Description
feat - 0bb4bd661e Add ability to directly abort a navigation (#60380)
feat - 62de7d930a add asynchronous redirects (#60863)
feat - 7c12cb1df9 Allow resolvers to read resolved data from ancestors (#59860)
feat - ff98ccb193 support custom elements for RouterLink (#60290)
fix - 219f41d049 Prevent dangling promise rejections from internal navigations (#60162)
fix - 2419060fef relax required types on router commands to readonly array (#60345)
fix - c57951d58f Remove 'any' type from route guards (#60378)
fix - db2f2d99c8 Scroller should scroll as soon as change detection completes (#60086)

Breaking Changes

common

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

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

core

    • 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:

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

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

router

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

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

platform-browser

  • All entries of the @angular/platform-browser-dynamic
  • HammerJS support is deprecated and will be removed in a future major version.

platform-server

  • @angular/platform-server/testing

    Use e2e tests to verify SSR behavior instead.