Skip to content

Commit 6998c41

Browse files
committed
refactor: improve type handling and formatting in generators
This commit includes: - Enhanced type handling in the Axios and React Query generators by utilizing `sanitizeTypeName` for type names. - Updated the response type determination in the Axios method to handle unknown responses more gracefully. - Ensured consistent formatting in `package.json` for better readability.
1 parent c26ba5f commit 6998c41

File tree

5 files changed

+16
-18
lines changed

5 files changed

+16
-18
lines changed

package.json

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,7 @@
44
"license": "MIT",
55
"description": "Generate Axios API clients and React Query options from OpenAPI specifications",
66
"exports": "./dist/index.js",
7-
"files": [
8-
"src",
9-
"dist"
10-
],
7+
"files": ["src", "dist"],
118
"author": {
129
"name": "Oliver Winter",
1310
"email": "[email protected]"

src/generator/clientGenerator.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,11 @@ function generateAxiosMethod(operation: OperationInfo, spec: OpenAPIV3.Document)
109109
}
110110

111111
// Get response type from 2xx response
112-
const successResponse = Object.entries(responses).find(([code]) => code.startsWith("2"));
113-
const responseType = successResponse ? `T.${`${namedType}Response${successResponse[0]}`}` : "any";
112+
113+
const responseType =
114+
responseDetails?.[0] && "content" in responseDetails[1]
115+
? `T.${`${namedType}Response${responseDetails[0]}`}`
116+
: "unknown";
114117

115118
const urlWithParams = urlParams.length > 0 ? `\`${path.replace(/{(\w+)}/g, "${data.$1}")}\`` : `"${path}"`;
116119

src/generator/reactQueryGenerator.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { OpenAPIV3 } from "openapi-types";
2-
import { camelCase, specTitle } from "../utils";
2+
import { camelCase, sanitizeTypeName, specTitle } from "../utils";
33
import type { OperationInfo } from "./clientGenerator";
44

55
function generateQueryOptions(operation: OperationInfo, spec: OpenAPIV3.Document): string {
@@ -35,7 +35,7 @@ function generateQueryOptions(operation: OperationInfo, spec: OpenAPIV3.Document
3535
: []),
3636
];
3737

38-
const namedQueryOptions = `get${operationId}QueryOptions`;
38+
const namedQueryOptions = camelCase(`get${operationId}QueryOptions`);
3939
const namedQuery = camelCase(`${operationId}`);
4040

4141
return `
@@ -64,7 +64,7 @@ export function generateReactQuery(spec: OpenAPIV3.Document): string {
6464
operations.push({
6565
method: method,
6666
path,
67-
operationId: `${operation.operationId || `${path.replace(/\W+/g, "_")}`}`,
67+
operationId: sanitizeTypeName(`${operation.operationId || `${path.replace(/\W+/g, "_")}`}`),
6868
summary: operation.summary,
6969
description: operation.description,
7070
parameters: [

src/generator/schemaGenerator.ts

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ function getTypeFromSchema(
3838
return "boolean";
3939
case "array": {
4040
const itemType = getTypeFromSchema(schema.items, context);
41-
return `Array<${itemType}>`;
41+
return `Array<${sanitizeTypeName(itemType)}>`;
4242
}
4343
case "object":
4444
if (schema.properties) {
@@ -78,8 +78,8 @@ function generateTypeDefinition(
7878
const isInterface = !("$ref" in schema) && schema.type === "object" && schema.properties;
7979

8080
return isInterface
81-
? `${description}export interface ${name} ${typeValue}\n\n`
82-
: `${description}export type ${name} = ${typeValue}\n\n`;
81+
? `${description}export interface ${sanitizeTypeName(name)} ${typeValue}\n\n`
82+
: `${description}export type ${sanitizeTypeName(name)} = ${typeValue}\n\n`;
8383
}
8484

8585
/**
@@ -108,16 +108,14 @@ export function generateTypeDefinitions(spec: OpenAPIV3.Document): string {
108108

109109
const operationObject = operation as OpenAPIV3.OperationObject;
110110
if (!operationObject) continue;
111-
const operationId = pascalCase(
112-
`${sanitizeTypeName(operationObject.operationId || `${path.replace(/\W+/g, "_")}`)}`
113-
);
111+
const operationId = `${sanitizeTypeName(operationObject.operationId || `${path.replace(/\W+/g, "_")}`)}`;
114112

115113
// Generate request body type
116114
if (operationObject.requestBody) {
117115
const content = (operationObject.requestBody as OpenAPIV3.RequestBodyObject).content;
118116
const jsonContent = content["application/json"] || content["multipart/form-data"];
119117
if (jsonContent?.schema) {
120-
const typeName = sanitizeTypeName(`${operationId}Request`);
118+
const typeName = `${operationId}Request`;
121119
output += generateTypeDefinition(typeName, jsonContent.schema as OpenAPIV3.SchemaObject, context);
122120
}
123121
}
@@ -128,7 +126,7 @@ export function generateTypeDefinitions(spec: OpenAPIV3.Document): string {
128126
const responseObj = response as OpenAPIV3.ResponseObject;
129127
const content = responseObj.content?.["application/json"];
130128
if (content?.schema) {
131-
const typeName = sanitizeTypeName(`${operationId}Response${code}`);
129+
const typeName = `${operationId}Response${code}`;
132130
output += generateTypeDefinition(typeName, content.schema as OpenAPIV3.SchemaObject, context);
133131
}
134132
}

src/utils.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ export function sanitizePropertyName(name: string): string {
4646
* @returns The sanitized type name with invalid characters replaced by underscores
4747
*/
4848
export function sanitizeTypeName(name: string): string {
49-
return name.replace(/[^a-zA-Z0-9_]/g, "_").replace(/_+$/, "");
49+
return pascalCase(name.replace(/[^a-zA-Z0-9_]/g, "_").replace(/_+$/, ""));
5050
}
5151

5252
export function specTitle(spec: OpenAPIV3.Document): string {

0 commit comments

Comments
 (0)