@openrewrite/recipes-angular 1.8.0 → 1.9.0-20260804-162757

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/index.d.ts +13 -0
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +54 -2
  4. package/dist/index.js.map +1 -1
  5. package/dist/migration/add-eager-change-detection.d.ts +8 -0
  6. package/dist/migration/add-eager-change-detection.d.ts.map +1 -0
  7. package/dist/migration/add-eager-change-detection.js +90 -0
  8. package/dist/migration/add-eager-change-detection.js.map +1 -0
  9. package/dist/migration/add-no-incremental-hydration.d.ts +8 -0
  10. package/dist/migration/add-no-incremental-hydration.d.ts.map +1 -0
  11. package/dist/migration/add-no-incremental-hydration.js +69 -0
  12. package/dist/migration/add-no-incremental-hydration.js.map +1 -0
  13. package/dist/migration/add-strict-templates-false.d.ts +8 -0
  14. package/dist/migration/add-strict-templates-false.d.ts.map +1 -0
  15. package/dist/migration/add-strict-templates-false.js +129 -0
  16. package/dist/migration/add-strict-templates-false.js.map +1 -0
  17. package/dist/migration/remove-with-fetch.d.ts +8 -0
  18. package/dist/migration/remove-with-fetch.d.ts.map +1 -0
  19. package/dist/migration/remove-with-fetch.js +73 -0
  20. package/dist/migration/remove-with-fetch.js.map +1 -0
  21. package/dist/migration/rename-angular-js-globals.d.ts +8 -0
  22. package/dist/migration/rename-angular-js-globals.d.ts.map +1 -0
  23. package/dist/migration/rename-angular-js-globals.js +56 -0
  24. package/dist/migration/rename-angular-js-globals.js.map +1 -0
  25. package/dist/migration/rename-default-change-detection.d.ts +8 -0
  26. package/dist/migration/rename-default-change-detection.d.ts.map +1 -0
  27. package/dist/migration/rename-default-change-detection.js +52 -0
  28. package/dist/migration/rename-default-change-detection.js.map +1 -0
  29. package/dist/migration/replace-create-ng-module-ref.d.ts +8 -0
  30. package/dist/migration/replace-create-ng-module-ref.d.ts.map +1 -0
  31. package/dist/migration/replace-create-ng-module-ref.js +51 -0
  32. package/dist/migration/replace-create-ng-module-ref.js.map +1 -0
  33. package/dist/migration/upgrade-to-angular-22.d.ts +14 -0
  34. package/dist/migration/upgrade-to-angular-22.d.ts.map +1 -0
  35. package/dist/migration/upgrade-to-angular-22.js +96 -0
  36. package/dist/migration/upgrade-to-angular-22.js.map +1 -0
  37. package/dist/search/find-can-match-usage.d.ts +8 -0
  38. package/dist/search/find-can-match-usage.d.ts.map +1 -0
  39. package/dist/search/find-can-match-usage.js +65 -0
  40. package/dist/search/find-can-match-usage.js.map +1 -0
  41. package/dist/search/find-check-no-changes-usage.d.ts +8 -0
  42. package/dist/search/find-check-no-changes-usage.d.ts.map +1 -0
  43. package/dist/search/find-check-no-changes-usage.js +50 -0
  44. package/dist/search/find-check-no-changes-usage.js.map +1 -0
  45. package/dist/search/find-http-xhr-backend-usage.d.ts +8 -0
  46. package/dist/search/find-http-xhr-backend-usage.d.ts.map +1 -0
  47. package/dist/search/find-http-xhr-backend-usage.js +65 -0
  48. package/dist/search/find-http-xhr-backend-usage.js.map +1 -0
  49. package/dist/search/find-implicit-params-inheritance.d.ts +8 -0
  50. package/dist/search/find-implicit-params-inheritance.d.ts.map +1 -0
  51. package/dist/search/find-implicit-params-inheritance.js +74 -0
  52. package/dist/search/find-implicit-params-inheritance.js.map +1 -0
  53. package/dist/search/find-provide-routes-usage.d.ts +8 -0
  54. package/dist/search/find-provide-routes-usage.d.ts.map +1 -0
  55. package/dist/search/find-provide-routes-usage.js +64 -0
  56. package/dist/search/find-provide-routes-usage.js.map +1 -0
  57. package/package.json +1 -1
  58. package/src/index.ts +39 -0
  59. package/src/migration/add-eager-change-detection.ts +72 -0
  60. package/src/migration/add-no-incremental-hydration.ts +49 -0
  61. package/src/migration/add-strict-templates-false.ts +113 -0
  62. package/src/migration/remove-with-fetch.ts +53 -0
  63. package/src/migration/rename-angular-js-globals.ts +37 -0
  64. package/src/migration/rename-default-change-detection.ts +33 -0
  65. package/src/migration/replace-create-ng-module-ref.ts +32 -0
  66. package/src/migration/upgrade-to-angular-22.ts +76 -0
  67. package/src/search/find-can-match-usage.ts +45 -0
  68. package/src/search/find-check-no-changes-usage.ts +29 -0
  69. package/src/search/find-http-xhr-backend-usage.ts +44 -0
  70. package/src/search/find-implicit-params-inheritance.ts +49 -0
  71. package/src/search/find-provide-routes-usage.ts +43 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove-with-fetch.d.ts","sourceRoot":"","sources":["../../src/migration/remove-with-fetch.ts"],"names":[],"mappings":"AAMA,OAAO,EAAe,gBAAgB,EAAY,MAAM,EAAE,WAAW,EAAC,MAAM,sBAAsB,CAAC;AAInG,qBAAa,eAAgB,SAAQ,MAAM;IACvC,QAAQ,CAAC,IAAI,yDAAyD;IACtE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAqD;IACjF,QAAQ,CAAC,WAAW,EAAE,MAAM,CAC8E;IAEpG,MAAM,IAAI,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;CA8B9D"}
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ /*
3
+ * Copyright 2026 the original author or authors.
4
+ *
5
+ * Moderne Proprietary. Only for use by Moderne customers under the terms of a commercial contract.
6
+ */
7
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
8
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
9
+ return new (P || (P = Promise))(function (resolve, reject) {
10
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
11
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
12
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
13
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
14
+ });
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.RemoveWithFetch = void 0;
18
+ const rewrite_1 = require("@openrewrite/rewrite");
19
+ const javascript_1 = require("@openrewrite/rewrite/javascript");
20
+ const java_1 = require("@openrewrite/rewrite/java");
21
+ class RemoveWithFetch extends rewrite_1.Recipe {
22
+ constructor() {
23
+ super(...arguments);
24
+ this.name = "org.openrewrite.angular.migration.remove-with-fetch";
25
+ this.displayName = "Remove `withFetch()` from `provideHttpClient()`";
26
+ this.description = "Removes the `withFetch()` feature from `provideHttpClient()` calls. " +
27
+ "Angular 22 uses the Fetch API by default and deprecated `withFetch()`, which can be safely removed.";
28
+ }
29
+ editor() {
30
+ return __awaiter(this, void 0, void 0, function* () {
31
+ return new class extends javascript_1.JavaScriptVisitor {
32
+ visitMethodInvocation(method, p) {
33
+ const _super = Object.create(null, {
34
+ visitMethodInvocation: { get: () => super.visitMethodInvocation }
35
+ });
36
+ return __awaiter(this, void 0, void 0, function* () {
37
+ var _a, _b;
38
+ const m = yield _super.visitMethodInvocation.call(this, method, p);
39
+ if (!m || m.name.simpleName !== 'provideHttpClient')
40
+ return m;
41
+ const elements = (_b = (_a = m.arguments) === null || _a === void 0 ? void 0 : _a.elements) !== null && _b !== void 0 ? _b : [];
42
+ const retained = elements.filter(rp => !isWithFetchCall(rp.element));
43
+ if (retained.length === elements.length)
44
+ return m;
45
+ (0, javascript_1.maybeRemoveImport)(this, '@angular/common/http', 'withFetch');
46
+ const newElements = retained.length > 0
47
+ ? [Object.assign(Object.assign({}, retained[0]), { element: Object.assign(Object.assign({}, retained[0].element), { prefix: elements[0].element.prefix }) }), ...retained.slice(1)]
48
+ : [{
49
+ kind: java_1.J.Kind.RightPadded,
50
+ element: {
51
+ kind: java_1.J.Kind.Empty,
52
+ id: (0, rewrite_1.randomId)(),
53
+ prefix: java_1.emptySpace,
54
+ markers: rewrite_1.emptyMarkers,
55
+ },
56
+ after: java_1.emptySpace,
57
+ markers: rewrite_1.emptyMarkers,
58
+ }];
59
+ return Object.assign(Object.assign({}, m), { arguments: Object.assign(Object.assign({}, m.arguments), { elements: newElements }) });
60
+ });
61
+ }
62
+ }();
63
+ });
64
+ }
65
+ }
66
+ exports.RemoveWithFetch = RemoveWithFetch;
67
+ function isWithFetchCall(expression) {
68
+ if (expression.kind !== java_1.J.Kind.MethodInvocation)
69
+ return false;
70
+ const invocation = expression;
71
+ return !invocation.select && (0, java_1.isIdentifier)(invocation.name) && invocation.name.simpleName === 'withFetch';
72
+ }
73
+ //# sourceMappingURL=remove-with-fetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove-with-fetch.js","sourceRoot":"","sources":["../../src/migration/remove-with-fetch.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;;AAEH,kDAAmG;AACnG,gEAAqF;AACrF,oDAAsE;AAEtE,MAAa,eAAgB,SAAQ,gBAAM;IAA3C;;QACa,SAAI,GAAG,qDAAqD,CAAC;QAC7D,gBAAW,GAAW,iDAAiD,CAAC;QACxE,gBAAW,GAAW,sEAAsE;YACjG,qGAAqG,CAAC;IAgC9G,CAAC;IA9BS,MAAM;;YACR,OAAO,IAAI,KAAM,SAAQ,8BAAmC;gBACzC,qBAAqB,CAAC,MAA0B,EAAE,CAAmB;;;;;;wBAChF,MAAM,CAAC,GAAG,MAAM,OAAM,qBAAqB,YAAC,MAAM,EAAE,CAAC,CAAuB,CAAC;wBAC7E,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,KAAK,mBAAmB;4BAAE,OAAO,CAAC,CAAC;wBAE9D,MAAM,QAAQ,GAAG,MAAA,MAAA,CAAC,CAAC,SAAS,0CAAE,QAAQ,mCAAI,EAAE,CAAC;wBAC7C,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,eAAe,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;wBACrE,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM;4BAAE,OAAO,CAAC,CAAC;wBAElD,IAAA,8BAAiB,EAAC,IAAI,EAAE,sBAAsB,EAAE,WAAW,CAAC,CAAC;wBAE7D,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC;4BACnC,CAAC,CAAC,iCAAK,QAAQ,CAAC,CAAC,CAAC,KAAE,OAAO,kCAAM,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,KAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,QAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;4BACjH,CAAC,CAAC,CAAC;oCACC,IAAI,EAAE,QAAC,CAAC,IAAI,CAAC,WAAW;oCACxB,OAAO,EAAE;wCACL,IAAI,EAAE,QAAC,CAAC,IAAI,CAAC,KAAK;wCAClB,EAAE,EAAE,IAAA,kBAAQ,GAAE;wCACd,MAAM,EAAE,iBAAU;wCAClB,OAAO,EAAE,sBAAY;qCACb;oCACZ,KAAK,EAAE,iBAAU;oCACjB,OAAO,EAAE,sBAAY;iCACF,CAAC,CAAC;wBAE7B,OAAO,gCAAI,CAAC,KAAE,SAAS,kCAAM,CAAC,CAAC,SAAU,KAAE,QAAQ,EAAE,WAAW,MAAwB,CAAC;oBAC7F,CAAC;iBAAA;aACJ,EAAE,CAAC;QACR,CAAC;KAAA;CACJ;AApCD,0CAoCC;AAED,SAAS,eAAe,CAAC,UAAa;IAClC,IAAI,UAAU,CAAC,IAAI,KAAK,QAAC,CAAC,IAAI,CAAC,gBAAgB;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,UAAU,GAAG,UAAgC,CAAC;IACpD,OAAO,CAAC,UAAU,CAAC,MAAM,IAAI,IAAA,mBAAY,EAAC,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,UAAU,KAAK,WAAW,CAAC;AAC7G,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { ExecutionContext, Recipe, TreeVisitor } from "@openrewrite/rewrite";
2
+ export declare class RenameAngularJsGlobals extends Recipe {
3
+ readonly name = "org.openrewrite.angular.migration.rename-angular-js-globals";
4
+ readonly displayName: string;
5
+ readonly description: string;
6
+ editor(): Promise<TreeVisitor<any, ExecutionContext>>;
7
+ }
8
+ //# sourceMappingURL=rename-angular-js-globals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rename-angular-js-globals.d.ts","sourceRoot":"","sources":["../../src/migration/rename-angular-js-globals.ts"],"names":[],"mappings":"AAMA,OAAO,EAAC,gBAAgB,EAAgB,MAAM,EAAE,WAAW,EAAC,MAAM,sBAAsB,CAAC;AASzF,qBAAa,sBAAuB,SAAQ,MAAM;IAC9C,QAAQ,CAAC,IAAI,iEAAiE;IAC9E,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAyF;IACrH,QAAQ,CAAC,WAAW,EAAE,MAAM,CAC4E;IAElG,MAAM,IAAI,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;CAe9D"}
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ /*
3
+ * Copyright 2026 the original author or authors.
4
+ *
5
+ * Moderne Proprietary. Only for use by Moderne customers under the terms of a commercial contract.
6
+ */
7
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
8
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
9
+ return new (P || (P = Promise))(function (resolve, reject) {
10
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
11
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
12
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
13
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
14
+ });
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.RenameAngularJsGlobals = void 0;
18
+ const rewrite_1 = require("@openrewrite/rewrite");
19
+ const javascript_1 = require("@openrewrite/rewrite/javascript");
20
+ const RENAMES = {
21
+ getAngularLib: 'getAngularJSGlobal',
22
+ setAngularLib: 'setAngularJSGlobal',
23
+ };
24
+ class RenameAngularJsGlobals extends rewrite_1.Recipe {
25
+ constructor() {
26
+ super(...arguments);
27
+ this.name = "org.openrewrite.angular.migration.rename-angular-js-globals";
28
+ this.displayName = "Rename `getAngularLib`/`setAngularLib` to `getAngularJSGlobal`/`setAngularJSGlobal`";
29
+ this.description = "Renames the `getAngularLib` and `setAngularLib` functions from `@angular/upgrade` to " +
30
+ "`getAngularJSGlobal` and `setAngularJSGlobal`. The deprecated aliases were removed in Angular 22.";
31
+ }
32
+ editor() {
33
+ return __awaiter(this, void 0, void 0, function* () {
34
+ return new class extends javascript_1.JavaScriptVisitor {
35
+ visitIdentifier(identifier, p) {
36
+ const _super = Object.create(null, {
37
+ visitIdentifier: { get: () => super.visitIdentifier }
38
+ });
39
+ return __awaiter(this, void 0, void 0, function* () {
40
+ const id = yield _super.visitIdentifier.call(this, identifier, p);
41
+ if (!id)
42
+ return id;
43
+ const replacement = RENAMES[id.simpleName];
44
+ if (!replacement)
45
+ return id;
46
+ return (0, rewrite_1.produceAsync)(id, (draft) => __awaiter(this, void 0, void 0, function* () {
47
+ draft.simpleName = replacement;
48
+ }));
49
+ });
50
+ }
51
+ }();
52
+ });
53
+ }
54
+ }
55
+ exports.RenameAngularJsGlobals = RenameAngularJsGlobals;
56
+ //# sourceMappingURL=rename-angular-js-globals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rename-angular-js-globals.js","sourceRoot":"","sources":["../../src/migration/rename-angular-js-globals.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;;AAEH,kDAAyF;AACzF,gEAAkE;AAGlE,MAAM,OAAO,GAA2B;IACpC,aAAa,EAAE,oBAAoB;IACnC,aAAa,EAAE,oBAAoB;CACtC,CAAC;AAEF,MAAa,sBAAuB,SAAQ,gBAAM;IAAlD;;QACa,SAAI,GAAG,6DAA6D,CAAC;QACrE,gBAAW,GAAW,qFAAqF,CAAC;QAC5G,gBAAW,GAAW,uFAAuF;YAClH,mGAAmG,CAAC;IAiB5G,CAAC;IAfS,MAAM;;YACR,OAAO,IAAI,KAAM,SAAQ,8BAAmC;gBACzC,eAAe,CAAC,UAAwB,EAAE,CAAmB;;;;;wBACxE,MAAM,EAAE,GAAG,MAAM,OAAM,eAAe,YAAC,UAAU,EAAE,CAAC,CAAiB,CAAC;wBACtE,IAAI,CAAC,EAAE;4BAAE,OAAO,EAAE,CAAC;wBAEnB,MAAM,WAAW,GAAG,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;wBAC3C,IAAI,CAAC,WAAW;4BAAE,OAAO,EAAE,CAAC;wBAE5B,OAAO,IAAA,sBAAY,EAAC,EAAE,EAAE,CAAM,KAAK,EAAC,EAAE;4BAClC,KAAK,CAAC,UAAU,GAAG,WAAW,CAAC;wBACnC,CAAC,CAAA,CAAC,CAAC;oBACP,CAAC;iBAAA;aACJ,EAAE,CAAC;QACR,CAAC;KAAA;CACJ;AArBD,wDAqBC"}
@@ -0,0 +1,8 @@
1
+ import { ExecutionContext, Recipe, TreeVisitor } from "@openrewrite/rewrite";
2
+ export declare class RenameDefaultChangeDetection extends Recipe {
3
+ readonly name = "org.openrewrite.angular.migration.rename-default-change-detection";
4
+ readonly displayName: string;
5
+ readonly description: string;
6
+ editor(): Promise<TreeVisitor<any, ExecutionContext>>;
7
+ }
8
+ //# sourceMappingURL=rename-default-change-detection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rename-default-change-detection.d.ts","sourceRoot":"","sources":["../../src/migration/rename-default-change-detection.ts"],"names":[],"mappings":"AAMA,OAAO,EAAC,gBAAgB,EAAE,MAAM,EAAE,WAAW,EAAC,MAAM,sBAAsB,CAAC;AAI3E,qBAAa,4BAA6B,SAAQ,MAAM;IACpD,QAAQ,CAAC,IAAI,uEAAuE;IACpF,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAiF;IAC7G,QAAQ,CAAC,WAAW,EAAE,MAAM,CAC+F;IAErH,MAAM,IAAI,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;CAgB9D"}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ /*
3
+ * Copyright 2026 the original author or authors.
4
+ *
5
+ * Moderne Proprietary. Only for use by Moderne customers under the terms of a commercial contract.
6
+ */
7
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
8
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
9
+ return new (P || (P = Promise))(function (resolve, reject) {
10
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
11
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
12
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
13
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
14
+ });
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.RenameDefaultChangeDetection = void 0;
18
+ const rewrite_1 = require("@openrewrite/rewrite");
19
+ const javascript_1 = require("@openrewrite/rewrite/javascript");
20
+ const java_1 = require("@openrewrite/rewrite/java");
21
+ class RenameDefaultChangeDetection extends rewrite_1.Recipe {
22
+ constructor() {
23
+ super(...arguments);
24
+ this.name = "org.openrewrite.angular.migration.rename-default-change-detection";
25
+ this.displayName = "Rename `ChangeDetectionStrategy.Default` to `ChangeDetectionStrategy.Eager`";
26
+ this.description = "Renames the deprecated `ChangeDetectionStrategy.Default` enum member to its Angular 22 " +
27
+ "replacement `ChangeDetectionStrategy.Eager`. Both members have the same value, so the change is behavior preserving.";
28
+ }
29
+ editor() {
30
+ return __awaiter(this, void 0, void 0, function* () {
31
+ return new class extends javascript_1.JavaScriptVisitor {
32
+ visitFieldAccess(fieldAccess, p) {
33
+ const _super = Object.create(null, {
34
+ visitFieldAccess: { get: () => super.visitFieldAccess }
35
+ });
36
+ return __awaiter(this, void 0, void 0, function* () {
37
+ const f = yield _super.visitFieldAccess.call(this, fieldAccess, p);
38
+ if (!f)
39
+ return f;
40
+ if (!(0, java_1.isIdentifier)(f.target) || f.target.simpleName !== 'ChangeDetectionStrategy')
41
+ return f;
42
+ if (f.name.element.simpleName !== 'Default')
43
+ return f;
44
+ return Object.assign(Object.assign({}, f), { name: Object.assign(Object.assign({}, f.name), { element: Object.assign(Object.assign({}, f.name.element), { simpleName: 'Eager' }) }) });
45
+ });
46
+ }
47
+ }();
48
+ });
49
+ }
50
+ }
51
+ exports.RenameDefaultChangeDetection = RenameDefaultChangeDetection;
52
+ //# sourceMappingURL=rename-default-change-detection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rename-default-change-detection.js","sourceRoot":"","sources":["../../src/migration/rename-default-change-detection.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;;AAEH,kDAA2E;AAC3E,gEAAkE;AAClE,oDAA0D;AAE1D,MAAa,4BAA6B,SAAQ,gBAAM;IAAxD;;QACa,SAAI,GAAG,mEAAmE,CAAC;QAC3E,gBAAW,GAAW,6EAA6E,CAAC;QACpG,gBAAW,GAAW,yFAAyF;YACpH,sHAAsH,CAAC;IAkB/H,CAAC;IAhBS,MAAM;;YACR,OAAO,IAAI,KAAM,SAAQ,8BAAmC;gBACxC,gBAAgB,CAAC,WAA0B,EAAE,CAAmB;;;;;wBAC5E,MAAM,CAAC,GAAG,MAAM,OAAM,gBAAgB,YAAC,WAAW,EAAE,CAAC,CAAkB,CAAC;wBACxE,IAAI,CAAC,CAAC;4BAAE,OAAO,CAAC,CAAC;wBAEjB,IAAI,CAAC,IAAA,mBAAY,EAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,UAAU,KAAK,yBAAyB;4BAAE,OAAO,CAAC,CAAC;wBAC3F,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,KAAK,SAAS;4BAAE,OAAO,CAAC,CAAC;wBAEtD,OAAO,gCACA,CAAC,KACJ,IAAI,kCAAM,CAAC,CAAC,IAAI,KAAE,OAAO,kCAAM,CAAC,CAAC,IAAI,CAAC,OAAO,KAAE,UAAU,EAAE,OAAO,SACpD,CAAC;oBACvB,CAAC;iBAAA;aACJ,EAAE,CAAC;QACR,CAAC;KAAA;CACJ;AAtBD,oEAsBC"}
@@ -0,0 +1,8 @@
1
+ import { ExecutionContext, Recipe, TreeVisitor } from "@openrewrite/rewrite";
2
+ export declare class ReplaceCreateNgModuleRef extends Recipe {
3
+ readonly name = "org.openrewrite.angular.migration.replace-create-ng-module-ref";
4
+ readonly displayName: string;
5
+ readonly description: string;
6
+ editor(): Promise<TreeVisitor<any, ExecutionContext>>;
7
+ }
8
+ //# sourceMappingURL=replace-create-ng-module-ref.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replace-create-ng-module-ref.d.ts","sourceRoot":"","sources":["../../src/migration/replace-create-ng-module-ref.ts"],"names":[],"mappings":"AAMA,OAAO,EAAC,gBAAgB,EAAgB,MAAM,EAAE,WAAW,EAAC,MAAM,sBAAsB,CAAC;AAIzF,qBAAa,wBAAyB,SAAQ,MAAM;IAChD,QAAQ,CAAC,IAAI,oEAAoE;IACjF,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAuD;IACnF,QAAQ,CAAC,WAAW,EAAE,MAAM,CAC8C;IAEpE,MAAM,IAAI,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;CAe9D"}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ /*
3
+ * Copyright 2026 the original author or authors.
4
+ *
5
+ * Moderne Proprietary. Only for use by Moderne customers under the terms of a commercial contract.
6
+ */
7
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
8
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
9
+ return new (P || (P = Promise))(function (resolve, reject) {
10
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
11
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
12
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
13
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
14
+ });
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.ReplaceCreateNgModuleRef = void 0;
18
+ const rewrite_1 = require("@openrewrite/rewrite");
19
+ const javascript_1 = require("@openrewrite/rewrite/javascript");
20
+ class ReplaceCreateNgModuleRef extends rewrite_1.Recipe {
21
+ constructor() {
22
+ super(...arguments);
23
+ this.name = "org.openrewrite.angular.migration.replace-create-ng-module-ref";
24
+ this.displayName = "Replace `createNgModuleRef` with `createNgModule`";
25
+ this.description = "Renames `createNgModuleRef` to `createNgModule` in imports and usages. " +
26
+ "The deprecated `createNgModuleRef` alias was removed in Angular 22.";
27
+ }
28
+ editor() {
29
+ return __awaiter(this, void 0, void 0, function* () {
30
+ return new class extends javascript_1.JavaScriptVisitor {
31
+ visitIdentifier(identifier, p) {
32
+ const _super = Object.create(null, {
33
+ visitIdentifier: { get: () => super.visitIdentifier }
34
+ });
35
+ return __awaiter(this, void 0, void 0, function* () {
36
+ const id = yield _super.visitIdentifier.call(this, identifier, p);
37
+ if (!id || id.simpleName !== 'createNgModuleRef')
38
+ return id;
39
+ (0, javascript_1.maybeAddImport)(this, { module: '@angular/core', member: 'createNgModule' });
40
+ (0, javascript_1.maybeRemoveImport)(this, '@angular/core', 'createNgModuleRef');
41
+ return (0, rewrite_1.produceAsync)(id, (draft) => __awaiter(this, void 0, void 0, function* () {
42
+ draft.simpleName = 'createNgModule';
43
+ }));
44
+ });
45
+ }
46
+ }();
47
+ });
48
+ }
49
+ }
50
+ exports.ReplaceCreateNgModuleRef = ReplaceCreateNgModuleRef;
51
+ //# sourceMappingURL=replace-create-ng-module-ref.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replace-create-ng-module-ref.js","sourceRoot":"","sources":["../../src/migration/replace-create-ng-module-ref.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;;AAEH,kDAAyF;AACzF,gEAAqG;AAGrG,MAAa,wBAAyB,SAAQ,gBAAM;IAApD;;QACa,SAAI,GAAG,gEAAgE,CAAC;QACxE,gBAAW,GAAW,mDAAmD,CAAC;QAC1E,gBAAW,GAAW,yEAAyE;YACpG,qEAAqE,CAAC;IAiB9E,CAAC;IAfS,MAAM;;YACR,OAAO,IAAI,KAAM,SAAQ,8BAAmC;gBACzC,eAAe,CAAC,UAAwB,EAAE,CAAmB;;;;;wBACxE,MAAM,EAAE,GAAG,MAAM,OAAM,eAAe,YAAC,UAAU,EAAE,CAAC,CAAiB,CAAC;wBACtE,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,UAAU,KAAK,mBAAmB;4BAAE,OAAO,EAAE,CAAC;wBAE5D,IAAA,2BAAc,EAAC,IAAI,EAAE,EAAC,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,gBAAgB,EAAC,CAAC,CAAC;wBAC1E,IAAA,8BAAiB,EAAC,IAAI,EAAE,eAAe,EAAE,mBAAmB,CAAC,CAAC;wBAE9D,OAAO,IAAA,sBAAY,EAAC,EAAE,EAAE,CAAM,KAAK,EAAC,EAAE;4BAClC,KAAK,CAAC,UAAU,GAAG,gBAAgB,CAAC;wBACxC,CAAC,CAAA,CAAC,CAAC;oBACP,CAAC;iBAAA;aACJ,EAAE,CAAC;QACR,CAAC;KAAA;CACJ;AArBD,4DAqBC"}
@@ -0,0 +1,14 @@
1
+ import { Recipe } from "@openrewrite/rewrite";
2
+ export declare class UpgradeToAngular22CodeChanges extends Recipe {
3
+ readonly name = "org.openrewrite.angular.UpgradeToAngular22CodeChanges";
4
+ readonly displayName = "Upgrade to Angular 22 (code changes)";
5
+ readonly description: string;
6
+ recipeList(): Promise<Recipe[]>;
7
+ }
8
+ export declare class UpgradeToAngular22 extends Recipe {
9
+ readonly name = "org.openrewrite.angular.UpgradeToAngular22";
10
+ readonly displayName = "Upgrade to Angular 22";
11
+ readonly description: string;
12
+ recipeList(): Promise<Recipe[]>;
13
+ }
14
+ //# sourceMappingURL=upgrade-to-angular-22.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade-to-angular-22.d.ts","sourceRoot":"","sources":["../../src/migration/upgrade-to-angular-22.ts"],"names":[],"mappings":"AAMA,OAAO,EAAC,MAAM,EAAC,MAAM,sBAAsB,CAAC;AAgB5C,qBAAa,6BAA8B,SAAQ,MAAM;IACrD,QAAQ,CAAC,IAAI,2DAA2D;IACxE,QAAQ,CAAC,WAAW,0CAA0C;IAC9D,QAAQ,CAAC,WAAW,SACkE;IAEhF,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;CAqBxC;AAED,qBAAa,kBAAmB,SAAQ,MAAM;IAC1C,QAAQ,CAAC,IAAI,gDAAgD;IAC7D,QAAQ,CAAC,WAAW,2BAA2B;IAC/C,QAAQ,CAAC,WAAW,SAGuF;IAErG,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;CAgBxC"}
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ /*
3
+ * Copyright 2026 the original author or authors.
4
+ *
5
+ * Moderne Proprietary. Only for use by Moderne customers under the terms of a commercial contract.
6
+ */
7
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
8
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
9
+ return new (P || (P = Promise))(function (resolve, reject) {
10
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
11
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
12
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
13
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
14
+ });
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.UpgradeToAngular22 = exports.UpgradeToAngular22CodeChanges = void 0;
18
+ const rewrite_1 = require("@openrewrite/rewrite");
19
+ const javascript_1 = require("@openrewrite/rewrite/javascript");
20
+ const upgrade_to_angular_21_1 = require("./upgrade-to-angular-21");
21
+ const find_provide_routes_usage_1 = require("../search/find-provide-routes-usage");
22
+ const find_check_no_changes_usage_1 = require("../search/find-check-no-changes-usage");
23
+ const find_can_match_usage_1 = require("../search/find-can-match-usage");
24
+ const find_http_xhr_backend_usage_1 = require("../search/find-http-xhr-backend-usage");
25
+ const find_implicit_params_inheritance_1 = require("../search/find-implicit-params-inheritance");
26
+ const add_eager_change_detection_1 = require("./add-eager-change-detection");
27
+ const rename_default_change_detection_1 = require("./rename-default-change-detection");
28
+ const add_no_incremental_hydration_1 = require("./add-no-incremental-hydration");
29
+ const add_strict_templates_false_1 = require("./add-strict-templates-false");
30
+ const remove_with_fetch_1 = require("./remove-with-fetch");
31
+ const replace_create_ng_module_ref_1 = require("./replace-create-ng-module-ref");
32
+ const rename_angular_js_globals_1 = require("./rename-angular-js-globals");
33
+ class UpgradeToAngular22CodeChanges extends rewrite_1.Recipe {
34
+ constructor() {
35
+ super(...arguments);
36
+ this.name = "org.openrewrite.angular.UpgradeToAngular22CodeChanges";
37
+ this.displayName = "Upgrade to Angular 22 (code changes)";
38
+ this.description = "The source changes of the Angular 22 migration, without the dependency version bumps. " +
39
+ "Use `UpgradeToAngular22` unless you are composing a migration to a later major.";
40
+ }
41
+ recipeList() {
42
+ return __awaiter(this, void 0, void 0, function* () {
43
+ return [
44
+ new upgrade_to_angular_21_1.UpgradeToAngular21CodeChanges(),
45
+ // Removed and behaviorally changed APIs that need human review
46
+ new find_provide_routes_usage_1.FindProvideRoutesUsage(),
47
+ new find_check_no_changes_usage_1.FindCheckNoChangesUsage(),
48
+ new find_can_match_usage_1.FindCanMatchUsage(),
49
+ new find_http_xhr_backend_usage_1.FindHttpXhrBackendUsage(),
50
+ new find_implicit_params_inheritance_1.FindImplicitParamsInheritance(),
51
+ // Change detection defaults
52
+ new add_eager_change_detection_1.AddEagerChangeDetection(),
53
+ new rename_default_change_detection_1.RenameDefaultChangeDetection(),
54
+ // Hydration and template type checking defaults
55
+ new add_no_incremental_hydration_1.AddNoIncrementalHydration(),
56
+ new add_strict_templates_false_1.AddStrictTemplatesFalse(),
57
+ // Removed and deprecated APIs
58
+ new remove_with_fetch_1.RemoveWithFetch(),
59
+ new replace_create_ng_module_ref_1.ReplaceCreateNgModuleRef(),
60
+ new rename_angular_js_globals_1.RenameAngularJsGlobals(),
61
+ ];
62
+ });
63
+ }
64
+ }
65
+ exports.UpgradeToAngular22CodeChanges = UpgradeToAngular22CodeChanges;
66
+ class UpgradeToAngular22 extends rewrite_1.Recipe {
67
+ constructor() {
68
+ super(...arguments);
69
+ this.name = "org.openrewrite.angular.UpgradeToAngular22";
70
+ this.displayName = "Upgrade to Angular 22";
71
+ this.description = "Migrates Angular 21.x applications to Angular 22. " +
72
+ "This includes running the Angular 21 migration first, making the pre-existing change detection, " +
73
+ "incremental hydration, and strict template defaults explicit, replacing APIs removed in Angular 22, " +
74
+ "flagging the router and `HttpClient` behavior changes for review, and upgrading TypeScript to 6.0.x.";
75
+ }
76
+ recipeList() {
77
+ return __awaiter(this, void 0, void 0, function* () {
78
+ return [
79
+ new UpgradeToAngular22CodeChanges(),
80
+ // Angular core packages
81
+ yield (0, javascript_1.upgradeDependencyVersion)({ packagePattern: "@angular/*", newVersion: "22.x" }),
82
+ // Angular DevKit; `architect` and `build-webpack` kept the 0.<major><minor>.x CLI scheme
83
+ yield (0, javascript_1.upgradeDependencyVersion)({ packageName: "@angular-devkit/core", newVersion: "22.x" }),
84
+ yield (0, javascript_1.upgradeDependencyVersion)({ packagePattern: "@angular-devkit/s*", newVersion: "22.x" }),
85
+ yield (0, javascript_1.upgradeDependencyVersion)({ packageName: "@angular-devkit/build-angular", newVersion: "22.x" }),
86
+ yield (0, javascript_1.upgradeDependencyVersion)({ packagePattern: "@angular-devkit/architect*", newVersion: "0.2201.x" }),
87
+ yield (0, javascript_1.upgradeDependencyVersion)({ packageName: "@angular-devkit/build-webpack", newVersion: "0.2201.x" }),
88
+ yield (0, javascript_1.upgradeDependencyVersion)({ packageName: "@schematics/angular", newVersion: "22.x" }),
89
+ // TypeScript
90
+ yield (0, javascript_1.upgradeDependencyVersion)({ packageName: "typescript", newVersion: "6.0.x" }),
91
+ ];
92
+ });
93
+ }
94
+ }
95
+ exports.UpgradeToAngular22 = UpgradeToAngular22;
96
+ //# sourceMappingURL=upgrade-to-angular-22.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade-to-angular-22.js","sourceRoot":"","sources":["../../src/migration/upgrade-to-angular-22.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;;AAEH,kDAA4C;AAC5C,gEAAyE;AACzE,mEAAsE;AACtE,mFAA2E;AAC3E,uFAA8E;AAC9E,yEAAiE;AACjE,uFAA8E;AAC9E,iGAAyF;AACzF,6EAAqE;AACrE,uFAA+E;AAC/E,iFAAyE;AACzE,6EAAqE;AACrE,2DAAoD;AACpD,iFAAwE;AACxE,2EAAmE;AAEnE,MAAa,6BAA8B,SAAQ,gBAAM;IAAzD;;QACa,SAAI,GAAG,uDAAuD,CAAC;QAC/D,gBAAW,GAAG,sCAAsC,CAAC;QACrD,gBAAW,GAAG,wFAAwF;YAC3G,iFAAiF,CAAC;IAuB1F,CAAC;IArBS,UAAU;;YACZ,OAAO;gBACH,IAAI,qDAA6B,EAAE;gBACnC,+DAA+D;gBAC/D,IAAI,kDAAsB,EAAE;gBAC5B,IAAI,qDAAuB,EAAE;gBAC7B,IAAI,wCAAiB,EAAE;gBACvB,IAAI,qDAAuB,EAAE;gBAC7B,IAAI,gEAA6B,EAAE;gBACnC,4BAA4B;gBAC5B,IAAI,oDAAuB,EAAE;gBAC7B,IAAI,8DAA4B,EAAE;gBAClC,gDAAgD;gBAChD,IAAI,wDAAyB,EAAE;gBAC/B,IAAI,oDAAuB,EAAE;gBAC7B,8BAA8B;gBAC9B,IAAI,mCAAe,EAAE;gBACrB,IAAI,uDAAwB,EAAE;gBAC9B,IAAI,kDAAsB,EAAE;aAC/B,CAAC;QACN,CAAC;KAAA;CACJ;AA3BD,sEA2BC;AAED,MAAa,kBAAmB,SAAQ,gBAAM;IAA9C;;QACa,SAAI,GAAG,4CAA4C,CAAC;QACpD,gBAAW,GAAG,uBAAuB,CAAC;QACtC,gBAAW,GAAG,oDAAoD;YACvE,kGAAkG;YAClG,sGAAsG;YACtG,sGAAsG,CAAC;IAkB/G,CAAC;IAhBS,UAAU;;YACZ,OAAO;gBACH,IAAI,6BAA6B,EAAE;gBACnC,wBAAwB;gBACxB,MAAM,IAAA,qCAAwB,EAAC,EAAC,cAAc,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAC,CAAC;gBAClF,yFAAyF;gBACzF,MAAM,IAAA,qCAAwB,EAAC,EAAC,WAAW,EAAE,sBAAsB,EAAE,UAAU,EAAE,MAAM,EAAC,CAAC;gBACzF,MAAM,IAAA,qCAAwB,EAAC,EAAC,cAAc,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,EAAC,CAAC;gBAC1F,MAAM,IAAA,qCAAwB,EAAC,EAAC,WAAW,EAAE,+BAA+B,EAAE,UAAU,EAAE,MAAM,EAAC,CAAC;gBAClG,MAAM,IAAA,qCAAwB,EAAC,EAAC,cAAc,EAAE,4BAA4B,EAAE,UAAU,EAAE,UAAU,EAAC,CAAC;gBACtG,MAAM,IAAA,qCAAwB,EAAC,EAAC,WAAW,EAAE,+BAA+B,EAAE,UAAU,EAAE,UAAU,EAAC,CAAC;gBACtG,MAAM,IAAA,qCAAwB,EAAC,EAAC,WAAW,EAAE,qBAAqB,EAAE,UAAU,EAAE,MAAM,EAAC,CAAC;gBACxF,aAAa;gBACb,MAAM,IAAA,qCAAwB,EAAC,EAAC,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,OAAO,EAAC,CAAC;aACnF,CAAC;QACN,CAAC;KAAA;CACJ;AAxBD,gDAwBC"}
@@ -0,0 +1,8 @@
1
+ import { ExecutionContext, Recipe, TreeVisitor } from "@openrewrite/rewrite";
2
+ export declare class FindCanMatchUsage extends Recipe {
3
+ readonly name = "org.openrewrite.angular.search.find-can-match-usage";
4
+ readonly displayName: string;
5
+ readonly description: string;
6
+ editor(): Promise<TreeVisitor<any, ExecutionContext>>;
7
+ }
8
+ //# sourceMappingURL=find-can-match-usage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-can-match-usage.d.ts","sourceRoot":"","sources":["../../src/search/find-can-match-usage.ts"],"names":[],"mappings":"AAMA,OAAO,EAAC,gBAAgB,EAAqB,MAAM,EAAE,WAAW,EAAC,MAAM,sBAAsB,CAAC;AAM9F,qBAAa,iBAAkB,SAAQ,MAAM;IACzC,QAAQ,CAAC,IAAI,yDAAyD;IACtE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAiC;IAC7D,QAAQ,CAAC,WAAW,EAAE,MAAM,CAC8F;IAEpH,MAAM,IAAI,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;CA0B9D"}
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ /*
3
+ * Copyright 2026 the original author or authors.
4
+ *
5
+ * Moderne Proprietary. Only for use by Moderne customers under the terms of a commercial contract.
6
+ */
7
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
8
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
9
+ return new (P || (P = Promise))(function (resolve, reject) {
10
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
11
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
12
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
13
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
14
+ });
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.FindCanMatchUsage = void 0;
18
+ const rewrite_1 = require("@openrewrite/rewrite");
19
+ const javascript_1 = require("@openrewrite/rewrite/javascript");
20
+ const java_1 = require("@openrewrite/rewrite/java");
21
+ const CAN_MATCH_TYPES = ['CanMatch', 'CanMatchFn'];
22
+ class FindCanMatchUsage extends rewrite_1.Recipe {
23
+ constructor() {
24
+ super(...arguments);
25
+ this.name = "org.openrewrite.angular.search.find-can-match-usage";
26
+ this.displayName = "Find `CanMatch` guard usage";
27
+ this.description = "Finds imports of `CanMatch` and `CanMatchFn` from `@angular/router`. " +
28
+ "In Angular 22 the `currentSnapshot` parameter became required, so class based guards must declare a third argument.";
29
+ }
30
+ editor() {
31
+ return __awaiter(this, void 0, void 0, function* () {
32
+ return new class extends javascript_1.JavaScriptVisitor {
33
+ visitImportDeclaration(jsImport, p) {
34
+ const _super = Object.create(null, {
35
+ visitImportDeclaration: { get: () => super.visitImportDeclaration }
36
+ });
37
+ return __awaiter(this, void 0, void 0, function* () {
38
+ var _a;
39
+ const imp = yield _super.visitImportDeclaration.call(this, jsImport, p);
40
+ if (!imp.moduleSpecifier)
41
+ return imp;
42
+ const moduleSpec = imp.moduleSpecifier.element;
43
+ if (moduleSpec.kind !== java_1.J.Kind.Literal)
44
+ return imp;
45
+ if (moduleSpec.value !== '@angular/router')
46
+ return imp;
47
+ const namedBindings = (_a = imp.importClause) === null || _a === void 0 ? void 0 : _a.namedBindings;
48
+ if ((namedBindings === null || namedBindings === void 0 ? void 0 : namedBindings.kind) === javascript_1.JS.Kind.NamedImports) {
49
+ const named = namedBindings;
50
+ for (const specifier of named.elements.elements) {
51
+ const spec = specifier.element;
52
+ if ((0, java_1.isIdentifier)(spec.specifier) && CAN_MATCH_TYPES.includes(spec.specifier.simpleName)) {
53
+ return (0, rewrite_1.foundSearchResult)(imp, "The currentSnapshot parameter of CanMatchFn is required as of Angular 22; class implementations of CanMatch must declare the third argument.");
54
+ }
55
+ }
56
+ }
57
+ return imp;
58
+ });
59
+ }
60
+ };
61
+ });
62
+ }
63
+ }
64
+ exports.FindCanMatchUsage = FindCanMatchUsage;
65
+ //# sourceMappingURL=find-can-match-usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-can-match-usage.js","sourceRoot":"","sources":["../../src/search/find-can-match-usage.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;;AAEH,kDAA8F;AAC9F,gEAAsE;AACtE,oDAA0D;AAE1D,MAAM,eAAe,GAAG,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;AAEnD,MAAa,iBAAkB,SAAQ,gBAAM;IAA7C;;QACa,SAAI,GAAG,qDAAqD,CAAC;QAC7D,gBAAW,GAAW,6BAA6B,CAAC;QACpD,gBAAW,GAAW,uEAAuE;YAClG,qHAAqH,CAAC;IA4B9H,CAAC;IA1BS,MAAM;;YACR,OAAO,IAAI,KAAM,SAAQ,8BAAmC;gBACxC,sBAAsB,CAAC,QAAmB,EAAE,CAAmB;;;;;;wBAC3E,MAAM,GAAG,GAAG,MAAM,OAAM,sBAAsB,YAAC,QAAQ,EAAE,CAAC,CAAc,CAAC;wBACzE,IAAI,CAAC,GAAG,CAAC,eAAe;4BAAE,OAAO,GAAG,CAAC;wBAErC,MAAM,UAAU,GAAG,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC;wBAC/C,IAAI,UAAU,CAAC,IAAI,KAAK,QAAC,CAAC,IAAI,CAAC,OAAO;4BAAE,OAAO,GAAG,CAAC;wBACnD,IAAK,UAAwB,CAAC,KAAK,KAAK,iBAAiB;4BAAE,OAAO,GAAG,CAAC;wBAEtE,MAAM,aAAa,GAAG,MAAA,GAAG,CAAC,YAAY,0CAAE,aAAa,CAAC;wBACtD,IAAI,CAAA,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,IAAI,MAAK,eAAE,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;4BAC/C,MAAM,KAAK,GAAG,aAAgC,CAAC;4BAC/C,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;gCAC9C,MAAM,IAAI,GAAG,SAAS,CAAC,OAA6B,CAAC;gCACrD,IAAI,IAAA,mBAAY,EAAC,IAAI,CAAC,SAAS,CAAC,IAAI,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;oCACtF,OAAO,IAAA,2BAAiB,EAAC,GAAG,EACxB,8IAA8I,CAAC,CAAC;gCACxJ,CAAC;4BACL,CAAC;wBACL,CAAC;wBAED,OAAO,GAAG,CAAC;oBACf,CAAC;iBAAA;aACJ,CAAC;QACN,CAAC;KAAA;CACJ;AAhCD,8CAgCC"}
@@ -0,0 +1,8 @@
1
+ import { ExecutionContext, Recipe, TreeVisitor } from "@openrewrite/rewrite";
2
+ export declare class FindCheckNoChangesUsage extends Recipe {
3
+ readonly name = "org.openrewrite.angular.search.find-check-no-changes-usage";
4
+ readonly displayName: string;
5
+ readonly description: string;
6
+ editor(): Promise<TreeVisitor<any, ExecutionContext>>;
7
+ }
8
+ //# sourceMappingURL=find-check-no-changes-usage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-check-no-changes-usage.d.ts","sourceRoot":"","sources":["../../src/search/find-check-no-changes-usage.ts"],"names":[],"mappings":"AAMA,OAAO,EAAC,gBAAgB,EAAqB,MAAM,EAAE,WAAW,EAAC,MAAM,sBAAsB,CAAC;AAI9F,qBAAa,uBAAwB,SAAQ,MAAM;IAC/C,QAAQ,CAAC,IAAI,gEAAgE;IAC7E,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAmD;IAC/E,QAAQ,CAAC,WAAW,EAAE,MAAM,CAC2B;IAEjD,MAAM,IAAI,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;CAY9D"}
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ /*
3
+ * Copyright 2026 the original author or authors.
4
+ *
5
+ * Moderne Proprietary. Only for use by Moderne customers under the terms of a commercial contract.
6
+ */
7
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
8
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
9
+ return new (P || (P = Promise))(function (resolve, reject) {
10
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
11
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
12
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
13
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
14
+ });
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.FindCheckNoChangesUsage = void 0;
18
+ const rewrite_1 = require("@openrewrite/rewrite");
19
+ const javascript_1 = require("@openrewrite/rewrite/javascript");
20
+ const java_1 = require("@openrewrite/rewrite/java");
21
+ class FindCheckNoChangesUsage extends rewrite_1.Recipe {
22
+ constructor() {
23
+ super(...arguments);
24
+ this.name = "org.openrewrite.angular.search.find-check-no-changes-usage";
25
+ this.displayName = "Find `ChangeDetectorRef.checkNoChanges` usage";
26
+ this.description = "Finds calls to `checkNoChanges()`, which was removed from `ChangeDetectorRef` in Angular 22. " +
27
+ "In tests, use `fixture.detectChanges()` instead.";
28
+ }
29
+ editor() {
30
+ return __awaiter(this, void 0, void 0, function* () {
31
+ return new class extends javascript_1.JavaScriptVisitor {
32
+ visitMethodInvocation(method, p) {
33
+ const _super = Object.create(null, {
34
+ visitMethodInvocation: { get: () => super.visitMethodInvocation }
35
+ });
36
+ return __awaiter(this, void 0, void 0, function* () {
37
+ const m = yield _super.visitMethodInvocation.call(this, method, p);
38
+ if (!m || !m.select)
39
+ return m;
40
+ if (!(0, java_1.isIdentifier)(m.name) || m.name.simpleName !== 'checkNoChanges')
41
+ return m;
42
+ return (0, rewrite_1.foundSearchResult)(m, "ChangeDetectorRef.checkNoChanges() was removed in Angular 22. Use fixture.detectChanges() in tests instead.");
43
+ });
44
+ }
45
+ };
46
+ });
47
+ }
48
+ }
49
+ exports.FindCheckNoChangesUsage = FindCheckNoChangesUsage;
50
+ //# sourceMappingURL=find-check-no-changes-usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-check-no-changes-usage.js","sourceRoot":"","sources":["../../src/search/find-check-no-changes-usage.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;;AAEH,kDAA8F;AAC9F,gEAAkE;AAClE,oDAA0D;AAE1D,MAAa,uBAAwB,SAAQ,gBAAM;IAAnD;;QACa,SAAI,GAAG,4DAA4D,CAAC;QACpE,gBAAW,GAAW,+CAA+C,CAAC;QACtE,gBAAW,GAAW,+FAA+F;YAC1H,kDAAkD,CAAC;IAc3D,CAAC;IAZS,MAAM;;YACR,OAAO,IAAI,KAAM,SAAQ,8BAAmC;gBACzC,qBAAqB,CAAC,MAA0B,EAAE,CAAmB;;;;;wBAChF,MAAM,CAAC,GAAG,MAAM,OAAM,qBAAqB,YAAC,MAAM,EAAE,CAAC,CAAuB,CAAC;wBAC7E,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM;4BAAE,OAAO,CAAC,CAAC;wBAC9B,IAAI,CAAC,IAAA,mBAAY,EAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,KAAK,gBAAgB;4BAAE,OAAO,CAAC,CAAC;wBAE9E,OAAO,IAAA,2BAAiB,EAAC,CAAC,EACtB,6GAA6G,CAAC,CAAC;oBACvH,CAAC;iBAAA;aACJ,CAAC;QACN,CAAC;KAAA;CACJ;AAlBD,0DAkBC"}
@@ -0,0 +1,8 @@
1
+ import { ExecutionContext, Recipe, TreeVisitor } from "@openrewrite/rewrite";
2
+ export declare class FindHttpXhrBackendUsage extends Recipe {
3
+ readonly name = "org.openrewrite.angular.search.find-http-xhr-backend-usage";
4
+ readonly displayName: string;
5
+ readonly description: string;
6
+ editor(): Promise<TreeVisitor<any, ExecutionContext>>;
7
+ }
8
+ //# sourceMappingURL=find-http-xhr-backend-usage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-http-xhr-backend-usage.d.ts","sourceRoot":"","sources":["../../src/search/find-http-xhr-backend-usage.ts"],"names":[],"mappings":"AAMA,OAAO,EAAC,gBAAgB,EAAqB,MAAM,EAAE,WAAW,EAAC,MAAM,sBAAsB,CAAC;AAI9F,qBAAa,uBAAwB,SAAQ,MAAM;IAC/C,QAAQ,CAAC,IAAI,gEAAgE;IAC7E,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAiC;IAC7D,QAAQ,CAAC,WAAW,EAAE,MAAM,CAE8B;IAEpD,MAAM,IAAI,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;CA0B9D"}