Skip to content

Commit c413561

Browse files
committed
feat: enhance type generation with descriptions and deprecation notices
This commit updates the type generation logic in both the schema and client generators to include JSDoc comments for properties. It adds support for descriptions and deprecation notices, improving the clarity and documentation of generated TypeScript types. The `getTypeFromSchema` function is utilized to ensure consistent handling of these attributes across different parameter types.
1 parent 9561686 commit c413561

File tree

3 files changed

+26
-37
lines changed

3 files changed

+26
-37
lines changed

src/generator/clientGenerator.ts

Lines changed: 1 addition & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,5 @@
11
import type { OpenAPIV3 } from "openapi-types";
2-
import {
3-
camelCase,
4-
getTypeFromSchema,
5-
pascalCase,
6-
sanitizePropertyName,
7-
sanitizeTypeName,
8-
specTitle,
9-
} from "../utils";
2+
import { camelCase, pascalCase, sanitizeTypeName, specTitle } from "../utils";
103

114
export interface OperationInfo {
125
method: string;
@@ -93,35 +86,10 @@ function generateAxiosMethod(operation: OperationInfo, spec: OpenAPIV3.Document)
9386

9487
const requestBodySchema = content ? resolveSchema(content, spec) : undefined;
9588

96-
// Build data type parts
97-
const dataProps: string[] = [];
98-
99-
// Add path and query parameters
100-
urlParams.forEach((p) => {
101-
const safeName = sanitizePropertyName(p.name);
102-
dataProps.push(`${safeName}: ${getTypeFromSchema(p.schema)}`);
103-
});
104-
queryParams.forEach((p) => {
105-
const safeName = sanitizePropertyName(p.name);
106-
dataProps.push(`${safeName}${p.required ? "" : "?"}: ${getTypeFromSchema(p.schema)}`);
107-
});
108-
10989
// Add request body type if it exists
11090
const hasData = (parameters && parameters.length > 0) || operation.requestBody;
11191

112-
let dataType = "undefined";
11392
const namedType = pascalCase(operationId);
114-
if (hasData) {
115-
if (requestBody && dataProps.length > 0) {
116-
dataType = `T.${namedType}Request & { ${dataProps.join("; ")} }`;
117-
} else if (requestBody) {
118-
dataType = `T.${namedType}Request`;
119-
} else if (dataProps.length > 0) {
120-
dataType = `{ ${dataProps.join("; ")} }`;
121-
} else {
122-
dataType = "Record<string, never>";
123-
}
124-
}
12593

12694
// Get response type from 2xx response
12795

src/generator/schemaGenerator.ts

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,13 +91,27 @@ export function generateTypeDefinitions(spec: OpenAPIV3.Document): string {
9191
// Add path and query parameters
9292
urlParams.forEach((p) => {
9393
const safeName = sanitizePropertyName(p.name);
94-
dataProps.push(`${safeName}: ${getTypeFromSchema(p.schema)}`);
94+
const isDeprecated = "deprecated" in p && p.deprecated;
95+
const hasDescription = "description" in p && p.description;
96+
const desc =
97+
hasDescription || isDeprecated
98+
? `/**${hasDescription ? `\n* ${p.description}` : ""}${isDeprecated ? "\n* @deprecated" : ""}
99+
*/\n`
100+
: "";
101+
dataProps.push(`${desc}${safeName}: ${getTypeFromSchema(p.schema)}`);
95102
});
103+
96104
queryParams.forEach((p) => {
97105
const safeName = sanitizePropertyName(p.name);
98-
dataProps.push(`${safeName}${p.required ? "" : "?"}: ${getTypeFromSchema(p.schema)}`);
106+
const isDeprecated = "deprecated" in p && p.deprecated;
107+
const hasDescription = "description" in p && p.description;
108+
const desc =
109+
hasDescription || isDeprecated
110+
? `\n/**${hasDescription ? `\n* ${p.description}` : ""}${isDeprecated ? "\n* @deprecated" : ""}
111+
*/\n`
112+
: "";
113+
dataProps.push(`${desc}${safeName}${p.required ? "" : "?"}: ${getTypeFromSchema(p.schema)}`);
99114
});
100-
101115
// Add request body type if it exists
102116
const hasData = (parameters && parameters.length > 0) || requestBody;
103117

src/utils.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,14 @@ export function getTypeFromSchema(
126126
const isRequired = schema.required?.includes(key);
127127
const propertyType = getTypeFromSchema(prop);
128128
const safeName = sanitizePropertyName(key);
129-
return ` ${safeName}${isRequired ? "" : "?"}: ${propertyType};`;
129+
const isDeprecated = "deprecated" in prop && prop.deprecated;
130+
const hasDescription = "description" in prop && prop.description;
131+
const desc =
132+
hasDescription || isDeprecated
133+
? `/**${hasDescription ? `\n* ${prop.description}` : ""}${isDeprecated ? "\n* @deprecated" : ""}
134+
*/\n`
135+
: "";
136+
return `${desc}${safeName}${isRequired ? "" : "?"}: ${propertyType};`;
130137
})
131138
.join("\n");
132139
return `{${properties}\n}${nullable}`;

0 commit comments

Comments
 (0)