Skip to content

Commit 61e9006

Browse files
authored
Export QueryOptions and similar types (#552)
These types make it easier to create helper functions wrapping our options. No functional difference. Signed-off-by: Paul Sachs <psachs@buf.build> Signed-off-by: Paul Sachs <psachs@buf.build>
1 parent ffb8764 commit 61e9006

File tree

4 files changed

+138
-81
lines changed

4 files changed

+138
-81
lines changed

README.md

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ Connect-Query is an wrapper around [TanStack Query](https://tanstack.com/query)
2929
- [`createInfiniteQueryOptions`](#createinfinitequeryoptions)
3030
- [`addStaticKeyToTransport`](#addstatickeytotransport)
3131
- [`ConnectQueryKey`](#connectquerykey)
32+
- [`QueryOptions`](#queryoptions)
33+
- [`QueryOptionsWithSkipToken`](#queryoptionswithskiptoken)
34+
- [`InfiniteQueryOptions`](#infinitequeryoptions)
35+
- [`InfiniteQueryOptionsWithSkipToken`](#infinitequeryoptionswithskiptoken)
3236

3337
## Quickstart
3438

@@ -531,6 +535,71 @@ TanStack Query manages query caching for you based on query keys. [`QueryKey`s](
531535

532536
The factory [`createConnectQueryKey`](#createconnectquerykey) makes it easy to create a `ConnectQueryKey`, including partial keys for query filters.
533537

538+
### `QueryOptions`
539+
540+
Return type of `createQueryOptions` assuming SkipToken was not provided.
541+
542+
```ts
543+
interface QueryOptions<I extends DescMessage, O extends DescMessage> {
544+
queryKey: ConnectQueryKey<O>;
545+
queryFn: QueryFunction<MessageShape<O>, ConnectQueryKey<O>, MessageShape<I>>;
546+
structuralSharing: (oldData: unknown, newData: unknown) => unknown;
547+
}
548+
```
549+
550+
### `QueryOptionsWithSkipToken`
551+
552+
Return type of `createQueryOptions` when SkipToken is provided.
553+
554+
```ts
555+
interface QueryOptionsWithSkipToken<
556+
I extends DescMessage,
557+
O extends DescMessage,
558+
> extends Omit<QueryOptions<I, O>, "queryFn"> {
559+
queryFn: SkipToken;
560+
}
561+
```
562+
563+
### `InfiniteQueryOptions`
564+
565+
Return type of `createInfiniteQueryOptions` assuming SkipToken was not provided.
566+
567+
```ts
568+
interface InfiniteQueryOptions<
569+
I extends DescMessage,
570+
O extends DescMessage,
571+
ParamKey extends keyof MessageInitShape<I>,
572+
> {
573+
getNextPageParam: ConnectInfiniteQueryOptions<
574+
I,
575+
O,
576+
ParamKey
577+
>["getNextPageParam"];
578+
queryKey: ConnectQueryKey<O>;
579+
queryFn: QueryFunction<
580+
MessageShape<O>,
581+
ConnectQueryKey<O>,
582+
MessageInitShape<I>[ParamKey]
583+
>;
584+
structuralSharing: (oldData: unknown, newData: unknown) => unknown;
585+
initialPageParam: MessageInitShape<I>[ParamKey];
586+
}
587+
```
588+
589+
### `InfiniteQueryOptionsWithSkipToken`
590+
591+
Return type of `createInfiniteQueryOptions` when SkipToken is provided.
592+
593+
```ts
594+
interface InfiniteQueryOptionsWithSkipToken<
595+
I extends DescMessage,
596+
O extends DescMessage,
597+
ParamKey extends keyof MessageInitShape<I>,
598+
> extends Omit<InfiniteQueryOptions<I, O, ParamKey>, "queryFn"> {
599+
queryFn: SkipToken;
600+
}
601+
```
602+
534603
## Testing
535604

536605
Connect-query (along with all other javascript based connect packages) can be tested with the `createRouterTransport` function from `@connectrpc/connect`. This function allows you to create a transport that can be used to test your application without needing to make any network requests. We also have a dedicated package, [@connectrpc/connect-playwright](https://github.com/connectrpc/connect-playwright-es) for testing within [playwright](https://playwright.dev/).

packages/connect-query-core/src/create-infinite-query-options.ts

Lines changed: 42 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,40 @@ import {
3434
import { createStructuralSharing } from "./structural-sharing.js";
3535
import { assert } from "./utils.js";
3636

37+
/**
38+
* Return type of createInfiniteQueryOptions assuming SkipToken was not provided.
39+
*/
40+
export interface InfiniteQueryOptions<
41+
I extends DescMessage,
42+
O extends DescMessage,
43+
ParamKey extends keyof MessageInitShape<I>,
44+
> {
45+
getNextPageParam: ConnectInfiniteQueryOptions<
46+
I,
47+
O,
48+
ParamKey
49+
>["getNextPageParam"];
50+
queryKey: ConnectQueryKey<O>;
51+
queryFn: QueryFunction<
52+
MessageShape<O>,
53+
ConnectQueryKey<O>,
54+
MessageInitShape<I>[ParamKey]
55+
>;
56+
structuralSharing: (oldData: unknown, newData: unknown) => unknown;
57+
initialPageParam: MessageInitShape<I>[ParamKey];
58+
}
59+
60+
/**
61+
* Return type of createInfiniteQueryOptions when SkipToken is provided
62+
*/
63+
export interface InfiniteQueryOptionsWithSkipToken<
64+
I extends DescMessage,
65+
O extends DescMessage,
66+
ParamKey extends keyof MessageInitShape<I>,
67+
> extends Omit<InfiniteQueryOptions<I, O, ParamKey>, "queryFn"> {
68+
queryFn: SkipToken;
69+
}
70+
3771
/**
3872
* Options specific to connect-query
3973
*/
@@ -98,21 +132,7 @@ export function createInfiniteQueryOptions<
98132
getNextPageParam,
99133
pageParamKey,
100134
}: ConnectInfiniteQueryOptions<I, O, ParamKey> & { transport: Transport },
101-
): {
102-
getNextPageParam: ConnectInfiniteQueryOptions<
103-
I,
104-
O,
105-
ParamKey
106-
>["getNextPageParam"];
107-
queryKey: ConnectQueryKey<O>;
108-
queryFn: QueryFunction<
109-
MessageShape<O>,
110-
ConnectQueryKey<O>,
111-
MessageInitShape<I>[ParamKey]
112-
>;
113-
structuralSharing: (oldData: unknown, newData: unknown) => unknown;
114-
initialPageParam: MessageInitShape<I>[ParamKey];
115-
};
135+
): InfiniteQueryOptions<I, O, ParamKey>;
116136
export function createInfiniteQueryOptions<
117137
I extends DescMessage,
118138
O extends DescMessage,
@@ -125,17 +145,7 @@ export function createInfiniteQueryOptions<
125145
getNextPageParam,
126146
pageParamKey,
127147
}: ConnectInfiniteQueryOptions<I, O, ParamKey> & { transport: Transport },
128-
): {
129-
getNextPageParam: ConnectInfiniteQueryOptions<
130-
I,
131-
O,
132-
ParamKey
133-
>["getNextPageParam"];
134-
queryKey: ConnectQueryKey<O>;
135-
queryFn: SkipToken;
136-
structuralSharing: (oldData: unknown, newData: unknown) => unknown;
137-
initialPageParam: MessageInitShape<I>[ParamKey];
138-
};
148+
): InfiniteQueryOptionsWithSkipToken<I, O, ParamKey>;
139149
export function createInfiniteQueryOptions<
140150
I extends DescMessage,
141151
O extends DescMessage,
@@ -150,23 +160,9 @@ export function createInfiniteQueryOptions<
150160
getNextPageParam,
151161
pageParamKey,
152162
}: ConnectInfiniteQueryOptions<I, O, ParamKey> & { transport: Transport },
153-
): {
154-
getNextPageParam: ConnectInfiniteQueryOptions<
155-
I,
156-
O,
157-
ParamKey
158-
>["getNextPageParam"];
159-
queryKey: ConnectQueryKey<O>;
160-
queryFn:
161-
| QueryFunction<
162-
MessageShape<O>,
163-
ConnectQueryKey<O>,
164-
MessageInitShape<I>[ParamKey]
165-
>
166-
| SkipToken;
167-
structuralSharing: (oldData: unknown, newData: unknown) => unknown;
168-
initialPageParam: MessageInitShape<I>[ParamKey];
169-
};
163+
):
164+
| InfiniteQueryOptions<I, O, ParamKey>
165+
| InfiniteQueryOptionsWithSkipToken<I, O, ParamKey>;
170166
export function createInfiniteQueryOptions<
171167
I extends DescMessage,
172168
O extends DescMessage,
@@ -181,23 +177,9 @@ export function createInfiniteQueryOptions<
181177
getNextPageParam,
182178
pageParamKey,
183179
}: ConnectInfiniteQueryOptions<I, O, ParamKey> & { transport: Transport },
184-
): {
185-
getNextPageParam: ConnectInfiniteQueryOptions<
186-
I,
187-
O,
188-
ParamKey
189-
>["getNextPageParam"];
190-
queryKey: ConnectQueryKey<O>;
191-
queryFn:
192-
| QueryFunction<
193-
MessageShape<O>,
194-
ConnectQueryKey<O>,
195-
MessageInitShape<I>[ParamKey]
196-
>
197-
| SkipToken;
198-
structuralSharing: (oldData: unknown, newData: unknown) => unknown;
199-
initialPageParam: MessageInitShape<I>[ParamKey];
200-
} {
180+
):
181+
| InfiniteQueryOptions<I, O, ParamKey>
182+
| InfiniteQueryOptionsWithSkipToken<I, O, ParamKey> {
201183
const queryKey = createConnectQueryKey({
202184
cardinality: "infinite",
203185
schema,

packages/connect-query-core/src/create-query-options.ts

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,20 @@ import type { ConnectQueryKey } from "./connect-query-key.js";
2828
import { createConnectQueryKey } from "./connect-query-key.js";
2929
import { createStructuralSharing } from "./structural-sharing.js";
3030

31+
/**
32+
* Return type of createQueryOptions
33+
*/
34+
export interface QueryOptions<O extends DescMessage> {
35+
queryKey: ConnectQueryKey<O>;
36+
queryFn: QueryFunction<MessageShape<O>, ConnectQueryKey<O>>;
37+
structuralSharing: (oldData: unknown, newData: unknown) => unknown;
38+
}
39+
40+
export interface QueryOptionsWithSkipToken<O extends DescMessage>
41+
extends Omit<QueryOptions<O>, "queryFn"> {
42+
queryFn: SkipToken;
43+
}
44+
3145
function createUnaryQueryFn<I extends DescMessage, O extends DescMessage>(
3246
transport: Transport,
3347
schema: DescMethodUnary<I, O>,
@@ -54,11 +68,7 @@ export function createQueryOptions<
5468
}: {
5569
transport: Transport;
5670
},
57-
): {
58-
queryKey: ConnectQueryKey<O>;
59-
queryFn: QueryFunction<MessageShape<O>, ConnectQueryKey<O>>;
60-
structuralSharing: (oldData: unknown, newData: unknown) => unknown;
61-
};
71+
): QueryOptions<O>;
6272
export function createQueryOptions<
6373
I extends DescMessage,
6474
O extends DescMessage,
@@ -70,11 +80,7 @@ export function createQueryOptions<
7080
}: {
7181
transport: Transport;
7282
},
73-
): {
74-
queryKey: ConnectQueryKey<O>;
75-
queryFn: SkipToken;
76-
structuralSharing: (oldData: unknown, newData: unknown) => unknown;
77-
};
83+
): QueryOptionsWithSkipToken<O>;
7884
export function createQueryOptions<
7985
I extends DescMessage,
8086
O extends DescMessage,
@@ -86,11 +92,7 @@ export function createQueryOptions<
8692
}: {
8793
transport: Transport;
8894
},
89-
): {
90-
queryKey: ConnectQueryKey<O>;
91-
queryFn: QueryFunction<MessageShape<O>, ConnectQueryKey<O>> | SkipToken;
92-
structuralSharing: (oldData: unknown, newData: unknown) => unknown;
93-
};
95+
): QueryOptions<O> | QueryOptionsWithSkipToken<O>;
9496
export function createQueryOptions<
9597
I extends DescMessage,
9698
O extends DescMessage,
@@ -102,11 +104,7 @@ export function createQueryOptions<
102104
}: {
103105
transport: Transport;
104106
},
105-
): {
106-
queryKey: ConnectQueryKey<O>;
107-
queryFn: QueryFunction<MessageShape<O>, ConnectQueryKey<O>> | SkipToken;
108-
structuralSharing: (oldData: unknown, newData: unknown) => unknown;
109-
} {
107+
): QueryOptions<O> | QueryOptionsWithSkipToken<O> {
110108
const queryKey = createConnectQueryKey({
111109
schema,
112110
input: input ?? create(schema.input),

packages/connect-query-core/src/index.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,16 @@ export { createProtobufSafeUpdater } from "./utils.js";
1818
export type { ConnectUpdater } from "./utils.js";
1919
export { callUnaryMethod } from "./call-unary-method.js";
2020
export { createInfiniteQueryOptions } from "./create-infinite-query-options.js";
21-
export type { ConnectInfiniteQueryOptions } from "./create-infinite-query-options.js";
21+
export type {
22+
ConnectInfiniteQueryOptions,
23+
InfiniteQueryOptionsWithSkipToken,
24+
InfiniteQueryOptions,
25+
} from "./create-infinite-query-options.js";
2226
export { createQueryOptions } from "./create-query-options.js";
27+
export type {
28+
QueryOptions,
29+
QueryOptionsWithSkipToken,
30+
} from "./create-query-options.js";
2331
export { addStaticKeyToTransport } from "./transport-key.js";
2432
export type { SkipToken } from "@tanstack/query-core";
2533
export { skipToken } from "@tanstack/query-core";

0 commit comments

Comments
 (0)