From d440d3ded38c5348867dcb8b9968b491bed1fd61 Mon Sep 17 00:00:00 2001 From: Trivikram Kamat <16024985+trivikr@users.noreply.github.com> Date: Wed, 10 Apr 2024 21:10:30 -0700 Subject: [PATCH] Transform promise() on APIs called on client created inside constructor (#843) --- .changeset/tasty-pugs-smile.md | 5 +++ .../api-promise/client-class-member.input.js | 15 ++++++++ .../api-promise/client-class-member.input.ts | 17 +++++++++ .../api-promise/client-class-member.output.js | 15 ++++++++ .../api-promise/client-class-member.output.ts | 17 +++++++++ .../apis/getClientIdNamesFromNewExpr.ts | 36 ++++++++++++++----- .../apis/getClientIdThisExpressions.ts | 28 ++++++++++++--- 7 files changed, 120 insertions(+), 13 deletions(-) create mode 100644 .changeset/tasty-pugs-smile.md diff --git a/.changeset/tasty-pugs-smile.md b/.changeset/tasty-pugs-smile.md new file mode 100644 index 000000000..103fa3d91 --- /dev/null +++ b/.changeset/tasty-pugs-smile.md @@ -0,0 +1,5 @@ +--- +"aws-sdk-js-codemod": patch +--- + +Transform promise() on APIs called on client created inside constructor diff --git a/src/transforms/v2-to-v3/__fixtures__/api-promise/client-class-member.input.js b/src/transforms/v2-to-v3/__fixtures__/api-promise/client-class-member.input.js index 704d34b78..d59b579a8 100644 --- a/src/transforms/v2-to-v3/__fixtures__/api-promise/client-class-member.input.js +++ b/src/transforms/v2-to-v3/__fixtures__/api-promise/client-class-member.input.js @@ -13,4 +13,19 @@ class ClientClassMember { async listTagsOfResource() { return await this.clientInClass.listTagsOfResource({ ResourceArn: "STRING_VALUE" }).promise(); } +} + +// Client as class member with creation inside constructor +class ClientClassMemberConstructor { + constructor() { + this.clientInClassCtr = new AWS.DynamoDB(); + } + + async listTables() { + return this.clientInClassCtr.listTables().promise(); + } + + async listTagsOfResource() { + return this.clientInClassCtr.listTagsOfResource({ ResourceArn: "STRING_VALUE" }).promise(); + } } \ No newline at end of file diff --git a/src/transforms/v2-to-v3/__fixtures__/api-promise/client-class-member.input.ts b/src/transforms/v2-to-v3/__fixtures__/api-promise/client-class-member.input.ts index 178c367ec..a0af45020 100644 --- a/src/transforms/v2-to-v3/__fixtures__/api-promise/client-class-member.input.ts +++ b/src/transforms/v2-to-v3/__fixtures__/api-promise/client-class-member.input.ts @@ -15,4 +15,21 @@ class ClientClassMember { async listTagsOfResource() { return this.clientInClass.listTagsOfResource({ ResourceArn: "STRING_VALUE" }).promise(); } +} + +// Client as class member with creation inside constructor +class ClientClassMemberConstructor { + private clientInClassCtr: AWS.DynamoDB; + + constructor() { + this.clientInClassCtr = new AWS.DynamoDB(); + } + + async listTables() { + return this.clientInClassCtr.listTables().promise(); + } + + async listTagsOfResource() { + return this.clientInClassCtr.listTagsOfResource({ ResourceArn: "STRING_VALUE" }).promise(); + } } \ No newline at end of file diff --git a/src/transforms/v2-to-v3/__fixtures__/api-promise/client-class-member.output.js b/src/transforms/v2-to-v3/__fixtures__/api-promise/client-class-member.output.js index 882aacdd8..ee10f218f 100644 --- a/src/transforms/v2-to-v3/__fixtures__/api-promise/client-class-member.output.js +++ b/src/transforms/v2-to-v3/__fixtures__/api-promise/client-class-member.output.js @@ -13,4 +13,19 @@ class ClientClassMember { async listTagsOfResource() { return await this.clientInClass.listTagsOfResource({ ResourceArn: "STRING_VALUE" }); } +} + +// Client as class member with creation inside constructor +class ClientClassMemberConstructor { + constructor() { + this.clientInClassCtr = new DynamoDB(); + } + + async listTables() { + return this.clientInClassCtr.listTables(); + } + + async listTagsOfResource() { + return this.clientInClassCtr.listTagsOfResource({ ResourceArn: "STRING_VALUE" }); + } } \ No newline at end of file diff --git a/src/transforms/v2-to-v3/__fixtures__/api-promise/client-class-member.output.ts b/src/transforms/v2-to-v3/__fixtures__/api-promise/client-class-member.output.ts index 120b4982b..443b7f77d 100644 --- a/src/transforms/v2-to-v3/__fixtures__/api-promise/client-class-member.output.ts +++ b/src/transforms/v2-to-v3/__fixtures__/api-promise/client-class-member.output.ts @@ -15,4 +15,21 @@ class ClientClassMember { async listTagsOfResource() { return this.clientInClass.listTagsOfResource({ ResourceArn: "STRING_VALUE" }); } +} + +// Client as class member with creation inside constructor +class ClientClassMemberConstructor { + private clientInClassCtr: DynamoDB; + + constructor() { + this.clientInClassCtr = new DynamoDB(); + } + + async listTables() { + return this.clientInClassCtr.listTables(); + } + + async listTagsOfResource() { + return this.clientInClassCtr.listTagsOfResource({ ResourceArn: "STRING_VALUE" }); + } } \ No newline at end of file diff --git a/src/transforms/v2-to-v3/apis/getClientIdNamesFromNewExpr.ts b/src/transforms/v2-to-v3/apis/getClientIdNamesFromNewExpr.ts index 3f859bbce..c8a559e16 100644 --- a/src/transforms/v2-to-v3/apis/getClientIdNamesFromNewExpr.ts +++ b/src/transforms/v2-to-v3/apis/getClientIdNamesFromNewExpr.ts @@ -1,4 +1,4 @@ -import { Collection, Identifier, JSCodeshift, NewExpression } from "jscodeshift"; +import { Collection, Identifier, JSCodeshift, MemberExpression, NewExpression } from "jscodeshift"; import { DOCUMENT_CLIENT, DYNAMODB, DYNAMODB_DOCUMENT_CLIENT } from "../config"; import { getClientNewExpression } from "../utils"; @@ -15,10 +15,7 @@ const getNamesFromVariableDeclarator = ( newExpression: NewExpression ) => source - .find(j.VariableDeclarator, { - id: { type: "Identifier" }, - init: newExpression, - }) + .find(j.VariableDeclarator, { id: { type: "Identifier" }, init: newExpression }) .nodes() .map((variableDeclarator) => (variableDeclarator.id as Identifier).name); @@ -28,12 +25,29 @@ const getNamesFromAssignmentPattern = ( newExpression: NewExpression ) => source - .find(j.AssignmentPattern, { - left: { type: "Identifier" }, + .find(j.AssignmentPattern, { left: { type: "Identifier" }, right: newExpression }) + .nodes() + .map((assignmentPattern) => (assignmentPattern.left as Identifier).name); + +const getNamesFromThisMemberExpression = ( + j: JSCodeshift, + source: Collection, + newExpression: NewExpression +) => + source + .find(j.AssignmentExpression, { + left: { + type: "MemberExpression", + object: { type: "ThisExpression" }, + property: { type: "Identifier" }, + }, right: newExpression, }) .nodes() - .map((assignmentPattern) => (assignmentPattern.left as Identifier).name); + .map( + (assignmentExpression) => + ((assignmentExpression.left as MemberExpression).property as Identifier).name + ); export const getClientIdNamesFromNewExpr = ( j: JSCodeshift, @@ -43,7 +57,11 @@ export const getClientIdNamesFromNewExpr = ( const namesFromGlobalModule = []; const namesFromServiceModule = []; - for (const getNames of [getNamesFromVariableDeclarator, getNamesFromAssignmentPattern]) { + for (const getNames of [ + getNamesFromVariableDeclarator, + getNamesFromAssignmentPattern, + getNamesFromThisMemberExpression, + ]) { if (v2GlobalName) { namesFromGlobalModule.push( ...getNames(j, source, getClientNewExpression({ v2GlobalName, v2ClientName })) diff --git a/src/transforms/v2-to-v3/apis/getClientIdThisExpressions.ts b/src/transforms/v2-to-v3/apis/getClientIdThisExpressions.ts index ffc43eab4..c249e8fda 100644 --- a/src/transforms/v2-to-v3/apis/getClientIdThisExpressions.ts +++ b/src/transforms/v2-to-v3/apis/getClientIdThisExpressions.ts @@ -8,8 +8,8 @@ export const getClientIdThisExpressions = ( source: Collection, clientIdentifiers: Identifier[] ): ThisMemberExpression[] => - clientIdentifiers.flatMap((clientIdentifier) => - source + clientIdentifiers.flatMap((clientIdentifier) => { + const clientIdsFromThisExpressionAssignment = source .find(j.AssignmentExpression, { left: thisMemberExpression as MemberExpression, right: clientIdentifier, @@ -24,5 +24,25 @@ export const getClientIdThisExpressions = ( name: ((assignmentExpression.left as MemberExpression).property as Identifier).name, }, }) as ThisMemberExpression - ) - ); + ); + + const clientIdsFromThisExpression = source + .find(j.MemberExpression, { + type: "MemberExpression", + object: { type: "ThisExpression" }, + property: clientIdentifier, + }) + .nodes() + .map( + (memberExpression) => + ({ + ...thisMemberExpression, + property: { + type: "Identifier", + name: (memberExpression.property as Identifier).name, + }, + }) as ThisMemberExpression + )[0]; + + return [...clientIdsFromThisExpressionAssignment, clientIdsFromThisExpression]; + });