Skip to content

Commit 7ecff65

Browse files
authoredMar 21, 2024··
chore(codegen): add total types and align telemetry prop names (#6077)
1 parent ab5ae9f commit 7ecff65

File tree

3 files changed

+74
-39
lines changed

3 files changed

+74
-39
lines changed
 

‎packages/sanity/src/_internal/cli/actions/typegen/generate.telemetry.ts

+5-4
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@ import {defineTrace} from '@sanity/telemetry'
22

33
interface TypesGeneratedTraceAttrubutes {
44
outputSize: number
5-
queryTypes: number
6-
schemaTypes: number
7-
files: number
5+
queriesCount: number
6+
schemaTypesCount: number
7+
queryFilesCount: number
88
filesWithErrors: number
9-
unknownTypes: number
9+
typeNodesGenerated: number
10+
unknownTypeNodesGenerated: number
1011
}
1112

1213
export const TypesGeneratedTrace = defineTrace<TypesGeneratedTraceAttrubutes>({

‎packages/sanity/src/_internal/cli/actions/typegen/generateAction.ts

+23-14
Original file line numberDiff line numberDiff line change
@@ -77,11 +77,12 @@ export default async function typegenGenerateAction(
7777
typeFile.write(generatedFileWarning)
7878

7979
const stats = {
80-
files: 0,
80+
queryFilesCount: 0,
8181
errors: 0,
82-
queries: 0,
83-
schemas: 0,
84-
unknownTypes: 0,
82+
queriesCount: 0,
83+
schemaTypesCount: 0,
84+
unknownTypeNodesGenerated: 0,
85+
typeNodesGenerated: 0,
8586
size: 0,
8687
}
8788

@@ -108,19 +109,26 @@ export default async function typegenGenerateAction(
108109
let fileTypeString = `// Source: ${msg.filename}\n`
109110

110111
if (msg.type === 'schema') {
111-
stats.schemas += msg.length
112+
stats.schemaTypesCount += msg.length
112113
fileTypeString += `${msg.schema}\n\n`
113114
typeFile.write(fileTypeString)
114115
return
115116
}
116117

117-
stats.files++
118-
for (const {queryName, query, type, unknownTypes} of msg.types) {
118+
stats.queryFilesCount++
119+
for (const {
120+
queryName,
121+
query,
122+
type,
123+
typeNodesGenerated,
124+
unknownTypeNodesGenerated,
125+
} of msg.types) {
119126
fileTypeString += `// Variable: ${queryName}\n`
120127
fileTypeString += `// Query: ${query.replace(/(\r\n|\n|\r)/gm, '')}\n`
121128
fileTypeString += `${type}\n`
122-
stats.queries++
123-
stats.unknownTypes += unknownTypes
129+
stats.queriesCount++
130+
stats.typeNodesGenerated += typeNodesGenerated
131+
stats.unknownTypeNodesGenerated += unknownTypeNodesGenerated
124132
}
125133
typeFile.write(`${fileTypeString}\n`)
126134
stats.size += Buffer.byteLength(fileTypeString)
@@ -132,11 +140,12 @@ export default async function typegenGenerateAction(
132140

133141
trace.log({
134142
outputSize: stats.size,
135-
queryTypes: stats.queries,
136-
schemaTypes: stats.schemas,
137-
files: stats.files,
143+
queriesCount: stats.queriesCount,
144+
schemaTypesCount: stats.schemaTypesCount,
145+
queryFilesCount: stats.queryFilesCount,
138146
filesWithErrors: stats.errors,
139-
unknownTypes: stats.unknownTypes,
147+
typeNodesGenerated: stats.typeNodesGenerated,
148+
unknownTypeNodesGenerated: stats.unknownTypeNodesGenerated,
140149
})
141150

142151
trace.complete()
@@ -145,6 +154,6 @@ export default async function typegenGenerateAction(
145154
}
146155

147156
spinner.succeed(
148-
`Generated TypeScript types for ${stats.schemas} schema types and ${stats.queries} GROQ queries in ${stats.files} files into: ${codegenConfig.generates}`,
157+
`Generated TypeScript types for ${stats.schemaTypesCount} schema types and ${stats.queriesCount} GROQ queries in ${stats.queryFilesCount} files into: ${codegenConfig.generates}`,
149158
)
150159
}

‎packages/sanity/src/_internal/cli/threads/typegenGenerate.ts

+46-21
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ export type TypegenGenerateTypesWorkerMessage =
3333
queryName: string
3434
query: string
3535
type: string
36-
unknownTypes: number
36+
unknownTypeNodesGenerated: number
37+
typeNodesGenerated: number
3738
}[]
3839
}
3940
| {
@@ -88,20 +89,27 @@ async function main() {
8889
}
8990
$info(`Processing ${result.queries.length} queries in "${result.filename}"...`)
9091

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+
}[] = []
9399
for (const {name: queryName, result: query} of result.queries) {
94100
try {
95101
const ast = parse(query)
96102
const queryTypes = typeEvaluate(ast, schema)
97103

98104
const type = typeGenerator.generateTypeNodeTypes(`${queryName}Result`, queryTypes)
99105

106+
const queryTypeStats = walkAndCountQueryTypeNodeStats(queryTypes)
100107
fileQueryTypes.push({
101108
queryName,
102109
query,
103110
type,
104-
unknownTypes: countUnknownTypes(queryTypes),
111+
unknownTypeNodesGenerated: queryTypeStats.unknownTypes,
112+
typeNodesGenerated: queryTypeStats.allTypes,
105113
})
106114
} catch (err) {
107115
parentPort?.postMessage({
@@ -131,29 +139,46 @@ async function main() {
131139
} satisfies TypegenGenerateTypesWorkerMessage)
132140
}
133141

134-
function countUnknownTypes(typeNode: TypeNode): number {
142+
function walkAndCountQueryTypeNodeStats(typeNode: TypeNode): {
143+
allTypes: number
144+
unknownTypes: number
145+
} {
135146
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': {
141156
// if the rest is unknown, we count it as one unknown type
142157
if (typeNode.rest && typeNode.rest.type === 'unknown') {
143-
return 1
158+
return {allTypes: 2, unknownTypes: 1} // count the object type itself as well
144159
}
145160

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
154164

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+
}
157182
}
158183
}
159184

0 commit comments

Comments
 (0)
Please sign in to comment.