1- import { ASTPath , Collection , Identifier , JSCodeshift , TSQualifiedName } from "jscodeshift" ;
1+ import { Collection , Identifier , JSCodeshift , TSQualifiedName , TSTypeReference } from "jscodeshift" ;
22
33import { DOCUMENT_CLIENT , DYNAMODB , DYNAMODB_DOCUMENT_CLIENT } from "../config" ;
44import { getClientTypeNames } from "./getClientTypeNames" ;
55import { getTSQualifiedNameFromClientName } from "./getTSQualifiedNameFromClientName" ;
66import { getV3ClientType } from "./getV3ClientType" ;
77
8- export interface ReplaceTSQualifiedNameOptions {
8+ export interface ReplaceTSTypeReferenceOptions {
99 v2ClientName : string ;
1010 v2ClientLocalName : string ;
1111 v2GlobalName ?: string ;
1212 v3ClientName : string ;
1313}
1414
15- const isRightSectionIdentifier = ( node : TSQualifiedName ) => node . right . type === "Identifier" ;
15+ const isRightSectionIdentifier = ( node : TSTypeReference ) =>
16+ ( node . typeName as TSQualifiedName ) . right . type === "Identifier" ;
1617
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 ;
2120
2221// Replace v2 client type reference with v3 client type reference.
23- export const replaceTSQualifiedName = (
22+ export const replaceTSTypeReference = (
2423 j : JSCodeshift ,
2524 source : Collection < unknown > ,
26- options : ReplaceTSQualifiedNameOptions
25+ options : ReplaceTSTypeReferenceOptions
2726) : void => {
2827 const { v2ClientName, v2ClientLocalName, v2GlobalName, v3ClientName } = options ;
2928 const clientTypeOptions = { v2ClientName, v2ClientLocalName } ;
3029
3130 if ( v2GlobalName ) {
3231 // Replace type reference to client created with global name.
3332 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+ ) ;
3739
3840 // Replace reference to client types created with global name.
3941 source
40- . find ( j . TSQualifiedName , {
41- left : getTSQualifiedNameFromClientName ( v2GlobalName , v2ClientName ) ,
42+ . find ( j . TSTypeReference , {
43+ typeName : {
44+ left : getTSQualifiedNameFromClientName ( v2GlobalName , v2ClientName ) ,
45+ } ,
4246 } )
43- . filter (
44- ( v2ClientType ) =>
45- isRightSectionIdentifier ( v2ClientType . node ) && ! isParentTSQualifiedName ( v2ClientType )
46- )
47+ . filter ( ( v2ClientType ) => isRightSectionIdentifier ( v2ClientType . node ) )
4748 . replaceWith ( ( v2ClientType ) => {
4849 const v2ClientTypeName = getRightIdentifierName ( v2ClientType . node ) ;
4950 return getV3ClientType ( j , { ...clientTypeOptions , v2ClientTypeName } ) ;
@@ -53,20 +54,19 @@ export const replaceTSQualifiedName = (
5354 const [ clientNamePrefix , clientNameSuffix ] = v2ClientLocalName . split ( "." ) ;
5455 // Replace reference to client types created with client module.
5556 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+ } ,
6568 } )
66- . filter (
67- ( v2ClientType ) =>
68- isRightSectionIdentifier ( v2ClientType . node ) && ! isParentTSQualifiedName ( v2ClientType )
69- )
69+ . filter ( ( v2ClientType ) => isRightSectionIdentifier ( v2ClientType . node ) )
7070 . replaceWith ( ( v2ClientType ) => {
7171 const v2ClientTypeName = getRightIdentifierName ( v2ClientType . node ) ;
7272 return getV3ClientType ( j , { ...clientTypeOptions , v2ClientTypeName } ) ;
@@ -81,19 +81,15 @@ export const replaceTSQualifiedName = (
8181
8282 for ( const clientTypeName of clientTypeNames ) {
8383 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 } } )
8985 . replaceWith ( ( v2ClientType ) => {
90- const v2ClientTypeName = v2ClientType . node . name ;
86+ const v2ClientTypeName = ( v2ClientType . node . typeName as Identifier ) . name ;
9187 return getV3ClientType ( j , { ...clientTypeOptions , v2ClientTypeName } ) ;
9288 } ) ;
9389 }
9490
9591 if ( v2ClientName === DYNAMODB ) {
96- replaceTSQualifiedName ( j , source , {
92+ replaceTSTypeReference ( j , source , {
9793 ...options ,
9894 v2ClientName : DYNAMODB_DOCUMENT_CLIENT ,
9995 v2ClientLocalName : `${ v2ClientLocalName } .${ DOCUMENT_CLIENT } ` ,
0 commit comments