diff --git a/src/app/app.component.html b/src/app/app.component.html index 765df54..05116da 100644 --- a/src/app/app.component.html +++ b/src/app/app.component.html @@ -35,21 +35,21 @@
-

- {{'Select the options matching your project:'|i18n}} -

+

+ {{'Select the options that match your update'|i18n}} +

-

{{'Angular Versions'|i18n}}

- {{'From'|i18n}}: +

{{'Angular versions'|i18n}}

+ {{'From'|i18n}} v. - {{'To'|i18n}}: + {{'To'|i18n}} v. ` will now trigger validation logic.' }, + { possibleIn: 1200, necessaryAsOf: 1200, level: ApplicationComplexity.Advanced, step: 'v12 `emitEvent` in `FormArray` and `FormGroup`', action: 'If your app has custom classes that extend `FormArray` or `FormGroup` classes and override the above-mentioned methods, you may need to update your implementation' }, + { possibleIn: 1200, necessaryAsOf: 1200, level: ApplicationComplexity.Advanced, step: 'v12 zone.js minimum version', action: 'Update zone.js to version 0.11.4. `ng update` will update this dependency automatically.' }, + { possibleIn: 1200, necessaryAsOf: 1200, level: ApplicationComplexity.Advanced, step: 'v12 `HttpParams` method params update', action: 'If you extend the `HttpParams` class you may have to update the signature of its method to reflect changes in the parameter types.' }, + { possibleIn: 1200, necessaryAsOf: 1200, level: ApplicationComplexity.Advanced, step: 'v12 `routerLinkActiveOptions`', action: '`routerLinkActiveOptions` property of `RouterLinkActive` now has a more specific type. You may need to update code accessing this property to align with the changes.' }, + { possibleIn: 1200, necessaryAsOf: 1200, level: ApplicationComplexity.Advanced, step: 'v12 `APP_INITIALIZER` callback types', action: 'The initializer callbacks now have more specific return types, which may require update of your code if you are getting an `APP_INITIALIZER` instance via `Injector.get` or `TestBed.inject`.' }, + { possibleIn: 1200, necessaryAsOf: 1200, level: ApplicationComplexity.Advanced, step: 'v12 fragment typings', action: 'The router fragments now could be `null`. Add `null` checks to avoid TypeScript failing with type errors.' }, + { possibleIn: 1200, necessaryAsOf: 1200, level: ApplicationComplexity.Advanced, step: 'v12 `ng.getDirectives`', action: 'Make sure you don\'t rely on `ng.getDirectives` throwing an error if it can\'t find a directive associated with a particular DOM node.' }, + { possibleIn: 1200, necessaryAsOf: 1200, level: ApplicationComplexity.Advanced, step: 'v12 `optimization.styles.inlineCritical`', action: 'Check out `optimization.styles.inlineCritical` option in your angular.json file. It now defaults to `true`. Remember that the whole `optimization` option can be set as boolean which will set all the suboptions to defaults.' }, - { possibleIn: 1100, necessaryAsOf: 1100, level: 1, step: 'v11 ng update', action: 'Run `ng update @angular/core@11 @angular/cli@11` which should bring you to version 11 of Angular.' }, - { possibleIn: 1100, necessaryAsOf: 1100, level: 1, material: true, step: 'update @angular/material', action: 'Run `ng update @angular/material@11`.' }, - { possibleIn: 1100, necessaryAsOf: 1100, level: 1, step: 'v11 versions', action: 'Angular now requires [TypeScript 4.0](https://devblogs.microsoft.com/typescript/announcing-typescript-4-0/). `ng update` will migrate you automatically.' }, - { possibleIn: 1100, necessaryAsOf: 1100, level: 1, step: 'v11 browser support', action: 'Support for IE9, IE10, and IE mobile has been removed. This was announced in the [v10 update](http://blog.angular.io/version-10-of-angular-now-available-78960babd41#c357). ' }, - { possibleIn: 1100, necessaryAsOf: 1100, level: 2, step: 'webpack5 optin', action: 'You can now opt-in to use webpack 5 by using Yarn and adding `"resolutions": {"webpack": "^5.0.0"}` to your `package.json`.' }, - { possibleIn: 1100, necessaryAsOf: 1100, level: 2, step: 'ng new strict prompt', action: 'When generating new projects, you will be asked if you want to enable strict mode. This will configure TypeScript and the Angular compiler for stricter type checking, and apply smaller bundle budgets by default. You can use the `--strict=true` or `--strict=false` to skip the prompt.' }, - { possibleIn: 1100, necessaryAsOf: 1100, level: 2, step: 'v11 router relativeLinkResolution', action: 'If you use the router, the default value of `relativeLinkResolution` has changed from `legacy` to `corrected`. If your application previously used the default by not specifying a value in the ExtraOptions and uses relative links when navigating from children of empty path routes, you will need to update your `RouterModule`\'s configuration to specifically specify `legacy` for `relativeLinkResolution`. See [the documentation](https://v11.angular.io/api/router/ExtraOptions#relativeLinkResolution) for more details.' }, - { possibleIn: 1100, necessaryAsOf: 1100, level: 3, step: 'router initialNavigation', action: 'In the Angular Router, the options deprecated in v4 for `initialNavigation` have been removed. If you previously used `enabled` or `true`, now choose `enabledNonBlocking` or `enabledBlocking`. If you previously used `false` or `legacy_disabled`, now use `disabled`.' }, - { possibleIn: 1100, necessaryAsOf: 1100, level: 2, step: 'routerlink preserveQueryParams', action: 'In the Angular Router\'s `routerLink`, `preserveQueryParams` has been removed, use `queryParamsHandling="preserve"` instead.' }, - { possibleIn: 1100, necessaryAsOf: 1100, level: 3, step: 'routerlink queryParams typing', action: 'If you were accessing the `routerLink` values of `queryParams`, `fragment` or `queryParamsHandling` you might need to relax the typing to also accept `undefined` and `null`.' }, - { possibleIn: 1100, necessaryAsOf: 1100, level: 3, step: 'viewencapsulation native removed', action: 'The component view encapsulation option `ViewEncapsulation.Native` has been removed. Use `ViewEncapsulation.ShadowDom` instead. `ng update` will migrate you automatically.' }, - { possibleIn: 1100, necessaryAsOf: 1100, level: 3, step: 'ICU expressions typechecked', action: 'If you use i18n, expressions within International Components for Unicode (ICUs) expressions are now type-checked again. This may cause compilation failures if errors are found in expressions that appear within an ICU. ' }, - { possibleIn: 1100, necessaryAsOf: 1100, level: 3, step: 'forms validators asyncValidators typing', action: 'Directives in the `@angular/forms` package used to have `any[]` as the type of the expected `validators` and `asyncValidators` arguments in constructors. Now these arguments are properly typed, so if your code relies on form\'s directive constructor types it may require some updates to improve type safety.' }, - { possibleIn: 1100, necessaryAsOf: 1100, level: 3, step: 'forms AbstractFormControl', action: 'If you use Angular Forms, the type of `AbstractFormControl.parent` now includes null. `ng update` will migrate you automatically, but in an unlikely case your code was testing the parent against undefined with strict equality, you\'ll need to change this to `=== null` instead, since the parent is now explicitly initialized with `null` instead of being left undefined.' }, - { possibleIn: 1100, necessaryAsOf: 1100, level: 3, step: 'platform-webworker', action: 'The rarely used `@angular/platform-webworker` and `@angular/platform-webworker-dynamic` were deprecated in v8 and have been removed. Running parts of Angular in a web worker was an experiment that never worked well for common use cases. Angular still has great support for [Web Workers](https://angular.io/guide/web-worker). ' }, - { possibleIn: 1100, necessaryAsOf: 1100, level: 3, step: 'v11 slice pipe typing', action: 'The `slice` pipe now returns null for the undefined input value, which is consistent with the behavior of most pipes.' }, - { possibleIn: 1100, necessaryAsOf: 1100, level: 3, step: 'v11 keyvalue typing', action: 'The `keyvalue` pipe has been fixed to report that for input objects that have number keys, the result type will contain the string representation of the keys. This was already the case and the code has simply been updated to reflect this. Please update the consumers of the pipe output if they were relying on the incorrect types. Note that this does not affect use cases where the input values are `Map`s, so if you need to preserve `number`s, this is an effective way.' }, - { possibleIn: 1100, necessaryAsOf: 1100, level: 3, step: 'v11 number pipe typing', action: 'The number pipes (`decimal`, `percent`, `currency`, etc) now explicitly state which types are accepted.' }, - { possibleIn: 1100, necessaryAsOf: 1100, level: 3, step: 'v11 date pipe typing', action: 'The `date` pipe now explicitly states which types are accepted.' }, - { possibleIn: 1100, necessaryAsOf: 1100, level: 3, step: 'v11 datetime rounding', action: 'When passing a date-time formatted string to the `DatePipe` in a format that contains fractions of a millisecond, the milliseconds will now always be rounded down rather than to the nearest millisecond. Most applications will not be affected by this change. If this is not the desired behaviour then consider pre-processing the string to round the millisecond part before passing it to the `DatePipe`.' }, - { possibleIn: 1100, necessaryAsOf: 1100, level: 3, step: 'v11 async pipe typing', action: 'The `async` pipe no longer claims to return undefined for an input that was typed as undefined. Note that the code actually returned null on undefined inputs.' }, - { possibleIn: 1100, necessaryAsOf: 1100, level: 2, step: 'v11 case pipe update', action: 'The `uppercase` and `lowercase` pipes no longer let falsy values through. They now map both `null` and `undefined` to `null` and raise an exception on invalid input (`0`, `false`, `NaN`). This matches other Angular pipes.' }, - { possibleIn: 1100, necessaryAsOf: 1100, level: 3, step: 'v11 router NavigationExtras typing', action: 'If you use the router with `NavigationExtras`, new typings allow a variable of type `NavigationExtras` to be passed in, but they will not allow object literals, as they may only specify known properties. They will also not accept types that do not have properties in common with the ones in the `Pick`. If you are affected by this change, only specify properties from the NavigationExtras which are actually used in the respective function calls or use a type assertion on the object or variable: `as NavigationExtras`.' }, - { possibleIn: 1100, necessaryAsOf: 1100, level: 2, step: 'v11 TestBed.overrideProvider', action: 'In your tests if you call `TestBed.overrideProvider` after TestBed initialization, provider overrides are no longer applied. This behavior is consistent with other override methods (such as `TestBed.overrideDirective`, etc) but they throw an error to indicate that. The check was previously missing in the TestBed.overrideProvider function. If you see this error, you should move `TestBed.overrideProvider` calls before TestBed initialization is completed.' }, - { possibleIn: 1100, necessaryAsOf: 1100, level: 2, step: 'v11 router RouteReuseStrategy', action: 'If you use the Router\'s RouteReuseStrategy, the argument order has changed. When calling `RouteReuseStrategy#shouldReuseRoute` previously when evaluating child routes, they would be called with the `future` and `current` arguments swapped. If your `RouteReuseStrategy` relies specifically on only the future or current snapshot state, you may need to update the `shouldReuseRoute` implementation\'s use of `future` and `current` `ActivateRouteSnapshots`.' }, - { possibleIn: 1100, necessaryAsOf: 1100, level: 3, step: 'v11 locale data readonly', action: 'If you use locale data arrays, this API will now return readonly arrays. If you were mutating them (e.g. calling `sort()`, `push()`, `splice()`, etc) then your code will not longer compile. If you need to mutate the array, you should now take a copy (e.g. by calling `slice()`) and mutate the copy.' }, - { possibleIn: 1100, necessaryAsOf: 1100, level: 3, step: 'v11 CollectionChangeRecord', action: 'In change detection, `CollectionChangeRecord` has been removed, use `IterableChangeRecord` instead.' }, - { possibleIn: 1100, necessaryAsOf: 1100, level: 2, step: 'v11 forms async validators', action: 'If you use Angular Forms with async validators defined at initialization time on class instances of `FormControl`, `FormGroup` or `FormArray` , the status change event was not previously emitted once async validator completed. This has been changed so that the status event is emitted into the `statusChanges` observable. If your code relies on the old behavior, you can filter/ignore this additional status change event.' }, + { possibleIn: 1300, necessaryAsOf: 1300, level: ApplicationComplexity.Basic, step: 'v13 ng update', action: 'Run `ng update @angular/core@13 @angular/cli@13` which should bring you to version 13 of Angular.' }, + { possibleIn: 1300, necessaryAsOf: 1300, level: ApplicationComplexity.Basic, material: true, step: 'update @angular/material', action: 'Run `ng update @angular/material@13`.' }, + { possibleIn: 1300, necessaryAsOf: 1300, level: ApplicationComplexity.Basic, step: 'TypeScript 4.4', action: 'Angular now uses TypeScript 4.4, read more about any potential breaking changes: https://www.typescriptlang.org/docs/handbook/release-notes/typescript-4-4.html', }, + { possibleIn: 1300, necessaryAsOf: 1300, level: ApplicationComplexity.Basic, step: 'v13 node', action: 'Make sure you are using Node 12.20.0 or later', }, + { possibleIn: 1300, necessaryAsOf: 1300, level: ApplicationComplexity.Medium, step: 'v13 routerLink', action: 'You can now disable the navigation of a `routerLink` by passing `undefined` and `null`. Previously the `routerLink` directive used to accept these two values as equivalent to an empty string.' }, + { possibleIn: 1300, necessaryAsOf: 1300, level: ApplicationComplexity.Medium, step: 'v13 router loadChildren', action: 'You can no longer specify lazy-loaded routes by setting a string value to `loadChildren`. Make sure you move to dynamic ESM import statements.' }, + { possibleIn: 1300, necessaryAsOf: 1300, level: ApplicationComplexity.Medium, step: 'v13 service worker activated', action: 'The `activated` observable of `SwUpdate` is now deprecated. To check the activation status of a service worker use the `activatedUpdate` method instead.' }, + { possibleIn: 1300, necessaryAsOf: 1300, level: ApplicationComplexity.Medium, step: 'v13 service worker available', action: 'The `available` observable of `SwUpdate` is now deprecated. To get the same information use `versionUpdates` and filter only the `VersionReadyEvent` events.' }, + { possibleIn: 1300, necessaryAsOf: 1300, level: ApplicationComplexity.Medium, step: 'v13 renderModuleFactory', action: 'The `renderModuleFactory` from `@angular/platform-server` is no longer necessary with Ivy. Use `renderModule` instead.' }, + { possibleIn: 1300, necessaryAsOf: 1300, level: ApplicationComplexity.Advanced, step: 'v13 forms status', action: 'We narrowed the type of `AbstractControl.status` to `FormControlStatus` and `AbstractControl.status` to `Observable`. `FormControlStatus` is the union of all possible status strings for form controls.' }, + { possibleIn: 1300, necessaryAsOf: 1300, level: ApplicationComplexity.Advanced, step: 'v13 router serializer', action: 'To align with the URI spec, now the URL serializer respects question marks in the query parameters. For example `/path?q=hello?&q2=2` will now be parsed to `{ q: `hello?`, q2: 2 }`' }, + { possibleIn: 1300, necessaryAsOf: 1300, level: ApplicationComplexity.Advanced, step: 'v13 host binding', action: '`href` is now an attribute binding. This means that `DebugElement.properties[\'href\']` now returns the `href` value returned by the native element, rather than the internal value of the `href` property of the `routerLink`.' }, + { possibleIn: 1300, necessaryAsOf: 1300, level: ApplicationComplexity.Advanced, step: 'v13 spy location', action: '`SpyLocation` no longer emits the `popstate` event when `location.go` is called. In addition, `simulateHashChange` now triggers both `haschange` and `popstate`. Tests that rely on `location.go` most likely need to now use `simulateHashChange` to capture `popstate`.' }, + { possibleIn: 1300, necessaryAsOf: 1300, level: ApplicationComplexity.Advanced, ngUpgrade: true, step: 'v13 router URL replacement', action: 'The router will no longer replace the browser URL when a new navigation cancels an ongoing navigation. Hybrid applications which rely on the `navigationId` being present on initial navigations that were handled by the Angular router should subscribe to `NavigationCancel` events and perform the `location.replaceState` to add `navigationId` to the `Router` state. In addition, tests which assert `urlChanges` on the `SpyLocation` may need to be adjusted to account for the `replaceState` which is no longer triggered.' }, + { possibleIn: 1300, necessaryAsOf: 1300, level: ApplicationComplexity.Advanced, step: 'v13 removed symbols', action: 'The route package no longer exports `SpyNgModuleFactoryLoader` and `DeprecatedLoadChildren`. In case you use them, make sure you remove their corresponding import statements.' }, - { possibleIn: 1200, necessaryAsOf: 1200, level: 1, step: 'v12 ng update', action: 'Run `ng update @angular/core@12 @angular/cli@12` which should bring you to version 12 of Angular.' }, - { possibleIn: 1200, necessaryAsOf: 1200, level: 1, material: true, step: 'update @angular/material', action: 'Run `ng update @angular/material@12`.' }, - { possibleIn: 1200, necessaryAsOf: 1200, level: 1, step: 'v12 versions', action: 'Angular now requires [TypeScript 4.2](https://devblogs.microsoft.com/typescript/announcing-typescript-4-2/). `ng update` will update you automatically.' }, - { possibleIn: 1200, necessaryAsOf: 1200, level: 1, step: 'v12 browser support', action: 'IE11 support has been deprecated. Find details in the [RFC for IE11 removal](https://github.com/angular/angular/issues/41840).' }, - { possibleIn: 1200, necessaryAsOf: 1200, level: 1, step: 'v12 minimum Node.js version', action: 'You can no longer use Angular with Node.js version 10 or older' }, - { possibleIn: 1200, necessaryAsOf: 1200, level: 2, step: 'v12 `XhrFactory` relocation', action: 'Change the import of `XhrFactory` from `@angular/common/http` to `@angular/common`.' }, - { possibleIn: 1200, necessaryAsOf: 1200, level: 2, step: 'v12 i18n message ids', action: 'If you rely on legacy i18n message IDs use the `localize-migrate` tool to [move away from them](https://angular.io/guide/migration-legacy-message-id).' }, - { possibleIn: 1200, necessaryAsOf: 1200, level: 2, step: 'v12 deprecates `emitDistinctChangesOnly`', action: 'If you are using `emitDistinctChangesOnly` to configure `@ContentChildren` and `@ViewChildren` queries, you may need to update its value to `false` to align with its previous behavior. In v12 `emitDistinctChangesOnly` has default value `true`, and in future releases we will remove this configuration option to prevent triggering of unnecessary changes.' }, - { possibleIn: 1200, necessaryAsOf: 1200, level: 2, step: 'v12 prod by default', action: 'You can run the optional migration for enabling production builds by default `ng update @angular/cli@12 --migrate-only production-by-default`.' }, - { possibleIn: 1200, necessaryAsOf: 1200, level: 3, step: 'v12 min and max form attributes', action: 'If you use Angular forms, `min` and `max` attributes on `` will now trigger validation logic.' }, - { possibleIn: 1200, necessaryAsOf: 1200, level: 3, step: 'v12 `emitEvent` in `FormArray` and `FormGroup`', action: 'If your app has custom classes that extend `FormArray` or `FormGroup` classes and override the above-mentioned methods, you may need to update your implementation' }, - { possibleIn: 1200, necessaryAsOf: 1200, level: 3, step: 'v12 zone.js minimum version', action: 'Update zone.js to version 0.11.4. `ng update` will update this dependency automatically.' }, - { possibleIn: 1200, necessaryAsOf: 1200, level: 3, step: 'v12 `HttpParams` method params update', action: 'If you extend the `HttpParams` class you may have to update the signature of its method to reflect changes in the parameter types.' }, - { possibleIn: 1200, necessaryAsOf: 1200, level: 3, step: 'v12 `routerLinkActiveOptions`', action: '`routerLinkActiveOptions` property of `RouterLinkActive` now has a more specific type. You may need to update code accessing this property to align with the changes.' }, - { possibleIn: 1200, necessaryAsOf: 1200, level: 3, step: 'v12 `APP_INITIALIZER` callback types', action: 'The initializer callbacks now have more specific return types, which may require update of your code if you are getting an `APP_INITIALIZER` instance via `Injector.get` or `TestBed.inject`.' }, - { possibleIn: 1200, necessaryAsOf: 1200, level: 3, step: 'v12 fragment typings', action: 'The router fragments now could be `null`. Add `null` checks to avoid TypeScript failing with type errors.' }, - { possibleIn: 1200, necessaryAsOf: 1200, level: 3, step: 'v12 `ng.getDirectives`', action: 'Make sure you don\'t rely on `ng.getDirectives` throwing an error if it can\'t find a directive associated with a particular DOM node.' }, - { possibleIn: 1200, necessaryAsOf: 1200, level: 3, step: 'v12 `optimization.styles.inlineCritical`', action: 'Check out `optimization.styles.inlineCritical` option in your angular.json file. It now defaults to `true`. Remember that the whole `optimization` option can be set as boolean which will set all the suboptions to defaults.' }, + { possibleIn: 1400, necessaryAsOf: 1400, level: ApplicationComplexity.Basic, step: 'v14 ng update', action: 'Run `ng update @angular/core@14 @angular/cli@14` which should bring you to version 14 of Angular.' }, + { possibleIn: 1400, necessaryAsOf: 1400, level: ApplicationComplexity.Basic, material: true, step: 'update @angular/material', action: 'Run `ng update @angular/material@14`.' }, + { possibleIn: 1400, necessaryAsOf: 1400, level: ApplicationComplexity.Basic, step: 'TypeScript 4.6', action: 'Angular now uses TypeScript 4.6, read more about any potential breaking changes: https://devblogs.microsoft.com/typescript/announcing-typescript-4-6/', }, - { possibleIn: 1300, necessaryAsOf: 1300, level: 1, step: 'v13 ng update', action: 'Run `ng update @angular/core@13 @angular/cli@13` which should bring you to version 13 of Angular.' }, - { possibleIn: 1300, necessaryAsOf: 1300, level: 1, material: true, step: 'update @angular/material', action: 'Run `ng update @angular/material@13`.' }, - { possibleIn: 1300, necessaryAsOf: 1300, level: 1, step: 'TypeScript 4.4', action: 'Angular now uses TypeScript 4.4, read more about any potential breaking changes: https://www.typescriptlang.org/docs/handbook/release-notes/typescript-4-4.html', }, - { possibleIn: 1300, necessaryAsOf: 1300, level: 1, step: 'v13 node', action: 'Make sure you are using Node 12.20.0 or later', }, - { possibleIn: 1300, necessaryAsOf: 1300, level: 2, step: 'v13 routerLink', action: 'You can now disable the navigation of a `routerLink` by passing `undefined` and `null`. Previously the `routerLink` directive used to accept these two values as equivalent to an empty string.' }, - { possibleIn: 1300, necessaryAsOf: 1300, level: 2, step: 'v13 router loadChildren', action: 'You can no longer specify lazy-loaded routes by setting a string value to `loadChildren`. Make sure you move to dynamic ESM import statements.' }, - { possibleIn: 1300, necessaryAsOf: 1300, level: 2, step: 'v13 service worker activated', action: 'The `activated` observable of `SwUpdate` is now deprecated. To check the activation status of a service worker use the `activatedUpdate` method instead.' }, - { possibleIn: 1300, necessaryAsOf: 1300, level: 2, step: 'v13 service worker available', action: 'The `available` observable of `SwUpdate` is now deprecated. To get the same information use `versionUpdates` and filter only the `VersionReadyEvent` events.' }, - { possibleIn: 1300, necessaryAsOf: 1300, level: 2, step: 'v13 renderModuleFactory', action: 'The `renderModuleFactory` from `@angular/platform-server` is no longer necessary with Ivy. Use `renderModule` instead.' }, - { possibleIn: 1300, necessaryAsOf: 1300, level: 3, step: 'v13 forms status', action: 'We narrowed the type of `AbstractControl.status` to `FormControlStatus` and `AbstractControl.status` to `Observable`. `FormControlStatus` is the union of all possible status strings for form controls.' }, - { possibleIn: 1300, necessaryAsOf: 1300, level: 3, step: 'v13 router serializer', action: 'To align with the URI spec, now the URL serializer respects question marks in the query parameters. For example `/path?q=hello?&q2=2` will now be parsed to `{ q: `hello?`, q2: 2 }`' }, - { possibleIn: 1300, necessaryAsOf: 1300, level: 3, step: 'v13 host binding', action: '`href` is now an attribute binding. This means that `DebugElement.properties[\'href\']` now returns the `href` value returned by the native element, rather than the internal value of the `href` property of the `routerLink`.' }, - { possibleIn: 1300, necessaryAsOf: 1300, level: 3, step: 'v13 spy location', action: '`SpyLocation` no longer emits the `popstate` event when `location.go` is called. In addition, `simulateHashChange` now triggers both `haschange` and `popstate`. Tests that rely on `location.go` most likely need to now use `simulateHashChange` to capture `popstate`.' }, - { possibleIn: 1300, necessaryAsOf: 1300, level: 3, ngUpgrade: true, step: 'v13 router URL replacement', action: 'The router will no longer replace the browser URL when a new navigation cancels an ongoing navigation. Hybrid applications which rely on the `navigationId` being present on initial navigations that were handled by the Angular router should subscribe to `NavigationCancel` events and perform the `location.replaceState` to add `navigationId` to the `Router` state. In addition, tests which assert `urlChanges` on the `SpyLocation` may need to be adjusted to account for the `replaceState` which is no longer triggered.' }, - { possibleIn: 1300, necessaryAsOf: 1300, level: 3, step: 'v13 removed symbols', action: 'The route package no longer exports `SpyNgModuleFactoryLoader` and `DeprecatedLoadChildren`. In case you use them, make sure you remove their corresponding import statements.' }, + { possibleIn: 1400, necessaryAsOf: 1400, level: ApplicationComplexity.Basic, step: 'v14 node', action: 'Make sure you are using Node 14.15.0 or later', }, + { possibleIn: 1400, necessaryAsOf: 1400, level: ApplicationComplexity.Medium, step: 'v14 strict forms', action: 'Form models now require a generic type parameter. For gradual migration you can opt-out using the untyped version of the form model classes.' }, + { possibleIn: 1400, necessaryAsOf: 1400, level: ApplicationComplexity.Medium, step: 'v14 aotSummaries', action: 'Remove `aotSummaries` from `TestBed` since Angular no longer needs them in Ivy.' }, + { possibleIn: 1400, necessaryAsOf: 1400, level: ApplicationComplexity.Medium, material: true, step: 'v14 MatVertical and Horizontal Stepper', action: 'If you are using `MatVerticalStepper` or `MatHorizontalStepper` make sure you switch to `MatStepper`.' }, + { possibleIn: 1400, necessaryAsOf: 1400, level: ApplicationComplexity.Medium, step: 'v14 JSONP', action: 'Remove headers from JSONP requests. JSONP does not supports headers and if specified the HTTP module will now throw an error rather than ignoring them.' }, + { possibleIn: 1400, necessaryAsOf: 1400, level: ApplicationComplexity.Medium, step: 'v14 resolvers', action: 'Resolvers now will take the first emitted value by an observable and after that proceed to navigation to better align with other guards rather than taking the last emitted value.' }, + { possibleIn: 1400, necessaryAsOf: 1400, level: ApplicationComplexity.Advanced, material: true, step: 'v14 deprecate protractor entry', action: 'The deprecated `angular/cdk/testing/protractor` entry point is now removed.' }, + { possibleIn: 1400, necessaryAsOf: 1400, level: ApplicationComplexity.Advanced, material: true, step: 'v14 chipInput', action: 'Make sure you specify `chipInput` of `MatChipInputEvent` because it is now required.' }, + { possibleIn: 1400, necessaryAsOf: 1400, level: ApplicationComplexity.Advanced, material: true, step: 'v14 mixinErrorState', action: 'You need to implement `stateChanges` class member in abstractions using `mixinErrorState` because the mixin no longer provides it.' }, + { possibleIn: 1400, necessaryAsOf: 1400, level: ApplicationComplexity.Advanced, material: true, step: 'v14 CdkStepper orientation', action: 'Use `CdkStepper.orientation` instead of `CdkStepper._orientation`.' }, + { possibleIn: 1400, necessaryAsOf: 1400, level: ApplicationComplexity.Advanced, material: true, step: 'v14 CdkStepper and MatStepper', action: 'If you are extending or using `CdkStepper` or `MatStepper` in the constructor you should no longer pass the `_document` parameter since it is now removed.' }, + { possibleIn: 1400, necessaryAsOf: 1400, level: ApplicationComplexity.Advanced, material: true, step: 'v14 mat-list-item-avatar', action: 'Rename the `mat-list-item-avatar` CSS class to `mat-list-item-with-avatar`.' }, + { possibleIn: 1400, necessaryAsOf: 1400, level: ApplicationComplexity.Advanced, material: true, step: 'v14 MatSelectionListChange.option', action: 'Use `MatSelectionListChange.options` rather than `MatSelectionListChange.option`.' }, + { possibleIn: 1400, necessaryAsOf: 1400, level: ApplicationComplexity.Advanced, material: true, step: 'v14 getHarnessLoaderForContent', action: 'Use `getChildLoader(MatListItemSection.CONTENT)` rather than `getHarnessLoaderForContent`.' }, + { possibleIn: 1400, necessaryAsOf: 1400, level: ApplicationComplexity.Advanced, material: true, step: 'v14 MatSelectionList', action: 'If you are using `MatSelectionList` make sure you pass `_focusMonitor` in its constructor because it is now required. Additionally, this class no longer has `tabIndex` property and a `tabIndex` constructor parameter.' }, + { possibleIn: 1400, necessaryAsOf: 1400, level: ApplicationComplexity.Advanced, step: 'v14 initialNavigation', action: 'Update `initialNavigation: \'enabled\'` to `initialNavigation: \'enabledBlocking\'`.' }, + { possibleIn: 1400, necessaryAsOf: 1400, level: ApplicationComplexity.Advanced, step: 'v14 Route.pathMatch', action: 'If you are defining routes with `pathMatch`, you may have to cast it to `Route` or `Routes` explicitly. `Route.pathMatch` is no longer compatible with `string` type.' }, + { possibleIn: 1400, necessaryAsOf: 1400, level: ApplicationComplexity.Advanced, step: 'v14 stricter LoadChildrenCallback', action: 'The promise returned by `LoadChildrenCallback` now has a stricter type parameter `Type|NgModuleFactory` rather than `any`.' }, + { possibleIn: 1400, necessaryAsOf: 1400, level: ApplicationComplexity.Advanced, step: 'v14 router scheduling', action: 'The router does no longer schedule redirect navigation within a `setTimeout`. Make sure your tests do not rely on this behavior.' }, + { possibleIn: 1400, necessaryAsOf: 1400, level: ApplicationComplexity.Advanced, step: 'v14 LocationStrategy', action: 'Implementing the `LocationStrategy` interface now requires definition of `getState()`.' }, + { possibleIn: 1400, necessaryAsOf: 1400, level: ApplicationComplexity.Advanced, step: 'v14 http queries', action: 'Sending `+` as part of a query no longer requires workarounds since `+` no longer sends a space.' }, + { possibleIn: 1400, necessaryAsOf: 1400, level: ApplicationComplexity.Advanced, step: 'v14 AnimationDriver.getParentElement', action: 'Implementing `AnimationDriver` now requires the `getParentElement` method.' }, + { possibleIn: 1400, necessaryAsOf: 1400, level: ApplicationComplexity.Advanced, step: 'v14 invalid config', action: 'Invalid route configurations of lazy-loaded modules will now throw an error rather than being ignored.' }, + { possibleIn: 1400, necessaryAsOf: 1400, level: ApplicationComplexity.Advanced, step: 'v14 router resolver', action: 'Remove the `resolver` from `RouterOutletContract.activateWith` function and the `resolver` from `OutletContext` class since factory resolvers are no longer needed.' }, + { possibleIn: 1400, necessaryAsOf: 1400, level: ApplicationComplexity.Advanced, step: 'v14 initialUrl', action: '`Router.initialUrl` accepts only `UrlTree` to prevent a misuse of the API by assigning a `string` value.' }, - { possibleIn: 1400, necessaryAsOf: 1400, level: 1, step: 'v14 ng update', action: 'Run `ng update @angular/core@14 @angular/cli@14` which should bring you to version 14 of Angular.' }, - { possibleIn: 1400, necessaryAsOf: 1400, level: 1, material: true, step: 'update @angular/material', action: 'Run `ng update @angular/material@14`.' }, - { possibleIn: 1400, necessaryAsOf: 1400, level: 1, step: 'TypeScript 4.6', action: 'Angular now uses TypeScript 4.6, read more about any potential breaking changes: https://devblogs.microsoft.com/typescript/announcing-typescript-4-6/', }, - { possibleIn: 1400, necessaryAsOf: 1400, level: 1, step: 'v14 node', action: 'Make sure you are using Node 14.15.0 or later', }, - { possibleIn: 1400, necessaryAsOf: 1400, level: 2, step: 'v14 strict forms', action: 'Form models now require a generic type parameter. For gradual migration you can opt-out using the untyped version of the form model classes.' }, - { possibleIn: 1400, necessaryAsOf: 1400, level: 2, step: 'v14 aotSummaries', action: 'Remove `aotSummaries` from `TestBed` since Angular no longer needs them in Ivy.' }, - { possibleIn: 1400, necessaryAsOf: 1400, level: 2, material: true, step: 'v14 MatVertical and Horizontal Stepper', action: 'If you are using `MatVerticalStepper` or `MatHorizontalStepper` make sure you switch to `MatStepper`.' }, - { possibleIn: 1400, necessaryAsOf: 1400, level: 2, step: 'v14 JSONP', action: 'Remove headers from JSONP requests. JSONP does not supports headers and if specified the HTTP module will now throw an error rather than ignoring them.' }, - { possibleIn: 1400, necessaryAsOf: 1400, level: 2, step: 'v14 resolvers', action: 'Resolvers now will take the first emitted value by an observable and after that proceed to navigation to better align with other guards rather than taking the last emitted value.' }, - { possibleIn: 1400, necessaryAsOf: 1400, level: 3, material: true, step: 'v14 deprecate protractor entry', action: 'The deprecated `angular/cdk/testing/protractor` entry point is now removed.' }, - { possibleIn: 1400, necessaryAsOf: 1400, level: 3, material: true, step: 'v14 chipInput', action: 'Make sure you specify `chipInput` of `MatChipInputEvent` because it is now required.' }, - { possibleIn: 1400, necessaryAsOf: 1400, level: 3, material: true, step: 'v14 mixinErrorState', action: 'You need to implement `stateChanges` class member in abstractions using `mixinErrorState` because the mixin no longer provides it.' }, - { possibleIn: 1400, necessaryAsOf: 1400, level: 3, material: true, step: 'v14 CdkStepper orientation', action: 'Use `CdkStepper.orientation` instead of `CdkStepper._orientation`.' }, - { possibleIn: 1400, necessaryAsOf: 1400, level: 3, material: true, step: 'v14 CdkStepper and MatStepper', action: 'If you are extending or using `CdkStepper` or `MatStepper` in the constructor you should no longer pass the `_document` parameter since it is now removed.' }, - { possibleIn: 1400, necessaryAsOf: 1400, level: 3, material: true, step: 'v14 mat-list-item-avatar', action: 'Rename the `mat-list-item-avatar` CSS class to `mat-list-item-with-avatar`.' }, - { possibleIn: 1400, necessaryAsOf: 1400, level: 3, material: true, step: 'v14 MatSelectionListChange.option', action: 'Use `MatSelectionListChange.options` rather than `MatSelectionListChange.option`.' }, - { possibleIn: 1400, necessaryAsOf: 1400, level: 3, material: true, step: 'v14 getHarnessLoaderForContent', action: 'Use `getChildLoader(MatListItemSection.CONTENT)` rather than `getHarnessLoaderForContent`.' }, - { possibleIn: 1400, necessaryAsOf: 1400, level: 3, material: true, step: 'v14 MatSelectionList', action: 'If you are using `MatSelectionList` make sure you pass `_focusMonitor` in its constructor because it is now required. Additionally, this class no longer has `tabIndex` property and a `tabIndex` constructor parameter.' }, - { possibleIn: 1400, necessaryAsOf: 1400, level: 3, step: 'v14 initialNavigation', action: 'Update `initialNavigation: \'enabled\'` to `initialNavigation: \'enabledBlocking\'`.' }, - { possibleIn: 1400, necessaryAsOf: 1400, level: 3, step: 'v14 Route.pathMatch', action: 'If you are defining routes with `pathMatch`, you may have to cast it to `Route` or `Routes` explicitly. `Route.pathMatch` is no longer compatible with `string` type.' }, - { possibleIn: 1400, necessaryAsOf: 1400, level: 3, step: 'v14 stricter LoadChildrenCallback', action: 'The promise returned by `LoadChildrenCallback` now has a stricter type parameter `Type|NgModuleFactory` rather than `any`.' }, - { possibleIn: 1400, necessaryAsOf: 1400, level: 3, step: 'v14 router scheduling', action: 'The router does no longer schedule redirect navigation within a `setTimeout`. Make sure your tests do not rely on this behavior.' }, - { possibleIn: 1400, necessaryAsOf: 1400, level: 3, step: 'v14 LocationStrategy', action: 'Implementing the `LocationStrategy` interface now requires definition of `getState()`.' }, - { possibleIn: 1400, necessaryAsOf: 1400, level: 3, step: 'v14 http queries', action: 'Sending `+` as part of a query no longer requires workarounds since `+` no longer sends a space.' }, - { possibleIn: 1400, necessaryAsOf: 1400, level: 3, step: 'v14 AnimationDriver.getParentElement', action: 'Implementing `AnimationDriver` now requires the `getParentElement` method.' }, - { possibleIn: 1400, necessaryAsOf: 1400, level: 3, step: 'v14 invalid config', action: 'Invalid route configurations of lazy-loaded modules will now throw an error rather than being ignored.' }, - { possibleIn: 1400, necessaryAsOf: 1400, level: 3, step: 'v14 router resolver', action: 'Remove the `resolver` from `RouterOutletContract.activateWith` function and the `resolver` from `OutletContext` class since factory resolvers are no longer needed.' }, - { possibleIn: 1400, necessaryAsOf: 1400, level: 3, step: 'v14 initialUrl', action: '`Router.initialUrl` accepts only `UrlTree` to prevent a misuse of the API by assigning a `string` value.' }, + { possibleIn: 1500, necessaryAsOf: 1500, level: ApplicationComplexity.Basic, step: 'v15 node support', action: 'Make sure that you are using a supported version of node.js before you upgrade your application. Angular v15 supports node.js versions: 14.20.x, 16.13.x and 18.10.x. Read further' }, + { possibleIn: 1500, necessaryAsOf: 1500, level: ApplicationComplexity.Basic, step: 'v15 ts support', action: 'Make sure that you are using a supported version of TypeScript before you upgrade your application. Angular v15 supports TypeScript version 4.8 or later. Read further' }, + { possibleIn: 1500, necessaryAsOf: 1500, level: ApplicationComplexity.Basic, step: 'v15 ng update', action: 'In the application\'s project directory, run `ng update @angular/core@15 @angular/cli@15` to update your application to Angular v15.' }, + { possibleIn: 1500, necessaryAsOf: 1500, level: ApplicationComplexity.Basic, material: true, step: 'V15 update @angular/material', action: 'Run `ng update @angular/material@15` to update the Material components.' }, + { possibleIn: 1500, necessaryAsOf: 1500, level: ApplicationComplexity.Medium, step: 'v15 keyframe', action: 'In v15, the Angular compiler prefixes `@keyframes` in CSS with the component\'s scope. This means that any TypeScript code that relies on `keyframes` names no longer works in v15. Update any such instances to: define keyframes programmatically, use global stylesheets, or change the component\'s view encapsulation. Read further' }, + { possibleIn: 1500, necessaryAsOf: 1500, level: ApplicationComplexity.Basic, step: 'v15 no-ivy', action: 'In your application\'s `tsconfig.json` file, remove `enableIvy`. In v15, Ivy is the only rendering engine so `enableIvy` is not required.' }, + { possibleIn: 1500, necessaryAsOf: 1500, level: ApplicationComplexity.Medium, step: 'v15 base-decorators', action: 'Make sure to use decorators in base classes with child classes that inherit constructors and use dependency injection. Such base classes should be decorated with either `@Injectable` or `@Directive` or the compiler returns an error. Read further'}, + { possibleIn: 1500, necessaryAsOf: 1500, level: ApplicationComplexity.Medium, step: 'v15 setDisabledState', action: 'In v15, `setDisabledState` is always called when a `ControlValueAccessor` is attached. To opt-out of this behavior, use `FormsModule.withConfig` or `ReactiveFormsModule.withConfig`. Read further' }, + { possibleIn: 1500, necessaryAsOf: 1500, level: ApplicationComplexity.Advanced, step: 'v15 canParse', action: 'Applications that use `canParse` should use `@angular/localize/tools.analyze` instead. In v15, the `canParse` method was removed from all translation parsers in `@angular/localize/tools`. Read further' }, + { possibleIn: 1500, necessaryAsOf: 1500, level: ApplicationComplexity.Basic, step: 'v15 ActivatedRoutSnapshot', action: 'Make sure that all `ActivatedRouteSnapshot` objects have a `title` property. In v15, the `title` property is a required property of `ActivatedRouteSnapshot`. Read further' }, + { possibleIn: 1500, necessaryAsOf: 1500, level: ApplicationComplexity.Advanced, step: 'v15 RouterOutlet', action: 'If your tests with `RouterOutlet` break, make sure they don\'t depend on the instantiation order of the corresponding component relative to change detection. In v15, `RouterOutlet` instantiates the component after change detection. Read further' }, + { possibleIn: 1500, necessaryAsOf: 1500, level: ApplicationComplexity.Basic, step: 'v15 relativeLinkResolution', action: 'In v15, `relativeLinkResolution` is not configurable in the Router. It was used to opt out of an earlier bug fix that is now standard. Read further' }, + { possibleIn: 1500, necessaryAsOf: 1500, level: ApplicationComplexity.Medium, step: 'v15 DATE_PIPE_DEFAULT_OPTIONS', action: 'Change instances of the `DATE_PIPE_DEFAULT_TIMEZONE` token to use `DATE_PIPE_DEFAULT_OPTIONS` to configure time zones. In v15, the `DATE_PIPE_DEFAULT_TIMEZONE` token is deprecated. Read further'}, + { possibleIn: 1500, necessaryAsOf: 1500, level: ApplicationComplexity.Medium, step: 'v15 Injector.get', action: 'Update instances of `Injector.get()` that use an `InjectFlags` parameter to use an `InjectOptions` parameter. The `InjectFlags` parameter of `Injector.get()` is deprecated in v15. Read further'}, + { possibleIn: 1500, necessaryAsOf: 1500, level: ApplicationComplexity.Basic, step: 'v15 TestBed.inject', action: 'Update instances of `TestBed.inject()` that use an `InjectFlags` parameter to use an `InjectOptions` parameter. The `InjectFlags` parameter of `TestBed.inject()` is deprecated in v15. Read further'}, + { possibleIn: 1500, necessaryAsOf: 1500, level: ApplicationComplexity.Medium, step: 'v15 ngModule in providedIn', action: 'Using `providedIn: ngModule` for an `@Injectable` and `InjectionToken` is deprecated in v15. Read further'}, + { possibleIn: 1500, necessaryAsOf: 1500, level: ApplicationComplexity.Basic, step: 'v15 providedIn any', action: 'Using `providedIn: \'any\'` for an `@Injectable` or `InjectionToken` is deprecated in v15. Read further'}, + { possibleIn: 1500, necessaryAsOf: 1500, level: ApplicationComplexity.Medium, step: 'v15 RouterLinkWithHref', action: 'Update instances of the `RouterLinkWithHref`directive to use the `RouterLink` directive. The `RouterLinkWithHref` directive is deprecated in v15. Read further'}, + { possibleIn: 1500, necessaryAsOf: 1500, level: ApplicationComplexity.Basic, material: true, step: 'v15 mat refactor', action: 'In Angular Material v15, many of the components have been refactored to be based on the official Material Design Components for Web (MDC). This change affected the DOM and CSS classes of many components. Read further'}, + { possibleIn: 1500, necessaryAsOf: 1500, level: ApplicationComplexity.Basic, step: 'v15 visual review', action: 'After you update your application to v15, visually review your application and its interactions to ensure everything is working as it should.'}, ];