@openrewrite/recipes-angular 0.0.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 (106) hide show
  1. package/package.json +37 -0
  2. package/src/index.ts +321 -0
  3. package/src/migration/add-default-configuration.ts +121 -0
  4. package/src/migration/add-localize-polyfill.ts +51 -0
  5. package/src/migration/add-module-with-providers-generic.ts +102 -0
  6. package/src/migration/add-static-false-to-view-queries.ts +92 -0
  7. package/src/migration/add-testbed-teardown.ts +41 -0
  8. package/src/migration/enable-aot-build.ts +132 -0
  9. package/src/migration/explicit-standalone-flag.ts +82 -0
  10. package/src/migration/migrate-constructor-to-inject.ts +172 -0
  11. package/src/migration/migrate-input-to-signal.ts +320 -0
  12. package/src/migration/migrate-output-to-signal.ts +268 -0
  13. package/src/migration/migrate-query-to-signal.ts +276 -0
  14. package/src/migration/migrate-to-solution-style-tsconfig.ts +139 -0
  15. package/src/migration/move-document-to-core.ts +40 -0
  16. package/src/migration/remove-aot-summaries.ts +72 -0
  17. package/src/migration/remove-browser-module-with-server-transition.ts +185 -0
  18. package/src/migration/remove-component-factory-resolver.ts +48 -0
  19. package/src/migration/remove-default-project.ts +52 -0
  20. package/src/migration/remove-empty-ng-on-init.ts +80 -0
  21. package/src/migration/remove-enable-ivy.ts +63 -0
  22. package/src/migration/remove-entry-components.ts +75 -0
  23. package/src/migration/remove-es5-browser-support.ts +59 -0
  24. package/src/migration/remove-extract-css.ts +60 -0
  25. package/src/migration/remove-ie-polyfills.ts +118 -0
  26. package/src/migration/remove-module-id.ts +59 -0
  27. package/src/migration/remove-relative-link-resolution.ts +64 -0
  28. package/src/migration/remove-standalone-true.ts +50 -0
  29. package/src/migration/remove-static-false.ts +71 -0
  30. package/src/migration/remove-zone-js-polyfill.ts +55 -0
  31. package/src/migration/rename-after-render.ts +32 -0
  32. package/src/migration/rename-check-no-changes.ts +29 -0
  33. package/src/migration/rename-file.ts +72 -0
  34. package/src/migration/rename-pending-tasks.ts +30 -0
  35. package/src/migration/rename-zoneless-provider.ts +29 -0
  36. package/src/migration/replace-async-with-wait-for-async.ts +32 -0
  37. package/src/migration/replace-deep-zone-js-imports.ts +118 -0
  38. package/src/migration/replace-http-client-module.ts +276 -0
  39. package/src/migration/replace-initial-navigation.ts +73 -0
  40. package/src/migration/replace-inject-flags.ts +83 -0
  41. package/src/migration/replace-load-children-string.ts +48 -0
  42. package/src/migration/replace-node-sass-with-sass.ts +22 -0
  43. package/src/migration/replace-router-link-with-href.ts +37 -0
  44. package/src/migration/replace-testbed-get-with-inject.ts +33 -0
  45. package/src/migration/replace-untyped-forms.ts +59 -0
  46. package/src/migration/replace-validator-with-validators.ts +41 -0
  47. package/src/migration/replace-view-encapsulation-native.ts +51 -0
  48. package/src/migration/update-component-template-url.ts +186 -0
  49. package/src/migration/update-tsconfig-module.ts +75 -0
  50. package/src/migration/update-tsconfig-target.ts +61 -0
  51. package/src/migration/upgrade-to-angular-10.ts +52 -0
  52. package/src/migration/upgrade-to-angular-11.ts +52 -0
  53. package/src/migration/upgrade-to-angular-12.ts +43 -0
  54. package/src/migration/upgrade-to-angular-13.ts +45 -0
  55. package/src/migration/upgrade-to-angular-14.ts +44 -0
  56. package/src/migration/upgrade-to-angular-15.ts +43 -0
  57. package/src/migration/upgrade-to-angular-16.ts +57 -0
  58. package/src/migration/upgrade-to-angular-17.ts +43 -0
  59. package/src/migration/upgrade-to-angular-18.ts +69 -0
  60. package/src/migration/upgrade-to-angular-19.ts +52 -0
  61. package/src/migration/upgrade-to-angular-20.ts +47 -0
  62. package/src/migration/upgrade-to-angular-21.ts +53 -0
  63. package/src/migration/upgrade-to-angular-8.ts +54 -0
  64. package/src/migration/upgrade-to-angular-9.ts +69 -0
  65. package/src/search/find-analyze-for-entry-components-usage.ts +46 -0
  66. package/src/search/find-angular-decorator.ts +58 -0
  67. package/src/search/find-angular-http-usage.ts +35 -0
  68. package/src/search/find-animation-driver-matches-element.ts +38 -0
  69. package/src/search/find-async-test-helper-usage.ts +45 -0
  70. package/src/search/find-bare-module-with-providers.ts +47 -0
  71. package/src/search/find-browser-transfer-state-module-usage.ts +45 -0
  72. package/src/search/find-common-module-usage.ts +47 -0
  73. package/src/search/find-compiler-factory-usage.ts +51 -0
  74. package/src/search/find-date-pipe-default-timezone-usage.ts +46 -0
  75. package/src/search/find-effect-timing-usage.ts +28 -0
  76. package/src/search/find-empty-projectable-nodes.ts +68 -0
  77. package/src/search/find-fake-async-usage.ts +37 -0
  78. package/src/search/find-hammer-js-usage.ts +48 -0
  79. package/src/search/find-i18n-usage.ts +94 -0
  80. package/src/search/find-karma-usage.ts +47 -0
  81. package/src/search/find-load-children-string-usage.ts +43 -0
  82. package/src/search/find-missing-injectable.ts +75 -0
  83. package/src/search/find-ng-class-usage.ts +45 -0
  84. package/src/search/find-ng-style-usage.ts +45 -0
  85. package/src/search/find-path-match-type-usage.ts +44 -0
  86. package/src/search/find-platform-dynamic-server-usage.ts +38 -0
  87. package/src/search/find-platform-webworker-usage.ts +34 -0
  88. package/src/search/find-platform-worker-usage.ts +39 -0
  89. package/src/search/find-preserve-fragment-usage.ts +32 -0
  90. package/src/search/find-preserve-query-params-usage.ts +32 -0
  91. package/src/search/find-provided-in-deprecated-usage.ts +65 -0
  92. package/src/search/find-reflective-injector-usage.ts +45 -0
  93. package/src/search/find-render-application-usage.ts +47 -0
  94. package/src/search/find-render-component-type-usage.ts +46 -0
  95. package/src/search/find-render-module-factory-usage.ts +45 -0
  96. package/src/search/find-renderer-usage.ts +46 -0
  97. package/src/search/find-resource-cache-provider-usage.ts +38 -0
  98. package/src/search/find-root-renderer-usage.ts +47 -0
  99. package/src/search/find-rxjs-compat-usage.ts +40 -0
  100. package/src/search/find-server-transfer-state-module-usage.ts +38 -0
  101. package/src/search/find-setup-testing-router-usage.ts +45 -0
  102. package/src/search/find-testability-pending-request-usage.ts +38 -0
  103. package/src/search/find-undecorated-angular-class.ts +78 -0
  104. package/src/search/find-with-no-dom-reuse-usage.ts +46 -0
  105. package/src/search/find-wrapped-value-usage.ts +46 -0
  106. package/src/search/find-zone-js-usage.ts +43 -0
@@ -0,0 +1,45 @@
1
+ /*
2
+ * Copyright 2026 the original author or authors.
3
+ *
4
+ * Moderne Proprietary. Only for use by Moderne customers under the terms of a commercial contract.
5
+ */
6
+
7
+ import {Recipe} from "@openrewrite/rewrite";
8
+ import {UpgradeDependencyVersion} from "@openrewrite/rewrite/javascript";
9
+ import {UpgradeToAngular12} from "./upgrade-to-angular-12";
10
+ import {UpdateTsconfigTarget} from "./update-tsconfig-target";
11
+ import {RemoveIePolyfills} from "./remove-ie-polyfills";
12
+ import {RemoveDefaultProject} from "./remove-default-project";
13
+ import {AddTestBedTeardown} from "./add-testbed-teardown";
14
+ import {RemoveComponentFactoryResolver} from "./remove-component-factory-resolver";
15
+
16
+ export class UpgradeToAngular13 extends Recipe {
17
+ readonly name = "org.openrewrite.angular.UpgradeToAngular13";
18
+ readonly displayName = "Upgrade to Angular 13";
19
+ readonly description = "Migrates Angular 12.x applications to Angular 13. " +
20
+ "This includes updating `tsconfig.json` target to `es2017`, removing IE11 polyfills, " +
21
+ "removing `defaultProject` from `angular.json`, adding TestBed module teardown, " +
22
+ "simplifying `ComponentFactoryResolver` usage, " +
23
+ "and upgrading Angular, TypeScript, and related dependency versions.";
24
+
25
+ async recipeList(): Promise<Recipe[]> {
26
+ return [
27
+ new UpgradeToAngular12(),
28
+ // Code transformations
29
+ new UpdateTsconfigTarget(),
30
+ new RemoveIePolyfills(),
31
+ new RemoveDefaultProject(),
32
+ new AddTestBedTeardown(),
33
+ new RemoveComponentFactoryResolver(),
34
+ // Angular core packages
35
+ new UpgradeDependencyVersion({packageName: "@angular/*", newVersion: "13.x"}),
36
+ // Angular DevKit
37
+ new UpgradeDependencyVersion({packageName: "@angular-devkit/*", newVersion: "13.x"}),
38
+ new UpgradeDependencyVersion({packageName: "@schematics/angular", newVersion: "13.x"}),
39
+ // zone.js
40
+ new UpgradeDependencyVersion({packageName: "zone.js", newVersion: "0.11.x"}),
41
+ // TypeScript
42
+ new UpgradeDependencyVersion({packageName: "typescript", newVersion: "4.4.x"}),
43
+ ];
44
+ }
45
+ }
@@ -0,0 +1,44 @@
1
+ /*
2
+ * Copyright 2026 the original author or authors.
3
+ *
4
+ * Moderne Proprietary. Only for use by Moderne customers under the terms of a commercial contract.
5
+ */
6
+
7
+ import {Recipe} from "@openrewrite/rewrite";
8
+ import {UpgradeDependencyVersion} from "@openrewrite/rewrite/javascript";
9
+ import {UpgradeToAngular13} from "./upgrade-to-angular-13";
10
+ import {ReplaceUntypedForms} from "./replace-untyped-forms";
11
+ import {RemoveAotSummaries} from "./remove-aot-summaries";
12
+ import {FindPathMatchTypeUsage} from "../search/find-path-match-type-usage";
13
+
14
+ export class UpgradeToAngular14 extends Recipe {
15
+ readonly name = "org.openrewrite.angular.UpgradeToAngular14";
16
+ readonly displayName = "Upgrade to Angular 14";
17
+ readonly description = "Migrates Angular 13.x applications to Angular 14. " +
18
+ "This includes replacing form classes with their `Untyped*` equivalents for backward compatibility with typed forms, " +
19
+ "updating deprecated `initialNavigation` router option values, " +
20
+ "removing `aotSummaries` from TestBed calls, " +
21
+ "and flagging `pathMatch` properties that may need type narrowing.";
22
+
23
+ async recipeList(): Promise<Recipe[]> {
24
+ return [
25
+ // First, run Angular 13 migration
26
+ new UpgradeToAngular13(),
27
+ // Code transformations
28
+ new ReplaceUntypedForms(),
29
+ new RemoveAotSummaries(),
30
+ // Search: type changes
31
+ new FindPathMatchTypeUsage(),
32
+ // Angular core packages
33
+ new UpgradeDependencyVersion({packageName: "@angular/*", newVersion: "14.x"}),
34
+ // Angular DevKit
35
+ new UpgradeDependencyVersion({packageName: "@angular-devkit/*", newVersion: "14.x"}),
36
+ new UpgradeDependencyVersion({packageName: "@angular/build", newVersion: "14.x"}),
37
+ new UpgradeDependencyVersion({packageName: "@schematics/angular", newVersion: "14.x"}),
38
+ // zone.js
39
+ new UpgradeDependencyVersion({packageName: "zone.js", newVersion: "0.11.x"}),
40
+ // TypeScript
41
+ new UpgradeDependencyVersion({packageName: "typescript", newVersion: "4.7.x"}),
42
+ ];
43
+ }
44
+ }
@@ -0,0 +1,43 @@
1
+ /*
2
+ * Copyright 2026 the original author or authors.
3
+ *
4
+ * Moderne Proprietary. Only for use by Moderne customers under the terms of a commercial contract.
5
+ */
6
+
7
+ import {Recipe} from "@openrewrite/rewrite";
8
+ import {UpgradeDependencyVersion} from "@openrewrite/rewrite/javascript";
9
+ import {UpgradeToAngular14} from "./upgrade-to-angular-14";
10
+ import {RemoveRelativeLinkResolution} from "./remove-relative-link-resolution";
11
+ import {RemoveEnableIvy} from "./remove-enable-ivy";
12
+ import {FindDatePipeDefaultTimezoneUsage} from "../search/find-date-pipe-default-timezone-usage";
13
+ import {FindProvidedInDeprecatedUsage} from "../search/find-provided-in-deprecated-usage";
14
+
15
+ export class UpgradeToAngular15 extends Recipe {
16
+ readonly name = "org.openrewrite.angular.UpgradeToAngular15";
17
+ readonly displayName = "Upgrade to Angular 15";
18
+ readonly description = "Migrates Angular 14.x applications to Angular 15. " +
19
+ "This includes removing the `relativeLinkResolution` option from `RouterModule.forRoot()`, " +
20
+ "removing the `enableIvy` compiler option from `tsconfig.json`, " +
21
+ "flagging the deprecated `DATE_PIPE_DEFAULT_TIMEZONE` token and `providedIn: NgModule`/`'any'` usage, " +
22
+ "and upgrading Angular, TypeScript, and related dependency versions.";
23
+
24
+ async recipeList(): Promise<Recipe[]> {
25
+ return [
26
+ // First, run Angular 14 migration
27
+ new UpgradeToAngular14(),
28
+ // Code transformations
29
+ new RemoveRelativeLinkResolution(),
30
+ new RemoveEnableIvy(),
31
+ // Search: deprecated APIs
32
+ new FindDatePipeDefaultTimezoneUsage(),
33
+ new FindProvidedInDeprecatedUsage(),
34
+ // Angular core packages
35
+ new UpgradeDependencyVersion({packageName: "@angular/*", newVersion: "15.x"}),
36
+ // Angular DevKit
37
+ new UpgradeDependencyVersion({packageName: "@angular-devkit/*", newVersion: "15.x"}),
38
+ new UpgradeDependencyVersion({packageName: "@schematics/angular", newVersion: "15.x"}),
39
+ // TypeScript
40
+ new UpgradeDependencyVersion({packageName: "typescript", newVersion: "4.8.x"}),
41
+ ];
42
+ }
43
+ }
@@ -0,0 +1,57 @@
1
+ /*
2
+ * Copyright 2026 the original author or authors.
3
+ *
4
+ * Moderne Proprietary. Only for use by Moderne customers under the terms of a commercial contract.
5
+ */
6
+
7
+ import {Recipe} from "@openrewrite/rewrite";
8
+ import {ChangeImport, UpgradeDependencyVersion} from "@openrewrite/rewrite/javascript";
9
+ import {UpgradeToAngular15} from "./upgrade-to-angular-15";
10
+ import {RemoveEntryComponents} from "./remove-entry-components";
11
+ import {RemoveModuleId} from "./remove-module-id";
12
+ import {ReplaceRouterLinkWithHref} from "./replace-router-link-with-href";
13
+ import {FindReflectiveInjectorUsage} from "../search/find-reflective-injector-usage";
14
+ import {FindRenderModuleFactoryUsage} from "../search/find-render-module-factory-usage";
15
+ import {FindBrowserTransferStateModuleUsage} from "../search/find-browser-transfer-state-module-usage";
16
+ import {FindRenderApplicationUsage} from "../search/find-render-application-usage";
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`.";
25
+
26
+ async recipeList(): Promise<Recipe[]> {
27
+ return [
28
+ // First, run Angular 15 migration
29
+ new UpgradeToAngular15(),
30
+ // Code transformations
31
+ new RemoveEntryComponents(),
32
+ new RemoveModuleId(),
33
+ new ReplaceRouterLinkWithHref(),
34
+ // Import moves
35
+ new ChangeImport({
36
+ oldModule: "@angular/common/http",
37
+ oldMember: "XhrFactory",
38
+ newModule: "@angular/common",
39
+ }),
40
+ // Search: removed APIs
41
+ new FindReflectiveInjectorUsage(),
42
+ new FindRenderModuleFactoryUsage(),
43
+ new FindBrowserTransferStateModuleUsage(),
44
+ new FindRenderApplicationUsage(),
45
+ // Angular core packages
46
+ new UpgradeDependencyVersion({packageName: "@angular/*", newVersion: "16.x"}),
47
+ // Angular DevKit
48
+ new UpgradeDependencyVersion({packageName: "@angular-devkit/*", newVersion: "16.x"}),
49
+ new UpgradeDependencyVersion({packageName: "@angular/build", newVersion: "16.x"}),
50
+ new UpgradeDependencyVersion({packageName: "@schematics/angular", newVersion: "16.x"}),
51
+ // zone.js
52
+ new UpgradeDependencyVersion({packageName: "zone.js", newVersion: "0.13.x"}),
53
+ // TypeScript
54
+ new UpgradeDependencyVersion({packageName: "typescript", newVersion: "5.0.x"}),
55
+ ];
56
+ }
57
+ }
@@ -0,0 +1,43 @@
1
+ /*
2
+ * Copyright 2026 the original author or authors.
3
+ *
4
+ * Moderne Proprietary. Only for use by Moderne customers under the terms of a commercial contract.
5
+ */
6
+
7
+ import {Recipe} from "@openrewrite/rewrite";
8
+ import {UpgradeDependencyVersion} from "@openrewrite/rewrite/javascript";
9
+ import {UpgradeToAngular16} from "./upgrade-to-angular-16";
10
+ import {ReplaceDeepZoneJsImports} from "./replace-deep-zone-js-imports";
11
+ import {FindWithNoDomReuseUsage} from "../search/find-with-no-dom-reuse-usage";
12
+ import {FindSetupTestingRouterUsage} from "../search/find-setup-testing-router-usage";
13
+
14
+ export class UpgradeToAngular17 extends Recipe {
15
+ readonly name = "org.openrewrite.angular.UpgradeToAngular17";
16
+ readonly displayName = "Upgrade to Angular 17";
17
+ readonly description = "Migrates Angular 16.x applications to Angular 17. " +
18
+ "This includes updating Angular package versions, replacing legacy deep `zone.js` imports, " +
19
+ "flagging the removed `withNoDomReuse` and `setupTestingRouter` APIs, " +
20
+ "and upgrading TypeScript and `zone.js` dependencies.";
21
+
22
+ async recipeList(): Promise<Recipe[]> {
23
+ 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(),
31
+ // Angular core packages
32
+ new UpgradeDependencyVersion({packageName: "@angular/*", newVersion: "17.x"}),
33
+ // Angular DevKit
34
+ new UpgradeDependencyVersion({packageName: "@angular-devkit/*", newVersion: "17.x"}),
35
+ new UpgradeDependencyVersion({packageName: "@angular/build", newVersion: "17.x"}),
36
+ new UpgradeDependencyVersion({packageName: "@schematics/angular", newVersion: "17.x"}),
37
+ // zone.js
38
+ new UpgradeDependencyVersion({packageName: "zone.js", newVersion: "0.14.x"}),
39
+ // TypeScript
40
+ new UpgradeDependencyVersion({packageName: "typescript", newVersion: "5.2.x"}),
41
+ ];
42
+ }
43
+ }
@@ -0,0 +1,69 @@
1
+ /*
2
+ * Copyright 2026 the original author or authors.
3
+ *
4
+ * Moderne Proprietary. Only for use by Moderne customers under the terms of a commercial contract.
5
+ */
6
+
7
+ import {Recipe} from "@openrewrite/rewrite";
8
+ import {ChangeImport, UpgradeDependencyVersion} from "@openrewrite/rewrite/javascript";
9
+ import {UpgradeToAngular17} from "./upgrade-to-angular-17";
10
+ import {ReplaceAsyncWithWaitForAsync} from "./replace-async-with-wait-for-async";
11
+ import {ReplaceHttpClientModule} from "./replace-http-client-module";
12
+ import {FindPlatformWorkerUsage} from "../search/find-platform-worker-usage";
13
+ import {FindPlatformDynamicServerUsage} from "../search/find-platform-dynamic-server-usage";
14
+ import {FindServerTransferStateModuleUsage} from "../search/find-server-transfer-state-module-usage";
15
+ import {FindResourceCacheProviderUsage} from "../search/find-resource-cache-provider-usage";
16
+ import {FindTestabilityPendingRequestUsage} from "../search/find-testability-pending-request-usage";
17
+ import {FindAnimationDriverMatchesElement} from "../search/find-animation-driver-matches-element";
18
+
19
+ export class UpgradeToAngular18 extends Recipe {
20
+ readonly name = "org.openrewrite.angular.UpgradeToAngular18";
21
+ readonly displayName = "Upgrade to Angular 18";
22
+ readonly description = "Migrates Angular 17.x applications to Angular 18. " +
23
+ "This includes replacing the deprecated `async` test helper with `waitForAsync`, " +
24
+ "migrating `HttpClientModule` to `provideHttpClient()`, moving Transfer State APIs " +
25
+ "to `@angular/core`, and flagging removed platform APIs.";
26
+
27
+ async recipeList(): Promise<Recipe[]> {
28
+ return [
29
+ // First, run Angular 17 migration
30
+ new UpgradeToAngular17(),
31
+ // Code transformations
32
+ new ReplaceAsyncWithWaitForAsync(),
33
+ new ReplaceHttpClientModule(),
34
+ // Import moves (Transfer State APIs)
35
+ new ChangeImport({
36
+ oldModule: "@angular/platform-browser",
37
+ oldMember: "StateKey",
38
+ newModule: "@angular/core",
39
+ }),
40
+ new ChangeImport({
41
+ oldModule: "@angular/platform-browser",
42
+ oldMember: "TransferState",
43
+ newModule: "@angular/core",
44
+ }),
45
+ new ChangeImport({
46
+ oldModule: "@angular/platform-browser",
47
+ oldMember: "makeStateKey",
48
+ newModule: "@angular/core",
49
+ }),
50
+ // Search: removed APIs
51
+ new FindPlatformWorkerUsage(),
52
+ new FindPlatformDynamicServerUsage(),
53
+ new FindServerTransferStateModuleUsage(),
54
+ new FindResourceCacheProviderUsage(),
55
+ new FindTestabilityPendingRequestUsage(),
56
+ new FindAnimationDriverMatchesElement(),
57
+ // Angular core packages
58
+ new UpgradeDependencyVersion({packageName: "@angular/*", newVersion: "18.x"}),
59
+ // Angular DevKit
60
+ new UpgradeDependencyVersion({packageName: "@angular-devkit/*", newVersion: "18.x"}),
61
+ new UpgradeDependencyVersion({packageName: "@angular/build", newVersion: "18.x"}),
62
+ new UpgradeDependencyVersion({packageName: "@schematics/angular", newVersion: "18.x"}),
63
+ // zone.js
64
+ new UpgradeDependencyVersion({packageName: "zone.js", newVersion: "0.14.x"}),
65
+ // TypeScript
66
+ new UpgradeDependencyVersion({packageName: "typescript", newVersion: "5.5.x"}),
67
+ ];
68
+ }
69
+ }
@@ -0,0 +1,52 @@
1
+ /*
2
+ * Copyright 2026 the original author or authors.
3
+ *
4
+ * Moderne Proprietary. Only for use by Moderne customers under the terms of a commercial contract.
5
+ */
6
+
7
+ import {Recipe} from "@openrewrite/rewrite";
8
+ import {ChangeImport, UpgradeDependencyVersion} from "@openrewrite/rewrite/javascript";
9
+ import {UpgradeToAngular18} from "./upgrade-to-angular-18";
10
+ import {ExplicitStandaloneFlag} from "./explicit-standalone-flag";
11
+ import {RenamePendingTasks} from "./rename-pending-tasks";
12
+ import {RemoveBrowserModuleWithServerTransition} from "./remove-browser-module-with-server-transition";
13
+ import {FindEffectTimingUsage} from "../search/find-effect-timing-usage";
14
+ import {FindEmptyProjectableNodes} from "../search/find-empty-projectable-nodes";
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`.";
23
+
24
+ async recipeList(): Promise<Recipe[]> {
25
+ return [
26
+ // First, run Angular 18 migration
27
+ new UpgradeToAngular18(),
28
+ // Code transformations
29
+ new ExplicitStandaloneFlag(),
30
+ new RenamePendingTasks(),
31
+ new ChangeImport({
32
+ oldModule: "@angular/platform-browser",
33
+ oldMember: "ApplicationConfig",
34
+ newModule: "@angular/core",
35
+ }),
36
+ new RemoveBrowserModuleWithServerTransition(),
37
+ // Behavioral change warnings
38
+ new FindEffectTimingUsage(),
39
+ new FindEmptyProjectableNodes(),
40
+ // Angular core packages
41
+ new UpgradeDependencyVersion({packageName: "@angular/*", newVersion: "19.x"}),
42
+ // Angular DevKit
43
+ new UpgradeDependencyVersion({packageName: "@angular-devkit/*", newVersion: "19.x"}),
44
+ new UpgradeDependencyVersion({packageName: "@angular/build", newVersion: "19.x"}),
45
+ new UpgradeDependencyVersion({packageName: "@schematics/angular", newVersion: "19.x"}),
46
+ // zone.js
47
+ new UpgradeDependencyVersion({packageName: "zone.js", newVersion: "0.15.x"}),
48
+ // TypeScript
49
+ new UpgradeDependencyVersion({packageName: "typescript", newVersion: "5.6.x"}),
50
+ ];
51
+ }
52
+ }
@@ -0,0 +1,47 @@
1
+ /*
2
+ * Copyright 2026 the original author or authors.
3
+ *
4
+ * Moderne Proprietary. Only for use by Moderne customers under the terms of a commercial contract.
5
+ */
6
+
7
+ import {Recipe} from "@openrewrite/rewrite";
8
+ import {UpgradeDependencyVersion} from "@openrewrite/rewrite/javascript";
9
+ import {UpgradeToAngular19} from "./upgrade-to-angular-19";
10
+ import {RenameZonelessProvider} from "./rename-zoneless-provider";
11
+ import {RenameCheckNoChanges} from "./rename-check-no-changes";
12
+ import {RenameAfterRender} from "./rename-after-render";
13
+ import {ReplaceInjectFlags} from "./replace-inject-flags";
14
+ import {MoveDocumentImport} from "./move-document-to-core";
15
+ import {RemoveStandaloneTrue} from "./remove-standalone-true";
16
+ import {RemoveZoneJsPolyfill} from "./remove-zone-js-polyfill";
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.";
24
+
25
+ async recipeList(): Promise<Recipe[]> {
26
+ return [
27
+ // First, run Angular 19 migration
28
+ new UpgradeToAngular19(),
29
+ // Code transformations
30
+ new RenameZonelessProvider(),
31
+ new RenameCheckNoChanges(),
32
+ new RenameAfterRender(),
33
+ new ReplaceInjectFlags(),
34
+ new MoveDocumentImport(),
35
+ new RemoveStandaloneTrue(),
36
+ new RemoveZoneJsPolyfill(),
37
+ // Angular core packages
38
+ new UpgradeDependencyVersion({packageName: "@angular/*", newVersion: "20.x"}),
39
+ // Angular DevKit
40
+ new UpgradeDependencyVersion({packageName: "@angular-devkit/*", newVersion: "20.x"}),
41
+ new UpgradeDependencyVersion({packageName: "@angular/build", newVersion: "20.x"}),
42
+ new UpgradeDependencyVersion({packageName: "@schematics/angular", newVersion: "20.x"}),
43
+ // TypeScript
44
+ new UpgradeDependencyVersion({packageName: "typescript", newVersion: "5.8.x"}),
45
+ ];
46
+ }
47
+ }
@@ -0,0 +1,53 @@
1
+ /*
2
+ * Copyright 2026 the original author or authors.
3
+ *
4
+ * Moderne Proprietary. Only for use by Moderne customers under the terms of a commercial contract.
5
+ */
6
+
7
+ import {Recipe} from "@openrewrite/rewrite";
8
+ import {UpgradeDependencyVersion} from "@openrewrite/rewrite/javascript";
9
+ import {UpgradeToAngular20} from "./upgrade-to-angular-20";
10
+ import {FindKarmaUsage} from "../search/find-karma-usage";
11
+ import {FindCommonModuleUsage} from "../search/find-common-module-usage";
12
+ import {FindNgClassUsage} from "../search/find-ng-class-usage";
13
+ import {FindNgStyleUsage} from "../search/find-ng-style-usage";
14
+ import {FindFakeAsyncUsage} from "../search/find-fake-async-usage";
15
+ import {MigrateConstructorToInject} from "./migrate-constructor-to-inject";
16
+ import {MigrateInputToSignal} from "./migrate-input-to-signal";
17
+ import {MigrateOutputToSignal} from "./migrate-output-to-signal";
18
+ import {MigrateQueryToSignal} from "./migrate-query-to-signal";
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.";
27
+
28
+ async recipeList(): Promise<Recipe[]> {
29
+ return [
30
+ // First, run Angular 20 migration
31
+ new UpgradeToAngular20(),
32
+ // Deprecation and behavioral change warnings
33
+ new FindKarmaUsage(),
34
+ new FindCommonModuleUsage(),
35
+ new FindNgClassUsage(),
36
+ new FindNgStyleUsage(),
37
+ new FindFakeAsyncUsage(),
38
+ // Constructor DI → inject()
39
+ new MigrateConstructorToInject(),
40
+ new MigrateInputToSignal(),
41
+ new MigrateOutputToSignal(),
42
+ new MigrateQueryToSignal(),
43
+ // Angular core packages
44
+ new UpgradeDependencyVersion({packageName: "@angular/*", newVersion: "21.x"}),
45
+ // Angular DevKit
46
+ new UpgradeDependencyVersion({packageName: "@angular-devkit/*", newVersion: "21.x"}),
47
+ new UpgradeDependencyVersion({packageName: "@angular/build", newVersion: "21.x"}),
48
+ new UpgradeDependencyVersion({packageName: "@schematics/angular", newVersion: "21.x"}),
49
+ // TypeScript
50
+ new UpgradeDependencyVersion({packageName: "typescript", newVersion: "5.9.x"}),
51
+ ];
52
+ }
53
+ }
@@ -0,0 +1,54 @@
1
+ /*
2
+ * Copyright 2026 the original author or authors.
3
+ *
4
+ * Moderne Proprietary. Only for use by Moderne customers under the terms of a commercial contract.
5
+ */
6
+
7
+ import {Recipe} from "@openrewrite/rewrite";
8
+ import {RemoveDependency, UpgradeDependencyVersion} from "@openrewrite/rewrite/javascript";
9
+ import {AddStaticFalseToViewQueries} from "./add-static-false-to-view-queries";
10
+ import {MoveDocumentImport} from "./move-document-to-core";
11
+ import {FindAngularHttpUsage} from "../search/find-angular-http-usage";
12
+ import {FindPlatformWebworkerUsage} from "../search/find-platform-webworker-usage";
13
+ import {FindRxjsCompatUsage} from "../search/find-rxjs-compat-usage";
14
+ import {ReplaceLoadChildrenString} from "./replace-load-children-string";
15
+
16
+ export class UpgradeToAngular8 extends Recipe {
17
+ readonly name = "org.openrewrite.angular.UpgradeToAngular8";
18
+ readonly displayName = "Upgrade to Angular 8";
19
+ readonly description = "Migrates Angular 7.x applications to Angular 8. " +
20
+ "This includes adding the now-required `static: false` to `@ViewChild` and `@ContentChild` decorators, " +
21
+ "moving the `DOCUMENT` import from `@angular/platform-browser` to `@angular/common`, " +
22
+ "removing `rxjs-compat` and flagging any remaining RxJS 5-style imports, " +
23
+ "flagging removed `@angular/http` imports, " +
24
+ "converting deprecated string-based `loadChildren` to dynamic imports, " +
25
+ "and upgrading Angular, TypeScript, and related dependency versions.";
26
+
27
+ async recipeList(): Promise<Recipe[]> {
28
+ 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
+ new RemoveDependency({packageName: "rxjs-compat"}),
39
+ // Angular core packages
40
+ new UpgradeDependencyVersion({packageName: "@angular/*", newVersion: "8.x"}),
41
+ // Angular CDK
42
+ new UpgradeDependencyVersion({packageName: "@angular/cdk", newVersion: "8.x"}),
43
+ // Angular DevKit
44
+ new UpgradeDependencyVersion({packageName: "@angular-devkit/*", newVersion: "8.x"}),
45
+ new UpgradeDependencyVersion({packageName: "@schematics/angular", newVersion: "8.x"}),
46
+ // zone.js
47
+ new UpgradeDependencyVersion({packageName: "zone.js", newVersion: "0.9.x"}),
48
+ // TypeScript
49
+ new UpgradeDependencyVersion({packageName: "typescript", newVersion: "3.4.x"}),
50
+ // tslib
51
+ new UpgradeDependencyVersion({packageName: "tslib", newVersion: "1.x"}),
52
+ ];
53
+ }
54
+ }
@@ -0,0 +1,69 @@
1
+ /*
2
+ * Copyright 2026 the original author or authors.
3
+ *
4
+ * Moderne Proprietary. Only for use by Moderne customers under the terms of a commercial contract.
5
+ */
6
+
7
+ import {Recipe} from "@openrewrite/rewrite";
8
+ import {UpgradeDependencyVersion} from "@openrewrite/rewrite/javascript";
9
+ import {UpgradeToAngular8} from "./upgrade-to-angular-8";
10
+ import {RemoveStaticFalse} from "./remove-static-false";
11
+ import {EnableAotBuild} from "./enable-aot-build";
12
+ import {UpdateTsconfigModule} from "./update-tsconfig-module";
13
+ import {FindRendererUsage} from "../search/find-renderer-usage";
14
+ import {FindRenderComponentTypeUsage} from "../search/find-render-component-type-usage";
15
+ import {FindRootRendererUsage} from "../search/find-root-renderer-usage";
16
+ import {FindHammerJsUsage} from "../search/find-hammer-js-usage";
17
+ import {FindLoadChildrenStringUsage} from "../search/find-load-children-string-usage";
18
+ import {FindUndecoratedAngularClass} from "../search/find-undecorated-angular-class";
19
+ import {FindMissingInjectable} from "../search/find-missing-injectable";
20
+ import {FindAnalyzeForEntryComponentsUsage} from "../search/find-analyze-for-entry-components-usage";
21
+ import {ReplaceTestBedGetWithInject} from "./replace-testbed-get-with-inject";
22
+ import {AddModuleWithProvidersGeneric} from "./add-module-with-providers-generic";
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.";
35
+
36
+ async recipeList(): Promise<Recipe[]> {
37
+ return [
38
+ new UpgradeToAngular8(),
39
+ // Code transformations
40
+ new RemoveStaticFalse(),
41
+ new EnableAotBuild(),
42
+ new UpdateTsconfigModule(),
43
+ new ReplaceTestBedGetWithInject(),
44
+ new AddModuleWithProvidersGeneric(),
45
+ // Search: removed/deprecated APIs
46
+ new FindRendererUsage(),
47
+ new FindRenderComponentTypeUsage(),
48
+ new FindRootRendererUsage(),
49
+ new FindHammerJsUsage(),
50
+ new FindLoadChildrenStringUsage(),
51
+ new FindUndecoratedAngularClass(),
52
+ new FindMissingInjectable(),
53
+ new FindAnalyzeForEntryComponentsUsage(),
54
+ // Angular core packages
55
+ new UpgradeDependencyVersion({packageName: "@angular/*", newVersion: "9.x"}),
56
+ // Angular CDK
57
+ new UpgradeDependencyVersion({packageName: "@angular/cdk", newVersion: "9.x"}),
58
+ // Angular DevKit
59
+ new UpgradeDependencyVersion({packageName: "@angular-devkit/*", newVersion: "9.x"}),
60
+ new UpgradeDependencyVersion({packageName: "@schematics/angular", newVersion: "9.x"}),
61
+ // zone.js
62
+ new UpgradeDependencyVersion({packageName: "zone.js", newVersion: "0.10.x"}),
63
+ // TypeScript
64
+ new UpgradeDependencyVersion({packageName: "typescript", newVersion: "3.8.x"}),
65
+ // tslib
66
+ new UpgradeDependencyVersion({packageName: "tslib", newVersion: "1.x"}),
67
+ ];
68
+ }
69
+ }
@@ -0,0 +1,46 @@
1
+ /*
2
+ * Copyright 2026 the original author or authors.
3
+ *
4
+ * Moderne Proprietary. Only for use by Moderne customers under the terms of a commercial contract.
5
+ */
6
+
7
+ import {ExecutionContext, foundSearchResult, Recipe, TreeVisitor} from "@openrewrite/rewrite";
8
+ import {JavaScriptVisitor, JS} from "@openrewrite/rewrite/javascript";
9
+ import {J, isIdentifier} from "@openrewrite/rewrite/java";
10
+
11
+ export class FindAnalyzeForEntryComponentsUsage extends Recipe {
12
+ readonly name = "org.openrewrite.angular.search.find-analyze-for-entry-components-usage";
13
+ readonly displayName: string = "Find deprecated `ANALYZE_FOR_ENTRY_COMPONENTS` usage";
14
+ readonly description: string = "Finds usages of the deprecated `ANALYZE_FOR_ENTRY_COMPONENTS` injection token from `@angular/core`. " +
15
+ "`ANALYZE_FOR_ENTRY_COMPONENTS` was deprecated in Angular 9 and removed in Angular 13.";
16
+
17
+ async editor(): Promise<TreeVisitor<any, ExecutionContext>> {
18
+ return new class extends JavaScriptVisitor<ExecutionContext> {
19
+ protected async visitImportDeclaration(jsImport: JS.Import, p: ExecutionContext): Promise<J | undefined> {
20
+ const imp = await super.visitImportDeclaration(jsImport, p) as JS.Import;
21
+ if (!imp.moduleSpecifier) return imp;
22
+
23
+ const moduleSpec = imp.moduleSpecifier.element;
24
+ if (moduleSpec.kind !== J.Kind.Literal) return imp;
25
+
26
+ const moduleName = (moduleSpec as J.Literal).value as string;
27
+ if (moduleName !== '@angular/core') return imp;
28
+
29
+ const namedBindings = imp.importClause?.namedBindings;
30
+ if (namedBindings?.kind === JS.Kind.NamedImports) {
31
+ const named = namedBindings as JS.NamedImports;
32
+ for (const specifier of named.elements.elements) {
33
+ const spec = specifier.element as JS.ImportSpecifier;
34
+ if (isIdentifier(spec.specifier) && spec.specifier.simpleName === 'ANALYZE_FOR_ENTRY_COMPONENTS') {
35
+ return foundSearchResult(imp,
36
+ "`ANALYZE_FOR_ENTRY_COMPONENTS` was deprecated in Angular 9 and removed in Angular 13. " +
37
+ "With Ivy, entry components are no longer needed.");
38
+ }
39
+ }
40
+ }
41
+
42
+ return imp;
43
+ }
44
+ };
45
+ }
46
+ }