@openrewrite/recipes-angular 1.9.0 → 1.10.0-20260813-195315

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 (120) hide show
  1. package/dist/index.d.ts +20 -0
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +84 -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 +130 -0
  8. package/dist/migration/add-eager-change-detection.js.map +1 -0
  9. package/dist/migration/add-istanbul-instrumenter.d.ts +8 -0
  10. package/dist/migration/add-istanbul-instrumenter.d.ts.map +1 -0
  11. package/dist/migration/add-istanbul-instrumenter.js +80 -0
  12. package/dist/migration/add-istanbul-instrumenter.js.map +1 -0
  13. package/dist/migration/add-no-incremental-hydration.d.ts +8 -0
  14. package/dist/migration/add-no-incremental-hydration.d.ts.map +1 -0
  15. package/dist/migration/add-no-incremental-hydration.js +69 -0
  16. package/dist/migration/add-no-incremental-hydration.js.map +1 -0
  17. package/dist/migration/add-strict-templates-false.d.ts +8 -0
  18. package/dist/migration/add-strict-templates-false.d.ts.map +1 -0
  19. package/dist/migration/add-strict-templates-false.js +84 -0
  20. package/dist/migration/add-strict-templates-false.js.map +1 -0
  21. package/dist/migration/add-trust-proxy-headers.d.ts +8 -0
  22. package/dist/migration/add-trust-proxy-headers.d.ts.map +1 -0
  23. package/dist/migration/add-trust-proxy-headers.js +82 -0
  24. package/dist/migration/add-trust-proxy-headers.js.map +1 -0
  25. package/dist/migration/add-with-xhr.d.ts +8 -0
  26. package/dist/migration/add-with-xhr.d.ts.map +1 -0
  27. package/dist/migration/add-with-xhr.js +70 -0
  28. package/dist/migration/add-with-xhr.js.map +1 -0
  29. package/dist/migration/js-support.d.ts +6 -0
  30. package/dist/migration/js-support.d.ts.map +1 -0
  31. package/dist/migration/js-support.js +94 -0
  32. package/dist/migration/js-support.js.map +1 -0
  33. package/dist/migration/json-support.d.ts +19 -0
  34. package/dist/migration/json-support.d.ts.map +1 -0
  35. package/dist/migration/json-support.js +117 -0
  36. package/dist/migration/json-support.js.map +1 -0
  37. package/dist/migration/migrate-input-to-signal.d.ts.map +1 -1
  38. package/dist/migration/migrate-input-to-signal.js +3 -67
  39. package/dist/migration/migrate-input-to-signal.js.map +1 -1
  40. package/dist/migration/migrate-model-with-output.d.ts +8 -0
  41. package/dist/migration/migrate-model-with-output.d.ts.map +1 -0
  42. package/dist/migration/migrate-model-with-output.js +192 -0
  43. package/dist/migration/migrate-model-with-output.js.map +1 -0
  44. package/dist/migration/remove-with-fetch.d.ts +8 -0
  45. package/dist/migration/remove-with-fetch.d.ts.map +1 -0
  46. package/dist/migration/remove-with-fetch.js +73 -0
  47. package/dist/migration/remove-with-fetch.js.map +1 -0
  48. package/dist/migration/rename-angular-js-globals.d.ts +8 -0
  49. package/dist/migration/rename-angular-js-globals.d.ts.map +1 -0
  50. package/dist/migration/rename-angular-js-globals.js +56 -0
  51. package/dist/migration/rename-angular-js-globals.js.map +1 -0
  52. package/dist/migration/rename-default-change-detection.d.ts +8 -0
  53. package/dist/migration/rename-default-change-detection.d.ts.map +1 -0
  54. package/dist/migration/rename-default-change-detection.js +52 -0
  55. package/dist/migration/rename-default-change-detection.js.map +1 -0
  56. package/dist/migration/rename-ssr-experimental-platform.d.ts +8 -0
  57. package/dist/migration/rename-ssr-experimental-platform.d.ts.map +1 -0
  58. package/dist/migration/rename-ssr-experimental-platform.js +124 -0
  59. package/dist/migration/rename-ssr-experimental-platform.js.map +1 -0
  60. package/dist/migration/replace-create-ng-module-ref.d.ts +8 -0
  61. package/dist/migration/replace-create-ng-module-ref.d.ts.map +1 -0
  62. package/dist/migration/replace-create-ng-module-ref.js +51 -0
  63. package/dist/migration/replace-create-ng-module-ref.js.map +1 -0
  64. package/dist/migration/suppress-safe-navigation-diagnostics.d.ts +8 -0
  65. package/dist/migration/suppress-safe-navigation-diagnostics.d.ts.map +1 -0
  66. package/dist/migration/suppress-safe-navigation-diagnostics.js +55 -0
  67. package/dist/migration/suppress-safe-navigation-diagnostics.js.map +1 -0
  68. package/dist/migration/upgrade-to-angular-22.d.ts +14 -0
  69. package/dist/migration/upgrade-to-angular-22.d.ts.map +1 -0
  70. package/dist/migration/upgrade-to-angular-22.js +112 -0
  71. package/dist/migration/upgrade-to-angular-22.js.map +1 -0
  72. package/dist/search/find-can-match-usage.d.ts +8 -0
  73. package/dist/search/find-can-match-usage.d.ts.map +1 -0
  74. package/dist/search/find-can-match-usage.js +53 -0
  75. package/dist/search/find-can-match-usage.js.map +1 -0
  76. package/dist/search/find-check-no-changes-usage.d.ts +8 -0
  77. package/dist/search/find-check-no-changes-usage.d.ts.map +1 -0
  78. package/dist/search/find-check-no-changes-usage.js +50 -0
  79. package/dist/search/find-check-no-changes-usage.js.map +1 -0
  80. package/dist/search/find-http-xhr-backend-usage.d.ts +8 -0
  81. package/dist/search/find-http-xhr-backend-usage.d.ts.map +1 -0
  82. package/dist/search/find-http-xhr-backend-usage.js +65 -0
  83. package/dist/search/find-http-xhr-backend-usage.js.map +1 -0
  84. package/dist/search/find-implicit-params-inheritance.d.ts +8 -0
  85. package/dist/search/find-implicit-params-inheritance.d.ts.map +1 -0
  86. package/dist/search/find-implicit-params-inheritance.js +74 -0
  87. package/dist/search/find-implicit-params-inheritance.js.map +1 -0
  88. package/dist/search/find-provide-routes-usage.d.ts +8 -0
  89. package/dist/search/find-provide-routes-usage.d.ts.map +1 -0
  90. package/dist/search/find-provide-routes-usage.js +64 -0
  91. package/dist/search/find-provide-routes-usage.js.map +1 -0
  92. package/dist/search/find-template-safe-navigation.d.ts +8 -0
  93. package/dist/search/find-template-safe-navigation.d.ts.map +1 -0
  94. package/dist/search/find-template-safe-navigation.js +105 -0
  95. package/dist/search/find-template-safe-navigation.js.map +1 -0
  96. package/package.json +1 -1
  97. package/src/index.ts +60 -0
  98. package/src/migration/add-eager-change-detection.ts +109 -0
  99. package/src/migration/add-istanbul-instrumenter.ts +62 -0
  100. package/src/migration/add-no-incremental-hydration.ts +49 -0
  101. package/src/migration/add-strict-templates-false.ts +62 -0
  102. package/src/migration/add-trust-proxy-headers.ts +61 -0
  103. package/src/migration/add-with-xhr.ts +50 -0
  104. package/src/migration/js-support.ts +92 -0
  105. package/src/migration/json-support.ts +119 -0
  106. package/src/migration/migrate-input-to-signal.ts +1 -67
  107. package/src/migration/migrate-model-with-output.ts +201 -0
  108. package/src/migration/remove-with-fetch.ts +53 -0
  109. package/src/migration/rename-angular-js-globals.ts +37 -0
  110. package/src/migration/rename-default-change-detection.ts +33 -0
  111. package/src/migration/rename-ssr-experimental-platform.ts +108 -0
  112. package/src/migration/replace-create-ng-module-ref.ts +32 -0
  113. package/src/migration/suppress-safe-navigation-diagnostics.ts +42 -0
  114. package/src/migration/upgrade-to-angular-22.ts +92 -0
  115. package/src/search/find-can-match-usage.ts +32 -0
  116. package/src/search/find-check-no-changes-usage.ts +29 -0
  117. package/src/search/find-http-xhr-backend-usage.ts +44 -0
  118. package/src/search/find-implicit-params-inheritance.ts +49 -0
  119. package/src/search/find-provide-routes-usage.ts +43 -0
  120. package/src/search/find-template-safe-navigation.ts +72 -0
@@ -0,0 +1,124 @@
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.RenameSsrExperimentalPlatform = void 0;
18
+ const rewrite_1 = require("@openrewrite/rewrite");
19
+ const json_1 = require("@openrewrite/rewrite/json");
20
+ const APPLICATION_BUILDERS = new Set([
21
+ '@angular-devkit/build-angular:application',
22
+ '@angular-devkit/build-angular:build-application',
23
+ '@angular/build:application',
24
+ '@angular/build:build-application',
25
+ ]);
26
+ class RenameSsrExperimentalPlatform extends rewrite_1.Recipe {
27
+ constructor() {
28
+ super(...arguments);
29
+ this.name = "org.openrewrite.angular.migration.rename-ssr-experimental-platform";
30
+ this.displayName = "Rename `ssr.experimentalPlatform` to `ssr.platform` in `angular.json`";
31
+ this.description = "Angular 22 renamed the `ssr.experimentalPlatform` builder option to `ssr.platform` on the " +
32
+ "`application` and `build-application` builders. Matches the `update-workspace-config` schematic.";
33
+ }
34
+ editor() {
35
+ return __awaiter(this, void 0, void 0, function* () {
36
+ return new class extends json_1.JsonVisitor {
37
+ visitDocument(doc, p) {
38
+ return __awaiter(this, void 0, void 0, function* () {
39
+ if (!doc.sourcePath.endsWith('angular.json'))
40
+ return doc;
41
+ const root = doc.value;
42
+ if (!(0, json_1.isObject)(root))
43
+ return doc;
44
+ const updated = mapProjects(root);
45
+ return updated === root ? doc : Object.assign(Object.assign({}, doc), { value: updated });
46
+ });
47
+ }
48
+ }();
49
+ });
50
+ }
51
+ }
52
+ exports.RenameSsrExperimentalPlatform = RenameSsrExperimentalPlatform;
53
+ function mapProjects(root) {
54
+ return mapObjectMember(root, 'projects', projects => mapObjectMembers(projects, project => mapProject(project)));
55
+ }
56
+ function mapProject(project) {
57
+ var _a;
58
+ if (((_a = findMember(project, 'projectType')) === null || _a === void 0 ? void 0 : _a.value) !== 'application')
59
+ return project;
60
+ return mapObjectMember(project, 'architect', architect => mapObjectMembers(architect, target => mapTarget(target)));
61
+ }
62
+ function mapTarget(target) {
63
+ var _a;
64
+ const builder = (_a = findMember(target, 'builder')) === null || _a === void 0 ? void 0 : _a.value;
65
+ if (typeof builder !== 'string' || !APPLICATION_BUILDERS.has(builder))
66
+ return target;
67
+ let updated = mapObjectMember(target, 'options', renameSsrPlatform);
68
+ updated = mapObjectMember(updated, 'configurations', configurations => mapObjectMembers(configurations, renameSsrPlatform));
69
+ return updated;
70
+ }
71
+ function renameSsrPlatform(options) {
72
+ return mapObjectMember(options, 'ssr', ssr => renameMember(ssr, 'experimentalPlatform', 'platform'));
73
+ }
74
+ /* ---------- small object helpers ---------- */
75
+ function findMember(obj, key) {
76
+ for (const rp of obj.members) {
77
+ if (!(0, json_1.isMember)(rp.element))
78
+ continue;
79
+ const m = rp.element;
80
+ if ((0, json_1.getMemberKeyName)(m) === key)
81
+ return { value: m.value.value, member: m };
82
+ }
83
+ return undefined;
84
+ }
85
+ function mapObjectMember(obj, key, fn) {
86
+ const members = obj.members.map(rp => {
87
+ if (!(0, json_1.isMember)(rp.element))
88
+ return rp;
89
+ const m = rp.element;
90
+ if ((0, json_1.getMemberKeyName)(m) !== key || !(0, json_1.isObject)(m.value))
91
+ return rp;
92
+ const updated = fn(m.value);
93
+ return updated === m.value ? rp : Object.assign(Object.assign({}, rp), { element: Object.assign(Object.assign({}, m), { value: updated }) });
94
+ });
95
+ return members.every((rp, i) => rp === obj.members[i]) ? obj : Object.assign(Object.assign({}, obj), { members });
96
+ }
97
+ function mapObjectMembers(obj, fn) {
98
+ const members = obj.members.map(rp => {
99
+ if (!(0, json_1.isMember)(rp.element))
100
+ return rp;
101
+ const m = rp.element;
102
+ if (!(0, json_1.isObject)(m.value))
103
+ return rp;
104
+ const updated = fn(m.value);
105
+ return updated === m.value ? rp : Object.assign(Object.assign({}, rp), { element: Object.assign(Object.assign({}, m), { value: updated }) });
106
+ });
107
+ return members.every((rp, i) => rp === obj.members[i]) ? obj : Object.assign(Object.assign({}, obj), { members });
108
+ }
109
+ function renameMember(obj, from, to) {
110
+ // If the target key already exists, leave the object alone rather than clobbering it.
111
+ if (findMember(obj, to))
112
+ return obj;
113
+ const members = obj.members.map(rp => {
114
+ if (!(0, json_1.isMember)(rp.element))
115
+ return rp;
116
+ const m = rp.element;
117
+ if ((0, json_1.getMemberKeyName)(m) !== from)
118
+ return rp;
119
+ const newKey = Object.assign(Object.assign({}, m.key.element), { source: `"${to}"`, value: to });
120
+ return Object.assign(Object.assign({}, rp), { element: Object.assign(Object.assign({}, m), { key: Object.assign(Object.assign({}, m.key), { element: newKey }) }) });
121
+ });
122
+ return members.every((rp, i) => rp === obj.members[i]) ? obj : Object.assign(Object.assign({}, obj), { members });
123
+ }
124
+ //# sourceMappingURL=rename-ssr-experimental-platform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rename-ssr-experimental-platform.js","sourceRoot":"","sources":["../../src/migration/rename-ssr-experimental-platform.ts"],"names":[],"mappings":"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"}
@@ -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,8 @@
1
+ import { ExecutionContext, Recipe, TreeVisitor } from "@openrewrite/rewrite";
2
+ export declare class SuppressSafeNavigationDiagnostics extends Recipe {
3
+ readonly name = "org.openrewrite.angular.migration.suppress-safe-navigation-diagnostics";
4
+ readonly displayName: string;
5
+ readonly description: string;
6
+ editor(): Promise<TreeVisitor<any, ExecutionContext>>;
7
+ }
8
+ //# sourceMappingURL=suppress-safe-navigation-diagnostics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suppress-safe-navigation-diagnostics.d.ts","sourceRoot":"","sources":["../../src/migration/suppress-safe-navigation-diagnostics.ts"],"names":[],"mappings":"AAMA,OAAO,EAAC,gBAAgB,EAAE,MAAM,EAAE,WAAW,EAAC,MAAM,sBAAsB,CAAC;AAM3E,qBAAa,iCAAkC,SAAQ,MAAM;IACzD,QAAQ,CAAC,IAAI,4EAA4E;IACzF,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAuD;IACnF,QAAQ,CAAC,WAAW,EAAE,MAAM,CAE4F;IAElH,MAAM,IAAI,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;CAsB9D"}
@@ -0,0 +1,55 @@
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.SuppressSafeNavigationDiagnostics = void 0;
18
+ const rewrite_1 = require("@openrewrite/rewrite");
19
+ const json_1 = require("@openrewrite/rewrite/json");
20
+ const json_support_1 = require("./json-support");
21
+ const SUPPRESSED_CHECKS = ['nullishCoalescingNotNullable', 'optionalChainNotNullable'];
22
+ class SuppressSafeNavigationDiagnostics extends rewrite_1.Recipe {
23
+ constructor() {
24
+ super(...arguments);
25
+ this.name = "org.openrewrite.angular.migration.suppress-safe-navigation-diagnostics";
26
+ this.displayName = "Suppress the safe navigation extended diagnostics";
27
+ this.description = "Sets the `nullishCoalescingNotNullable` and `optionalChainNotNullable` extended diagnostics to " +
28
+ "`suppress` in `angularCompilerOptions` in `tsconfig.json`. Angular 22 narrows types across safe navigation and " +
29
+ "nullish coalescing in templates, which makes both diagnostics fire on templates that previously compiled cleanly.";
30
+ }
31
+ editor() {
32
+ return __awaiter(this, void 0, void 0, function* () {
33
+ return new class extends json_1.JsonVisitor {
34
+ visitDocument(doc, p) {
35
+ return __awaiter(this, void 0, void 0, function* () {
36
+ if (!(0, json_support_1.isRootTsconfig)(doc.sourcePath) && !(0, json_support_1.declaresAngularCompilerOptions)(doc))
37
+ return doc;
38
+ const root = doc.value;
39
+ if (!(0, json_1.isObject)(root))
40
+ return doc;
41
+ const indentUnit = (0, json_1.detectIndent)(doc);
42
+ const indent = (0, json_support_1.memberIndent)(root, indentUnit);
43
+ let value = root;
44
+ for (const check of SUPPRESSED_CHECKS) {
45
+ value = (0, json_support_1.addMemberPath)(value, ['angularCompilerOptions', 'extendedDiagnostics', 'checks', check], (0, json_support_1.literal)('"suppress"', 'suppress'), indent, indentUnit);
46
+ }
47
+ return value === root ? doc : Object.assign(Object.assign({}, doc), { value });
48
+ });
49
+ }
50
+ }();
51
+ });
52
+ }
53
+ }
54
+ exports.SuppressSafeNavigationDiagnostics = SuppressSafeNavigationDiagnostics;
55
+ //# sourceMappingURL=suppress-safe-navigation-diagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suppress-safe-navigation-diagnostics.js","sourceRoot":"","sources":["../../src/migration/suppress-safe-navigation-diagnostics.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;;AAEH,kDAA2E;AAC3E,oDAAoF;AACpF,iDAAoH;AAEpH,MAAM,iBAAiB,GAAG,CAAC,8BAA8B,EAAE,0BAA0B,CAAC,CAAC;AAEvF,MAAa,iCAAkC,SAAQ,gBAAM;IAA7D;;QACa,SAAI,GAAG,wEAAwE,CAAC;QAChF,gBAAW,GAAW,mDAAmD,CAAC;QAC1E,gBAAW,GAAW,iGAAiG;YAC5H,iHAAiH;YACjH,mHAAmH,CAAC;IAwB5H,CAAC;IAtBS,MAAM;;YACR,OAAO,IAAI,KAAM,SAAQ,kBAA6B;gBAClC,aAAa,CAAC,GAAkB,EAAE,CAAmB;;wBACjE,IAAI,CAAC,IAAA,6BAAc,EAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAA,6CAA8B,EAAC,GAAG,CAAC;4BAAE,OAAO,GAAG,CAAC;wBAExF,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC;wBACvB,IAAI,CAAC,IAAA,eAAQ,EAAC,IAAI,CAAC;4BAAE,OAAO,GAAG,CAAC;wBAEhC,MAAM,UAAU,GAAG,IAAA,mBAAY,EAAC,GAAG,CAAC,CAAC;wBACrC,MAAM,MAAM,GAAG,IAAA,2BAAY,EAAC,IAAI,EAAE,UAAU,CAAC,CAAC;wBAE9C,IAAI,KAAK,GAAG,IAAI,CAAC;wBACjB,KAAK,MAAM,KAAK,IAAI,iBAAiB,EAAE,CAAC;4BACpC,KAAK,GAAG,IAAA,4BAAa,EAAC,KAAK,EACvB,CAAC,wBAAwB,EAAE,qBAAqB,EAAE,QAAQ,EAAE,KAAK,CAAC,EAClE,IAAA,sBAAO,EAAC,YAAY,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;wBAC/D,CAAC;wBAED,OAAO,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,gCAAI,GAAG,KAAE,KAAK,GAAkB,CAAC;oBACnE,CAAC;iBAAA;aACJ,EAAE,CAAC;QACR,CAAC;KAAA;CACJ;AA7BD,8EA6BC"}
@@ -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;AAsB5C,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;CA8BxC;AAED,qBAAa,kBAAmB,SAAQ,MAAM;IAC1C,QAAQ,CAAC,IAAI,gDAAgD;IAC7D,QAAQ,CAAC,WAAW,2BAA2B;IAC/C,QAAQ,CAAC,WAAW,SAIiB;IAE/B,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;CAgBxC"}
@@ -0,0 +1,112 @@
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 suppress_safe_navigation_diagnostics_1 = require("./suppress-safe-navigation-diagnostics");
31
+ const add_with_xhr_1 = require("./add-with-xhr");
32
+ const add_trust_proxy_headers_1 = require("./add-trust-proxy-headers");
33
+ const add_istanbul_instrumenter_1 = require("./add-istanbul-instrumenter");
34
+ const migrate_model_with_output_1 = require("./migrate-model-with-output");
35
+ const find_template_safe_navigation_1 = require("../search/find-template-safe-navigation");
36
+ const replace_create_ng_module_ref_1 = require("./replace-create-ng-module-ref");
37
+ const rename_angular_js_globals_1 = require("./rename-angular-js-globals");
38
+ const rename_ssr_experimental_platform_1 = require("./rename-ssr-experimental-platform");
39
+ class UpgradeToAngular22CodeChanges extends rewrite_1.Recipe {
40
+ constructor() {
41
+ super(...arguments);
42
+ this.name = "org.openrewrite.angular.UpgradeToAngular22CodeChanges";
43
+ this.displayName = "Upgrade to Angular 22 (code changes)";
44
+ this.description = "The source changes of the Angular 22 migration, without the dependency version bumps. " +
45
+ "Use `UpgradeToAngular22` unless you are composing a migration to a later major.";
46
+ }
47
+ recipeList() {
48
+ return __awaiter(this, void 0, void 0, function* () {
49
+ return [
50
+ new upgrade_to_angular_21_1.UpgradeToAngular21CodeChanges(),
51
+ // Removed and behaviorally changed APIs that need human review
52
+ new find_provide_routes_usage_1.FindProvideRoutesUsage(),
53
+ new find_check_no_changes_usage_1.FindCheckNoChangesUsage(),
54
+ new find_can_match_usage_1.FindCanMatchUsage(),
55
+ new find_http_xhr_backend_usage_1.FindHttpXhrBackendUsage(),
56
+ new find_implicit_params_inheritance_1.FindImplicitParamsInheritance(),
57
+ new find_template_safe_navigation_1.FindTemplateSafeNavigation(),
58
+ // Change detection defaults
59
+ new add_eager_change_detection_1.AddEagerChangeDetection(),
60
+ new rename_default_change_detection_1.RenameDefaultChangeDetection(),
61
+ // `HttpClient` backend default. `RemoveWithFetch` deliberately does not run here: dropping
62
+ // `withFetch()` would leave a call that `AddWithXhr` then flips onto the XHR backend.
63
+ new add_with_xhr_1.AddWithXhr(),
64
+ // Hydration and template type checking defaults
65
+ new add_no_incremental_hydration_1.AddNoIncrementalHydration(),
66
+ new add_strict_templates_false_1.AddStrictTemplatesFalse(),
67
+ new suppress_safe_navigation_diagnostics_1.SuppressSafeNavigationDiagnostics(),
68
+ // Server rendering and test tooling
69
+ new add_trust_proxy_headers_1.AddTrustProxyHeaders(),
70
+ new rename_ssr_experimental_platform_1.RenameSsrExperimentalPlatform(),
71
+ new add_istanbul_instrumenter_1.AddIstanbulInstrumenter(),
72
+ // Removed and deprecated APIs
73
+ new migrate_model_with_output_1.MigrateModelWithOutput(),
74
+ new replace_create_ng_module_ref_1.ReplaceCreateNgModuleRef(),
75
+ new rename_angular_js_globals_1.RenameAngularJsGlobals(),
76
+ ];
77
+ });
78
+ }
79
+ }
80
+ exports.UpgradeToAngular22CodeChanges = UpgradeToAngular22CodeChanges;
81
+ class UpgradeToAngular22 extends rewrite_1.Recipe {
82
+ constructor() {
83
+ super(...arguments);
84
+ this.name = "org.openrewrite.angular.UpgradeToAngular22";
85
+ this.displayName = "Upgrade to Angular 22";
86
+ this.description = "Migrates Angular 21.x applications to Angular 22. " +
87
+ "This includes running the Angular 21 migration first, making the pre-existing change detection, " +
88
+ "`HttpClient` backend, incremental hydration, strict template, and safe navigation diagnostic defaults " +
89
+ "explicit, replacing APIs removed in Angular 22, flagging the router behavior changes for review, and " +
90
+ "upgrading TypeScript to 6.0.x.";
91
+ }
92
+ recipeList() {
93
+ return __awaiter(this, void 0, void 0, function* () {
94
+ return [
95
+ new UpgradeToAngular22CodeChanges(),
96
+ // Angular core packages
97
+ yield (0, javascript_1.upgradeDependencyVersion)({ packagePattern: "@angular/*", newVersion: "22.x" }),
98
+ // Angular DevKit; `architect` and `build-webpack` kept the 0.<major><minor>.x CLI scheme
99
+ yield (0, javascript_1.upgradeDependencyVersion)({ packageName: "@angular-devkit/core", newVersion: "22.x" }),
100
+ yield (0, javascript_1.upgradeDependencyVersion)({ packagePattern: "@angular-devkit/s*", newVersion: "22.x" }),
101
+ yield (0, javascript_1.upgradeDependencyVersion)({ packageName: "@angular-devkit/build-angular", newVersion: "22.x" }),
102
+ yield (0, javascript_1.upgradeDependencyVersion)({ packagePattern: "@angular-devkit/architect*", newVersion: "0.2201.x" }),
103
+ yield (0, javascript_1.upgradeDependencyVersion)({ packageName: "@angular-devkit/build-webpack", newVersion: "0.2201.x" }),
104
+ yield (0, javascript_1.upgradeDependencyVersion)({ packageName: "@schematics/angular", newVersion: "22.x" }),
105
+ // TypeScript
106
+ yield (0, javascript_1.upgradeDependencyVersion)({ packageName: "typescript", newVersion: "6.0.x" }),
107
+ ];
108
+ });
109
+ }
110
+ }
111
+ exports.UpgradeToAngular22 = UpgradeToAngular22;
112
+ //# 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":"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"}
@@ -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;AAI9F,qBAAa,iBAAkB,SAAQ,MAAM;IACzC,QAAQ,CAAC,IAAI,yDAAyD;IACtE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAA8C;IAC1E,QAAQ,CAAC,WAAW,EAAE,MAAM,CAEkD;IAExE,MAAM,IAAI,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;CAc9D"}
@@ -0,0 +1,53 @@
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
+ class FindCanMatchUsage extends rewrite_1.Recipe {
22
+ constructor() {
23
+ super(...arguments);
24
+ this.name = "org.openrewrite.angular.search.find-can-match-usage";
25
+ this.displayName = "Find two argument `canMatch` guard calls";
26
+ this.description = "Finds calls to a `canMatch` guard that pass only a route and its segments. " +
27
+ "Angular 22 made the `currentSnapshot` parameter of `CanMatch` and `CanMatchFn` required, so those calls no longer compile. " +
28
+ "Guards that declare fewer parameters keep working and are not reported.";
29
+ }
30
+ editor() {
31
+ return __awaiter(this, void 0, void 0, function* () {
32
+ return new class extends javascript_1.JavaScriptVisitor {
33
+ visitMethodInvocation(method, p) {
34
+ const _super = Object.create(null, {
35
+ visitMethodInvocation: { get: () => super.visitMethodInvocation }
36
+ });
37
+ return __awaiter(this, void 0, void 0, function* () {
38
+ var _a, _b;
39
+ const m = yield _super.visitMethodInvocation.call(this, method, p);
40
+ if (!m || !(0, java_1.isIdentifier)(m.name) || m.name.simpleName !== 'canMatch')
41
+ return m;
42
+ const args = ((_b = (_a = m.arguments) === null || _a === void 0 ? void 0 : _a.elements) !== null && _b !== void 0 ? _b : []).filter(rp => rp.element.kind !== java_1.J.Kind.Empty);
43
+ if (args.length !== 2)
44
+ return m;
45
+ return (0, rewrite_1.foundSearchResult)(m, "The currentSnapshot parameter of CanMatch and CanMatchFn is required as of Angular 22. Pass the route snapshot as a third argument.");
46
+ });
47
+ }
48
+ };
49
+ });
50
+ }
51
+ }
52
+ exports.FindCanMatchUsage = FindCanMatchUsage;
53
+ //# 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,gEAAkE;AAClE,oDAA0D;AAE1D,MAAa,iBAAkB,SAAQ,gBAAM;IAA7C;;QACa,SAAI,GAAG,qDAAqD,CAAC;QAC7D,gBAAW,GAAW,0CAA0C,CAAC;QACjE,gBAAW,GAAW,6EAA6E;YACxG,6HAA6H;YAC7H,yEAAyE,CAAC;IAgBlF,CAAC;IAdS,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,IAAA,mBAAY,EAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,KAAK,UAAU;4BAAE,OAAO,CAAC,CAAC;wBAE9E,MAAM,IAAI,GAAG,CAAC,MAAA,MAAA,CAAC,CAAC,SAAS,0CAAE,QAAQ,mCAAI,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,QAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;wBAC1F,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;4BAAE,OAAO,CAAC,CAAC;wBAEhC,OAAO,IAAA,2BAAiB,EAAC,CAAC,EACtB,qIAAqI,CAAC,CAAC;oBAC/I,CAAC;iBAAA;aACJ,CAAC;QACN,CAAC;KAAA;CACJ;AArBD,8CAqBC"}
@@ -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"}