@beignet/react-query 0.0.51 → 0.0.53
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 +15 -0
- package/README.md +126 -3
- package/dist/cache.d.ts +34 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +27 -0
- package/dist/cache.js.map +1 -0
- package/dist/index.d.ts +29 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +102 -5
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
- package/skills/client/SKILL.md +26 -1
- package/src/cache.ts +94 -0
- package/src/index.ts +169 -22
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
# @beignet/react-query
|
|
2
2
|
|
|
3
|
+
## 0.0.53
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- faf58ad: Clarify form adapter installation and migration, document TanStack Form UI
|
|
8
|
+
generator restrictions, and correct React Form reference examples.
|
|
9
|
+
- 4df0522: Add typed `cacheEntries` and `updateCachedQueries` helpers with partial parameter matching, and declarative, awaited mutation invalidation. Preserve native query metadata and snapshot success defaults for each executing mutation. Prevent recursive execution of composed mutation defaults. Append an `infinite` segment to generated infinite-query keys so manually seeded and hydrated infinite data stays separate from standard responses; discard persisted infinite caches from the old key format when upgrading. Reserve the `beignet` key prefix for contract data. Require TanStack React Query 5.102 or newer and align generated dependency ranges.
|
|
10
|
+
|
|
11
|
+
## 0.0.52
|
|
12
|
+
|
|
13
|
+
### Patch Changes
|
|
14
|
+
|
|
15
|
+
- b39bb6e: Clarify that Beignet applications require Node.js 22.12 or newer and can use
|
|
16
|
+
npm, pnpm, Yarn, or Bun for package management and framework commands.
|
|
17
|
+
|
|
3
18
|
## 0.0.51
|
|
4
19
|
|
|
5
20
|
## 0.0.50
|
package/README.md
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
# @beignet/react-query
|
|
2
2
|
|
|
3
|
-
> **Runtime:** Beignet requires Node.js 22.12 or newer. Bun
|
|
4
|
-
> supported for Beignet commands.
|
|
3
|
+
> **Runtime:** Beignet requires Node.js 22.12 or newer. Bun is optional.
|
|
5
4
|
|
|
6
5
|
> TanStack Query integration for Beignet
|
|
7
6
|
|
|
@@ -324,6 +323,129 @@ const todosInfiniteQuery = rq(listTodos).infiniteQueryOptions({
|
|
|
324
323
|
});
|
|
325
324
|
```
|
|
326
325
|
|
|
326
|
+
## Typed cache access
|
|
327
|
+
|
|
328
|
+
Use `cacheEntries(queryClient, match?)` to inspect cached standard queries with
|
|
329
|
+
contract-derived response and parameter types:
|
|
330
|
+
|
|
331
|
+
```typescript
|
|
332
|
+
const todos = rq(listTodos);
|
|
333
|
+
const entries = todos.cacheEntries(queryClient);
|
|
334
|
+
|
|
335
|
+
for (const { queryKey, params, data } of entries) {
|
|
336
|
+
// data is the raw listTodos response, or undefined before data is available.
|
|
337
|
+
console.log(queryKey, params, data?.items);
|
|
338
|
+
}
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
`match` uses the same parameter-prefix matching as `filter(...)`. Path, query,
|
|
342
|
+
body, and header objects accept a subset of their top-level fields. For a
|
|
343
|
+
contract with both `workspaceId` and `id` path parameters, pass
|
|
344
|
+
`{ path: { workspaceId } }` to match every ID in that workspace. Actual query
|
|
345
|
+
and mutation requests still require complete parameters.
|
|
346
|
+
|
|
347
|
+
Returned parameters describe normalized cache identity, not complete request
|
|
348
|
+
arguments: nullish path/query fields are omitted, bodies
|
|
349
|
+
use their JSON representation, and headers contain only lowercased names
|
|
350
|
+
explicitly included through `keyHeaders`. Parameter objects are copied so
|
|
351
|
+
editing them cannot change a query key.
|
|
352
|
+
|
|
353
|
+
Update matching existing entries with `updateCachedQueries`:
|
|
354
|
+
|
|
355
|
+
```typescript
|
|
356
|
+
todos.updateCachedQueries(queryClient, {
|
|
357
|
+
update: ({ data }) => {
|
|
358
|
+
if (!data) return undefined;
|
|
359
|
+
return {
|
|
360
|
+
...data,
|
|
361
|
+
items: data.items.map((todo) =>
|
|
362
|
+
todo.id === updatedTodo.id ? { ...todo, ...updatedTodo } : todo,
|
|
363
|
+
),
|
|
364
|
+
};
|
|
365
|
+
},
|
|
366
|
+
});
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
The updater receives `{ queryKey, params, data }` for each entry. It runs
|
|
370
|
+
synchronously against current data, must update immutably, and leaves an entry
|
|
371
|
+
alone when it returns `undefined`. The helper does not create missing entries.
|
|
372
|
+
Applications own list membership, sorting, pagination, optimistic rollback,
|
|
373
|
+
and coordination with in-flight requests.
|
|
374
|
+
|
|
375
|
+
Both helpers recognize standard queries using the contract's generated keys,
|
|
376
|
+
including entries seeded with `setQueryData(helper.key(...), data)`. Store only
|
|
377
|
+
the contract's raw response under these keys. Data is read before an observer's
|
|
378
|
+
`select` transformation. Infinite queries and custom keys are excluded.
|
|
379
|
+
|
|
380
|
+
Standard query keys keep their existing format. Generated infinite-query keys
|
|
381
|
+
append an `"infinite"` segment, so they remain distinct when manually seeded or
|
|
382
|
+
dehydrated and hydrated. Use the `queryKey` returned by `infiniteQueryOptions`
|
|
383
|
+
for direct reads, writes, and exact matching of infinite data. Namespace,
|
|
384
|
+
contract, and parameter-prefix filters still match both query types.
|
|
385
|
+
|
|
386
|
+
When upgrading, discard persisted infinite-query caches created with the old
|
|
387
|
+
key format. The `"beignet"` prefix is reserved: passing a custom `key` with that
|
|
388
|
+
prefix throws. Omit `key` to use a generated key, and use ordinary TanStack
|
|
389
|
+
cache APIs for custom keys and infinite-query data.
|
|
390
|
+
|
|
391
|
+
Beignet does not add query metadata. Global defaults, query-key defaults, and
|
|
392
|
+
explicit `meta` options retain TanStack's normal precedence.
|
|
393
|
+
|
|
394
|
+
## Declarative mutation invalidation
|
|
395
|
+
|
|
396
|
+
Pass `invalidates` to `mutationOptions` to select affected queries from the
|
|
397
|
+
successful response and mutation variables:
|
|
398
|
+
|
|
399
|
+
```typescript
|
|
400
|
+
const mutation = useMutation(
|
|
401
|
+
rq(updateTodo).mutationOptions({
|
|
402
|
+
invalidates: (_todo, variables) => [
|
|
403
|
+
rq(getTodo).filter({ path: variables.path }),
|
|
404
|
+
rq(listTodos).contractFilter(),
|
|
405
|
+
],
|
|
406
|
+
onSuccess: (todo) => {
|
|
407
|
+
// Optional application work runs before invalidation.
|
|
408
|
+
console.log("Saved", todo.id);
|
|
409
|
+
},
|
|
410
|
+
}),
|
|
411
|
+
);
|
|
412
|
+
```
|
|
413
|
+
|
|
414
|
+
The callback returns an array of ordinary TanStack invalidation filters and may
|
|
415
|
+
be asynchronous. An empty array requests no invalidation. Put shared filter
|
|
416
|
+
selection in a feature client function when mutations and realtime events
|
|
417
|
+
should refresh the same queries.
|
|
418
|
+
|
|
419
|
+
Beignet uses the executing mutation's `QueryClient`, waits for its configured
|
|
420
|
+
`onSuccess`, then attempts and awaits every requested invalidation before
|
|
421
|
+
`onSettled`. Client-wide and mutation-key success defaults are honored unless
|
|
422
|
+
overridden in `mutationOptions`. Success defaults are captured when the
|
|
423
|
+
generated mutation function first starts, and retained across retries; changes
|
|
424
|
+
to defaults while that request is pending apply to subsequent invocations.
|
|
425
|
+
|
|
426
|
+
Generated options can be composed and registered with `setMutationDefaults`.
|
|
427
|
+
When composition retains an earlier success wrapper, each wrapper runs its
|
|
428
|
+
invalidation once per mutation invocation, including when defaults refer back
|
|
429
|
+
to the composed options.
|
|
430
|
+
|
|
431
|
+
Default TanStack behavior marks matching queries stale and refetches active
|
|
432
|
+
eligible queries. Failed requests do not run `invalidates`.
|
|
433
|
+
|
|
434
|
+
Invalidation still runs when the configured `onSuccess` throws after a
|
|
435
|
+
successful request. Callback or invalidation failures follow TanStack's
|
|
436
|
+
post-success error handling and do not retry the successful HTTP write;
|
|
437
|
+
multiple failures are reported as an `AggregateError`. Normal TanStack refetch
|
|
438
|
+
error behavior remains in effect.
|
|
439
|
+
|
|
440
|
+
Pass lifecycle callbacks **inside** `mutationOptions({ ... })`. Spreading the
|
|
441
|
+
returned options and replacing `onSuccess` replaces the invalidation wrapper.
|
|
442
|
+
Callbacks passed to `mutate(variables, { onSuccess })` keep TanStack's normal
|
|
443
|
+
per-call behavior and run after the configured success handling.
|
|
444
|
+
|
|
445
|
+
These helpers require TanStack React Query **5.102.0 or newer in the v5 line**.
|
|
446
|
+
The executing client comes from TanStack's mutation callback context. They do
|
|
447
|
+
not add write locks or defer polling and realtime refreshes during mutations.
|
|
448
|
+
|
|
327
449
|
## API reference
|
|
328
450
|
|
|
329
451
|
### `createReactQuery(client, options?)`
|
|
@@ -705,7 +827,8 @@ Hook wrappers have been removed—use the options-first API for all queries and
|
|
|
705
827
|
- [`@beignet/core/contracts`](https://beignetjs.com/contracts) - Core contract definitions
|
|
706
828
|
- [`@beignet/core/client`](https://beignetjs.com/client) - HTTP client
|
|
707
829
|
- [`@beignet/nuqs`](https://beignetjs.com/nuqs) - URL query state integration
|
|
708
|
-
- [`@beignet/react-hook-form`](https://beignetjs.com/react-hook-form) - Form integration
|
|
830
|
+
- [`@beignet/react-hook-form`](https://beignetjs.com/react-hook-form) - React Hook Form integration
|
|
831
|
+
- [`@beignet/react-form`](https://beignetjs.com/react-form) - TanStack Form integration
|
|
709
832
|
|
|
710
833
|
## License
|
|
711
834
|
|
package/dist/cache.d.ts
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { InferBody, InferPathParams, InferQuery, InferSuccessResponse } from "@beignet/core/client";
|
|
2
|
+
import type { HttpContractConfig } from "@beignet/core/contracts";
|
|
3
|
+
import { type Query, type QueryKey } from "@tanstack/react-query";
|
|
4
|
+
import type { ContractQueryKeyParams } from "./index.js";
|
|
5
|
+
type JsonCacheValue<T> = T extends {
|
|
6
|
+
toJSON: (...args: never[]) => infer Value;
|
|
7
|
+
} ? JsonCacheValue<Value> : T extends ((...args: never[]) => unknown) | symbol | bigint ? unknown : T extends readonly unknown[] ? {
|
|
8
|
+
[K in keyof T]: JsonCacheValue<T[K]> | (undefined extends T[K] ? null : never);
|
|
9
|
+
} : T extends object ? {
|
|
10
|
+
[K in keyof T as K extends string ? K : never]: JsonCacheValue<T[K]>;
|
|
11
|
+
} : T;
|
|
12
|
+
/** Normalized cache identity, not a complete set of arguments for a request. */
|
|
13
|
+
export type ContractCacheParams<TContract extends HttpContractConfig> = {
|
|
14
|
+
readonly path?: JsonCacheValue<Partial<NonNullable<InferPathParams<TContract>>>>;
|
|
15
|
+
readonly query?: JsonCacheValue<Partial<NonNullable<InferQuery<TContract>>>>;
|
|
16
|
+
readonly body?: JsonCacheValue<InferBody<TContract>>;
|
|
17
|
+
/** Only explicitly keyed headers, with lowercase names. */
|
|
18
|
+
readonly headers?: Readonly<Record<string, unknown>>;
|
|
19
|
+
};
|
|
20
|
+
/** One standard query using Beignet's generated contract key. */
|
|
21
|
+
export type ContractCacheEntry<TContract extends HttpContractConfig> = {
|
|
22
|
+
readonly queryKey: QueryKey;
|
|
23
|
+
readonly params: ContractCacheParams<TContract>;
|
|
24
|
+
/** The raw contract response, before any observer-level select. */
|
|
25
|
+
readonly data: InferSuccessResponse<TContract> | undefined;
|
|
26
|
+
};
|
|
27
|
+
/** Update existing entries immutably. Returning undefined leaves an entry alone. */
|
|
28
|
+
export type UpdateCachedQueriesOptions<TContract extends HttpContractConfig, TProvidedHeaders extends string = never> = {
|
|
29
|
+
match?: ContractQueryKeyParams<TContract, TProvidedHeaders>;
|
|
30
|
+
update(entry: ContractCacheEntry<TContract>): InferSuccessResponse<TContract> | undefined;
|
|
31
|
+
};
|
|
32
|
+
export declare function readCacheParams<TContract extends HttpContractConfig>(query: Query, contractKey: QueryKey): ContractCacheParams<TContract> | undefined;
|
|
33
|
+
export {};
|
|
34
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,eAAe,EACf,UAAU,EACV,oBAAoB,EACrB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAW,KAAK,KAAK,EAAE,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC3E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEzD,KAAK,cAAc,CAAC,CAAC,IAAI,CAAC,SAAS;IAAE,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,MAAM,KAAK,CAAA;CAAE,GAC5E,cAAc,CAAC,KAAK,CAAC,GACrB,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,OAAO,CAAC,GAAG,MAAM,GAAG,MAAM,GACzD,OAAO,GACP,CAAC,SAAS,SAAS,OAAO,EAAE,GAC1B;KACG,CAAC,IAAI,MAAM,CAAC,GACT,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GACpB,CAAC,SAAS,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,KAAK,CAAC;CAC5C,GACD,CAAC,SAAS,MAAM,GACd;KACG,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,MAAM,GAAG,CAAC,GAAG,KAAK,GAAG,cAAc,CAC5D,CAAC,CAAC,CAAC,CAAC,CACL;CACF,GACD,CAAC,CAAC;AAEZ,gFAAgF;AAChF,MAAM,MAAM,mBAAmB,CAAC,SAAS,SAAS,kBAAkB,IAAI;IACtE,QAAQ,CAAC,IAAI,CAAC,EAAE,cAAc,CAC5B,OAAO,CAAC,WAAW,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,CACjD,CAAC;IACF,QAAQ,CAAC,KAAK,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7E,QAAQ,CAAC,IAAI,CAAC,EAAE,cAAc,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC;IACrD,2DAA2D;IAC3D,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACtD,CAAC;AAEF,iEAAiE;AACjE,MAAM,MAAM,kBAAkB,CAAC,SAAS,SAAS,kBAAkB,IAAI;IACrE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC,SAAS,CAAC,CAAC;IAChD,mEAAmE;IACnE,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC;CAC5D,CAAC;AAEF,oFAAoF;AACpF,MAAM,MAAM,0BAA0B,CACpC,SAAS,SAAS,kBAAkB,EACpC,gBAAgB,SAAS,MAAM,GAAG,KAAK,IACrC;IACF,KAAK,CAAC,EAAE,sBAAsB,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;IAC5D,MAAM,CACJ,KAAK,EAAE,kBAAkB,CAAC,SAAS,CAAC,GACnC,oBAAoB,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC;CAChD,CAAC;AAMF,wBAAgB,eAAe,CAAC,SAAS,SAAS,kBAAkB,EAClE,KAAK,EAAE,KAAK,EACZ,WAAW,EAAE,QAAQ,GACpB,mBAAmB,CAAC,SAAS,CAAC,GAAG,SAAS,CA4B5C"}
|
package/dist/cache.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { hashKey } from "@tanstack/react-query";
|
|
2
|
+
function isRecord(value) {
|
|
3
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
4
|
+
}
|
|
5
|
+
export function readCacheParams(query, contractKey) {
|
|
6
|
+
const { queryKey } = query;
|
|
7
|
+
// Generated infinite keys have an extra suffix, even before TanStack has
|
|
8
|
+
// registered their options (for example, when seeded with setQueryData).
|
|
9
|
+
if (query.queryType === "infinite" ||
|
|
10
|
+
"initialPageParam" in query.options ||
|
|
11
|
+
(queryKey.length !== 4 && queryKey.length !== 5) ||
|
|
12
|
+
hashKey(queryKey.slice(0, 4)) !== hashKey(contractKey))
|
|
13
|
+
return undefined;
|
|
14
|
+
const params = queryKey[4] ?? {};
|
|
15
|
+
if (!isRecord(params) ||
|
|
16
|
+
Object.keys(params).some((key) => !["path", "query", "body", "headers"].includes(key)))
|
|
17
|
+
return undefined;
|
|
18
|
+
// Return the same JSON representation before and after hydration, and do
|
|
19
|
+
// not hand callers a mutable reference to parameters inside the cache key.
|
|
20
|
+
try {
|
|
21
|
+
return JSON.parse(JSON.stringify(params));
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return undefined;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,OAAO,EAA6B,MAAM,uBAAuB,CAAC;AAmD3E,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,KAAY,EACZ,WAAqB;IAErB,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAC3B,yEAAyE;IACzE,yEAAyE;IACzE,IACE,KAAK,CAAC,SAAS,KAAK,UAAU;QAC9B,kBAAkB,IAAI,KAAK,CAAC,OAAO;QACnC,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC;QAChD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,WAAW,CAAC;QAEtD,OAAO,SAAS,CAAC;IAEnB,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACjC,IACE,CAAC,QAAQ,CAAC,MAAM,CAAC;QACjB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CACtB,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAC7D;QAED,OAAO,SAAS,CAAC;IAEnB,yEAAyE;IACzE,2EAA2E;IAC3E,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAmC,CAAC;IAC9E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
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
3
|
import type { InfiniteData, InvalidateQueryFilters, QueryClient, QueryFunction, QueryKey, UseInfiniteQueryOptions, UseMutationOptions, UseQueryOptions } from "@tanstack/react-query";
|
|
4
|
+
import { type ContractCacheEntry, type UpdateCachedQueriesOptions } from "./cache.js";
|
|
5
|
+
export type { ContractCacheEntry, ContractCacheParams, UpdateCachedQueriesOptions, } from "./cache.js";
|
|
4
6
|
type EndpointQueryArgs<TContract extends HttpContractConfig, TProvidedHeaders extends string> = Omit<EndpointCallArgs<TContract, TProvidedHeaders>, "rawBody" | "signal" | "idempotencyKey">;
|
|
5
7
|
type EndpointArgValue<TArgs, TKey extends "path" | "query" | "body" | "headers"> = TKey extends keyof TArgs ? TArgs[TKey] : undefined;
|
|
6
8
|
type IsRequiredValue<T> = undefined extends T ? false : true;
|
|
@@ -28,11 +30,14 @@ export type ContractUseQueryOptions<TContract extends HttpContractConfig, TProvi
|
|
|
28
30
|
key?: readonly unknown[];
|
|
29
31
|
} & ContractQueryOptionsBase<TContract, TData>;
|
|
30
32
|
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>];
|
|
33
|
+
type PartialKeyValue<T> = T extends readonly unknown[] | {
|
|
34
|
+
toJSON: (...args: never[]) => unknown;
|
|
35
|
+
} ? T : T extends object ? Partial<T> : T;
|
|
31
36
|
export type ContractQueryKeyParams<TContract extends HttpContractConfig, TProvidedHeaders extends string = never> = {
|
|
32
|
-
path?: EndpointArgValue<EndpointQueryArgs<TContract, TProvidedHeaders>, "path"
|
|
33
|
-
query?: EndpointArgValue<EndpointQueryArgs<TContract, TProvidedHeaders>, "query"
|
|
34
|
-
body?: EndpointArgValue<EndpointQueryArgs<TContract, TProvidedHeaders>, "body"
|
|
35
|
-
headers?: EndpointArgValue<EndpointQueryArgs<TContract, TProvidedHeaders>, "headers"
|
|
37
|
+
path?: PartialKeyValue<EndpointArgValue<EndpointQueryArgs<TContract, TProvidedHeaders>, "path">>;
|
|
38
|
+
query?: PartialKeyValue<EndpointArgValue<EndpointQueryArgs<TContract, TProvidedHeaders>, "query">>;
|
|
39
|
+
body?: PartialKeyValue<EndpointArgValue<EndpointQueryArgs<TContract, TProvidedHeaders>, "body">>;
|
|
40
|
+
headers?: PartialKeyValue<EndpointArgValue<EndpointQueryArgs<TContract, TProvidedHeaders>, "headers">>;
|
|
36
41
|
};
|
|
37
42
|
/**
|
|
38
43
|
* Options accepted by `ReactQueryContractHelper.mutationOptions(...)`.
|
|
@@ -40,7 +45,13 @@ export type ContractQueryKeyParams<TContract extends HttpContractConfig, TProvid
|
|
|
40
45
|
* TanStack `mutationFn` is generated from the contract endpoint, so callers pass
|
|
41
46
|
* the normal TanStack mutation lifecycle options.
|
|
42
47
|
*/
|
|
43
|
-
export type ContractUseMutationOptions<TContract extends HttpContractConfig, TProvidedHeaders extends string = never> = Omit<UseMutationOptions<InferSuccessResponse<TContract>, InferEndpointContractError<TContract>, EndpointCallArgs<TContract, TProvidedHeaders>, unknown>, "mutationFn"
|
|
48
|
+
export type ContractUseMutationOptions<TContract extends HttpContractConfig, TProvidedHeaders extends string = never> = Omit<UseMutationOptions<InferSuccessResponse<TContract>, InferEndpointContractError<TContract>, EndpointCallArgs<TContract, TProvidedHeaders>, unknown>, "mutationFn"> & {
|
|
49
|
+
/**
|
|
50
|
+
* Queries to invalidate after a successful mutation and its onSuccess callback.
|
|
51
|
+
* Uses the executing mutation's QueryClient and awaits all invalidations.
|
|
52
|
+
*/
|
|
53
|
+
invalidates?: (data: InferSuccessResponse<TContract>, variables: EndpointCallArgs<TContract, TProvidedHeaders>) => readonly InvalidateQueryFilters<QueryKey>[] | Promise<readonly InvalidateQueryFilters<QueryKey>[]>;
|
|
54
|
+
};
|
|
44
55
|
/**
|
|
45
56
|
* Body input for infinite queries.
|
|
46
57
|
*
|
|
@@ -224,6 +235,16 @@ export declare class ReactQueryContractHelper<TContract extends HttpContractConf
|
|
|
224
235
|
* path/query/body params to target a single call or parameter prefix.
|
|
225
236
|
*/
|
|
226
237
|
invalidate(queryClient: QueryClient, params?: ContractQueryKeyParams<TContract, TProvidedHeaders>, options?: ContractQueryFilterOptions): Promise<void>;
|
|
238
|
+
/**
|
|
239
|
+
* Inspect matching standard queries using this contract's generated keys.
|
|
240
|
+
* Skips infinite queries and custom keys.
|
|
241
|
+
*/
|
|
242
|
+
cacheEntries(queryClient: QueryClient, match?: ContractQueryKeyParams<TContract, TProvidedHeaders>): ContractCacheEntry<TContract>[];
|
|
243
|
+
/**
|
|
244
|
+
* Update matching existing standard queries. Does not create entries or
|
|
245
|
+
* coordinate optimistic writes; updaters must return immutable data.
|
|
246
|
+
*/
|
|
247
|
+
updateCachedQueries(queryClient: QueryClient, options: UpdateCachedQueriesOptions<TContract, TProvidedHeaders>): void;
|
|
227
248
|
/**
|
|
228
249
|
* Create query options for TanStack Query.
|
|
229
250
|
*
|
|
@@ -261,6 +282,9 @@ export declare class ReactQueryContractHelper<TContract extends HttpContractConf
|
|
|
261
282
|
* The observed data defaults to `InfiniteData` of the contract response, so
|
|
262
283
|
* `useInfiniteQuery(...).data.pages` is typed per page. Pass `select` to
|
|
263
284
|
* narrow the observed data type.
|
|
285
|
+
*
|
|
286
|
+
* Generated keys append "infinite" to the standard key. Use the returned
|
|
287
|
+
* queryKey for direct cache access; parameter-prefix filters match both.
|
|
264
288
|
*/
|
|
265
289
|
infiniteQueryOptions<TPageParam = unknown, TData = InfiniteData<InferSuccessResponse<TContract>, TPageParam>>(args: ContractInfiniteQueryOptions<TContract, TPageParam, TProvidedHeaders, TData>): ContractInfiniteQueryOptionsResult<TContract, TPageParam, TData>;
|
|
266
290
|
/**
|
|
@@ -319,5 +343,4 @@ export declare function cursorPagination(): {
|
|
|
319
343
|
* persisted caches never store credentials.
|
|
320
344
|
*/
|
|
321
345
|
export declare function createReactQuery<TProvidedHeaders extends string = never>(client: Client<TProvidedHeaders>, options?: CreateReactQueryOptions): <TContractLike extends ContractLike>(contract: TContractLike) => ReactQueryContractHelper<ResolveContract<TContractLike>, TProvidedHeaders>;
|
|
322
|
-
export {};
|
|
323
346
|
//# sourceMappingURL=index.d.ts.map
|
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,YAAY,EACZ,sBAAsB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { resolveContract, } from "@beignet/core/contracts";
|
|
2
|
+
import { readCacheParams, } from "./cache.js";
|
|
2
3
|
function mergeParamObjects(base, patch) {
|
|
3
4
|
if (base == null)
|
|
4
5
|
return patch;
|
|
@@ -37,6 +38,11 @@ function normalizeBodyKeyValue(value) {
|
|
|
37
38
|
}
|
|
38
39
|
const BEIGNET_QUERY_KEY_SCOPE = "beignet";
|
|
39
40
|
const UNNAMESPACED_QUERY_KEY_NAMESPACE = null;
|
|
41
|
+
function assertCustomQueryKey(key) {
|
|
42
|
+
if (key?.[0] === BEIGNET_QUERY_KEY_SCOPE) {
|
|
43
|
+
throw new Error('Custom query keys must not use the reserved "beignet" prefix. Omit key to use the contract-generated key.');
|
|
44
|
+
}
|
|
45
|
+
}
|
|
40
46
|
/**
|
|
41
47
|
* Generated idempotency keys keyed by mutation variables object identity.
|
|
42
48
|
*
|
|
@@ -46,6 +52,9 @@ const UNNAMESPACED_QUERY_KEY_NAMESPACE = null;
|
|
|
46
52
|
* object or an explicit `idempotencyKey` for a distinct logical command.
|
|
47
53
|
*/
|
|
48
54
|
const idempotencyKeyForVariables = new WeakMap();
|
|
55
|
+
// The invocation context survives retries and option updates during React
|
|
56
|
+
// renders, and stays distinct even when concurrent mutations reuse variables.
|
|
57
|
+
const successDefaults = new WeakMap();
|
|
49
58
|
/**
|
|
50
59
|
* Generate an idempotency key that works in non-secure browser contexts.
|
|
51
60
|
* `crypto.randomUUID` is undefined on plain `http://` hosts other than
|
|
@@ -228,6 +237,49 @@ export class ReactQueryContractHelper {
|
|
|
228
237
|
invalidate(queryClient, params, options) {
|
|
229
238
|
return queryClient.invalidateQueries(this.filter(params, options));
|
|
230
239
|
}
|
|
240
|
+
/**
|
|
241
|
+
* Inspect matching standard queries using this contract's generated keys.
|
|
242
|
+
* Skips infinite queries and custom keys.
|
|
243
|
+
*/
|
|
244
|
+
cacheEntries(queryClient, match) {
|
|
245
|
+
return queryClient
|
|
246
|
+
.getQueryCache()
|
|
247
|
+
.findAll(this.filter(match))
|
|
248
|
+
.flatMap((query) => {
|
|
249
|
+
const params = readCacheParams(query, this.contractKey());
|
|
250
|
+
return params === undefined
|
|
251
|
+
? []
|
|
252
|
+
: [
|
|
253
|
+
{
|
|
254
|
+
queryKey: query.queryKey,
|
|
255
|
+
params,
|
|
256
|
+
data: query.state.data,
|
|
257
|
+
},
|
|
258
|
+
];
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Update matching existing standard queries. Does not create entries or
|
|
263
|
+
* coordinate optimistic writes; updaters must return immutable data.
|
|
264
|
+
*/
|
|
265
|
+
updateCachedQueries(queryClient, options) {
|
|
266
|
+
const cache = queryClient.getQueryCache();
|
|
267
|
+
for (const query of cache.findAll(this.filter(options.match))) {
|
|
268
|
+
if (cache.get(query.queryHash) !== query)
|
|
269
|
+
continue;
|
|
270
|
+
const params = readCacheParams(query, this.contractKey());
|
|
271
|
+
if (params === undefined)
|
|
272
|
+
continue;
|
|
273
|
+
const data = options.update({
|
|
274
|
+
queryKey: query.queryKey,
|
|
275
|
+
params,
|
|
276
|
+
data: query.state.data,
|
|
277
|
+
});
|
|
278
|
+
if (data !== undefined && cache.get(query.queryHash) === query) {
|
|
279
|
+
query.setData(data, { manual: true });
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
231
283
|
/**
|
|
232
284
|
* Create query options for TanStack Query.
|
|
233
285
|
*
|
|
@@ -240,6 +292,7 @@ export class ReactQueryContractHelper {
|
|
|
240
292
|
queryOptions(...callArgs) {
|
|
241
293
|
const args = (callArgs[0] ?? {});
|
|
242
294
|
const { path, query, body, headers, key: customKey, ...rest } = args;
|
|
295
|
+
assertCustomQueryKey(customKey);
|
|
243
296
|
const queryKey = (customKey ||
|
|
244
297
|
this.key({ path, query, body, headers }));
|
|
245
298
|
const queryFn = async (context) => {
|
|
@@ -273,7 +326,11 @@ export class ReactQueryContractHelper {
|
|
|
273
326
|
*/
|
|
274
327
|
mutationOptions(args = {}) {
|
|
275
328
|
const hasIdempotencyMetadata = Boolean(this.contract.metadata?.idempotency);
|
|
276
|
-
const mutationFn = async (vars) => {
|
|
329
|
+
const mutationFn = async (vars, context) => {
|
|
330
|
+
if (context && !successDefaults.has(context)) {
|
|
331
|
+
const { onSuccess } = context.client.defaultMutationOptions({ mutationKey: context.mutationKey });
|
|
332
|
+
successDefaults.set(context, onSuccess);
|
|
333
|
+
}
|
|
277
334
|
let idempotencyKey = vars?.idempotencyKey;
|
|
278
335
|
if (!idempotencyKey &&
|
|
279
336
|
hasIdempotencyMetadata &&
|
|
@@ -291,10 +348,43 @@ export class ReactQueryContractHelper {
|
|
|
291
348
|
idempotencyKey,
|
|
292
349
|
});
|
|
293
350
|
};
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
mutationFn
|
|
351
|
+
const { invalidates, ...rest } = args;
|
|
352
|
+
if (!invalidates)
|
|
353
|
+
return { ...rest, mutationFn };
|
|
354
|
+
// Composed defaults can point back to an earlier wrapper. Each wrapper
|
|
355
|
+
// handles an invocation once, even when reached through that cycle.
|
|
356
|
+
const handledInvocations = new WeakSet();
|
|
357
|
+
const onSuccess = async (data, variables, onMutateResult, context) => {
|
|
358
|
+
if (handledInvocations.has(context))
|
|
359
|
+
return;
|
|
360
|
+
handledInvocations.add(context);
|
|
361
|
+
const errors = [];
|
|
362
|
+
try {
|
|
363
|
+
const callback = Object.hasOwn(rest, "onSuccess")
|
|
364
|
+
? rest.onSuccess
|
|
365
|
+
: successDefaults.get(context);
|
|
366
|
+
await callback?.(data, variables, onMutateResult, context);
|
|
367
|
+
}
|
|
368
|
+
catch (error) {
|
|
369
|
+
errors.push(error);
|
|
370
|
+
}
|
|
371
|
+
try {
|
|
372
|
+
const filters = await invalidates(data, variables);
|
|
373
|
+
const results = await Promise.allSettled(filters.map((filter) => Promise.resolve().then(() => context.client.invalidateQueries(filter))));
|
|
374
|
+
for (const result of results) {
|
|
375
|
+
if (result.status === "rejected")
|
|
376
|
+
errors.push(result.reason);
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
catch (error) {
|
|
380
|
+
errors.push(error);
|
|
381
|
+
}
|
|
382
|
+
if (errors.length === 1)
|
|
383
|
+
throw errors[0];
|
|
384
|
+
if (errors.length > 1)
|
|
385
|
+
throw new AggregateError(errors, `Post-success handling failed for ${this.name}.`);
|
|
297
386
|
};
|
|
387
|
+
return { ...rest, mutationFn, onSuccess };
|
|
298
388
|
}
|
|
299
389
|
/**
|
|
300
390
|
* Create infinite query options for TanStack Query.
|
|
@@ -308,8 +398,12 @@ export class ReactQueryContractHelper {
|
|
|
308
398
|
* The observed data defaults to `InfiniteData` of the contract response, so
|
|
309
399
|
* `useInfiniteQuery(...).data.pages` is typed per page. Pass `select` to
|
|
310
400
|
* narrow the observed data type.
|
|
401
|
+
*
|
|
402
|
+
* Generated keys append "infinite" to the standard key. Use the returned
|
|
403
|
+
* queryKey for direct cache access; parameter-prefix filters match both.
|
|
311
404
|
*/
|
|
312
405
|
infiniteQueryOptions(args) {
|
|
406
|
+
assertCustomQueryKey(args.key);
|
|
313
407
|
let queryKey;
|
|
314
408
|
let rest;
|
|
315
409
|
let resolveParams;
|
|
@@ -324,7 +418,10 @@ export class ReactQueryContractHelper {
|
|
|
324
418
|
}
|
|
325
419
|
else {
|
|
326
420
|
const { path, query, body, headers, page, key, ...other } = args;
|
|
327
|
-
queryKey =
|
|
421
|
+
queryKey = key || [
|
|
422
|
+
...this.key({ path, query, body, headers }),
|
|
423
|
+
"infinite",
|
|
424
|
+
];
|
|
328
425
|
rest = other;
|
|
329
426
|
resolveParams = (context) => {
|
|
330
427
|
const pageParams = page?.(context);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAUA,OAAO,EAIL,eAAe,GAChB,MAAM,yBAAyB,CAAC;AAajC,OAAO,EAEL,eAAe,GAEhB,MAAM,YAAY,CAAC;AAuPpB,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,0BAA0B,CAAC,KAAc;IAChD,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,SAAS,qBAAqB,CAAC,KAAc;IAC3C,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAE1C,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACzC,OAAO,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,uBAAuB,GAAG,SAAS,CAAC;AAC1C,MAAM,gCAAgC,GAAG,IAAI,CAAC;AAE9C,SAAS,oBAAoB,CAAC,GAAyB;IACrD,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,uBAAuB,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CACb,2GAA2G,CAC5G,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,0BAA0B,GAAG,IAAI,OAAO,EAAkB,CAAC;AAEjE,0EAA0E;AAC1E,8EAA8E;AAC9E,MAAM,eAAe,GAAG,IAAI,OAAO,EAGhC,CAAC;AAEJ;;;;;;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;;;;;;;;;;;;;OAaG;IACH,GAAG,CAAC,MAKH;QACC,MAAM,IAAI,GAAG,0BAA0B,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,0BAA0B,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACxD,MAAM,IAAI,GAAG,qBAAqB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,0BAA0B,CACxC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CACrC,CAAC;QAEF,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;;;OAGG;IACH,YAAY,CACV,WAAwB,EACxB,KAA2D;QAE3D,OAAO,WAAW;aACf,aAAa,EAAE;aACf,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;aAC3B,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YACjB,MAAM,MAAM,GAAG,eAAe,CAAY,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YACrE,OAAO,MAAM,KAAK,SAAS;gBACzB,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC;oBACE;wBACE,QAAQ,EAAE,KAAK,CAAC,QAAQ;wBACxB,MAAM;wBACN,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,IAEL;qBACd;iBACF,CAAC;QACR,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;;OAGG;IACH,mBAAmB,CACjB,WAAwB,EACxB,OAAgE;QAEhE,MAAM,KAAK,GAAG,WAAW,CAAC,aAAa,EAAE,CAAC;QAC1C,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YAC9D,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,KAAK;gBAAE,SAAS;YACnD,MAAM,MAAM,GAAG,eAAe,CAAY,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YACrE,IAAI,MAAM,KAAK,SAAS;gBAAE,SAAS;YACnC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;gBAC1B,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,MAAM;gBACN,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,IAAmD;aACtE,CAAC,CAAC;YACH,IAAI,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,KAAK,EAAE,CAAC;gBAC/D,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;IACH,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;QACrE,oBAAoB,CAAC,SAAS,CAAC,CAAC;QAEhC,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;;;;;;;;;;;;;OAaG;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,OAAiC,EACjC,EAAE;YACF,IAAI,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC7C,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,sBAAsB,CAEzD,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;gBACxC,eAAe,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YAC1C,CAAC;YACD,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,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;QACtC,IAAI,CAAC,WAAW;YAAE,OAAO,EAAE,GAAG,IAAI,EAAE,UAAU,EAAE,CAAC;QAIjD,uEAAuE;QACvE,oEAAoE;QACpE,MAAM,kBAAkB,GAAG,IAAI,OAAO,EAA2B,CAAC;QAClE,MAAM,SAAS,GAAoB,KAAK,EACtC,IAAI,EACJ,SAAS,EACT,cAAc,EACd,OAAO,EACP,EAAE;YACF,IAAI,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC;gBAAE,OAAO;YAC5C,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAChC,MAAM,MAAM,GAAc,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC;oBAC/C,CAAC,CAAC,IAAI,CAAC,SAAS;oBAChB,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBACjC,MAAM,QAAQ,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;YAC7D,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;gBACnD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CACtC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CACrB,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAC1B,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,CACzC,CACF,CACF,CAAC;gBACF,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;oBAC7B,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU;wBAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAC/D,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC;YACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;gBAAE,MAAM,MAAM,CAAC,CAAC,CAAC,CAAC;YACzC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;gBACnB,MAAM,IAAI,cAAc,CACtB,MAAM,EACN,oCAAoC,IAAI,CAAC,IAAI,GAAG,CACjD,CAAC;QACN,CAAC,CAAC;QACF,OAAO,EAAE,GAAG,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;IAC5C,CAAC;IAED;;;;;;;;;;;;;;;OAeG;IACH,oBAAoB,CAIlB,IAKC;QAED,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/B,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,GAAG,IAAI;gBAChB,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;gBAC3C,UAAU;aACX,CAAC;YACF,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
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@beignet/react-query",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.53",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "TanStack Query integration for Beignet",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -57,15 +57,15 @@
|
|
|
57
57
|
},
|
|
58
58
|
"peerDependencies": {
|
|
59
59
|
"@beignet/core": ">=0.0.3 <1.0.0",
|
|
60
|
-
"@tanstack/react-query": "^5.
|
|
60
|
+
"@tanstack/react-query": "^5.102.0",
|
|
61
61
|
"react": "^18.0.0 || ^19.0.0"
|
|
62
62
|
},
|
|
63
63
|
"devDependencies": {
|
|
64
64
|
"@beignet/core": "*",
|
|
65
|
-
"@tanstack/react-query": "^5.
|
|
65
|
+
"@tanstack/react-query": "^5.102.0",
|
|
66
66
|
"@testing-library/dom": "^9.3.4",
|
|
67
67
|
"@testing-library/react": "^14.3.1",
|
|
68
|
-
"@types/bun": "^1.
|
|
68
|
+
"@types/bun": "^1.4.0",
|
|
69
69
|
"@types/node": "^22.0.0",
|
|
70
70
|
"@types/react": "^18.2.0",
|
|
71
71
|
"happy-dom": "^20.8.9",
|
package/skills/client/SKILL.md
CHANGED
|
@@ -118,9 +118,34 @@ Call server behavior through Beignet contracts and typed clients.
|
|
|
118
118
|
filters.
|
|
119
119
|
- Generated keys omit nullish path, query, and opted-in header entries, but
|
|
120
120
|
preserve JSON body `null` values and empty objects. Reuse generated keys so
|
|
121
|
-
distinct request bodies do not share cache entries.
|
|
121
|
+
distinct request bodies do not share cache entries. Infinite-query keys
|
|
122
|
+
append an `"infinite"` segment; use `infiniteQueryOptions(...).queryKey` for
|
|
123
|
+
direct infinite-cache reads, writes, and exact matching. Prefix filters
|
|
124
|
+
still match both query types. Discard persisted infinite caches from the old
|
|
125
|
+
key format when upgrading.
|
|
122
126
|
- Use `rq(contract).invalidate(queryClient, params?, options?)` or the app's
|
|
123
127
|
existing key helper after successful mutations.
|
|
128
|
+
- Use `rq(contract).cacheEntries(queryClient, match?)` for typed standard-query
|
|
129
|
+
data and normalized key parameters, and `updateCachedQueries(queryClient,
|
|
130
|
+
{ match, update })` for immutable updates of existing entries. Returning
|
|
131
|
+
`undefined` skips an update. Match objects accept partial path, query, body,
|
|
132
|
+
and header fields. These helpers recognize generated keys, including entries
|
|
133
|
+
seeded with `setQueryData(helper.key(...), data)`; keep the data in the raw
|
|
134
|
+
contract response shape. Infinite queries and custom keys are excluded.
|
|
135
|
+
Custom keys must not use the reserved `"beignet"` prefix. Native query metadata
|
|
136
|
+
defaults remain intact. Keep sorting, list membership, optimistic rollback,
|
|
137
|
+
and request coordination app-owned.
|
|
138
|
+
- Use `mutationOptions({ invalidates: (data, variables) => filters })` for
|
|
139
|
+
declarative success invalidation. Filters may be selected asynchronously.
|
|
140
|
+
Beignet runs and awaits configured `onSuccess`, then all invalidations on
|
|
141
|
+
the executing QueryClient, including when `onSuccess` throws. Success defaults
|
|
142
|
+
are captured when the generated mutation function first starts and remain
|
|
143
|
+
stable across retries and changes to defaults during the request. It does not
|
|
144
|
+
retry a successful write when post-success handling fails. Pass callbacks
|
|
145
|
+
inside `mutationOptions`; replacing the returned `onSuccess` bypasses this
|
|
146
|
+
handling. Composed options can be registered with `setMutationDefaults`;
|
|
147
|
+
each retained success wrapper invalidates once per mutation invocation.
|
|
148
|
+
The integration requires TanStack React Query 5.102+ in v5.
|
|
124
149
|
- If the app configures `createReactQuery(apiClient, { keyHeaders })`, preserve
|
|
125
150
|
that when adding helpers so tenant or header-scoped caches stay distinct.
|
|
126
151
|
- Contracts with idempotency metadata get one generated idempotency key per
|
package/src/cache.ts
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
InferBody,
|
|
3
|
+
InferPathParams,
|
|
4
|
+
InferQuery,
|
|
5
|
+
InferSuccessResponse,
|
|
6
|
+
} from "@beignet/core/client";
|
|
7
|
+
import type { HttpContractConfig } from "@beignet/core/contracts";
|
|
8
|
+
import { hashKey, type Query, type QueryKey } from "@tanstack/react-query";
|
|
9
|
+
import type { ContractQueryKeyParams } from "./index.js";
|
|
10
|
+
|
|
11
|
+
type JsonCacheValue<T> = T extends { toJSON: (...args: never[]) => infer Value }
|
|
12
|
+
? JsonCacheValue<Value>
|
|
13
|
+
: T extends ((...args: never[]) => unknown) | symbol | bigint
|
|
14
|
+
? unknown
|
|
15
|
+
: T extends readonly unknown[]
|
|
16
|
+
? {
|
|
17
|
+
[K in keyof T]:
|
|
18
|
+
| JsonCacheValue<T[K]>
|
|
19
|
+
| (undefined extends T[K] ? null : never);
|
|
20
|
+
}
|
|
21
|
+
: T extends object
|
|
22
|
+
? {
|
|
23
|
+
[K in keyof T as K extends string ? K : never]: JsonCacheValue<
|
|
24
|
+
T[K]
|
|
25
|
+
>;
|
|
26
|
+
}
|
|
27
|
+
: T;
|
|
28
|
+
|
|
29
|
+
/** Normalized cache identity, not a complete set of arguments for a request. */
|
|
30
|
+
export type ContractCacheParams<TContract extends HttpContractConfig> = {
|
|
31
|
+
readonly path?: JsonCacheValue<
|
|
32
|
+
Partial<NonNullable<InferPathParams<TContract>>>
|
|
33
|
+
>;
|
|
34
|
+
readonly query?: JsonCacheValue<Partial<NonNullable<InferQuery<TContract>>>>;
|
|
35
|
+
readonly body?: JsonCacheValue<InferBody<TContract>>;
|
|
36
|
+
/** Only explicitly keyed headers, with lowercase names. */
|
|
37
|
+
readonly headers?: Readonly<Record<string, unknown>>;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
/** One standard query using Beignet's generated contract key. */
|
|
41
|
+
export type ContractCacheEntry<TContract extends HttpContractConfig> = {
|
|
42
|
+
readonly queryKey: QueryKey;
|
|
43
|
+
readonly params: ContractCacheParams<TContract>;
|
|
44
|
+
/** The raw contract response, before any observer-level select. */
|
|
45
|
+
readonly data: InferSuccessResponse<TContract> | undefined;
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
/** Update existing entries immutably. Returning undefined leaves an entry alone. */
|
|
49
|
+
export type UpdateCachedQueriesOptions<
|
|
50
|
+
TContract extends HttpContractConfig,
|
|
51
|
+
TProvidedHeaders extends string = never,
|
|
52
|
+
> = {
|
|
53
|
+
match?: ContractQueryKeyParams<TContract, TProvidedHeaders>;
|
|
54
|
+
update(
|
|
55
|
+
entry: ContractCacheEntry<TContract>,
|
|
56
|
+
): InferSuccessResponse<TContract> | undefined;
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
60
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export function readCacheParams<TContract extends HttpContractConfig>(
|
|
64
|
+
query: Query,
|
|
65
|
+
contractKey: QueryKey,
|
|
66
|
+
): ContractCacheParams<TContract> | undefined {
|
|
67
|
+
const { queryKey } = query;
|
|
68
|
+
// Generated infinite keys have an extra suffix, even before TanStack has
|
|
69
|
+
// registered their options (for example, when seeded with setQueryData).
|
|
70
|
+
if (
|
|
71
|
+
query.queryType === "infinite" ||
|
|
72
|
+
"initialPageParam" in query.options ||
|
|
73
|
+
(queryKey.length !== 4 && queryKey.length !== 5) ||
|
|
74
|
+
hashKey(queryKey.slice(0, 4)) !== hashKey(contractKey)
|
|
75
|
+
)
|
|
76
|
+
return undefined;
|
|
77
|
+
|
|
78
|
+
const params = queryKey[4] ?? {};
|
|
79
|
+
if (
|
|
80
|
+
!isRecord(params) ||
|
|
81
|
+
Object.keys(params).some(
|
|
82
|
+
(key) => !["path", "query", "body", "headers"].includes(key),
|
|
83
|
+
)
|
|
84
|
+
)
|
|
85
|
+
return undefined;
|
|
86
|
+
|
|
87
|
+
// Return the same JSON representation before and after hydration, and do
|
|
88
|
+
// not hand callers a mutable reference to parameters inside the cache key.
|
|
89
|
+
try {
|
|
90
|
+
return JSON.parse(JSON.stringify(params)) as ContractCacheParams<TContract>;
|
|
91
|
+
} catch {
|
|
92
|
+
return undefined;
|
|
93
|
+
}
|
|
94
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -18,6 +18,7 @@ import {
|
|
|
18
18
|
import type {
|
|
19
19
|
InfiniteData,
|
|
20
20
|
InvalidateQueryFilters,
|
|
21
|
+
MutationFunctionContext,
|
|
21
22
|
QueryClient,
|
|
22
23
|
QueryFunction,
|
|
23
24
|
QueryKey,
|
|
@@ -25,6 +26,17 @@ import type {
|
|
|
25
26
|
UseMutationOptions,
|
|
26
27
|
UseQueryOptions,
|
|
27
28
|
} from "@tanstack/react-query";
|
|
29
|
+
import {
|
|
30
|
+
type ContractCacheEntry,
|
|
31
|
+
readCacheParams,
|
|
32
|
+
type UpdateCachedQueriesOptions,
|
|
33
|
+
} from "./cache.js";
|
|
34
|
+
|
|
35
|
+
export type {
|
|
36
|
+
ContractCacheEntry,
|
|
37
|
+
ContractCacheParams,
|
|
38
|
+
UpdateCachedQueriesOptions,
|
|
39
|
+
} from "./cache.js";
|
|
28
40
|
|
|
29
41
|
type EndpointQueryArgs<
|
|
30
42
|
TContract extends HttpContractConfig,
|
|
@@ -112,25 +124,29 @@ type ContractQueryOptionsCallArgs<
|
|
|
112
124
|
? [args: ContractUseQueryOptions<TContract, TProvidedHeaders, TData>]
|
|
113
125
|
: [args?: ContractUseQueryOptions<TContract, TProvidedHeaders, TData>];
|
|
114
126
|
|
|
127
|
+
type PartialKeyValue<T> = T extends
|
|
128
|
+
| readonly unknown[]
|
|
129
|
+
| { toJSON: (...args: never[]) => unknown }
|
|
130
|
+
? T
|
|
131
|
+
: T extends object
|
|
132
|
+
? Partial<T>
|
|
133
|
+
: T;
|
|
134
|
+
|
|
115
135
|
export type ContractQueryKeyParams<
|
|
116
136
|
TContract extends HttpContractConfig,
|
|
117
137
|
TProvidedHeaders extends string = never,
|
|
118
138
|
> = {
|
|
119
|
-
path?:
|
|
120
|
-
EndpointQueryArgs<TContract, TProvidedHeaders>,
|
|
121
|
-
"path"
|
|
139
|
+
path?: PartialKeyValue<
|
|
140
|
+
EndpointArgValue<EndpointQueryArgs<TContract, TProvidedHeaders>, "path">
|
|
122
141
|
>;
|
|
123
|
-
query?:
|
|
124
|
-
EndpointQueryArgs<TContract, TProvidedHeaders>,
|
|
125
|
-
"query"
|
|
142
|
+
query?: PartialKeyValue<
|
|
143
|
+
EndpointArgValue<EndpointQueryArgs<TContract, TProvidedHeaders>, "query">
|
|
126
144
|
>;
|
|
127
|
-
body?:
|
|
128
|
-
EndpointQueryArgs<TContract, TProvidedHeaders>,
|
|
129
|
-
"body"
|
|
145
|
+
body?: PartialKeyValue<
|
|
146
|
+
EndpointArgValue<EndpointQueryArgs<TContract, TProvidedHeaders>, "body">
|
|
130
147
|
>;
|
|
131
|
-
headers?:
|
|
132
|
-
EndpointQueryArgs<TContract, TProvidedHeaders>,
|
|
133
|
-
"headers"
|
|
148
|
+
headers?: PartialKeyValue<
|
|
149
|
+
EndpointArgValue<EndpointQueryArgs<TContract, TProvidedHeaders>, "headers">
|
|
134
150
|
>;
|
|
135
151
|
};
|
|
136
152
|
|
|
@@ -151,7 +167,18 @@ export type ContractUseMutationOptions<
|
|
|
151
167
|
unknown
|
|
152
168
|
>,
|
|
153
169
|
"mutationFn"
|
|
154
|
-
|
|
170
|
+
> & {
|
|
171
|
+
/**
|
|
172
|
+
* Queries to invalidate after a successful mutation and its onSuccess callback.
|
|
173
|
+
* Uses the executing mutation's QueryClient and awaits all invalidations.
|
|
174
|
+
*/
|
|
175
|
+
invalidates?: (
|
|
176
|
+
data: InferSuccessResponse<TContract>,
|
|
177
|
+
variables: EndpointCallArgs<TContract, TProvidedHeaders>,
|
|
178
|
+
) =>
|
|
179
|
+
| readonly InvalidateQueryFilters<QueryKey>[]
|
|
180
|
+
| Promise<readonly InvalidateQueryFilters<QueryKey>[]>;
|
|
181
|
+
};
|
|
155
182
|
|
|
156
183
|
/**
|
|
157
184
|
* Body input for infinite queries.
|
|
@@ -296,6 +323,14 @@ function normalizeBodyKeyValue(value: unknown): unknown | undefined {
|
|
|
296
323
|
const BEIGNET_QUERY_KEY_SCOPE = "beignet";
|
|
297
324
|
const UNNAMESPACED_QUERY_KEY_NAMESPACE = null;
|
|
298
325
|
|
|
326
|
+
function assertCustomQueryKey(key: QueryKey | undefined): void {
|
|
327
|
+
if (key?.[0] === BEIGNET_QUERY_KEY_SCOPE) {
|
|
328
|
+
throw new Error(
|
|
329
|
+
'Custom query keys must not use the reserved "beignet" prefix. Omit key to use the contract-generated key.',
|
|
330
|
+
);
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
|
|
299
334
|
/**
|
|
300
335
|
* Generated idempotency keys keyed by mutation variables object identity.
|
|
301
336
|
*
|
|
@@ -306,6 +341,13 @@ const UNNAMESPACED_QUERY_KEY_NAMESPACE = null;
|
|
|
306
341
|
*/
|
|
307
342
|
const idempotencyKeyForVariables = new WeakMap<object, string>();
|
|
308
343
|
|
|
344
|
+
// The invocation context survives retries and option updates during React
|
|
345
|
+
// renders, and stays distinct even when concurrent mutations reuse variables.
|
|
346
|
+
const successDefaults = new WeakMap<
|
|
347
|
+
MutationFunctionContext,
|
|
348
|
+
UseMutationOptions<unknown, unknown, unknown, unknown>["onSuccess"]
|
|
349
|
+
>();
|
|
350
|
+
|
|
309
351
|
/**
|
|
310
352
|
* Generate an idempotency key that works in non-secure browser contexts.
|
|
311
353
|
* `crypto.randomUUID` is undefined on plain `http://` hosts other than
|
|
@@ -586,6 +628,57 @@ export class ReactQueryContractHelper<
|
|
|
586
628
|
return queryClient.invalidateQueries(this.filter(params, options));
|
|
587
629
|
}
|
|
588
630
|
|
|
631
|
+
/**
|
|
632
|
+
* Inspect matching standard queries using this contract's generated keys.
|
|
633
|
+
* Skips infinite queries and custom keys.
|
|
634
|
+
*/
|
|
635
|
+
cacheEntries(
|
|
636
|
+
queryClient: QueryClient,
|
|
637
|
+
match?: ContractQueryKeyParams<TContract, TProvidedHeaders>,
|
|
638
|
+
): ContractCacheEntry<TContract>[] {
|
|
639
|
+
return queryClient
|
|
640
|
+
.getQueryCache()
|
|
641
|
+
.findAll(this.filter(match))
|
|
642
|
+
.flatMap((query) => {
|
|
643
|
+
const params = readCacheParams<TContract>(query, this.contractKey());
|
|
644
|
+
return params === undefined
|
|
645
|
+
? []
|
|
646
|
+
: [
|
|
647
|
+
{
|
|
648
|
+
queryKey: query.queryKey,
|
|
649
|
+
params,
|
|
650
|
+
data: query.state.data as
|
|
651
|
+
| InferSuccessResponse<TContract>
|
|
652
|
+
| undefined,
|
|
653
|
+
},
|
|
654
|
+
];
|
|
655
|
+
});
|
|
656
|
+
}
|
|
657
|
+
|
|
658
|
+
/**
|
|
659
|
+
* Update matching existing standard queries. Does not create entries or
|
|
660
|
+
* coordinate optimistic writes; updaters must return immutable data.
|
|
661
|
+
*/
|
|
662
|
+
updateCachedQueries(
|
|
663
|
+
queryClient: QueryClient,
|
|
664
|
+
options: UpdateCachedQueriesOptions<TContract, TProvidedHeaders>,
|
|
665
|
+
): void {
|
|
666
|
+
const cache = queryClient.getQueryCache();
|
|
667
|
+
for (const query of cache.findAll(this.filter(options.match))) {
|
|
668
|
+
if (cache.get(query.queryHash) !== query) continue;
|
|
669
|
+
const params = readCacheParams<TContract>(query, this.contractKey());
|
|
670
|
+
if (params === undefined) continue;
|
|
671
|
+
const data = options.update({
|
|
672
|
+
queryKey: query.queryKey,
|
|
673
|
+
params,
|
|
674
|
+
data: query.state.data as InferSuccessResponse<TContract> | undefined,
|
|
675
|
+
});
|
|
676
|
+
if (data !== undefined && cache.get(query.queryHash) === query) {
|
|
677
|
+
query.setData(data, { manual: true });
|
|
678
|
+
}
|
|
679
|
+
}
|
|
680
|
+
}
|
|
681
|
+
|
|
589
682
|
/**
|
|
590
683
|
* Create query options for TanStack Query.
|
|
591
684
|
*
|
|
@@ -608,6 +701,7 @@ export class ReactQueryContractHelper<
|
|
|
608
701
|
TData
|
|
609
702
|
>;
|
|
610
703
|
const { path, query, body, headers, key: customKey, ...rest } = args;
|
|
704
|
+
assertCustomQueryKey(customKey);
|
|
611
705
|
|
|
612
706
|
const queryKey = (customKey ||
|
|
613
707
|
this.key({ path, query, body, headers })) as QueryKey;
|
|
@@ -654,7 +748,14 @@ export class ReactQueryContractHelper<
|
|
|
654
748
|
const hasIdempotencyMetadata = Boolean(this.contract.metadata?.idempotency);
|
|
655
749
|
const mutationFn = async (
|
|
656
750
|
vars: EndpointCallArgs<TContract, TProvidedHeaders>,
|
|
751
|
+
context?: MutationFunctionContext,
|
|
657
752
|
) => {
|
|
753
|
+
if (context && !successDefaults.has(context)) {
|
|
754
|
+
const { onSuccess } = context.client.defaultMutationOptions<
|
|
755
|
+
UseMutationOptions<unknown, unknown, unknown, unknown>
|
|
756
|
+
>({ mutationKey: context.mutationKey });
|
|
757
|
+
successDefaults.set(context, onSuccess);
|
|
758
|
+
}
|
|
658
759
|
let idempotencyKey = vars?.idempotencyKey;
|
|
659
760
|
if (
|
|
660
761
|
!idempotencyKey &&
|
|
@@ -675,15 +776,54 @@ export class ReactQueryContractHelper<
|
|
|
675
776
|
} as EndpointCallArgs<TContract, TProvidedHeaders>);
|
|
676
777
|
};
|
|
677
778
|
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
InferSuccessResponse<TContract>,
|
|
683
|
-
InferEndpointContractError<TContract>,
|
|
684
|
-
EndpointCallArgs<TContract, TProvidedHeaders>,
|
|
685
|
-
unknown
|
|
779
|
+
const { invalidates, ...rest } = args;
|
|
780
|
+
if (!invalidates) return { ...rest, mutationFn };
|
|
781
|
+
type SuccessCallback = NonNullable<
|
|
782
|
+
ContractUseMutationOptions<TContract, TProvidedHeaders>["onSuccess"]
|
|
686
783
|
>;
|
|
784
|
+
// Composed defaults can point back to an earlier wrapper. Each wrapper
|
|
785
|
+
// handles an invocation once, even when reached through that cycle.
|
|
786
|
+
const handledInvocations = new WeakSet<MutationFunctionContext>();
|
|
787
|
+
const onSuccess: SuccessCallback = async (
|
|
788
|
+
data,
|
|
789
|
+
variables,
|
|
790
|
+
onMutateResult,
|
|
791
|
+
context,
|
|
792
|
+
) => {
|
|
793
|
+
if (handledInvocations.has(context)) return;
|
|
794
|
+
handledInvocations.add(context);
|
|
795
|
+
const errors: unknown[] = [];
|
|
796
|
+
try {
|
|
797
|
+
const callback = Object.hasOwn(rest, "onSuccess")
|
|
798
|
+
? rest.onSuccess
|
|
799
|
+
: successDefaults.get(context);
|
|
800
|
+
await callback?.(data, variables, onMutateResult, context);
|
|
801
|
+
} catch (error) {
|
|
802
|
+
errors.push(error);
|
|
803
|
+
}
|
|
804
|
+
try {
|
|
805
|
+
const filters = await invalidates(data, variables);
|
|
806
|
+
const results = await Promise.allSettled(
|
|
807
|
+
filters.map((filter) =>
|
|
808
|
+
Promise.resolve().then(() =>
|
|
809
|
+
context.client.invalidateQueries(filter),
|
|
810
|
+
),
|
|
811
|
+
),
|
|
812
|
+
);
|
|
813
|
+
for (const result of results) {
|
|
814
|
+
if (result.status === "rejected") errors.push(result.reason);
|
|
815
|
+
}
|
|
816
|
+
} catch (error) {
|
|
817
|
+
errors.push(error);
|
|
818
|
+
}
|
|
819
|
+
if (errors.length === 1) throw errors[0];
|
|
820
|
+
if (errors.length > 1)
|
|
821
|
+
throw new AggregateError(
|
|
822
|
+
errors,
|
|
823
|
+
`Post-success handling failed for ${this.name}.`,
|
|
824
|
+
);
|
|
825
|
+
};
|
|
826
|
+
return { ...rest, mutationFn, onSuccess };
|
|
687
827
|
}
|
|
688
828
|
|
|
689
829
|
/**
|
|
@@ -698,6 +838,9 @@ export class ReactQueryContractHelper<
|
|
|
698
838
|
* The observed data defaults to `InfiniteData` of the contract response, so
|
|
699
839
|
* `useInfiniteQuery(...).data.pages` is typed per page. Pass `select` to
|
|
700
840
|
* narrow the observed data type.
|
|
841
|
+
*
|
|
842
|
+
* Generated keys append "infinite" to the standard key. Use the returned
|
|
843
|
+
* queryKey for direct cache access; parameter-prefix filters match both.
|
|
701
844
|
*/
|
|
702
845
|
infiniteQueryOptions<
|
|
703
846
|
TPageParam = unknown,
|
|
@@ -710,6 +853,7 @@ export class ReactQueryContractHelper<
|
|
|
710
853
|
TData
|
|
711
854
|
>,
|
|
712
855
|
): ContractInfiniteQueryOptionsResult<TContract, TPageParam, TData> {
|
|
856
|
+
assertCustomQueryKey(args.key);
|
|
713
857
|
let queryKey: QueryKey;
|
|
714
858
|
let rest: Omit<
|
|
715
859
|
ContractInfiniteQueryOptions<
|
|
@@ -736,7 +880,10 @@ export class ReactQueryContractHelper<
|
|
|
736
880
|
resolveParams = params;
|
|
737
881
|
} else {
|
|
738
882
|
const { path, query, body, headers, page, key, ...other } = args;
|
|
739
|
-
queryKey =
|
|
883
|
+
queryKey = key || [
|
|
884
|
+
...this.key({ path, query, body, headers }),
|
|
885
|
+
"infinite",
|
|
886
|
+
];
|
|
740
887
|
rest = other;
|
|
741
888
|
resolveParams = (context) => {
|
|
742
889
|
const pageParams = page?.(context);
|