Skip to content

Commit a06d2ff

Browse files
ochafikclaude
andcommitted
fix: process inline type literals for @description conversion
Add processPropertiesRecursively() to handle nested type literals within interface properties. This ensures fields in inline types like: tasks?: { /** Whether this server supports tasks/list. */ list?: object; } Get their comments converted to @description and generate .describe() calls. - Reordered transforms: convertJsDocToDescription now runs BEFORE injectDerivedCapabilityTypes - 327 comments converted (up from 294) - 226 .describe() calls in schemas (up from 183) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 65c1822 commit a06d2ff

File tree

3 files changed

+251
-360
lines changed

3 files changed

+251
-360
lines changed

scripts/generate-schemas.ts

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -155,12 +155,13 @@ function preProcessTypes(content: string): string {
155155
// Transform 4: Update Request.params to use RequestParams
156156
updateRequestParamsType(sourceFile);
157157

158-
// Transform 5: Add derived capability types
159-
injectDerivedCapabilityTypes(sourceFile);
160-
161-
// Transform 6: Convert JSDoc comments to @description tags for .describe() generation
158+
// Transform 5: Convert JSDoc comments to @description tags for .describe() generation
159+
// (Must run before injectDerivedCapabilityTypes so inline types get @description)
162160
convertJsDocToDescription(sourceFile);
163161

162+
// Transform 6: Add derived capability types (extracts from parent interfaces)
163+
injectDerivedCapabilityTypes(sourceFile);
164+
164165
return sourceFile.getFullText();
165166
}
166167

@@ -347,15 +348,13 @@ function injectDerivedCapabilityTypes(sourceFile: SourceFile): void {
347348
function convertJsDocToDescription(sourceFile: SourceFile): void {
348349
let count = 0;
349350

350-
// Process all interfaces
351+
// Process all interfaces and their nested type literals
351352
for (const iface of sourceFile.getInterfaces()) {
352353
// Convert interface-level JSDoc
353354
count += convertNodeJsDoc(iface);
354355

355-
// Convert property-level JSDoc
356-
for (const prop of iface.getProperties()) {
357-
count += convertNodeJsDoc(prop);
358-
}
356+
// Convert property-level JSDoc (including nested type literals)
357+
count += processPropertiesRecursively(iface);
359358
}
360359

361360
// Process all type aliases
@@ -366,6 +365,30 @@ function convertJsDocToDescription(sourceFile: SourceFile): void {
366365
console.log(` ✓ Converted ${count} JSDoc comments to @description`);
367366
}
368367

368+
/**
369+
* Recursively process properties, including those in inline type literals.
370+
*/
371+
function processPropertiesRecursively(node: { getProperties?: () => Array<unknown>; getTypeNode?: () => unknown }): number {
372+
let count = 0;
373+
374+
// Process direct properties
375+
if (node.getProperties) {
376+
for (const prop of node.getProperties() as Array<{ getJsDocs: () => unknown[]; getTypeNode?: () => unknown }>) {
377+
count += convertNodeJsDoc(prop as Parameters<typeof convertNodeJsDoc>[0]);
378+
379+
// Check if the property has an inline type literal
380+
if (prop.getTypeNode) {
381+
const typeNode = prop.getTypeNode();
382+
if (typeNode && typeof typeNode === 'object' && 'getProperties' in typeNode) {
383+
count += processPropertiesRecursively(typeNode as { getProperties: () => Array<unknown> });
384+
}
385+
}
386+
}
387+
}
388+
389+
return count;
390+
}
391+
369392
/**
370393
* Convert a node's JSDoc comment to use @description tag.
371394
* Returns 1 if converted, 0 otherwise.

0 commit comments

Comments
 (0)