diff --git a/examples/openapi-ts-tanstack-angular-query-experimental/src/client/@tanstack/angular-query-experimental.gen.ts b/examples/openapi-ts-tanstack-angular-query-experimental/src/client/@tanstack/angular-query-experimental.gen.ts index 4952a1ddf..c0b938174 100644 --- a/examples/openapi-ts-tanstack-angular-query-experimental/src/client/@tanstack/angular-query-experimental.gen.ts +++ b/examples/openapi-ts-tanstack-angular-query-experimental/src/client/@tanstack/angular-query-experimental.gen.ts @@ -40,12 +40,19 @@ import type { DeletePetData, DeleteUserData, FindPetsByStatusData, + FindPetsByStatusResponse, FindPetsByTagsData, + FindPetsByTagsResponse, GetInventoryData, + GetInventoryResponse, GetOrderByIdData, + GetOrderByIdResponse, GetPetByIdData, + GetPetByIdResponse, GetUserByNameData, + GetUserByNameResponse, LoginUserData, + LoginUserResponse, LogoutUserData, PlaceOrderData, PlaceOrderResponse, @@ -160,11 +167,19 @@ export const findPetsByStatusQueryKey = ( export const findPetsByStatusOptions = ( options: Options, ) => - queryOptions({ + queryOptions< + FindPetsByStatusResponse, + DefaultError, + FindPetsByStatusResponse, + ReturnType + >({ queryFn: async ({ queryKey, signal }) => { + const [queryParams] = queryKey as ReturnType< + typeof findPetsByStatusQueryKey + >; const { data } = await findPetsByStatus({ ...options, - ...queryKey[0], + ...queryParams, signal, throwOnError: true, }); @@ -182,11 +197,19 @@ export const findPetsByTagsQueryKey = (options: Options) => * Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. */ export const findPetsByTagsOptions = (options: Options) => - queryOptions({ + queryOptions< + FindPetsByTagsResponse, + DefaultError, + FindPetsByTagsResponse, + ReturnType + >({ queryFn: async ({ queryKey, signal }) => { + const [queryParams] = queryKey as ReturnType< + typeof findPetsByTagsQueryKey + >; const { data } = await findPetsByTags({ ...options, - ...queryKey[0], + ...queryParams, signal, throwOnError: true, }); @@ -229,11 +252,17 @@ export const getPetByIdQueryKey = (options: Options) => * Returns a single pet. */ export const getPetByIdOptions = (options: Options) => - queryOptions({ + queryOptions< + GetPetByIdResponse, + DefaultError, + GetPetByIdResponse, + ReturnType + >({ queryFn: async ({ queryKey, signal }) => { + const [queryParams] = queryKey as ReturnType; const { data } = await getPetById({ ...options, - ...queryKey[0], + ...queryParams, signal, throwOnError: true, }); @@ -309,11 +338,17 @@ export const getInventoryQueryKey = (options?: Options) => * Returns a map of status codes to quantities. */ export const getInventoryOptions = (options?: Options) => - queryOptions({ + queryOptions< + GetInventoryResponse, + DefaultError, + GetInventoryResponse, + ReturnType + >({ queryFn: async ({ queryKey, signal }) => { + const [queryParams] = queryKey as ReturnType; const { data } = await getInventory({ ...options, - ...queryKey[0], + ...queryParams, signal, throwOnError: true, }); @@ -385,11 +420,17 @@ export const getOrderByIdQueryKey = (options: Options) => * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions. */ export const getOrderByIdOptions = (options: Options) => - queryOptions({ + queryOptions< + GetOrderByIdResponse, + DefaultError, + GetOrderByIdResponse, + ReturnType + >({ queryFn: async ({ queryKey, signal }) => { + const [queryParams] = queryKey as ReturnType; const { data } = await getOrderById({ ...options, - ...queryKey[0], + ...queryParams, signal, throwOnError: true, }); @@ -465,11 +506,17 @@ export const loginUserQueryKey = (options?: Options) => * Log into the system. */ export const loginUserOptions = (options?: Options) => - queryOptions({ + queryOptions< + LoginUserResponse, + DefaultError, + LoginUserResponse, + ReturnType + >({ queryFn: async ({ queryKey, signal }) => { + const [queryParams] = queryKey as ReturnType; const { data } = await loginUser({ ...options, - ...queryKey[0], + ...queryParams, signal, throwOnError: true, }); @@ -487,11 +534,17 @@ export const logoutUserQueryKey = (options?: Options) => * Log user out of the system. */ export const logoutUserOptions = (options?: Options) => - queryOptions({ + queryOptions< + unknown, + DefaultError, + unknown, + ReturnType + >({ queryFn: async ({ queryKey, signal }) => { + const [queryParams] = queryKey as ReturnType; const { data } = await logoutUser({ ...options, - ...queryKey[0], + ...queryParams, signal, throwOnError: true, }); @@ -534,11 +587,19 @@ export const getUserByNameQueryKey = (options: Options) => * Get user detail based on username. */ export const getUserByNameOptions = (options: Options) => - queryOptions({ + queryOptions< + GetUserByNameResponse, + DefaultError, + GetUserByNameResponse, + ReturnType + >({ queryFn: async ({ queryKey, signal }) => { + const [queryParams] = queryKey as ReturnType< + typeof getUserByNameQueryKey + >; const { data } = await getUserByName({ ...options, - ...queryKey[0], + ...queryParams, signal, throwOnError: true, }); diff --git a/examples/openapi-ts-tanstack-react-query/src/client/@tanstack/react-query.gen.ts b/examples/openapi-ts-tanstack-react-query/src/client/@tanstack/react-query.gen.ts index d0b4d2452..e829d5a8c 100644 --- a/examples/openapi-ts-tanstack-react-query/src/client/@tanstack/react-query.gen.ts +++ b/examples/openapi-ts-tanstack-react-query/src/client/@tanstack/react-query.gen.ts @@ -19,12 +19,19 @@ import type { DeletePetData, DeleteUserData, FindPetsByStatusData, + FindPetsByStatusResponse, FindPetsByTagsData, + FindPetsByTagsResponse, GetInventoryData, + GetInventoryResponse, GetOrderByIdData, + GetOrderByIdResponse, GetPetByIdData, + GetPetByIdResponse, GetUserByNameData, + GetUserByNameResponse, LoginUserData, + LoginUserResponse, LogoutUserData, PlaceOrderData, PlaceOrderResponse, @@ -143,11 +150,19 @@ export const findPetsByStatusQueryKey = ( export const findPetsByStatusOptions = ( options: Options, ) => - queryOptions({ + queryOptions< + FindPetsByStatusResponse, + DefaultError, + FindPetsByStatusResponse, + ReturnType + >({ queryFn: async ({ queryKey, signal }) => { + const [queryParams] = queryKey as ReturnType< + typeof findPetsByStatusQueryKey + >; const { data } = await Sdk.__registry.get().findPetsByStatus({ ...options, - ...queryKey[0], + ...queryParams, signal, throwOnError: true, }); @@ -165,11 +180,19 @@ export const findPetsByTagsQueryKey = (options: Options) => * Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. */ export const findPetsByTagsOptions = (options: Options) => - queryOptions({ + queryOptions< + FindPetsByTagsResponse, + DefaultError, + FindPetsByTagsResponse, + ReturnType + >({ queryFn: async ({ queryKey, signal }) => { + const [queryParams] = queryKey as ReturnType< + typeof findPetsByTagsQueryKey + >; const { data } = await Sdk.__registry.get().findPetsByTags({ ...options, - ...queryKey[0], + ...queryParams, signal, throwOnError: true, }); @@ -212,11 +235,17 @@ export const getPetByIdQueryKey = (options: Options) => * Returns a single pet. */ export const getPetByIdOptions = (options: Options) => - queryOptions({ + queryOptions< + GetPetByIdResponse, + DefaultError, + GetPetByIdResponse, + ReturnType + >({ queryFn: async ({ queryKey, signal }) => { + const [queryParams] = queryKey as ReturnType; const { data } = await Sdk.__registry.get().getPetById({ ...options, - ...queryKey[0], + ...queryParams, signal, throwOnError: true, }); @@ -292,11 +321,17 @@ export const getInventoryQueryKey = (options?: Options) => * Returns a map of status codes to quantities. */ export const getInventoryOptions = (options?: Options) => - queryOptions({ + queryOptions< + GetInventoryResponse, + DefaultError, + GetInventoryResponse, + ReturnType + >({ queryFn: async ({ queryKey, signal }) => { + const [queryParams] = queryKey as ReturnType; const { data } = await Sdk.__registry.get().getInventory({ ...options, - ...queryKey[0], + ...queryParams, signal, throwOnError: true, }); @@ -368,11 +403,17 @@ export const getOrderByIdQueryKey = (options: Options) => * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions. */ export const getOrderByIdOptions = (options: Options) => - queryOptions({ + queryOptions< + GetOrderByIdResponse, + DefaultError, + GetOrderByIdResponse, + ReturnType + >({ queryFn: async ({ queryKey, signal }) => { + const [queryParams] = queryKey as ReturnType; const { data } = await Sdk.__registry.get().getOrderById({ ...options, - ...queryKey[0], + ...queryParams, signal, throwOnError: true, }); @@ -448,11 +489,17 @@ export const loginUserQueryKey = (options?: Options) => * Log into the system. */ export const loginUserOptions = (options?: Options) => - queryOptions({ + queryOptions< + LoginUserResponse, + DefaultError, + LoginUserResponse, + ReturnType + >({ queryFn: async ({ queryKey, signal }) => { + const [queryParams] = queryKey as ReturnType; const { data } = await Sdk.__registry.get().loginUser({ ...options, - ...queryKey[0], + ...queryParams, signal, throwOnError: true, }); @@ -470,11 +517,17 @@ export const logoutUserQueryKey = (options?: Options) => * Log user out of the system. */ export const logoutUserOptions = (options?: Options) => - queryOptions({ + queryOptions< + unknown, + DefaultError, + unknown, + ReturnType + >({ queryFn: async ({ queryKey, signal }) => { + const [queryParams] = queryKey as ReturnType; const { data } = await Sdk.__registry.get().logoutUser({ ...options, - ...queryKey[0], + ...queryParams, signal, throwOnError: true, }); @@ -517,11 +570,19 @@ export const getUserByNameQueryKey = (options: Options) => * Get user detail based on username. */ export const getUserByNameOptions = (options: Options) => - queryOptions({ + queryOptions< + GetUserByNameResponse, + DefaultError, + GetUserByNameResponse, + ReturnType + >({ queryFn: async ({ queryKey, signal }) => { + const [queryParams] = queryKey as ReturnType< + typeof getUserByNameQueryKey + >; const { data } = await Sdk.__registry.get().getUserByName({ ...options, - ...queryKey[0], + ...queryParams, signal, throwOnError: true, }); diff --git a/examples/openapi-ts-tanstack-svelte-query/src/client/@tanstack/svelte-query.gen.ts b/examples/openapi-ts-tanstack-svelte-query/src/client/@tanstack/svelte-query.gen.ts index e9fe1844e..708af9be7 100644 --- a/examples/openapi-ts-tanstack-svelte-query/src/client/@tanstack/svelte-query.gen.ts +++ b/examples/openapi-ts-tanstack-svelte-query/src/client/@tanstack/svelte-query.gen.ts @@ -40,12 +40,19 @@ import type { DeletePetData, DeleteUserData, FindPetsByStatusData, + FindPetsByStatusResponse, FindPetsByTagsData, + FindPetsByTagsResponse, GetInventoryData, + GetInventoryResponse, GetOrderByIdData, + GetOrderByIdResponse, GetPetByIdData, + GetPetByIdResponse, GetUserByNameData, + GetUserByNameResponse, LoginUserData, + LoginUserResponse, LogoutUserData, PlaceOrderData, PlaceOrderResponse, @@ -160,11 +167,19 @@ export const findPetsByStatusQueryKey = ( export const findPetsByStatusOptions = ( options: Options, ) => - queryOptions({ + queryOptions< + FindPetsByStatusResponse, + DefaultError, + FindPetsByStatusResponse, + ReturnType + >({ queryFn: async ({ queryKey, signal }) => { + const [queryParams] = queryKey as ReturnType< + typeof findPetsByStatusQueryKey + >; const { data } = await findPetsByStatus({ ...options, - ...queryKey[0], + ...queryParams, signal, throwOnError: true, }); @@ -182,11 +197,19 @@ export const findPetsByTagsQueryKey = (options: Options) => * Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. */ export const findPetsByTagsOptions = (options: Options) => - queryOptions({ + queryOptions< + FindPetsByTagsResponse, + DefaultError, + FindPetsByTagsResponse, + ReturnType + >({ queryFn: async ({ queryKey, signal }) => { + const [queryParams] = queryKey as ReturnType< + typeof findPetsByTagsQueryKey + >; const { data } = await findPetsByTags({ ...options, - ...queryKey[0], + ...queryParams, signal, throwOnError: true, }); @@ -229,11 +252,17 @@ export const getPetByIdQueryKey = (options: Options) => * Returns a single pet. */ export const getPetByIdOptions = (options: Options) => - queryOptions({ + queryOptions< + GetPetByIdResponse, + DefaultError, + GetPetByIdResponse, + ReturnType + >({ queryFn: async ({ queryKey, signal }) => { + const [queryParams] = queryKey as ReturnType; const { data } = await getPetById({ ...options, - ...queryKey[0], + ...queryParams, signal, throwOnError: true, }); @@ -309,11 +338,17 @@ export const getInventoryQueryKey = (options?: Options) => * Returns a map of status codes to quantities. */ export const getInventoryOptions = (options?: Options) => - queryOptions({ + queryOptions< + GetInventoryResponse, + DefaultError, + GetInventoryResponse, + ReturnType + >({ queryFn: async ({ queryKey, signal }) => { + const [queryParams] = queryKey as ReturnType; const { data } = await getInventory({ ...options, - ...queryKey[0], + ...queryParams, signal, throwOnError: true, }); @@ -385,11 +420,17 @@ export const getOrderByIdQueryKey = (options: Options) => * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions. */ export const getOrderByIdOptions = (options: Options) => - queryOptions({ + queryOptions< + GetOrderByIdResponse, + DefaultError, + GetOrderByIdResponse, + ReturnType + >({ queryFn: async ({ queryKey, signal }) => { + const [queryParams] = queryKey as ReturnType; const { data } = await getOrderById({ ...options, - ...queryKey[0], + ...queryParams, signal, throwOnError: true, }); @@ -465,11 +506,17 @@ export const loginUserQueryKey = (options?: Options) => * Log into the system. */ export const loginUserOptions = (options?: Options) => - queryOptions({ + queryOptions< + LoginUserResponse, + DefaultError, + LoginUserResponse, + ReturnType + >({ queryFn: async ({ queryKey, signal }) => { + const [queryParams] = queryKey as ReturnType; const { data } = await loginUser({ ...options, - ...queryKey[0], + ...queryParams, signal, throwOnError: true, }); @@ -487,11 +534,17 @@ export const logoutUserQueryKey = (options?: Options) => * Log user out of the system. */ export const logoutUserOptions = (options?: Options) => - queryOptions({ + queryOptions< + unknown, + DefaultError, + unknown, + ReturnType + >({ queryFn: async ({ queryKey, signal }) => { + const [queryParams] = queryKey as ReturnType; const { data } = await logoutUser({ ...options, - ...queryKey[0], + ...queryParams, signal, throwOnError: true, }); @@ -534,11 +587,19 @@ export const getUserByNameQueryKey = (options: Options) => * Get user detail based on username. */ export const getUserByNameOptions = (options: Options) => - queryOptions({ + queryOptions< + GetUserByNameResponse, + DefaultError, + GetUserByNameResponse, + ReturnType + >({ queryFn: async ({ queryKey, signal }) => { + const [queryParams] = queryKey as ReturnType< + typeof getUserByNameQueryKey + >; const { data } = await getUserByName({ ...options, - ...queryKey[0], + ...queryParams, signal, throwOnError: true, }); diff --git a/examples/openapi-ts-tanstack-vue-query/src/client/@tanstack/vue-query.gen.ts b/examples/openapi-ts-tanstack-vue-query/src/client/@tanstack/vue-query.gen.ts index 9050f1d24..a20cc1f05 100644 --- a/examples/openapi-ts-tanstack-vue-query/src/client/@tanstack/vue-query.gen.ts +++ b/examples/openapi-ts-tanstack-vue-query/src/client/@tanstack/vue-query.gen.ts @@ -36,12 +36,19 @@ import type { DeletePetData, DeleteUserData, FindPetsByStatusData, + FindPetsByStatusResponse, FindPetsByTagsData, + FindPetsByTagsResponse, GetInventoryData, + GetInventoryResponse, GetOrderByIdData, + GetOrderByIdResponse, GetPetByIdData, + GetPetByIdResponse, GetUserByNameData, + GetUserByNameResponse, LoginUserData, + LoginUserResponse, LogoutUserData, PlaceOrderData, PlaceOrderResponse, @@ -148,11 +155,17 @@ export const findPetsByStatusQueryKey = (options: Options) * Multiple status values can be provided with comma separated strings. */ export const findPetsByStatusOptions = (options: Options) => - queryOptions({ + queryOptions< + FindPetsByStatusResponse, + DefaultError, + FindPetsByStatusResponse, + ReturnType + >({ queryFn: async ({ queryKey, signal }) => { + const [queryParams] = queryKey as ReturnType const { data } = await findPetsByStatus({ ...options, - ...queryKey[0], + ...queryParams, signal, throwOnError: true }) @@ -170,11 +183,17 @@ export const findPetsByTagsQueryKey = (options: Options) => * Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. */ export const findPetsByTagsOptions = (options: Options) => - queryOptions({ + queryOptions< + FindPetsByTagsResponse, + DefaultError, + FindPetsByTagsResponse, + ReturnType + >({ queryFn: async ({ queryKey, signal }) => { + const [queryParams] = queryKey as ReturnType const { data } = await findPetsByTags({ ...options, - ...queryKey[0], + ...queryParams, signal, throwOnError: true }) @@ -213,11 +232,17 @@ export const getPetByIdQueryKey = (options: Options) => * Returns a single pet. */ export const getPetByIdOptions = (options: Options) => - queryOptions({ + queryOptions< + GetPetByIdResponse, + DefaultError, + GetPetByIdResponse, + ReturnType + >({ queryFn: async ({ queryKey, signal }) => { + const [queryParams] = queryKey as ReturnType const { data } = await getPetById({ ...options, - ...queryKey[0], + ...queryParams, signal, throwOnError: true }) @@ -285,11 +310,17 @@ export const getInventoryQueryKey = (options?: Options) => * Returns a map of status codes to quantities. */ export const getInventoryOptions = (options?: Options) => - queryOptions({ + queryOptions< + GetInventoryResponse, + DefaultError, + GetInventoryResponse, + ReturnType + >({ queryFn: async ({ queryKey, signal }) => { + const [queryParams] = queryKey as ReturnType const { data } = await getInventory({ ...options, - ...queryKey[0], + ...queryParams, signal, throwOnError: true }) @@ -353,11 +384,17 @@ export const getOrderByIdQueryKey = (options: Options) => * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions. */ export const getOrderByIdOptions = (options: Options) => - queryOptions({ + queryOptions< + GetOrderByIdResponse, + DefaultError, + GetOrderByIdResponse, + ReturnType + >({ queryFn: async ({ queryKey, signal }) => { + const [queryParams] = queryKey as ReturnType const { data } = await getOrderById({ ...options, - ...queryKey[0], + ...queryParams, signal, throwOnError: true }) @@ -429,11 +466,17 @@ export const loginUserQueryKey = (options?: Options) => * Log into the system. */ export const loginUserOptions = (options?: Options) => - queryOptions({ + queryOptions< + LoginUserResponse, + DefaultError, + LoginUserResponse, + ReturnType + >({ queryFn: async ({ queryKey, signal }) => { + const [queryParams] = queryKey as ReturnType const { data } = await loginUser({ ...options, - ...queryKey[0], + ...queryParams, signal, throwOnError: true }) @@ -451,11 +494,12 @@ export const logoutUserQueryKey = (options?: Options) => * Log user out of the system. */ export const logoutUserOptions = (options?: Options) => - queryOptions({ + queryOptions>({ queryFn: async ({ queryKey, signal }) => { + const [queryParams] = queryKey as ReturnType const { data } = await logoutUser({ ...options, - ...queryKey[0], + ...queryParams, signal, throwOnError: true }) @@ -494,11 +538,17 @@ export const getUserByNameQueryKey = (options: Options) => * Get user detail based on username. */ export const getUserByNameOptions = (options: Options) => - queryOptions({ + queryOptions< + GetUserByNameResponse, + DefaultError, + GetUserByNameResponse, + ReturnType + >({ queryFn: async ({ queryKey, signal }) => { + const [queryParams] = queryKey as ReturnType const { data } = await getUserByName({ ...options, - ...queryKey[0], + ...queryParams, signal, throwOnError: true }) diff --git a/packages/openapi-ts/src/plugins/@tanstack/query-core/v5/queryOptions.ts b/packages/openapi-ts/src/plugins/@tanstack/query-core/v5/queryOptions.ts index 74d7acaad..575679715 100644 --- a/packages/openapi-ts/src/plugins/@tanstack/query-core/v5/queryOptions.ts +++ b/packages/openapi-ts/src/plugins/@tanstack/query-core/v5/queryOptions.ts @@ -14,7 +14,7 @@ import { queryKeyStatement, } from '../queryKey'; import { handleMeta } from '../shared/meta'; -import { useTypeData } from '../shared/useType'; +import { useTypeData, useTypeError, useTypeResponse } from '../shared/useType'; import type { PluginInstance } from '../types'; const optionsParamName = 'options'; @@ -69,18 +69,32 @@ export const createQueryOptions = ({ plugin.setSymbolValue(symbolQueryKey, node); const typeData = useTypeData({ operation, plugin }); + const typeError = useTypeError({ operation, plugin }); + const typeResponse = useTypeResponse({ operation, plugin }); + const queryKeyReturnType = `ReturnType`; + const statements: Array> = [ + $.const() + .array(['queryParams']) + .assign($(`queryKey as ${queryKeyReturnType}`)), + ]; const awaitSdkFn = $(queryFn) .call( $.object() .spread(optionsParamName) - .spread($('queryKey').attr(0)) + .spread('queryParams') .prop('signal', $('signal')) .prop('throwOnError', $.literal(true)), ) .await(); - const statements: Array> = []; + const queryOptionsGenerics = [ + typeResponse, + typeError || 'unknown', + typeResponse, + queryKeyReturnType, + ].join(', '); + if (plugin.getPluginOrThrow('@hey-api/sdk').config.responseStyle === 'data') { statements.push($.return(awaitSdkFn)); } else { @@ -118,8 +132,6 @@ export const createQueryOptions = ({ name: operation.id, }), }); - // TODO: add type error - // TODO: AxiosError const statement = $.const(symbolQueryOptionsFn.placeholder) .export(symbolQueryOptionsFn.exported) .$if( @@ -131,7 +143,11 @@ export const createQueryOptions = ({ .param(optionsParamName, (p) => p.optional(!isRequiredOptions).type(typeData), ) - .do($(symbolQueryOptions.placeholder).call(queryOptionsObj).return()), + .do( + $(`${symbolQueryOptions.placeholder}<${queryOptionsGenerics}>`) + .call(queryOptionsObj) + .return(), + ), ); plugin.setSymbolValue(symbolQueryOptionsFn, statement); };