Road to Angular 9: Angular 9 is here! Check out the new Ivy compiler and runtime.

The wait is finally over. Angular 9 is here with its final release. We have been keeping tabs on its production and patiently awaiting, with each Angular 8 update and every Angular 9 release candidate. This is a major update to Angular, which adds the new and improved Ivy compiler and runtime, faster testing, better debugging, and many more improvements.
Updated 7 February, 2020
For months now we have been watching the Angular development team closely, waiting for updates and counting down to the big release. Now, the wait is finally over. Angular version 9.0.0 is officially here. Angular 9 is a major release that adds a number of changes to the ecosystem.
The most notable change is Ivy. With the release of Angular 9, Ivy is now the default compiler and runtime. Ivy improves bundle size, allows for better debugging, adds improved type checking, faster testing, enables the AOT compiler on by default, and improves CSS class and style binding.
With Ivy, both small apps and large apps will see largely improved bundle size savings thanks to Ivy’s tree-shaking feature, which will eliminate dead-code.

Improved bundle sizes with Ivy. Source.
The long, long list of bug fixes is too plentiful to name here, so be sure to check out the changelog on GitHub and see all the improvements. Don’t just take our word for it. Update to Angular 9 and see all the newest features and the new Ivy compiler for yourself. View the guide to Ivy and learn how to utilize this next-gen compilation and rendering pipeline.
Read the release blog by Angular and see it in action. Give some thanks to the hundreds of contributors, it’s been a long journey!
So, what now? One journey ends, and another must begin. What will Angular 10 include?
Updated 4 February, 2020
We thought yesterday was to be the final release candidate for Angular 9, but there was one more troublesome bug introduced. That has been squashed today, leaving the way clear for the much anticipated Angular 9. We also spotted on Twitter that Angular developer Igor Minar thought they would be ready to go with rc12, then rc13. Hopefully he’s right about rc14 being the last one.
It turned out that we needed one more important ngcc fix. Thanks to @petebd the fix is in and rc13 is out. I’m catiously optimistic that that’s the last one. #Angular9 https://t.co/0h36TEfCDM
— Igor Minar (@IgorMinar) February 1, 2020
Another thing in favor of this being truly the last release candidate before Angular 9.Final arrives is that the list of v9-blockers is now empty. There’s nothing left standing in the way, so watch this space for when the big release finally lands.
We mentioned this yesterday, but since it’s so good we’ll mention it once more: Check out this video of Chris Noring’s International JavaScript Conference session: Angular Schematics – The unknown hero. It’s the perfect way to while away the hours until Angular 9 gets here at last. And if you don’t have an hour to spare, you can always check out the full release notes for rc.14 below.
Angular 9.0.0-rc.14
Bug Fixes
- ivy: host-styling throws assert exception inside *ngFor (#35133) (31e9873), closes #35118
- ngcc: correctly invalidate cache when moving/removing files/directories (#35106) (22357d4), closes /github.com/angular/angular/blob/4d36b2f6e/packages/compiler-cli/ngcc/src/writing/cleaning/cleaning_strategies.ts#L54 /github.com/angular/angular/blob/4d36b2f6e/packages/compiler-cli/ngcc/src/writing/cleaning/cleaning_strategies.ts#L61 #35095
- ngcc: do not lock if the target is not compiled by Angular (#35057) (c30c518), closes #35000
Features
- compiler-cli: add
sass
as a valid css preprocessor extension (#35052) (7f96fbb) - should also allow subclass Promise without Symbol.species (#34533) (0de632a)
- common: http/testing expectOne lists the received requests if no matches (#27005) (c7f0c01), closes #18013
- common: remove extra & in http params (#34896) (bd8605a)
- ivy: catch FatalDiagnosticError thrown from preanalysis phase (#34801) (c0e73e0)
- ivy: ensure
DebugNode
/DebugElement
are tree-shakeable in Ivy (#35003) (23c0147), closes #30130 - ivy: ensure multi providers in ModuleWithProviders are not duplicated (#34914) (4975f89)
- ivy: update ViewContainerRef to get the correct parentInjector (#35013) (eaa4a5a)
- language-service: prune duplicate returned definitions (#34995) (71f5417), closes /github.com/angular/angular/pull/34847#discussion_r371006680
- language-service: remove repeated symbol definitions for structural directive (#34847) (35916d3)
- language-service: warn, not error, on missing context members (#35036) (0e76821)
- localize: re-enable filename in code-frame error messages (#34994) (c7c7b20), closes /github.com/angular/angular/pull/34974/files#r371034476
- ngcc: improve lockfile error message (#35001) (1d31c81), closes #35000
- ivy: Change static priority resolution to be same level as directive it belongs to (#34938) (19c4895)
- language-service: completions for output $event properties in (#34570) (2a53727)
- language-ser,vice: provide completion for $event variable (#34570) (c246787)
- language-service: provide hover for microsyntax in structural directive (#34847) (baf4a63)
- ivy: correctly emit component when it’s removed from its module (#34912) (adc663e), closes #34813
- ivy: DebugNode.classes not working on SVG elements (#34872) (7e8aac1), closes #34868
- ivy: disable use of aliasing in template type-checking (#34649) (2cf7d0f)
- ivy: don’t detect changes on detached child embedded views (#34846) (62e1186), closes #34816
- ivy: ensure eventListeners added outside angular context are not called… (#34514) (b6dfb4d)
- ivy: type-check multiple bindings to the same input (#34649) (ba7f2f1)
- ivy: type-checking of properties which map to multiple fields (#34649) (b04d4ba)
- ivy: use any for generic context checks when !strictTemplates (#34649) (e69d02c)
- ivy: wrap ‘as any’ casts in parentheses when needed (#34649) (bf01b66)
- language-service: Diagnostic span should point to class name (#34932) (c9db7bd)
- language-service: Make metadata in Declaration non-optional (#34936) (37727ce)
- language-service: rename getDiagnostics to getSemanticDiagnostics (#34909) (20dc436)
- ngcc: do not attempt compilation when analysis fails (#34889) (080a8bf), closes #34288 #34500
- ngcc: do not collect private declarations from external packages (#34811) (c80392b), closes #34544 #34544
- ngcc: libraries using spread in object literals cannot be processed (#34661) (4eeb6cf)
- ngcc: only lock ngcc after targeted entry-point check (#34722) (3897fb9)
- ngcc: update
package.json
deterministically (#34870) (a10d2a8), closes #34635 - common: expose getLocaleCurrencyCode publicly (#34946) (622737c)
- compiler-cli: require node 10 as runtime engine (#34722) (7b77b3d)
- language-service: specific suggestions for template context diags (#34751) (cc7fca4)
- language-service: support multiple symbol definitions (#34782) (2f2396c)
- ngcc: lock ngcc when processing (#34722) (6dd51f1), closes /github.com/angular/angular/issues/32431#issuecomment-571825781
- work around ‘noImplicityAny’ incompatibility due to ts3.7 update (#34798) (251d548)
- animations: not waiting for child animations to finish when removing parent in Ivy (#34702) (92c17fe), closes #33597
- common: ensure diffing in ngStyle/ngClass correctly emits value changes (#34307) (93a035f), closes #34336 #34444
- ivy: ensure that
LOCALE_ID
is set after app initializers (#34830) (7643913), closes #34701 - ivy: more accurate detection of pipes in host bindings (#34655) (da69335)
- ngcc: do not add DTS deep imports to missing packages list (#34695) (32d4d97), closes #34720
- forms: accept number length in length validators (#32057) (3113bb7)
- forms: disabled input acceptance member not properly applied (#34502) (cbb175f)
- ivy: do not reset view dirty state in check no changes mode (#34495) (8ef1c60)
- ivy: don’t run decorator handlers against declaration files (#34557) (08c2581), closes #33264
- ivy: handle overloaded constructors in ngtsc (#34590) (a7ca658)
- ivy: ngClass not applying classes with trailing/leading spaces (#34539) (98ed7c6), closes #34476
- ivy: Prevent errors when querying DebugElement roots that were outside angular context (#34687) (f1cdb8f)
- ivy: properly bootstrap components with attribute selectors (#34450) (2c0b9ea), closes #34349
- ivy: warn instead of throwing for unknown elements (#34524) (d9ae70e), closes /github.com/angular/angular/pull/33419#discussion_r339296216
- language-service: apply suggested change. (#34564) (b3af220)
- language-service: break the hover/definitions for two-way binding (#34564) (eb5c20c)
- language-service: CRLF offset in inline template (#34737) (80315b5)
- language-service: do not use an i18n parser for templates (#34531) (cb7dcb3)
- language-service: only visit directives (#34564) (76d7aa7)
- ngcc: avoid error due to circular dependency in
EsmDependencyHost
(#34512) (7c3172a), closes /github.com/angular/angular/blob/18d89c9c8/packages/compiler-cli/ngcc/src/utils.ts#L10 /github.com/angular/angular/blob/18d89c9c8/packages/compiler-cli/ngcc/src/dependencies/esm_dependency_host.ts#L10 /github.com/angular/angular/blob/18d89c9c8/packages/compiler-cli/ngcc/src/dependencies/dependency_host.ts#L9 - ngcc: correctly detect dependencies in CommonJS (#34528) (ff02ddf)
- ngcc: correctly handle inline exports in UMD (#34512) (7bbfccf)
- ngcc: don’t crash if symbol has no declarations (#34658) (4def99e), closes /github.com/angular/angular/blob/8d0de89e/packages/compiler-cli/src/ngtsc/reflection/src/typescript.ts#L309 #34560
- ngcc: handle UMD factories that do not use all params (#34660) (83868be), closes #34653
- ngcc: insert definitions after statement (#34677) (f295240), closes #34648
- ngcc: recognize re-exports with
require()
calls in UMD (#34512) (79be354), closes /github.com/angular/angular/pull/34254/files#r359515373 - ngcc: recognize re-exports with imported TS helpers in CommonJS and UMD (#34527) (a88dc17)
- common: allow default currency code to be configurable (#34771) (965f557), closes #25461
- ivy: improve
ExpressionChangedAfterChecked
error message for attributes (#34505) (d63572e) - language-service: completions support for template reference variables (#34363) (937d3fd)
- i18n – include currency code in locale data (#34771) (c18a3fe)
- language-service: provide completion for $event variable (#34566) (fa39a8c)
- language-service: support hover/definitions for structural directive (#34564) (fe19327)
- ivy: add create scenario to the styling benchmark (#34775) (1ec9515)
- ivy: add noop change detection scenario to the styling benchmark (#34775) (4928f1a)
- ivy: add static style to the list of scenarios (#34775) (a15f20b)
- ivy: styling algorithm benchmark (#34664) (f8d4ce7)
- common: remove trailing whitespace for CurrencyPipe (#34642) (c42b90b), closes #34641
- ivy: append
advance
instructions beforei18nExp
(#34436) (ba4c31c) - ivy: correctly associate output bound events with directives (#34479) (fde5067)
- ivy: Ensure ngProjectAs marker name appears at even attribute index (#34617) (4f3215d)
- ivy: skip field inheritance if InheritDefinitionFeature is present on parent def (#34244) (22533fb)
- ivy: TestBed not unwrapping imports array function when overriding provider (#34629) (963ed71), closes #34623
- language-service: completions after “let x of |” in ngFor (#34473) (ca8b584)
- language-service: correctly parse expressions in an attribute (#34517) (7a0d6e7)
- language-service: The pipe method should not include parentheses (#34485) (2845596)
- ngcc: capture entry-point dependencies from typings as well as source (#34494) (c692757), closes #34411
- ngcc: do not add trailing commas in UMD imports (#34545) (e6850a3), closes #34353 #34525
- compiler: record end of expression Token (#33549) (8a25cd4), closes #33477
- language-service: Append symbol type to hover tooltip (#34515) (381b895)
- language-service: Show documentation on hover (#34506) (1660095)
- animations: leaking detached nodes when parent has a leave transition (#34409) (6607fb4), closes #25744
- common: ngStyle should ignore undefined values (#34422) (ee1eebd), closes #34310
- ivy: avoid duplicate errors in safe navigations and template guards (#34417) (d6edeab)
- ivy: avoid using proto when reading metadata in JIT mode (#34305) (08ce026)
- ivy: don’t produce template diagnostics when scope is invalid (#34460) (c1fd629), closes #33849
- ivy: generate a better error for template var writes (#34339) (418d586), closes #33674
- ivy: i18n – remove
translate
function when clearing translations (#34346) (1489e5e), closes #32781 - ivy: i18n instructions thrown off by sanitizer in IE11 (#34305) (bed62b1)
- ivy: improve ExpressionChangedAfterChecked error (#34381) (7ea3984)
- ivy: inconsistent attribute casing in DebugNode.attributes on IE (#34305) (9bff8e7)
- ivy: incorrect injectable name logged in warning message on IE (#34305) (60d1d5e)
- ivy: inheritance in JIT mode not working correctly on IE10 (#34305) (65fb2fd)
- ivy: inheriting injectable definition from undecorated class not working on IE10 in JIT mode (#34305) (d83599d)
- ivy: record correct absolute source span for ngForOf expressions (#31813) (931cb5e)
- ivy: reorder provider type checks to align with VE (#34433) (7916b1e)
- ivy: unknown property and element checks not working correctly in IE (#34305) (0ff54f2)
- ivy: validate the NgModule declarations field (#34404) (03e236a)
- language-service: HTML path should include last node before cursor (#34440) (76e4870)
- language-service: Proper completions for properties and events (#34445) (4e41bf9)
- language-service: Remove completions for let and of in ngFor (#34434) (ab61480)
- ngcc: correctly match aliased classes between src and dts files (#34254) (4bffb6b), closes #33593
- ngcc: handle CommonJS re-exports by reference (#34254) (9ca5faa)
- ngcc: handle imports in dts files when processing UMD (#34356) (81c75cf)
- ngcc: handle UMD re-exports (#34254) (84a7d8a)
- ngcc: render UMD imports even if no prior imports (#34353) (c26738d), closes #34138
- ngcc: use the correct identifiers when updating typings files (#34254) (c0c2ab3)
- forms: expand NgModel disabled type to work with strict template type checking (#34438) (b1d4c58)
- ivy: error in ivy when inheriting a ctor from an undecorated base (#34460) (f563c7c)
- ivy: throw compilation error when providing undecorated classes (#34460) (0638e65)
- compiler: optimize cloning cursors state (#34332) (5d871b5)
- compiler: speed up i18n digest computations (#34332) (adb0663)
- compiler: use a shared interpolation regex (#34332) (940e62b)
- ivy: cache export scopes extracted from declaration files (#34332) (eb9a8ac)
- ivy: eagerly parse the template twice during analysis (#34334) (fb4a11a)
- ivy: reuse prior analysis work during incremental builds (#34288) (c387952)
- ivy: share instances of
DomElementSchemaRegistry
(#34332) (ce94192) - ivy: use module resolution cache (#34332) (82442c5)
- bazel: improve performance of tsHost.writeFile() (#34331) (d7c459a)
- common: update closure locales to include directionality data (#34240) (a02bde7)
- compiler: ensure localized strings are ES5 compatible for JIT mode (#34265) (26dba21), closes #34246
- compiler: switch to modern diagnostic formatting (#34234) (60051eb)
- compiler-cli: allow declaration-only template type check members (#34296) (bbb9412)
- ivy: add flag to skip non-exported classes (#33921) (#34340) (7ed984b), closes #33724
- ivy: align TestBed.overrideProvider with what happens with providers in TestBed providers array (#33769) (10a33ef)
- ivy: do not invoke change detection for destroyed views (#34241) (24bbcaf)
- ivy: handle SafeStyles in [style.prop] correctly (#34286) (b0d5784), closes /github.com/angular/angular/blob/master/packages/core/src/render3/styling/bindings.ts#L620
- ivy: inherit static coercion members from base classes (#34296) (edfaab6), closes #33830
- ivy: properly parenthesize ternary expressions when emitted (#34221) (af36bc6), closes #34087
- ivy: throw a better error when DI can’t inject a ctor param (#33739) (#34340) (676aca1), closes #33637
- language-service: bug of accessing a string index signature using dot notation (#34177) (72a5a8c)
- language-service: Remove getExternalFiles() (#34260) (0e911f8)
- language-service: return the js primitive type name (#34177) (b4680a6)
- language-service: Simplify resolution logic in banner (#34262) (7dfd327)
- ngcc: ensure that bundle
rootDir
is the package path (#34212) (69dd516) - ngcc: fix undecorated child migration when
exportAs
is present (#34014) (24d1f9e) - ngcc: log Angular error codes correctly (#34014) (3cd43c1)
- ngcc: report diagnostics from migrations (#34014) (599dcd0)
- ivy: chain listener instructions (#33720) (#34340) (d3ec306)
- ivy: chain styling instructions (#33837) (#34340) (c66fd06)
- bazel: don’t rely on @angular/core being as a depedency to install @angular/bazel (#34181) (716fc84), closes #34164
- bazel: reenable template type checking in ng_module (#34144) (572e731), closes /github.com/angular/angular/blob/168abc6d6f52713383411b14980e104c99bfeef5/packages/compiler-cli/src/ngtsc/program.ts#L430-L434
- common: reflect input type in NgForOf context (#33997) (b640d38)
- common: reflect input type in NgIf context (#33997) (7504543), closes #31556
- compiler: i18n – trim whitespace from i18n custom ids (#34154) (64317c6), closes #34147
- compiler-cli: ensure that
ngI18nClosureMode
is guarded in generated code (#34211) (4d02556) - core: ensure that
ngI18nClosureMode
is guarded (#34211) (2546261) - ivy: allow insertion of views attached to a different container (#34156) (65cd811), closes #34152
- ivy: consistenly return -1 from ViewContainerRef.indexOf for non-inserted view (#34156) (0044c66)
- ivy: correctly support
ngProjectAs
on templates (#34200) (41ea3c2) - ivy: i18n – correctly parse XLIFF placeholders (#34155) (d5a48b2), closes #34151
- ivy: i18n – trim whitespace when parsing metadata (#34154) (f4d714c)
- ivy: incorrectly validating html foreign objects inside svg (#34178) (4836fe0), closes #34171
- ivy: support ICUs with pipes (#34198) (eae541b)
- language-service: determine correct type for ngFor exported values (#34089) (12e4aa0)
- language-service: Do not produce diagnostics if metadata for NgModule not found (#34113) (29de8d3)
- implement Symbol.specics of Promise (#34162) (1bab8c2), closes #34105 #33989
- language-service: Insert parentheses for method completion (#33860) (fb22f18)
- language-service: Make missing module suggestion instead of error (#34115) (#34193) (d2538ca)
- language-service: use host.error() instead of console.error() (#34114) (7a7e999)
- ngcc: render legacy i18n message ids by default (#34135) (93ac362), closes #34056
- add js-web-frameworks benchmark (#34034) (bf16b0e)
- ivy: avoid duplicate state lookup and default function parameters (#34183) (00f7372)
- bazel: ng_module should not emit shim files under bazel and Ivy (#33765) (e24ed8d)
- bazel: update to tsickle 0.37.1 to fix peerDep warnings (#33788) (719ca1d)
- core: allow css custom variables/properties in the style sanitizer (#33841) (61cc7a3), closes #23485 #23485
- core: remove deprecated and defunct wtf* apis (#33949) (cf42019)
- ivy: avoid infinite recursion when evaluation source files (#33772) (b12fde4), closes #33734
- ivy: avoid using stale cache in TestBed if module overrides are defined (#33787) (fbd2133)
- ivy: handle non-standard input/output names in template type checking (#33741) (94257ac), closes #33590
- ivy: i18n – ensure that escaped chars are handled in localized strings (#34065) (00f8d6a)
- ivy: prevent unknown element check for AOT-compiled components (#34024) (955a312)
- ivy: remove TNodeType assertion from
directiveInject
instruction (#33948) (90a9043) - ivy: reset style property using ngStyle fix (#33920) (b8ba6b0)
- ivy: run pre-order hooks in injection order (#34026) (ebe3229), closes #32522
- ivy: support ICUs without “other” cases (#34042) (781003f)
- ivy: support inserting a
viewRef
that is already present (#34052) (978b500), closes #33924 - ivy: take styles extracted from template into account in JIT mode (#34017) (b659aa3)
- ivy: track changes across failed builds (#33971) (1ffbde1), closes #32214
- ivy: wrap functions from “providers” in parentheses in Closure mode (#33609) (fc6ad19), closes /github.com/angular/tsickle/blob/d7974262571c8a17d684e5ba07680e1b1993afdd/src/jsdoc_transformer.ts#L1021
- language-service: determine index types accessed using dot notation (#33884) (e8ec296), closes #29811 #29811
- language-service: fix error of array-index out of bounds exception (#33928) (b05ce85)
- language-service: function.bind() should not be an error (#34041) (#34046) (d22f3d6)
- ngcc: do not crash on packages that specify typings as an array (#33973) (e456e58), closes #33646
- ngcc: do not output duplicate ɵprov properties (#34085) (5a8d25d)
- ngcc: render localized strings when in ES5 format (#33857) (c6695fa)
- ngcc: render UMD global imports correctly (#34012) (83989b8)
- ngcc: report errors from
analyze
andresolve
processing (#33964) (ca5d772), closes /github.com/angular/angular/issues/33685#issuecomment-557091719 - router: make routerLinkActive work with query params which contain arrays (#22666) (f1bf5b2), closes #22223
- service-worker: allow creating post api requests after cache failure (#33930) (63c9123), closes #33793
- service-worker: throw when using the unsupported
versionedFiles
option in config (#33903) (250e6fd) - language-service: completions support for indexed types (#34047) (8a565c8), closes angular/vscode-ng-language-service#110 angular/vscode-ng-language-service#277
- language-service: completions support for tuple array (#33928) (7faa9bb)
- ivy: do no work if moving a
viewRef
to the same position (#34052) (d228801) - ivy: fix creation time micro-benchmarks (#34031) (457ac3a)
- ivy: R3TestBed – Do not process NgModuleDefs that have already been processed (#33863) (05a18cc)
- bazel: add terser as an optional peer dependency (#33891) (2d7b015)
- compiler-cli: Refactor getTsTypeFromBuiltinType (#33778) (09480d3)
- core: make QueryList implement Iterable in the type system (#33536) (49571bf), closes #29842
- ivy: always re-analyze the program during incremental rebuilds (#33862) (30ddadc), closes #32388
- ivy: avoid cyclical dependency in imports (#33831) (a61fb76)
- ivy: constant object literals shared across element and component instances (#33705) (93ba4c2)
- ivy: don’t infer template context types when in full mode (#33537) (595375f), closes #33527
- ivy: emit fs-relative paths when rootDir(s) aren’t in effect (#33828) (14156bd), closes #33659 #33562
- ivy: ExpressionChangedAfterItHasBeenCheckedError for SafeValue (#33749) (cba6b7d), closes #33448
- ivy: extend assertion in
directiveInject
function to support IcuContainers (#33832) (8452458) - ivy: i18n – ensure that colons in i18n metadata are not rendered (#33820) (bc28ca7)
- ivy: i18n – support “”, “`” and “${” sequences in i18n messages (#33820) (b53a1ac)
- ivy: move setClassMetadata calls into a pure iife (#33337) (213e3c3)
- ivy: properly insert views before ng-container with injected ViewContainerRef (#33853) (c7a3694)
- ivy: properly insert views into ViewContainerRef injected by querying (#33816) (f136dda)
- ivy: report watch mode diagnostics correctly (#33862) (d92da13), closes #32213
- ivy: reset style property value defined using [style.prop.px] (#33780) (de8cf75)
- ivy: retain JIT metadata unless JIT mode is explicitly disabled (#33671) (5267c92)
- ivy: shadow all DOM properties in
DebugElement.properties
(#33781) (5be23a3), closes #33695 - ivy: support for #id bootstrap selectors (#33784) (9761ebe), closes #33485
- language-service: Function alias should be callable (#33782) (ca63353)
- language-service: Provide completions for attribute values (#33839) (0e20453)
- language-service: Recompute analyzed modules only when source files change (#33806) (9882a82)
- language-service: Remove getTemplateReferences() from LanguageService API (#33807) (0688a28)
- ngcc: always add exports for
ModuleWithProviders
references (#33875) (f3d8f6a), closes #33701 - ngcc: correctly associate decorators with aliased classes (#33878) (59a4b76)
- ngcc: correctly include internal .d.ts files (#33875) (0854dc8)
- ngcc: do not emit ES2015 code in ES5 files (#33514) (06e36e5), closes #32665
- ngcc: generate correct metadata for classes with getter/setter properties (#33514) (21bd8c9), closes #30569
- ngcc: properly detect origin of constructor param types (#33901) (05d5c4f), closes #33677
- router: make routerLinkActive work with query params which contain arrays (#22666) (8e5ed20), closes #22223
- zone.js: fixes typo of zone.js patch vrdisplaydisconnected property (#33581) (1b7aa05), closes #33579
- bazel: update ng-add to use bazel v1.1.0 (#33813) (b1d0a4f)
- core: missing-injectable migration should migrate empty object literal providers (#33709) (b7c012f)
- ivy: add micro-benchmark focused on directive input update (#33798) (edd624b)
- ivy: don’t store public input names in two places (#33798) (105616c)
- ivy: extract template’s instruction first create pass processing (#33856) (01af94c)
- ivy: Improve performance of transplanted views (#33702) (a16a57e)
- common: rerun cldr to remove � characters (#33699) (011ecdf)
- common: update CLDR generated files after change to npm sources (#33634) (59b25da)
- common: update CLDR generated files to 36.0.0 (#33584) (c1bd3bc)
- compiler: correctly parse attributes with a dot in the name (#32256) (687582f)
- compiler-cli: Fix typo $implict (#33633) (7bccef5)
- compiler-cli: Pass SourceFile to getFullText() (#33660) (33f6cd4)
- core: remove ngcc postinstall migration (#33727) (508bbfd)
- core: support
ngInjectableDef
on types with inheritedɵprov
(#33732) (4ec079f) - ivy: auto register NgModules with ID (#33663) (4988094)
- ivy: better support for i18n attributes on s (#33599) (2046202)
- ivy: ComponentFactory.create should clear host element content (#33487) (d67a38b)
- ivy: ensure module scope is rebuilt on dependent change (#33522) (71238a9), closes #32416
- ivy: ensure that the correct
document
is available (#33712) (8362696), closes #33651 - ivy: Handle overrides for {providedIn: AModule} in R3TestBed (#33606) (d09ad82)
- ivy: match directives on namespaced elements (#33555) (99ead47), closes #32061
- ivy: properly determine the first native node of a view (#33627) (811275c)
- ivy: properly insert views in front of empty views (#33647) (c5737f4)
- ivy: properly insert views in front of views with an empty element container (#33647) (0b99884)
- ivy: provider override via TestBed should remove old providers from the list (#33706) (f45d5dc)
- ivy: recompile component when template changes in ngc watch mode (#33551) (da01dbc), closes #32869
- ivy: recompile component when template changes in ngc watch mode (#33551) (cd8333c), closes #32869
- ivy: Run ChangeDetection on transplanted views (#33644) (37ae45e), closes #33393
- language-service: Resolve template variable in nested ngFor (#33676) (6615743)
- ngcc: add default config for
ng2-dragula
(#33797) (ecf38d4), closes #33718 - ngcc: add reexports only once (#33658) (83b635c)
- ngcc: ensure that adjacent statements go after helper calls (#33689) (c540061)
- generate the new locale files (#33682) (72796b9)
- resolve event listeners not correct when registered outside of ngZone (#33711) (9045e3e), closes #33687
- use full cldr data to support all locales (#33682) (ea83125), closes #33681
- ngcc: remove
__decorator
calls even when part of the IIFE return statement (#33777) (e1df98b) - ngcc: support minified ES5 scenarios (#33777) (49e517d)
- “fix(ivy): recompile component when template changes in ngc watch mode (#33551)” (#33661) (cb55f60)
- fix(ivy): Only restore registered modules if user compiles modules with TestBed (#32944) (#33663) (f8e9c1e)
- fix(ivy): R3TestBed should clean up registered modules after each test (#32872) (#33663) (7c4366d)
- compiler-cli: attach the correct viaModule to namespace imports (#33495) (1d141a8), closes #32166
- compiler-cli: Pass SourceFile to getLeadingTriviaWidth (#33588) (4b62ba9)
- compiler-cli: remove unused CLI private exports (#33242) (fc8eeca)
- core: renderer-to-renderer2 migration not migrating methods (#33571) (d751ca7)
- core: undecorated-classes-with-di migration should report config errors (#33567) (c0ad47a)
- ivy: avoid implicit any errors in event handlers (#33550) (e2d7b25), closes #33528
- ivy: don’t crash on an unknown localref target (#33454) (9db59d0)
- ivy: don’t crash on unknown pipe (#33454) (38758d8)
- ivy: more descriptive errors for nested i18n sections (#33583) (d9a3892)
- language-service: Should not crash if expr ends unexpectedly (#33524) (9ebac71)
- ngcc: handle new __spreadArrays tslib helper (#33617) (d749dd3), closes #33614
- ngcc: override getInternalNameOfClass() and getAdjacentNameOfClass() for ES5 (#33533) (93a23b9)
- ngcc: render adjacent statements after static properties (#33630) (fe12d0d), closes /github.com/angular/angular/pull/33337#issuecomment-545487737
- ngcc: render new definitions using the inner name of the class (#33533) (85298e3)
- service-worker: ensure initialization before handling messages (#32525) (72eba77), closes #25611
- common: support loading locales from a global (#33523) (c5894e0)
- ivy: graceful evaluation of unknown or invalid expressions (#33453) (ce30888)
- ivy: implement unknown element detection in jit mode (#33419) (c83f501)
- add a flag in bootstrap to enable coalesce event change detection to improve performance (#30533) (44623a1)
- ivy: add new benchmark focused on template creation (#33511) (df1bef3)
- ivy: add ngIf-like directive to the ng_template benchmark (#33595) (e89c2dd)
- ivy: avoid native node retrieval from LView (#33511) (083d48e)
- ivy: avoid repeated native node retrieval and patching (#33322) (41caafc)
- ivy: avoid repeated tNode.initialInputs reads (#33322) (4452d6d)
- ivy: move local references into consts array (#33129) (66725b7), closes #32798
- Angular v9 will compile with Ivy as the default rendering engine. View the Ivy compatibility guide for information on debugging errors, and some potential changes you may see. Ivy is (mostly) backward-compatible with the previous rendering engine, however, some applications will need to be manually updated.
- If you are using Typescript 3.4 or 3.5, you must update to Typescript 3.6.
- tslib now listed as a peer dependency rather than a direct dependency. If you do not use the CLI, you will have to manually install tslib via
yarn
entryComponents
ANALYZE_FOR_ENTRY_COMPONENTS
ModuleWithProviders
without a genericesm5
andfesm5
distribution in@angular/*
npm packagesTestBed.get
Renderer
RootRenderer
RenderComponentType
- DeprecatedI18NPipesModule
- DeprecatedCurrencyPipe
- DeprecatedDatePipe
- DeprecatedDecimalPipe
- DeprecatedPercentPipe
NgFormSelectorWarning
ngForm
element selector- versionedFiles
- compiler: i18n – ignore
alt-trans
tags in XLIFF 1.2 (#33450) (936700a), closes #33161 - ivy: descend into ICU containers when collecting rootNodes (#33493) (563a507)
- ivy: descend into view containers on elements when collecting rootNodes (#33493) (87743f1)
- ivy: descend into view containers on ng-container when collecting rootNodes (#33493) (a5167bd)
- ivy: descend into view containers on ng-template when collecting rootNodes (#33493) (502fb7e)
- ivy: ensure overrides for ‘multi: true’ only appear once in final providers (#33104) (e483aca)
- ivy: handle elements with local refs in i18n blocks (#33415) (bd40c89)
- ivy: i18n – support setting locales for each translation file (#33381) (62b2840), closes #33323
- ivy: i18n – update
localize-translate
to accept target-locales (#33381) (41979d6) - language-service: Improve signature selection for pipes with args (#33456) (1de7579)
- bazel: update @bazel/schematics to Bazel 1.0.0 (#33476) (540d104), closes /github.com/angular/angular/pull/33367#issuecomment-547643246
- bazel: update bazel-schematics to use Ivy and new rollup_bundle (#33435) (bf913cc)
- ivy: i18n – support inlining of XTB formatted translation files (#33444) (2c623fd)
- language-service: add support for text replacement (#33091) (da4eb91)
- core: missing-injectable migration should handle forwardRef (#33286) (eeecbf2)
- core: missing-injectable migration should not migrate providers with “useExisting” (#33286) (4d23b60)
- core: missing-injectable migration should not update type definitions (#33286) (335854f)
- ivy: allow abstract directives to have an invalid constructor (#32987) (8d15bfa), closes #32981
- ivy: fix broken typechecking test on Windows (#33376) (63f0ded)
- ivy: split checkTypeOfReferences into DOM and non-DOM flags. (#33365) (113411c)
- ivy: support abstract directives in template type checking (#33131) (a42057d), closes #30080
- language-service: Do not show HTML elements and attrs for ext template (#33388) (a78b701)
- ngcc: prevent reflected decorators from being clobbered (#33362) (0de2dbf)
- ivy: add a runtime feature to copy cmp/dir definitions (#33362) (818c514)
- ivy: add flag to disable checking of text attributes (#33365) (d8ce212)
- ivy: allow the locale to be set via a global property (#33314) (fde8363)
- ivy: i18n – inline current locale at compile-time (#33314) (fb84ea7)
- ivy: input type coercion for template type-checking (#33243) (f1269d9)
- ivy: strictness flags for template type checking (#33365) (0d9be22)
- ivy: verify whether TypeScript version is supported (#33377) (4aa51b7)
- ngcc: add a migration for undecorated child classes (#33362) (b381497)
- ngcc: enable migrations to apply schematics to libraries (#33362) (6b26748)
- ngcc: migrate services that are missing
@Injectable()
(#33362) (31b9492) - ivy: apply [style]/[class] bindings directly to style/className (#33336) (dcdb433)
- ivy: apply static styles/classes directly to an element’s style/className properties (#33364) (5607ad8)
- ivy: improve styling performance (#33326) (d40ee6a)
- bazel: remove deprecated ng_setup_workspace() function (#33330) (8bc5fb2)
- compiler: do not throw when using abstract directive from other compilation unit (#33347) (355e54a)
- compiler: ensure that legacy ids are rendered for ICUs (#33318) (5d86e4a)
- ivy: align VE + Ivy #ref types in fullTemplateTypeCheck: false (#33261) (77240e1)
- ivy: handle method calls of local variables in template type checker (#33132) (e2211ed), closes #32900
- language-service: Add directive selectors & banana-in-a-box to completions (#33311) (49eec5d)
- language-service: Add global symbol for $any() (#33245) (3f257e9)
- language-service: Preserve CRLF in templates for language-service (#33241) (65a0d2b)
- ngcc: do not fail when multiple workers try to create the same directory (#33237) (8017229), closes /github.com/angular/angular/pull/33049#issuecomment-540485703
- core: add ModuleWithProviders generic type migration (#33217) (56731f6)
- ivy: enable re-export of the compilation scope of NgModules privately (#33177) (c4733c1), closes #29361
- ivy: give shim generation its own compiler options (#33256) (d4db746)
- ngcc: enable private NgModule re-exports in ngcc on request (#33177) (e030375)
- bazel: @angular/bazel ng_setup_workspace() is no longer needed and has been removed. We assume you will fetch rules_nodejs in your WORKSPACE file, and no other dependencies remain here. Simply remove any calls to this function and the corresponding load statement.
- bazel: Remove angular devkit and restore ngc postinstall (#32946) (f036684)
- common: remove deprecated support for intl API (#29250) (9e7668f), closes #18284
- compiler: absolute source span for template attribute expressions (#33189) (fd4fed1)
- core: add CLI instructions when localize polyfill is missing (#33199) (5dfbcd5)
- ivy: ensure errors are thrown during checkNoChanges for style/class bindings (#33103) (f45c431)
- ivy: ensure map-based interpolation works with other map-based sources (#33236) (7b64680)
- ivy: handling className as an input properly (#33188) (6f203c9)
- ivy: ignore non-property bindings to inputs in template type checker (#33130) (08cb2fa), closes #32099 #32496
- ivy: throw better error for missing generic type in ModuleWithProviders (#33187) (0e08ad6)
- ivy: use container i18n meta if a message is a single ICU (#33191) (7e64bbe), closes #33171
- ivy: use ReflectionHost to check exports when writing an import (#33192) (de44570)
- language-service: Increase project/script version in MockHost.reset() (#33200) (43241a5)
- language-service: reset MockHost after every spec instead of creating new LS (#33200) (11bf767)
- ngcc: avoid warning when reflecting on index signature member (#33198) (78214e7), closes /github.com/angular/angular/blob/4659cc26e/packages/common/http/src/jsonp.ts#L39
- ngcc: better detection of end of decorator expression (#33192) (5071083)
- ngcc: Esm5ReflectionHost.getDeclarationOfIdentifier should handle aliased inner declarations (#33252) (bfd07b3)
- ngcc: report the correct viaModule when reflecting over commonjs (#33192) (afcff73)
- router: adjust UrlTree redirect to replace URL if in eager update (#32988) (f6667f8), closes #31168 #27148
- upgrade: remove unused version export (#33180) (becd62d)
- add a flag in bootstrap to enable coalesce event change detection to improve performance (#30533) (21c1e14)
- ivy: improve debugging experience for styles/classes (#33179) (724707c)
- typescript 3.6 support (#32946) (86e1e6c), closes #32380
- ivy: type checking of event bindings (#33125) (6958d11)
- language-service: add Angular pseudo elements into completions (#31248) (7c64b8d)
- ngcc: support –async flag (defaults to true) (#33192) (2196114)
- ngcc: support ignoreMissingDependencies in ngcc config (#33192) (4da2dda)
- ivy: initialise inputs from static attrs on the first template pass only (#33195) (aef7dca)
- ivy: limit global state read / write in host bindings (#33195) (3e14c2d)
- build: remove vendored Babel typings (#33176) (#33215) (e9ee685)
- build: update webdriver-manager to support latest Chrome (#33216) (a914859)
- build: use http caching on windows CI runs (#33238) (#33254) (117ca7c)
- feat: add a flag in bootstrap to enable coalesce event change detection to improve performance (#30533) (#33230) (082aed6)
- typescript 3.4 and 3.5 are no longer supported, please update to typescript 3.6
- compiler-cli: produce diagnostic messages in expression of PrefixNot node. (#33087) (2ddc851)
- compiler-cli: resolve type of exported *ngIf variable. (#33016) (39587ad)
- ivy: avoid DOM element assertions if procedural renderer is used (#33156) (11e04b1)
- ivy: do not always accept
undefined
for directive inputs (#33066) (50bf17a), closes #32690 - ivy: ensure sanitizer is not used when direct class application occurs (#33154) (1cda80e)
- ivy: i18n – add XLIFF aliases for legacy message id support (#33160) (ad72c90)
- ivy: i18n – strip meta blocks from untranslated messages (#33097) (1845faa)
- ivy: i18n – support lazy-load template string helpers (#33097) (83425fa)
- ivy: i18n – turn on legacy message-id support by default (#33053) (f640a4a)
- language-service: Use index.d.ts for typings (#33043) (728cd84)
- google3 sync which requires type hints (#33108) (0c69ec2)
- ngcc: rename the executable from
ivy-ngcc
tongcc
(#33140) (1a34fbc) - service-worker: continue serving api requests on cache failure (#32996) (52483bf), closes #21412
- compiler: record absolute span of template expressions in parser (#31897) (b04488d), closes #31898
- core: add postinstall ngcc migration (#32999) (30d25f6)
- ivy: better error messages for unknown components (#33064) (d8249d1)
- ivy: check regular attributes that correspond with directive inputs (#33066) (cd7b199)
- ivy: disable strict null checks for input bindings (#33066) (ece0b2d)
- ivy: i18n – support source locale inlining (#33101) (f433d66)
- change tslib from direct dependency to peerDependency (#32167) (e2d5bc2)
- language-service: directive info when looking up attribute’s symbol (#33127) (ce7f934)
- language-service: hover information for component NgModules (#33118) (e409ed0), closes #32565
- ngcc: support fallback to a default configuration (#33008) (9167624)
- ngcc: support version ranges in project/default configurations (#33008) (90007e9)
- ivy: guard host binding execution with a TNode flag (#33102) (d4d0723)
- ivy: introduce micro-benchmark for directive instantiation (#33082) (22d4efb)
- ivy: limit memory reads in getOrCreateNodeInjectorForNode (#33102) (dcca80b)
- ivy: speed up bindings when no directives are present (#32919) (b2decf0)
- ivy: stricter null checks in setInputsFromAttrs (#33102) (b800b88)
- ivy: use instanceof operator to check for NodeInjectorFactory instances (#33082) (8d111da)
- We no longer directly have a direct depedency on
tslib
. Instead it is now listed apeerDependency
.

Angular Architecture Workshop: Strategic Design with Nx and Micro Frontends
by Manfred Steyer (SOFTWAREarchitekt.at)
Updated 3 February, 2020
The pace is building ready for the big finish. With just days between the last Angular release candidates, it looks like we’re fast approaching the moment when Angular 9 finally arrives in its final form. The big news today seems to be what’s not in the update, and that’s Ivy! For the first time since work started in earnest on Angular 9, Ivy hasn’t been touched. Could that mean that the pipeline is finally ready for the big time? Only time will tell.
The changes that are there are four bug fixes and a feature update for ngcc, which makes it so that outdated ngcc artifacts are automatically cleaned. Previously an error would be thrown if packages were found that had already been processed by an outdated version. Now, however, packages with outdated artifacts will be cleaned, allowing them to be reprocessed correctly using ngcc’s current version.
While we sit tight and wait to see what happens, here’s a video of Chris Noring’s International JavaScript Conference session: Angular Schematics – The unknown hero. If you don’t have an hour to spare, you can still read the full release notes for rc.13 below.
Angular 9.0.0-rc.13
Bug Fixes
Features
Updated 31 January, 2020
It’s the final countdown.
Angular 9 is so close to its final form, but before then there is another release candidate to check out with just a few last-minute changes. The date of the final version is still unknown, so keep your eyes peeled.
There aren’t many changes this time around, which is to be expected this late in the game. Version 9.0.0-rc.12 smooths out some of the bugs for Ivy and ramps up performance upgrades by removing an unused argument in the hostBindings function. Making Ivy as perfect as possible is important, as once Angular 9 releases, it will become the default rendering pipeline. (Previously in Angular 8, users could opt into a preview version.)
Now that we are nearing the end of our wait, what about Angular 10? (It’s never too early to look towards the future.) An article on InfoWorld by Paul Krill reveals that Angular 10 has a target date set for a May 2020 release. We will see if that holds true.
For now, read the full release notes for rc.12 below.
Angular 9.0.0-rc.12
Bug Fixes
Features
Performance Improvements
Updated January 27, 2020
The pace quickens and the timeline between release candidates has become mere days. We are nearing the final line and the wait for the final version of Angular 9 is nearly over. Another release candidate has arrived; 9.0.0-rc.11 mostly included bug fixes for Ivy.
Ironing out all the bugs in release candidates will make for a cleaner final version, that hopefully will be as issue-free as can be.
In addition to the tweaks and fixes, rc.11 adds more styling use-cases to benchmarks in Ivy, which will improve performance. According to the original pull requests on GitHub, the new benchmarks focus on style bindings – style and ngStyle.
This release candidate also adds support for multiple definitions for a queried location in a template. Other notable changes this time around include making metadata in Declaration a requirement and getDiagnostics has been renamed to getSemanticDiagnostics.
Read the full release notes for rc.11 below.
Angular 9.0.0-rc.11
Bug Fixes
Features
Performance
Updated January 23, 2020
It’s cold outside but we’re starting to see the odd sparkle of sunshine in the morning, where before there was only darkness. Much like with Angular 9 – is 9.0.0-rc.10 a hopeful ray of sunshine that heralds the arrival of Angular 9 final? We’ve got our fingers crossed.
No new features this version. No performance improvements either. This release candidate is all about fixing bugs, some of which have been open for months now. This definitely feels like a last zhoosh before stepping into the limelight.
You can read the release notes below, but why not take a few minutes to treat yourself to this fantastic video of Manfred Steyer’s International JavaScript Conference session: The Future of Angular and your Architectures with Ivy. Enjoy!
Bug Fixes
Updated January 16, 2020
Mid-January has come and gone, and we are still waiting for Angular 9. But don’t worry, Angular 9.0.0-rc.9 is here to make the wait more bearable. It fixes bugs for forms, ivy, language-service and ngcc. And that’s not all: ivy has received four performance improvements and you can now use six additional features for ivy, language-service and more.
One of the new language-service features is the added completion for the $event
variable in bound event expressions – and it’s only the first in a series of similar pull requests. language-service has also received further hover support, and the ivy error message ExpressionChangedAfterChecked
now shows more detailed information such as the attribute name.
Angular 9.0.0-rc.9
Bug Fixes
Features
Performance Improvements
Updated January 9, 2020
We’ve made it to 2020 and the wait for Angular 9 is becoming excruciating, but with rc.8 hopefully we’ve almost made it! Back in the day, Angular 8 only made it to rc.5, and we know that the Angular team took a bit of a break over the holidays (not that you’d know from the speedy landing of the latest update), so we’re hoping that they’ll come back to work refreshed and ready to finish Angular 9.
Of the three new features in this release, two are minor but potentially very useful – adding more useful information to hover tooltips. The third is a breaking change that alters the way expression tokens work. Previously, in {{ token1 + token2 }}
the trailing white space after token1
and before +
might have also been included in the token span. Now, with an end
field added, end
is one past the last index of the token source code. This change will enable a parser to correctly determine the span of a token (without trailing whitespace).
Angular 9.0.0-rc.8
Bug Fixes
Features
Performance Improvements
Updated December 19, 2019
Angular 9.0.0-rc.7
Bug Fixes
Features
Performance Improvements
Updated December 17, 2019
We now have the sixth Angular 9 release candidate, so we were hoping to wake up one of these mornings and find an Angular-shaped present in our stocking, but it seems that the Angular team are people too. They’ve had a long road working towards the new major version and now we’ve reached the time of year where it’s good to spend some time with our families and recharge a bit.
Yesterday, Google Engineering Manager Jules Kremer tweeted that they will be holding the final release until 2020 so that everyone can get some time off.
FYI, I made the decision to hold the #Angular 9.0 release until next year so that all of us and you can take time off over the coming weeks. Happy Holidays & see you in 2020!
— Jules Kremer (@jules_kremer) December 16, 2019
While this is disappointing news in some respects, hopefully it means that 2020 will start with a bang.
Updated December 12, 2019
Angular 9.0.0-rc.6
Bug Fixes
Performance Improvements
Here’s the complete list of changes, as seen on the changelog.
Angular 9.0.0-rc.5
Bug Fixes
Performance Improvements
Updated November 27, 2019
Angular 9.0.0-rc.4
Bug Fixes
Features
Performance Improvements
Updated November 21, 2019
Angular 9.0.0-rc.3
Bug Fixes
Features
Performance Improvements
Updated November 14, 2019
Angular 9.0.0-rc.2
Bug Fixes
Performance Improvements
Reverts
Update November 7, 2019
Angular 9.0.0-rc.1
Bug Fixes
Features
Performance Improvements
Update November 6, 2019
Release candidate stage
Angular updated their changelog on GitHub and now we are one step closer to the release of Angular 9. The time has come and we are officially in the release candidate stage!
Check out the Updating to Angular Version 9 guide.
From the updating guide, be aware of the breaking changes and deprecations that come with v9.
Breaking changes
Deprecations
The following APIs are deprecated in v9.
Removals of deprecated APIs
Update October 31, 2019
Angular 9.0.0-next.15
Bug Fixes
Features
Performance Improvements
Update October 31, 2019
Angular 9.0.0-next.14
Bug Fixes
Features
Performance Improvements
Update October 28, 2019
Angular 9.0.0-next.13
Bug Fixes
Features
Performance Improvements
BREAKING CHANGES
Update October 24, 2019
Angular 9.0.0-next.12
Bug Fixes
Features
Performance Improvements
Reverts
BREAKING CHANGES
Update October 21, 2019
Angular 9.0.0-next.11
Bug Fixes
Code Refactoring
Features
Performance Improvements
BREAKING CHANGES
Users not using the CLI will need to manually install tslib
via;
yarn add tslib
or
npm install tslib --save
- forms: *
<ngForm></ngForm>
can no longer be used as a selector. Use<ng-form></ng-form>
instead. - The
NgFromSelectorWarning
directive has been removed. FormsModule.withConfig
has been removed. Use theFormsModule
directly.
Update October 14, 2019
Bug Fixes
- common: expand type for “ngForOf” input to work with strict null checks (#31371) (c1bb886), closes #16373
- core: ngNoopZone should have the same signature with ngZone (#32068) (3a53e2c), closes #32063
- core: set migration schematic versions to valid semver versions (#32991) (0119f46)
- core: update migration descriptions with links to AIO documentation (#32991) (f8eca84)
- ivy: avoid exposing
ng
with Closure Compiler enhanced optimizations (#33010) (bad3434) - ivy: generate ng-reflect properties for i18n attributes (#32989) (90fb5d9)
- ivy: i18n – better translation warnings (#32867) (97d5700)
- ivy: i18n – do not render message ids unnecessarily (#32867) (9188751)
- ivy: i18n – support colons in $localize metadata (#32867) (d24ade9)
- ivy: i18n – throw an error if a translation contains an invalid placeholder (#32867) (601f87c)
- ivy: missing schematics field in localize package (#33025) (d18289f), closes #32791
- ivy: process nested animation metadata (#32818) (c61e4d7), closes #32794
- ivy: unable to bind style zero (#32994) (3efb060), closes #32984
- language-service: create StaticReflector once only (#32543) (adb562b)
Code Refactoring
Features
- core: default to dynamic queries (#32720) (7806596)
- core: make static query flag optional (#32986) (900d005), closes #32686
- forms: formGroupName and formArrayName also accepts a number (#32607) (fee28e2)
- ivy: i18n – implement compile-time inlining (#32881) (2cdb3a0)
- ivy: i18n – render legacy message ids in
$localize
if requested (#32937) (bcbf3e4) - language-service: module definitions on directive hover (#32763) (0d186dd), closes #32565
- ngcc: expose
--create-ivy-entry-points
option on ivy-ngcc (#33049) (b2b917d), closes /github.com/angular/angular/pull/32999#issuecomment-539937368
Performance Improvements
- ivy: add static attributes to the element_text_create benchmark (#32997) (affae99)
- ivy: attempt rendering initial styling only if present (#32979) (6004703)
- ivy: avoid memory allocation in the isAnimationProp check (#32997) (9f0c549)
- ivy: increase number of created views in the element_text_create benchmark (#32979) (8593d0d)
- ivy: limit TNode.inputs reads on first template pass (#32979) (e6881b5)
- ivy: move attributes array into component def (#32798) (d5b87d3)
- language-service: improve Language service performance (#32098) (65297cd)
BREAKING CHANGES
- core: The deprecated type
Renderer
has been removed. UseRenderer2
instead. - core: The deprecated type
RenderComponentType
has been removed. UseRendererType2
instead. - core: The deprecated type
RootRenderer
has been removed. UseRendererFactory2
instead.
Update September 20, 2019
Bug Fixes
- bazel: ng_package(data) should support non-text files (#32721) (df1c456)
- compiler-cli: fix typo in diagnostic template info. (#32684) (f6d6667), closes #32662
- core: initialize global ngDevMode without toplevel side effects (#32079) (5f095a5), closes #31595
- core: make injector.get() return default value with InjectFlags.Self flag on (#27739) (0477bfc), closes #27729
- ivy: avoid unnecessary i18n instructions generation for with structural directives (#32623) (5328bb2)
- ivy: correct debug array names (#32691) (52a6da0)
- ivy: DebugNode throws exceptions when querying some properties (#32622) (bfb3995)
- ivy: ensure that
window.ng
utilities are published when NgModules are used (#32725) (a0d04c6) - ivy: i18n – start generated placeholder name at
PH
(#32493) (f1b1de9) - ivy: i18n – update the compiler to output
MessageId
s (#32594) (b741a1c) - ivy: i18n – use
MessageId
for matching translations (#32594) (357aa4a) - language-service: Lazily instantiate MetadataResolver (#32631) (1771d6f)
- language-service: Use tsLSHost.fileExists() to resolve modules (#32642) (bbb2798)
- ngcc: consistently use outer declaration for classes (#32539) (373e133), closes #32078
- ngcc: correctly read static properties for aliased classes (#32619) (c4e039a), closes #32539 #31791
- ngcc: resolve imports in
.d.ts
files for UMD/CommonJS bundles (#32619) (3c7da76), closes #31791 - ngcc: support UMD global factory in comma lists (#32709) (e5a3de5)
Features
- bazel: support ts_library targets as entry-points for ng_package (#32610) (217db9b)
- core: add dynamic queries schematic (#32231) (f5982fd)
- core: Mark TestBed.get as deprecated (#32406) (a85eccd), closes #32200 #26491
- ivy: expose
window.ng.getDebugNode
helper (#32727) (4726ac2) - ivy: i18n – add syntax support for
$localize
metadata block (#32594) (c7abb7d) - ivy: i18n – reorganize entry-points for better reuse (#32488) (2bf5606)
- language-service: enable logging on TypeScriptHost (#32645) (e82f56b)
- language-service: provide diagnostic for invalid templateUrls (#32586) (adeee0f), closes #32564
- language-service: provide diagnostics for invalid styleUrls (#32674) (4c168ed), closes #32564
Performance Improvements
- ivy: avoid megamorphic reads during property binding (#32574) (fcdd068)
- ivy: avoid repeated lview reads in pipe instructions (#32633) (73cb581)
- ivy: avoid repeated LView reads in property instructions (#32681) (e6ed4a2)
- ivy: avoid unnecessary DOM reads in styling instructions (#32716) (05e1b3b)
- ivy: binding update benchmark (#32574) (ea378a9)
- ivy: convert all node-based benchmark to use a testing harness (#32699) (1748aeb)
- ivy: guard listening to outputs with isDirectiveHost (#32495) (527ce3b)
- ivy: initialise TNode inputs / outputs on the first creation pass (#32608) (ad178c5)
- ivy: introduce benchmark for listeners registration (#32495) (024765b)
- ivy: limit TNode.outputs reads (#32495) (51292e2)
- ivy: run the expandng rows benchmark with es2015 (#32716) (3ace25f)
- language-service: keep analyzedModules cache when source files don’t change (#32562) (4f03323)
DEPRECATIONS
- core: TestBed.get function is marked as deprecated, use TestBed.inject instead.
Update September 12, 2019
9.0.0-next.6
Bug Fixes
- core: improve the “missing
$localize
” error message (#32491) (a9ff48e) - ivy: capture template source mapping details during preanalysis (#32544) (a64eded), closes #32538
- ivy: handle expressions in i18n attributes properly (#32309) (f00d033)
- ivy: i18n – do not generate jsdoc comments for
$localize
(#32473) (a731119) - ivy: maintain coalesced listeners order (#32484) (098feec)
- ivy: match class and attribute value without case-sensitivity (#32548) (ded5724)
- ivy: node placed in incorrect order inside ngFor with ng-container (#32324) (da42a76)
- ivy: restore global state after running refreshView (#32521) (a1beba4)
- ivy: template compiler should render correct $localize placeholder names (#32509) (ea6a2e9)
- ivy: unable to bind to properties that start with class or style (#32421) (62d92f8), closes #32310
- ivy: unable to override ComponentFactoryResolver provider in tests (#32512) (2124588)
- ivy: warn instead of throwing for unknown properties (#32463) (bc061b7)
- language-service: Return empty external files during project initialization (#32519) (a65d3fa)
- language-service: Use module resolution cache (#32479) (6052b12)
- ngcc: only back up the original
prepublishOnly
script and not the overwritten one (#32427) (38359b1) - service-worker: keep serving clients on older versions if latest is invalidated (#31865) (bda2b4e)
Code Refactoring
Features
- language-service: add definitions for styleUrls (#32464) (a391aeb)
- language-service: add script to rebuild, refresh Angular dist (#32515) (1716b91)
- service-worker: recover from
EXISTING_CLIENTS_ONLY
mode when there is a valid update (#31865) (094538c), closes #31109
Performance Improvements
- ivy: check for animation synthetic props in dev mode only (#32578) (7280710)
- ivy: introduce a node-based micro-benchmarks harness (#32510) (2895edc)
- ivy: replace select instruction with advance (#32516) (664e001)
- ivy: run tree benchmark with bundles and ngDevMode off (#32558) (c3a1ef2)
- ngcc: process tasks in parallel in async mode (#32427) (e36e6c8)
BREAKING CHANGES
- bazel: Angular bazel users using protractor_web_test_suite from @angular/bazel npm package should now switch to the @bazel/protractor npm package.
This should impact very few users and the users that are impacted have a very easy upgrade path to switch to fetching the protractor_web_test_suite rule via the @bazel/protractor npm package.
8.2.6
This release contains various API docs improvements.
Update September 12, 2019
9.0.0-next.5
Bug Fixes
- ivy: add missing closure extern for $localize (#32460) (e8f9ba4)
- ivy: ensure binding ordering doesn’t mess up when a
NO_CHANGE
value is encountered (#32143) (7cc4225) - ivy: i18n – handle translated text containing HTML comments (#32475) (5d8eb74)
- ivy: ngcc – improve the “ngcc version changed” error message (#32396) (d5101df)
- ivy: Prevent errors when querying for elements outside Angular context (#32361) (260217a)
- language-service: Create DirectiveKind enum (#32376) (852afb3)
- language-service: Invalidate Reflector caches when program changes (#32357) (97fc45f)
- update all files/directories owned by DevInfra to new DevInfra Framework team alias (#32247) (3758978)
- language-service: re-add regressed templateUrl tests (#32438) (1ed3531), closes #32378
- language-service: Use ts.CompletionEntry for completions (#32375) (f6e88cd)
- ngcc: handle compilation diagnostics (#31996) (f7471ee), closes #31977
- common: HttpParams fromObject accepts ReadonlyArray (#31072) (f5bec3f), closes #28452
Features
- bazel: update to the latest
[@microsoft](https://github.com/microsoft)/api-extractor
(#32185) (350ea47) - core: Adds DI support for
providedIn: 'platform'|'any'
(#32154) (77c382c) - core: Introduce TestBed.inject to replace TestBed.get (#32200) (3aba7eb), closes #26491 #29905
- ivy: implement
$localize()
global function (#31609) (b21397b) - language-service: add definitions for templateUrl (#32238) (46caf88), closes angular/vscode-ng-language-service#111
Performance Improvements
- core: Make
PlatformLocation
tree-shakable (#32154) (1537791) - ivy: add a micro benchmark for map-based style and class bindings (#32401) (ba5e07e)
- ivy: add a micro benchmark for style and class bindings (#32401) (df8e675)
- ivy: add element and text creation benchmark (#32342) (85864ed)
- ivy: guard directive-related operations with a TNode flag (#32445) (641c5c1)
- ivy: properly initialise global state in the element_text_create benchmark (#32397) (8dc3f36)
- ivy: remove renderStringify calls for text nodes creation (#32342) (a1e91b0)
- ivy: remove repeated memory read / write in addComponentLogic (#32339) (581b837)
- ivy: run registerPostOrderHooks in the first template pass only (#32342) (fac066e)
Reverts
- docs: create Issue and Pull Request markdown doc, explaining automatic locking policy (#32405) (43619fc)
BREAKING CHANGES
- ivy: This commit removes the public export of
hasBeenProcessed()
.
This was exported to be availble to the CLI integration but was never used. The change to the function signature is a breaking change in itself so we remove the function altogether to simplify and lower the public API surface going forward.
- core: Injector.get now accepts abstract classes to return type-safe values. Previous implementation returned
any
through the deprecated implementation.
8.2.5
Bug Fixes
Update September 5, 2019
9.0.0-next.4
Bug Fixes
- ivy: debug node names should match user declaration (#32328) (14feb56)
- ivy: ngtsc throws if “flatModuleOutFile” is set to null (#32235) (4f7c971)
- ivy: reset binding index before executing a template in
refreshView
call (#32201) (6b245a3) - ngcc: do not analyze dependencies for non Angular entry-points (#32303) (e563d77), closes #32302
Features
- core: add undecorated classes with decorated fields schematic (#32130) (904a201)
- ivy: use the schema registry to check DOM bindings (#32171) (0677cf0)
Performance Improvements
- ivy: minimise writes to the lView[BINDING_INDEX] / binding root (#32263) (e3422e0)
- ivy: store binding metadata in the ngDevMode only (#32317) (0874bf4)
8.2.4
This release contains various API docs improvements.
Update August 29, 2019
9.0.0-next.3
Features
- core: add undecorated classes migration schematic (#31650) (024c31d)
- forms: formControlName also accepts a number (#30606) (628b0c1)
- compiler: allow selector-less directives as base classes in View Engine (#31379) (4055150)
- ivy: support selector-less directive as base classes in Ivy (#32125) (cfed0c0), closes #31379
- ivy: make the Ivy compiler the default for ngc (#32219) (ec4381d)
- ivy: convert all ngtsc diagnostics to ts.Diagnostics (#31952) (0287b23)
Performance Improvements
- core: make sanitization tree-shakable in Ivy mode (#31934) (2e4d17f)
- ivy: auto-call select(0) for non-empty views only (#32131) (4d549f6)
- ivy: avoid first template pass checks during view creation (#32120) (4c3b791)
- ivy: avoid for-of loops at runtime (#32157) (abb44f7)
- ivy: improve NaN checks in change detection (#32212) (53bfa7c)
- ivy: interpolation micro-benchmark (#32104) (be665d8)
- ivy: noop change detection micro-benchmark (#32104) (c422c72)
- don’t create holey arrays (#32155) (6477057)
- ivy: read selected index only when need in prop bindings (#32212) (53f33c1)
- ivy: split hooks processing into init and check phases (#32131) (1062960)
- ivy: split view processing into render (create) and refresh (update) pass (#32020) (b9dfe66)
Bug Fixes
- bazel: pin
[@microsoft](https://github.com/microsoft)/api-extractor
(#32187) (5da5ca5) - common: update $locationShim to notify onChange listeners before emitting AngularJS events (#32037) (5064dc7)
- compiler: return enableIvy true when using
readConfiguration
(#32234) (424ab48) - ivy: get name directly from nativeNode (#32198) (3dbc4ab)
- ivy: handle empty bindings in template type checker (#31594) (0db1b5d), closes #30076 #30929
- ivy: in ngcc, handle inline exports in commonjs code (#32129) (02bab8c)
- ivy: ngcc should only index .d.ts exports within the package (#32129) (964d726)
- ivy: ngTemplateOutlet error when switching between null and template value (#32160) (c2868de), closes #32060
- ivy: run template type-checking for all components (#31952) (bfc26bc)
- language-service: Instantiate MetadataResolver once (#32145) (6a0b1d5)
- language-service: Remove ‘context’ used for module resolution (#32015) (a91ab15)
- ngcc: handle deep imports that already have an extension (#32181) (4bbf16e), closes #32097
- ngcc: ignore format properties that exist but are undefined (#32205) (f8b995d), closes #32052 #32188
BREAKING CHANGES
- ivy: make Hammer support tree-shakable. Previously, in Ivy applications, Hammer providers were included by default. With this commit, apps that want Hammer support must import
HammerModule
in their root module. (#32203) (de8ebbd)
8.2.3
Bug Fixes
Update August 22, 2019
9.0.0-next.2
Bug Fixes
- bazel: disable treeshaking when generating FESM and UMD bundles (#32069) (4f37487)
- compiler: do not remove whitespace wrapping i18n expansions (#31962) (0ddf0c4)
- ivy: reuse compilation scope for incremental template changes. (#31932) (eb5412d), closes #31654
Performance Improvements
8.2.2
Bug Fixes
Update August 13, 2019
9.0.0-next.1
Bug Fixes
- language-service: getSourceFile() should only be called on TS files (#31920) (e8b8f6d)
- language-service: Make Definition and QuickInfo compatible with TS LS (#31972) (a8e2ee1)
- upgrade: compile downgraded components synchronously (if possible) (#31840) (c1ae612), closes #27217 #30330
8.2.1
Bug Fixes
- upgrade: compile downgraded components synchronously (if possible) (#31840) (04ebd59), closes #27217 #30330
Update July 31, 2019
8.2.0-rc.0
Bug Fixes
- bazel: increase memory limit of ngc under bazel from 2 to 4 GB (#31784) (5a8eb92)
- core: allow Z variations of CSS transforms in sanitizer (#29264) (78e7fdd)
- elements: handle falsy initial value (#31604) (7151eae), closes angular/angular#30834
- platform-browser: debug element query predicates not compatible with strictFunctionTypes (#30993) (10a1e19)
Features
- bazel: compile targets used for indexing by Kythe with Ivy (#31786) (82055b2)
- upgrade: support $element in upgraded component template/templateUrl functions (#31637) (29e1c53)
Performance Improvements
8.1.3
Bug Fixes
- elements: handle falsy initial value (#31604) (434b796), closes angular/angular#30834
Performance Improvements
Update July 18, 2019
Bug Fixes
- use the correct WTF array to iterate over (#31208) (9204de9)
- bazel: pass custom bazel compiler host rather than rewriting one (#31496) (0c61a35)
- compiler-cli: Return original sourceFile instead of redirected sourceFile from getSourceFile (#26036) (3166cff), closes #22524
- language-service: Eagarly initialize data members (#31577) (0110de2)
Bug Fixes
- use the correct WTF array to iterate over (#31208) (4aed480)
- compiler-cli: Return original sourceFile instead of redirected sourceFile from getSourceFile (#26036) (13dbb98), closes #22524
- core: export provider interfaces that are part of the public API types (#31377) (bebf089), closes /github.com/angular/angular/pull/31377#discussion_r299254408/github.com/angular/angular/blob/9e34670b2/packages/core/src/di/interface/provider.ts#L365-L366/github.com/angular/angular/blob/9e34670b2/packages/core/src/di/interface/provider.ts#L283-L284/github.com/angular/angular/blob/9e34670b2/packages/core/src/di/index.ts#L23
Update 11, July
8.2.0-next.1
Features
Bug Fixes
- bazel: revert location of xi18n outputs to bazel-genfiles (#31410) (1d3e227)
- compiler: give ASTWithSource its own visit method (#31347) (6aaca21)
Compare between 8.2.0-next.0 and 8.2.0-next.1 here on GitHub to see what commits have been made.
8.1.1
- core: export provider interfaces that are part of the public API types (#31377) (bebf089), closes /github.com/angular/angular/pull/31377#discussion_r299254408/github.com/angular/angular/blob/9e34670b2/packages/core/src/di/interface/provider.ts#L365-L366/github.com/angular/angular/blob/9e34670b2/packages/core/src/di/interface/provider.ts#L283-L284/github.com/angular/angular/blob/9e34670b2/packages/core/src/di/index.ts#L23
Update 3, July
8.2.0-next.0
Features
- bazel: allow passing a custom bazel compiler host to ngc compile (#31341) (a29dc96)
- bazel: allow passing and rewriting an old bazel host (#31381) (11a208f), closes #31341
Bug fixes
- core: handle
undefined
meta ininjectArgs
(#31333) (80ccd6c), closes CLI #14888 - service-worker: cache opaque responses in data groups with
freshness
strategy (#30977) (d7be38f), closes #30968 - service-worker: cache opaque responses when requests exceeds timeout threshold (#30977) (93abc35)
8.1.0
Bug fixes
- core: handle
undefined
meta ininjectArgs
(#31333) (80ccd6c), closes CLI #14888 - service-worker: cache opaque responses in data groups with
freshness
strategy (#30977) (b0c3453), closes #30968 - service-worker: cache opaque responses when requests exceeds timeout threshold (#30977) (a9038ef)
Update 27, June
8.1.0-rc.0
Features
Bug Fixes
- bazel: exclude all angular schematics folders from metadata build (#31237) (16717fa), closes #31235
- bazel: remove unsupported Css pre-processors from ng new (#31234) (e83667a), closes #31209
- bazel: update ng new schema to match the current ng new schema of @schematics/angular (#31234) (805fc86), closes #31233
- compiler: fix Elements not making a new ParseSourceSpan (#31190) (7035f22)
- compiler: stringify
Object.create(null)
tokens (#16848) (5e53956) - service-worker: registration failed on Safari (#31140) (a5dd4ed), closes #31061
8.0.3
Bug Fixes
- bazel: exclude all angular schematics folders from metadata build (#31237) (6bad2ca), closes #31235
- bazel: remove unsupported Css pre-processors from ng new (#31234) (980bcaf), closes #31209
- bazel: update ng new schema to match the current ng new schema of @schematics/angular (#31234) (48f7f65), closes #31233
- service-worker: registration failed on Safari (#31140) (f470e69), closes #31061
Update 24, June
8.1.0-next.3
- bazel: builder workspace should use nodejs v10.16.0 (#31088) (a1fc4de)
- core: temporarily remove @deprecated jsdoc tag for a TextBedStatic.get overload (#30714) (6bc9c78), closes #30514
- language-service: Remove ‘any’ in getQuickInfoAtPosition (#31014) (a4601ec)
8.0.2
- bazel: builder workspace should use nodejs v10.16.0 (#31088) (c198dc6)
- core: temporarily remove @deprecated jsdoc tag for a TextBedStatic.get overload (#30714) (0a7aebb), closes #30514
- language-service: Remove ‘any’ in getQuickInfoAtPosition (#31014) (7f21449)
Update 14, June
8.1.0-next.2
- bazel: do not modify tsconfig.json (#30877) (b086676)
- bazel: exclude components schematics from build (#30825) (05a43ca)
- bazel: Load global stylesheet in dev and prod (#30879) (17bfedd)
- common: expose the
HttpUploadProgressEvent
interface as public API (#30852) (5c18f23), closes #30814 - service-worker: avoid uncaught rejection warning when registration fails (#30876) (81c2a94)
8.0.1
- bazel: do not modify tsconfig.json (#30984) (49307f0)
- bazel: Load global stylesheet in dev and prod (#30879) (5a7bcd1)
- common: expose the
HttpUploadProgressEvent
interface as public API (#30852) (4e8614b), closes #30814 - core: TypeScript related migrations should cater for BOM (#30719) (26e3615), closes /github.com/angular/angular-cli/blob/master/packages/angular_devkit/schematics/src/tree/recorder.ts#L72 #30713
- service-worker: avoid uncaught rejection warning when registration fails (#30876) (08c38a1)
Update 3, June
After following the long road towards Angular v8, it successfully launched on May 28, 2019, with new features, changes, and improvements galore.
Now, we embark on a new journey: towards Angular v9! Let’s follow the latest changes and additions. Head on over to the changelog on GitHub to keep track of the news.
Angular 8.1.0 beta is already here, just days after v8 arrived. It includes an array of bug fixes and six new features.
Let’s take a look.
Features
- bazel: use
rbe_autoconfig()
and new container. (#29336) (9abf114) - common: add ability to watch for AngularJS URL updates through
onUrlChange
hook (#30466) (1aff524) - common: stricter types for
SlicePipe
(#30156) (95830ee) - core: deprecate integration with the Web Tracing Framework (WTF) (#30642) (f310a59)
- language-service: Implement
definitionAndBoundSpan
(#30125) (f491673) - platform-webworker: deprecate platform-webworker (#30642) (ccc76f7)
Bug Fixes
- bazel: allow ts_library interop with list-typed inputs (#30600) (3125376)
- bazel: Bump ibazel to 0.10.1 for windows fixes (#30196) (1353bf0)
- bazel: Directly spawn native Bazel binary (#30306) (2a0f497)
- bazel: Disable sandbox on Mac OS (#30460) (b6b1aec)
- bazel: Exclude common/upgrade* in metadata.tsconfig.json (#30133) (1f4c380)
- bazel: ng test should run specific ts_web_test_suite (#30526) (e688e02)
- bazel: pass correct arguments to http_server in Windows (#30346) (3aff79c), closes #29785
- bazel: update peerDep ranges (#30155) (4ae0ee8)
- bazel: Use existing npm/yarn lock files (#30438) (ff29ccc)
- compiler-cli: log ngcc skipping messages as debug instead of info (#30232) (60a8888)
- core: consistently use ng:/// for sourcemap URLs (#29826) (392473e)
- core: CSS sanitizer now allows parens in file names (#30322) (728db88)
- core: fix interpolate identifier in AOT (#30243) (30d1f29)
- core: migrations not always migrating all files (#30269) (349935a)
- core: remove deprecated
TestBed.deprecatedOverrideProvider
API (#30576) (a96976e) - core: require ‘static’ flag on queries in typings (#30639) (84dd267)
- core: static-query migration errors not printed properly (#30458) (6ceb903)
- core: static-query migration fails with default parameter values (#30269) (6357d4a)
- core: static-query migration should gracefully exit if AOT compiler throws (#30269) (509352f)
- core: static-query migration should handle queries on accessors (#30327) (0ffdb48)
- core: static-query migration should not fallback to test strategy (#30458) (0cdf598)
- core: static-query migration should not prompt if no queries are used (#30254) (4c12d74)
- core: static-query usage migration strategy should detect ambiguous query usage (#30215) (8d3365e)
- core: temporarily remove @deprecated jsdoc tag for a TextBed.get overload (#30514) (f6bf892), closes #29290#29905
- language-service: Remove tsserverlibrary from rollup globals (#30123) (124e497)
- router: ensure
history.state
is set ineager
update mode (#30154) (b40f6f3) - router: ensure navigations start with the current URL value incase redirect is skipped (#30344) (0fd9d08), closes #30340 #30160
- router: fix a problem with router not responding to back button (#30160) (3327bd8)
- router: IE 11 bug can break URL unification when comparing objects (#30393) (197584d)
- router: type cast correctly for IE 11 bug breaking URL Unification when comparing objects (#30464) (53f3564)
Have you already given up?
Hi Vladimir, nope! We’ve just been busy. Even though Angular 9 has been a long time coming, we’re not going to give up now that we’re so close!
What a poor kind of journalism! Copying release notes from GitHub and republish them without any kind of editorial work is just poor.
Hi Christian, thanks for your feedback! We always try and bring something to the discussion – today is a great example as there are no release notes to be copied and pasted!