From 079b6eeec5dbca3d449c87ff05178c3cf5bc0eb7 Mon Sep 17 00:00:00 2001 From: Sachin Insuredmine Date: Thu, 13 Aug 2026 20:04:47 +0530 Subject: [PATCH 1/3] fix typescript axios content type detection --- .../typescript-axios/apiInner.mustache | 42 ++++++++++++------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/src/main/resources/handlebars/typescript-axios/apiInner.mustache b/src/main/resources/handlebars/typescript-axios/apiInner.mustache index 861245e1a7..5d50674e61 100644 --- a/src/main/resources/handlebars/typescript-axios/apiInner.mustache +++ b/src/main/resources/handlebars/typescript-axios/apiInner.mustache @@ -31,7 +31,7 @@ export const {{classname}}AxiosParamCreator = function (configuration?: Configur * @param {*} [options] Override http request option. * @throws {RequiredError} */ - {{nickname}}{{#isForm}}Form{{/isForm}}: async ({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}options: AxiosRequestConfig = {}): Promise => { + {{nickname}}{{#isForm}}Form{{/isForm}}: async ({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}requestOptions: AxiosRequestConfig = {}): Promise => { {{#parameters}} {{#required}} // verify required parameter '{{paramName}}' is not null or undefined @@ -48,7 +48,7 @@ export const {{classname}}AxiosParamCreator = function (configuration?: Configur if (configuration) { baseOptions = configuration.baseOptions; } - const localVarRequestOptions :AxiosRequestConfig = { method: '{{httpMethod}}', ...baseOptions, ...options}; + const localVarRequestOptions :AxiosRequestConfig = { method: '{{httpMethod}}', ...baseOptions, ...requestOptions}; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any;{{#vendorExtensions}}{{#hasFormParams}} const localVarFormParams = new {{^multipartFormData}}URLSearchParams(){{/multipartFormData}}{{#multipartFormData}}FormData(){{/multipartFormData}};{{/hasFormParams}}{{/vendorExtensions}} @@ -191,12 +191,12 @@ export const {{classname}}AxiosParamCreator = function (configuration?: Configur for (const key in localVarQueryParameter) { query.set(key, localVarQueryParameter[key]); } - for (const key in options.params) { - query.set(key, options.params[key]); + for (const key in requestOptions.params) { + query.set(key, requestOptions.params[key]); } localVarUrlObj.search = (new URLSearchParams(query)).toString(); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; - localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...requestOptions.headers}; {{#isForm}} {{#hasFormParams}} localVarRequestOptions.data = localVarFormParams{{#vendorExtensions}}{{^multipartFormData}}.toString(){{/multipartFormData}}{{/vendorExtensions}}; @@ -204,9 +204,19 @@ export const {{classname}}AxiosParamCreator = function (configuration?: Configur {{/isForm}} {{^isForm}} {{#bodyParam}} - const needsSerialization = (typeof {{paramName}} !== "string") || localVarRequestOptions.headers['Content-Type'] === 'application/json'; - localVarRequestOptions.data = needsSerialization ? JSON.stringify({{paramName}} !== undefined ? {{paramName}} : {}) : ({{paramName}} || ""); - {{/bodyParam}} + let needsSerialization = + typeof {{paramName}} !== "string" || + Object.keys(localVarRequestOptions.headers || {}).some( + headerKey => + headerKey.toLowerCase() === "content-type" && + (localVarRequestOptions.headers as any)[headerKey] === "application/json" + ); + + localVarRequestOptions.data = + needsSerialization + ? JSON.stringify({{paramName}} !== undefined ? {{paramName}} : {}) + : ({{paramName}} || ""); +{{/bodyParam}} {{/isForm}} return { @@ -239,8 +249,8 @@ export const {{classname}}Fp = function(configuration?: Configuration) { * @param {*} [options] Override http request option. * @throws {RequiredError} */ - async {{nickname}}{{#isForm}}Form{{/isForm}}({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise>> { - const localVarAxiosArgs = await {{classname}}AxiosParamCreator(configuration).{{nickname}}{{#isForm}}Form{{/isForm}}({{#parameters}}{{paramName}}, {{/parameters}}options); + async {{nickname}}{{#isForm}}Form{{/isForm}}({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}requestOptions?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise>> { + const localVarAxiosArgs = await {{classname}}AxiosParamCreator(configuration).{{nickname}}{{#isForm}}Form{{/isForm}}({{#parameters}}{{paramName}}, {{/parameters}}requestOptions); return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => { const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url}; return axios.request(axiosRequestArgs); @@ -268,11 +278,11 @@ export const {{classname}}Factory = function (configuration?: Configuration, bas {{#parameters}} * @param {{braces "left"}}{{{dataType}}}{{braces "right"}} {{^required}}[{{/required}}{{paramName}}{{^required}}]{{/required}} {{description}} {{/parameters}} - * @param {*} [options] Override http request option. + * @param {*} [requestOptions] Override http request option. * @throws {RequiredError} */ - async {{nickname}}{{#isForm}}Form{{/isForm}}({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}options?: AxiosRequestConfig): Promise> { - return {{classname}}Fp(configuration).{{nickname}}{{#isForm}}Form{{/isForm}}({{#parameters}}{{paramName}}, {{/parameters}}options).then((request) => request(axios, basePath)); + async {{nickname}}{{#isForm}}Form{{/isForm}}({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}requestOptions?: AxiosRequestConfig): Promise> { + return {{classname}}Fp(configuration).{{nickname}}{{#isForm}}Form{{/isForm}}({{#parameters}}{{paramName}}, {{/parameters}}requestOptions).then((request) => request(axios, basePath)); }, {{/contents}} {{/operation}} @@ -301,7 +311,7 @@ export interface {{classname}}Interface { * @throws {RequiredError} * @memberof {{classname}}Interface */ - async {{nickname}}{{#isForm}}Form{{/isForm}}({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}options?: AxiosRequestConfig): Promise>; + async {{nickname}}{{#isForm}}Form{{/isForm}}({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}requestOptions?: AxiosRequestConfig): Promise>; {{/contents}} {{/operation}} @@ -335,8 +345,8 @@ export class {{classname}} extends BaseAPI { * @throws {RequiredError} * @memberof {{classname}} */ - public async {{nickname}}{{#isForm}}Form{{/isForm}}({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}options?: AxiosRequestConfig) : Promise> { - return {{classname}}Fp(this.configuration).{{nickname}}{{#isForm}}Form{{/isForm}}({{#parameters}}{{paramName}}, {{/parameters}}options).then((request) => request(this.axios, this.basePath)); + public async {{nickname}}{{#isForm}}Form{{/isForm}}({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}requestOptions?: AxiosRequestConfig) : Promise> { + return {{classname}}Fp(this.configuration).{{nickname}}{{#isForm}}Form{{/isForm}}({{#parameters}}{{paramName}}, {{/parameters}}requestOptions).then((request) => request(this.axios, this.basePath)); } {{^@last}} From ca7ffefa58d310f920a63c74cafdce9a81ac7158 Mon Sep 17 00:00:00 2001 From: Sachin Insuredmine Date: Thu, 13 Aug 2026 20:19:25 +0530 Subject: [PATCH 2/3] Fix case-insensitive `Content-Type` detection in the `typescript-axios` generator. --- .../typescript-axios/apiInner.mustache | 42 +++++++------------ 1 file changed, 16 insertions(+), 26 deletions(-) diff --git a/src/main/resources/handlebars/typescript-axios/apiInner.mustache b/src/main/resources/handlebars/typescript-axios/apiInner.mustache index 5d50674e61..29dd56221d 100644 --- a/src/main/resources/handlebars/typescript-axios/apiInner.mustache +++ b/src/main/resources/handlebars/typescript-axios/apiInner.mustache @@ -31,7 +31,7 @@ export const {{classname}}AxiosParamCreator = function (configuration?: Configur * @param {*} [options] Override http request option. * @throws {RequiredError} */ - {{nickname}}{{#isForm}}Form{{/isForm}}: async ({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}requestOptions: AxiosRequestConfig = {}): Promise => { + {{nickname}}{{#isForm}}Form{{/isForm}}: async ({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}options: AxiosRequestConfig = {}): Promise => { {{#parameters}} {{#required}} // verify required parameter '{{paramName}}' is not null or undefined @@ -48,7 +48,7 @@ export const {{classname}}AxiosParamCreator = function (configuration?: Configur if (configuration) { baseOptions = configuration.baseOptions; } - const localVarRequestOptions :AxiosRequestConfig = { method: '{{httpMethod}}', ...baseOptions, ...requestOptions}; + const localVarRequestOptions :AxiosRequestConfig = { method: '{{httpMethod}}', ...baseOptions, ...options}; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any;{{#vendorExtensions}}{{#hasFormParams}} const localVarFormParams = new {{^multipartFormData}}URLSearchParams(){{/multipartFormData}}{{#multipartFormData}}FormData(){{/multipartFormData}};{{/hasFormParams}}{{/vendorExtensions}} @@ -191,12 +191,12 @@ export const {{classname}}AxiosParamCreator = function (configuration?: Configur for (const key in localVarQueryParameter) { query.set(key, localVarQueryParameter[key]); } - for (const key in requestOptions.params) { - query.set(key, requestOptions.params[key]); + for (const key in options.params) { + query.set(key, options.params[key]); } localVarUrlObj.search = (new URLSearchParams(query)).toString(); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; - localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...requestOptions.headers}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; {{#isForm}} {{#hasFormParams}} localVarRequestOptions.data = localVarFormParams{{#vendorExtensions}}{{^multipartFormData}}.toString(){{/multipartFormData}}{{/vendorExtensions}}; @@ -204,19 +204,9 @@ export const {{classname}}AxiosParamCreator = function (configuration?: Configur {{/isForm}} {{^isForm}} {{#bodyParam}} - let needsSerialization = - typeof {{paramName}} !== "string" || - Object.keys(localVarRequestOptions.headers || {}).some( - headerKey => - headerKey.toLowerCase() === "content-type" && - (localVarRequestOptions.headers as any)[headerKey] === "application/json" - ); - - localVarRequestOptions.data = - needsSerialization - ? JSON.stringify({{paramName}} !== undefined ? {{paramName}} : {}) - : ({{paramName}} || ""); -{{/bodyParam}} + const needsSerialization = (typeof {{paramName}} !== "string") || localVarRequestOptions.headers?['Content-Type'] === 'application/json'; + localVarRequestOptions.data = needsSerialization ? JSON.stringify({{paramName}} !== undefined ? {{paramName}} : {}) : ({{paramName}} || ""); + {{/bodyParam}} {{/isForm}} return { @@ -249,8 +239,8 @@ export const {{classname}}Fp = function(configuration?: Configuration) { * @param {*} [options] Override http request option. * @throws {RequiredError} */ - async {{nickname}}{{#isForm}}Form{{/isForm}}({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}requestOptions?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise>> { - const localVarAxiosArgs = await {{classname}}AxiosParamCreator(configuration).{{nickname}}{{#isForm}}Form{{/isForm}}({{#parameters}}{{paramName}}, {{/parameters}}requestOptions); + async {{nickname}}{{#isForm}}Form{{/isForm}}({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise>> { + const localVarAxiosArgs = await {{classname}}AxiosParamCreator(configuration).{{nickname}}{{#isForm}}Form{{/isForm}}({{#parameters}}{{paramName}}, {{/parameters}}options); return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => { const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url}; return axios.request(axiosRequestArgs); @@ -278,11 +268,11 @@ export const {{classname}}Factory = function (configuration?: Configuration, bas {{#parameters}} * @param {{braces "left"}}{{{dataType}}}{{braces "right"}} {{^required}}[{{/required}}{{paramName}}{{^required}}]{{/required}} {{description}} {{/parameters}} - * @param {*} [requestOptions] Override http request option. + * @param {*} [options] Override http request option. * @throws {RequiredError} */ - async {{nickname}}{{#isForm}}Form{{/isForm}}({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}requestOptions?: AxiosRequestConfig): Promise> { - return {{classname}}Fp(configuration).{{nickname}}{{#isForm}}Form{{/isForm}}({{#parameters}}{{paramName}}, {{/parameters}}requestOptions).then((request) => request(axios, basePath)); + async {{nickname}}{{#isForm}}Form{{/isForm}}({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}options?: AxiosRequestConfig): Promise> { + return {{classname}}Fp(configuration).{{nickname}}{{#isForm}}Form{{/isForm}}({{#parameters}}{{paramName}}, {{/parameters}}options).then((request) => request(axios, basePath)); }, {{/contents}} {{/operation}} @@ -311,7 +301,7 @@ export interface {{classname}}Interface { * @throws {RequiredError} * @memberof {{classname}}Interface */ - async {{nickname}}{{#isForm}}Form{{/isForm}}({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}requestOptions?: AxiosRequestConfig): Promise>; + async {{nickname}}{{#isForm}}Form{{/isForm}}({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}options?: AxiosRequestConfig): Promise>; {{/contents}} {{/operation}} @@ -345,8 +335,8 @@ export class {{classname}} extends BaseAPI { * @throws {RequiredError} * @memberof {{classname}} */ - public async {{nickname}}{{#isForm}}Form{{/isForm}}({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}requestOptions?: AxiosRequestConfig) : Promise> { - return {{classname}}Fp(this.configuration).{{nickname}}{{#isForm}}Form{{/isForm}}({{#parameters}}{{paramName}}, {{/parameters}}requestOptions).then((request) => request(this.axios, this.basePath)); + public async {{nickname}}{{#isForm}}Form{{/isForm}}({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}options?: AxiosRequestConfig) : Promise> { + return {{classname}}Fp(this.configuration).{{nickname}}{{#isForm}}Form{{/isForm}}({{#parameters}}{{paramName}}, {{/parameters}}options).then((request) => request(this.axios, this.basePath)); } {{^@last}} From 5bc9f4013d3fb4d0aae6752335d34c90bf5a484d Mon Sep 17 00:00:00 2001 From: Sachin Insuredmine Date: Thu, 13 Aug 2026 20:20:58 +0530 Subject: [PATCH 3/3] Fix case-insensitive `Content-Type` detection in the `typescript-axios` generator. --- .../typescript-axios/apiInner.mustache | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/main/resources/handlebars/typescript-axios/apiInner.mustache b/src/main/resources/handlebars/typescript-axios/apiInner.mustache index 29dd56221d..578488b4a7 100644 --- a/src/main/resources/handlebars/typescript-axios/apiInner.mustache +++ b/src/main/resources/handlebars/typescript-axios/apiInner.mustache @@ -203,10 +203,20 @@ export const {{classname}}AxiosParamCreator = function (configuration?: Configur {{/hasFormParams}} {{/isForm}} {{^isForm}} - {{#bodyParam}} - const needsSerialization = (typeof {{paramName}} !== "string") || localVarRequestOptions.headers?['Content-Type'] === 'application/json'; - localVarRequestOptions.data = needsSerialization ? JSON.stringify({{paramName}} !== undefined ? {{paramName}} : {}) : ({{paramName}} || ""); - {{/bodyParam}} +{{#bodyParam}} + let needsSerialization = + typeof {{paramName}} !== "string" || + Object.keys(localVarRequestOptions.headers || {}).some( + headerKey => + headerKey.toLowerCase() === "content-type" && + (localVarRequestOptions.headers as any)[headerKey] === "application/json" + ); + + localVarRequestOptions.data = + needsSerialization + ? JSON.stringify({{paramName}} !== undefined ? {{paramName}} : {}) + : ({{paramName}} || ""); +{{/bodyParam}} {{/isForm}} return {