From 90ad8157edac2c97068124cce0d10d5d96655c5a Mon Sep 17 00:00:00 2001 From: Pierre Chalamet Date: Mon, 27 Oct 2025 23:35:51 +0100 Subject: [PATCH 1/2] handle default message --- .../Generators/TypeScriptAxiosGenerator.cs | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/OpenApiGen/Generators/TypeScriptAxiosGenerator.cs b/OpenApiGen/Generators/TypeScriptAxiosGenerator.cs index a387fd3..97ecdab 100644 --- a/OpenApiGen/Generators/TypeScriptAxiosGenerator.cs +++ b/OpenApiGen/Generators/TypeScriptAxiosGenerator.cs @@ -85,7 +85,7 @@ public void Generate(OpenApiDocument document, string outputPath) { string? resTypeInterface = null; if (response.Content?.TryGetValue("application/json", out var resJsonContent) == true) { resTypeInterface = $"{GenerateInterfaceName(path, method)}{responseType}Response"; - resDUInterfaces.Add(responseType, resTypeInterface); + if (responseType != "default") resDUInterfaces.Add(responseType, resTypeInterface); sb.Append($"export type {resTypeInterface} = "); sb.AppendLine(GenerateType(INDENTATION_SIZE, resJsonContent.Schema ?? new PrimitiveSchema(), [], [])); } else if (response.Content?.TryGetValue("text/plain", out var resTxtContent) == true) { @@ -139,11 +139,21 @@ public void Generate(OpenApiDocument document, string outputPath) { sb.Append(' ', INDENTATION_SIZE); sb.AppendLine($"const __response__ = await axios.{method}(`{ToTemplateString(path)}${{__queryString__}}`{requestArg}, {{ validateStatus: () => true{bearerHeader} }})"); } sb.Append(' ', INDENTATION_SIZE); sb.AppendLine("switch (__response__.status) {"); + Response? defaultResponse = null; foreach (var (responseType, response) in op.Responses) { - var resTypeInterface = $"{GenerateInterfaceName(path, method)}{responseType}Response"; - sb.Append(' ', INDENTATION_SIZE * 2); sb.AppendLine($"case {responseType}: return [{responseType}, __response__.data as {resTypeInterface}]"); + if (responseType == "default") { + defaultResponse = response; + } else { + var resTypeInterface = $"{GenerateInterfaceName(path, method)}{responseType}Response"; + sb.Append(' ', INDENTATION_SIZE * 2); sb.AppendLine($"case {responseType}: return [{responseType}, __response__.data as {resTypeInterface}]"); + } + } + if (defaultResponse is not null) { + var resTypeInterface = $"{GenerateInterfaceName(path, method)}defaultResponse"; + sb.Append(' ', INDENTATION_SIZE * 2); sb.AppendLine($"default: throw __response__.data as {resTypeInterface}"); + } else { + sb.Append(' ', INDENTATION_SIZE * 2); sb.AppendLine("default: throw Error(`Unexpected status ${__response__.status}`)"); } - sb.Append(' ', INDENTATION_SIZE * 2); sb.AppendLine("default: throw Error(`Unexpected status ${__response__.status}`)"); sb.Append(' ', INDENTATION_SIZE); sb.AppendLine("}"); sb.AppendLine("}"); From b6ceef646cf48de48337888bc2d351ae7acf1786 Mon Sep 17 00:00:00 2001 From: Pierre Chalamet Date: Tue, 28 Oct 2025 08:15:33 +0100 Subject: [PATCH 2/2] do not throw on default --- Makefile | 7 +++++-- .../Generators/TypeScriptAxiosGenerator.cs | 17 +++++++++-------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/Makefile b/Makefile index f3ffc04..50efe37 100644 --- a/Makefile +++ b/Makefile @@ -13,12 +13,15 @@ gen: gen-buggy: dotnet run --project OpenApiGen -- Examples/OpenApiGen.config.json Examples/BuggyApi.json generated -gen-fund: - dotnet run --project OpenApiGen -- Examples/OpenApiGen.config.json Examples/FundApi.json generated +gen-invest: + dotnet run --project OpenApiGen -- Examples/OpenApiGen.config.json Examples/InvestApi.json generated gen-art: dotnet run --project OpenApiGen -- Examples/FundApi.config.json Examples/ArtApi.json generated +gen-petstore: + dotnet run --project OpenApiGen -- Examples/Default.config.json Examples/PetStore.json generated + help: dotnet run --project OpenApiGen -- --help diff --git a/OpenApiGen/Generators/TypeScriptAxiosGenerator.cs b/OpenApiGen/Generators/TypeScriptAxiosGenerator.cs index 97ecdab..730dc40 100644 --- a/OpenApiGen/Generators/TypeScriptAxiosGenerator.cs +++ b/OpenApiGen/Generators/TypeScriptAxiosGenerator.cs @@ -82,21 +82,22 @@ public void Generate(OpenApiDocument document, string outputPath) { Dictionary resDUInterfaces = []; foreach (var (responseType, response) in op.Responses) { + var responseTypeOrDefault = responseType == "default" ? "0" : responseType; string? resTypeInterface = null; if (response.Content?.TryGetValue("application/json", out var resJsonContent) == true) { - resTypeInterface = $"{GenerateInterfaceName(path, method)}{responseType}Response"; - if (responseType != "default") resDUInterfaces.Add(responseType, resTypeInterface); + resTypeInterface = $"{GenerateInterfaceName(path, method)}{responseTypeOrDefault}Response"; + resDUInterfaces.Add(responseTypeOrDefault, resTypeInterface); sb.Append($"export type {resTypeInterface} = "); sb.AppendLine(GenerateType(INDENTATION_SIZE, resJsonContent.Schema ?? new PrimitiveSchema(), [], [])); } else if (response.Content?.TryGetValue("text/plain", out var resTxtContent) == true) { - resTypeInterface = $"{GenerateInterfaceName(path, method)}{responseType}Response"; - resDUInterfaces.Add(responseType, resTypeInterface); + resTypeInterface = $"{GenerateInterfaceName(path, method)}{responseTypeOrDefault}Response"; + resDUInterfaces.Add(responseTypeOrDefault, resTypeInterface); sb.Append($"export type {resTypeInterface} = "); sb.AppendLine(GenerateType(INDENTATION_SIZE, resTxtContent.Schema ?? new PrimitiveSchema(), [], [])); } else if (response.Content == null) { // void case - resTypeInterface = $"{GenerateInterfaceName(path, method)}{responseType}Response"; - resDUInterfaces.Add(responseType, resTypeInterface); + resTypeInterface = $"{GenerateInterfaceName(path, method)}{responseTypeOrDefault}Response"; + resDUInterfaces.Add(responseTypeOrDefault, resTypeInterface); sb.Append($"export type {resTypeInterface} = "); sb.AppendLine(GenerateType(INDENTATION_SIZE, new PrimitiveSchema(), [], [])); } else { @@ -149,8 +150,8 @@ public void Generate(OpenApiDocument document, string outputPath) { } } if (defaultResponse is not null) { - var resTypeInterface = $"{GenerateInterfaceName(path, method)}defaultResponse"; - sb.Append(' ', INDENTATION_SIZE * 2); sb.AppendLine($"default: throw __response__.data as {resTypeInterface}"); + var resTypeInterface = $"{GenerateInterfaceName(path, method)}0Response"; + sb.Append(' ', INDENTATION_SIZE * 2); sb.AppendLine($"default: return [0, __response__.data as {resTypeInterface}]"); } else { sb.Append(' ', INDENTATION_SIZE * 2); sb.AppendLine("default: throw Error(`Unexpected status ${__response__.status}`)"); }