@beignet/react-query 0.0.26 → 0.0.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/README.md +83 -7
- package/dist/index.d.ts +80 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +42 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +141 -44
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# @beignet/react-query
|
|
2
2
|
|
|
3
|
+
## 0.0.27
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 88200a0: Infinite queries now observe `InfiniteData` of the contract response, so `useInfiniteQuery(...).data.pages` typechecks. `queryOptions(...)` and `infiniteQueryOptions(...)` thread `select` so the observed data type narrows while the generated query function keeps returning the raw response. New `cursorPagination()` helper spreads into `infiniteQueryOptions(...)` for contracts that follow the Beignet cursor pagination convention (`cursor` query param plus `page.nextCursor` responses).
|
|
8
|
+
|
|
3
9
|
## 0.0.26
|
|
4
10
|
|
|
5
11
|
## 0.0.25
|
package/README.md
CHANGED
|
@@ -237,19 +237,20 @@ function CreateTodoForm() {
|
|
|
237
237
|
|
|
238
238
|
#### Infinite query options
|
|
239
239
|
|
|
240
|
+
For contracts that follow the Beignet cursor pagination convention — an
|
|
241
|
+
optional `cursor` query param and a `PageResult` response with
|
|
242
|
+
`page.nextCursor` — spread `cursorPagination()` into the options:
|
|
243
|
+
|
|
240
244
|
```tsx
|
|
241
245
|
import { useInfiniteQuery } from "@tanstack/react-query";
|
|
246
|
+
import { cursorPagination } from "@beignet/react-query";
|
|
242
247
|
import { rq } from "@/client";
|
|
243
248
|
import { listTodos } from "@/features/todos/contracts";
|
|
244
249
|
|
|
245
250
|
function InfiniteTodoList() {
|
|
246
251
|
const todosInfiniteQuery = rq(listTodos).infiniteQueryOptions({
|
|
247
252
|
query: { status: "open" },
|
|
248
|
-
|
|
249
|
-
query: { cursor: pageParam ?? null },
|
|
250
|
-
}),
|
|
251
|
-
getNextPageParam: (lastPage) => lastPage.page.nextCursor ?? undefined,
|
|
252
|
-
initialPageParam: null,
|
|
253
|
+
...cursorPagination(),
|
|
253
254
|
});
|
|
254
255
|
|
|
255
256
|
const { data, fetchNextPage, hasNextPage, isFetchingNextPage } =
|
|
@@ -272,6 +273,27 @@ function InfiniteTodoList() {
|
|
|
272
273
|
}
|
|
273
274
|
```
|
|
274
275
|
|
|
276
|
+
`data.pages` is typed per page: the infinite options observe `InfiniteData`
|
|
277
|
+
of the contract response. Contracts without a `cursor` query param or without
|
|
278
|
+
`page.nextCursor` in the response fail to typecheck at the spread site.
|
|
279
|
+
|
|
280
|
+
Contracts that paginate differently pass `initialPageParam`,
|
|
281
|
+
`getNextPageParam`, and `page(...)` by hand:
|
|
282
|
+
|
|
283
|
+
```tsx
|
|
284
|
+
const todosInfiniteQuery = rq(listTodos).infiniteQueryOptions({
|
|
285
|
+
query: { limit: 10 },
|
|
286
|
+
initialPageParam: 0,
|
|
287
|
+
page: ({ pageParam }) => ({
|
|
288
|
+
query: { offset: pageParam },
|
|
289
|
+
}),
|
|
290
|
+
getNextPageParam: (lastPage) =>
|
|
291
|
+
lastPage.page.hasMore
|
|
292
|
+
? lastPage.page.offset + lastPage.items.length
|
|
293
|
+
: undefined,
|
|
294
|
+
});
|
|
295
|
+
```
|
|
296
|
+
|
|
275
297
|
## API reference
|
|
276
298
|
|
|
277
299
|
### `createReactQuery(client, options?)`
|
|
@@ -323,7 +345,7 @@ const queryOpts = helper.queryOptions({
|
|
|
323
345
|
body?: { ... }, // Required when the contract has a required body
|
|
324
346
|
headers?: { ... }, // Sent with the request; keyed only via keyHeaders
|
|
325
347
|
key?: readonly unknown[], // Custom query key
|
|
326
|
-
// ...any other TanStack Query options (staleTime, enabled, etc.)
|
|
348
|
+
// ...any other TanStack Query options (staleTime, enabled, select, etc.)
|
|
327
349
|
});
|
|
328
350
|
|
|
329
351
|
// Use with any primitive
|
|
@@ -333,6 +355,19 @@ queryClient.fetchQuery(queryOpts);
|
|
|
333
355
|
queryClient.ensureQueryData(queryOpts);
|
|
334
356
|
```
|
|
335
357
|
|
|
358
|
+
`select` threads through the options, so the observed data narrows while the
|
|
359
|
+
generated `queryFn` still returns and caches the raw contract response:
|
|
360
|
+
|
|
361
|
+
```ts
|
|
362
|
+
const { data } = useQuery(
|
|
363
|
+
rq(getTodo).queryOptions({
|
|
364
|
+
path: { id: "123" },
|
|
365
|
+
select: (todo) => todo.title,
|
|
366
|
+
}),
|
|
367
|
+
);
|
|
368
|
+
// data is typed as: string | undefined
|
|
369
|
+
```
|
|
370
|
+
|
|
336
371
|
### `helper.mutationOptions(options)`
|
|
337
372
|
|
|
338
373
|
**[Recommended]** Generate mutation options that can be passed to `useMutation`.
|
|
@@ -362,7 +397,24 @@ object when an idempotent mutation should keep its key across retries.
|
|
|
362
397
|
|
|
363
398
|
### `helper.infiniteQueryOptions(options)`
|
|
364
399
|
|
|
365
|
-
**[Recommended]** Generate infinite query options for pagination.
|
|
400
|
+
**[Recommended]** Generate infinite query options for pagination. The options
|
|
401
|
+
observe `InfiniteData` of the contract response, so `useInfiniteQuery` data
|
|
402
|
+
has typed `pages`, and `select` narrows the observed data the same way as
|
|
403
|
+
`queryOptions`.
|
|
404
|
+
|
|
405
|
+
For contracts that follow the cursor convention, spread
|
|
406
|
+
[`cursorPagination()`](#cursorpagination):
|
|
407
|
+
|
|
408
|
+
```ts
|
|
409
|
+
const infiniteOpts = rq(listTodos).infiniteQueryOptions({
|
|
410
|
+
query: { status: "open" },
|
|
411
|
+
...cursorPagination(),
|
|
412
|
+
});
|
|
413
|
+
|
|
414
|
+
useInfiniteQuery(infiniteOpts);
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
For other pagination shapes, pass the page-param options by hand:
|
|
366
418
|
|
|
367
419
|
```ts
|
|
368
420
|
const infiniteOpts = helper.infiniteQueryOptions({
|
|
@@ -412,6 +464,30 @@ const infiniteOpts = helper.infiniteQueryOptions({
|
|
|
412
464
|
});
|
|
413
465
|
```
|
|
414
466
|
|
|
467
|
+
### `cursorPagination()`
|
|
468
|
+
|
|
469
|
+
Infinite-query options for contracts that follow the Beignet cursor
|
|
470
|
+
pagination convention: an optional `cursor` query param on the request and a
|
|
471
|
+
`PageResult`-style response with `page.nextCursor` (`string | null`). Spread
|
|
472
|
+
the result into `infiniteQueryOptions(...)`:
|
|
473
|
+
|
|
474
|
+
```ts
|
|
475
|
+
import { cursorPagination } from "@beignet/react-query";
|
|
476
|
+
|
|
477
|
+
useInfiniteQuery(
|
|
478
|
+
rq(listTodos).infiniteQueryOptions({
|
|
479
|
+
query: { status: "open" },
|
|
480
|
+
...cursorPagination(),
|
|
481
|
+
}),
|
|
482
|
+
);
|
|
483
|
+
```
|
|
484
|
+
|
|
485
|
+
The first page is fetched without a cursor, each next page sends
|
|
486
|
+
`lastPage.page.nextCursor`, and `null` tells TanStack Query there is no next
|
|
487
|
+
page. Type safety is structural: contracts without a `cursor` query param or
|
|
488
|
+
without `page.nextCursor` in the response fail to typecheck at the spread
|
|
489
|
+
site.
|
|
490
|
+
|
|
415
491
|
### `helper.namespaceKey()`
|
|
416
492
|
|
|
417
493
|
Generate a namespace-level key for broad cache operations. Contracts created
|
package/dist/index.d.ts
CHANGED
|
@@ -1,12 +1,18 @@
|
|
|
1
1
|
import type { Client, Endpoint, EndpointCallArgs, InferBody, InferEndpointContractError, InferPathParams, InferQuery, InferSuccessResponse } from "@beignet/core/client";
|
|
2
2
|
import { type ContractLike, type HttpContractConfig, type ResolveContract } from "@beignet/core/contracts";
|
|
3
|
-
import type {
|
|
3
|
+
import type { InfiniteData, InvalidateQueryFilters, QueryClient, QueryFunction, QueryKey, UseInfiniteQueryOptions, UseMutationOptions, UseQueryOptions } from "@tanstack/react-query";
|
|
4
4
|
type EndpointQueryArgs<TContract extends HttpContractConfig, TProvidedHeaders extends string> = Omit<EndpointCallArgs<TContract, TProvidedHeaders>, "rawBody" | "signal" | "idempotencyKey">;
|
|
5
5
|
type EndpointArgValue<TArgs, TKey extends "path" | "query" | "body" | "headers"> = TKey extends keyof TArgs ? TArgs[TKey] : undefined;
|
|
6
6
|
type IsRequiredValue<T> = undefined extends T ? false : true;
|
|
7
7
|
type RequiresQueryOptionsArgs<TContract extends HttpContractConfig, TProvidedHeaders extends string> = IsRequiredValue<InferPathParams<TContract>> extends true ? true : IsRequiredValue<InferQuery<TContract>> extends true ? true : IsRequiredValue<InferBody<TContract>> extends true ? true : IsRequiredValue<EndpointArgValue<EndpointCallArgs<TContract, TProvidedHeaders>, "headers">> extends true ? true : false;
|
|
8
|
-
type ContractQueryOptionsBase<TContract extends HttpContractConfig
|
|
9
|
-
|
|
8
|
+
type ContractQueryOptionsBase<TContract extends HttpContractConfig, TData = InferSuccessResponse<TContract>> = Omit<UseQueryOptions<InferSuccessResponse<TContract>, InferEndpointContractError<TContract>, TData, QueryKey>, "queryKey" | "queryFn">;
|
|
9
|
+
/**
|
|
10
|
+
* Query options returned by `ReactQueryContractHelper.queryOptions(...)`.
|
|
11
|
+
*
|
|
12
|
+
* `TData` defaults to the raw contract response and narrows when the call
|
|
13
|
+
* passes `select`.
|
|
14
|
+
*/
|
|
15
|
+
export type ContractQueryOptionsResult<TContract extends HttpContractConfig, TData = InferSuccessResponse<TContract>> = ContractQueryOptionsBase<TContract, TData> & {
|
|
10
16
|
queryKey: QueryKey;
|
|
11
17
|
queryFn: QueryFunction<InferSuccessResponse<TContract>, QueryKey>;
|
|
12
18
|
};
|
|
@@ -15,12 +21,13 @@ type ContractQueryOptionsResult<TContract extends HttpContractConfig> = Contract
|
|
|
15
21
|
*
|
|
16
22
|
* TanStack `queryKey` and `queryFn` are generated from the contract. Pass
|
|
17
23
|
* `key` to override the generated query key while keeping the generated query
|
|
18
|
-
* function.
|
|
24
|
+
* function. Pass `select` to narrow the observed data type; the generated
|
|
25
|
+
* `queryFn` still returns the raw contract response.
|
|
19
26
|
*/
|
|
20
|
-
export type ContractUseQueryOptions<TContract extends HttpContractConfig, TProvidedHeaders extends string = never
|
|
27
|
+
export type ContractUseQueryOptions<TContract extends HttpContractConfig, TProvidedHeaders extends string = never, TData = InferSuccessResponse<TContract>> = EndpointQueryArgs<TContract, TProvidedHeaders> & {
|
|
21
28
|
key?: readonly unknown[];
|
|
22
|
-
} & ContractQueryOptionsBase<TContract>;
|
|
23
|
-
type ContractQueryOptionsCallArgs<TContract extends HttpContractConfig, TProvidedHeaders extends string
|
|
29
|
+
} & ContractQueryOptionsBase<TContract, TData>;
|
|
30
|
+
type ContractQueryOptionsCallArgs<TContract extends HttpContractConfig, TProvidedHeaders extends string, TData = InferSuccessResponse<TContract>> = RequiresQueryOptionsArgs<TContract, TProvidedHeaders> extends true ? [args: ContractUseQueryOptions<TContract, TProvidedHeaders, TData>] : [args?: ContractUseQueryOptions<TContract, TProvidedHeaders, TData>];
|
|
24
31
|
export type ContractQueryKeyParams<TContract extends HttpContractConfig, TProvidedHeaders extends string = never> = {
|
|
25
32
|
path?: EndpointArgValue<EndpointQueryArgs<TContract, TProvidedHeaders>, "path">;
|
|
26
33
|
query?: EndpointArgValue<EndpointQueryArgs<TContract, TProvidedHeaders>, "query">;
|
|
@@ -70,7 +77,20 @@ type DynamicInfiniteQueryArgs<TContract extends HttpContractConfig, TPageParam,
|
|
|
70
77
|
body?: never;
|
|
71
78
|
page?: never;
|
|
72
79
|
};
|
|
73
|
-
type
|
|
80
|
+
type ContractInfiniteQueryOptionsBase<TContract extends HttpContractConfig, TPageParam, TData> = Omit<UseInfiniteQueryOptions<InferSuccessResponse<TContract>, InferEndpointContractError<TContract>, TData, QueryKey, TPageParam>, "queryKey" | "queryFn">;
|
|
81
|
+
type ContractInfiniteQueryOptions<TContract extends HttpContractConfig, TPageParam, TProvidedHeaders extends string, TData = InfiniteData<InferSuccessResponse<TContract>, TPageParam>> = (SafeInfiniteQueryArgs<TContract, TPageParam, TProvidedHeaders> | DynamicInfiniteQueryArgs<TContract, TPageParam, TProvidedHeaders>) & ContractInfiniteQueryOptionsBase<TContract, TPageParam, TData>;
|
|
82
|
+
/**
|
|
83
|
+
* Infinite query options returned by
|
|
84
|
+
* `ReactQueryContractHelper.infiniteQueryOptions(...)`.
|
|
85
|
+
*
|
|
86
|
+
* `TData` defaults to `InfiniteData` of the raw contract response, so
|
|
87
|
+
* `useInfiniteQuery(...).data.pages` is typed per page, and narrows when the
|
|
88
|
+
* call passes `select`.
|
|
89
|
+
*/
|
|
90
|
+
export type ContractInfiniteQueryOptionsResult<TContract extends HttpContractConfig, TPageParam, TData = InfiniteData<InferSuccessResponse<TContract>, TPageParam>> = ContractInfiniteQueryOptionsBase<TContract, TPageParam, TData> & {
|
|
91
|
+
queryKey: QueryKey;
|
|
92
|
+
queryFn: QueryFunction<InferSuccessResponse<TContract>, QueryKey, TPageParam>;
|
|
93
|
+
};
|
|
74
94
|
declare const BEIGNET_QUERY_KEY_SCOPE = "beignet";
|
|
75
95
|
/**
|
|
76
96
|
* Query key for all contracts in one Beignet namespace.
|
|
@@ -207,8 +227,11 @@ export declare class ReactQueryContractHelper<TContract extends HttpContractConf
|
|
|
207
227
|
*
|
|
208
228
|
* Pass the result to `useQuery`, `prefetchQuery`, `fetchQuery`, or any API
|
|
209
229
|
* that accepts query options.
|
|
230
|
+
*
|
|
231
|
+
* Pass `select` to narrow the observed data type. The generated `queryFn`
|
|
232
|
+
* still returns and caches the raw contract response.
|
|
210
233
|
*/
|
|
211
|
-
queryOptions(...callArgs: ContractQueryOptionsCallArgs<TContract, TProvidedHeaders>): ContractQueryOptionsResult<TContract>;
|
|
234
|
+
queryOptions<TData = InferSuccessResponse<TContract>>(...callArgs: ContractQueryOptionsCallArgs<TContract, TProvidedHeaders, TData>): ContractQueryOptionsResult<TContract, TData>;
|
|
212
235
|
/**
|
|
213
236
|
* Create mutation options for TanStack Query.
|
|
214
237
|
*
|
|
@@ -228,14 +251,60 @@ export declare class ReactQueryContractHelper<TContract extends HttpContractConf
|
|
|
228
251
|
*
|
|
229
252
|
* Use static `path`/`query` with `page(...)` when page params can be merged
|
|
230
253
|
* into a stable key. Use `params(...)` with an explicit `key` when every page
|
|
231
|
-
* needs fully dynamic args.
|
|
254
|
+
* needs fully dynamic args. For contracts that follow the framework cursor
|
|
255
|
+
* convention, spread `cursorPagination()` instead of writing
|
|
256
|
+
* `initialPageParam`, `getNextPageParam`, and `page(...)` by hand.
|
|
257
|
+
*
|
|
258
|
+
* The observed data defaults to `InfiniteData` of the contract response, so
|
|
259
|
+
* `useInfiniteQuery(...).data.pages` is typed per page. Pass `select` to
|
|
260
|
+
* narrow the observed data type.
|
|
232
261
|
*/
|
|
233
|
-
infiniteQueryOptions<TPageParam = unknown
|
|
262
|
+
infiniteQueryOptions<TPageParam = unknown, TData = InfiniteData<InferSuccessResponse<TContract>, TPageParam>>(args: ContractInfiniteQueryOptions<TContract, TPageParam, TProvidedHeaders, TData>): ContractInfiniteQueryOptionsResult<TContract, TPageParam, TData>;
|
|
234
263
|
/**
|
|
235
264
|
* Access the underlying contract endpoint.
|
|
236
265
|
*/
|
|
237
266
|
get endpoint(): Endpoint<TContract, TProvidedHeaders>;
|
|
238
267
|
}
|
|
268
|
+
/**
|
|
269
|
+
* Infinite-query options for contracts that follow the Beignet cursor
|
|
270
|
+
* pagination convention.
|
|
271
|
+
*
|
|
272
|
+
* Spread the result into `rq(contract).infiniteQueryOptions(...)` when the
|
|
273
|
+
* contract takes an optional `cursor` query param and responds with a
|
|
274
|
+
* `PageResult`-style body whose `page.nextCursor` is `string | null`. The
|
|
275
|
+
* first page is fetched without a cursor, each next page sends
|
|
276
|
+
* `lastPage.page.nextCursor`, and `null` tells TanStack Query there is no
|
|
277
|
+
* next page.
|
|
278
|
+
*
|
|
279
|
+
* ```ts
|
|
280
|
+
* useInfiniteQuery(
|
|
281
|
+
* rq(listIssues).infiniteQueryOptions({
|
|
282
|
+
* query: filters,
|
|
283
|
+
* ...cursorPagination(),
|
|
284
|
+
* }),
|
|
285
|
+
* );
|
|
286
|
+
* ```
|
|
287
|
+
*
|
|
288
|
+
* Type safety is structural: contracts without a `cursor` query param or
|
|
289
|
+
* without `page.nextCursor` in the response fail to typecheck at the spread
|
|
290
|
+
* site. Write `initialPageParam`, `getNextPageParam`, and `page(...)` by hand
|
|
291
|
+
* for contracts that paginate differently.
|
|
292
|
+
*/
|
|
293
|
+
export declare function cursorPagination(): {
|
|
294
|
+
initialPageParam: string | null;
|
|
295
|
+
getNextPageParam: (lastPage: {
|
|
296
|
+
page: {
|
|
297
|
+
nextCursor: string | null;
|
|
298
|
+
};
|
|
299
|
+
}) => string | null;
|
|
300
|
+
page: (ctx: {
|
|
301
|
+
pageParam: string | null;
|
|
302
|
+
}) => {
|
|
303
|
+
query: {
|
|
304
|
+
cursor?: string;
|
|
305
|
+
};
|
|
306
|
+
};
|
|
307
|
+
};
|
|
239
308
|
/**
|
|
240
309
|
* Create a React Query adapter for a Beignet client.
|
|
241
310
|
*
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,MAAM,EACN,QAAQ,EACR,gBAAgB,EAChB,SAAS,EACT,0BAA0B,EAC1B,eAAe,EACf,UAAU,EACV,oBAAoB,EACrB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACvB,KAAK,eAAe,EAErB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EACV,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -225,6 +225,9 @@ export class ReactQueryContractHelper {
|
|
|
225
225
|
*
|
|
226
226
|
* Pass the result to `useQuery`, `prefetchQuery`, `fetchQuery`, or any API
|
|
227
227
|
* that accepts query options.
|
|
228
|
+
*
|
|
229
|
+
* Pass `select` to narrow the observed data type. The generated `queryFn`
|
|
230
|
+
* still returns and caches the raw contract response.
|
|
228
231
|
*/
|
|
229
232
|
queryOptions(...callArgs) {
|
|
230
233
|
const args = (callArgs[0] ?? {});
|
|
@@ -289,7 +292,13 @@ export class ReactQueryContractHelper {
|
|
|
289
292
|
*
|
|
290
293
|
* Use static `path`/`query` with `page(...)` when page params can be merged
|
|
291
294
|
* into a stable key. Use `params(...)` with an explicit `key` when every page
|
|
292
|
-
* needs fully dynamic args.
|
|
295
|
+
* needs fully dynamic args. For contracts that follow the framework cursor
|
|
296
|
+
* convention, spread `cursorPagination()` instead of writing
|
|
297
|
+
* `initialPageParam`, `getNextPageParam`, and `page(...)` by hand.
|
|
298
|
+
*
|
|
299
|
+
* The observed data defaults to `InfiniteData` of the contract response, so
|
|
300
|
+
* `useInfiniteQuery(...).data.pages` is typed per page. Pass `select` to
|
|
301
|
+
* narrow the observed data type.
|
|
293
302
|
*/
|
|
294
303
|
infiniteQueryOptions(args) {
|
|
295
304
|
let queryKey;
|
|
@@ -341,6 +350,38 @@ export class ReactQueryContractHelper {
|
|
|
341
350
|
return this._endpoint;
|
|
342
351
|
}
|
|
343
352
|
}
|
|
353
|
+
/**
|
|
354
|
+
* Infinite-query options for contracts that follow the Beignet cursor
|
|
355
|
+
* pagination convention.
|
|
356
|
+
*
|
|
357
|
+
* Spread the result into `rq(contract).infiniteQueryOptions(...)` when the
|
|
358
|
+
* contract takes an optional `cursor` query param and responds with a
|
|
359
|
+
* `PageResult`-style body whose `page.nextCursor` is `string | null`. The
|
|
360
|
+
* first page is fetched without a cursor, each next page sends
|
|
361
|
+
* `lastPage.page.nextCursor`, and `null` tells TanStack Query there is no
|
|
362
|
+
* next page.
|
|
363
|
+
*
|
|
364
|
+
* ```ts
|
|
365
|
+
* useInfiniteQuery(
|
|
366
|
+
* rq(listIssues).infiniteQueryOptions({
|
|
367
|
+
* query: filters,
|
|
368
|
+
* ...cursorPagination(),
|
|
369
|
+
* }),
|
|
370
|
+
* );
|
|
371
|
+
* ```
|
|
372
|
+
*
|
|
373
|
+
* Type safety is structural: contracts without a `cursor` query param or
|
|
374
|
+
* without `page.nextCursor` in the response fail to typecheck at the spread
|
|
375
|
+
* site. Write `initialPageParam`, `getNextPageParam`, and `page(...)` by hand
|
|
376
|
+
* for contracts that paginate differently.
|
|
377
|
+
*/
|
|
378
|
+
export function cursorPagination() {
|
|
379
|
+
return {
|
|
380
|
+
initialPageParam: null,
|
|
381
|
+
getNextPageParam: (lastPage) => lastPage.page.nextCursor,
|
|
382
|
+
page: ({ pageParam }) => ({ query: { cursor: pageParam ?? undefined } }),
|
|
383
|
+
};
|
|
384
|
+
}
|
|
344
385
|
/**
|
|
345
386
|
* Create a React Query adapter for a Beignet client.
|
|
346
387
|
*
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAUA,OAAO,EAIL,eAAe,GAChB,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAUA,OAAO,EAIL,eAAe,GAChB,MAAM,yBAAyB,CAAC;AA6OjC,SAAS,iBAAiB,CAAI,IAAQ,EAAE,KAAS;IAC/C,IAAI,IAAI,IAAI,IAAI;QAAE,OAAO,KAAK,CAAC;IAC/B,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC;IAE/B,IACE,OAAO,IAAI,KAAK,QAAQ;QACxB,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QACnB,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EACpB,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO;QACL,GAAI,IAAgC;QACpC,GAAI,KAAiC;KACjC,CAAC;AACT,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAc;IACvC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAC1C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACtD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC;SAC7D,MAAM,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,IAAI,CAAC;SAC3E,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IAE1C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3C,OAAO,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,uBAAuB,GAAG,SAAS,CAAC;AAC1C,MAAM,gCAAgC,GAAG,IAAI,CAAC;AAE9C;;;;;;;GAOG;AACH,MAAM,0BAA0B,GAAG,IAAI,OAAO,EAAkB,CAAC;AAEjE;;;;;;GAMG;AACH,SAAS,oBAAoB;IAC3B,MAAM,SAAS,GACb,OAAO,UAAU,KAAK,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IACpE,IAAI,OAAO,SAAS,EAAE,UAAU,KAAK,UAAU,EAAE,CAAC;QAChD,OAAO,SAAS,CAAC,UAAU,EAAE,CAAC;IAChC,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;IACjC,IAAI,OAAO,SAAS,EAAE,eAAe,KAAK,UAAU,EAAE,CAAC;QACrD,SAAS,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;SAAM,CAAC;QACN,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;YACrD,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IACD,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IACpC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IACpC,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CACrC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CACnC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACX,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;AAC7G,CAAC;AA4DD;;;;;;GAMG;AACH,MAAM,OAAO,wBAAwB;IAKzB;IACA;IACA;IAHV,YACU,QAAmB,EACnB,SAAgD,EAChD,UAAmC,EAAE;QAFrC,aAAQ,GAAR,QAAQ,CAAW;QACnB,cAAS,GAAT,SAAS,CAAuC;QAChD,YAAO,GAAP,OAAO,CAA8B;IAC5C,CAAC;IAEJ;;OAEG;IACH,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;IAC5B,CAAC;IAED;;;OAGG;IACH,IAAI,KAAK;QACP,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;IACzD,CAAC;IAED;;OAEG;IACH,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,IAAI,gCAAgC,CAAC;IACrE,CAAC;IAED;;OAEG;IACH,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;IACvD,CAAC;IAED;;OAEG;IACH,YAAY;QACV,OAAO,CAAC,uBAAuB,EAAE,IAAI,CAAC,SAAS,CAAU,CAAC;IAC5D,CAAC;IAED;;OAEG;IACH,WAAW;QACT,OAAO;YACL,uBAAuB;YACvB,IAAI,CAAC,SAAS;YACd,IAAI,CAAC,SAAS;YACd,IAAI,CAAC,KAAK;SACF,CAAC;IACb,CAAC;IAED;;OAEG;IACH,eAAe,CACb,UAAsC,EAAE;QAExC,OAAO;YACL,GAAG,OAAO;YACV,QAAQ,EAAE,IAAI,CAAC,YAAY,EAAE;SAC9B,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,cAAc,CACZ,UAAsC,EAAE;QAExC,OAAO;YACL,GAAG,OAAO;YACV,QAAQ,EAAE,IAAI,CAAC,WAAW,EAAE;SAC7B,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACK,cAAc,CACpB,OAAgB;QAEhB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;QAC3C,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QAC7D,IACE,OAAO,KAAK,IAAI;YAChB,OAAO,KAAK,SAAS;YACrB,OAAO,OAAO,KAAK,QAAQ;YAC3B,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EACtB,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QACtE,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CACxC,OAAkC,CACnC,EAAE,CAAC;YACF,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YACnC,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;gBAAE,MAAM,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC;QACpD,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;;;;;;;;;OAWG;IACH,GAAG,CAAC,MAKH;QACC,MAAM,IAAI,GAAG,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;QAExE,IACE,IAAI,KAAK,SAAS;YAClB,KAAK,KAAK,SAAS;YACnB,IAAI,KAAK,SAAS;YAClB,OAAO,KAAK,SAAS,EACrB,CAAC;YACD,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;QAC5B,CAAC;QAED,MAAM,WAAW,GAA4B,EAAE,CAAC;QAChD,IAAI,IAAI,KAAK,SAAS;YAAE,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC;QAChD,IAAI,KAAK,KAAK,SAAS;YAAE,WAAW,CAAC,KAAK,GAAG,KAAK,CAAC;QACnD,IAAI,IAAI,KAAK,SAAS;YAAE,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC;QAChD,IAAI,OAAO,KAAK,SAAS;YAAE,WAAW,CAAC,OAAO,GAAG,OAAO,CAAC;QACzD,OAAO,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,WAAW,CAAU,CAAC;IACvD,CAAC;IAED;;OAEG;IACH,MAAM,CACJ,MAA4D,EAC5D,UAAsC,EAAE;QAExC,OAAO;YACL,GAAG,OAAO;YACV,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;SAC3B,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,UAAU,CACR,WAAwB,EACxB,MAA4D,EAC5D,OAAoC;QAEpC,OAAO,WAAW,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACrE,CAAC;IAED;;;;;;;;OAQG;IACH,YAAY,CACV,GAAG,QAIF;QAED,MAAM,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAI9B,CAAC;QACF,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;QAErE,MAAM,QAAQ,GAAG,CAAC,SAAS;YACzB,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAa,CAAC;QAExD,MAAM,OAAO,GAAG,KAAK,EAAE,OAAiC,EAAE,EAAE;YAC1D,OAAO,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;gBAC/B,IAAI;gBACJ,KAAK;gBACL,IAAI;gBACJ,OAAO;gBACP,MAAM,EAAE,OAAO,CAAC,MAAM;aACqC,CAAC,CAAC;QACjE,CAAC,CAAC;QAEF,OAAO;YACL,GAAG,IAAI;YACP,QAAQ;YACR,OAAO;SACwC,CAAC;IACpD,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,eAAe,CACb,OAAgE,EAAE;QAOlE,MAAM,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAC5E,MAAM,UAAU,GAAG,KAAK,EACtB,IAAmD,EACnD,EAAE;YACF,IAAI,cAAc,GAAG,IAAI,EAAE,cAAc,CAAC;YAC1C,IACE,CAAC,cAAc;gBACf,sBAAsB;gBACtB,IAAI;gBACJ,OAAO,IAAI,KAAK,QAAQ,EACxB,CAAC;gBACD,cAAc;oBACZ,0BAA0B,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,oBAAoB,EAAE,CAAC;gBACjE,0BAA0B,CAAC,GAAG,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;YACvD,CAAC;YACD,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;gBACjC,OAAO,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzC,CAAC;YACD,OAAO,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;gBAC/B,GAAG,IAAI;gBACP,cAAc;aACkC,CAAC,CAAC;QACtD,CAAC,CAAC;QAEF,OAAO;YACL,GAAG,IAAI;YACP,UAAU;SAMX,CAAC;IACJ,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,oBAAoB,CAIlB,IAKC;QAED,IAAI,QAAkB,CAAC;QACvB,IAAI,IAQH,CAAC;QACF,IAAI,aAE0D,CAAC;QAE/D,IAAI,QAAQ,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YAC1D,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,EAAE,GAAG,IAAI,CAAC;YACvC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,MAAM,IAAI,KAAK,CACb,0HAA0H,CAC3H,CAAC;YACJ,CAAC;YACD,QAAQ,GAAG,GAAe,CAAC;YAC3B,IAAI,GAAG,KAAK,CAAC;YACb,aAAa,GAAG,MAAM,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,KAAK,EAAE,GAAG,IAAI,CAAC;YACjE,QAAQ,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAa,CAAC;YACzE,IAAI,GAAG,KAAK,CAAC;YACb,aAAa,GAAG,CAAC,OAAO,EAAE,EAAE;gBAC1B,MAAM,UAAU,GAAG,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC;gBACnC,OAAO;oBACL,IAAI,EAAE,iBAAiB,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC;oBAC/C,KAAK,EAAE,iBAAiB,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,CAAC;oBAClD,IAAI,EAAE,iBAAiB,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC;oBAC/C,OAAO,EAAE,iBAAiB,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC;iBACzD,CAAC;YACJ,CAAC,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,KAAK,EAAE,OAGtB,EAAE,EAAE;YACH,MAAM,cAAc,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;YAC9C,OAAO,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;gBAC/B,IAAI,EAAE,cAAc,CAAC,IAAI;gBACzB,KAAK,EAAE,cAAc,CAAC,KAAK;gBAC3B,IAAI,EAAE,cAAc,CAAC,IAAI;gBACzB,OAAO,EAAE,cAAc,CAAC,OAAO;gBAC/B,MAAM,EAAE,OAAO,CAAC,MAAM;aACqC,CAAC,CAAC;QACjE,CAAC,CAAC;QAEF,OAAO;YACL,GAAG,IAAI;YACP,QAAQ;YACR,OAAO;SAKR,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;CACF;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,gBAAgB;IAO9B,OAAO;QACL,gBAAgB,EAAE,IAAI;QACtB,gBAAgB,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU;QACxD,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,SAAS,IAAI,SAAS,EAAE,EAAE,CAAC;KACzE,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB,CAC9B,MAAgC,EAChC,UAAmC,EAAE;IAErC,OAAO,SAAS,EAAE,CAChB,QAAuB;QAKvB,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAGxC,CAAC;QACF,OAAO,IAAI,wBAAwB,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IACnE,CAAC,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -16,11 +16,12 @@ import {
|
|
|
16
16
|
} from "@beignet/core/contracts";
|
|
17
17
|
|
|
18
18
|
import type {
|
|
19
|
-
|
|
19
|
+
InfiniteData,
|
|
20
20
|
InvalidateQueryFilters,
|
|
21
21
|
QueryClient,
|
|
22
22
|
QueryFunction,
|
|
23
23
|
QueryKey,
|
|
24
|
+
UseInfiniteQueryOptions,
|
|
24
25
|
UseMutationOptions,
|
|
25
26
|
UseQueryOptions,
|
|
26
27
|
} from "@tanstack/react-query";
|
|
@@ -59,43 +60,57 @@ type RequiresQueryOptionsArgs<
|
|
|
59
60
|
? true
|
|
60
61
|
: false;
|
|
61
62
|
|
|
62
|
-
type ContractQueryOptionsBase<
|
|
63
|
+
type ContractQueryOptionsBase<
|
|
64
|
+
TContract extends HttpContractConfig,
|
|
65
|
+
TData = InferSuccessResponse<TContract>,
|
|
66
|
+
> = Omit<
|
|
63
67
|
UseQueryOptions<
|
|
64
68
|
InferSuccessResponse<TContract>,
|
|
65
69
|
InferEndpointContractError<TContract>,
|
|
66
|
-
|
|
70
|
+
TData,
|
|
67
71
|
QueryKey
|
|
68
72
|
>,
|
|
69
73
|
"queryKey" | "queryFn"
|
|
70
74
|
>;
|
|
71
75
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
76
|
+
/**
|
|
77
|
+
* Query options returned by `ReactQueryContractHelper.queryOptions(...)`.
|
|
78
|
+
*
|
|
79
|
+
* `TData` defaults to the raw contract response and narrows when the call
|
|
80
|
+
* passes `select`.
|
|
81
|
+
*/
|
|
82
|
+
export type ContractQueryOptionsResult<
|
|
83
|
+
TContract extends HttpContractConfig,
|
|
84
|
+
TData = InferSuccessResponse<TContract>,
|
|
85
|
+
> = ContractQueryOptionsBase<TContract, TData> & {
|
|
86
|
+
queryKey: QueryKey;
|
|
87
|
+
queryFn: QueryFunction<InferSuccessResponse<TContract>, QueryKey>;
|
|
88
|
+
};
|
|
77
89
|
|
|
78
90
|
/**
|
|
79
91
|
* Options accepted by `ReactQueryContractHelper.queryOptions(...)`.
|
|
80
92
|
*
|
|
81
93
|
* TanStack `queryKey` and `queryFn` are generated from the contract. Pass
|
|
82
94
|
* `key` to override the generated query key while keeping the generated query
|
|
83
|
-
* function.
|
|
95
|
+
* function. Pass `select` to narrow the observed data type; the generated
|
|
96
|
+
* `queryFn` still returns the raw contract response.
|
|
84
97
|
*/
|
|
85
98
|
export type ContractUseQueryOptions<
|
|
86
99
|
TContract extends HttpContractConfig,
|
|
87
100
|
TProvidedHeaders extends string = never,
|
|
101
|
+
TData = InferSuccessResponse<TContract>,
|
|
88
102
|
> = EndpointQueryArgs<TContract, TProvidedHeaders> & {
|
|
89
103
|
key?: readonly unknown[];
|
|
90
|
-
} & ContractQueryOptionsBase<TContract>;
|
|
104
|
+
} & ContractQueryOptionsBase<TContract, TData>;
|
|
91
105
|
|
|
92
106
|
type ContractQueryOptionsCallArgs<
|
|
93
107
|
TContract extends HttpContractConfig,
|
|
94
108
|
TProvidedHeaders extends string,
|
|
109
|
+
TData = InferSuccessResponse<TContract>,
|
|
95
110
|
> =
|
|
96
111
|
RequiresQueryOptionsArgs<TContract, TProvidedHeaders> extends true
|
|
97
|
-
? [args: ContractUseQueryOptions<TContract, TProvidedHeaders>]
|
|
98
|
-
: [args?: ContractUseQueryOptions<TContract, TProvidedHeaders>];
|
|
112
|
+
? [args: ContractUseQueryOptions<TContract, TProvidedHeaders, TData>]
|
|
113
|
+
: [args?: ContractUseQueryOptions<TContract, TProvidedHeaders, TData>];
|
|
99
114
|
|
|
100
115
|
export type ContractQueryKeyParams<
|
|
101
116
|
TContract extends HttpContractConfig,
|
|
@@ -192,24 +207,48 @@ type DynamicInfiniteQueryArgs<
|
|
|
192
207
|
page?: never;
|
|
193
208
|
};
|
|
194
209
|
|
|
210
|
+
type ContractInfiniteQueryOptionsBase<
|
|
211
|
+
TContract extends HttpContractConfig,
|
|
212
|
+
TPageParam,
|
|
213
|
+
TData,
|
|
214
|
+
> = Omit<
|
|
215
|
+
UseInfiniteQueryOptions<
|
|
216
|
+
InferSuccessResponse<TContract>,
|
|
217
|
+
InferEndpointContractError<TContract>,
|
|
218
|
+
TData,
|
|
219
|
+
QueryKey,
|
|
220
|
+
TPageParam
|
|
221
|
+
>,
|
|
222
|
+
"queryKey" | "queryFn"
|
|
223
|
+
>;
|
|
224
|
+
|
|
195
225
|
type ContractInfiniteQueryOptions<
|
|
196
226
|
TContract extends HttpContractConfig,
|
|
197
227
|
TPageParam,
|
|
198
228
|
TProvidedHeaders extends string,
|
|
229
|
+
TData = InfiniteData<InferSuccessResponse<TContract>, TPageParam>,
|
|
199
230
|
> = (
|
|
200
231
|
| SafeInfiniteQueryArgs<TContract, TPageParam, TProvidedHeaders>
|
|
201
232
|
| DynamicInfiniteQueryArgs<TContract, TPageParam, TProvidedHeaders>
|
|
202
233
|
) &
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
234
|
+
ContractInfiniteQueryOptionsBase<TContract, TPageParam, TData>;
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Infinite query options returned by
|
|
238
|
+
* `ReactQueryContractHelper.infiniteQueryOptions(...)`.
|
|
239
|
+
*
|
|
240
|
+
* `TData` defaults to `InfiniteData` of the raw contract response, so
|
|
241
|
+
* `useInfiniteQuery(...).data.pages` is typed per page, and narrows when the
|
|
242
|
+
* call passes `select`.
|
|
243
|
+
*/
|
|
244
|
+
export type ContractInfiniteQueryOptionsResult<
|
|
245
|
+
TContract extends HttpContractConfig,
|
|
246
|
+
TPageParam,
|
|
247
|
+
TData = InfiniteData<InferSuccessResponse<TContract>, TPageParam>,
|
|
248
|
+
> = ContractInfiniteQueryOptionsBase<TContract, TPageParam, TData> & {
|
|
249
|
+
queryKey: QueryKey;
|
|
250
|
+
queryFn: QueryFunction<InferSuccessResponse<TContract>, QueryKey, TPageParam>;
|
|
251
|
+
};
|
|
213
252
|
|
|
214
253
|
function mergeParamObjects<T>(base?: T, patch?: T): T | undefined {
|
|
215
254
|
if (base == null) return patch;
|
|
@@ -541,13 +580,21 @@ export class ReactQueryContractHelper<
|
|
|
541
580
|
*
|
|
542
581
|
* Pass the result to `useQuery`, `prefetchQuery`, `fetchQuery`, or any API
|
|
543
582
|
* that accepts query options.
|
|
583
|
+
*
|
|
584
|
+
* Pass `select` to narrow the observed data type. The generated `queryFn`
|
|
585
|
+
* still returns and caches the raw contract response.
|
|
544
586
|
*/
|
|
545
|
-
queryOptions(
|
|
546
|
-
...callArgs: ContractQueryOptionsCallArgs<
|
|
547
|
-
|
|
587
|
+
queryOptions<TData = InferSuccessResponse<TContract>>(
|
|
588
|
+
...callArgs: ContractQueryOptionsCallArgs<
|
|
589
|
+
TContract,
|
|
590
|
+
TProvidedHeaders,
|
|
591
|
+
TData
|
|
592
|
+
>
|
|
593
|
+
): ContractQueryOptionsResult<TContract, TData> {
|
|
548
594
|
const args = (callArgs[0] ?? {}) as ContractUseQueryOptions<
|
|
549
595
|
TContract,
|
|
550
|
-
TProvidedHeaders
|
|
596
|
+
TProvidedHeaders,
|
|
597
|
+
TData
|
|
551
598
|
>;
|
|
552
599
|
const { path, query, body, headers, key: customKey, ...rest } = args;
|
|
553
600
|
|
|
@@ -568,7 +615,7 @@ export class ReactQueryContractHelper<
|
|
|
568
615
|
...rest,
|
|
569
616
|
queryKey,
|
|
570
617
|
queryFn,
|
|
571
|
-
} as ContractQueryOptionsResult<TContract>;
|
|
618
|
+
} as ContractQueryOptionsResult<TContract, TData>;
|
|
572
619
|
}
|
|
573
620
|
|
|
574
621
|
/**
|
|
@@ -632,20 +679,33 @@ export class ReactQueryContractHelper<
|
|
|
632
679
|
*
|
|
633
680
|
* Use static `path`/`query` with `page(...)` when page params can be merged
|
|
634
681
|
* into a stable key. Use `params(...)` with an explicit `key` when every page
|
|
635
|
-
* needs fully dynamic args.
|
|
682
|
+
* needs fully dynamic args. For contracts that follow the framework cursor
|
|
683
|
+
* convention, spread `cursorPagination()` instead of writing
|
|
684
|
+
* `initialPageParam`, `getNextPageParam`, and `page(...)` by hand.
|
|
685
|
+
*
|
|
686
|
+
* The observed data defaults to `InfiniteData` of the contract response, so
|
|
687
|
+
* `useInfiniteQuery(...).data.pages` is typed per page. Pass `select` to
|
|
688
|
+
* narrow the observed data type.
|
|
636
689
|
*/
|
|
637
|
-
infiniteQueryOptions<
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
690
|
+
infiniteQueryOptions<
|
|
691
|
+
TPageParam = unknown,
|
|
692
|
+
TData = InfiniteData<InferSuccessResponse<TContract>, TPageParam>,
|
|
693
|
+
>(
|
|
694
|
+
args: ContractInfiniteQueryOptions<
|
|
695
|
+
TContract,
|
|
696
|
+
TPageParam,
|
|
697
|
+
TProvidedHeaders,
|
|
698
|
+
TData
|
|
699
|
+
>,
|
|
700
|
+
): ContractInfiniteQueryOptionsResult<TContract, TPageParam, TData> {
|
|
646
701
|
let queryKey: QueryKey;
|
|
647
702
|
let rest: Omit<
|
|
648
|
-
ContractInfiniteQueryOptions<
|
|
703
|
+
ContractInfiniteQueryOptions<
|
|
704
|
+
TContract,
|
|
705
|
+
TPageParam,
|
|
706
|
+
TProvidedHeaders,
|
|
707
|
+
TData
|
|
708
|
+
>,
|
|
649
709
|
"path" | "query" | "body" | "headers" | "page" | "params" | "key"
|
|
650
710
|
>;
|
|
651
711
|
let resolveParams: (context: {
|
|
@@ -695,12 +755,10 @@ export class ReactQueryContractHelper<
|
|
|
695
755
|
...rest,
|
|
696
756
|
queryKey,
|
|
697
757
|
queryFn,
|
|
698
|
-
} as unknown as
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
QueryKey,
|
|
703
|
-
TPageParam
|
|
758
|
+
} as unknown as ContractInfiniteQueryOptionsResult<
|
|
759
|
+
TContract,
|
|
760
|
+
TPageParam,
|
|
761
|
+
TData
|
|
704
762
|
>;
|
|
705
763
|
}
|
|
706
764
|
|
|
@@ -712,6 +770,45 @@ export class ReactQueryContractHelper<
|
|
|
712
770
|
}
|
|
713
771
|
}
|
|
714
772
|
|
|
773
|
+
/**
|
|
774
|
+
* Infinite-query options for contracts that follow the Beignet cursor
|
|
775
|
+
* pagination convention.
|
|
776
|
+
*
|
|
777
|
+
* Spread the result into `rq(contract).infiniteQueryOptions(...)` when the
|
|
778
|
+
* contract takes an optional `cursor` query param and responds with a
|
|
779
|
+
* `PageResult`-style body whose `page.nextCursor` is `string | null`. The
|
|
780
|
+
* first page is fetched without a cursor, each next page sends
|
|
781
|
+
* `lastPage.page.nextCursor`, and `null` tells TanStack Query there is no
|
|
782
|
+
* next page.
|
|
783
|
+
*
|
|
784
|
+
* ```ts
|
|
785
|
+
* useInfiniteQuery(
|
|
786
|
+
* rq(listIssues).infiniteQueryOptions({
|
|
787
|
+
* query: filters,
|
|
788
|
+
* ...cursorPagination(),
|
|
789
|
+
* }),
|
|
790
|
+
* );
|
|
791
|
+
* ```
|
|
792
|
+
*
|
|
793
|
+
* Type safety is structural: contracts without a `cursor` query param or
|
|
794
|
+
* without `page.nextCursor` in the response fail to typecheck at the spread
|
|
795
|
+
* site. Write `initialPageParam`, `getNextPageParam`, and `page(...)` by hand
|
|
796
|
+
* for contracts that paginate differently.
|
|
797
|
+
*/
|
|
798
|
+
export function cursorPagination(): {
|
|
799
|
+
initialPageParam: string | null;
|
|
800
|
+
getNextPageParam: (lastPage: {
|
|
801
|
+
page: { nextCursor: string | null };
|
|
802
|
+
}) => string | null;
|
|
803
|
+
page: (ctx: { pageParam: string | null }) => { query: { cursor?: string } };
|
|
804
|
+
} {
|
|
805
|
+
return {
|
|
806
|
+
initialPageParam: null,
|
|
807
|
+
getNextPageParam: (lastPage) => lastPage.page.nextCursor,
|
|
808
|
+
page: ({ pageParam }) => ({ query: { cursor: pageParam ?? undefined } }),
|
|
809
|
+
};
|
|
810
|
+
}
|
|
811
|
+
|
|
715
812
|
/**
|
|
716
813
|
* Create a React Query adapter for a Beignet client.
|
|
717
814
|
*
|