@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.
- package/package.json +37 -0
- package/src/index.ts +321 -0
- package/src/migration/add-default-configuration.ts +121 -0
- package/src/migration/add-localize-polyfill.ts +51 -0
- package/src/migration/add-module-with-providers-generic.ts +102 -0
- package/src/migration/add-static-false-to-view-queries.ts +92 -0
- package/src/migration/add-testbed-teardown.ts +41 -0
- package/src/migration/enable-aot-build.ts +132 -0
- package/src/migration/explicit-standalone-flag.ts +82 -0
- package/src/migration/migrate-constructor-to-inject.ts +172 -0
- package/src/migration/migrate-input-to-signal.ts +320 -0
- package/src/migration/migrate-output-to-signal.ts +268 -0
- package/src/migration/migrate-query-to-signal.ts +276 -0
- package/src/migration/migrate-to-solution-style-tsconfig.ts +139 -0
- package/src/migration/move-document-to-core.ts +40 -0
- package/src/migration/remove-aot-summaries.ts +72 -0
- package/src/migration/remove-browser-module-with-server-transition.ts +185 -0
- package/src/migration/remove-component-factory-resolver.ts +48 -0
- package/src/migration/remove-default-project.ts +52 -0
- package/src/migration/remove-empty-ng-on-init.ts +80 -0
- package/src/migration/remove-enable-ivy.ts +63 -0
- package/src/migration/remove-entry-components.ts +75 -0
- package/src/migration/remove-es5-browser-support.ts +59 -0
- package/src/migration/remove-extract-css.ts +60 -0
- package/src/migration/remove-ie-polyfills.ts +118 -0
- package/src/migration/remove-module-id.ts +59 -0
- package/src/migration/remove-relative-link-resolution.ts +64 -0
- package/src/migration/remove-standalone-true.ts +50 -0
- package/src/migration/remove-static-false.ts +71 -0
- package/src/migration/remove-zone-js-polyfill.ts +55 -0
- package/src/migration/rename-after-render.ts +32 -0
- package/src/migration/rename-check-no-changes.ts +29 -0
- package/src/migration/rename-file.ts +72 -0
- package/src/migration/rename-pending-tasks.ts +30 -0
- package/src/migration/rename-zoneless-provider.ts +29 -0
- package/src/migration/replace-async-with-wait-for-async.ts +32 -0
- package/src/migration/replace-deep-zone-js-imports.ts +118 -0
- package/src/migration/replace-http-client-module.ts +276 -0
- package/src/migration/replace-initial-navigation.ts +73 -0
- package/src/migration/replace-inject-flags.ts +83 -0
- package/src/migration/replace-load-children-string.ts +48 -0
- package/src/migration/replace-node-sass-with-sass.ts +22 -0
- package/src/migration/replace-router-link-with-href.ts +37 -0
- package/src/migration/replace-testbed-get-with-inject.ts +33 -0
- package/src/migration/replace-untyped-forms.ts +59 -0
- package/src/migration/replace-validator-with-validators.ts +41 -0
- package/src/migration/replace-view-encapsulation-native.ts +51 -0
- package/src/migration/update-component-template-url.ts +186 -0
- package/src/migration/update-tsconfig-module.ts +75 -0
- package/src/migration/update-tsconfig-target.ts +61 -0
- package/src/migration/upgrade-to-angular-10.ts +52 -0
- package/src/migration/upgrade-to-angular-11.ts +52 -0
- package/src/migration/upgrade-to-angular-12.ts +43 -0
- package/src/migration/upgrade-to-angular-13.ts +45 -0
- package/src/migration/upgrade-to-angular-14.ts +44 -0
- package/src/migration/upgrade-to-angular-15.ts +43 -0
- package/src/migration/upgrade-to-angular-16.ts +57 -0
- package/src/migration/upgrade-to-angular-17.ts +43 -0
- package/src/migration/upgrade-to-angular-18.ts +69 -0
- package/src/migration/upgrade-to-angular-19.ts +52 -0
- package/src/migration/upgrade-to-angular-20.ts +47 -0
- package/src/migration/upgrade-to-angular-21.ts +53 -0
- package/src/migration/upgrade-to-angular-8.ts +54 -0
- package/src/migration/upgrade-to-angular-9.ts +69 -0
- package/src/search/find-analyze-for-entry-components-usage.ts +46 -0
- package/src/search/find-angular-decorator.ts +58 -0
- package/src/search/find-angular-http-usage.ts +35 -0
- package/src/search/find-animation-driver-matches-element.ts +38 -0
- package/src/search/find-async-test-helper-usage.ts +45 -0
- package/src/search/find-bare-module-with-providers.ts +47 -0
- package/src/search/find-browser-transfer-state-module-usage.ts +45 -0
- package/src/search/find-common-module-usage.ts +47 -0
- package/src/search/find-compiler-factory-usage.ts +51 -0
- package/src/search/find-date-pipe-default-timezone-usage.ts +46 -0
- package/src/search/find-effect-timing-usage.ts +28 -0
- package/src/search/find-empty-projectable-nodes.ts +68 -0
- package/src/search/find-fake-async-usage.ts +37 -0
- package/src/search/find-hammer-js-usage.ts +48 -0
- package/src/search/find-i18n-usage.ts +94 -0
- package/src/search/find-karma-usage.ts +47 -0
- package/src/search/find-load-children-string-usage.ts +43 -0
- package/src/search/find-missing-injectable.ts +75 -0
- package/src/search/find-ng-class-usage.ts +45 -0
- package/src/search/find-ng-style-usage.ts +45 -0
- package/src/search/find-path-match-type-usage.ts +44 -0
- package/src/search/find-platform-dynamic-server-usage.ts +38 -0
- package/src/search/find-platform-webworker-usage.ts +34 -0
- package/src/search/find-platform-worker-usage.ts +39 -0
- package/src/search/find-preserve-fragment-usage.ts +32 -0
- package/src/search/find-preserve-query-params-usage.ts +32 -0
- package/src/search/find-provided-in-deprecated-usage.ts +65 -0
- package/src/search/find-reflective-injector-usage.ts +45 -0
- package/src/search/find-render-application-usage.ts +47 -0
- package/src/search/find-render-component-type-usage.ts +46 -0
- package/src/search/find-render-module-factory-usage.ts +45 -0
- package/src/search/find-renderer-usage.ts +46 -0
- package/src/search/find-resource-cache-provider-usage.ts +38 -0
- package/src/search/find-root-renderer-usage.ts +47 -0
- package/src/search/find-rxjs-compat-usage.ts +40 -0
- package/src/search/find-server-transfer-state-module-usage.ts +38 -0
- package/src/search/find-setup-testing-router-usage.ts +45 -0
- package/src/search/find-testability-pending-request-usage.ts +38 -0
- package/src/search/find-undecorated-angular-class.ts +78 -0
- package/src/search/find-with-no-dom-reuse-usage.ts +46 -0
- package/src/search/find-wrapped-value-usage.ts +46 -0
- 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
|
+
}
|