@@ -33,7 +33,8 @@ export type TypegenGenerateTypesWorkerMessage =
33
33
queryName : string
34
34
query : string
35
35
type : string
36
- unknownTypes : number
36
+ unknownTypeNodesGenerated : number
37
+ typeNodesGenerated : number
37
38
} [ ]
38
39
}
39
40
| {
@@ -88,20 +89,27 @@ async function main() {
88
89
}
89
90
$info ( `Processing ${ result . queries . length } queries in "${ result . filename } "...` )
90
91
91
- const fileQueryTypes : { queryName : string ; query : string ; type : string ; unknownTypes : number } [ ] =
92
- [ ]
92
+ const fileQueryTypes : {
93
+ queryName : string
94
+ query : string
95
+ type : string
96
+ unknownTypeNodesGenerated : number
97
+ typeNodesGenerated : number
98
+ } [ ] = [ ]
93
99
for ( const { name : queryName , result : query } of result . queries ) {
94
100
try {
95
101
const ast = parse ( query )
96
102
const queryTypes = typeEvaluate ( ast , schema )
97
103
98
104
const type = typeGenerator . generateTypeNodeTypes ( `${ queryName } Result` , queryTypes )
99
105
106
+ const queryTypeStats = walkAndCountQueryTypeNodeStats ( queryTypes )
100
107
fileQueryTypes . push ( {
101
108
queryName,
102
109
query,
103
110
type,
104
- unknownTypes : countUnknownTypes ( queryTypes ) ,
111
+ unknownTypeNodesGenerated : queryTypeStats . unknownTypes ,
112
+ typeNodesGenerated : queryTypeStats . allTypes ,
105
113
} )
106
114
} catch ( err ) {
107
115
parentPort ?. postMessage ( {
@@ -131,29 +139,46 @@ async function main() {
131
139
} satisfies TypegenGenerateTypesWorkerMessage )
132
140
}
133
141
134
- function countUnknownTypes ( typeNode : TypeNode ) : number {
142
+ function walkAndCountQueryTypeNodeStats ( typeNode : TypeNode ) : {
143
+ allTypes : number
144
+ unknownTypes : number
145
+ } {
135
146
switch ( typeNode . type ) {
136
- case 'unknown' :
137
- return 1
138
- case 'array' :
139
- return countUnknownTypes ( typeNode . of )
140
- case 'object' :
147
+ case 'unknown' : {
148
+ return { allTypes : 1 , unknownTypes : 1 }
149
+ }
150
+ case 'array' : {
151
+ const acc = walkAndCountQueryTypeNodeStats ( typeNode . of )
152
+ acc . allTypes += 1 // count the array type itself
153
+ return acc
154
+ }
155
+ case 'object' : {
141
156
// if the rest is unknown, we count it as one unknown type
142
157
if ( typeNode . rest && typeNode . rest . type === 'unknown' ) {
143
- return 1
158
+ return { allTypes : 2 , unknownTypes : 1 } // count the object type itself as well
144
159
}
145
160
146
- return (
147
- Object . values ( typeNode . attributes ) . reduce (
148
- ( acc , attribute ) => acc + countUnknownTypes ( attribute . value ) ,
149
- 0 ,
150
- ) + ( typeNode . rest ? countUnknownTypes ( typeNode . rest ) : 0 )
151
- )
152
- case 'union' :
153
- return typeNode . of . reduce ( ( acc , type ) => acc + countUnknownTypes ( type ) , 0 )
161
+ const restStats = typeNode . rest
162
+ ? walkAndCountQueryTypeNodeStats ( typeNode . rest )
163
+ : { allTypes : 1 , unknownTypes : 0 } // count the object type itself
154
164
155
- default :
156
- return 0
165
+ return Object . values ( typeNode . attributes ) . reduce ( ( acc , attribute ) => {
166
+ const { allTypes, unknownTypes} = walkAndCountQueryTypeNodeStats ( attribute . value )
167
+ return { allTypes : acc . allTypes + allTypes , unknownTypes : acc . unknownTypes + unknownTypes }
168
+ } , restStats )
169
+ }
170
+ case 'union' : {
171
+ return typeNode . of . reduce (
172
+ ( acc , type ) => {
173
+ const { allTypes, unknownTypes} = walkAndCountQueryTypeNodeStats ( type )
174
+ return { allTypes : acc . allTypes + allTypes , unknownTypes : acc . unknownTypes + unknownTypes }
175
+ } ,
176
+ { allTypes : 1 , unknownTypes : 0 } , // count the union type itself
177
+ )
178
+ }
179
+ default : {
180
+ return { allTypes : 1 , unknownTypes : 0 }
181
+ }
157
182
}
158
183
}
159
184
0 commit comments