Skip to content

Commit

Permalink
Support requires with MemberExpression property (#340)
Browse files Browse the repository at this point in the history
  • Loading branch information
trivikr committed Jan 9, 2023
1 parent 9982796 commit 8b09bb6
Show file tree
Hide file tree
Showing 12 changed files with 144 additions and 0 deletions.
5 changes: 5 additions & 0 deletions .changeset/twelve-clouds-mix.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"aws-sdk-js-codemod": patch
---

Support requires with MemberExpression property
14 changes: 14 additions & 0 deletions scripts/generateNewClientTests/getGlobalRequirePropertyInput.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { CLIENTS_TO_TEST } from "./config";
import { getV2ClientsNewExpressionCode } from "./getV2ClientsNewExpressionCode";

export const getGlobalRequirePropertyInput = (codegenComment: string) => {
let globalRequireInputContent = `${codegenComment}\n`;

for (const clientName of CLIENTS_TO_TEST) {
globalRequireInputContent += `const ${clientName} = require("aws-sdk").${clientName};\n`;
}
globalRequireInputContent += `\n`;
globalRequireInputContent += getV2ClientsNewExpressionCode(CLIENTS_TO_TEST);

return globalRequireInputContent;
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import { getServiceRequireDeepOutput } from "./getServiceRequireDeepOutput";

export const getGlobalRequirePropertyOutput = getServiceRequireDeepOutput;
4 changes: 4 additions & 0 deletions scripts/generateNewClientTests/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ import { getGlobalImportInput } from "./getGlobalImportInput";
import { getGlobalImportOutput } from "./getGlobalImportOutput";
import { getGlobalRequireInput } from "./getGlobalRequireInput";
import { getGlobalRequireOutput } from "./getGlobalRequireOutput";
import { getGlobalRequirePropertyInput } from "./getGlobalRequirePropertyInput";
import { getGlobalRequirePropertyOutput } from "./getGlobalRequirePropertyOutput";
import { getServiceImportDeepInput } from "./getServiceImportDeepInput";
import { getServiceImportDeepOutput } from "./getServiceImportDeepOutput";
import { getServiceImportEqualsInput } from "./getServiceImportEqualsInput";
Expand Down Expand Up @@ -42,6 +44,8 @@ const newClientTestsPath = join(__dirname, "..", "..", newClientsTestsFolder);
["global-import-equals.output.ts", getGlobalImportEqualsOutput],
["global-require.input.js", getGlobalRequireInput],
["global-require.output.js", getGlobalRequireOutput],
["global-require-property.input.js", getGlobalRequirePropertyInput],
["global-require-property.output.js", getGlobalRequirePropertyOutput],
["service-import.input.js", getServiceImportInput],
["service-import.output.js", getServiceImportOutput],
["service-import-equals.input.ts", getServiceImportEqualsInput],
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
// This file is generated by scripts/generateNewClientTests/index.ts
// Do not edit this file directly. Instead, edit the script and run it to regenerate this file.
"use strict";
const ACM = require("aws-sdk").ACM;
const AccessAnalyzer = require("aws-sdk").AccessAnalyzer;
const Discovery = require("aws-sdk").Discovery;

new ACM();
new AccessAnalyzer();
new Discovery();
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// This file is generated by scripts/generateNewClientTests/index.ts
// Do not edit this file directly. Instead, edit the script and run it to regenerate this file.
"use strict";
const {
ACM
} = require("@aws-sdk/client-acm");
const {
AccessAnalyzer
} = require("@aws-sdk/client-accessanalyzer");
const {
ApplicationDiscoveryService: Discovery
} = require("@aws-sdk/client-application-discovery-service");

new ACM();
new AccessAnalyzer();
new Discovery();
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { Collection, Identifier, JSCodeshift, ObjectPattern, Property } from "jscodeshift";

import { CLIENT_NAMES, PACKAGE_NAME } from "../config";
import { getRequireDeclaratorsWithProperty } from "../modules";
import { getV2ServiceModulePath } from "../utils";
import { getRequireIds } from "./getRequireIds";

Expand Down Expand Up @@ -33,6 +34,25 @@ export const getV2ClientNamesRecordFromRequire = (
}
}

const declaratorsWithProperty = getRequireDeclaratorsWithProperty(j, source, {
sourceValue: PACKAGE_NAME,
}).nodes();

for (const declaratorWithProperty of declaratorsWithProperty) {
const { id, init } = declaratorWithProperty;
if (
id.type === "Identifier" &&
init != undefined &&
init.type === "MemberExpression" &&
init.property.type === "Identifier"
) {
const v2ClientName = (init.property as Identifier).name;
if (CLIENT_NAMES.includes(v2ClientName)) {
v2ClientNamesRecord[v2ClientName] = (id as Identifier).name;
}
}
}

for (const clientName of v2ClientNamesWithServiceModule) {
const deepRequirePath = getV2ServiceModulePath(clientName);
const idsFromDefaultImport = getRequireIds(j, source, deepRequirePath).filter(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import { Collection, JSCodeshift } from "jscodeshift";

export interface GetRequireDeclaratorsWithPropertyOptions {
localName?: string;
identifierName?: string;
sourceValue: string;
}

export const getRequireDeclaratorsWithProperty = (
j: JSCodeshift,
source: Collection<unknown>,
{ localName, identifierName, sourceValue }: GetRequireDeclaratorsWithPropertyOptions
) =>
source.find(j.VariableDeclarator, {
id: { type: "Identifier", ...(localName && { name: localName }) },
init: {
type: "MemberExpression",
object: {
type: "CallExpression",
callee: { type: "Identifier", name: "require" },
arguments: [{ value: sourceValue }],
},
property: { type: "Identifier", ...(identifierName && { name: identifierName }) },
},
});
10 changes: 10 additions & 0 deletions src/transforms/v2-to-v3/modules/getV2RequireDeclarator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { PACKAGE_NAME } from "../config";
import { getV2ServiceModulePath } from "../utils";
import { getRequireDeclaratorsWithIdentifier } from "./getRequireDeclaratorsWithIdentifier";
import { getRequireDeclaratorsWithObjectPattern } from "./getRequireDeclaratorsWithObjectPattern";
import { getRequireDeclaratorsWithProperty } from "./getRequireDeclaratorsWithProperty";

export interface GetV2BaseDeclaratorOptions {
v2ClientName: string;
Expand Down Expand Up @@ -36,6 +37,15 @@ export const getV2RequireDeclarator = (
return requireDeclaratorsWithObjectPattern;
}

const requireDeclaratorsWithProperty = getRequireDeclaratorsWithProperty(j, source, {
identifierName: v2ClientName,
sourceValue: PACKAGE_NAME,
});

if (requireDeclaratorsWithProperty.size() > 0) {
return requireDeclaratorsWithProperty;
}

const v2ServiceModulePath = getV2ServiceModulePath(v2ClientName);
const requireDeclaratorsWithIdentifier = getRequireDeclaratorsWithIdentifier(j, source, {
identifierName: v2ClientLocalName,
Expand Down
1 change: 1 addition & 0 deletions src/transforms/v2-to-v3/modules/index.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
export * from "./addV3ClientModules";
export * from "./getImportEqualsDeclaration";
export * from "./getImportSpecifiers";
export * from "./getRequireDeclaratorsWithProperty";
export * from "./getV2GlobalNameFromModule";
export * from "./hasRequire";
export * from "./removeV2ClientModule";
Expand Down
34 changes: 34 additions & 0 deletions src/transforms/v2-to-v3/modules/removeRequireProperty.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import { Collection, JSCodeshift } from "jscodeshift";

import { getRequireDeclaratorsWithProperty } from "./getRequireDeclaratorsWithProperty";

export interface RemoveRequireObjectPropertyOptions {
localName: string;
propertyName: string;
sourceValue: string;
}

export const removeRequireProperty = (
j: JSCodeshift,
source: Collection<unknown>,
{ localName, propertyName, sourceValue }: RemoveRequireObjectPropertyOptions
) => {
const requireDeclarators = getRequireDeclaratorsWithProperty(j, source, {
identifierName: propertyName,
localName,
sourceValue,
});

requireDeclarators.forEach((varDeclarator) => {
const varDeclarationCollection = j(varDeclarator).closest(j.VariableDeclaration);

// Remove VariableDeclarator as it contains the only identifier.
j(varDeclarator).remove();

// Remove VariableDeclaration if there are no declarations.
const varDeclaration = varDeclarationCollection.nodes()[0];
if (varDeclaration && varDeclaration.declarations?.length === 0) {
varDeclarationCollection.remove();
}
});
};
2 changes: 2 additions & 0 deletions src/transforms/v2-to-v3/modules/removeV2ClientModule.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import { removeImportEquals } from "./removeImportEquals";
import { removeImportNamed } from "./removeImportNamed";
import { removeRequireIdentifier } from "./removeRequireIdentifier";
import { removeRequireObjectProperty } from "./removeRequireObjectProperty";
import { removeRequireProperty } from "./removeRequireProperty";

export interface RemoveV2ClientModuleOptions {
v2ClientName: string;
Expand All @@ -31,6 +32,7 @@ export const removeV2ClientModule = (
if (hasRequire(j, source)) {
removeRequireIdentifier(j, source, defaultOptions);
removeRequireObjectProperty(j, source, namedOptions);
removeRequireProperty(j, source, { ...namedOptions, propertyName: v2ClientName });
} else if (hasImportEquals(j, source)) {
removeImportEquals(j, source, defaultOptions);
} else {
Expand Down

0 comments on commit 8b09bb6

Please sign in to comment.