Skip to content

Commit 88f6998

Browse files
authored
Remove client import equals if clients are not created (#310)
1 parent 004da6a commit 88f6998

9 files changed

+160
-85
lines changed

.changeset/fuzzy-singers-nail.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"aws-sdk-js-codemod": patch
3+
---
4+
5+
Remove client import equals if clients are not created
Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,3 @@
11
import AWS_S3 = require("@aws-sdk/client-s3");
22

3-
const {
4-
S3
5-
} = AWS_S3;
6-
73
const testTags: AWS_S3.Tag[] = [{ Key: "key", Value: "value" }];
Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,3 @@
11
import AWS_S3 = require("@aws-sdk/client-s3");
22

3-
const {
4-
S3
5-
} = AWS_S3;
6-
73
const testTags: AWS_S3.Tag[] = [{ Key: "key", Value: "value" }];
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import { Collection, JSCodeshift } from "jscodeshift";
2+
3+
import { getV3ClientDefaultLocalName } from "../utils";
4+
import { getImportEqualsDeclaration } from "./getImportEqualsDeclaration";
5+
import { getV2ImportEqualsDeclaration } from "./getV2ImportEqualsDeclaration";
6+
import { V3ClientModulesOptions } from "./types";
7+
8+
export const addV3ClientDefaultImportEquals = (
9+
j: JSCodeshift,
10+
source: Collection<unknown>,
11+
{ v2ClientLocalName, v2ClientName, v2GlobalName, v3ClientPackageName }: V3ClientModulesOptions
12+
) => {
13+
const v3ClientDefaultLocalName = getV3ClientDefaultLocalName(v2ClientLocalName);
14+
const existingImportEquals = source.find(
15+
j.TSImportEqualsDeclaration,
16+
getImportEqualsDeclaration(v3ClientPackageName)
17+
);
18+
19+
if (existingImportEquals.size()) {
20+
if (
21+
existingImportEquals
22+
.nodes()
23+
.some(
24+
(importEqualsDeclaration) => importEqualsDeclaration.id.name === v3ClientDefaultLocalName
25+
)
26+
) {
27+
return;
28+
}
29+
}
30+
31+
// Insert after global, or service import equals.
32+
const v2ImportEqualsDeclaration = getV2ImportEqualsDeclaration(j, source, {
33+
v2ClientName,
34+
v2ClientLocalName,
35+
v2GlobalName,
36+
}).at(0);
37+
38+
const importDeclaration = j.tsImportEqualsDeclaration(
39+
j.identifier(v3ClientDefaultLocalName),
40+
j.tsExternalModuleReference(j.stringLiteral(v3ClientPackageName))
41+
);
42+
43+
if (v2ImportEqualsDeclaration && v2ImportEqualsDeclaration.nodes().length > 0) {
44+
v2ImportEqualsDeclaration.at(0).insertAfter(importDeclaration);
45+
} else {
46+
// Unreachable code, throw error
47+
throw new Error(
48+
"Base Import Equals Declaration not found to insert new Import Declaration.\n" +
49+
"Please report your use case on https://github.com/awslabs/aws-sdk-js-codemod"
50+
);
51+
}
52+
};
Lines changed: 12 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1,80 +1,22 @@
1-
import { Collection, JSCodeshift, TSExternalModuleReference } from "jscodeshift";
1+
import { Collection, JSCodeshift } from "jscodeshift";
22

3-
import { PACKAGE_NAME } from "../config";
4-
import { getV2ServiceModulePath, getV3ClientDefaultLocalName } from "../utils";
5-
import { getImportEqualsDeclaration } from "./getImportEqualsDeclaration";
3+
import { addV3ClientDefaultImportEquals } from "./addV3ClientDefaultImportEquals";
4+
import { addV3ClientNamedImportEquals } from "./addV3ClientNamedImportEquals";
5+
import { getClientTSTypeRefCount } from "./getClientTSTypeRefCount";
6+
import { getNewExpressionCount } from "./getNewExpressionCount";
67
import { V3ClientModulesOptions } from "./types";
78

89
export const addV3ClientImportEquals = (
910
j: JSCodeshift,
1011
source: Collection<unknown>,
11-
{
12-
v2ClientLocalName,
13-
v2ClientName,
14-
v2GlobalName,
15-
v3ClientName,
16-
v3ClientPackageName,
17-
}: V3ClientModulesOptions
12+
options: V3ClientModulesOptions
1813
): void => {
19-
const v3ClientDefaultLocalName = getV3ClientDefaultLocalName(v2ClientLocalName);
20-
const existingImportEquals = source.find(
21-
j.TSImportEqualsDeclaration,
22-
getImportEqualsDeclaration(v3ClientPackageName)
23-
);
14+
addV3ClientDefaultImportEquals(j, source, options);
2415

25-
if (existingImportEquals.size()) {
26-
if (
27-
existingImportEquals
28-
.nodes()
29-
.some(
30-
(importEqualsDeclaration) => importEqualsDeclaration.id.name === v3ClientDefaultLocalName
31-
)
32-
) {
33-
return;
34-
}
16+
if (
17+
getNewExpressionCount(j, source, options) > 0 ||
18+
getClientTSTypeRefCount(j, source, options) > 0
19+
) {
20+
addV3ClientNamedImportEquals(j, source, options);
3521
}
36-
37-
// Insert after global, or service import equals.
38-
source
39-
.find(j.TSImportEqualsDeclaration, getImportEqualsDeclaration())
40-
.filter((importEqualsDeclaration) => {
41-
const identifierName = importEqualsDeclaration.value.id.name;
42-
const importEqualsModuleRef = importEqualsDeclaration.value
43-
.moduleReference as TSExternalModuleReference;
44-
const expressionValue = importEqualsModuleRef.expression.value;
45-
46-
if (expressionValue === PACKAGE_NAME && identifierName === v2GlobalName) {
47-
return true;
48-
}
49-
50-
if (
51-
expressionValue === getV2ServiceModulePath(v2ClientName) &&
52-
identifierName === v2ClientLocalName
53-
) {
54-
return true;
55-
}
56-
57-
return false;
58-
})
59-
.at(0)
60-
.insertAfter(
61-
j.variableDeclaration("const", [
62-
j.variableDeclarator(
63-
j.objectPattern([
64-
j.objectProperty.from({
65-
key: j.identifier(v3ClientName),
66-
value: j.identifier(v2ClientLocalName),
67-
shorthand: true,
68-
}),
69-
]),
70-
j.identifier(v3ClientDefaultLocalName)
71-
),
72-
])
73-
)
74-
.insertAfter(
75-
j.tsImportEqualsDeclaration(
76-
j.identifier(v3ClientDefaultLocalName),
77-
j.tsExternalModuleReference(j.stringLiteral(v3ClientPackageName))
78-
)
79-
);
8022
};

src/transforms/v2-to-v3/modules/addV3ClientImports.ts

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,16 @@ import { Collection, JSCodeshift } from "jscodeshift";
22

33
import { getV3ClientTypeNames } from "../ts-type";
44
import { addV3ClientDefaultImport } from "./addV3ClientDefaultImport";
5-
import { addV3ClientImportEquals } from "./addV3ClientImportEquals";
65
import { addV3ClientNamedImport } from "./addV3ClientNamedImport";
76
import { getClientTSTypeRefCount } from "./getClientTSTypeRefCount";
87
import { getNewExpressionCount } from "./getNewExpressionCount";
9-
import { hasImportEquals } from "./hasImportEquals";
108
import { V3ClientModulesOptions } from "./types";
119

1210
export const addV3ClientImports = (
1311
j: JSCodeshift,
1412
source: Collection<unknown>,
1513
options: V3ClientModulesOptions
1614
): void => {
17-
if (hasImportEquals(j, source)) {
18-
addV3ClientImportEquals(j, source, options);
19-
return;
20-
}
21-
2215
const { v2ClientLocalName, v2ClientName, v2GlobalName } = options;
2316
const v3ClientTypeNames = getV3ClientTypeNames(j, source, {
2417
v2ClientLocalName,

src/transforms/v2-to-v3/modules/addV3ClientModules.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import { Collection, JSCodeshift } from "jscodeshift";
22

3+
import { addV3ClientImportEquals } from "./addV3ClientImportEquals";
34
import { addV3ClientImports } from "./addV3ClientImports";
45
import { addV3ClientRequires } from "./addV3ClientRequires";
6+
import { hasImportEquals } from "./hasImportEquals";
57
import { hasRequire } from "./hasRequire";
68
import { V3ClientModulesOptions } from "./types";
79

@@ -12,4 +14,6 @@ export const addV3ClientModules = (
1214
): void =>
1315
hasRequire(j, source)
1416
? addV3ClientRequires(j, source, options)
17+
: hasImportEquals(j, source)
18+
? addV3ClientImportEquals(j, source, options)
1519
: addV3ClientImports(j, source, options);
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import { Collection, JSCodeshift } from "jscodeshift";
2+
3+
import { getV3ClientDefaultLocalName } from "../utils";
4+
import { getImportEqualsDeclaration } from "./getImportEqualsDeclaration";
5+
import { V3ClientModulesOptions } from "./types";
6+
7+
export const addV3ClientNamedImportEquals = (
8+
j: JSCodeshift,
9+
source: Collection<unknown>,
10+
{ v2ClientLocalName, v3ClientName, v3ClientPackageName }: V3ClientModulesOptions
11+
) => {
12+
const v3ClientDefaultLocalName = getV3ClientDefaultLocalName(v2ClientLocalName);
13+
const existingImportEquals = source.find(
14+
j.TSImportEqualsDeclaration,
15+
getImportEqualsDeclaration(v3ClientPackageName)
16+
);
17+
18+
const varDeclaration = j.variableDeclaration("const", [
19+
j.variableDeclarator(
20+
j.objectPattern([
21+
j.objectProperty.from({
22+
key: j.identifier(v3ClientName),
23+
value: j.identifier(v2ClientLocalName),
24+
shorthand: true,
25+
}),
26+
]),
27+
j.identifier(v3ClientDefaultLocalName)
28+
),
29+
]);
30+
31+
if (existingImportEquals.size()) {
32+
const v3ClientImportEquals = existingImportEquals.filter(
33+
(importEqualsDeclaration) =>
34+
importEqualsDeclaration.value.id.name === v3ClientDefaultLocalName
35+
);
36+
37+
if (v3ClientImportEquals.size() > 0) {
38+
v3ClientImportEquals.at(0).insertAfter(varDeclaration);
39+
return;
40+
}
41+
}
42+
43+
// Unreachable code, throw error
44+
throw new Error(
45+
"The named import equals can't exist on it's own.\n" +
46+
"Please report your use case on https://github.com/awslabs/aws-sdk-js-codemod"
47+
);
48+
};
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import { Collection, JSCodeshift, TSExternalModuleReference } from "jscodeshift";
2+
3+
import { PACKAGE_NAME } from "../config";
4+
import { getV2ServiceModulePath } from "../utils";
5+
import { getImportEqualsDeclaration } from "./getImportEqualsDeclaration";
6+
7+
export interface GetV2ImportEqualsDeclarationOptions {
8+
v2ClientName: string;
9+
v2ClientLocalName: string;
10+
v2GlobalName?: string;
11+
}
12+
13+
export const getV2ImportEqualsDeclaration = (
14+
j: JSCodeshift,
15+
source: Collection<unknown>,
16+
{ v2ClientName, v2ClientLocalName, v2GlobalName }: GetV2ImportEqualsDeclarationOptions
17+
) =>
18+
// Return global or service import declaration.
19+
source
20+
.find(j.TSImportEqualsDeclaration, getImportEqualsDeclaration())
21+
.filter((importEqualsDeclaration) => {
22+
const identifierName = importEqualsDeclaration.value.id.name;
23+
const importEqualsModuleRef = importEqualsDeclaration.value
24+
.moduleReference as TSExternalModuleReference;
25+
const expressionValue = importEqualsModuleRef.expression.value;
26+
27+
if (expressionValue === PACKAGE_NAME && identifierName === v2GlobalName) {
28+
return true;
29+
}
30+
31+
if (
32+
expressionValue === getV2ServiceModulePath(v2ClientName) &&
33+
identifierName === v2ClientLocalName
34+
) {
35+
return true;
36+
}
37+
38+
return false;
39+
});

0 commit comments

Comments
 (0)