Skip to content

Commit

Permalink
Use filter API to delete identifiers from require object pattern (#322)
Browse files Browse the repository at this point in the history
  • Loading branch information
trivikr committed Jan 7, 2023
1 parent ad3a4c9 commit 0f4ca88
Show file tree
Hide file tree
Showing 14 changed files with 127 additions and 89 deletions.
5 changes: 5 additions & 0 deletions .changeset/red-bears-fry.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"aws-sdk-js-codemod": patch
---

Use filter API to delete identifiers from require object pattern
20 changes: 18 additions & 2 deletions scripts/generateNewClientTests/getServiceRequireDeepOutput.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,19 @@
import { getServiceRequireOutput } from "./getServiceRequireOutput";
import { CLIENT_NAMES_MAP, CLIENT_PACKAGE_NAMES_MAP } from "../../src/transforms/v2-to-v3/config";
import { CLIENTS_TO_TEST } from "./config";
import { getV3ClientsNewExpressionCode } from "./getV3ClientsNewExpressionCode";

export const getServiceRequireDeepOutput = getServiceRequireOutput;
export const getServiceRequireDeepOutput = (codegenComment: string) => {
let serviceRequireDeepOutputContent = `${codegenComment}\n`;

for (const v2ClientName of CLIENTS_TO_TEST) {
const v3ClientName = CLIENT_NAMES_MAP[v2ClientName];
const v3ClientPackageName = `@aws-sdk/${CLIENT_PACKAGE_NAMES_MAP[v2ClientName]}`;
const v3RequireKeyValuePair =
v3ClientName === v2ClientName ? v3ClientName : `${v3ClientName}: ${v2ClientName}`;
serviceRequireDeepOutputContent += `const {\n ${v3RequireKeyValuePair}\n} = require("${v3ClientPackageName}");\n`;
}
serviceRequireDeepOutputContent += `\n`;
serviceRequireDeepOutputContent += getV3ClientsNewExpressionCode(CLIENTS_TO_TEST);

return serviceRequireDeepOutputContent;
};
4 changes: 1 addition & 3 deletions scripts/generateNewClientTests/getServiceRequireInput.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,7 @@ import { getV2ClientsNewExpressionCode } from "./getV2ClientsNewExpressionCode";
export const getServiceRequireInput = (codegenComment: string) => {
let serviceRequireInputContent = `${codegenComment}\n`;

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

Expand Down
20 changes: 2 additions & 18 deletions scripts/generateNewClientTests/getServiceRequireOutput.ts
Original file line number Diff line number Diff line change
@@ -1,19 +1,3 @@
import { CLIENT_NAMES_MAP, CLIENT_PACKAGE_NAMES_MAP } from "../../src/transforms/v2-to-v3/config";
import { CLIENTS_TO_TEST } from "./config";
import { getV3ClientsNewExpressionCode } from "./getV3ClientsNewExpressionCode";
import { getGlobalRequireOutput } from "./getGlobalRequireOutput";

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

for (const v2ClientName of CLIENTS_TO_TEST) {
const v3ClientName = CLIENT_NAMES_MAP[v2ClientName];
const v3ClientPackageName = `@aws-sdk/${CLIENT_PACKAGE_NAMES_MAP[v2ClientName]}`;
const v3RequireKeyValuePair =
v3ClientName === v2ClientName ? v3ClientName : `${v3ClientName}: ${v2ClientName}`;
serviceRequireOutputContent += `const {\n ${v3RequireKeyValuePair}\n} = require("${v3ClientPackageName}");\n`;
}
serviceRequireOutputContent += `\n`;
serviceRequireOutputContent += getV3ClientsNewExpressionCode(CLIENTS_TO_TEST);

return serviceRequireOutputContent;
};
export const getServiceRequireOutput = getGlobalRequireOutput;
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
// 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");
const { AccessAnalyzer } = require("aws-sdk");
const { Discovery } = require("aws-sdk");
const { ACM, AccessAnalyzer, Discovery } = require("aws-sdk");

new ACM();
new AccessAnalyzer();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@
// 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");
AccessAnalyzer
} = require("@aws-sdk/client-accessanalyzer"),
{
ACM
} = require("@aws-sdk/client-acm"),
{
ApplicationDiscoveryService: Discovery
} = require("@aws-sdk/client-application-discovery-service");

new ACM();
new AccessAnalyzer();
Expand Down
4 changes: 2 additions & 2 deletions src/transforms/v2-to-v3/modules/addV3ClientDefaultRequire.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Collection, JSCodeshift } from "jscodeshift";

import { getV3ClientDefaultLocalName } from "../utils";
import { getRequireVariableDeclarators } from "./getRequireVariableDeclarators";
import { getRequireDeclarators } from "./getRequireDeclarators";
import { getV2RequireDeclarator } from "./getV2RequireDeclarator";
import { V3ClientModulesOptions } from "./types";

Expand All @@ -11,7 +11,7 @@ export const addV3ClientDefaultRequire = (
{ v2ClientName, v2ClientLocalName, v3ClientPackageName, v2GlobalName }: V3ClientModulesOptions
) => {
const identifierName = getV3ClientDefaultLocalName(v2ClientLocalName);
const existingRequires = getRequireVariableDeclarators(j, source, v3ClientPackageName);
const existingRequires = getRequireDeclarators(j, source, v3ClientPackageName);

if (
existingRequires &&
Expand Down
26 changes: 10 additions & 16 deletions src/transforms/v2-to-v3/modules/addV3ClientNamedRequire.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import { Collection, Identifier, JSCodeshift, ObjectPattern } from "jscodeshift";
import { Collection, JSCodeshift, ObjectPattern } from "jscodeshift";

import { getV3ClientDefaultLocalName } from "../utils";
import { getRequireVariableDeclarators } from "./getRequireVariableDeclarators";
import { getRequireDeclarators } from "./getRequireDeclarators";
import { getRequireDeclaratorsWithIdentifier } from "./getRequireDeclaratorsWithIdentifier";
import { getV2RequireDeclarator } from "./getV2RequireDeclarator";
import { getV3ClientRequireProperty } from "./getV3ClientRequireProperty";
import { V3ClientModulesOptions } from "./types";
Expand All @@ -22,7 +23,7 @@ export const addV3ClientNamedRequire = (
keyName: v3ClientName,
valueName: v2ClientLocalName,
});
const existingRequires = getRequireVariableDeclarators(j, source, v3ClientPackageName);
const existingRequires = getRequireDeclarators(j, source, v3ClientPackageName);

if (existingRequires && existingRequires.nodes().length > 0) {
const existingRequireProperties = existingRequires
Expand All @@ -47,20 +48,13 @@ export const addV3ClientNamedRequire = (
return;
}

const v3ClientDefaultLocalNameIdentifier = {
type: "Identifier",
name: v3ClientDefaultLocalName,
} as Identifier;
const requireDeclaratorsWithIdentifier = getRequireDeclaratorsWithIdentifier(j, source, {
identifierName: v3ClientDefaultLocalName,
sourceValue: v3ClientPackageName,
});

// prettier-ignore
const v3ClientDefaultLocalNameIdentifierDeclarators =
getRequireVariableDeclarators(j, source, v3ClientPackageName, v3ClientDefaultLocalNameIdentifier);

if (
v3ClientDefaultLocalNameIdentifierDeclarators &&
v3ClientDefaultLocalNameIdentifierDeclarators.nodes().length > 0
) {
v3ClientDefaultLocalNameIdentifierDeclarators.at(0).insertAfter(
if (requireDeclaratorsWithIdentifier && requireDeclaratorsWithIdentifier.nodes().length > 0) {
requireDeclaratorsWithIdentifier.at(0).insertAfter(
j.variableDeclarator(j.objectPattern([v3ClientObjectProperty]), {
type: "Identifier",
name: v3ClientDefaultLocalName,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
import { Collection, Identifier, JSCodeshift, ObjectPattern } from "jscodeshift";
import { Collection, JSCodeshift } from "jscodeshift";

export const getRequireVariableDeclarators = (
export const getRequireDeclarators = (
j: JSCodeshift,
source: Collection<unknown>,
sourceValue: string,
id?: Identifier | ObjectPattern
sourceValue: string
) =>
source.find(j.VariableDeclarator, {
...(id && { id }),
init: {
arguments: [{ value: sourceValue }],
callee: { type: "Identifier", name: "require" },
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { Collection, JSCodeshift } from "jscodeshift";

import { getRequireDeclarators } from "./getRequireDeclarators";

export interface GetRequireDeclaratorsWithIdentifier {
identifierName: string;
sourceValue: string;
}

export const getRequireDeclaratorsWithIdentifier = (
j: JSCodeshift,
source: Collection<unknown>,
{ identifierName, sourceValue }: GetRequireDeclaratorsWithIdentifier
) =>
getRequireDeclarators(j, source, sourceValue).filter((declarator) => {
if (declarator.value.id.type !== "Identifier") {
return false;
}
return declarator.value.id.name === identifierName;
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import { Collection, JSCodeshift } from "jscodeshift";

import { getRequireDeclarators } from "./getRequireDeclarators";

export interface GetRequireDeclaratorsWithObjectPattern {
identifierName: string;
sourceValue: string;
}

export const getRequireDeclaratorsWithObjectPattern = (
j: JSCodeshift,
source: Collection<unknown>,
{ identifierName, sourceValue }: GetRequireDeclaratorsWithObjectPattern
) =>
getRequireDeclarators(j, source, sourceValue).filter((declarator) => {
if (declarator.value.id.type !== "ObjectPattern") {
return false;
}
const { properties } = declarator.value.id;
return properties.some(
(property) =>
(property.type === "Property" || property.type === "ObjectProperty") &&
property.value.type === "Identifier" &&
property.value.name === identifierName
);
});
42 changes: 20 additions & 22 deletions src/transforms/v2-to-v3/modules/getV2RequireDeclarator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@ import { Collection, Identifier, JSCodeshift, ObjectPattern } from "jscodeshift"

import { PACKAGE_NAME } from "../config";
import { getV2ServiceModulePath } from "../utils";
import { getRequireVariableDeclarators } from "./getRequireVariableDeclarators";
import { getRequireDeclaratorsWithIdentifier } from "./getRequireDeclaratorsWithIdentifier";
import { getRequireDeclaratorsWithObjectPattern } from "./getRequireDeclaratorsWithObjectPattern";

export interface GetV2BaseDeclaratorOptions {
v2ClientName: string;
Expand All @@ -16,35 +17,32 @@ export const getV2RequireDeclarator = (
{ v2ClientName, v2ClientLocalName, v2GlobalName }: GetV2BaseDeclaratorOptions
) => {
if (v2GlobalName) {
const v2GlobalNameIdentifier = { type: "Identifier", name: v2GlobalName } as Identifier;
// prettier-ignore
const v2GlobalNameIdentifierDeclarators =
getRequireVariableDeclarators(j, source, PACKAGE_NAME, v2GlobalNameIdentifier);
const requireDeclaratorsWithIdentifier = getRequireDeclaratorsWithIdentifier(j, source, {
identifierName: v2GlobalName,
sourceValue: PACKAGE_NAME,
});

if (v2GlobalNameIdentifierDeclarators && v2GlobalNameIdentifierDeclarators.nodes().length > 0) {
return v2GlobalNameIdentifierDeclarators;
if (requireDeclaratorsWithIdentifier.size() > 0) {
return requireDeclaratorsWithIdentifier;
}
}

const v2ClientLocalNameObject = {
type: "ObjectPattern",
properties: [{ value: { type: "Identifier", name: v2ClientLocalName } }],
} as ObjectPattern;
// prettier-ignore
const v2ClientLocalNameObjectDeclarators =
getRequireVariableDeclarators(j, source, PACKAGE_NAME, v2ClientLocalNameObject);
const requireDeclaratorsWithObjectPattern = getRequireDeclaratorsWithObjectPattern(j, source, {
identifierName: v2ClientLocalName,
sourceValue: PACKAGE_NAME,
});

if (v2ClientLocalNameObjectDeclarators && v2ClientLocalNameObjectDeclarators.nodes().length > 0) {
return v2ClientLocalNameObjectDeclarators;
if (requireDeclaratorsWithObjectPattern.size() > 0) {
return requireDeclaratorsWithObjectPattern;
}

const v2ServiceModulePath = getV2ServiceModulePath(v2ClientName);
const v2ClientNameIdentifier = { type: "Identifier", name: v2ClientLocalName } as Identifier;
// prettier-ignore
const v2ClientNameIdentifierDeclarators =
getRequireVariableDeclarators(j, source, v2ServiceModulePath, v2ClientNameIdentifier);
const requireDeclaratorsWithIdentifier = getRequireDeclaratorsWithIdentifier(j, source, {
identifierName: v2ClientLocalName,
sourceValue: v2ServiceModulePath,
});

if (v2ClientNameIdentifierDeclarators && v2ClientNameIdentifierDeclarators.nodes().length > 0) {
return v2ClientNameIdentifierDeclarators;
if (requireDeclaratorsWithIdentifier.size() > 0) {
return requireDeclaratorsWithIdentifier;
}
};
10 changes: 6 additions & 4 deletions src/transforms/v2-to-v3/modules/removeRequireIdentifier.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Collection, Identifier, JSCodeshift } from "jscodeshift";
import { Collection, JSCodeshift } from "jscodeshift";

import { getRequireVariableDeclarators } from "./getRequireVariableDeclarators";
import { getRequireDeclaratorsWithIdentifier } from "./getRequireDeclaratorsWithIdentifier";

export interface RemoveRequireIdentifierOptions {
localName: string;
Expand All @@ -12,8 +12,10 @@ export const removeRequireIdentifier = (
source: Collection<unknown>,
{ localName, sourceValue }: RemoveRequireIdentifierOptions
) => {
const id = { type: "Identifier", name: localName } as Identifier;
const requireDeclarators = getRequireVariableDeclarators(j, source, sourceValue, id);
const requireDeclarators = getRequireDeclaratorsWithIdentifier(j, source, {
identifierName: localName,
sourceValue,
});

requireDeclarators.forEach((varDeclarator) => {
const varDeclarationCollection = j(varDeclarator).closest(j.VariableDeclaration);
Expand Down
11 changes: 5 additions & 6 deletions src/transforms/v2-to-v3/modules/removeRequireObjectProperty.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Collection, JSCodeshift, ObjectPattern } from "jscodeshift";

import { getRequireVariableDeclarators } from "./getRequireVariableDeclarators";
import { getRequireDeclaratorsWithObjectPattern } from "./getRequireDeclaratorsWithObjectPattern";

export interface RemoveRequireObjectPropertyOptions {
localName: string;
Expand All @@ -12,11 +12,10 @@ export const removeRequireObjectProperty = (
source: Collection<unknown>,
{ localName, sourceValue }: RemoveRequireObjectPropertyOptions
) => {
const id = {
type: "ObjectPattern",
properties: [{ value: { type: "Identifier", name: localName } }],
} as ObjectPattern;
const requireDeclarators = getRequireVariableDeclarators(j, source, sourceValue, id);
const requireDeclarators = getRequireDeclaratorsWithObjectPattern(j, source, {
identifierName: localName,
sourceValue,
});

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

0 comments on commit 0f4ca88

Please sign in to comment.