@@ -8,24 +8,51 @@ export const VALUE_TYPECAST_MAP: Record<string, string> = {
88  'tuple[]' : 'Bytes[]' , 
99} ; 
1010
11- export  const  generateFieldAssignment  =  ( keyPath : string [ ] ,  value : string [ ] ,  type ?: string )  =>  { 
11+ export  const  generateFieldAssignment  =  ( 
12+   key : string [ ] , 
13+   value : string [ ] , 
14+   type : string , 
15+ ) : {  assignment : string ;  imports : string [ ]  }  =>  { 
1216  let  rightSide  =  `event.params.${ value . join ( '.' ) }  ` ; 
13-   if  ( type  &&  VALUE_TYPECAST_MAP [ type ] )  { 
14-     rightSide  =  `changeType<${ VALUE_TYPECAST_MAP [ type ] }  >(${ rightSide }  )` ; 
17+   const  imports  =  [ ] ; 
18+ 
19+   if  ( type  in  VALUE_TYPECAST_MAP )  { 
20+     const  castTo  =  VALUE_TYPECAST_MAP [ type ] ; 
21+     rightSide  =  `changeType<${ castTo }  >(${ rightSide }  )` ; 
22+     imports . push ( castTo . replace ( '[]' ,  '' ) ) ; 
1523  } 
16-   return  `entity.${ keyPath . join ( '_' ) }   = ${ rightSide }  ` ; 
24+ 
25+   return  { 
26+     assignment : `entity.${ key . join ( '_' ) }   = ${ rightSide }  ` , 
27+     imports, 
28+   } ; 
1729} ; 
1830
19- export  const  generateFieldAssignments  =  ( {  index,  input } : {  index : number ;  input : any  } )  => 
20-   input . type  ===  'tuple' 
21-     ? util 
22-         . unrollTuple ( {  value : input ,  index,  path : [ input . name  ||  `param${ index }  ` ]  } ) 
23-         . map ( ( {  path,  type } : any )  =>  generateFieldAssignment ( path ,  path ,  type ) ) 
24-     : generateFieldAssignment ( 
25-         [ ( input . mappedName  ??  input . name )  ||  `param${ index }  ` ] , 
26-         [ input . name  ||  `param${ index }  ` ] , 
27-         input . type , 
28-       ) ; 
31+ export  const  generateFieldAssignments  =  ( { 
32+   index, 
33+   input, 
34+ } : { 
35+   index : number ; 
36+   input : any ; 
37+ } ) : {  assignments : string [ ] ;  imports : string [ ]  }  =>  { 
38+   const  fields  = 
39+     input . type  ===  'tuple' 
40+       ? util 
41+           . unrollTuple ( {  value : input ,  index,  path : [ input . name  ||  `param${ index }  ` ]  } ) 
42+           . map ( ( {  path,  type } )  =>  generateFieldAssignment ( path ,  path ,  type ) ) 
43+       : [ 
44+           generateFieldAssignment ( 
45+             [ ( input . mappedName  ??  input . name )  ||  `param${ index }  ` ] , 
46+             [ input . name  ||  `param${ index }  ` ] , 
47+             input . type , 
48+           ) , 
49+         ] ; 
50+ 
51+   return  { 
52+     assignments : fields . map ( a  =>  a . assignment ) , 
53+     imports : fields . map ( a  =>  a . imports ) . flat ( ) , 
54+   } ; 
55+ } ; 
2956
3057/** 
3158 * Map of input names that are reserved so we do not use them as field names to avoid conflicts 
@@ -41,35 +68,53 @@ export const renameNameIfNeeded = (name: string) => {
4168  return  NAMES_REMAP_DICTIONARY [ name ]  ??  name ; 
4269} ; 
4370
44- export  const  generateEventFieldAssignments  =  ( event : any ,  _contractName : string )  => 
45-   event . inputs . reduce ( ( acc : any [ ] ,  input : any ,  index : number )  =>  { 
46-     input . mappedName  =  renameNameIfNeeded ( input . name ) ; 
47-     return  acc . concat ( generateFieldAssignments ( {  input,  index } ) ) ; 
48-   } ,  [ ] ) ; 
71+ export  const  generateEventFieldAssignments  =  ( 
72+   event : any , 
73+   _contractName : string , 
74+ ) : {  assignments : string [ ] ;  imports : string [ ]  }  => 
75+   event . inputs . reduce ( 
76+     ( acc : any ,  input : any ,  index : number )  =>  { 
77+       input . mappedName  =  renameNameIfNeeded ( input . name ) ; 
78+       const  {  assignments,  imports }  =  generateFieldAssignments ( {  input,  index } ) ; 
79+       return  { 
80+         assignments : acc . assignments . concat ( assignments ) , 
81+         imports : acc . imports . concat ( imports ) , 
82+       } ; 
83+     } , 
84+     {  assignments : [ ] ,  imports : [ ]  } , 
85+   ) ; 
4986
50- export  const  generateEventIndexingHandlers  =  ( events : any [ ] ,  contractName : string )  => 
51-   ` 
52-   import { ${ events . map (  
53-     event  =>  `${ event . _alias }   as ${ event . _alias }  Event` ,  
54-   ) }  } from '../generated/${ contractName }  /${ contractName }  '
55-   import { ${ events . map ( event  =>  event . _alias ) }   } from '../generated/schema' 
56-   import { Bytes } from '@graphprotocol/graph-ts' 
87+ export  const  generateEventIndexingHandlers  =  ( events : any [ ] ,  contractName : string )  =>  { 
88+   const  allImports : string [ ]  =  [ ] ; 
89+   const  eventHandlers  =  events . map ( event  =>  { 
90+     const  {  assignments,  imports }  =  generateEventFieldAssignments ( event ,  contractName ) ; 
91+     allImports . push ( ...imports ) ; 
5792
58-   ${ events  
59-     . map (  
60-       event  =>  
61-         `  
93+     return  ` 
6294  export function handle${ event . _alias }  (event: ${ event . _alias }  Event): void { 
6395    let entity = new ${ event . _alias }  (event.transaction.hash.concatI32(event.logIndex.toI32())) 
64-     ${ generateEventFieldAssignments ( event ,   contractName ) . join ( '\n' ) }  
96+     ${ assignments . join ( '\n' ) }  
6597
6698    entity.blockNumber = event.block.number 
6799    entity.blockTimestamp = event.block.timestamp 
68100    entity.transactionHash = event.transaction.hash 
69101
70102    entity.save() 
71103  } 
72-     ` , 
73-     )  
74-     . join ( '\n' ) }  
104+     ` ; 
105+   } ) ; 
106+ 
107+   return  ` 
108+   import { ${ events . map (  
109+     event  =>  `${ event . _alias }   as ${ event . _alias }  Event` ,  
110+   ) }  } from '../generated/${ contractName }  /${ contractName }  '
111+   import { ${ events . map ( event  =>  event . _alias ) }   } from '../generated/schema' 
112+   ${  
113+     allImports . length  >  0  
114+       ? `import { ${ [ ...new  Set ( allImports ) ] . join ( ', ' ) }   } from '@graphprotocol/graph-ts'`  
115+       : ''  
116+   }  
117+ 
118+   ${ eventHandlers . join ( '\n' ) }  
75119` ; 
120+ } ; 
0 commit comments