diff --git a/.changeset/fluffy-suits-care.md b/.changeset/fluffy-suits-care.md new file mode 100644 index 0000000000..32f93c5ad1 --- /dev/null +++ b/.changeset/fluffy-suits-care.md @@ -0,0 +1,5 @@ +--- +"@hey-api/openapi-ts": patch +--- + +fix(parser): handle OpenAPI 2.0 body as JSON by default if not explicitly defined diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/external/types.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/external/types.gen.ts index 3302d8733d..42a5c5e6ce 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/external/types.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/external/types.gen.ts @@ -176,7 +176,10 @@ export type GetExternalModelResponses = { export type GetExternalModelResponse = GetExternalModelResponses[keyof GetExternalModelResponses]; export type PostExternalModelData = { - body?: never; + /** + * Request body using external model + */ + body: ExternalSharedExternalSharedModel; path?: never; query?: never; url: '/external-model'; @@ -217,7 +220,10 @@ export type GetExternalUuidResponses = { export type GetExternalUuidResponse = GetExternalUuidResponses[keyof GetExternalUuidResponses]; export type PutExternalUuidData = { - body?: never; + /** + * Request body using external UUID + */ + body?: ExternalSharedExternalSharedModelWithUuid; path?: never; query?: never; url: '/external-uuid'; @@ -252,7 +258,10 @@ export type GetExternalNestedResponses = { export type GetExternalNestedResponse = GetExternalNestedResponses[keyof GetExternalNestedResponses]; export type PostExternalNestedData = { - body?: never; + /** + * Request body using external nested object + */ + body?: ExternalSharedExternalNested; path?: never; query?: never; url: '/external-nested'; @@ -292,7 +301,15 @@ export type GetExternalMixedResponses = { export type GetExternalMixedResponse = GetExternalMixedResponses[keyof GetExternalMixedResponses]; export type PostExternalMixedData = { - body?: never; + /** + * Request body with mixed external properties + */ + body?: { + id?: ExternalSharedId; + name?: ExternalSharedName; + uuid?: ExternalSharedExternalSharedModelWithUuid; + deep?: ExternalSharedDeep; + }; path?: never; query?: never; url: '/external-mixed'; @@ -324,7 +341,7 @@ export type GetExternalArrayResponses = { export type GetExternalArrayResponse = GetExternalArrayResponses[keyof GetExternalArrayResponses]; export type PostExternalArrayData = { - body?: never; + body: Array; path?: never; query?: never; url: '/external-array'; @@ -354,7 +371,7 @@ export type GetExternalUnionResponses = { }; export type PostExternalUnionData = { - body?: never; + body: unknown; path?: never; query?: never; url: '/external-union'; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@angular/common/default-class/sdk.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@angular/common/default-class/sdk.gen.ts index 92dd6fb44b..9143c94322 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@angular/common/default-class/sdk.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@angular/common/default-class/sdk.gen.ts @@ -105,7 +105,11 @@ export const callWithParameters = (options export const callWithWeirdParameterNames = (options: Options) => { return (options.client ?? client).post({ url: '/api/v{api-version}/parameters/{parameter.path.1}/{parameter-path-2}/{PARAMETER-PATH-3}', - ...options + ...options, + headers: { + 'Content-Type': 'application/json', + ...options.headers + } }); }; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@angular/common/default-class/types.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@angular/common/default-class/types.gen.ts index cb092e000a..9be8ff439d 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@angular/common/default-class/types.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@angular/common/default-class/types.gen.ts @@ -600,7 +600,10 @@ export type CallWithParametersData = { }; export type CallWithWeirdParameterNamesData = { - body?: never; + /** + * This is the parameter that is sent as request body + */ + body: string; headers: { /** * This is the parameter that goes into the request header diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@angular/common/default/sdk.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@angular/common/default/sdk.gen.ts index 92dd6fb44b..9143c94322 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@angular/common/default/sdk.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@angular/common/default/sdk.gen.ts @@ -105,7 +105,11 @@ export const callWithParameters = (options export const callWithWeirdParameterNames = (options: Options) => { return (options.client ?? client).post({ url: '/api/v{api-version}/parameters/{parameter.path.1}/{parameter-path-2}/{PARAMETER-PATH-3}', - ...options + ...options, + headers: { + 'Content-Type': 'application/json', + ...options.headers + } }); }; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@angular/common/default/types.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@angular/common/default/types.gen.ts index cb092e000a..9be8ff439d 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@angular/common/default/types.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@angular/common/default/types.gen.ts @@ -600,7 +600,10 @@ export type CallWithParametersData = { }; export type CallWithWeirdParameterNamesData = { - body?: never; + /** + * This is the parameter that is sent as request body + */ + body: string; headers: { /** * This is the parameter that goes into the request header diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@hey-api/sdk/default/sdk.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@hey-api/sdk/default/sdk.gen.ts index 92dd6fb44b..9143c94322 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@hey-api/sdk/default/sdk.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@hey-api/sdk/default/sdk.gen.ts @@ -105,7 +105,11 @@ export const callWithParameters = (options export const callWithWeirdParameterNames = (options: Options) => { return (options.client ?? client).post({ url: '/api/v{api-version}/parameters/{parameter.path.1}/{parameter-path-2}/{PARAMETER-PATH-3}', - ...options + ...options, + headers: { + 'Content-Type': 'application/json', + ...options.headers + } }); }; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@hey-api/sdk/default/types.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@hey-api/sdk/default/types.gen.ts index cb092e000a..9be8ff439d 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@hey-api/sdk/default/types.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@hey-api/sdk/default/types.gen.ts @@ -600,7 +600,10 @@ export type CallWithParametersData = { }; export type CallWithWeirdParameterNamesData = { - body?: never; + /** + * This is the parameter that is sent as request body + */ + body: string; headers: { /** * This is the parameter that goes into the request header diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@hey-api/sdk/throwOnError/sdk.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@hey-api/sdk/throwOnError/sdk.gen.ts index 47e083ef9c..10971c141d 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@hey-api/sdk/throwOnError/sdk.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@hey-api/sdk/throwOnError/sdk.gen.ts @@ -105,7 +105,11 @@ export const callWithParameters = (options: export const callWithWeirdParameterNames = (options: Options) => { return (options.client ?? client).post({ url: '/api/v{api-version}/parameters/{parameter.path.1}/{parameter-path-2}/{PARAMETER-PATH-3}', - ...options + ...options, + headers: { + 'Content-Type': 'application/json', + ...options.headers + } }); }; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@hey-api/sdk/throwOnError/types.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@hey-api/sdk/throwOnError/types.gen.ts index cb092e000a..9be8ff439d 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@hey-api/sdk/throwOnError/types.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@hey-api/sdk/throwOnError/types.gen.ts @@ -600,7 +600,10 @@ export type CallWithParametersData = { }; export type CallWithWeirdParameterNamesData = { - body?: never; + /** + * This is the parameter that is sent as request body + */ + body: string; headers: { /** * This is the parameter that goes into the request header diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@pinia/colada/fetch/sdk.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@pinia/colada/fetch/sdk.gen.ts index 92dd6fb44b..9143c94322 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@pinia/colada/fetch/sdk.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@pinia/colada/fetch/sdk.gen.ts @@ -105,7 +105,11 @@ export const callWithParameters = (options export const callWithWeirdParameterNames = (options: Options) => { return (options.client ?? client).post({ url: '/api/v{api-version}/parameters/{parameter.path.1}/{parameter-path-2}/{PARAMETER-PATH-3}', - ...options + ...options, + headers: { + 'Content-Type': 'application/json', + ...options.headers + } }); }; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@pinia/colada/fetch/types.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@pinia/colada/fetch/types.gen.ts index cb092e000a..9be8ff439d 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@pinia/colada/fetch/types.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@pinia/colada/fetch/types.gen.ts @@ -600,7 +600,10 @@ export type CallWithParametersData = { }; export type CallWithWeirdParameterNamesData = { - body?: never; + /** + * This is the parameter that is sent as request body + */ + body: string; headers: { /** * This is the parameter that goes into the request header diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/angular-query-experimental/axios/sdk.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/angular-query-experimental/axios/sdk.gen.ts index f7209883f2..239a23814a 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/angular-query-experimental/axios/sdk.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/angular-query-experimental/axios/sdk.gen.ts @@ -105,7 +105,11 @@ export const callWithParameters = (options export const callWithWeirdParameterNames = (options: Options) => { return (options.client ?? client).post({ url: '/api/v{api-version}/parameters/{parameter.path.1}/{parameter-path-2}/{PARAMETER-PATH-3}', - ...options + ...options, + headers: { + 'Content-Type': 'application/json', + ...options.headers + } }); }; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/angular-query-experimental/axios/types.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/angular-query-experimental/axios/types.gen.ts index 974f0985dc..fa2bd89d85 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/angular-query-experimental/axios/types.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/angular-query-experimental/axios/types.gen.ts @@ -600,7 +600,10 @@ export type CallWithParametersData = { }; export type CallWithWeirdParameterNamesData = { - body?: never; + /** + * This is the parameter that is sent as request body + */ + body: string; headers: { /** * This is the parameter that goes into the request header diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/angular-query-experimental/fetch/sdk.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/angular-query-experimental/fetch/sdk.gen.ts index 92dd6fb44b..9143c94322 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/angular-query-experimental/fetch/sdk.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/angular-query-experimental/fetch/sdk.gen.ts @@ -105,7 +105,11 @@ export const callWithParameters = (options export const callWithWeirdParameterNames = (options: Options) => { return (options.client ?? client).post({ url: '/api/v{api-version}/parameters/{parameter.path.1}/{parameter-path-2}/{PARAMETER-PATH-3}', - ...options + ...options, + headers: { + 'Content-Type': 'application/json', + ...options.headers + } }); }; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/angular-query-experimental/fetch/types.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/angular-query-experimental/fetch/types.gen.ts index cb092e000a..9be8ff439d 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/angular-query-experimental/fetch/types.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/angular-query-experimental/fetch/types.gen.ts @@ -600,7 +600,10 @@ export type CallWithParametersData = { }; export type CallWithWeirdParameterNamesData = { - body?: never; + /** + * This is the parameter that is sent as request body + */ + body: string; headers: { /** * This is the parameter that goes into the request header diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/react-query/axios/sdk.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/react-query/axios/sdk.gen.ts index f7209883f2..239a23814a 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/react-query/axios/sdk.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/react-query/axios/sdk.gen.ts @@ -105,7 +105,11 @@ export const callWithParameters = (options export const callWithWeirdParameterNames = (options: Options) => { return (options.client ?? client).post({ url: '/api/v{api-version}/parameters/{parameter.path.1}/{parameter-path-2}/{PARAMETER-PATH-3}', - ...options + ...options, + headers: { + 'Content-Type': 'application/json', + ...options.headers + } }); }; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/react-query/axios/types.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/react-query/axios/types.gen.ts index 974f0985dc..fa2bd89d85 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/react-query/axios/types.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/react-query/axios/types.gen.ts @@ -600,7 +600,10 @@ export type CallWithParametersData = { }; export type CallWithWeirdParameterNamesData = { - body?: never; + /** + * This is the parameter that is sent as request body + */ + body: string; headers: { /** * This is the parameter that goes into the request header diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/react-query/fetch/sdk.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/react-query/fetch/sdk.gen.ts index 92dd6fb44b..9143c94322 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/react-query/fetch/sdk.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/react-query/fetch/sdk.gen.ts @@ -105,7 +105,11 @@ export const callWithParameters = (options export const callWithWeirdParameterNames = (options: Options) => { return (options.client ?? client).post({ url: '/api/v{api-version}/parameters/{parameter.path.1}/{parameter-path-2}/{PARAMETER-PATH-3}', - ...options + ...options, + headers: { + 'Content-Type': 'application/json', + ...options.headers + } }); }; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/react-query/fetch/types.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/react-query/fetch/types.gen.ts index cb092e000a..9be8ff439d 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/react-query/fetch/types.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/react-query/fetch/types.gen.ts @@ -600,7 +600,10 @@ export type CallWithParametersData = { }; export type CallWithWeirdParameterNamesData = { - body?: never; + /** + * This is the parameter that is sent as request body + */ + body: string; headers: { /** * This is the parameter that goes into the request header diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/solid-query/axios/sdk.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/solid-query/axios/sdk.gen.ts index f7209883f2..239a23814a 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/solid-query/axios/sdk.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/solid-query/axios/sdk.gen.ts @@ -105,7 +105,11 @@ export const callWithParameters = (options export const callWithWeirdParameterNames = (options: Options) => { return (options.client ?? client).post({ url: '/api/v{api-version}/parameters/{parameter.path.1}/{parameter-path-2}/{PARAMETER-PATH-3}', - ...options + ...options, + headers: { + 'Content-Type': 'application/json', + ...options.headers + } }); }; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/solid-query/axios/types.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/solid-query/axios/types.gen.ts index 974f0985dc..fa2bd89d85 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/solid-query/axios/types.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/solid-query/axios/types.gen.ts @@ -600,7 +600,10 @@ export type CallWithParametersData = { }; export type CallWithWeirdParameterNamesData = { - body?: never; + /** + * This is the parameter that is sent as request body + */ + body: string; headers: { /** * This is the parameter that goes into the request header diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/solid-query/fetch/sdk.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/solid-query/fetch/sdk.gen.ts index 92dd6fb44b..9143c94322 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/solid-query/fetch/sdk.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/solid-query/fetch/sdk.gen.ts @@ -105,7 +105,11 @@ export const callWithParameters = (options export const callWithWeirdParameterNames = (options: Options) => { return (options.client ?? client).post({ url: '/api/v{api-version}/parameters/{parameter.path.1}/{parameter-path-2}/{PARAMETER-PATH-3}', - ...options + ...options, + headers: { + 'Content-Type': 'application/json', + ...options.headers + } }); }; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/solid-query/fetch/types.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/solid-query/fetch/types.gen.ts index cb092e000a..9be8ff439d 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/solid-query/fetch/types.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/solid-query/fetch/types.gen.ts @@ -600,7 +600,10 @@ export type CallWithParametersData = { }; export type CallWithWeirdParameterNamesData = { - body?: never; + /** + * This is the parameter that is sent as request body + */ + body: string; headers: { /** * This is the parameter that goes into the request header diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/svelte-query/axios/sdk.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/svelte-query/axios/sdk.gen.ts index f7209883f2..239a23814a 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/svelte-query/axios/sdk.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/svelte-query/axios/sdk.gen.ts @@ -105,7 +105,11 @@ export const callWithParameters = (options export const callWithWeirdParameterNames = (options: Options) => { return (options.client ?? client).post({ url: '/api/v{api-version}/parameters/{parameter.path.1}/{parameter-path-2}/{PARAMETER-PATH-3}', - ...options + ...options, + headers: { + 'Content-Type': 'application/json', + ...options.headers + } }); }; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/svelte-query/axios/types.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/svelte-query/axios/types.gen.ts index 974f0985dc..fa2bd89d85 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/svelte-query/axios/types.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/svelte-query/axios/types.gen.ts @@ -600,7 +600,10 @@ export type CallWithParametersData = { }; export type CallWithWeirdParameterNamesData = { - body?: never; + /** + * This is the parameter that is sent as request body + */ + body: string; headers: { /** * This is the parameter that goes into the request header diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/svelte-query/fetch/sdk.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/svelte-query/fetch/sdk.gen.ts index 92dd6fb44b..9143c94322 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/svelte-query/fetch/sdk.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/svelte-query/fetch/sdk.gen.ts @@ -105,7 +105,11 @@ export const callWithParameters = (options export const callWithWeirdParameterNames = (options: Options) => { return (options.client ?? client).post({ url: '/api/v{api-version}/parameters/{parameter.path.1}/{parameter-path-2}/{PARAMETER-PATH-3}', - ...options + ...options, + headers: { + 'Content-Type': 'application/json', + ...options.headers + } }); }; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/svelte-query/fetch/types.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/svelte-query/fetch/types.gen.ts index cb092e000a..9be8ff439d 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/svelte-query/fetch/types.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/svelte-query/fetch/types.gen.ts @@ -600,7 +600,10 @@ export type CallWithParametersData = { }; export type CallWithWeirdParameterNamesData = { - body?: never; + /** + * This is the parameter that is sent as request body + */ + body: string; headers: { /** * This is the parameter that goes into the request header diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/vue-query/axios/sdk.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/vue-query/axios/sdk.gen.ts index f7209883f2..239a23814a 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/vue-query/axios/sdk.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/vue-query/axios/sdk.gen.ts @@ -105,7 +105,11 @@ export const callWithParameters = (options export const callWithWeirdParameterNames = (options: Options) => { return (options.client ?? client).post({ url: '/api/v{api-version}/parameters/{parameter.path.1}/{parameter-path-2}/{PARAMETER-PATH-3}', - ...options + ...options, + headers: { + 'Content-Type': 'application/json', + ...options.headers + } }); }; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/vue-query/axios/types.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/vue-query/axios/types.gen.ts index 974f0985dc..fa2bd89d85 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/vue-query/axios/types.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/vue-query/axios/types.gen.ts @@ -600,7 +600,10 @@ export type CallWithParametersData = { }; export type CallWithWeirdParameterNamesData = { - body?: never; + /** + * This is the parameter that is sent as request body + */ + body: string; headers: { /** * This is the parameter that goes into the request header diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/vue-query/fetch/sdk.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/vue-query/fetch/sdk.gen.ts index 92dd6fb44b..9143c94322 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/vue-query/fetch/sdk.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/vue-query/fetch/sdk.gen.ts @@ -105,7 +105,11 @@ export const callWithParameters = (options export const callWithWeirdParameterNames = (options: Options) => { return (options.client ?? client).post({ url: '/api/v{api-version}/parameters/{parameter.path.1}/{parameter-path-2}/{PARAMETER-PATH-3}', - ...options + ...options, + headers: { + 'Content-Type': 'application/json', + ...options.headers + } }); }; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/vue-query/fetch/types.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/vue-query/fetch/types.gen.ts index cb092e000a..9be8ff439d 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/vue-query/fetch/types.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/@tanstack/vue-query/fetch/types.gen.ts @@ -600,7 +600,10 @@ export type CallWithParametersData = { }; export type CallWithWeirdParameterNamesData = { - body?: never; + /** + * This is the parameter that is sent as request body + */ + body: string; headers: { /** * This is the parameter that goes into the request header diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/fastify/default/fastify.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/fastify/default/fastify.gen.ts index e67c837d0d..f6a8efdaf8 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/fastify/default/fastify.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/fastify/default/fastify.gen.ts @@ -14,6 +14,7 @@ export type RouteHandlers = { Querystring: CallWithParametersData['query']; }>; callWithWeirdParameterNames: RouteHandler<{ + Body: CallWithWeirdParameterNamesData['body']; Headers: CallWithWeirdParameterNamesData['headers']; Params: CallWithWeirdParameterNamesData['path']; Querystring: CallWithWeirdParameterNamesData['query']; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/fastify/default/types.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/fastify/default/types.gen.ts index cb092e000a..9be8ff439d 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/fastify/default/types.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/fastify/default/types.gen.ts @@ -600,7 +600,10 @@ export type CallWithParametersData = { }; export type CallWithWeirdParameterNamesData = { - body?: never; + /** + * This is the parameter that is sent as request body + */ + body: string; headers: { /** * This is the parameter that goes into the request header diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/valibot/default/valibot.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/valibot/default/valibot.gen.ts index 5513ab4c5f..40f36f8747 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/valibot/default/valibot.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/valibot/default/valibot.gen.ts @@ -533,7 +533,7 @@ export const vCallWithParametersData = v.object({ }); export const vCallWithWeirdParameterNamesData = v.object({ - body: v.optional(v.never()), + body: v.string(), path: v.object({ 'parameter.path.1': v.optional(v.string()), 'parameter-path-2': v.optional(v.string()), diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/test/generated/v2/sdk.gen.ts.snap b/packages/openapi-ts-tests/main/test/__snapshots__/test/generated/v2/sdk.gen.ts.snap index 464488dc82..ea2b892138 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/test/generated/v2/sdk.gen.ts.snap +++ b/packages/openapi-ts-tests/main/test/__snapshots__/test/generated/v2/sdk.gen.ts.snap @@ -409,7 +409,6 @@ export class Parameters { * @param data.parameterHeader This is the parameter that goes into the header * @param data.parameterQuery This is the parameter that goes into the query params * @param data.parameterForm This is the parameter that goes into the form data - * @param data.parameterBody This is the parameter that is sent as request body * @param data.parameterPath This is the parameter that goes into the path * @throws ApiError */ @@ -428,8 +427,7 @@ export class Parameters { }, formData: { parameterForm: data.parameterForm - }, - body: data.parameterBody + } }); } @@ -437,7 +435,6 @@ export class Parameters { * @param data The data for the request. * @param data.parameterHeader This is the parameter that goes into the request header * @param data.parameterQuery This is the parameter that goes into the request query params - * @param data.parameterForm This is the parameter that goes into the request form data * @param data.parameterBody This is the parameter that is sent as request body * @param data.parameterPath1 This is the parameter that goes into the path * @param data.parameterPath2 This is the parameter that goes into the path @@ -461,9 +458,6 @@ export class Parameters { default: data._default, 'parameter-query': data.parameterQuery }, - formData: { - parameter_form: data.parameterForm - }, body: data.parameterBody }); } diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/test/generated/v2/types.gen.ts.snap b/packages/openapi-ts-tests/main/test/__snapshots__/test/generated/v2/types.gen.ts.snap index c43487e681..9c4bd8d196 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/test/generated/v2/types.gen.ts.snap +++ b/packages/openapi-ts-tests/main/test/__snapshots__/test/generated/v2/types.gen.ts.snap @@ -678,10 +678,6 @@ export type NonAsciiæøåÆøÅöôêÊ字符串Data = { export type NonAsciiæøåÆøÅöôêÊ字符串Response = (NonAsciiStringæøåÆØÅöôêÊ字符串); export type CallWithParametersData = { - /** - * This is the parameter that is sent as request body - */ - parameterBody: string; /** * This is the parameter that goes into the form data */ @@ -709,10 +705,6 @@ export type CallWithWeirdParameterNamesData = { * This is the parameter that is sent as request body */ parameterBody: string; - /** - * This is the parameter that goes into the request form data - */ - parameterForm: string; /** * This is the parameter that goes into the request header */ diff --git a/packages/openapi-ts-tests/zod/v3/__snapshots__/2.0.x/mini/default/zod.gen.ts b/packages/openapi-ts-tests/zod/v3/__snapshots__/2.0.x/mini/default/zod.gen.ts index 3425d3ab95..faa59eba03 100644 --- a/packages/openapi-ts-tests/zod/v3/__snapshots__/2.0.x/mini/default/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v3/__snapshots__/2.0.x/mini/default/zod.gen.ts @@ -548,7 +548,7 @@ export const zCallWithParametersData = z.object({ }); export const zCallWithWeirdParameterNamesData = z.object({ - body: z.optional(z.never()), + body: z.string(), path: z.object({ 'parameter.path.1': z.optional(z.string()), 'parameter-path-2': z.optional(z.string()), diff --git a/packages/openapi-ts-tests/zod/v3/__snapshots__/2.0.x/v3/default/zod.gen.ts b/packages/openapi-ts-tests/zod/v3/__snapshots__/2.0.x/v3/default/zod.gen.ts index 677765572d..cc825b3254 100644 --- a/packages/openapi-ts-tests/zod/v3/__snapshots__/2.0.x/v3/default/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v3/__snapshots__/2.0.x/v3/default/zod.gen.ts @@ -546,7 +546,7 @@ export const zCallWithParametersData = z.object({ }); export const zCallWithWeirdParameterNamesData = z.object({ - body: z.never().optional(), + body: z.string(), path: z.object({ 'parameter.path.1': z.string().optional(), 'parameter-path-2': z.string().optional(), diff --git a/packages/openapi-ts-tests/zod/v3/__snapshots__/2.0.x/v4/default/zod.gen.ts b/packages/openapi-ts-tests/zod/v3/__snapshots__/2.0.x/v4/default/zod.gen.ts index b5204bbb22..ccfbf6f309 100644 --- a/packages/openapi-ts-tests/zod/v3/__snapshots__/2.0.x/v4/default/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v3/__snapshots__/2.0.x/v4/default/zod.gen.ts @@ -548,7 +548,7 @@ export const zCallWithParametersData = z.object({ }); export const zCallWithWeirdParameterNamesData = z.object({ - body: z.optional(z.never()), + body: z.string(), path: z.object({ 'parameter.path.1': z.optional(z.string()), 'parameter-path-2': z.optional(z.string()), diff --git a/packages/openapi-ts-tests/zod/v4/__snapshots__/2.0.x/mini/default/zod.gen.ts b/packages/openapi-ts-tests/zod/v4/__snapshots__/2.0.x/mini/default/zod.gen.ts index 3a563caec0..86fca9b1d6 100644 --- a/packages/openapi-ts-tests/zod/v4/__snapshots__/2.0.x/mini/default/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v4/__snapshots__/2.0.x/mini/default/zod.gen.ts @@ -548,7 +548,7 @@ export const zCallWithParametersData = z.object({ }); export const zCallWithWeirdParameterNamesData = z.object({ - body: z.optional(z.never()), + body: z.string(), path: z.object({ 'parameter.path.1': z.optional(z.string()), 'parameter-path-2': z.optional(z.string()), diff --git a/packages/openapi-ts-tests/zod/v4/__snapshots__/2.0.x/v3/default/zod.gen.ts b/packages/openapi-ts-tests/zod/v4/__snapshots__/2.0.x/v3/default/zod.gen.ts index 83d9017daf..6b727d44ee 100644 --- a/packages/openapi-ts-tests/zod/v4/__snapshots__/2.0.x/v3/default/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v4/__snapshots__/2.0.x/v3/default/zod.gen.ts @@ -546,7 +546,7 @@ export const zCallWithParametersData = z.object({ }); export const zCallWithWeirdParameterNamesData = z.object({ - body: z.never().optional(), + body: z.string(), path: z.object({ 'parameter.path.1': z.string().optional(), 'parameter-path-2': z.string().optional(), diff --git a/packages/openapi-ts-tests/zod/v4/__snapshots__/2.0.x/v4/default/zod.gen.ts b/packages/openapi-ts-tests/zod/v4/__snapshots__/2.0.x/v4/default/zod.gen.ts index 65781dec7f..bc7dcb6542 100644 --- a/packages/openapi-ts-tests/zod/v4/__snapshots__/2.0.x/v4/default/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v4/__snapshots__/2.0.x/v4/default/zod.gen.ts @@ -548,7 +548,7 @@ export const zCallWithParametersData = z.object({ }); export const zCallWithWeirdParameterNamesData = z.object({ - body: z.optional(z.never()), + body: z.string(), path: z.object({ 'parameter.path.1': z.optional(z.string()), 'parameter-path-2': z.optional(z.string()), diff --git a/packages/openapi-ts/src/openApi/2.0.x/parser/__tests__/operation.test.ts b/packages/openapi-ts/src/openApi/2.0.x/parser/__tests__/operation.test.ts index 213adb0427..7c550ea8af 100644 --- a/packages/openapi-ts/src/openApi/2.0.x/parser/__tests__/operation.test.ts +++ b/packages/openapi-ts/src/openApi/2.0.x/parser/__tests__/operation.test.ts @@ -1,21 +1,36 @@ import { describe, expect, it } from 'vitest'; import type { IR } from '../../../../ir/types'; -import type { SecuritySchemeObject } from '../../types/spec'; +import type { ParameterObject, SecuritySchemeObject } from '../../types/spec'; import { parsePathOperation } from '../operation'; type ParseOperationProps = Parameters[0]; -describe('operation', () => { - const context = { +const createContext = () => + ({ config: { + parser: { + pagination: { + keywords: ['after', 'before', 'cursor', 'offset', 'page', 'start'], + }, + }, plugins: {}, }, + dereference: (obj: any): T => obj as T, ir: { + components: { + schemas: {}, + }, paths: {}, servers: [], }, - } as unknown as IR.Context; + resolveRef: () => + // Mock implementation + undefined, + }) as unknown as IR.Context; + +describe('operation', () => { + const context = createContext(); it('should parse operation correctly', () => { const method = 'get'; @@ -90,4 +105,148 @@ describe('operation', () => { summary: 'Test Operation', }); }); + + it('should parse body parameter when consumes is undefined', () => { + const context = createContext(); + const method = 'post'; + const bodyParam: ParameterObject = { + description: 'Request body', + in: 'body', + name: 'body', + required: true, + schema: { + properties: { + id: { type: 'string' }, + name: { type: 'string' }, + }, + required: ['id'], + type: 'object', + }, + }; + const operation: ParseOperationProps['operation'] = { + operationId: 'createItem', + requestBody: [bodyParam], + responses: { + '201': { + description: 'Created', + }, + }, + summary: 'Create an item', + }; + const path = '/items'; + const securitySchemesMap = new Map(); + const state: ParseOperationProps['state'] = { + ids: new Map(), + }; + + parsePathOperation({ + context, + method, + operation, + path, + securitySchemesMap, + state, + }); + + const result = context.ir.paths?.[path]?.[method]; + expect(result).toBeDefined(); + expect(result?.body).toBeDefined(); + expect(result?.body?.mediaType).toBe('application/json'); + expect(result?.body?.required).toBe(true); + expect(result?.body?.schema.type).toBe('object'); + }); + + it('should parse body parameter with array schema', () => { + const context = createContext(); + const method = 'post'; + const bodyParam: ParameterObject = { + description: 'add items', + in: 'body', + name: 'request', + required: true, + schema: { + items: { + properties: { + count: { type: 'number' }, + id: { type: 'integer' }, + }, + type: 'object', + }, + type: 'array', + }, + }; + const operation: ParseOperationProps['operation'] = { + operationId: 'addItems', + requestBody: [bodyParam], + responses: { + '201': { + description: 'Created', + }, + }, + }; + const path = '/api/v1/items'; + const securitySchemesMap = new Map(); + const state: ParseOperationProps['state'] = { + ids: new Map(), + }; + + parsePathOperation({ + context, + method, + operation, + path, + securitySchemesMap, + state, + }); + + const result = context.ir.paths?.[path]?.[method]; + expect(result).toBeDefined(); + expect(result?.body).toBeDefined(); + expect(result?.body?.mediaType).toBe('application/json'); + expect(result?.body?.required).toBe(true); + expect(result?.body?.schema.type).toBe('array'); + }); + + it('should use consumes when specified', () => { + const context = createContext(); + const method = 'post'; + const bodyParam: ParameterObject = { + description: 'XML body', + in: 'body', + name: 'body', + required: true, + schema: { + type: 'object', + }, + }; + const operation: ParseOperationProps['operation'] = { + consumes: ['application/xml'], + operationId: 'createXml', + requestBody: [bodyParam], + responses: { + '201': { + description: 'Created', + }, + }, + }; + const path = '/items'; + const securitySchemesMap = new Map(); + const state: ParseOperationProps['state'] = { + ids: new Map(), + }; + + parsePathOperation({ + context, + method, + operation, + path, + securitySchemesMap, + state, + }); + + const result = context.ir.paths?.[path]?.[method]; + expect(result).toBeDefined(); + expect(result?.body).toBeDefined(); + expect(result?.body?.mediaType).toBe('application/xml'); + }); }); diff --git a/packages/openapi-ts/src/openApi/2.0.x/parser/operation.ts b/packages/openapi-ts/src/openApi/2.0.x/parser/operation.ts index 99c80c34b0..e078fed7e8 100644 --- a/packages/openapi-ts/src/openApi/2.0.x/parser/operation.ts +++ b/packages/openapi-ts/src/openApi/2.0.x/parser/operation.ts @@ -115,6 +115,13 @@ const operationToIrOperation = ({ }; const requestBodyObjectRequired: Array = []; + // Check if there are any body parameters (not formData) to determine default media type + const hasBodyParameter = operation.requestBody?.some((param) => { + const resolvedParam = + '$ref' in param ? context.resolveRef(param.$ref) : param; + return resolvedParam.in === 'body'; + }); + for (const requestBodyParameter of operation.requestBody ?? []) { const requestBody = '$ref' in requestBodyParameter @@ -129,8 +136,16 @@ const operationToIrOperation = ({ required: undefined, type: requestBody.type === 'file' ? 'string' : requestBody.type, }; + + // Only default to JSON if we have body parameters and no consumes specified + // FormData parameters without consumes should not get a default media type + let mimeTypes = operation.consumes; + if (!mimeTypes && hasBodyParameter && requestBody.in === 'body') { + mimeTypes = ['application/json']; + } + const contents = mediaTypeObjects({ - mimeTypes: operation.consumes, + mimeTypes, response: { schema }, }); // TODO: add support for multiple content types, for now prefer JSON diff --git a/specs/2.0.x/full.yaml b/specs/2.0.x/full.yaml index cd6dbbc1b7..d6e682ae06 100644 --- a/specs/2.0.x/full.yaml +++ b/specs/2.0.x/full.yaml @@ -113,11 +113,6 @@ paths: in: formData type: string required: true - - description: This is the parameter that is sent as request body - name: parameterBody - in: body - type: string - required: true - description: This is the parameter that goes into the path name: parameterPath in: path @@ -164,16 +159,12 @@ paths: in: query type: string required: true - - description: This is the parameter that goes into the request form data - name: parameter_form - in: formData - type: string - required: true - description: This is the parameter that is sent as request body name: PARAMETER-BODY in: body - type: string required: true + schema: + type: string - description: api-version should be required in standalone clients name: api-version in: path diff --git a/specs/v2.json b/specs/v2.json index f3b5060ab9..2ede574459 100644 --- a/specs/v2.json +++ b/specs/v2.json @@ -129,13 +129,6 @@ "type": "string", "required": true }, - { - "description": "This is the parameter that is sent as request body", - "name": "parameterBody", - "in": "body", - "type": "string", - "required": true - }, { "description": "This is the parameter that goes into the path", "name": "parameterPath", @@ -200,19 +193,14 @@ "type": "string", "required": true }, - { - "description": "This is the parameter that goes into the request form data", - "name": "parameter_form", - "in": "formData", - "type": "string", - "required": true - }, { "description": "This is the parameter that is sent as request body", "name": "PARAMETER-BODY", "in": "body", - "type": "string", - "required": true + "required": true, + "schema": { + "type": "string" + } }, { "description": "api-version should be required in standalone clients",