Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .changeset/tanstack-skiptoken-support.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"@hey-api/openapi-ts": minor
---

**plugin(@tanstack/query)**: feat: add `skipToken` support to `queryOptions` and `infiniteQueryOptions`

Generated `*Options` factories now accept `Options<T> | typeof skipToken`. When `skipToken` is passed, `queryFn` short-circuits to `skipToken` (disabling the query per TanStack Query's conventions) and `queryKey` is built from the unwrapped value via a shared `unwrapSkipToken` helper. Existing call sites passing `Options<T>` continue to work unchanged.
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import {
type DefaultError,
type MutationOptions,
queryOptions,
skipToken,
} from '@tanstack/angular-query-experimental';

import { client } from '../client.gen';
Expand Down Expand Up @@ -150,6 +151,9 @@ const createQueryKey = <TOptions extends Options>(
return [params];
};

const unwrapSkipToken = <T>(options: T | typeof skipToken): T | undefined =>
options !== skipToken ? options : undefined;

export const findPetsByStatusQueryKey = (options: Options<FindPetsByStatusData>) =>
createQueryKey('findPetsByStatus', options);

Expand All @@ -158,24 +162,31 @@ export const findPetsByStatusQueryKey = (options: Options<FindPetsByStatusData>)
*
* Multiple status values can be provided with comma separated strings.
*/
export const findPetsByStatusOptions = (options: Options<FindPetsByStatusData>) =>
queryOptions<
export const findPetsByStatusOptions = (
options: Options<FindPetsByStatusData> | typeof skipToken,
) => {
const unwrapped = unwrapSkipToken(options);
return queryOptions<
FindPetsByStatusResponse,
DefaultError,
FindPetsByStatusResponse,
ReturnType<typeof findPetsByStatusQueryKey>
>({
queryFn: async ({ queryKey, signal }) => {
const { data } = await findPetsByStatus({
...options,
...queryKey[0],
signal,
throwOnError: true,
});
return data;
},
queryKey: findPetsByStatusQueryKey(options),
queryFn:
options === skipToken
? skipToken
: async ({ queryKey, signal }) => {
const { data } = await findPetsByStatus({
...unwrapped,
...queryKey[0],
signal,
throwOnError: true,
});
return data;
},
queryKey: findPetsByStatusQueryKey(unwrapped as Options<FindPetsByStatusData>),
});
};

export const findPetsByTagsQueryKey = (options: Options<FindPetsByTagsData>) =>
createQueryKey('findPetsByTags', options);
Expand All @@ -185,24 +196,29 @@ export const findPetsByTagsQueryKey = (options: Options<FindPetsByTagsData>) =>
*
* Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.
*/
export const findPetsByTagsOptions = (options: Options<FindPetsByTagsData>) =>
queryOptions<
export const findPetsByTagsOptions = (options: Options<FindPetsByTagsData> | typeof skipToken) => {
const unwrapped = unwrapSkipToken(options);
return queryOptions<
FindPetsByTagsResponse,
DefaultError,
FindPetsByTagsResponse,
ReturnType<typeof findPetsByTagsQueryKey>
>({
queryFn: async ({ queryKey, signal }) => {
const { data } = await findPetsByTags({
...options,
...queryKey[0],
signal,
throwOnError: true,
});
return data;
},
queryKey: findPetsByTagsQueryKey(options),
queryFn:
options === skipToken
? skipToken
: async ({ queryKey, signal }) => {
const { data } = await findPetsByTags({
...unwrapped,
...queryKey[0],
signal,
throwOnError: true,
});
return data;
},
queryKey: findPetsByTagsQueryKey(unwrapped as Options<FindPetsByTagsData>),
});
};

/**
* Deletes a pet.
Expand Down Expand Up @@ -233,24 +249,29 @@ export const getPetByIdQueryKey = (options: Options<GetPetByIdData>) =>
*
* Returns a single pet.
*/
export const getPetByIdOptions = (options: Options<GetPetByIdData>) =>
queryOptions<
export const getPetByIdOptions = (options: Options<GetPetByIdData> | typeof skipToken) => {
const unwrapped = unwrapSkipToken(options);
return queryOptions<
GetPetByIdResponse,
DefaultError,
GetPetByIdResponse,
ReturnType<typeof getPetByIdQueryKey>
>({
queryFn: async ({ queryKey, signal }) => {
const { data } = await getPetById({
...options,
...queryKey[0],
signal,
throwOnError: true,
});
return data;
},
queryKey: getPetByIdQueryKey(options),
queryFn:
options === skipToken
? skipToken
: async ({ queryKey, signal }) => {
const { data } = await getPetById({
...unwrapped,
...queryKey[0],
signal,
throwOnError: true,
});
return data;
},
queryKey: getPetByIdQueryKey(unwrapped as Options<GetPetByIdData>),
});
};

/**
* Updates a pet in the store with form data.
Expand Down Expand Up @@ -310,24 +331,29 @@ export const getInventoryQueryKey = (options?: Options<GetInventoryData>) =>
*
* Returns a map of status codes to quantities.
*/
export const getInventoryOptions = (options?: Options<GetInventoryData>) =>
queryOptions<
export const getInventoryOptions = (options?: Options<GetInventoryData> | typeof skipToken) => {
const unwrapped = unwrapSkipToken(options);
return queryOptions<
GetInventoryResponse,
DefaultError,
GetInventoryResponse,
ReturnType<typeof getInventoryQueryKey>
>({
queryFn: async ({ queryKey, signal }) => {
const { data } = await getInventory({
...options,
...queryKey[0],
signal,
throwOnError: true,
});
return data;
},
queryKey: getInventoryQueryKey(options),
queryFn:
options === skipToken
? skipToken
: async ({ queryKey, signal }) => {
const { data } = await getInventory({
...unwrapped,
...queryKey[0],
signal,
throwOnError: true,
});
return data;
},
queryKey: getInventoryQueryKey(unwrapped),
});
};

/**
* Place an order for a pet.
Expand Down Expand Up @@ -383,24 +409,29 @@ export const getOrderByIdQueryKey = (options: Options<GetOrderByIdData>) =>
*
* For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions.
*/
export const getOrderByIdOptions = (options: Options<GetOrderByIdData>) =>
queryOptions<
export const getOrderByIdOptions = (options: Options<GetOrderByIdData> | typeof skipToken) => {
const unwrapped = unwrapSkipToken(options);
return queryOptions<
GetOrderByIdResponse,
DefaultError,
GetOrderByIdResponse,
ReturnType<typeof getOrderByIdQueryKey>
>({
queryFn: async ({ queryKey, signal }) => {
const { data } = await getOrderById({
...options,
...queryKey[0],
signal,
throwOnError: true,
});
return data;
},
queryKey: getOrderByIdQueryKey(options),
queryFn:
options === skipToken
? skipToken
: async ({ queryKey, signal }) => {
const { data } = await getOrderById({
...unwrapped,
...queryKey[0],
signal,
throwOnError: true,
});
return data;
},
queryKey: getOrderByIdQueryKey(unwrapped as Options<GetOrderByIdData>),
});
};

/**
* Create user.
Expand Down Expand Up @@ -464,24 +495,29 @@ export const loginUserQueryKey = (options?: Options<LoginUserData>) =>
*
* Log into the system.
*/
export const loginUserOptions = (options?: Options<LoginUserData>) =>
queryOptions<
export const loginUserOptions = (options?: Options<LoginUserData> | typeof skipToken) => {
const unwrapped = unwrapSkipToken(options);
return queryOptions<
LoginUserResponse,
DefaultError,
LoginUserResponse,
ReturnType<typeof loginUserQueryKey>
>({
queryFn: async ({ queryKey, signal }) => {
const { data } = await loginUser({
...options,
...queryKey[0],
signal,
throwOnError: true,
});
return data;
},
queryKey: loginUserQueryKey(options),
queryFn:
options === skipToken
? skipToken
: async ({ queryKey, signal }) => {
const { data } = await loginUser({
...unwrapped,
...queryKey[0],
signal,
throwOnError: true,
});
return data;
},
queryKey: loginUserQueryKey(unwrapped),
});
};

export const logoutUserQueryKey = (options?: Options<LogoutUserData>) =>
createQueryKey('logoutUser', options);
Expand All @@ -491,19 +527,24 @@ export const logoutUserQueryKey = (options?: Options<LogoutUserData>) =>
*
* Log user out of the system.
*/
export const logoutUserOptions = (options?: Options<LogoutUserData>) =>
queryOptions<unknown, DefaultError, unknown, ReturnType<typeof logoutUserQueryKey>>({
queryFn: async ({ queryKey, signal }) => {
const { data } = await logoutUser({
...options,
...queryKey[0],
signal,
throwOnError: true,
});
return data;
},
queryKey: logoutUserQueryKey(options),
export const logoutUserOptions = (options?: Options<LogoutUserData> | typeof skipToken) => {
const unwrapped = unwrapSkipToken(options);
return queryOptions<unknown, DefaultError, unknown, ReturnType<typeof logoutUserQueryKey>>({
queryFn:
options === skipToken
? skipToken
: async ({ queryKey, signal }) => {
const { data } = await logoutUser({
...unwrapped,
...queryKey[0],
signal,
throwOnError: true,
});
return data;
},
queryKey: logoutUserQueryKey(unwrapped),
});
};

/**
* Delete user resource.
Expand Down Expand Up @@ -534,24 +575,29 @@ export const getUserByNameQueryKey = (options: Options<GetUserByNameData>) =>
*
* Get user detail based on username.
*/
export const getUserByNameOptions = (options: Options<GetUserByNameData>) =>
queryOptions<
export const getUserByNameOptions = (options: Options<GetUserByNameData> | typeof skipToken) => {
const unwrapped = unwrapSkipToken(options);
return queryOptions<
GetUserByNameResponse,
DefaultError,
GetUserByNameResponse,
ReturnType<typeof getUserByNameQueryKey>
>({
queryFn: async ({ queryKey, signal }) => {
const { data } = await getUserByName({
...options,
...queryKey[0],
signal,
throwOnError: true,
});
return data;
},
queryKey: getUserByNameQueryKey(options),
queryFn:
options === skipToken
? skipToken
: async ({ queryKey, signal }) => {
const { data } = await getUserByName({
...unwrapped,
...queryKey[0],
signal,
throwOnError: true,
});
return data;
},
queryKey: getUserByNameQueryKey(unwrapped as Options<GetUserByNameData>),
});
};

/**
* Update user resource.
Expand Down
Loading
Loading