diff --git a/src/transforms/v2-to-v3/__fixtures__/ddb-doc-client/service-import-deep-named.output.js b/src/transforms/v2-to-v3/__fixtures__/ddb-doc-client/service-import-deep-named.output.js index e74dbc32a..56deb2311 100644 --- a/src/transforms/v2-to-v3/__fixtures__/ddb-doc-client/service-import-deep-named.output.js +++ b/src/transforms/v2-to-v3/__fixtures__/ddb-doc-client/service-import-deep-named.output.js @@ -1,6 +1,5 @@ -// Transformation of DocumentClient named import from deep path is unsupported in aws-sdk-js-codemod. -// Please convert to a default import, and re-run aws-sdk-js-codemod. -import { DocumentClient } from "aws-sdk/clients/dynamodb"; +import { DynamoDBDocument } from "@aws-sdk/lib-dynamodb"; +import { DynamoDB } from "@aws-sdk/client-dynamodb"; -const documentClient = new DocumentClient({ region: "us-west-2" }); -const response = await documentClient.scan({ TableName: "TABLE_NAME" }).promise(); \ No newline at end of file +const documentClient = DynamoDBDocument.from(new DynamoDB()); +const response = await documentClient.scan({ TableName: "TABLE_NAME" }); \ No newline at end of file diff --git a/src/transforms/v2-to-v3/__fixtures__/ddb-doc-client/service-require-deep-named.output.js b/src/transforms/v2-to-v3/__fixtures__/ddb-doc-client/service-require-deep-named.output.js index 4a0d6510a..9eba8982d 100644 --- a/src/transforms/v2-to-v3/__fixtures__/ddb-doc-client/service-require-deep-named.output.js +++ b/src/transforms/v2-to-v3/__fixtures__/ddb-doc-client/service-require-deep-named.output.js @@ -1,6 +1,5 @@ -// Transformation of DocumentClient named import from deep path is unsupported in aws-sdk-js-codemod. -// Please convert to a default import, and re-run aws-sdk-js-codemod. -const { DocumentClient } = require("aws-sdk/clients/dynamodb"); +const { DynamoDBDocument } = require("@aws-sdk/lib-dynamodb"); +const { DynamoDB } = require("@aws-sdk/client-dynamodb"); -const documentClient = new DocumentClient({ region: "us-west-2" }); +const documentClient = DynamoDBDocument.from(new DynamoDB()); const response = await documentClient.scan({ TableName: "TABLE_NAME" }).promise(); \ No newline at end of file diff --git a/src/transforms/v2-to-v3/apis/addNotSupportedComments.ts b/src/transforms/v2-to-v3/apis/addNotSupportedComments.ts deleted file mode 100644 index 56bd812dd..000000000 --- a/src/transforms/v2-to-v3/apis/addNotSupportedComments.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Collection, JSCodeshift } from "jscodeshift"; -import { getClientNamesFromDeepImport } from "../client-names"; -import { DYNAMODB } from "../config"; -import { ImportType } from "../modules"; -import { getNodesWithDocClientNamedImportFromDeepPath } from "./getNodesWithDocClientNamedImportFromDeepPath"; - -export const addNotSupportedComments = ( - j: JSCodeshift, - source: Collection, - importType: ImportType -) => { - const clientNamesFromDeepImport = getClientNamesFromDeepImport(source.toSource()); - - if (clientNamesFromDeepImport.includes(DYNAMODB)) { - const documentClientDeepNamedImportUnsupportedComments = [ - j.commentLine( - " Transformation of DocumentClient named import from deep path is unsupported in aws-sdk-js-codemod." - ), - j.commentLine(" Please convert to a default import, and re-run aws-sdk-js-codemod."), - ]; - - getNodesWithDocClientNamedImportFromDeepPath(j, source, importType).forEach((node) => { - const comments = node.value.comments || []; - node.value.comments = [...comments, ...documentClientDeepNamedImportUnsupportedComments]; - }); - } -}; diff --git a/src/transforms/v2-to-v3/apis/getNodesWithDocClientNamedImportFromDeepPath.ts b/src/transforms/v2-to-v3/apis/getNodesWithDocClientNamedImportFromDeepPath.ts deleted file mode 100644 index 29ed94eaf..000000000 --- a/src/transforms/v2-to-v3/apis/getNodesWithDocClientNamedImportFromDeepPath.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { - Collection, - JSCodeshift, - ObjectProperty, - Property, - VariableDeclaration, -} from "jscodeshift"; -import { DOCUMENT_CLIENT, DYNAMODB, OBJECT_PROPERTY_TYPE_LIST } from "../config"; -import { ImportType } from "../modules"; -import { getImportDeclarations } from "../modules/importModule"; -import { getRequireDeclarators } from "../modules/requireModule"; -import { getClientDeepImportPath } from "../utils"; - -export const getNodesWithDocClientNamedImportFromDeepPath = ( - j: JSCodeshift, - source: Collection, - importType: ImportType -) => { - const deepImportPath = getClientDeepImportPath(DYNAMODB); - - if (importType === ImportType.REQUIRE) { - return getRequireDeclarators(j, source, deepImportPath) - .filter( - (variableDeclarator) => - variableDeclarator.value.id.type === "ObjectPattern" && - (variableDeclarator.value.id.properties || []).some((property) => { - if (!OBJECT_PROPERTY_TYPE_LIST.includes(property.type)) { - return false; - } - const propertyKey = (property as Property | ObjectProperty).key; - return propertyKey.type === "Identifier" && propertyKey.name === DOCUMENT_CLIENT; - }) - ) - .map( - (variableDeclarator) => variableDeclarator.parentPath.parentPath - ) as Collection; - } - - return getImportDeclarations(j, source, deepImportPath).filter((importDeclaration) => - (importDeclaration.value.specifiers || []).some( - (importSpecifier) => - importSpecifier.type === "ImportSpecifier" && - importSpecifier.imported.name === DOCUMENT_CLIENT - ) - ); -}; diff --git a/src/transforms/v2-to-v3/apis/index.ts b/src/transforms/v2-to-v3/apis/index.ts index 416cbdc80..8dc7e504a 100644 --- a/src/transforms/v2-to-v3/apis/index.ts +++ b/src/transforms/v2-to-v3/apis/index.ts @@ -1,6 +1,5 @@ export * from "./addEmptyObjectForUndefined"; export * from "./addNotSupportedClientComments"; -export * from "./addNotSupportedComments"; export * from "./getClientIdentifiersRecord"; export * from "./getClientWaiterStates"; export * from "./getCommandName"; diff --git a/src/transforms/v2-to-v3/client-names/getClientNamesRecord.ts b/src/transforms/v2-to-v3/client-names/getClientNamesRecord.ts index f187d615d..f0436b6df 100644 --- a/src/transforms/v2-to-v3/client-names/getClientNamesRecord.ts +++ b/src/transforms/v2-to-v3/client-names/getClientNamesRecord.ts @@ -1,6 +1,6 @@ import { Collection, JSCodeshift } from "jscodeshift"; -import { CLIENT_NAMES, PACKAGE_NAME } from "../config"; +import { CLIENT_NAMES, DOCUMENT_CLIENT, DYNAMODB_DOCUMENT_CLIENT, PACKAGE_NAME } from "../config"; import { ImportType } from "../modules"; import * as importEqualsModule from "../modules/importEqualsModule"; import * as importModule from "../modules/importModule"; @@ -37,11 +37,23 @@ export const getClientNamesRecord = ( for (const clientName of clientNamesFromDeepImport) { const deepImportPath = getClientDeepImportPath(clientName); - const specifiersFromDeepImport = getImportSpecifiers(j, source, deepImportPath).filter( + const specifiersFromNamedImport = getImportSpecifiers(j, source, deepImportPath); + + const defaultSpecifiersFromDeepImport = specifiersFromNamedImport.filter( (importSpecifier) => !importSpecifier.importedName ); - if (specifiersFromDeepImport.length > 0) { - clientNamesRecord[clientName] = specifiersFromDeepImport[0].localName; + if (defaultSpecifiersFromDeepImport.length > 0) { + clientNamesRecord[clientName] = defaultSpecifiersFromDeepImport[0].localName; + } + + const namedSpecifiersFromDeepImport = specifiersFromNamedImport.filter( + (importSpecifier) => importSpecifier.importedName + ); + if ( + namedSpecifiersFromDeepImport.length > 0 && + namedSpecifiersFromDeepImport[0].importedName === DOCUMENT_CLIENT + ) { + clientNamesRecord[DYNAMODB_DOCUMENT_CLIENT] = namedSpecifiersFromDeepImport[0].localName; } } diff --git a/src/transforms/v2-to-v3/config/CLIENT_NAMES_MAP.ts b/src/transforms/v2-to-v3/config/CLIENT_NAMES_MAP.ts index 821a61d09..8db72db23 100644 --- a/src/transforms/v2-to-v3/config/CLIENT_NAMES_MAP.ts +++ b/src/transforms/v2-to-v3/config/CLIENT_NAMES_MAP.ts @@ -1,4 +1,5 @@ import { CLIENT_NAMES } from "./CLIENT_NAMES"; +import { DOCUMENT_CLIENT, DYNAMODB_DOCUMENT_CLIENT } from "./constants"; // The key is the client name in v2, and value is the client name in v3. export const CLIENT_NAMES_MAP: Record = { @@ -30,4 +31,5 @@ export const CLIENT_NAMES_MAP: Record = { SavingsPlans: "Savingsplans", StepFunctions: "SFN", TranscribeService: "Transcribe", + [DYNAMODB_DOCUMENT_CLIENT]: DOCUMENT_CLIENT, }; diff --git a/src/transforms/v2-to-v3/transformer.ts b/src/transforms/v2-to-v3/transformer.ts index 83f5717ba..055536847 100644 --- a/src/transforms/v2-to-v3/transformer.ts +++ b/src/transforms/v2-to-v3/transformer.ts @@ -1,7 +1,6 @@ import { API, FileInfo } from "jscodeshift"; import { - addNotSupportedComments, addNotSupportedClientComments, removePromiseCalls, replaceWaiterApi, @@ -49,8 +48,6 @@ const transformer = async (file: FileInfo, api: API) => { return file.source; } - addNotSupportedComments(j, source, importType); - const v2GlobalName = getGlobalNameFromModule(j, source); const v2ClientNamesRecord = getClientNamesRecord(j, source, importType);