diff --git a/.changeset/chatty-walls-fold.md b/.changeset/chatty-walls-fold.md new file mode 100644 index 000000000..62fb8c467 --- /dev/null +++ b/.changeset/chatty-walls-fold.md @@ -0,0 +1,5 @@ +--- +"aws-sdk-js-codemod": patch +--- + +Support transformation for client require diff --git a/src/transforms/v2-to-v3/__fixtures__/client-require.input.ts b/src/transforms/v2-to-v3/__fixtures__/client-require.input.ts new file mode 100644 index 000000000..5b47dbb61 --- /dev/null +++ b/src/transforms/v2-to-v3/__fixtures__/client-require.input.ts @@ -0,0 +1,3 @@ +const DynamoDB = require("aws-sdk/clients/dynamodb"); + +const client = new DynamoDB(); \ No newline at end of file diff --git a/src/transforms/v2-to-v3/__fixtures__/client-require.output.ts b/src/transforms/v2-to-v3/__fixtures__/client-require.output.ts new file mode 100644 index 000000000..dc89cd98a --- /dev/null +++ b/src/transforms/v2-to-v3/__fixtures__/client-require.output.ts @@ -0,0 +1,5 @@ +const { + DynamoDB +} = require("@aws-sdk/client-dynamodb"); + +const client = new DynamoDB(); \ No newline at end of file diff --git a/src/transforms/v2-to-v3/transformer.ts b/src/transforms/v2-to-v3/transformer.ts index 7d30d13da..f5dde541b 100644 --- a/src/transforms/v2-to-v3/transformer.ts +++ b/src/transforms/v2-to-v3/transformer.ts @@ -8,7 +8,7 @@ import { getV2DefaultImportName, removeDefaultModuleIfNotUsed, removePromiseCalls, - removeV2ClientImport, + removeV2ClientModule, replaceClientCreation, } from "./utils"; @@ -28,7 +28,7 @@ export default function transformer(file: FileInfo, api: API) { for (const [v2ClientName, v3ClientMetadata] of Object.entries(clientMetadata).reverse()) { const { v3ClientName, v3ClientPackageName } = v3ClientMetadata; addV3ClientModule(j, source, { v2ClientName, v3ClientName, v3ClientPackageName }); - removeV2ClientImport(j, source, v2ClientName); + removeV2ClientModule(j, source, v2ClientName); removePromiseCalls(j, source, { v2DefaultImportName, v2ClientName }); replaceClientCreation(j, source, { v2DefaultImportName, v2ClientName, v3ClientName }); } diff --git a/src/transforms/v2-to-v3/utils/getV2ClientImportNames.ts b/src/transforms/v2-to-v3/utils/getV2ClientImportNames.ts index 6e497e2c8..f2fa49510 100644 --- a/src/transforms/v2-to-v3/utils/getV2ClientImportNames.ts +++ b/src/transforms/v2-to-v3/utils/getV2ClientImportNames.ts @@ -1,4 +1,4 @@ -import { Collection, JSCodeshift } from "jscodeshift"; +import { Collection, Identifier, JSCodeshift } from "jscodeshift"; import { CLIENT_NAMES } from "./config"; @@ -21,6 +21,20 @@ export const getV2ClientImportNames = (j: JSCodeshift, source: Collection): } }); }); + + // Add specifier name to v2ClientImportNames if it is required in the source. + source + .find(j.VariableDeclarator, { + id: { type: "Identifier" }, + init: { + type: "CallExpression", + callee: { type: "Identifier", name: "require" }, + arguments: [{ type: "Literal", value: `aws-sdk/clients/${clientName.toLowerCase()}` }], + }, + }) + .forEach((declerationPath) => { + v2ClientImportNames.push((declerationPath.value.id as Identifier).name); + }); } return v2ClientImportNames; diff --git a/src/transforms/v2-to-v3/utils/index.ts b/src/transforms/v2-to-v3/utils/index.ts index ca5ec5eba..0860251e0 100644 --- a/src/transforms/v2-to-v3/utils/index.ts +++ b/src/transforms/v2-to-v3/utils/index.ts @@ -6,6 +6,6 @@ export * from "./getV2ClientNames"; export * from "./getV2DefaultImportName"; export * from "./removeDefaultModuleIfNotUsed"; export * from "./removePromiseCalls"; -export * from "./removeV2ClientImport"; +export * from "./removeV2ClientModule"; export * from "./replaceClientCreation"; export * from "./types"; diff --git a/src/transforms/v2-to-v3/utils/removeV2ClientModule.ts b/src/transforms/v2-to-v3/utils/removeV2ClientModule.ts new file mode 100644 index 000000000..20c82368a --- /dev/null +++ b/src/transforms/v2-to-v3/utils/removeV2ClientModule.ts @@ -0,0 +1,14 @@ +import { Collection, JSCodeshift } from "jscodeshift"; + +import { containsRequire } from "./containsRequire"; +import { removeV2ClientImport } from "./removeV2ClientImport"; +import { removeV2ClientRequire } from "./removeV2ClientRequire"; + +export const removeV2ClientModule = ( + j: JSCodeshift, + source: Collection, + v2ClientName: string +) => + containsRequire(j, source) + ? removeV2ClientRequire(j, source, v2ClientName) + : removeV2ClientImport(j, source, v2ClientName); diff --git a/src/transforms/v2-to-v3/utils/removeV2ClientRequire.ts b/src/transforms/v2-to-v3/utils/removeV2ClientRequire.ts new file mode 100644 index 000000000..38e66dffa --- /dev/null +++ b/src/transforms/v2-to-v3/utils/removeV2ClientRequire.ts @@ -0,0 +1,18 @@ +import { Collection, Identifier, JSCodeshift, VariableDeclarator } from "jscodeshift"; + +import { getRequireVariableDeclaration } from "./getRequireVariableDeclaration"; + +export const removeV2ClientRequire = ( + j: JSCodeshift, + source: Collection, + v2ClientName: string +) => { + const importSourceName = `aws-sdk/clients/${v2ClientName.toLowerCase()}`; + getRequireVariableDeclaration(j, source, importSourceName) + .filter( + (nodePath) => + ((nodePath.value.declarations[0] as VariableDeclarator).id as Identifier).name === + v2ClientName + ) + .remove(); +};