@openrewrite/recipes-react 0.2.9
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/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +130 -0
- package/dist/index.js.map +1 -0
- package/dist/migration/change-component-prop-value.d.ts +20 -0
- package/dist/migration/change-component-prop-value.d.ts.map +1 -0
- package/dist/migration/change-component-prop-value.js +217 -0
- package/dist/migration/change-component-prop-value.js.map +1 -0
- package/dist/react-native/view-prop-types.d.ts +8 -0
- package/dist/react-native/view-prop-types.d.ts.map +1 -0
- package/dist/react-native/view-prop-types.js +65 -0
- package/dist/react-native/view-prop-types.js.map +1 -0
- package/dist/react16/error-boundaries.d.ts +8 -0
- package/dist/react16/error-boundaries.d.ts.map +1 -0
- package/dist/react16/error-boundaries.js +42 -0
- package/dist/react16/error-boundaries.js.map +1 -0
- package/dist/react16/find-dom-node.d.ts +8 -0
- package/dist/react16/find-dom-node.d.ts.map +1 -0
- package/dist/react16/find-dom-node.js +48 -0
- package/dist/react16/find-dom-node.js.map +1 -0
- package/dist/react16/react-dom-factories.d.ts +8 -0
- package/dist/react16/react-dom-factories.d.ts.map +1 -0
- package/dist/react16/react-dom-factories.js +72 -0
- package/dist/react16/react-dom-factories.js.map +1 -0
- package/dist/react16/react-prop-types.d.ts +8 -0
- package/dist/react16/react-prop-types.d.ts.map +1 -0
- package/dist/react16/react-prop-types.js +69 -0
- package/dist/react16/react-prop-types.js.map +1 -0
- package/dist/react16/react-to-react-dom.d.ts +8 -0
- package/dist/react16/react-to-react-dom.d.ts.map +1 -0
- package/dist/react16/react-to-react-dom.js +97 -0
- package/dist/react16/react-to-react-dom.js.map +1 -0
- package/dist/react16/replace-create-factory.d.ts +8 -0
- package/dist/react16/replace-create-factory.d.ts.map +1 -0
- package/dist/react16/replace-create-factory.js +69 -0
- package/dist/react16/replace-create-factory.js.map +1 -0
- package/dist/react16/upgrade-to-react-16.d.ts +8 -0
- package/dist/react16/upgrade-to-react-16.d.ts.map +1 -0
- package/dist/react16/upgrade-to-react-16.js +41 -0
- package/dist/react16/upgrade-to-react-16.js.map +1 -0
- package/dist/react17/remove-event-persist.d.ts +8 -0
- package/dist/react17/remove-event-persist.d.ts.map +1 -0
- package/dist/react17/remove-event-persist.js +114 -0
- package/dist/react17/remove-event-persist.js.map +1 -0
- package/dist/react17/rename-unsafe-lifecycles.d.ts +8 -0
- package/dist/react17/rename-unsafe-lifecycles.d.ts.map +1 -0
- package/dist/react17/rename-unsafe-lifecycles.js +48 -0
- package/dist/react17/rename-unsafe-lifecycles.js.map +1 -0
- package/dist/react17/update-react-imports.d.ts +8 -0
- package/dist/react17/update-react-imports.d.ts.map +1 -0
- package/dist/react17/update-react-imports.js +40 -0
- package/dist/react17/update-react-imports.js.map +1 -0
- package/dist/react17/upgrade-to-react-17.d.ts +8 -0
- package/dist/react17/upgrade-to-react-17.d.ts.map +1 -0
- package/dist/react17/upgrade-to-react-17.js +37 -0
- package/dist/react17/upgrade-to-react-17.js.map +1 -0
- package/dist/react18/remove-unstable-batched-updates.d.ts +8 -0
- package/dist/react18/remove-unstable-batched-updates.d.ts.map +1 -0
- package/dist/react18/remove-unstable-batched-updates.js +170 -0
- package/dist/react18/remove-unstable-batched-updates.js.map +1 -0
- package/dist/react18/replace-reactdom-render.d.ts +8 -0
- package/dist/react18/replace-reactdom-render.d.ts.map +1 -0
- package/dist/react18/replace-reactdom-render.js +55 -0
- package/dist/react18/replace-reactdom-render.js.map +1 -0
- package/dist/react18/replace-render-callback.d.ts +8 -0
- package/dist/react18/replace-render-callback.d.ts.map +1 -0
- package/dist/react18/replace-render-callback.js +60 -0
- package/dist/react18/replace-render-callback.js.map +1 -0
- package/dist/react18/replace-unmount-component-at-node.d.ts +8 -0
- package/dist/react18/replace-unmount-component-at-node.d.ts.map +1 -0
- package/dist/react18/replace-unmount-component-at-node.js +54 -0
- package/dist/react18/replace-unmount-component-at-node.js.map +1 -0
- package/dist/react18/upgrade-to-react-18.d.ts +8 -0
- package/dist/react18/upgrade-to-react-18.d.ts.map +1 -0
- package/dist/react18/upgrade-to-react-18.js +39 -0
- package/dist/react18/upgrade-to-react-18.js.map +1 -0
- package/dist/react19/deprecated-react-types.d.ts +8 -0
- package/dist/react19/deprecated-react-types.d.ts.map +1 -0
- package/dist/react19/deprecated-react-types.js +135 -0
- package/dist/react19/deprecated-react-types.js.map +1 -0
- package/dist/react19/find-context-consumer.d.ts +9 -0
- package/dist/react19/find-context-consumer.d.ts.map +1 -0
- package/dist/react19/find-context-consumer.js +128 -0
- package/dist/react19/find-context-consumer.js.map +1 -0
- package/dist/react19/find-deprecated-reactdom-apis.d.ts +9 -0
- package/dist/react19/find-deprecated-reactdom-apis.d.ts.map +1 -0
- package/dist/react19/find-deprecated-reactdom-apis.js +132 -0
- package/dist/react19/find-deprecated-reactdom-apis.js.map +1 -0
- package/dist/react19/find-element-ref.d.ts +9 -0
- package/dist/react19/find-element-ref.d.ts.map +1 -0
- package/dist/react19/find-element-ref.js +88 -0
- package/dist/react19/find-element-ref.js.map +1 -0
- package/dist/react19/find-legacy-context-api.d.ts +9 -0
- package/dist/react19/find-legacy-context-api.d.ts.map +1 -0
- package/dist/react19/find-legacy-context-api.js +163 -0
- package/dist/react19/find-legacy-context-api.js.map +1 -0
- package/dist/react19/no-implicit-ref-callback-return.d.ts +8 -0
- package/dist/react19/no-implicit-ref-callback-return.d.ts.map +1 -0
- package/dist/react19/no-implicit-ref-callback-return.js +107 -0
- package/dist/react19/no-implicit-ref-callback-return.js.map +1 -0
- package/dist/react19/remove-context-provider.d.ts +8 -0
- package/dist/react19/remove-context-provider.d.ts.map +1 -0
- package/dist/react19/remove-context-provider.js +59 -0
- package/dist/react19/remove-context-provider.js.map +1 -0
- package/dist/react19/remove-forward-ref.d.ts +8 -0
- package/dist/react19/remove-forward-ref.d.ts.map +1 -0
- package/dist/react19/remove-forward-ref.js +73 -0
- package/dist/react19/remove-forward-ref.js.map +1 -0
- package/dist/react19/remove-prop-types.d.ts +8 -0
- package/dist/react19/remove-prop-types.d.ts.map +1 -0
- package/dist/react19/remove-prop-types.js +76 -0
- package/dist/react19/remove-prop-types.js.map +1 -0
- package/dist/react19/remove-react-fc.d.ts +8 -0
- package/dist/react19/remove-react-fc.d.ts.map +1 -0
- package/dist/react19/remove-react-fc.js +149 -0
- package/dist/react19/remove-react-fc.js.map +1 -0
- package/dist/react19/replace-act-import.d.ts +9 -0
- package/dist/react19/replace-act-import.d.ts.map +1 -0
- package/dist/react19/replace-act-import.js +34 -0
- package/dist/react19/replace-act-import.js.map +1 -0
- package/dist/react19/replace-default-props.d.ts +8 -0
- package/dist/react19/replace-default-props.d.ts.map +1 -0
- package/dist/react19/replace-default-props.js +195 -0
- package/dist/react19/replace-default-props.js.map +1 -0
- package/dist/react19/replace-react-shallow-renderer.d.ts +8 -0
- package/dist/react19/replace-react-shallow-renderer.d.ts.map +1 -0
- package/dist/react19/replace-react-shallow-renderer.js +69 -0
- package/dist/react19/replace-react-shallow-renderer.js.map +1 -0
- package/dist/react19/replace-reactdom-hydrate.d.ts +8 -0
- package/dist/react19/replace-reactdom-hydrate.d.ts.map +1 -0
- package/dist/react19/replace-reactdom-hydrate.js +55 -0
- package/dist/react19/replace-reactdom-hydrate.js.map +1 -0
- package/dist/react19/replace-string-ref.d.ts +8 -0
- package/dist/react19/replace-string-ref.d.ts.map +1 -0
- package/dist/react19/replace-string-ref.js +75 -0
- package/dist/react19/replace-string-ref.js.map +1 -0
- package/dist/react19/replace-use-form-state.d.ts +8 -0
- package/dist/react19/replace-use-form-state.d.ts.map +1 -0
- package/dist/react19/replace-use-form-state.js +54 -0
- package/dist/react19/replace-use-form-state.js.map +1 -0
- package/dist/react19/upgrade-to-react-19.d.ts +8 -0
- package/dist/react19/upgrade-to-react-19.d.ts.map +1 -0
- package/dist/react19/upgrade-to-react-19.js +59 -0
- package/dist/react19/upgrade-to-react-19.js.map +1 -0
- package/dist/react19/use-context-hook.d.ts +8 -0
- package/dist/react19/use-context-hook.d.ts.map +1 -0
- package/dist/react19/use-context-hook.js +54 -0
- package/dist/react19/use-context-hook.js.map +1 -0
- package/dist/react19/use-ref-required-initial.d.ts +8 -0
- package/dist/react19/use-ref-required-initial.d.ts.map +1 -0
- package/dist/react19/use-ref-required-initial.js +74 -0
- package/dist/react19/use-ref-required-initial.js.map +1 -0
- package/dist/refactoring/class-to-functional.d.ts +8 -0
- package/dist/refactoring/class-to-functional.d.ts.map +1 -0
- package/dist/refactoring/class-to-functional.js +205 -0
- package/dist/refactoring/class-to-functional.js.map +1 -0
- package/dist/refactoring/create-class-to-es6.d.ts +8 -0
- package/dist/refactoring/create-class-to-es6.d.ts.map +1 -0
- package/dist/refactoring/create-class-to-es6.js +289 -0
- package/dist/refactoring/create-class-to-es6.js.map +1 -0
- package/dist/refactoring/create-element-to-jsx.d.ts +8 -0
- package/dist/refactoring/create-element-to-jsx.d.ts.map +1 -0
- package/dist/refactoring/create-element-to-jsx.js +167 -0
- package/dist/refactoring/create-element-to-jsx.js.map +1 -0
- package/dist/refactoring/manual-bind-to-arrow.d.ts +8 -0
- package/dist/refactoring/manual-bind-to-arrow.d.ts.map +1 -0
- package/dist/refactoring/manual-bind-to-arrow.js +134 -0
- package/dist/refactoring/manual-bind-to-arrow.js.map +1 -0
- package/dist/refactoring/pure-render-mixin.d.ts +8 -0
- package/dist/refactoring/pure-render-mixin.d.ts.map +1 -0
- package/dist/refactoring/pure-render-mixin.js +253 -0
- package/dist/refactoring/pure-render-mixin.js.map +1 -0
- package/dist/refactoring/sort-comp.d.ts +8 -0
- package/dist/refactoring/sort-comp.d.ts.map +1 -0
- package/dist/refactoring/sort-comp.js +128 -0
- package/dist/refactoring/sort-comp.js.map +1 -0
- package/dist/search/find-hook-usage.d.ts +9 -0
- package/dist/search/find-hook-usage.d.ts.map +1 -0
- package/dist/search/find-hook-usage.js +262 -0
- package/dist/search/find-hook-usage.js.map +1 -0
- package/dist/search/find-prop-usage.d.ts +15 -0
- package/dist/search/find-prop-usage.d.ts.map +1 -0
- package/dist/search/find-prop-usage.js +177 -0
- package/dist/search/find-prop-usage.js.map +1 -0
- package/dist/search/find-react-component.d.ts +15 -0
- package/dist/search/find-react-component.d.ts.map +1 -0
- package/dist/search/find-react-component.js +260 -0
- package/dist/search/find-react-component.js.map +1 -0
- package/dist/search/find-server-rendering-usage.d.ts +9 -0
- package/dist/search/find-server-rendering-usage.d.ts.map +1 -0
- package/dist/search/find-server-rendering-usage.js +131 -0
- package/dist/search/find-server-rendering-usage.js.map +1 -0
- package/dist/simplify-object-pattern-property.d.ts +8 -0
- package/dist/simplify-object-pattern-property.d.ts.map +1 -0
- package/dist/simplify-object-pattern-property.js +59 -0
- package/dist/simplify-object-pattern-property.js.map +1 -0
- package/dist/simplify-react-imports.d.ts +8 -0
- package/dist/simplify-react-imports.d.ts.map +1 -0
- package/dist/simplify-react-imports.js +199 -0
- package/dist/simplify-react-imports.js.map +1 -0
- package/package.json +39 -0
- package/src/index.ts +149 -0
- package/src/migration/change-component-prop-value.ts +268 -0
- package/src/react-native/view-prop-types.ts +63 -0
- package/src/react16/error-boundaries.ts +46 -0
- package/src/react16/find-dom-node.ts +55 -0
- package/src/react16/react-dom-factories.ts +99 -0
- package/src/react16/react-prop-types.ts +71 -0
- package/src/react16/react-to-react-dom.ts +104 -0
- package/src/react16/replace-create-factory.ts +96 -0
- package/src/react16/upgrade-to-react-16.ts +37 -0
- package/src/react17/remove-event-persist.ts +121 -0
- package/src/react17/rename-unsafe-lifecycles.ts +57 -0
- package/src/react17/update-react-imports.ts +50 -0
- package/src/react17/upgrade-to-react-17.ts +30 -0
- package/src/react18/remove-unstable-batched-updates.ts +192 -0
- package/src/react18/replace-reactdom-render.ts +68 -0
- package/src/react18/replace-render-callback.ts +66 -0
- package/src/react18/replace-unmount-component-at-node.ts +66 -0
- package/src/react18/upgrade-to-react-18.ts +33 -0
- package/src/react19/deprecated-react-types.ts +120 -0
- package/src/react19/find-context-consumer.ts +127 -0
- package/src/react19/find-deprecated-reactdom-apis.ts +125 -0
- package/src/react19/find-element-ref.ts +86 -0
- package/src/react19/find-legacy-context-api.ts +157 -0
- package/src/react19/no-implicit-ref-callback-return.ts +123 -0
- package/src/react19/remove-context-provider.ts +87 -0
- package/src/react19/remove-forward-ref.ts +69 -0
- package/src/react19/remove-prop-types.ts +86 -0
- package/src/react19/remove-react-fc.ts +247 -0
- package/src/react19/replace-act-import.ts +36 -0
- package/src/react19/replace-default-props.ts +220 -0
- package/src/react19/replace-react-shallow-renderer.ts +75 -0
- package/src/react19/replace-reactdom-hydrate.ts +67 -0
- package/src/react19/replace-string-ref.ts +89 -0
- package/src/react19/replace-use-form-state.ts +66 -0
- package/src/react19/upgrade-to-react-19.ts +66 -0
- package/src/react19/use-context-hook.ts +67 -0
- package/src/react19/use-ref-required-initial.ts +75 -0
- package/src/refactoring/class-to-functional.ts +229 -0
- package/src/refactoring/create-class-to-es6.ts +309 -0
- package/src/refactoring/create-element-to-jsx.ts +200 -0
- package/src/refactoring/manual-bind-to-arrow.ts +139 -0
- package/src/refactoring/pure-render-mixin.ts +346 -0
- package/src/refactoring/sort-comp.ts +135 -0
- package/src/search/find-hook-usage.ts +226 -0
- package/src/search/find-prop-usage.ts +176 -0
- package/src/search/find-react-component.ts +254 -0
- package/src/search/find-server-rendering-usage.ts +120 -0
- package/src/simplify-object-pattern-property.ts +71 -0
- package/src/simplify-react-imports.ts +241 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.UpgradeToReact18 = void 0;
|
|
13
|
+
const rewrite_1 = require("@openrewrite/rewrite");
|
|
14
|
+
const upgrade_to_react_17_1 = require("../react17/upgrade-to-react-17");
|
|
15
|
+
const replace_reactdom_render_1 = require("./replace-reactdom-render");
|
|
16
|
+
const remove_unstable_batched_updates_1 = require("./remove-unstable-batched-updates");
|
|
17
|
+
const replace_unmount_component_at_node_1 = require("./replace-unmount-component-at-node");
|
|
18
|
+
const replace_render_callback_1 = require("./replace-render-callback");
|
|
19
|
+
class UpgradeToReact18 extends rewrite_1.Recipe {
|
|
20
|
+
constructor() {
|
|
21
|
+
super(...arguments);
|
|
22
|
+
this.name = "org.openrewrite.react.migrate.upgrade-to-react-18";
|
|
23
|
+
this.displayName = "Upgrade to React 18";
|
|
24
|
+
this.description = "Migrate deprecated APIs for React 18 compatibility. Includes all React 16 and 17 migrations plus the createRoot API migration, removal of unstable_batchedUpdates, unmountComponentAtNode replacement, and render callback removal.";
|
|
25
|
+
}
|
|
26
|
+
recipeList() {
|
|
27
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
28
|
+
return [
|
|
29
|
+
new upgrade_to_react_17_1.UpgradeToReact17(),
|
|
30
|
+
new replace_reactdom_render_1.ReplaceReactDomRender(),
|
|
31
|
+
new remove_unstable_batched_updates_1.RemoveUnstableBatchedUpdates(),
|
|
32
|
+
new replace_unmount_component_at_node_1.ReplaceUnmountComponentAtNode(),
|
|
33
|
+
new replace_render_callback_1.ReplaceRenderCallback(),
|
|
34
|
+
];
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
exports.UpgradeToReact18 = UpgradeToReact18;
|
|
39
|
+
//# sourceMappingURL=upgrade-to-react-18.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upgrade-to-react-18.js","sourceRoot":"","sources":["../../src/react18/upgrade-to-react-18.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,kDAA4C;AAC5C,wEAAgE;AAChE,uEAAgE;AAChE,uFAA+E;AAC/E,2FAAkF;AAClF,uEAAgE;AAahE,MAAa,gBAAiB,SAAQ,gBAAM;IAA5C;;QACa,SAAI,GAAG,mDAAmD,CAAC;QAC3D,gBAAW,GAAG,qBAAqB,CAAC;QACpC,gBAAW,GAAG,qOAAqO,CAAC;IAWjQ,CAAC;IATS,UAAU;;YACZ,OAAO;gBACH,IAAI,sCAAgB,EAAE;gBACtB,IAAI,+CAAqB,EAAE;gBAC3B,IAAI,8DAA4B,EAAE;gBAClC,IAAI,iEAA6B,EAAE;gBACnC,IAAI,+CAAqB,EAAE;aAC9B,CAAC;QACN,CAAC;KAAA;CACJ;AAdD,4CAcC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ExecutionContext, Recipe, TreeVisitor } from "@openrewrite/rewrite";
|
|
2
|
+
export declare class DeprecatedReactTypes extends Recipe {
|
|
3
|
+
readonly name = "org.openrewrite.react.19.deprecated-react-types";
|
|
4
|
+
readonly displayName: string;
|
|
5
|
+
readonly description: string;
|
|
6
|
+
editor(): Promise<TreeVisitor<any, ExecutionContext>>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=deprecated-react-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deprecated-react-types.d.ts","sourceRoot":"","sources":["../../src/react19/deprecated-react-types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,gBAAgB,EAAE,MAAM,EAAE,WAAW,EAAC,MAAM,sBAAsB,CAAC;AAuB3E,qBAAa,oBAAqB,SAAQ,MAAM;IAC5C,QAAQ,CAAC,IAAI,qDAAqD;IAClE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAoC;IAChE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAA6I;IAEnK,MAAM,IAAI,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;CA2F9D"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.DeprecatedReactTypes = void 0;
|
|
13
|
+
const rewrite_1 = require("@openrewrite/rewrite");
|
|
14
|
+
const javascript_1 = require("@openrewrite/rewrite/javascript");
|
|
15
|
+
const java_1 = require("@openrewrite/rewrite/java");
|
|
16
|
+
const mutative_1 = require("mutative");
|
|
17
|
+
const typeRenames = {
|
|
18
|
+
'SFC': 'FC',
|
|
19
|
+
'StatelessComponent': 'FunctionComponent',
|
|
20
|
+
'VFC': 'FC',
|
|
21
|
+
'VoidFunctionComponent': 'FunctionComponent',
|
|
22
|
+
};
|
|
23
|
+
class DeprecatedReactTypes extends rewrite_1.Recipe {
|
|
24
|
+
constructor() {
|
|
25
|
+
super(...arguments);
|
|
26
|
+
this.name = "org.openrewrite.react.19.deprecated-react-types";
|
|
27
|
+
this.displayName = "Replace deprecated React types";
|
|
28
|
+
this.description = "Replaces deprecated React TypeScript types (`SFC`, `StatelessComponent`, `VFC`, `VoidFunctionComponent`) with their modern equivalents.";
|
|
29
|
+
}
|
|
30
|
+
editor() {
|
|
31
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
32
|
+
return new class extends javascript_1.JavaScriptVisitor {
|
|
33
|
+
constructor() {
|
|
34
|
+
super(...arguments);
|
|
35
|
+
this.deprecatedNames = new Set();
|
|
36
|
+
}
|
|
37
|
+
visitJsCompilationUnit(cu, ctx) {
|
|
38
|
+
const _super = Object.create(null, {
|
|
39
|
+
visitJsCompilationUnit: { get: () => super.visitJsCompilationUnit }
|
|
40
|
+
});
|
|
41
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
42
|
+
var _a, _b, _c;
|
|
43
|
+
this.deprecatedNames.clear();
|
|
44
|
+
for (const stmt of cu.statements) {
|
|
45
|
+
const s = stmt.element;
|
|
46
|
+
if (!s || s.kind !== javascript_1.JS.Kind.Import)
|
|
47
|
+
continue;
|
|
48
|
+
const imp = s;
|
|
49
|
+
const modulePath = this.getModuleSpecifier(imp);
|
|
50
|
+
if (modulePath !== 'react')
|
|
51
|
+
continue;
|
|
52
|
+
if ((_a = imp.importClause) === null || _a === void 0 ? void 0 : _a.namedBindings) {
|
|
53
|
+
const namedImports = imp.importClause.namedBindings;
|
|
54
|
+
const jContainer = namedImports.elements;
|
|
55
|
+
const elements = (_b = jContainer === null || jContainer === void 0 ? void 0 : jContainer.elements) !== null && _b !== void 0 ? _b : [];
|
|
56
|
+
for (const specPadded of elements) {
|
|
57
|
+
const spec = (_c = specPadded.element) !== null && _c !== void 0 ? _c : specPadded;
|
|
58
|
+
if (spec.kind === javascript_1.JS.Kind.ImportSpecifier) {
|
|
59
|
+
const importedName = this.getImportedName(spec);
|
|
60
|
+
if (importedName && typeRenames[importedName]) {
|
|
61
|
+
this.deprecatedNames.add(importedName);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
if (this.deprecatedNames.size === 0) {
|
|
68
|
+
return cu;
|
|
69
|
+
}
|
|
70
|
+
return _super.visitJsCompilationUnit.call(this, cu, ctx);
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
visitIdentifier(identifier, ctx) {
|
|
74
|
+
const _super = Object.create(null, {
|
|
75
|
+
visitIdentifier: { get: () => super.visitIdentifier }
|
|
76
|
+
});
|
|
77
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
78
|
+
const id = yield _super.visitIdentifier.call(this, identifier, ctx);
|
|
79
|
+
return this.renameIfDeprecated(id);
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
visitParameterizedType(type, ctx) {
|
|
83
|
+
const _super = Object.create(null, {
|
|
84
|
+
visitParameterizedType: { get: () => super.visitParameterizedType }
|
|
85
|
+
});
|
|
86
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
87
|
+
let pt = yield _super.visitParameterizedType.call(this, type, ctx);
|
|
88
|
+
if ((0, java_1.isIdentifier)(pt.class)) {
|
|
89
|
+
const renamed = this.renameIfDeprecated(pt.class);
|
|
90
|
+
if (renamed !== pt.class) {
|
|
91
|
+
return (0, mutative_1.create)(pt, draft => {
|
|
92
|
+
draft.class = renamed;
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return pt;
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
renameIfDeprecated(id) {
|
|
100
|
+
const name = id.simpleName;
|
|
101
|
+
if (this.deprecatedNames.has(name) && typeRenames[name]) {
|
|
102
|
+
return (0, mutative_1.create)(id, draft => {
|
|
103
|
+
draft.simpleName = typeRenames[name];
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
return id;
|
|
107
|
+
}
|
|
108
|
+
getModuleSpecifier(imp) {
|
|
109
|
+
var _a;
|
|
110
|
+
const modSpec = (_a = imp.moduleSpecifier.element) !== null && _a !== void 0 ? _a : imp.moduleSpecifier;
|
|
111
|
+
if (modSpec.kind === java_1.J.Kind.Literal) {
|
|
112
|
+
return modSpec.value;
|
|
113
|
+
}
|
|
114
|
+
return '';
|
|
115
|
+
}
|
|
116
|
+
getImportedName(spec) {
|
|
117
|
+
const specifier = spec.specifier;
|
|
118
|
+
if (specifier.kind === javascript_1.JS.Kind.Alias) {
|
|
119
|
+
const alias = specifier;
|
|
120
|
+
const propName = alias.propertyName.element;
|
|
121
|
+
if ((0, java_1.isIdentifier)(propName)) {
|
|
122
|
+
return propName.simpleName;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
else if ((0, java_1.isIdentifier)(specifier)) {
|
|
126
|
+
return specifier.simpleName;
|
|
127
|
+
}
|
|
128
|
+
return undefined;
|
|
129
|
+
}
|
|
130
|
+
}();
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
exports.DeprecatedReactTypes = DeprecatedReactTypes;
|
|
135
|
+
//# sourceMappingURL=deprecated-react-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deprecated-react-types.js","sourceRoot":"","sources":["../../src/react19/deprecated-react-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { ExecutionContext, Recipe, TreeVisitor } from "@openrewrite/rewrite";
|
|
2
|
+
export declare class FindContextConsumer extends Recipe {
|
|
3
|
+
readonly name = "org.openrewrite.react.19.find-context-consumer";
|
|
4
|
+
readonly displayName = "Find `Context.Consumer` usage";
|
|
5
|
+
readonly description = "Finds usage of the deprecated `<Context.Consumer>` pattern. In React 19, use the `use()` hook instead.";
|
|
6
|
+
private dataTable;
|
|
7
|
+
editor(): Promise<TreeVisitor<any, ExecutionContext>>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=find-context-consumer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find-context-consumer.d.ts","sourceRoot":"","sources":["../../src/react19/find-context-consumer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,gBAAgB,EAAqB,MAAM,EAAE,WAAW,EAAC,MAAM,sBAAsB,CAAC;AAyCjH,qBAAa,mBAAoB,SAAQ,MAAM;IAC3C,QAAQ,CAAC,IAAI,oDAAoD;IACjE,QAAQ,CAAC,WAAW,mCAAmC;IACvD,QAAQ,CAAC,WAAW,4GAA4G;IAEhI,OAAO,CAAC,SAAS,CAKf;IAEI,MAAM,IAAI,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;CAyE9D"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
9
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
10
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
11
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
12
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
13
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
14
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
15
|
+
});
|
|
16
|
+
};
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.FindContextConsumer = void 0;
|
|
19
|
+
const rewrite_1 = require("@openrewrite/rewrite");
|
|
20
|
+
const javascript_1 = require("@openrewrite/rewrite/javascript");
|
|
21
|
+
const java_1 = require("@openrewrite/rewrite/java");
|
|
22
|
+
class ContextConsumerRow {
|
|
23
|
+
}
|
|
24
|
+
__decorate([
|
|
25
|
+
(0, rewrite_1.Column)({ displayName: "File path", description: "The file path where Context.Consumer is used" })
|
|
26
|
+
], ContextConsumerRow.prototype, "filePath", void 0);
|
|
27
|
+
__decorate([
|
|
28
|
+
(0, rewrite_1.Column)({ displayName: "Context name", description: "The name of the Context being consumed" })
|
|
29
|
+
], ContextConsumerRow.prototype, "contextName", void 0);
|
|
30
|
+
__decorate([
|
|
31
|
+
(0, rewrite_1.Column)({ displayName: "Component name", description: "The enclosing component or function name" })
|
|
32
|
+
], ContextConsumerRow.prototype, "componentName", void 0);
|
|
33
|
+
class FindContextConsumer extends rewrite_1.Recipe {
|
|
34
|
+
constructor() {
|
|
35
|
+
super(...arguments);
|
|
36
|
+
this.name = "org.openrewrite.react.19.find-context-consumer";
|
|
37
|
+
this.displayName = "Find `Context.Consumer` usage";
|
|
38
|
+
this.description = "Finds usage of the deprecated `<Context.Consumer>` pattern. In React 19, use the `use()` hook instead.";
|
|
39
|
+
this.dataTable = new rewrite_1.DataTable("org.openrewrite.react.19.ContextConsumerTable", "Context.Consumer usages", "Table of all Context.Consumer usages found in the codebase.", ContextConsumerRow);
|
|
40
|
+
}
|
|
41
|
+
editor() {
|
|
42
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
43
|
+
const dataTable = this.dataTable;
|
|
44
|
+
return new class extends javascript_1.JavaScriptVisitor {
|
|
45
|
+
constructor() {
|
|
46
|
+
super(...arguments);
|
|
47
|
+
this.filePath = "";
|
|
48
|
+
this.componentStack = [];
|
|
49
|
+
}
|
|
50
|
+
visitJsCompilationUnit(cu, ctx) {
|
|
51
|
+
const _super = Object.create(null, {
|
|
52
|
+
visitJsCompilationUnit: { get: () => super.visitJsCompilationUnit }
|
|
53
|
+
});
|
|
54
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
55
|
+
var _a;
|
|
56
|
+
this.filePath = (_a = cu.sourcePath) !== null && _a !== void 0 ? _a : "";
|
|
57
|
+
this.componentStack = [];
|
|
58
|
+
return _super.visitJsCompilationUnit.call(this, cu, ctx);
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
visitMethodDeclaration(method, ctx) {
|
|
62
|
+
const _super = Object.create(null, {
|
|
63
|
+
visitMethodDeclaration: { get: () => super.visitMethodDeclaration }
|
|
64
|
+
});
|
|
65
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
66
|
+
var _a, _b;
|
|
67
|
+
const name = (_b = (_a = method.name) === null || _a === void 0 ? void 0 : _a.simpleName) !== null && _b !== void 0 ? _b : "<anonymous>";
|
|
68
|
+
this.componentStack.push(name);
|
|
69
|
+
const result = yield _super.visitMethodDeclaration.call(this, method, ctx);
|
|
70
|
+
this.componentStack.pop();
|
|
71
|
+
return result;
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
visitVariableDeclarations(vd, ctx) {
|
|
75
|
+
const _super = Object.create(null, {
|
|
76
|
+
visitVariableDeclarations: { get: () => super.visitVariableDeclarations }
|
|
77
|
+
});
|
|
78
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
79
|
+
var _a, _b, _c;
|
|
80
|
+
const namedVar = (_b = (_a = vd.variables) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.element;
|
|
81
|
+
if (namedVar) {
|
|
82
|
+
const name = (_c = namedVar.name) === null || _c === void 0 ? void 0 : _c.simpleName;
|
|
83
|
+
if (name) {
|
|
84
|
+
this.componentStack.push(name);
|
|
85
|
+
const result = yield _super.visitVariableDeclarations.call(this, vd, ctx);
|
|
86
|
+
this.componentStack.pop();
|
|
87
|
+
return result;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return _super.visitVariableDeclarations.call(this, vd, ctx);
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
visitJsxTag(tag, ctx) {
|
|
94
|
+
const _super = Object.create(null, {
|
|
95
|
+
visitJsxTag: { get: () => super.visitJsxTag }
|
|
96
|
+
});
|
|
97
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
98
|
+
let t = yield _super.visitJsxTag.call(this, tag, ctx);
|
|
99
|
+
const openName = t.openName.element;
|
|
100
|
+
if (openName.kind !== java_1.J.Kind.FieldAccess) {
|
|
101
|
+
return t;
|
|
102
|
+
}
|
|
103
|
+
const fieldAccess = openName;
|
|
104
|
+
const propertyName = fieldAccess.name.element.simpleName;
|
|
105
|
+
if (propertyName !== 'Consumer') {
|
|
106
|
+
return t;
|
|
107
|
+
}
|
|
108
|
+
let contextName = "<unknown>";
|
|
109
|
+
if ((0, java_1.isIdentifier)(fieldAccess.target)) {
|
|
110
|
+
contextName = fieldAccess.target.simpleName;
|
|
111
|
+
}
|
|
112
|
+
const componentName = this.componentStack.length > 0
|
|
113
|
+
? this.componentStack[this.componentStack.length - 1]
|
|
114
|
+
: "<module>";
|
|
115
|
+
dataTable.insertRow(ctx, {
|
|
116
|
+
filePath: this.filePath,
|
|
117
|
+
contextName,
|
|
118
|
+
componentName
|
|
119
|
+
});
|
|
120
|
+
return (0, rewrite_1.foundSearchResult)(t, `Deprecated: ${contextName}.Consumer — use the use() hook instead`);
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
}();
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
exports.FindContextConsumer = FindContextConsumer;
|
|
128
|
+
//# sourceMappingURL=find-context-consumer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find-context-consumer.js","sourceRoot":"","sources":["../../src/react19/find-context-consumer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { ExecutionContext, Recipe, TreeVisitor } from "@openrewrite/rewrite";
|
|
2
|
+
export declare class FindDeprecatedReactDomAPIs extends Recipe {
|
|
3
|
+
readonly name = "org.openrewrite.react.19.find-deprecated-reactdom-apis";
|
|
4
|
+
readonly displayName = "Find deprecated ReactDOM APIs";
|
|
5
|
+
readonly description = "Finds usage of deprecated or removed ReactDOM APIs (`findDOMNode`, `unmountComponentAtNode`, `createFactory`, `renderToNodeStream`) that were removed in React 19.";
|
|
6
|
+
private dataTable;
|
|
7
|
+
editor(): Promise<TreeVisitor<any, ExecutionContext>>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=find-deprecated-reactdom-apis.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find-deprecated-reactdom-apis.d.ts","sourceRoot":"","sources":["../../src/react19/find-deprecated-reactdom-apis.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,gBAAgB,EAAqB,MAAM,EAAE,WAAW,EAAC,MAAM,sBAAsB,CAAC;AAqCjH,qBAAa,0BAA2B,SAAQ,MAAM;IAClD,QAAQ,CAAC,IAAI,4DAA4D;IACzE,QAAQ,CAAC,WAAW,mCAAmC;IACvD,QAAQ,CAAC,WAAW,wKAAwK;IAE5L,OAAO,CAAC,SAAS,CAKf;IAEI,MAAM,IAAI,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;CA2E9D"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
9
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
10
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
11
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
12
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
13
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
14
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
15
|
+
});
|
|
16
|
+
};
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.FindDeprecatedReactDomAPIs = void 0;
|
|
19
|
+
const rewrite_1 = require("@openrewrite/rewrite");
|
|
20
|
+
const javascript_1 = require("@openrewrite/rewrite/javascript");
|
|
21
|
+
const java_1 = require("@openrewrite/rewrite/java");
|
|
22
|
+
class DeprecatedReactDomRow {
|
|
23
|
+
}
|
|
24
|
+
__decorate([
|
|
25
|
+
(0, rewrite_1.Column)({ displayName: "File path", description: "The file path where the deprecated API is used" })
|
|
26
|
+
], DeprecatedReactDomRow.prototype, "filePath", void 0);
|
|
27
|
+
__decorate([
|
|
28
|
+
(0, rewrite_1.Column)({ displayName: "API name", description: "The name of the deprecated ReactDOM API" })
|
|
29
|
+
], DeprecatedReactDomRow.prototype, "apiName", void 0);
|
|
30
|
+
__decorate([
|
|
31
|
+
(0, rewrite_1.Column)({ displayName: "Replacement", description: "The recommended replacement" })
|
|
32
|
+
], DeprecatedReactDomRow.prototype, "replacement", void 0);
|
|
33
|
+
const DEPRECATED_APIS = {
|
|
34
|
+
'findDOMNode': 'Use refs instead of ReactDOM.findDOMNode()',
|
|
35
|
+
'unmountComponentAtNode': 'Use root.unmount() from createRoot() instead',
|
|
36
|
+
'createFactory': 'Use JSX or React.createElement() instead',
|
|
37
|
+
'renderToNodeStream': 'Use renderToPipeableStream instead',
|
|
38
|
+
'renderToStaticNodeStream': 'Use renderToReadableStream or renderToPipeableStream instead',
|
|
39
|
+
};
|
|
40
|
+
class FindDeprecatedReactDomAPIs extends rewrite_1.Recipe {
|
|
41
|
+
constructor() {
|
|
42
|
+
super(...arguments);
|
|
43
|
+
this.name = "org.openrewrite.react.19.find-deprecated-reactdom-apis";
|
|
44
|
+
this.displayName = "Find deprecated ReactDOM APIs";
|
|
45
|
+
this.description = "Finds usage of deprecated or removed ReactDOM APIs (`findDOMNode`, `unmountComponentAtNode`, `createFactory`, `renderToNodeStream`) that were removed in React 19.";
|
|
46
|
+
this.dataTable = new rewrite_1.DataTable("org.openrewrite.react.19.DeprecatedReactDomAPITable", "Deprecated ReactDOM API usages", "Table of all deprecated ReactDOM API usages found in the codebase.", DeprecatedReactDomRow);
|
|
47
|
+
}
|
|
48
|
+
editor() {
|
|
49
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
50
|
+
const dataTable = this.dataTable;
|
|
51
|
+
return new class extends javascript_1.JavaScriptVisitor {
|
|
52
|
+
constructor() {
|
|
53
|
+
super(...arguments);
|
|
54
|
+
this.filePath = "";
|
|
55
|
+
this.importedDeprecatedApis = new Set();
|
|
56
|
+
}
|
|
57
|
+
visitJsCompilationUnit(cu, ctx) {
|
|
58
|
+
const _super = Object.create(null, {
|
|
59
|
+
visitJsCompilationUnit: { get: () => super.visitJsCompilationUnit }
|
|
60
|
+
});
|
|
61
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
62
|
+
var _a;
|
|
63
|
+
this.filePath = (_a = cu.sourcePath) !== null && _a !== void 0 ? _a : "";
|
|
64
|
+
this.importedDeprecatedApis.clear();
|
|
65
|
+
return _super.visitJsCompilationUnit.call(this, cu, ctx);
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
visitImportSpecifier(spec, ctx) {
|
|
69
|
+
const _super = Object.create(null, {
|
|
70
|
+
visitImportSpecifier: { get: () => super.visitImportSpecifier }
|
|
71
|
+
});
|
|
72
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
73
|
+
const specifier = spec.specifier;
|
|
74
|
+
let importedName;
|
|
75
|
+
if (specifier.kind === javascript_1.JS.Kind.Alias) {
|
|
76
|
+
const alias = specifier;
|
|
77
|
+
const propName = alias.propertyName.element;
|
|
78
|
+
if ((0, java_1.isIdentifier)(propName)) {
|
|
79
|
+
importedName = propName.simpleName;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
else if ((0, java_1.isIdentifier)(specifier)) {
|
|
83
|
+
importedName = specifier.simpleName;
|
|
84
|
+
}
|
|
85
|
+
if (importedName && DEPRECATED_APIS[importedName]) {
|
|
86
|
+
this.importedDeprecatedApis.add(importedName);
|
|
87
|
+
dataTable.insertRow(ctx, {
|
|
88
|
+
filePath: this.filePath,
|
|
89
|
+
apiName: importedName,
|
|
90
|
+
replacement: DEPRECATED_APIS[importedName]
|
|
91
|
+
});
|
|
92
|
+
return (0, rewrite_1.foundSearchResult)(spec, `Deprecated API: ${importedName}`);
|
|
93
|
+
}
|
|
94
|
+
return _super.visitImportSpecifier.call(this, spec, ctx);
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
visitMethodInvocation(method, ctx) {
|
|
98
|
+
const _super = Object.create(null, {
|
|
99
|
+
visitMethodInvocation: { get: () => super.visitMethodInvocation }
|
|
100
|
+
});
|
|
101
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
102
|
+
var _a;
|
|
103
|
+
let m = yield _super.visitMethodInvocation.call(this, method, ctx);
|
|
104
|
+
const methodName = m.name.simpleName;
|
|
105
|
+
if (!DEPRECATED_APIS[methodName])
|
|
106
|
+
return m;
|
|
107
|
+
if (!m.select && this.importedDeprecatedApis.has(methodName)) {
|
|
108
|
+
return (0, rewrite_1.foundSearchResult)(m, `Deprecated API: ${methodName}`);
|
|
109
|
+
}
|
|
110
|
+
if (m.select) {
|
|
111
|
+
const select = (_a = m.select.element) !== null && _a !== void 0 ? _a : m.select;
|
|
112
|
+
if ((0, java_1.isIdentifier)(select)) {
|
|
113
|
+
const ns = select.simpleName;
|
|
114
|
+
if (ns === 'ReactDOM' || ns === 'React' || ns === 'ReactDOMServer') {
|
|
115
|
+
dataTable.insertRow(ctx, {
|
|
116
|
+
filePath: this.filePath,
|
|
117
|
+
apiName: `${ns}.${methodName}`,
|
|
118
|
+
replacement: DEPRECATED_APIS[methodName]
|
|
119
|
+
});
|
|
120
|
+
return (0, rewrite_1.foundSearchResult)(m, `Deprecated API: ${ns}.${methodName}`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return m;
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
}();
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
exports.FindDeprecatedReactDomAPIs = FindDeprecatedReactDomAPIs;
|
|
132
|
+
//# sourceMappingURL=find-deprecated-reactdom-apis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find-deprecated-reactdom-apis.js","sourceRoot":"","sources":["../../src/react19/find-deprecated-reactdom-apis.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { ExecutionContext, Recipe, TreeVisitor } from "@openrewrite/rewrite";
|
|
2
|
+
export declare class FindElementRef extends Recipe {
|
|
3
|
+
readonly name = "org.openrewrite.react.19.find-element-ref";
|
|
4
|
+
readonly displayName = "Find `element.ref` access";
|
|
5
|
+
readonly description = "Finds direct access of `element.ref` on React elements. In React 19, `element.ref` is deprecated; use `element.props.ref` instead.";
|
|
6
|
+
private dataTable;
|
|
7
|
+
editor(): Promise<TreeVisitor<any, ExecutionContext>>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=find-element-ref.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find-element-ref.d.ts","sourceRoot":"","sources":["../../src/react19/find-element-ref.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,gBAAgB,EAAqB,MAAM,EAAE,WAAW,EAAC,MAAM,sBAAsB,CAAC;AA8BjH,qBAAa,cAAe,SAAQ,MAAM;IACtC,QAAQ,CAAC,IAAI,+CAA+C;IAC5D,QAAQ,CAAC,WAAW,+BAA+B;IACnD,QAAQ,CAAC,WAAW,wIAAwI;IAE5J,OAAO,CAAC,SAAS,CAKf;IAEI,MAAM,IAAI,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;CA2C9D"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
9
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
10
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
11
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
12
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
13
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
14
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
15
|
+
});
|
|
16
|
+
};
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.FindElementRef = void 0;
|
|
19
|
+
const rewrite_1 = require("@openrewrite/rewrite");
|
|
20
|
+
const javascript_1 = require("@openrewrite/rewrite/javascript");
|
|
21
|
+
const java_1 = require("@openrewrite/rewrite/java");
|
|
22
|
+
class ElementRefRow {
|
|
23
|
+
}
|
|
24
|
+
__decorate([
|
|
25
|
+
(0, rewrite_1.Column)({ displayName: "File path", description: "The file path where element.ref is accessed" })
|
|
26
|
+
], ElementRefRow.prototype, "filePath", void 0);
|
|
27
|
+
__decorate([
|
|
28
|
+
(0, rewrite_1.Column)({ displayName: "Expression", description: "The full expression accessing .ref" })
|
|
29
|
+
], ElementRefRow.prototype, "expression", void 0);
|
|
30
|
+
class FindElementRef extends rewrite_1.Recipe {
|
|
31
|
+
constructor() {
|
|
32
|
+
super(...arguments);
|
|
33
|
+
this.name = "org.openrewrite.react.19.find-element-ref";
|
|
34
|
+
this.displayName = "Find `element.ref` access";
|
|
35
|
+
this.description = "Finds direct access of `element.ref` on React elements. In React 19, `element.ref` is deprecated; use `element.props.ref` instead.";
|
|
36
|
+
this.dataTable = new rewrite_1.DataTable("org.openrewrite.react.19.ElementRefTable", "Element ref access usages", "Table of all element.ref access usages found in the codebase.", ElementRefRow);
|
|
37
|
+
}
|
|
38
|
+
editor() {
|
|
39
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
40
|
+
const dataTable = this.dataTable;
|
|
41
|
+
return new class extends javascript_1.JavaScriptVisitor {
|
|
42
|
+
constructor() {
|
|
43
|
+
super(...arguments);
|
|
44
|
+
this.filePath = "";
|
|
45
|
+
}
|
|
46
|
+
visitJsCompilationUnit(cu, ctx) {
|
|
47
|
+
const _super = Object.create(null, {
|
|
48
|
+
visitJsCompilationUnit: { get: () => super.visitJsCompilationUnit }
|
|
49
|
+
});
|
|
50
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
51
|
+
var _a;
|
|
52
|
+
this.filePath = (_a = cu.sourcePath) !== null && _a !== void 0 ? _a : "";
|
|
53
|
+
return _super.visitJsCompilationUnit.call(this, cu, ctx);
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
visitFieldAccess(fieldAccess, ctx) {
|
|
57
|
+
const _super = Object.create(null, {
|
|
58
|
+
visitFieldAccess: { get: () => super.visitFieldAccess }
|
|
59
|
+
});
|
|
60
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
61
|
+
let fa = yield _super.visitFieldAccess.call(this, fieldAccess, ctx);
|
|
62
|
+
if (fa.name.element.simpleName !== 'ref')
|
|
63
|
+
return fa;
|
|
64
|
+
if ((0, java_1.isIdentifier)(fa.target) && fa.target.simpleName === 'refs')
|
|
65
|
+
return fa;
|
|
66
|
+
if ((0, java_1.isIdentifier)(fa.target) && fa.target.simpleName === 'props')
|
|
67
|
+
return fa;
|
|
68
|
+
if (fa.target.kind === java_1.J.Kind.FieldAccess) {
|
|
69
|
+
const targetFa = fa.target;
|
|
70
|
+
if (targetFa.name.element.simpleName === 'props')
|
|
71
|
+
return fa;
|
|
72
|
+
}
|
|
73
|
+
if (fa.target.kind === java_1.J.Kind.Identifier && fa.target.simpleName === 'this')
|
|
74
|
+
return fa;
|
|
75
|
+
const targetName = (0, java_1.isIdentifier)(fa.target) ? fa.target.simpleName : '(expression)';
|
|
76
|
+
dataTable.insertRow(ctx, {
|
|
77
|
+
filePath: this.filePath,
|
|
78
|
+
expression: `${targetName}.ref`
|
|
79
|
+
});
|
|
80
|
+
return (0, rewrite_1.foundSearchResult)(fa, "element.ref is deprecated, use element.props.ref");
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
}();
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
exports.FindElementRef = FindElementRef;
|
|
88
|
+
//# sourceMappingURL=find-element-ref.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find-element-ref.js","sourceRoot":"","sources":["../../src/react19/find-element-ref.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,kDAAiH;AACjH,gEAAsE;AACtE,oDAA0D;AAE1D,MAAM,aAAa;CAMlB;AAJG;IADC,IAAA,gBAAM,EAAC,EAAC,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,6CAA6C,EAAC,CAAC;+CAC7E;AAGlB;IADC,IAAA,gBAAM,EAAC,EAAC,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,oCAAoC,EAAC,CAAC;iDACnE;AAqBxB,MAAa,cAAe,SAAQ,gBAAM;IAA1C;;QACa,SAAI,GAAG,2CAA2C,CAAC;QACnD,gBAAW,GAAG,2BAA2B,CAAC;QAC1C,gBAAW,GAAG,oIAAoI,CAAC;QAEpJ,cAAS,GAAG,IAAI,mBAAS,CAC7B,0CAA0C,EAC1C,2BAA2B,EAC3B,+DAA+D,EAC/D,aAAa,CAChB,CAAC;IA6CN,CAAC;IA3CS,MAAM;;YACR,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;YAEjC,OAAO,IAAI,KAAM,SAAQ,8BAAmC;gBAAjD;;oBACC,aAAQ,GAAG,EAAE,CAAC;gBAqC1B,CAAC;gBAnCkB,sBAAsB,CAAC,EAAsB,EAAE,GAAqB;;;;;;wBAC/E,IAAI,CAAC,QAAQ,GAAG,MAAA,EAAE,CAAC,UAAU,mCAAI,EAAE,CAAC;wBACpC,OAAO,OAAM,sBAAsB,YAAC,EAAE,EAAE,GAAG,EAAE;oBACjD,CAAC;iBAAA;gBAEc,gBAAgB,CAAC,WAA0B,EAAE,GAAqB;;;;;wBAC7E,IAAI,EAAE,GAAG,MAAM,OAAM,gBAAgB,YAAC,WAAW,EAAE,GAAG,CAAkB,CAAC;wBAEzE,IAAI,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,KAAK,KAAK;4BAAE,OAAO,EAAE,CAAC;wBAGpD,IAAI,IAAA,mBAAY,EAAC,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,UAAU,KAAK,MAAM;4BAAE,OAAO,EAAE,CAAC;wBAG1E,IAAI,IAAA,mBAAY,EAAC,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,UAAU,KAAK,OAAO;4BAAE,OAAO,EAAE,CAAC;wBAG3E,IAAI,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,QAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;4BACxC,MAAM,QAAQ,GAAG,EAAE,CAAC,MAAuB,CAAC;4BAC5C,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,KAAK,OAAO;gCAAE,OAAO,EAAE,CAAC;wBAChE,CAAC;wBAGD,IAAI,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,QAAC,CAAC,IAAI,CAAC,UAAU,IAAK,EAAE,CAAC,MAAuB,CAAC,UAAU,KAAK,MAAM;4BAAE,OAAO,EAAE,CAAC;wBAGzG,MAAM,UAAU,GAAG,IAAA,mBAAY,EAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC;wBAEnF,SAAS,CAAC,SAAS,CAAC,GAAG,EAAE;4BACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;4BACvB,UAAU,EAAE,GAAG,UAAU,MAAM;yBAClC,CAAC,CAAC;wBAEH,OAAO,IAAA,2BAAiB,EAAC,EAAE,EAAE,kDAAkD,CAAC,CAAC;oBACrF,CAAC;iBAAA;aACJ,EAAE,CAAC;QACR,CAAC;KAAA;CACJ;AAvDD,wCAuDC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { ExecutionContext, Recipe, TreeVisitor } from "@openrewrite/rewrite";
|
|
2
|
+
export declare class FindLegacyContextAPI extends Recipe {
|
|
3
|
+
readonly name = "org.openrewrite.react.19.find-legacy-context-api";
|
|
4
|
+
readonly displayName = "Find legacy Context API usage";
|
|
5
|
+
readonly description = "Finds usage of the legacy Context API (`contextTypes`, `childContextTypes`, `getChildContext`) that was removed in React 19. These must be migrated to `React.createContext()`.";
|
|
6
|
+
private dataTable;
|
|
7
|
+
editor(): Promise<TreeVisitor<any, ExecutionContext>>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=find-legacy-context-api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find-legacy-context-api.d.ts","sourceRoot":"","sources":["../../src/react19/find-legacy-context-api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,gBAAgB,EAAqB,MAAM,EAAE,WAAW,EAAC,MAAM,sBAAsB,CAAC;AA8BjH,qBAAa,oBAAqB,SAAQ,MAAM;IAC5C,QAAQ,CAAC,IAAI,sDAAsD;IACnE,QAAQ,CAAC,WAAW,mCAAmC;IACvD,QAAQ,CAAC,WAAW,qLAAqL;IAEzM,OAAO,CAAC,SAAS,CAKf;IAEI,MAAM,IAAI,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;CAkH9D"}
|