Skip to content
Open
Show file tree
Hide file tree
Changes from 21 commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
8fa3233
refactor(pinia-colada): migrate queries to `defineQueryOptions`
brolnickij Sep 9, 2025
33e6b31
chore: init changeset
brolnickij Sep 9, 2025
f72aa76
chore(pinia-colada): rename variable for clarity
brolnickij Sep 9, 2025
d7f27ce
chore(pinia-colada): tighten `QueryKey` typing with `_JSONValue`
brolnickij Sep 9, 2025
953e498
feat(ir): implement `hasOperationPathOrQueryAny` function
brolnickij Sep 9, 2025
84218ff
refactor(pinia-colada): use `path` / `query` detection in queryOptions
brolnickij Sep 9, 2025
6ad7066
test(pinia-colada): update snapshots
brolnickij Sep 9, 2025
8f48148
refactor(pinia-colada): remove unused `types` in the generator
brolnickij Sep 9, 2025
2ca4e62
chore(pinia-colada): update snapshots
brolnickij Sep 9, 2025
13e54d2
refactor(pinia-colada): always use functional `defineQueryOptions` fo…
brolnickij Sep 9, 2025
0a1c358
test(pinia-colada): update snapshots
brolnickij Sep 9, 2025
991a5f4
Revert "test(pinia-colada): update snapshots"
brolnickij Sep 9, 2025
72e5ce2
Revert "refactor(pinia-colada): always use functional `defineQueryOpt…
brolnickij Sep 9, 2025
d8e58a3
docs(pinia-colada): init updated examples
brolnickij Sep 9, 2025
081cd06
Merge remote-tracking branch 'origin/main' into refactor/2597
brolnickij Sep 10, 2025
bccdcd5
test(pinia-colada): update snapshots
brolnickij Sep 10, 2025
0584fa3
fix(pinia-colada): streamline `queryKey` creation
brolnickij Sep 10, 2025
42c83b9
chore: bump
brolnickij Sep 10, 2025
0884429
fix(pinia-colada): fix more bugs
brolnickij Sep 10, 2025
34a043e
test(pinia-colada): update snapshots
brolnickij Sep 10, 2025
27b0cf0
test(pinia-colada): remove group-by-tag snapshots
brolnickij Sep 10, 2025
5ab37e3
Merge branch 'main' into refactor/2597
brolnickij Sep 10, 2025
3ff9411
docs(pinia-colada): fix typo
brolnickij Sep 10, 2025
e80fb62
Merge branch 'main' into refactor/2597
brolnickij Sep 10, 2025
9979c07
chore(ir): remove unused `hasOperationPathOrQueryAny`
brolnickij Sep 11, 2025
34dfca2
refactor(pinia-colada): simplify options handling
brolnickij Sep 11, 2025
e28d16f
test(pinia-colada): update snapshots
brolnickij Sep 11, 2025
9f7ef36
chore(pinia-colada): update example dependencies
brolnickij Sep 11, 2025
448da2b
chore(pinia-colada): regenerate client
brolnickij Sep 11, 2025
99a14bb
chore(pinia-colada): refactoring example
brolnickij Sep 11, 2025
fc74f17
chore(pinia-colada): clean up query key generation (remove body / hea…
brolnickij Sep 11, 2025
13cdd90
fix(pinia-colada): restore query context propagation
brolnickij Sep 11, 2025
e5faf78
chore(pinia-colada): bump snapshots
brolnickij Sep 11, 2025
7eabf67
fix(pinia-colada): do not export query key when `queryKeys` disabled
brolnickij Sep 12, 2025
3351637
chore(pinia-colada): simplify example
brolnickij Sep 13, 2025
87d5004
Merge branch 'main' into refactor/2597
brolnickij Sep 17, 2025
a4acb37
Merge branch 'main' into refactor/2597
brolnickij Sep 22, 2025
5464511
Merge branch 'main' into refactor/2597
brolnickij Sep 23, 2025
c262357
Merge branch 'main' into refactor/2597
brolnickij Sep 23, 2025
602083f
Merge branch 'main' into refactor/2597
brolnickij Sep 24, 2025
45cd53d
chore(pinia-colada): remove unused `ensureQueryKeyInfra`
brolnickij Sep 24, 2025
2065c38
docs: init @brolnickij in collaboration sections
brolnickij Sep 25, 2025
f910945
feat(tsc): add support for `!==` operator in `createBinaryExpression`
brolnickij Sep 25, 2025
75ccd98
feat(core): add JSON serialization utilities for query keys
brolnickij Sep 25, 2025
4c040db
feat(pinia-colada): init`serializeQueryKeyValue`
brolnickij Sep 25, 2025
d1fb84b
test: update snapshots
brolnickij Sep 25, 2025
882c7a9
chore: update example codegen
brolnickij Sep 25, 2025
9a732ae
Merge branch 'main' into refactor/2597
brolnickij Sep 25, 2025
d47c2c7
test: align `v3_no_index` snapshots with "NodeNext"
brolnickij Sep 25, 2025
3570351
test: correct path in `tsconfig.nodenext.json` to extend base configu…
brolnickij Sep 25, 2025
34a7d25
test: pass `module: NodeNext` option
brolnickij Sep 25, 2025
c3cefc8
test: bump snapshot
brolnickij Sep 25, 2025
c0ca1c9
Merge branch 'main' into refactor/2597
brolnickij Sep 25, 2025
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
5 changes: 5 additions & 0 deletions .changeset/refactor-pinia-colada-query.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@hey-api/openapi-ts": patch
---

refactor(pinia-colada): migrate queries to `defineQueryOptions`
57 changes: 42 additions & 15 deletions docs/openapi-ts/plugins/pinia-colada.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ The Pinia Colada plugin for Hey API generates functions and query keys from your
- Pinia Colada v0 support
- seamless integration with `@hey-api/openapi-ts` ecosystem
- create query keys following the best practices
- type-safe query options and mutation options
- type-safe query options (using `defineQueryOptions`) and mutation options
- minimal learning curve thanks to extending the underlying technology

## Installation
Expand All @@ -56,19 +56,9 @@ The Pinia Colada plugin will generate the following artifacts, depending on the

Queries are generated from [query operations](/openapi-ts/configuration/parser#hooks-query-operations). The generated query functions follow the naming convention of SDK functions and by default append `Query`, e.g. `getPetByIdQuery()`.

::: code-group

```ts [example]
const query = useQuery({
...getPetByIdQuery({
path: {
petId: 1,
},
}),
});
```
Each generated function is a [`defineQueryOptions`](https://pinia-colada.esm.dev/api/@pinia/colada/functions/defineQueryOptions.html) factory.

```js [config]
```js
export default {
input: 'hey-api/backend', // sign up at app.heyapi.dev
output: 'src/client',
Expand All @@ -82,10 +72,47 @@ export default {
};
```

:::

You can customize the naming and casing pattern for `queryOptions` functions using the `.name` and `.case` options.

### Usage

No params — pass the function directly to `useQuery`:

```ts
useQuery(getPetsQuery);
```

With parameters (constant values), use the two‑argument form:

```ts
useQuery(getPetByIdQuery, () => ({
path: { petId: 1 },
}));
```

For reactive parameters, pass the generated function and compute options in the callback:

```ts
const petId = ref<number | null>(1);

useQuery(getPetByIdQuery, () => ({
path: { petId: petId.value },
}));
```

To pass `useQuery` [configuration](https://pinia-colada.esm.dev/api/@pinia/colada/interfaces/UseQueryOptions.html#Properties):

```ts
const petId = ref<number | null>(null);

useQuery(() => ({
...getPetByIdQuery({
path: { petId: petId.value as number },
}),
enabled: () => petId.value != null,
}));
```

## Query Keys

Query keys contain normalized SDK function parameters and additional metadata.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
// This file is auto-generated by @hey-api/openapi-ts

import { type Options, FooBazService, BarBazService } from '../sdk.gen';
import type { _JSONValue, UseQueryOptions, UseMutationOptions } from '@pinia/colada';
import type { GetFooData, GetFooResponse, FooPostData, FooPostResponse, FooPutData, FooPutResponse, GetFooBarData, GetFooBarResponse, FooBarPostData, FooBarPostResponse, FooBarPutData, FooBarPutResponse } from '../types.gen';
import { type _JSONValue, defineQueryOptions, type UseMutationOptions } from '@pinia/colada';
import type { GetFooData, FooPostData, FooPostResponse, FooPutData, FooPutResponse, GetFooBarData, FooBarPostData, FooBarPostResponse, FooBarPutData, FooBarPutResponse } from '../types.gen';
import { client } from '../client.gen';

export type QueryKey<TOptions extends Options> = [
Expand All @@ -20,19 +20,19 @@ const createQueryKey = <TOptions extends Options>(id: string, options?: TOptions
] => {
const params: QueryKey<TOptions>[0] = { _id: id, baseUrl: options?.baseUrl || (options?.client ?? client).getConfig().baseUrl } as QueryKey<TOptions>[0];
if (tags) {
params.tags = tags as unknown as undefined;
params.tags = tags as unknown as _JSONValue;
}
if (options?.body) {
params.body = options.body;
}
if (options?.headers) {
params.headers = options.headers as unknown as undefined;
params.headers = options.headers as unknown as _JSONValue;
}
if (options?.path) {
params.path = options.path;
}
if (options?.query) {
params.query = options.query as unknown as undefined;
params.query = options.query as unknown as _JSONValue;
}
return [
params
Expand All @@ -41,19 +41,13 @@ const createQueryKey = <TOptions extends Options>(id: string, options?: TOptions

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

export const getFooQuery = (options?: Options<GetFooData>): UseQueryOptions<GetFooResponse, Error> => {
return {
key: getFooQueryKey(options),
query: async (context) => {
const { data } = await FooBazService.getFoo({
...options,
...context,
throwOnError: true
});
return data;
}
};
};
export const getFooQuery = defineQueryOptions({
key: getFooQueryKey(),
query: async () => {
const { data } = await FooBazService.getFoo({ throwOnError: true });
return data;
}
});

export const fooPostMutation = (options?: Partial<Options<FooPostData>>): UseMutationOptions<FooPostResponse, Options<FooPostData>, Error> => {
return {
Expand Down Expand Up @@ -83,19 +77,13 @@ export const fooPutMutation = (options?: Partial<Options<FooPutData>>): UseMutat

export const getFooBarQueryKey = (options?: Options<GetFooBarData>) => createQueryKey('getFooBar', options);

export const getFooBarQuery = (options?: Options<GetFooBarData>): UseQueryOptions<GetFooBarResponse, Error> => {
return {
key: getFooBarQueryKey(options),
query: async (context) => {
const { data } = await BarBazService.getFooBar({
...options,
...context,
throwOnError: true
});
return data;
}
};
};
export const getFooBarQuery = defineQueryOptions({
key: getFooBarQueryKey(),
query: async () => {
const { data } = await BarBazService.getFooBar({ throwOnError: true });
return data;
}
});

export const fooBarPostMutation = (options?: Partial<Options<FooBarPostData>>): UseMutationOptions<FooBarPostResponse, Options<FooBarPostData>, Error> => {
return {
Expand Down
Loading
Loading