Skip to content

Commit 873839e

Browse files
committed
feat: add @tanstack/preact-query plugin
1 parent f4ab416 commit 873839e

221 files changed

Lines changed: 40944 additions & 481 deletions

File tree

Some content is hidden

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

.changeset/yellow-waves-pay.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": patch
3+
---
4+
5+
**plugin(@tanstack/preact-query)**: initial release

dev/package.json

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,12 @@
1414
"@hey-api/openapi-ts": "workspace:*",
1515
"@opencode-ai/sdk": "1.1.48",
1616
"@pinia/colada": "0.19.1",
17-
"@tanstack/angular-query-experimental": "5.73.3",
18-
"@tanstack/react-query": "5.73.3",
19-
"@tanstack/solid-query": "5.73.3",
20-
"@tanstack/svelte-query": "5.73.3",
21-
"@tanstack/vue-query": "5.73.3",
17+
"@tanstack/angular-query-experimental": "5.90.25",
18+
"@tanstack/preact-query": "5.93.0",
19+
"@tanstack/react-query": "5.90.21",
20+
"@tanstack/solid-query": "5.90.23",
21+
"@tanstack/svelte-query": "5.90.2",
22+
"@tanstack/vue-query": "5.92.9",
2223
"arktype": "2.1.29",
2324
"nuxt": "3.21.0",
2425
"swr": "2.4.0",

dev/python/plugins.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ export function sdk(
66
options?: Omit<Extract<PluginConfig, { name: '@hey-api/python-sdk' }>, 'name'>,
77
): Extract<PluginConfig, { name: '@hey-api/python-sdk' }> {
88
return {
9-
name: '@hey-api/python-sdk' as const,
9+
name: '@hey-api/python-sdk',
1010
...options,
1111
};
1212
}
@@ -15,7 +15,7 @@ export function pydantic(
1515
options?: Omit<Extract<PluginConfig, { name: 'pydantic' }>, 'name'>,
1616
): Extract<PluginConfig, { name: 'pydantic' }> {
1717
return {
18-
name: 'pydantic' as const,
18+
name: 'pydantic',
1919
...options,
2020
};
2121
}

dev/typescript/plugins.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ export function typescript(
66
options?: Omit<Extract<PluginConfig, { name: '@hey-api/typescript' }>, 'name'>,
77
): Extract<PluginConfig, { name: '@hey-api/typescript' }> {
88
return {
9-
name: '@hey-api/typescript' as const,
9+
name: '@hey-api/typescript',
1010
...options,
1111
};
1212
}
@@ -15,7 +15,7 @@ export function sdk(
1515
options?: Omit<Extract<PluginConfig, { name: '@hey-api/sdk' }>, 'name'>,
1616
): Extract<PluginConfig, { name: '@hey-api/sdk' }> {
1717
return {
18-
name: '@hey-api/sdk' as const,
18+
name: '@hey-api/sdk',
1919
...options,
2020
};
2121
}
@@ -24,7 +24,7 @@ export function zod(
2424
options?: Omit<Extract<PluginConfig, { name: 'zod' }>, 'name'>,
2525
): Extract<PluginConfig, { name: 'zod' }> {
2626
return {
27-
name: 'zod' as const,
27+
name: 'zod',
2828
...options,
2929
};
3030
}
@@ -33,7 +33,7 @@ export function valibot(
3333
options?: Omit<Extract<PluginConfig, { name: 'valibot' }>, 'name'>,
3434
): Extract<PluginConfig, { name: 'valibot' }> {
3535
return {
36-
name: 'valibot' as const,
36+
name: 'valibot',
3737
...options,
3838
};
3939
}
@@ -42,7 +42,7 @@ export function tanstackReactQuery(
4242
options?: Omit<Extract<PluginConfig, { name: '@tanstack/react-query' }>, 'name'>,
4343
): Extract<PluginConfig, { name: '@tanstack/react-query' }> {
4444
return {
45-
name: '@tanstack/react-query' as const,
45+
name: '@tanstack/react-query',
4646
...options,
4747
};
4848
}
@@ -51,7 +51,7 @@ export function transformers(
5151
options?: Omit<Extract<PluginConfig, { name: '@hey-api/transformers' }>, 'name'>,
5252
): Extract<PluginConfig, { name: '@hey-api/transformers' }> {
5353
return {
54-
name: '@hey-api/transformers' as const,
54+
name: '@hey-api/transformers',
5555
...options,
5656
};
5757
}

docs/openapi-ts/plugins/tanstack-query.md

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import { embedProject } from '../../embed'
1717

1818
### About
1919

20-
[TanStack Query](https://tanstack.com/query) is a powerful asynchronous state management solution for TypeScript/JavaScript, React, Solid, Vue, Svelte, and Angular.
20+
[TanStack Query](https://tanstack.com/query) is a powerful asynchronous state management solution for TypeScript/JavaScript, React, Solid, Vue, Svelte, Angular, and Preact.
2121

2222
The TanStack Query plugin for Hey API generates functions and query keys from your OpenAPI spec, fully compatible with SDKs, transformers, and all core features.
2323

@@ -96,6 +96,17 @@ export default {
9696
};
9797
```
9898

99+
```js [preact]
100+
export default {
101+
input: 'hey-api/backend', // sign up at app.heyapi.dev
102+
output: 'src/client',
103+
plugins: [
104+
// ...other plugins
105+
'@tanstack/preact-query', // [!code ++]
106+
],
107+
};
108+
```
109+
99110
:::
100111

101112
## Output
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
// This file is auto-generated by @hey-api/openapi-ts
2+
3+
import { type DefaultError, queryOptions } from '@tanstack/preact-query';
4+
5+
import { client } from '../client.gen';
6+
import { getBar, getFoo, type Options } from '../sdk.gen';
7+
import type { GetBarData, GetFooData } from '../types.gen';
8+
9+
export type QueryKey<TOptions extends Options> = [
10+
Pick<TOptions, 'baseUrl' | 'body' | 'headers' | 'path' | 'query'> & {
11+
_id: string;
12+
_infinite?: boolean;
13+
tags?: ReadonlyArray<string>;
14+
}
15+
];
16+
17+
const createQueryKey = <TOptions extends Options>(id: string, options?: TOptions, infinite?: boolean, tags?: ReadonlyArray<string>): [
18+
QueryKey<TOptions>[0]
19+
] => {
20+
const params: QueryKey<TOptions>[0] = { _id: id, baseUrl: options?.baseUrl || (options?.client ?? client).getConfig().baseUrl } as QueryKey<TOptions>[0];
21+
if (infinite) {
22+
params._infinite = infinite;
23+
}
24+
if (tags) {
25+
params.tags = tags;
26+
}
27+
if (options?.body) {
28+
params.body = options.body;
29+
}
30+
if (options?.headers) {
31+
params.headers = options.headers;
32+
}
33+
if (options?.path) {
34+
params.path = options.path;
35+
}
36+
if (options?.query) {
37+
params.query = options.query;
38+
}
39+
return [params];
40+
};
41+
42+
export const getFooQueryKey = (options?: Options<GetFooData>) => createQueryKey('getFoo', options);
43+
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+
});
61+
62+
export const getBarQueryKey = (options?: Options<GetBarData>) => createQueryKey('getBar', options);
63+
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+
});

packages/openapi-ts-tests/main/package.json

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,12 @@
2222
"@hey-api/custom-client": "workspace:*",
2323
"@hey-api/openapi-ts": "workspace:*",
2424
"@pinia/colada": "0.19.1",
25-
"@tanstack/angular-query-experimental": "5.73.3",
26-
"@tanstack/react-query": "5.73.3",
27-
"@tanstack/solid-query": "5.73.3",
28-
"@tanstack/svelte-query": "5.73.3",
29-
"@tanstack/vue-query": "5.73.3",
25+
"@tanstack/angular-query-experimental": "5.90.25",
26+
"@tanstack/preact-query": "5.93.0",
27+
"@tanstack/react-query": "5.90.21",
28+
"@tanstack/solid-query": "5.90.23",
29+
"@tanstack/svelte-query": "5.90.2",
30+
"@tanstack/vue-query": "5.92.9",
3031
"@types/cross-spawn": "6.0.6",
3132
"ajv": "8.17.1",
3233
"arktype": "2.1.29",
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
// This file is auto-generated by @hey-api/openapi-ts
2+
3+
import { type DefaultError, queryOptions, type UseMutationOptions } from '@tanstack/preact-query';
4+
5+
import { client } from '../client.gen';
6+
import { BarBazService, BarService, FooBazService, FooService, type Options } from '../sdk.gen';
7+
import type { FooBarPostData, FooBarPostResponse, FooBarPutData, FooBarPutResponse, FooPostData, FooPostResponse, FooPutData, FooPutResponse, GetFooBarData, GetFooBarResponse, GetFooData, GetFooResponse } from '../types.gen';
8+
9+
export type QueryKey<TOptions extends Options> = [
10+
Pick<TOptions, 'baseUrl' | 'body' | 'headers' | 'path' | 'query'> & {
11+
_id: string;
12+
_infinite?: boolean;
13+
tags?: ReadonlyArray<string>;
14+
}
15+
];
16+
17+
const createQueryKey = <TOptions extends Options>(id: string, options?: TOptions, infinite?: boolean, tags?: ReadonlyArray<string>): [
18+
QueryKey<TOptions>[0]
19+
] => {
20+
const params: QueryKey<TOptions>[0] = { _id: id, baseUrl: options?.baseUrl || (options?.client ?? client).getConfig().baseUrl } as QueryKey<TOptions>[0];
21+
if (infinite) {
22+
params._infinite = infinite;
23+
}
24+
if (tags) {
25+
params.tags = tags;
26+
}
27+
if (options?.body) {
28+
params.body = options.body;
29+
}
30+
if (options?.headers) {
31+
params.headers = options.headers;
32+
}
33+
if (options?.path) {
34+
params.path = options.path;
35+
}
36+
if (options?.query) {
37+
params.query = options.query;
38+
}
39+
return [params];
40+
};
41+
42+
export const getFooQueryKey = (options?: Options<GetFooData>) => createQueryKey('getFoo', options);
43+
44+
export const getFooOptions = (options?: Options<GetFooData>) => queryOptions<GetFooResponse, DefaultError, GetFooResponse, ReturnType<typeof getFooQueryKey>>({
45+
queryFn: async ({ queryKey, signal }) => {
46+
const { data } = await FooBazService.getFoo({
47+
...options,
48+
...queryKey[0],
49+
signal,
50+
throwOnError: true
51+
});
52+
return data;
53+
},
54+
queryKey: getFooQueryKey(options)
55+
});
56+
57+
export const fooPostMutation = (options?: Partial<Options<FooPostData>>): UseMutationOptions<FooPostResponse, DefaultError, Options<FooPostData>> => {
58+
const mutationOptions: UseMutationOptions<FooPostResponse, DefaultError, Options<FooPostData>> = {
59+
mutationFn: async (fnOptions) => {
60+
const { data } = await FooService.post({
61+
...options,
62+
...fnOptions,
63+
throwOnError: true
64+
});
65+
return data;
66+
}
67+
};
68+
return mutationOptions;
69+
};
70+
71+
export const fooPutMutation = (options?: Partial<Options<FooPutData>>): UseMutationOptions<FooPutResponse, DefaultError, Options<FooPutData>> => {
72+
const mutationOptions: UseMutationOptions<FooPutResponse, DefaultError, Options<FooPutData>> = {
73+
mutationFn: async (fnOptions) => {
74+
const { data } = await FooService.put({
75+
...options,
76+
...fnOptions,
77+
throwOnError: true
78+
});
79+
return data;
80+
}
81+
};
82+
return mutationOptions;
83+
};
84+
85+
export const getFooBarQueryKey = (options?: Options<GetFooBarData>) => createQueryKey('getFooBar', options);
86+
87+
export const getFooBarOptions = (options?: Options<GetFooBarData>) => queryOptions<GetFooBarResponse, DefaultError, GetFooBarResponse, ReturnType<typeof getFooBarQueryKey>>({
88+
queryFn: async ({ queryKey, signal }) => {
89+
const { data } = await BarBazService.getFooBar({
90+
...options,
91+
...queryKey[0],
92+
signal,
93+
throwOnError: true
94+
});
95+
return data;
96+
},
97+
queryKey: getFooBarQueryKey(options)
98+
});
99+
100+
export const fooBarPostMutation = (options?: Partial<Options<FooBarPostData>>): UseMutationOptions<FooBarPostResponse, DefaultError, Options<FooBarPostData>> => {
101+
const mutationOptions: UseMutationOptions<FooBarPostResponse, DefaultError, Options<FooBarPostData>> = {
102+
mutationFn: async (fnOptions) => {
103+
const { data } = await BarService.post({
104+
...options,
105+
...fnOptions,
106+
throwOnError: true
107+
});
108+
return data;
109+
}
110+
};
111+
return mutationOptions;
112+
};
113+
114+
export const fooBarPutMutation = (options?: Partial<Options<FooBarPutData>>): UseMutationOptions<FooBarPutResponse, DefaultError, Options<FooBarPutData>> => {
115+
const mutationOptions: UseMutationOptions<FooBarPutResponse, DefaultError, Options<FooBarPutData>> = {
116+
mutationFn: async (fnOptions) => {
117+
const { data } = await BarService.put({
118+
...options,
119+
...fnOptions,
120+
throwOnError: true
121+
});
122+
return data;
123+
}
124+
};
125+
return mutationOptions;
126+
};
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// This file is auto-generated by @hey-api/openapi-ts
2+
3+
import { type ClientOptions, type Config, createClient, createConfig } from './client';
4+
import type { ClientOptions as ClientOptions2 } from './types.gen';
5+
6+
/**
7+
* The `createClientConfig()` function will be called on client initialization
8+
* and the returned object will become the client's initial configuration.
9+
*
10+
* You may want to initialize your client this way instead of calling
11+
* `setConfig()`. This is useful for example if you're using Next.js
12+
* to ensure your client always has the correct values.
13+
*/
14+
export type CreateClientConfig<T extends ClientOptions = ClientOptions2> = (override?: Config<ClientOptions & T>) => Config<Required<ClientOptions> & T>;
15+
16+
export const client = createClient(createConfig<ClientOptions2>());

0 commit comments

Comments
 (0)