1
- import { ASTPath , Collection , Identifier , JSCodeshift , TSQualifiedName } from "jscodeshift" ;
1
+ import { Collection , Identifier , JSCodeshift , TSQualifiedName , TSTypeReference } from "jscodeshift" ;
2
2
3
3
import { DOCUMENT_CLIENT , DYNAMODB , DYNAMODB_DOCUMENT_CLIENT } from "../config" ;
4
4
import { getClientTypeNames } from "./getClientTypeNames" ;
5
5
import { getTSQualifiedNameFromClientName } from "./getTSQualifiedNameFromClientName" ;
6
6
import { getV3ClientType } from "./getV3ClientType" ;
7
7
8
- export interface ReplaceTSQualifiedNameOptions {
8
+ export interface ReplaceTSTypeReferenceOptions {
9
9
v2ClientName : string ;
10
10
v2ClientLocalName : string ;
11
11
v2GlobalName ?: string ;
12
12
v3ClientName : string ;
13
13
}
14
14
15
- const isRightSectionIdentifier = ( node : TSQualifiedName ) => node . right . type === "Identifier" ;
15
+ const isRightSectionIdentifier = ( node : TSTypeReference ) =>
16
+ ( node . typeName as TSQualifiedName ) . right . type === "Identifier" ;
16
17
17
- const getRightIdentifierName = ( node : TSQualifiedName ) => ( node . right as Identifier ) . name ;
18
-
19
- const isParentTSQualifiedName = ( node : ASTPath < TSQualifiedName > ) =>
20
- node . parentPath ?. value . type === "TSQualifiedName" ;
18
+ const getRightIdentifierName = ( node : TSTypeReference ) =>
19
+ ( ( node . typeName as TSQualifiedName ) . right as Identifier ) . name ;
21
20
22
21
// Replace v2 client type reference with v3 client type reference.
23
- export const replaceTSQualifiedName = (
22
+ export const replaceTSTypeReference = (
24
23
j : JSCodeshift ,
25
24
source : Collection < unknown > ,
26
- options : ReplaceTSQualifiedNameOptions
25
+ options : ReplaceTSTypeReferenceOptions
27
26
) : void => {
28
27
const { v2ClientName, v2ClientLocalName, v2GlobalName, v3ClientName } = options ;
29
28
const clientTypeOptions = { v2ClientName, v2ClientLocalName } ;
30
29
31
30
if ( v2GlobalName ) {
32
31
// Replace type reference to client created with global name.
33
32
source
34
- . find ( j . TSQualifiedName , getTSQualifiedNameFromClientName ( v2GlobalName , v2ClientName ) )
35
- . filter ( ( v2ClientType ) => ! isParentTSQualifiedName ( v2ClientType ) )
36
- . replaceWith ( ( ) => j . tsTypeReference ( j . identifier ( v3ClientName ) ) ) ;
33
+ . find ( j . TSTypeReference , {
34
+ typeName : getTSQualifiedNameFromClientName ( v2GlobalName , v2ClientName ) ,
35
+ } )
36
+ . replaceWith ( ( v2ClientType ) =>
37
+ j . tsTypeReference ( j . identifier ( v3ClientName ) , v2ClientType . node . typeParameters )
38
+ ) ;
37
39
38
40
// Replace reference to client types created with global name.
39
41
source
40
- . find ( j . TSQualifiedName , {
41
- left : getTSQualifiedNameFromClientName ( v2GlobalName , v2ClientName ) ,
42
+ . find ( j . TSTypeReference , {
43
+ typeName : {
44
+ left : getTSQualifiedNameFromClientName ( v2GlobalName , v2ClientName ) ,
45
+ } ,
42
46
} )
43
- . filter (
44
- ( v2ClientType ) =>
45
- isRightSectionIdentifier ( v2ClientType . node ) && ! isParentTSQualifiedName ( v2ClientType )
46
- )
47
+ . filter ( ( v2ClientType ) => isRightSectionIdentifier ( v2ClientType . node ) )
47
48
. replaceWith ( ( v2ClientType ) => {
48
49
const v2ClientTypeName = getRightIdentifierName ( v2ClientType . node ) ;
49
50
return getV3ClientType ( j , { ...clientTypeOptions , v2ClientTypeName } ) ;
@@ -53,20 +54,19 @@ export const replaceTSQualifiedName = (
53
54
const [ clientNamePrefix , clientNameSuffix ] = v2ClientLocalName . split ( "." ) ;
54
55
// Replace reference to client types created with client module.
55
56
source
56
- . find ( j . TSQualifiedName , {
57
- ...( clientNameSuffix
58
- ? {
59
- left : {
60
- left : { type : "Identifier" , name : clientNamePrefix } ,
61
- right : { type : "Identifier" , name : clientNameSuffix } ,
62
- } ,
63
- }
64
- : { left : { type : "Identifier" , name : clientNamePrefix } } ) ,
57
+ . find ( j . TSTypeReference , {
58
+ typeName : {
59
+ ...( clientNameSuffix
60
+ ? {
61
+ left : {
62
+ left : { type : "Identifier" , name : clientNamePrefix } ,
63
+ right : { type : "Identifier" , name : clientNameSuffix } ,
64
+ } ,
65
+ }
66
+ : { left : { type : "Identifier" , name : clientNamePrefix } } ) ,
67
+ } ,
65
68
} )
66
- . filter (
67
- ( v2ClientType ) =>
68
- isRightSectionIdentifier ( v2ClientType . node ) && ! isParentTSQualifiedName ( v2ClientType )
69
- )
69
+ . filter ( ( v2ClientType ) => isRightSectionIdentifier ( v2ClientType . node ) )
70
70
. replaceWith ( ( v2ClientType ) => {
71
71
const v2ClientTypeName = getRightIdentifierName ( v2ClientType . node ) ;
72
72
return getV3ClientType ( j , { ...clientTypeOptions , v2ClientTypeName } ) ;
@@ -81,19 +81,15 @@ export const replaceTSQualifiedName = (
81
81
82
82
for ( const clientTypeName of clientTypeNames ) {
83
83
source
84
- . find ( j . Identifier , { name : clientTypeName } )
85
- . filter (
86
- ( v2ClientType ) =>
87
- ! [ "TSQualifiedName" , "ImportSpecifier" ] . includes ( v2ClientType . parentPath ?. value . type )
88
- )
84
+ . find ( j . TSTypeReference , { typeName : { type : "Identifier" , name : clientTypeName } } )
89
85
. replaceWith ( ( v2ClientType ) => {
90
- const v2ClientTypeName = v2ClientType . node . name ;
86
+ const v2ClientTypeName = ( v2ClientType . node . typeName as Identifier ) . name ;
91
87
return getV3ClientType ( j , { ...clientTypeOptions , v2ClientTypeName } ) ;
92
88
} ) ;
93
89
}
94
90
95
91
if ( v2ClientName === DYNAMODB ) {
96
- replaceTSQualifiedName ( j , source , {
92
+ replaceTSTypeReference ( j , source , {
97
93
...options ,
98
94
v2ClientName : DYNAMODB_DOCUMENT_CLIENT ,
99
95
v2ClientLocalName : `${ v2ClientLocalName } .${ DOCUMENT_CLIENT } ` ,
0 commit comments