Skip to content

Commit 66568ab

Browse files
authored
Add utility getV2ClientTSTypeRef (#230)
1 parent a104a57 commit 66568ab

File tree

5 files changed

+84
-65
lines changed

5 files changed

+84
-65
lines changed

.changeset/angry-jokes-give.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+
Add utility getV2ClientTSTypeRef
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import { Identifier, TSQualifiedName, TSTypeReference } from "jscodeshift";
2+
3+
export interface V2ClientTsTypeRefOptions {
4+
v2DefaultModuleName?: string;
5+
v2ClientName: string;
6+
withoutRightSection?: boolean;
7+
}
8+
9+
export const getV2ClientTSTypeRef = ({
10+
v2DefaultModuleName,
11+
v2ClientName,
12+
withoutRightSection = false,
13+
}: V2ClientTsTypeRefOptions): TSTypeReference => {
14+
if (v2DefaultModuleName) {
15+
const idWithGlobalName = {
16+
type: "TSQualifiedName",
17+
left: { type: "Identifier", name: v2DefaultModuleName },
18+
right: { type: "Identifier", name: v2ClientName },
19+
} as TSQualifiedName;
20+
21+
return {
22+
typeName: {
23+
...(withoutRightSection ? { left: idWithGlobalName } : idWithGlobalName),
24+
},
25+
} as TSTypeReference;
26+
}
27+
28+
const idWithClientName = { type: "Identifier", name: v2ClientName } as Identifier;
29+
return {
30+
typeName: {
31+
...(withoutRightSection ? { left: idWithClientName } : idWithClientName),
32+
},
33+
} as TSTypeReference;
34+
};

src/transforms/v2-to-v3/utils/get/getV2ClientTypeNames.ts

Lines changed: 30 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -8,56 +8,54 @@ import {
88
TSTypeReference,
99
} from "jscodeshift";
1010

11+
import { getV2ClientTSTypeRef } from "./getV2ClientTSTypeRef";
1112
import { getV2ServiceModulePath } from "./getV2ServiceModulePath";
1213

1314
export interface GetV2ClientTypeNamesOptions {
1415
v2ClientName: string;
1516
v2DefaultModuleName: string;
1617
}
1718

18-
const getRightIdentifierName = (node: TSTypeReference) =>
19-
((node.typeName as TSQualifiedName).right as Identifier).name;
19+
const getRightIdentifierName = (
20+
j: JSCodeshift,
21+
source: Collection<unknown>,
22+
tsTypeRef: TSTypeReference
23+
) =>
24+
source
25+
.find(j.TSTypeReference, tsTypeRef)
26+
.nodes()
27+
.map((node) => (node.typeName as TSQualifiedName).right)
28+
.filter((node) => node.type === "Identifier")
29+
.map((node) => (node as Identifier).name);
2030

2131
export const getV2ClientTypeNames = (
2232
j: JSCodeshift,
2333
source: Collection<unknown>,
2434
{ v2ClientName, v2DefaultModuleName }: GetV2ClientTypeNamesOptions
2535
): string[] => {
26-
const v2DefaultTypeName = {
27-
typeName: {
28-
left: {
29-
left: { type: "Identifier", name: v2DefaultModuleName },
30-
right: { type: "Identifier", name: v2ClientName },
31-
},
32-
},
33-
} as TSTypeReference;
34-
35-
const v2ClientTypeName = {
36-
typeName: {
37-
left: { type: "Identifier", name: v2ClientName },
38-
},
39-
} as TSTypeReference;
36+
const v2GlobalTSTypeRef = getV2ClientTSTypeRef({
37+
v2ClientName,
38+
v2DefaultModuleName,
39+
withoutRightSection: true,
40+
});
41+
const v2ClientTSTypeRef = getV2ClientTSTypeRef({ v2ClientName, withoutRightSection: true });
4042

41-
const v2ClientTypeFromNamedImport = {
43+
const v2ServiceModuleImportDeclaration = {
4244
type: "ImportDeclaration",
4345
source: { value: getV2ServiceModulePath(v2ClientName) },
4446
} as ImportDeclaration;
4547

4648
return [
47-
...source
48-
.find(j.TSTypeReference, v2DefaultTypeName)
49-
.nodes()
50-
.map((node) => getRightIdentifierName(node)),
51-
...source
52-
.find(j.TSTypeReference, v2ClientTypeName)
53-
.nodes()
54-
.map((node) => getRightIdentifierName(node)),
55-
...source
56-
.find(j.ImportDeclaration, v2ClientTypeFromNamedImport)
57-
.nodes()
58-
.map((node) => node.specifiers)
59-
.flat()
60-
.filter((node) => (node as ImportSpecifier).type === "ImportSpecifier")
61-
.map((node) => ((node as ImportSpecifier).local as Identifier).name),
49+
...new Set([
50+
...getRightIdentifierName(j, source, v2GlobalTSTypeRef),
51+
...getRightIdentifierName(j, source, v2ClientTSTypeRef),
52+
...source
53+
.find(j.ImportDeclaration, v2ServiceModuleImportDeclaration)
54+
.nodes()
55+
.map((node) => node.specifiers)
56+
.flat()
57+
.filter((node) => (node as ImportSpecifier).type === "ImportSpecifier")
58+
.map((node) => ((node as ImportSpecifier).local as Identifier).name),
59+
]),
6260
];
6361
};

src/transforms/v2-to-v3/utils/get/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ export * from "./getV2ClientIdThisExpressions";
55
export * from "./getV2ClientNames";
66
export * from "./getV2ClientNamesFromDefault";
77
export * from "./getV2ClientNewExpression";
8+
export * from "./getV2ClientTSTypeRef";
89
export * from "./getV2ClientTypeNames";
910
export * from "./getV2DefaultModuleName";
1011
export * from "./getV2ServiceModulePath";

src/transforms/v2-to-v3/utils/replace/replaceTSTypeReference.ts

Lines changed: 14 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,6 @@
1-
import {
2-
ASTPath,
3-
Collection,
4-
Identifier,
5-
JSCodeshift,
6-
TSQualifiedName,
7-
TSTypeReference,
8-
} from "jscodeshift";
1+
import { Collection, Identifier, JSCodeshift, TSQualifiedName, TSTypeReference } from "jscodeshift";
92

10-
import { getV2ClientTypeNames, getV3ClientTypeName } from "../get";
3+
import { getV2ClientTSTypeRef, getV2ClientTypeNames, getV3ClientTypeName } from "../get";
114
import { isV2ClientInputOutputType } from "../isV2ClientInputOutputType";
125

136
export interface ReplaceTypeReferenceOptions {
@@ -16,6 +9,9 @@ export interface ReplaceTypeReferenceOptions {
169
v2DefaultModuleName: string;
1710
}
1811

12+
const isRightSectionIdentifier = (node: TSTypeReference) =>
13+
(node.typeName as TSQualifiedName).right.type === "Identifier";
14+
1915
const getRightIdentifierName = (node: TSTypeReference) =>
2016
((node.typeName as TSQualifiedName).right as Identifier).name;
2117

@@ -29,38 +25,25 @@ export const replaceTSTypeReference = (
2925
): void => {
3026
// Replace type reference to client created with default module.
3127
source
32-
.find(j.TSTypeReference, {
33-
typeName: {
34-
left: { type: "Identifier", name: v2DefaultModuleName },
35-
right: { type: "Identifier", name: v2ClientName },
36-
},
37-
})
28+
.find(j.TSTypeReference, getV2ClientTSTypeRef({ v2ClientName, v2DefaultModuleName }))
3829
.replaceWith((v2ClientType) =>
3930
j.tsTypeReference(j.identifier(v3ClientName), v2ClientType.node.typeParameters)
4031
);
4132

4233
// Replace type reference to client input/output created with default module.
4334
source
44-
.find(j.TSTypeReference, {
45-
typeName: {
46-
type: "TSQualifiedName",
47-
left: {
48-
left: { type: "Identifier", name: v2DefaultModuleName },
49-
right: { type: "Identifier", name: v2ClientName },
50-
},
51-
right: { type: "Identifier" },
52-
},
53-
})
35+
.find(
36+
j.TSTypeReference,
37+
getV2ClientTSTypeRef({ v2ClientName, v2DefaultModuleName, withoutRightSection: true })
38+
)
39+
.filter((v2ClientType) => isRightSectionIdentifier(v2ClientType.node))
5440
.filter((v2ClientType) => isV2ClientInputOutputType(getRightIdentifierName(v2ClientType.node)))
5541
.replaceWith((v2ClientType) => getV3ClientTypeName(getRightIdentifierName(v2ClientType.node)));
5642

5743
// Replace type reference to client created with client module.
5844
source
59-
.find(j.TSTypeReference, {
60-
typeName: {
61-
left: { type: "Identifier", name: v2ClientName },
62-
},
63-
})
45+
.find(j.TSTypeReference, getV2ClientTSTypeRef({ v2ClientName, withoutRightSection: true }))
46+
.filter((v2ClientType) => isRightSectionIdentifier(v2ClientType.node))
6447
.filter((v2ClientType) => isV2ClientInputOutputType(getRightIdentifierName(v2ClientType.node)))
6548
.replaceWith((v2ClientType) => getV3ClientTypeName(getRightIdentifierName(v2ClientType.node)));
6649

@@ -69,9 +52,7 @@ export const replaceTSTypeReference = (
6952
for (const v2ClientTypeName of v2ClientTypeNames) {
7053
if (isV2ClientInputOutputType(v2ClientTypeName)) {
7154
source
72-
.find(j.TSTypeReference, {
73-
typeName: { type: "Identifier", name: v2ClientTypeName },
74-
})
55+
.find(j.TSTypeReference, { typeName: { type: "Identifier", name: v2ClientTypeName } })
7556
.filter((v2ClientType) => isV2ClientInputOutputType(getIdentifierName(v2ClientType.node)))
7657
.replaceWith((v2ClientType) => getV3ClientTypeName(getIdentifierName(v2ClientType.node)));
7758
}

0 commit comments

Comments
 (0)