@openrewrite/recipes-nodejs 0.34.0 → 0.35.0-20251120-132843

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,cAAc,EAAC,MAAM,sBAAsB,CAAC;AAOpD,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,cAAc,QAOhD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,cAAc,EAAC,MAAM,sBAAsB,CAAC;AAQpD,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,cAAc,QAQhD"}
package/dist/index.js CHANGED
@@ -7,6 +7,7 @@ const process_features_tls_1 = require("./migrate/process-features-tls");
7
7
  const crypto_constructors_1 = require("./migrate/crypto-constructors");
8
8
  const util_log_1 = require("./migrate/util-log");
9
9
  const util_extend_1 = require("./migrate/util-extend");
10
+ const crypto_fips_1 = require("./migrate/crypto-fips");
10
11
  function activate(registry) {
11
12
  registry.register(util_type_checking_1.UseNativeTypeCheckingMethods);
12
13
  registry.register(buffer_slice_1.ReplaceDeprecatedBufferSlice);
@@ -14,5 +15,6 @@ function activate(registry) {
14
15
  registry.register(crypto_constructors_1.ReplaceCryptoConstructors);
15
16
  registry.register(util_log_1.ReplaceUtilLog);
16
17
  registry.register(util_extend_1.ReplaceUtilExtend);
18
+ registry.register(crypto_fips_1.ReplaceCryptoFips);
17
19
  }
18
20
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AASA,4BAOC;AAhBD,qEAA0E;AAC1E,yDAAoE;AAEpE,yEAAwF;AACxF,uEAAwE;AACxE,iDAAkD;AAClD,uDAAwD;AAGxD,SAAgB,QAAQ,CAAC,QAAwB;IAC7C,QAAQ,CAAC,QAAQ,CAAC,iDAA4B,CAAC,CAAC;IAChD,QAAQ,CAAC,QAAQ,CAAC,2CAA4B,CAAC,CAAC;IAChD,QAAQ,CAAC,QAAQ,CAAC,+DAAwC,CAAC,CAAC;IAC5D,QAAQ,CAAC,QAAQ,CAAC,+CAAyB,CAAC,CAAC;IAC7C,QAAQ,CAAC,QAAQ,CAAC,yBAAc,CAAC,CAAC;IAClC,QAAQ,CAAC,QAAQ,CAAC,+BAAiB,CAAC,CAAC;AACzC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AAUA,4BAQC;AAlBD,qEAA0E;AAC1E,yDAAoE;AAEpE,yEAAwF;AACxF,uEAAwE;AACxE,iDAAkD;AAClD,uDAAwD;AACxD,uDAAwD;AAGxD,SAAgB,QAAQ,CAAC,QAAwB;IAC7C,QAAQ,CAAC,QAAQ,CAAC,iDAA4B,CAAC,CAAC;IAChD,QAAQ,CAAC,QAAQ,CAAC,2CAA4B,CAAC,CAAC;IAChD,QAAQ,CAAC,QAAQ,CAAC,+DAAwC,CAAC,CAAC;IAC5D,QAAQ,CAAC,QAAQ,CAAC,+CAAyB,CAAC,CAAC;IAC7C,QAAQ,CAAC,QAAQ,CAAC,yBAAc,CAAC,CAAC;IAClC,QAAQ,CAAC,QAAQ,CAAC,+BAAiB,CAAC,CAAC;IACrC,QAAQ,CAAC,QAAQ,CAAC,+BAAiB,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { ExecutionContext, Recipe, TreeVisitor } from "@openrewrite/rewrite";
2
+ export declare class ReplaceCryptoFips extends Recipe {
3
+ readonly name = "org.openrewrite.node.migrate.crypto.replace-crypto-fips";
4
+ readonly displayName: string;
5
+ readonly description: string;
6
+ readonly tags: string[];
7
+ editor(): Promise<TreeVisitor<any, ExecutionContext>>;
8
+ }
9
+ //# sourceMappingURL=crypto-fips.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto-fips.d.ts","sourceRoot":"","sources":["../../src/migrate/crypto-fips.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,gBAAgB,EAAE,MAAM,EAAE,WAAW,EAAC,MAAM,sBAAsB,CAAC;AAO3E,qBAAa,iBAAkB,SAAQ,MAAM;IACzC,QAAQ,CAAC,IAAI,6DAA4D;IACzE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAqF;IACjH,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAgI;IAC5J,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAe;IAEhC,MAAM,IAAI,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;CAmE9D"}
@@ -0,0 +1,82 @@
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.ReplaceCryptoFips = 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
+ class ReplaceCryptoFips extends rewrite_1.Recipe {
17
+ constructor() {
18
+ super(...arguments);
19
+ this.name = "org.openrewrite.node.migrate.crypto.replace-crypto-fips";
20
+ this.displayName = "Replace deprecated `crypto.fips` with `crypto.getFips()` and `crypto.setFips()`";
21
+ this.description = "Replace deprecated `crypto.fips` property access with `crypto.getFips()` for reads and `crypto.setFips(value)` for writes.";
22
+ this.tags = ["DEP0093"];
23
+ }
24
+ editor() {
25
+ return __awaiter(this, void 0, void 0, function* () {
26
+ return new class extends javascript_1.JavaScriptVisitor {
27
+ isCryptoFipsAccess(fieldAccess) {
28
+ if (fieldAccess.name.element.simpleName !== "fips") {
29
+ return false;
30
+ }
31
+ if (fieldAccess.target.kind === java_1.J.Kind.Identifier) {
32
+ const identifier = fieldAccess.target;
33
+ const idType = identifier.type;
34
+ if ((idType === null || idType === void 0 ? void 0 : idType.kind) === java_1.Type.Kind.Class) {
35
+ const classType = idType;
36
+ return classType.fullyQualifiedName === "crypto" ||
37
+ classType.fullyQualifiedName === "node:crypto";
38
+ }
39
+ }
40
+ return false;
41
+ }
42
+ visitAssignment(assignment, p) {
43
+ const _super = Object.create(null, {
44
+ visitAssignment: { get: () => super.visitAssignment }
45
+ });
46
+ return __awaiter(this, void 0, void 0, function* () {
47
+ const assign = yield _super.visitAssignment.call(this, assignment, p);
48
+ if (assign.variable.kind === java_1.J.Kind.FieldAccess) {
49
+ const fieldAccess = assign.variable;
50
+ if (this.isCryptoFipsAccess(fieldAccess)) {
51
+ const cryptoIdentifier = fieldAccess.target;
52
+ const value = assign.assignment.element;
53
+ return yield (0, javascript_1.template) `${cryptoIdentifier}.setFips(${value})`.apply(assign, this.cursor);
54
+ }
55
+ }
56
+ return assign;
57
+ });
58
+ }
59
+ visitFieldAccess(fieldAccess, p) {
60
+ const _super = Object.create(null, {
61
+ visitFieldAccess: { get: () => super.visitFieldAccess }
62
+ });
63
+ return __awaiter(this, void 0, void 0, function* () {
64
+ var _a;
65
+ const field = yield _super.visitFieldAccess.call(this, fieldAccess, p);
66
+ if (this.isCryptoFipsAccess(field)) {
67
+ const parent = (_a = this.cursor.parent) === null || _a === void 0 ? void 0 : _a.value;
68
+ if ((parent === null || parent === void 0 ? void 0 : parent.kind) === java_1.J.Kind.Assignment && parent.variable === field) {
69
+ return field;
70
+ }
71
+ const cryptoIdentifier = field.target;
72
+ return yield (0, javascript_1.template) `${cryptoIdentifier}.getFips()`.apply(field, this.cursor);
73
+ }
74
+ return field;
75
+ });
76
+ }
77
+ };
78
+ });
79
+ }
80
+ }
81
+ exports.ReplaceCryptoFips = ReplaceCryptoFips;
82
+ //# sourceMappingURL=crypto-fips.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto-fips.js","sourceRoot":"","sources":["../../src/migrate/crypto-fips.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,kDAA2E;AAC3E,gEAA4E;AAC5E,oDAA8D;AAK9D,MAAa,iBAAkB,SAAQ,gBAAM;IAA7C;;QACa,SAAI,GAAG,yDAAyD,CAAA;QAChE,gBAAW,GAAW,iFAAiF,CAAC;QACxG,gBAAW,GAAW,4HAA4H,CAAC;QACnJ,SAAI,GAAa,CAAC,SAAS,CAAC,CAAC;IAqE1C,CAAC;IAnES,MAAM;;YACR,OAAO,IAAI,KAAM,SAAQ,8BAAmC;gBAGhD,kBAAkB,CAAC,WAA0B;oBAEjD,IAAI,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,KAAK,MAAM,EAAE,CAAC;wBACjD,OAAO,KAAK,CAAC;oBACjB,CAAC;oBAGD,IAAI,WAAW,CAAC,MAAM,CAAC,IAAI,KAAK,QAAC,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;wBAChD,MAAM,UAAU,GAAG,WAAW,CAAC,MAAsB,CAAC;wBACtD,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC;wBAG/B,IAAI,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,IAAI,MAAK,WAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;4BACnC,MAAM,SAAS,GAAG,MAAoB,CAAC;4BAEvC,OAAO,SAAS,CAAC,kBAAkB,KAAK,QAAQ;gCACzC,SAAS,CAAC,kBAAkB,KAAK,aAAa,CAAC;wBAC1D,CAAC;oBACL,CAAC;oBAED,OAAO,KAAK,CAAC;gBACjB,CAAC;gBAGe,eAAe,CAAC,UAAwB,EAAE,CAAmB;;;;;wBACzE,MAAM,MAAM,GAAG,MAAM,OAAM,eAAe,YAAC,UAAU,EAAE,CAAC,CAAiB,CAAC;wBAG1E,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,QAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;4BAC9C,MAAM,WAAW,GAAG,MAAM,CAAC,QAAyB,CAAC;4BAErD,IAAI,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,EAAE,CAAC;gCACvC,MAAM,gBAAgB,GAAG,WAAW,CAAC,MAAM,CAAC;gCAC5C,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC;gCAGxC,OAAO,MAAM,IAAA,qBAAQ,EAAA,GAAG,gBAAgB,YAAY,KAAK,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;4BAC5F,CAAC;wBACL,CAAC;wBAED,OAAO,MAAM,CAAC;oBAClB,CAAC;iBAAA;gBAGe,gBAAgB,CAAC,WAA0B,EAAE,CAAmB;;;;;;wBAC5E,MAAM,KAAK,GAAG,MAAM,OAAM,gBAAgB,YAAC,WAAW,EAAE,CAAC,CAAkB,CAAC;wBAE5E,IAAI,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;4BAEjC,MAAM,MAAM,GAAG,MAAA,IAAI,CAAC,MAAM,CAAC,MAAM,0CAAE,KAAK,CAAC;4BACzC,IAAI,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,IAAI,MAAK,QAAC,CAAC,IAAI,CAAC,UAAU,IAAK,MAAuB,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;gCACpF,OAAO,KAAK,CAAC;4BACjB,CAAC;4BAGD,MAAM,gBAAgB,GAAG,KAAK,CAAC,MAAM,CAAC;4BACtC,OAAO,MAAM,IAAA,qBAAQ,EAAA,GAAG,gBAAgB,YAAY,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;wBACnF,CAAC;wBAED,OAAO,KAAK,CAAC;oBACjB,CAAC;iBAAA;aACJ,CAAC;QACN,CAAC;KAAA;CACJ;AAzED,8CAyEC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openrewrite/recipes-nodejs",
3
- "version": "0.34.0",
3
+ "version": "0.35.0-20251120-132843",
4
4
  "license": "Moderne Source Available License",
5
5
  "description": "OpenRewrite recipes for Node.js library migrations.",
6
6
  "homepage": "https://github.com/moderneinc/rewrite-node",
package/src/index.ts CHANGED
@@ -5,6 +5,7 @@ import {RemoveUsageOfProcessFeaturesTlsConstants} from "./migrate/process-featur
5
5
  import {ReplaceCryptoConstructors} from "./migrate/crypto-constructors";
6
6
  import {ReplaceUtilLog} from "./migrate/util-log";
7
7
  import {ReplaceUtilExtend} from "./migrate/util-extend";
8
+ import {ReplaceCryptoFips} from "./migrate/crypto-fips";
8
9
 
9
10
 
10
11
  export function activate(registry: RecipeRegistry) {
@@ -14,4 +15,5 @@ export function activate(registry: RecipeRegistry) {
14
15
  registry.register(ReplaceCryptoConstructors);
15
16
  registry.register(ReplaceUtilLog);
16
17
  registry.register(ReplaceUtilExtend);
18
+ registry.register(ReplaceCryptoFips);
17
19
  }
@@ -0,0 +1,81 @@
1
+ import {ExecutionContext, Recipe, TreeVisitor} from "@openrewrite/rewrite";
2
+ import {JavaScriptVisitor, template} from "@openrewrite/rewrite/javascript";
3
+ import {Expression, J, Type} from "@openrewrite/rewrite/java";
4
+
5
+ /**
6
+ * Replace deprecated crypto.fips property with crypto.getFips() and crypto.setFips()
7
+ */
8
+ export class ReplaceCryptoFips extends Recipe {
9
+ readonly name = "org.openrewrite.node.migrate.crypto.replace-crypto-fips"
10
+ readonly displayName: string = "Replace deprecated `crypto.fips` with `crypto.getFips()` and `crypto.setFips()`";
11
+ readonly description: string = "Replace deprecated `crypto.fips` property access with `crypto.getFips()` for reads and `crypto.setFips(value)` for writes.";
12
+ readonly tags: string[] = ["DEP0093"];
13
+
14
+ async editor(): Promise<TreeVisitor<any, ExecutionContext>> {
15
+ return new class extends JavaScriptVisitor<ExecutionContext> {
16
+
17
+ // Check if a field access is accessing the 'fips' property on the crypto module
18
+ private isCryptoFipsAccess(fieldAccess: J.FieldAccess): boolean {
19
+ // Check if accessing .fips
20
+ if (fieldAccess.name.element.simpleName !== "fips") {
21
+ return false;
22
+ }
23
+
24
+ // Check if the target is an identifier with type crypto
25
+ if (fieldAccess.target.kind === J.Kind.Identifier) {
26
+ const identifier = fieldAccess.target as J.Identifier;
27
+ const idType = identifier.type;
28
+
29
+ // Check if the identifier type is the crypto module
30
+ if (idType?.kind === Type.Kind.Class) {
31
+ const classType = idType as Type.Class;
32
+ // Support both 'crypto' and 'node:crypto' imports
33
+ return classType.fullyQualifiedName === "crypto" ||
34
+ classType.fullyQualifiedName === "node:crypto";
35
+ }
36
+ }
37
+
38
+ return false;
39
+ }
40
+
41
+ // Handle assignments to crypto.fips
42
+ protected async visitAssignment(assignment: J.Assignment, p: ExecutionContext): Promise<J | undefined> {
43
+ const assign = await super.visitAssignment(assignment, p) as J.Assignment;
44
+
45
+ // Check if assigning to crypto.fips
46
+ if (assign.variable.kind === J.Kind.FieldAccess) {
47
+ const fieldAccess = assign.variable as J.FieldAccess;
48
+
49
+ if (this.isCryptoFipsAccess(fieldAccess)) {
50
+ const cryptoIdentifier = fieldAccess.target;
51
+ const value = assign.assignment.element;
52
+
53
+ // Replace crypto.fips = value with crypto.setFips(value)
54
+ return await template`${cryptoIdentifier}.setFips(${value})`.apply(assign, this.cursor);
55
+ }
56
+ }
57
+
58
+ return assign;
59
+ }
60
+
61
+ // Handle reading from crypto.fips
62
+ protected async visitFieldAccess(fieldAccess: J.FieldAccess, p: ExecutionContext): Promise<J | undefined> {
63
+ const field = await super.visitFieldAccess(fieldAccess, p) as J.FieldAccess;
64
+
65
+ if (this.isCryptoFipsAccess(field)) {
66
+ // Don't transform if this is the left side of an assignment (handled in visitAssignment)
67
+ const parent = this.cursor.parent?.value;
68
+ if (parent?.kind === J.Kind.Assignment && (parent as J.Assignment).variable === field) {
69
+ return field;
70
+ }
71
+
72
+ // This is a read operation - replace with crypto.getFips()
73
+ const cryptoIdentifier = field.target;
74
+ return await template`${cryptoIdentifier}.getFips()`.apply(field, this.cursor);
75
+ }
76
+
77
+ return field;
78
+ }
79
+ };
80
+ }
81
+ }