@openrewrite/recipes-angular 1.8.0-20260804-103913 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/dist/migration/upgrade-to-angular-10.d.ts +6 -0
  2. package/dist/migration/upgrade-to-angular-10.d.ts.map +1 -1
  3. package/dist/migration/upgrade-to-angular-10.js +34 -14
  4. package/dist/migration/upgrade-to-angular-10.js.map +1 -1
  5. package/dist/migration/upgrade-to-angular-11.d.ts +6 -0
  6. package/dist/migration/upgrade-to-angular-11.d.ts.map +1 -1
  7. package/dist/migration/upgrade-to-angular-11.js +34 -14
  8. package/dist/migration/upgrade-to-angular-11.js.map +1 -1
  9. package/dist/migration/upgrade-to-angular-12.d.ts +6 -0
  10. package/dist/migration/upgrade-to-angular-12.d.ts.map +1 -1
  11. package/dist/migration/upgrade-to-angular-12.js +31 -10
  12. package/dist/migration/upgrade-to-angular-12.js.map +1 -1
  13. package/dist/migration/upgrade-to-angular-13.d.ts +6 -0
  14. package/dist/migration/upgrade-to-angular-13.d.ts.map +1 -1
  15. package/dist/migration/upgrade-to-angular-13.js +31 -10
  16. package/dist/migration/upgrade-to-angular-13.js.map +1 -1
  17. package/dist/migration/upgrade-to-angular-14.d.ts +6 -0
  18. package/dist/migration/upgrade-to-angular-14.d.ts.map +1 -1
  19. package/dist/migration/upgrade-to-angular-14.js +30 -10
  20. package/dist/migration/upgrade-to-angular-14.js.map +1 -1
  21. package/dist/migration/upgrade-to-angular-15.d.ts +6 -0
  22. package/dist/migration/upgrade-to-angular-15.d.ts.map +1 -1
  23. package/dist/migration/upgrade-to-angular-15.js +31 -11
  24. package/dist/migration/upgrade-to-angular-15.js.map +1 -1
  25. package/dist/migration/upgrade-to-angular-16.d.ts +6 -0
  26. package/dist/migration/upgrade-to-angular-16.d.ts.map +1 -1
  27. package/dist/migration/upgrade-to-angular-16.js +32 -12
  28. package/dist/migration/upgrade-to-angular-16.js.map +1 -1
  29. package/dist/migration/upgrade-to-angular-17.d.ts +6 -0
  30. package/dist/migration/upgrade-to-angular-17.d.ts.map +1 -1
  31. package/dist/migration/upgrade-to-angular-17.js +30 -10
  32. package/dist/migration/upgrade-to-angular-17.js.map +1 -1
  33. package/dist/migration/upgrade-to-angular-18.d.ts +6 -0
  34. package/dist/migration/upgrade-to-angular-18.d.ts.map +1 -1
  35. package/dist/migration/upgrade-to-angular-18.js +38 -22
  36. package/dist/migration/upgrade-to-angular-18.js.map +1 -1
  37. package/dist/migration/upgrade-to-angular-19.d.ts +6 -0
  38. package/dist/migration/upgrade-to-angular-19.d.ts.map +1 -1
  39. package/dist/migration/upgrade-to-angular-19.js +32 -12
  40. package/dist/migration/upgrade-to-angular-19.js.map +1 -1
  41. package/dist/migration/upgrade-to-angular-20.d.ts +6 -0
  42. package/dist/migration/upgrade-to-angular-20.d.ts.map +1 -1
  43. package/dist/migration/upgrade-to-angular-20.js +31 -11
  44. package/dist/migration/upgrade-to-angular-20.js.map +1 -1
  45. package/dist/migration/upgrade-to-angular-21.d.ts +6 -0
  46. package/dist/migration/upgrade-to-angular-21.d.ts.map +1 -1
  47. package/dist/migration/upgrade-to-angular-21.js +32 -12
  48. package/dist/migration/upgrade-to-angular-21.js.map +1 -1
  49. package/dist/migration/upgrade-to-angular-8.d.ts +10 -0
  50. package/dist/migration/upgrade-to-angular-8.d.ts.map +1 -1
  51. package/dist/migration/upgrade-to-angular-8.js +40 -15
  52. package/dist/migration/upgrade-to-angular-8.js.map +1 -1
  53. package/dist/migration/upgrade-to-angular-9.d.ts +6 -0
  54. package/dist/migration/upgrade-to-angular-9.d.ts.map +1 -1
  55. package/dist/migration/upgrade-to-angular-9.js +37 -17
  56. package/dist/migration/upgrade-to-angular-9.js.map +1 -1
  57. package/package.json +1 -1
  58. package/src/migration/upgrade-to-angular-10.ts +30 -14
  59. package/src/migration/upgrade-to-angular-11.ts +30 -14
  60. package/src/migration/upgrade-to-angular-12.ts +27 -10
  61. package/src/migration/upgrade-to-angular-13.ts +27 -10
  62. package/src/migration/upgrade-to-angular-14.ts +26 -10
  63. package/src/migration/upgrade-to-angular-15.ts +27 -11
  64. package/src/migration/upgrade-to-angular-16.ts +28 -12
  65. package/src/migration/upgrade-to-angular-17.ts +26 -10
  66. package/src/migration/upgrade-to-angular-18.ts +34 -22
  67. package/src/migration/upgrade-to-angular-19.ts +28 -12
  68. package/src/migration/upgrade-to-angular-20.ts +27 -11
  69. package/src/migration/upgrade-to-angular-21.ts +28 -12
  70. package/src/migration/upgrade-to-angular-8.ts +35 -14
  71. package/src/migration/upgrade-to-angular-9.ts +33 -17
@@ -6,7 +6,7 @@
6
6
 
7
7
  import {Recipe} from "@openrewrite/rewrite";
8
8
  import {ChangeImport, upgradeDependencyVersion} from "@openrewrite/rewrite/javascript";
9
- import {UpgradeToAngular15} from "./upgrade-to-angular-15";
9
+ import {UpgradeToAngular15CodeChanges} from "./upgrade-to-angular-15";
10
10
  import {RemoveEntryComponents} from "./remove-entry-components";
11
11
  import {RemoveModuleId} from "./remove-module-id";
12
12
  import {ReplaceRouterLinkWithHref} from "./replace-router-link-with-href";
@@ -15,18 +15,15 @@ import {FindRenderModuleFactoryUsage} from "../search/find-render-module-factory
15
15
  import {FindBrowserTransferStateModuleUsage} from "../search/find-browser-transfer-state-module-usage";
16
16
  import {FindRenderApplicationUsage} from "../search/find-render-application-usage";
17
17
 
18
- export class UpgradeToAngular16 extends Recipe {
19
- readonly name = "org.openrewrite.angular.UpgradeToAngular16";
20
- readonly displayName = "Upgrade to Angular 16";
21
- readonly description = "Migrates Angular 15.x applications to Angular 16. " +
22
- "This includes removing `entryComponents` and `moduleId` from decorators, replacing `RouterLinkWithHref` with `RouterLink`, " +
23
- "moving the `XhrFactory` import to `@angular/common`, and flagging removed APIs " +
24
- "like `ReflectiveInjector`, `renderModuleFactory`, and `BrowserTransferStateModule`.";
18
+ export class UpgradeToAngular16CodeChanges extends Recipe {
19
+ readonly name = "org.openrewrite.angular.UpgradeToAngular16CodeChanges";
20
+ readonly displayName = "Upgrade to Angular 16 (code changes)";
21
+ readonly description = "The source changes of the Angular 16 migration, without the dependency version bumps. " +
22
+ "Use `UpgradeToAngular16` unless you are composing a migration to a later major.";
25
23
 
26
24
  async recipeList(): Promise<Recipe[]> {
27
25
  return [
28
- // First, run Angular 15 migration
29
- new UpgradeToAngular15(),
26
+ new UpgradeToAngular15CodeChanges(),
30
27
  // Code transformations
31
28
  new RemoveEntryComponents(),
32
29
  new RemoveModuleId(),
@@ -42,10 +39,29 @@ export class UpgradeToAngular16 extends Recipe {
42
39
  new FindRenderModuleFactoryUsage(),
43
40
  new FindBrowserTransferStateModuleUsage(),
44
41
  new FindRenderApplicationUsage(),
42
+ ];
43
+ }
44
+ }
45
+
46
+ export class UpgradeToAngular16 extends Recipe {
47
+ readonly name = "org.openrewrite.angular.UpgradeToAngular16";
48
+ readonly displayName = "Upgrade to Angular 16";
49
+ readonly description = "Migrates Angular 15.x applications to Angular 16. " +
50
+ "This includes removing `entryComponents` and `moduleId` from decorators, replacing `RouterLinkWithHref` with `RouterLink`, " +
51
+ "moving the `XhrFactory` import to `@angular/common`, and flagging removed APIs " +
52
+ "like `ReflectiveInjector`, `renderModuleFactory`, and `BrowserTransferStateModule`.";
53
+
54
+ async recipeList(): Promise<Recipe[]> {
55
+ return [
56
+ new UpgradeToAngular16CodeChanges(),
45
57
  // Angular core packages
46
58
  await upgradeDependencyVersion({packagePattern: "@angular/*", newVersion: "16.x"}),
47
- // Angular DevKit
48
- await upgradeDependencyVersion({packagePattern: "@angular-devkit/*", newVersion: "16.x"}),
59
+ // Angular DevKit; `architect` and `build-webpack` kept the 0.<major><minor>.x CLI scheme
60
+ await upgradeDependencyVersion({packageName: "@angular-devkit/core", newVersion: "16.x"}),
61
+ await upgradeDependencyVersion({packagePattern: "@angular-devkit/s*", newVersion: "16.x"}),
62
+ await upgradeDependencyVersion({packageName: "@angular-devkit/build-angular", newVersion: "16.x"}),
63
+ await upgradeDependencyVersion({packagePattern: "@angular-devkit/architect*", newVersion: "0.1602.x"}),
64
+ await upgradeDependencyVersion({packageName: "@angular-devkit/build-webpack", newVersion: "0.1602.x"}),
49
65
  await upgradeDependencyVersion({packageName: "@schematics/angular", newVersion: "16.x"}),
50
66
  // zone.js
51
67
  await upgradeDependencyVersion({packageName: "zone.js", newVersion: "0.13.x"}),
@@ -6,11 +6,29 @@
6
6
 
7
7
  import {Recipe} from "@openrewrite/rewrite";
8
8
  import {upgradeDependencyVersion} from "@openrewrite/rewrite/javascript";
9
- import {UpgradeToAngular16} from "./upgrade-to-angular-16";
9
+ import {UpgradeToAngular16CodeChanges} from "./upgrade-to-angular-16";
10
10
  import {ReplaceDeepZoneJsImports} from "./replace-deep-zone-js-imports";
11
11
  import {FindWithNoDomReuseUsage} from "../search/find-with-no-dom-reuse-usage";
12
12
  import {FindSetupTestingRouterUsage} from "../search/find-setup-testing-router-usage";
13
13
 
14
+ export class UpgradeToAngular17CodeChanges extends Recipe {
15
+ readonly name = "org.openrewrite.angular.UpgradeToAngular17CodeChanges";
16
+ readonly displayName = "Upgrade to Angular 17 (code changes)";
17
+ readonly description = "The source changes of the Angular 17 migration, without the dependency version bumps. " +
18
+ "Use `UpgradeToAngular17` unless you are composing a migration to a later major.";
19
+
20
+ async recipeList(): Promise<Recipe[]> {
21
+ return [
22
+ new UpgradeToAngular16CodeChanges(),
23
+ // Code transformations
24
+ new ReplaceDeepZoneJsImports(),
25
+ // Search: removed APIs
26
+ new FindWithNoDomReuseUsage(),
27
+ new FindSetupTestingRouterUsage(),
28
+ ];
29
+ }
30
+ }
31
+
14
32
  export class UpgradeToAngular17 extends Recipe {
15
33
  readonly name = "org.openrewrite.angular.UpgradeToAngular17";
16
34
  readonly displayName = "Upgrade to Angular 17";
@@ -21,17 +39,15 @@ export class UpgradeToAngular17 extends Recipe {
21
39
 
22
40
  async recipeList(): Promise<Recipe[]> {
23
41
  return [
24
- // First, run Angular 16 migration
25
- new UpgradeToAngular16(),
26
- // Code transformations
27
- new ReplaceDeepZoneJsImports(),
28
- // Search: removed APIs
29
- new FindWithNoDomReuseUsage(),
30
- new FindSetupTestingRouterUsage(),
42
+ new UpgradeToAngular17CodeChanges(),
31
43
  // Angular core packages
32
44
  await upgradeDependencyVersion({packagePattern: "@angular/*", newVersion: "17.x"}),
33
- // Angular DevKit
34
- await upgradeDependencyVersion({packagePattern: "@angular-devkit/*", newVersion: "17.x"}),
45
+ // Angular DevKit; `architect` and `build-webpack` kept the 0.<major><minor>.x CLI scheme
46
+ await upgradeDependencyVersion({packageName: "@angular-devkit/core", newVersion: "17.x"}),
47
+ await upgradeDependencyVersion({packagePattern: "@angular-devkit/s*", newVersion: "17.x"}),
48
+ await upgradeDependencyVersion({packageName: "@angular-devkit/build-angular", newVersion: "17.x"}),
49
+ await upgradeDependencyVersion({packagePattern: "@angular-devkit/architect*", newVersion: "0.1703.x"}),
50
+ await upgradeDependencyVersion({packageName: "@angular-devkit/build-webpack", newVersion: "0.1703.x"}),
35
51
  await upgradeDependencyVersion({packageName: "@schematics/angular", newVersion: "17.x"}),
36
52
  // zone.js
37
53
  await upgradeDependencyVersion({packageName: "zone.js", newVersion: "0.14.x"}),
@@ -6,7 +6,7 @@
6
6
 
7
7
  import {Recipe} from "@openrewrite/rewrite";
8
8
  import {ChangeImport, upgradeDependencyVersion} from "@openrewrite/rewrite/javascript";
9
- import {UpgradeToAngular17} from "./upgrade-to-angular-17";
9
+ import {UpgradeToAngular17CodeChanges} from "./upgrade-to-angular-17";
10
10
  import {UpgradeAngularPeerLibsTo18} from "./upgrade-angular-peer-libs-to-18";
11
11
  import {ReplaceAsyncWithWaitForAsync} from "./replace-async-with-wait-for-async";
12
12
  import {ReplaceHttpClientModule} from "./replace-http-client-module";
@@ -17,18 +17,15 @@ import {FindResourceCacheProviderUsage} from "../search/find-resource-cache-prov
17
17
  import {FindTestabilityPendingRequestUsage} from "../search/find-testability-pending-request-usage";
18
18
  import {FindAnimationDriverMatchesElement} from "../search/find-animation-driver-matches-element";
19
19
 
20
- export class UpgradeToAngular18 extends Recipe {
21
- readonly name = "org.openrewrite.angular.UpgradeToAngular18";
22
- readonly displayName = "Upgrade to Angular 18";
23
- readonly description = "Migrates Angular 17.x applications to Angular 18. " +
24
- "This includes replacing the deprecated `async` test helper with `waitForAsync`, " +
25
- "migrating `HttpClientModule` to `provideHttpClient()`, moving Transfer State APIs " +
26
- "to `@angular/core`, and flagging removed platform APIs.";
20
+ export class UpgradeToAngular18CodeChanges extends Recipe {
21
+ readonly name = "org.openrewrite.angular.UpgradeToAngular18CodeChanges";
22
+ readonly displayName = "Upgrade to Angular 18 (code changes)";
23
+ readonly description = "The source changes of the Angular 18 migration, without the Angular dependency version bumps. " +
24
+ "Use `UpgradeToAngular18` unless you are composing a migration to a later major.";
27
25
 
28
26
  async recipeList(): Promise<Recipe[]> {
29
27
  return [
30
- // First, run Angular 17 migration
31
- new UpgradeToAngular17(),
28
+ new UpgradeToAngular17CodeChanges(),
32
29
  // Code transformations
33
30
  new ReplaceAsyncWithWaitForAsync(),
34
31
  new ReplaceHttpClientModule(),
@@ -55,19 +52,34 @@ export class UpgradeToAngular18 extends Recipe {
55
52
  new FindResourceCacheProviderUsage(),
56
53
  new FindTestabilityPendingRequestUsage(),
57
54
  new FindAnimationDriverMatchesElement(),
58
- // Bump every package whose target follows the Angular major (18.x) in a single
59
- // atomic npm install. upgradeDependencyVersion runs npm once per call, so packages
60
- // that share a peer-dep graph MUST go in one matcher otherwise a partial bump
61
- // leaves the install failing with ERESOLVE. picomatch brace expansion lets us glob
62
- // multiple package patterns in a single call.
63
- await upgradeDependencyVersion({
64
- packagePattern: "{@angular/*,@angular-devkit/*,@schematics/angular}",
65
- newVersion: "18.x",
66
- }),
67
- // Bump well-known third-party Angular libraries (ng-bootstrap, ngx-bootstrap, …) to
68
- // their Angular-18-compatible versions. Kept as a separate recipe so it can be run
69
- // independently or extended without touching this file every time.
55
+ // Third-party libraries pinned to an Angular peer range (ng-bootstrap, ngx-bootstrap, …).
56
+ // There is no 19/20/21 equivalent yet, so this stays in the chained half: without it a
57
+ // migration to a later major would leave these libraries on a pre-18 line entirely.
70
58
  new UpgradeAngularPeerLibsTo18(),
59
+ ];
60
+ }
61
+ }
62
+
63
+ export class UpgradeToAngular18 extends Recipe {
64
+ readonly name = "org.openrewrite.angular.UpgradeToAngular18";
65
+ readonly displayName = "Upgrade to Angular 18";
66
+ readonly description = "Migrates Angular 17.x applications to Angular 18. " +
67
+ "This includes replacing the deprecated `async` test helper with `waitForAsync`, " +
68
+ "migrating `HttpClientModule` to `provideHttpClient()`, moving Transfer State APIs " +
69
+ "to `@angular/core`, and flagging removed platform APIs.";
70
+
71
+ async recipeList(): Promise<Recipe[]> {
72
+ return [
73
+ new UpgradeToAngular18CodeChanges(),
74
+ // Angular core packages
75
+ await upgradeDependencyVersion({packagePattern: "@angular/*", newVersion: "18.x"}),
76
+ // Angular DevKit; `architect` and `build-webpack` kept the 0.<major><minor>.x CLI scheme
77
+ await upgradeDependencyVersion({packageName: "@angular-devkit/core", newVersion: "18.x"}),
78
+ await upgradeDependencyVersion({packagePattern: "@angular-devkit/s*", newVersion: "18.x"}),
79
+ await upgradeDependencyVersion({packageName: "@angular-devkit/build-angular", newVersion: "18.x"}),
80
+ await upgradeDependencyVersion({packagePattern: "@angular-devkit/architect*", newVersion: "0.1802.x"}),
81
+ await upgradeDependencyVersion({packageName: "@angular-devkit/build-webpack", newVersion: "0.1802.x"}),
82
+ await upgradeDependencyVersion({packageName: "@schematics/angular", newVersion: "18.x"}),
71
83
  // zone.js
72
84
  await upgradeDependencyVersion({packageName: "zone.js", newVersion: "0.14.x"}),
73
85
  // TypeScript: Angular 18 compiler requires >=5.4.0 <5.5.0
@@ -6,25 +6,22 @@
6
6
 
7
7
  import {Recipe} from "@openrewrite/rewrite";
8
8
  import {ChangeImport, upgradeDependencyVersion} from "@openrewrite/rewrite/javascript";
9
- import {UpgradeToAngular18} from "./upgrade-to-angular-18";
9
+ import {UpgradeToAngular18CodeChanges} from "./upgrade-to-angular-18";
10
10
  import {ExplicitStandaloneFlag} from "./explicit-standalone-flag";
11
11
  import {RenamePendingTasks} from "./rename-pending-tasks";
12
12
  import {RemoveBrowserModuleWithServerTransition} from "./remove-browser-module-with-server-transition";
13
13
  import {FindEffectTimingUsage} from "../search/find-effect-timing-usage";
14
14
  import {FindEmptyProjectableNodes} from "../search/find-empty-projectable-nodes";
15
15
 
16
- export class UpgradeToAngular19 extends Recipe {
17
- readonly name = "org.openrewrite.angular.UpgradeToAngular19";
18
- readonly displayName = "Upgrade to Angular 19";
19
- readonly description = "Migrates Angular 18.x applications to Angular 19. " +
20
- "This includes updating Angular package versions, adjusting the standalone default, " +
21
- "renaming `ExperimentalPendingTasks` to `PendingTasks`, moving the `ApplicationConfig` import " +
22
- "to `@angular/core`, and updating `zone.js`.";
16
+ export class UpgradeToAngular19CodeChanges extends Recipe {
17
+ readonly name = "org.openrewrite.angular.UpgradeToAngular19CodeChanges";
18
+ readonly displayName = "Upgrade to Angular 19 (code changes)";
19
+ readonly description = "The source changes of the Angular 19 migration, without the dependency version bumps. " +
20
+ "Use `UpgradeToAngular19` unless you are composing a migration to a later major.";
23
21
 
24
22
  async recipeList(): Promise<Recipe[]> {
25
23
  return [
26
- // First, run Angular 18 migration
27
- new UpgradeToAngular18(),
24
+ new UpgradeToAngular18CodeChanges(),
28
25
  // Code transformations
29
26
  new ExplicitStandaloneFlag(),
30
27
  new RenamePendingTasks(),
@@ -37,10 +34,29 @@ export class UpgradeToAngular19 extends Recipe {
37
34
  // Behavioral change warnings
38
35
  new FindEffectTimingUsage(),
39
36
  new FindEmptyProjectableNodes(),
37
+ ];
38
+ }
39
+ }
40
+
41
+ export class UpgradeToAngular19 extends Recipe {
42
+ readonly name = "org.openrewrite.angular.UpgradeToAngular19";
43
+ readonly displayName = "Upgrade to Angular 19";
44
+ readonly description = "Migrates Angular 18.x applications to Angular 19. " +
45
+ "This includes updating Angular package versions, adjusting the standalone default, " +
46
+ "renaming `ExperimentalPendingTasks` to `PendingTasks`, moving the `ApplicationConfig` import " +
47
+ "to `@angular/core`, and updating `zone.js`.";
48
+
49
+ async recipeList(): Promise<Recipe[]> {
50
+ return [
51
+ new UpgradeToAngular19CodeChanges(),
40
52
  // Angular core packages
41
53
  await upgradeDependencyVersion({packagePattern: "@angular/*", newVersion: "19.x"}),
42
- // Angular DevKit
43
- await upgradeDependencyVersion({packagePattern: "@angular-devkit/*", newVersion: "19.x"}),
54
+ // Angular DevKit; `architect` and `build-webpack` kept the 0.<major><minor>.x CLI scheme
55
+ await upgradeDependencyVersion({packageName: "@angular-devkit/core", newVersion: "19.x"}),
56
+ await upgradeDependencyVersion({packagePattern: "@angular-devkit/s*", newVersion: "19.x"}),
57
+ await upgradeDependencyVersion({packageName: "@angular-devkit/build-angular", newVersion: "19.x"}),
58
+ await upgradeDependencyVersion({packagePattern: "@angular-devkit/architect*", newVersion: "0.1902.x"}),
59
+ await upgradeDependencyVersion({packageName: "@angular-devkit/build-webpack", newVersion: "0.1902.x"}),
44
60
  await upgradeDependencyVersion({packageName: "@schematics/angular", newVersion: "19.x"}),
45
61
  // zone.js
46
62
  await upgradeDependencyVersion({packageName: "zone.js", newVersion: "0.15.x"}),
@@ -6,7 +6,7 @@
6
6
 
7
7
  import {Recipe} from "@openrewrite/rewrite";
8
8
  import {upgradeDependencyVersion} from "@openrewrite/rewrite/javascript";
9
- import {UpgradeToAngular19} from "./upgrade-to-angular-19";
9
+ import {UpgradeToAngular19CodeChanges} from "./upgrade-to-angular-19";
10
10
  import {RenameZonelessProvider} from "./rename-zoneless-provider";
11
11
  import {RenameCheckNoChanges} from "./rename-check-no-changes";
12
12
  import {RenameAfterRender} from "./rename-after-render";
@@ -15,17 +15,15 @@ import {MoveDocumentImport} from "./move-document-to-core";
15
15
  import {RemoveStandaloneTrue} from "./remove-standalone-true";
16
16
  import {RemoveZoneJsPolyfill} from "./remove-zone-js-polyfill";
17
17
 
18
- export class UpgradeToAngular20 extends Recipe {
19
- readonly name = "org.openrewrite.angular.UpgradeToAngular20";
20
- readonly displayName = "Upgrade to Angular 20";
21
- readonly description = "Migrates Angular 19.x applications to Angular 20. " +
22
- "This includes running the Angular 19 migration first, then updating Angular package versions, " +
23
- "renaming experimental APIs promoted to stable, and upgrading TypeScript to 5.8.x.";
18
+ export class UpgradeToAngular20CodeChanges extends Recipe {
19
+ readonly name = "org.openrewrite.angular.UpgradeToAngular20CodeChanges";
20
+ readonly displayName = "Upgrade to Angular 20 (code changes)";
21
+ readonly description = "The source changes of the Angular 20 migration, without the dependency version bumps. " +
22
+ "Use `UpgradeToAngular20` unless you are composing a migration to a later major.";
24
23
 
25
24
  async recipeList(): Promise<Recipe[]> {
26
25
  return [
27
- // First, run Angular 19 migration
28
- new UpgradeToAngular19(),
26
+ new UpgradeToAngular19CodeChanges(),
29
27
  // Code transformations
30
28
  new RenameZonelessProvider(),
31
29
  new RenameCheckNoChanges(),
@@ -34,10 +32,28 @@ export class UpgradeToAngular20 extends Recipe {
34
32
  new MoveDocumentImport(),
35
33
  new RemoveStandaloneTrue(),
36
34
  new RemoveZoneJsPolyfill(),
35
+ ];
36
+ }
37
+ }
38
+
39
+ export class UpgradeToAngular20 extends Recipe {
40
+ readonly name = "org.openrewrite.angular.UpgradeToAngular20";
41
+ readonly displayName = "Upgrade to Angular 20";
42
+ readonly description = "Migrates Angular 19.x applications to Angular 20. " +
43
+ "This includes running the Angular 19 migration first, then updating Angular package versions, " +
44
+ "renaming experimental APIs promoted to stable, and upgrading TypeScript to 5.8.x.";
45
+
46
+ async recipeList(): Promise<Recipe[]> {
47
+ return [
48
+ new UpgradeToAngular20CodeChanges(),
37
49
  // Angular core packages
38
50
  await upgradeDependencyVersion({packagePattern: "@angular/*", newVersion: "20.x"}),
39
- // Angular DevKit
40
- await upgradeDependencyVersion({packagePattern: "@angular-devkit/*", newVersion: "20.x"}),
51
+ // Angular DevKit; `architect` and `build-webpack` kept the 0.<major><minor>.x CLI scheme
52
+ await upgradeDependencyVersion({packageName: "@angular-devkit/core", newVersion: "20.x"}),
53
+ await upgradeDependencyVersion({packagePattern: "@angular-devkit/s*", newVersion: "20.x"}),
54
+ await upgradeDependencyVersion({packageName: "@angular-devkit/build-angular", newVersion: "20.x"}),
55
+ await upgradeDependencyVersion({packagePattern: "@angular-devkit/architect*", newVersion: "0.2003.x"}),
56
+ await upgradeDependencyVersion({packageName: "@angular-devkit/build-webpack", newVersion: "0.2003.x"}),
41
57
  await upgradeDependencyVersion({packageName: "@schematics/angular", newVersion: "20.x"}),
42
58
  // TypeScript
43
59
  await upgradeDependencyVersion({packageName: "typescript", newVersion: "5.8.x"}),
@@ -6,7 +6,7 @@
6
6
 
7
7
  import {Recipe} from "@openrewrite/rewrite";
8
8
  import {upgradeDependencyVersion} from "@openrewrite/rewrite/javascript";
9
- import {UpgradeToAngular20} from "./upgrade-to-angular-20";
9
+ import {UpgradeToAngular20CodeChanges} from "./upgrade-to-angular-20";
10
10
  import {FindKarmaUsage} from "../search/find-karma-usage";
11
11
  import {FindCommonModuleUsage} from "../search/find-common-module-usage";
12
12
  import {FindNgClassUsage} from "../search/find-ng-class-usage";
@@ -17,18 +17,15 @@ import {MigrateInputToSignal} from "./migrate-input-to-signal";
17
17
  import {MigrateOutputToSignal} from "./migrate-output-to-signal";
18
18
  import {MigrateQueryToSignal} from "./migrate-query-to-signal";
19
19
 
20
- export class UpgradeToAngular21 extends Recipe {
21
- readonly name = "org.openrewrite.angular.UpgradeToAngular21";
22
- readonly displayName = "Upgrade to Angular 21";
23
- readonly description = "Migrates Angular 20.x applications to Angular 21. " +
24
- "This includes running the Angular 20 migration first, flagging Karma test runner usage " +
25
- "for Vitest migration, deprecated NgClass, zone.js-dependent test helpers, " +
26
- "and upgrading TypeScript to 5.9.x.";
20
+ export class UpgradeToAngular21CodeChanges extends Recipe {
21
+ readonly name = "org.openrewrite.angular.UpgradeToAngular21CodeChanges";
22
+ readonly displayName = "Upgrade to Angular 21 (code changes)";
23
+ readonly description = "The source changes of the Angular 21 migration, without the dependency version bumps. " +
24
+ "Use `UpgradeToAngular21` unless you are composing a migration to a later major.";
27
25
 
28
26
  async recipeList(): Promise<Recipe[]> {
29
27
  return [
30
- // First, run Angular 20 migration
31
- new UpgradeToAngular20(),
28
+ new UpgradeToAngular20CodeChanges(),
32
29
  // Deprecation and behavioral change warnings
33
30
  new FindKarmaUsage(),
34
31
  new FindCommonModuleUsage(),
@@ -40,10 +37,29 @@ export class UpgradeToAngular21 extends Recipe {
40
37
  new MigrateInputToSignal(),
41
38
  new MigrateOutputToSignal(),
42
39
  new MigrateQueryToSignal(),
40
+ ];
41
+ }
42
+ }
43
+
44
+ export class UpgradeToAngular21 extends Recipe {
45
+ readonly name = "org.openrewrite.angular.UpgradeToAngular21";
46
+ readonly displayName = "Upgrade to Angular 21";
47
+ readonly description = "Migrates Angular 20.x applications to Angular 21. " +
48
+ "This includes running the Angular 20 migration first, flagging Karma test runner usage " +
49
+ "for Vitest migration, deprecated NgClass, zone.js-dependent test helpers, " +
50
+ "and upgrading TypeScript to 5.9.x.";
51
+
52
+ async recipeList(): Promise<Recipe[]> {
53
+ return [
54
+ new UpgradeToAngular21CodeChanges(),
43
55
  // Angular core packages
44
56
  await upgradeDependencyVersion({packagePattern: "@angular/*", newVersion: "21.x"}),
45
- // Angular DevKit
46
- await upgradeDependencyVersion({packagePattern: "@angular-devkit/*", newVersion: "21.x"}),
57
+ // Angular DevKit; `architect` and `build-webpack` kept the 0.<major><minor>.x CLI scheme
58
+ await upgradeDependencyVersion({packageName: "@angular-devkit/core", newVersion: "21.x"}),
59
+ await upgradeDependencyVersion({packagePattern: "@angular-devkit/s*", newVersion: "21.x"}),
60
+ await upgradeDependencyVersion({packageName: "@angular-devkit/build-angular", newVersion: "21.x"}),
61
+ await upgradeDependencyVersion({packagePattern: "@angular-devkit/architect*", newVersion: "0.2102.x"}),
62
+ await upgradeDependencyVersion({packageName: "@angular-devkit/build-webpack", newVersion: "0.2102.x"}),
47
63
  await upgradeDependencyVersion({packageName: "@schematics/angular", newVersion: "21.x"}),
48
64
  // TypeScript
49
65
  await upgradeDependencyVersion({packageName: "typescript", newVersion: "5.9.x"}),
@@ -13,6 +13,33 @@ import {FindPlatformWebworkerUsage} from "../search/find-platform-webworker-usag
13
13
  import {FindRxjsCompatUsage} from "../search/find-rxjs-compat-usage";
14
14
  import {ReplaceLoadChildrenString} from "./replace-load-children-string";
15
15
 
16
+ /**
17
+ * Source changes only. Later majors chain this instead of `UpgradeToAngular8` so they don't
18
+ * inherit its dependency ladder — only the target major's versions should end up in the patch.
19
+ */
20
+ export class UpgradeToAngular8CodeChanges extends Recipe {
21
+ readonly name = "org.openrewrite.angular.UpgradeToAngular8CodeChanges";
22
+ readonly displayName = "Upgrade to Angular 8 (code changes)";
23
+ readonly description = "The source changes of the Angular 8 migration, without the dependency version bumps. " +
24
+ "Use `UpgradeToAngular8` unless you are composing a migration to a later major.";
25
+
26
+ async recipeList(): Promise<Recipe[]> {
27
+ return [
28
+ // Code transformations
29
+ new AddStaticFalseToViewQueries(),
30
+ new MoveDocumentImport({targetModule: '@angular/common'}),
31
+ // Search: removed/deprecated APIs
32
+ new FindRxjsCompatUsage(),
33
+ new ReplaceLoadChildrenString(),
34
+ new FindAngularHttpUsage(),
35
+ new FindPlatformWebworkerUsage(),
36
+ // Remove rxjs-compat (RxJS 5→6 shim no longer needed). A one-shot removal rather than a
37
+ // version bump, so it lives here where migrations to later majors still pick it up.
38
+ await removeDependency({packageName: "rxjs-compat"}),
39
+ ];
40
+ }
41
+ }
42
+
16
43
  export class UpgradeToAngular8 extends Recipe {
17
44
  readonly name = "org.openrewrite.angular.UpgradeToAngular8";
18
45
  readonly displayName = "Upgrade to Angular 8";
@@ -26,22 +53,16 @@ export class UpgradeToAngular8 extends Recipe {
26
53
 
27
54
  async recipeList(): Promise<Recipe[]> {
28
55
  return [
29
- // Code transformations
30
- new AddStaticFalseToViewQueries(),
31
- new MoveDocumentImport({targetModule: '@angular/common'}),
32
- // Search: removed/deprecated APIs
33
- new FindRxjsCompatUsage(),
34
- new ReplaceLoadChildrenString(),
35
- new FindAngularHttpUsage(),
36
- new FindPlatformWebworkerUsage(),
37
- // Remove rxjs-compat (RxJS 5→6 shim no longer needed)
38
- await removeDependency({packageName: "rxjs-compat"}),
56
+ new UpgradeToAngular8CodeChanges(),
39
57
  // Angular core packages
40
58
  await upgradeDependencyVersion({packagePattern: "@angular/*", newVersion: "8.x"}),
41
- // Angular CDK
42
- await upgradeDependencyVersion({packageName: "@angular/cdk", newVersion: "8.x"}),
43
- // Angular DevKit
44
- await upgradeDependencyVersion({packagePattern: "@angular-devkit/*", newVersion: "8.x"}),
59
+ // Angular DevKit; before Angular 12 the CLI-aligned packages used the 0.<major><minor>.x scheme
60
+ await upgradeDependencyVersion({packageName: "@angular-devkit/core", newVersion: "8.x"}),
61
+ await upgradeDependencyVersion({packageName: "@angular-devkit/schematics", newVersion: "8.x"}),
62
+ await upgradeDependencyVersion({packageName: "@angular-devkit/build-angular", newVersion: "0.803.x"}),
63
+ await upgradeDependencyVersion({packageName: "@angular-devkit/schematics-cli", newVersion: "0.803.x"}),
64
+ await upgradeDependencyVersion({packagePattern: "@angular-devkit/architect*", newVersion: "0.803.x"}),
65
+ await upgradeDependencyVersion({packageName: "@angular-devkit/build-webpack", newVersion: "0.803.x"}),
45
66
  await upgradeDependencyVersion({packageName: "@schematics/angular", newVersion: "8.x"}),
46
67
  // zone.js
47
68
  await upgradeDependencyVersion({packageName: "zone.js", newVersion: "0.9.x"}),
@@ -6,7 +6,7 @@
6
6
 
7
7
  import {Recipe} from "@openrewrite/rewrite";
8
8
  import {upgradeDependencyVersion} from "@openrewrite/rewrite/javascript";
9
- import {UpgradeToAngular8} from "./upgrade-to-angular-8";
9
+ import {UpgradeToAngular8CodeChanges} from "./upgrade-to-angular-8";
10
10
  import {RemoveStaticFalse} from "./remove-static-false";
11
11
  import {EnableAotBuild} from "./enable-aot-build";
12
12
  import {UpdateTsconfigModule} from "./update-tsconfig-module";
@@ -21,21 +21,15 @@ import {FindAnalyzeForEntryComponentsUsage} from "../search/find-analyze-for-ent
21
21
  import {ReplaceTestBedGetWithInject} from "./replace-testbed-get-with-inject";
22
22
  import {AddModuleWithProvidersGeneric} from "./add-module-with-providers-generic";
23
23
 
24
- export class UpgradeToAngular9 extends Recipe {
25
- readonly name = "org.openrewrite.angular.UpgradeToAngular9";
26
- readonly displayName = "Upgrade to Angular 9";
27
- readonly description = "Migrates Angular 8.x applications to Angular 9. " +
28
- "This includes removing the now-default `static: false` from view query decorators, " +
29
- "replacing `TestBed.get()` with `TestBed.inject()`, " +
30
- "adding generic type parameters to `ModuleWithProviders`, " +
31
- "enabling AOT compilation in `angular.json`, " +
32
- "updating `tsconfig.json` module settings for Ivy, " +
33
- "flagging removed View Engine APIs (`Renderer`, `RenderComponentType`, `RootRenderer`), " +
34
- "and upgrading Angular, TypeScript, and related dependency versions.";
24
+ export class UpgradeToAngular9CodeChanges extends Recipe {
25
+ readonly name = "org.openrewrite.angular.UpgradeToAngular9CodeChanges";
26
+ readonly displayName = "Upgrade to Angular 9 (code changes)";
27
+ readonly description = "The source changes of the Angular 9 migration, without the dependency version bumps. " +
28
+ "Use `UpgradeToAngular9` unless you are composing a migration to a later major.";
35
29
 
36
30
  async recipeList(): Promise<Recipe[]> {
37
31
  return [
38
- new UpgradeToAngular8(),
32
+ new UpgradeToAngular8CodeChanges(),
39
33
  // Code transformations
40
34
  new RemoveStaticFalse(),
41
35
  new EnableAotBuild(),
@@ -51,12 +45,34 @@ export class UpgradeToAngular9 extends Recipe {
51
45
  new FindUndecoratedAngularClass(),
52
46
  new FindMissingInjectable(),
53
47
  new FindAnalyzeForEntryComponentsUsage(),
48
+ ];
49
+ }
50
+ }
51
+
52
+ export class UpgradeToAngular9 extends Recipe {
53
+ readonly name = "org.openrewrite.angular.UpgradeToAngular9";
54
+ readonly displayName = "Upgrade to Angular 9";
55
+ readonly description = "Migrates Angular 8.x applications to Angular 9. " +
56
+ "This includes removing the now-default `static: false` from view query decorators, " +
57
+ "replacing `TestBed.get()` with `TestBed.inject()`, " +
58
+ "adding generic type parameters to `ModuleWithProviders`, " +
59
+ "enabling AOT compilation in `angular.json`, " +
60
+ "updating `tsconfig.json` module settings for Ivy, " +
61
+ "flagging removed View Engine APIs (`Renderer`, `RenderComponentType`, `RootRenderer`), " +
62
+ "and upgrading Angular, TypeScript, and related dependency versions.";
63
+
64
+ async recipeList(): Promise<Recipe[]> {
65
+ return [
66
+ new UpgradeToAngular9CodeChanges(),
54
67
  // Angular core packages
55
68
  await upgradeDependencyVersion({packagePattern: "@angular/*", newVersion: "9.x"}),
56
- // Angular CDK
57
- await upgradeDependencyVersion({packageName: "@angular/cdk", newVersion: "9.x"}),
58
- // Angular DevKit
59
- await upgradeDependencyVersion({packagePattern: "@angular-devkit/*", newVersion: "9.x"}),
69
+ // Angular DevKit; before Angular 12 the CLI-aligned packages used the 0.<major><minor>.x scheme
70
+ await upgradeDependencyVersion({packageName: "@angular-devkit/core", newVersion: "9.x"}),
71
+ await upgradeDependencyVersion({packageName: "@angular-devkit/schematics", newVersion: "9.x"}),
72
+ await upgradeDependencyVersion({packageName: "@angular-devkit/build-angular", newVersion: "0.901.x"}),
73
+ await upgradeDependencyVersion({packageName: "@angular-devkit/schematics-cli", newVersion: "0.901.x"}),
74
+ await upgradeDependencyVersion({packagePattern: "@angular-devkit/architect*", newVersion: "0.901.x"}),
75
+ await upgradeDependencyVersion({packageName: "@angular-devkit/build-webpack", newVersion: "0.901.x"}),
60
76
  await upgradeDependencyVersion({packageName: "@schematics/angular", newVersion: "9.x"}),
61
77
  // zone.js
62
78
  await upgradeDependencyVersion({packageName: "zone.js", newVersion: "0.10.x"}),