Skip to content

Commit 2ffe100

Browse files
committed
feat: add useQuery hooks and skipToken support for TanStack query plugins
- Generate useQuery hooks by default for all TanStack query plugins - Add skipToken support via inline narrowing instead of helper functions - Fix 4028 type errors in generated code by replacing resolveQueryFn/resolveOptions helpers with inline ternary narrowing and proper type assertions - Use `useQuery: false` to opt out of generating useQuery hooks
1 parent d61d2b1 commit 2ffe100

File tree

146 files changed

+26449
-8974
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

146 files changed

+26449
-8974
lines changed

.changeset/warm-rabbits-dance.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@hey-api/openapi-ts": minor
3+
---
4+
5+
**tanstack-query**: add `skipToken` support and `queryOptions` override to generated `useQuery` hooks (React, Preact). `useQuery` hooks are now generated by default and support `skipToken` for conditional queries. Use `useQuery: false` to opt out.
Lines changed: 41 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// This file is auto-generated by @hey-api/openapi-ts
22

3-
import { type DefaultError, queryOptions } from '@tanstack/angular-query-experimental';
3+
import { type DefaultError, queryOptions, skipToken } from '@tanstack/angular-query-experimental';
44

55
import { client } from '../client.gen';
66
import { getBar, getFoo, type Options } from '../sdk.gen';
@@ -41,40 +41,46 @@ const createQueryKey = <TOptions extends Options>(id: string, options?: TOptions
4141

4242
export const getFooQueryKey = (options?: Options<GetFooData>) => createQueryKey('getFoo', options);
4343

44-
export const getFooOptions = (options?: Options<GetFooData>) => queryOptions<unknown, DefaultError, unknown, ReturnType<typeof getFooQueryKey>>({
45-
queryFn: async ({ queryKey, signal }) => {
46-
const { data } = await getFoo({
47-
...options,
48-
...queryKey[0],
49-
signal,
50-
throwOnError: true
51-
});
52-
return data;
53-
},
54-
queryKey: getFooQueryKey(options),
55-
meta: {
56-
id: 'getFoo',
57-
method: 'get',
58-
path: '/foo'
59-
}
60-
});
44+
export const getFooOptions = (options?: Options<GetFooData> | typeof skipToken) => {
45+
const opts = options !== skipToken ? options : undefined;
46+
return queryOptions<unknown, DefaultError, unknown, ReturnType<typeof getFooQueryKey>>({
47+
queryFn: options === skipToken ? skipToken : async ({ queryKey, signal }) => {
48+
const { data } = await getFoo({
49+
...opts,
50+
...queryKey[0],
51+
signal,
52+
throwOnError: true
53+
});
54+
return data;
55+
},
56+
queryKey: getFooQueryKey(opts),
57+
meta: {
58+
id: 'getFoo',
59+
method: 'get',
60+
path: '/foo'
61+
}
62+
});
63+
};
6164

6265
export const getBarQueryKey = (options?: Options<GetBarData>) => createQueryKey('getBar', options);
6366

64-
export const getBarOptions = (options?: Options<GetBarData>) => queryOptions<unknown, DefaultError, unknown, ReturnType<typeof getBarQueryKey>>({
65-
queryFn: async ({ queryKey, signal }) => {
66-
const { data } = await getBar({
67-
...options,
68-
...queryKey[0],
69-
signal,
70-
throwOnError: true
71-
});
72-
return data;
73-
},
74-
queryKey: getBarQueryKey(options),
75-
meta: {
76-
id: 'getBar',
77-
method: 'get',
78-
path: '/bar'
79-
}
80-
});
67+
export const getBarOptions = (options?: Options<GetBarData> | typeof skipToken) => {
68+
const opts = options !== skipToken ? options : undefined;
69+
return queryOptions<unknown, DefaultError, unknown, ReturnType<typeof getBarQueryKey>>({
70+
queryFn: options === skipToken ? skipToken : async ({ queryKey, signal }) => {
71+
const { data } = await getBar({
72+
...opts,
73+
...queryKey[0],
74+
signal,
75+
throwOnError: true
76+
});
77+
return data;
78+
},
79+
queryKey: getBarQueryKey(opts),
80+
meta: {
81+
id: 'getBar',
82+
method: 'get',
83+
path: '/bar'
84+
}
85+
});
86+
};
Lines changed: 56 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// This file is auto-generated by @hey-api/openapi-ts
22

3-
import { type DefaultError, queryOptions } from '@tanstack/preact-query';
3+
import { type DefaultError, queryOptions, skipToken, useQuery } from '@tanstack/preact-query';
44

55
import { client } from '../client.gen';
66
import { getBar, getFoo, type Options } from '../sdk.gen';
@@ -41,40 +41,62 @@ const createQueryKey = <TOptions extends Options>(id: string, options?: TOptions
4141

4242
export const getFooQueryKey = (options?: Options<GetFooData>) => createQueryKey('getFoo', options);
4343

44-
export const getFooOptions = (options?: Options<GetFooData>) => queryOptions<unknown, DefaultError, unknown, ReturnType<typeof getFooQueryKey>>({
45-
queryFn: async ({ queryKey, signal }) => {
46-
const { data } = await getFoo({
47-
...options,
48-
...queryKey[0],
49-
signal,
50-
throwOnError: true
51-
});
52-
return data;
53-
},
54-
queryKey: getFooQueryKey(options),
55-
meta: {
56-
id: 'getFoo',
57-
method: 'get',
58-
path: '/foo'
44+
export const getFooOptions = (options?: Options<GetFooData> | typeof skipToken) => {
45+
const opts = options !== skipToken ? options : undefined;
46+
return queryOptions<unknown, DefaultError, unknown, ReturnType<typeof getFooQueryKey>>({
47+
queryFn: options === skipToken ? skipToken : async ({ queryKey, signal }) => {
48+
const { data } = await getFoo({
49+
...opts,
50+
...queryKey[0],
51+
signal,
52+
throwOnError: true
53+
});
54+
return data;
55+
},
56+
queryKey: getFooQueryKey(opts),
57+
meta: {
58+
id: 'getFoo',
59+
method: 'get',
60+
path: '/foo'
61+
}
62+
});
63+
};
64+
65+
const queryWithOptions = (optionsFn: (...args: Array<any>) => any, options?: any) => {
66+
if (typeof options !== 'object' && options !== undefined) {
67+
return useQuery(optionsFn(options));
5968
}
60-
});
69+
const { queryOptions, ...sdkOptions } = options ?? {};
70+
return useQuery({ ...optionsFn(sdkOptions), ...queryOptions });
71+
};
72+
73+
export const useGetFooQuery = (options?: (Options<GetFooData> | typeof skipToken) & {
74+
queryOptions?: Partial<Omit<ReturnType<typeof getFooOptions>, 'queryKey' | 'queryFn'>>;
75+
}) => queryWithOptions(getFooOptions, options);
6176

6277
export const getBarQueryKey = (options?: Options<GetBarData>) => createQueryKey('getBar', options);
6378

64-
export const getBarOptions = (options?: Options<GetBarData>) => queryOptions<unknown, DefaultError, unknown, ReturnType<typeof getBarQueryKey>>({
65-
queryFn: async ({ queryKey, signal }) => {
66-
const { data } = await getBar({
67-
...options,
68-
...queryKey[0],
69-
signal,
70-
throwOnError: true
71-
});
72-
return data;
73-
},
74-
queryKey: getBarQueryKey(options),
75-
meta: {
76-
id: 'getBar',
77-
method: 'get',
78-
path: '/bar'
79-
}
80-
});
79+
export const getBarOptions = (options?: Options<GetBarData> | typeof skipToken) => {
80+
const opts = options !== skipToken ? options : undefined;
81+
return queryOptions<unknown, DefaultError, unknown, ReturnType<typeof getBarQueryKey>>({
82+
queryFn: options === skipToken ? skipToken : async ({ queryKey, signal }) => {
83+
const { data } = await getBar({
84+
...opts,
85+
...queryKey[0],
86+
signal,
87+
throwOnError: true
88+
});
89+
return data;
90+
},
91+
queryKey: getBarQueryKey(opts),
92+
meta: {
93+
id: 'getBar',
94+
method: 'get',
95+
path: '/bar'
96+
}
97+
});
98+
};
99+
100+
export const useGetBarQuery = (options?: (Options<GetBarData> | typeof skipToken) & {
101+
queryOptions?: Partial<Omit<ReturnType<typeof getBarOptions>, 'queryKey' | 'queryFn'>>;
102+
}) => queryWithOptions(getBarOptions, options);
Lines changed: 56 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// This file is auto-generated by @hey-api/openapi-ts
22

3-
import { type DefaultError, queryOptions } from '@tanstack/react-query';
3+
import { type DefaultError, queryOptions, skipToken, useQuery } from '@tanstack/react-query';
44

55
import { client } from '../client.gen';
66
import { getBar, getFoo, type Options } from '../sdk.gen';
@@ -41,40 +41,62 @@ const createQueryKey = <TOptions extends Options>(id: string, options?: TOptions
4141

4242
export const getFooQueryKey = (options?: Options<GetFooData>) => createQueryKey('getFoo', options);
4343

44-
export const getFooOptions = (options?: Options<GetFooData>) => queryOptions<unknown, DefaultError, unknown, ReturnType<typeof getFooQueryKey>>({
45-
queryFn: async ({ queryKey, signal }) => {
46-
const { data } = await getFoo({
47-
...options,
48-
...queryKey[0],
49-
signal,
50-
throwOnError: true
51-
});
52-
return data;
53-
},
54-
queryKey: getFooQueryKey(options),
55-
meta: {
56-
id: 'getFoo',
57-
method: 'get',
58-
path: '/foo'
44+
export const getFooOptions = (options?: Options<GetFooData> | typeof skipToken) => {
45+
const opts = options !== skipToken ? options : undefined;
46+
return queryOptions<unknown, DefaultError, unknown, ReturnType<typeof getFooQueryKey>>({
47+
queryFn: options === skipToken ? skipToken : async ({ queryKey, signal }) => {
48+
const { data } = await getFoo({
49+
...opts,
50+
...queryKey[0],
51+
signal,
52+
throwOnError: true
53+
});
54+
return data;
55+
},
56+
queryKey: getFooQueryKey(opts),
57+
meta: {
58+
id: 'getFoo',
59+
method: 'get',
60+
path: '/foo'
61+
}
62+
});
63+
};
64+
65+
const queryWithOptions = (optionsFn: (...args: Array<any>) => any, options?: any) => {
66+
if (typeof options !== 'object' && options !== undefined) {
67+
return useQuery(optionsFn(options));
5968
}
60-
});
69+
const { queryOptions, ...sdkOptions } = options ?? {};
70+
return useQuery({ ...optionsFn(sdkOptions), ...queryOptions });
71+
};
72+
73+
export const useGetFooQuery = (options?: (Options<GetFooData> | typeof skipToken) & {
74+
queryOptions?: Partial<Omit<ReturnType<typeof getFooOptions>, 'queryKey' | 'queryFn'>>;
75+
}) => queryWithOptions(getFooOptions, options);
6176

6277
export const getBarQueryKey = (options?: Options<GetBarData>) => createQueryKey('getBar', options);
6378

64-
export const getBarOptions = (options?: Options<GetBarData>) => queryOptions<unknown, DefaultError, unknown, ReturnType<typeof getBarQueryKey>>({
65-
queryFn: async ({ queryKey, signal }) => {
66-
const { data } = await getBar({
67-
...options,
68-
...queryKey[0],
69-
signal,
70-
throwOnError: true
71-
});
72-
return data;
73-
},
74-
queryKey: getBarQueryKey(options),
75-
meta: {
76-
id: 'getBar',
77-
method: 'get',
78-
path: '/bar'
79-
}
80-
});
79+
export const getBarOptions = (options?: Options<GetBarData> | typeof skipToken) => {
80+
const opts = options !== skipToken ? options : undefined;
81+
return queryOptions<unknown, DefaultError, unknown, ReturnType<typeof getBarQueryKey>>({
82+
queryFn: options === skipToken ? skipToken : async ({ queryKey, signal }) => {
83+
const { data } = await getBar({
84+
...opts,
85+
...queryKey[0],
86+
signal,
87+
throwOnError: true
88+
});
89+
return data;
90+
},
91+
queryKey: getBarQueryKey(opts),
92+
meta: {
93+
id: 'getBar',
94+
method: 'get',
95+
path: '/bar'
96+
}
97+
});
98+
};
99+
100+
export const useGetBarQuery = (options?: (Options<GetBarData> | typeof skipToken) & {
101+
queryOptions?: Partial<Omit<ReturnType<typeof getBarOptions>, 'queryKey' | 'queryFn'>>;
102+
}) => queryWithOptions(getBarOptions, options);
Lines changed: 41 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// This file is auto-generated by @hey-api/openapi-ts
22

3-
import { type DefaultError, queryOptions } from '@tanstack/solid-query';
3+
import { type DefaultError, queryOptions, skipToken } from '@tanstack/solid-query';
44

55
import { client } from '../client.gen';
66
import { getBar, getFoo, type Options } from '../sdk.gen';
@@ -41,40 +41,46 @@ const createQueryKey = <TOptions extends Options>(id: string, options?: TOptions
4141

4242
export const getFooQueryKey = (options?: Options<GetFooData>) => createQueryKey('getFoo', options);
4343

44-
export const getFooOptions = (options?: Options<GetFooData>) => queryOptions<unknown, DefaultError, unknown, ReturnType<typeof getFooQueryKey>>({
45-
queryFn: async ({ queryKey, signal }) => {
46-
const { data } = await getFoo({
47-
...options,
48-
...queryKey[0],
49-
signal,
50-
throwOnError: true
51-
});
52-
return data;
53-
},
54-
queryKey: getFooQueryKey(options),
55-
meta: {
56-
id: 'getFoo',
57-
method: 'get',
58-
path: '/foo'
59-
}
60-
});
44+
export const getFooOptions = (options?: Options<GetFooData> | typeof skipToken) => {
45+
const opts = options !== skipToken ? options : undefined;
46+
return queryOptions<unknown, DefaultError, unknown, ReturnType<typeof getFooQueryKey>>({
47+
queryFn: options === skipToken ? skipToken : async ({ queryKey, signal }) => {
48+
const { data } = await getFoo({
49+
...opts,
50+
...queryKey[0],
51+
signal,
52+
throwOnError: true
53+
});
54+
return data;
55+
},
56+
queryKey: getFooQueryKey(opts),
57+
meta: {
58+
id: 'getFoo',
59+
method: 'get',
60+
path: '/foo'
61+
}
62+
});
63+
};
6164

6265
export const getBarQueryKey = (options?: Options<GetBarData>) => createQueryKey('getBar', options);
6366

64-
export const getBarOptions = (options?: Options<GetBarData>) => queryOptions<unknown, DefaultError, unknown, ReturnType<typeof getBarQueryKey>>({
65-
queryFn: async ({ queryKey, signal }) => {
66-
const { data } = await getBar({
67-
...options,
68-
...queryKey[0],
69-
signal,
70-
throwOnError: true
71-
});
72-
return data;
73-
},
74-
queryKey: getBarQueryKey(options),
75-
meta: {
76-
id: 'getBar',
77-
method: 'get',
78-
path: '/bar'
79-
}
80-
});
67+
export const getBarOptions = (options?: Options<GetBarData> | typeof skipToken) => {
68+
const opts = options !== skipToken ? options : undefined;
69+
return queryOptions<unknown, DefaultError, unknown, ReturnType<typeof getBarQueryKey>>({
70+
queryFn: options === skipToken ? skipToken : async ({ queryKey, signal }) => {
71+
const { data } = await getBar({
72+
...opts,
73+
...queryKey[0],
74+
signal,
75+
throwOnError: true
76+
});
77+
return data;
78+
},
79+
queryKey: getBarQueryKey(opts),
80+
meta: {
81+
id: 'getBar',
82+
method: 'get',
83+
path: '/bar'
84+
}
85+
});
86+
};

0 commit comments

Comments
 (0)