@nkzw/fate 1.0.0 → 1.0.1

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.
Files changed (150) hide show
  1. package/README.md +98 -29
  2. package/docs/api/classes/FateClient.md +36 -36
  3. package/docs/api/functions/clientRoot.md +1 -1
  4. package/docs/api/functions/createClient.md +1 -1
  5. package/docs/api/functions/createHTTPTransport.md +1 -1
  6. package/docs/api/functions/createTRPCTransport.md +1 -1
  7. package/docs/api/functions/getListEntries.md +1 -1
  8. package/docs/api/functions/getSelectionPlan.md +1 -1
  9. package/docs/api/functions/isRecord.md +1 -1
  10. package/docs/api/functions/isViewTag.md +1 -1
  11. package/docs/api/functions/liveConnectionTopic.md +1 -1
  12. package/docs/api/functions/liveEntityTopic.md +1 -1
  13. package/docs/api/functions/liveGlobalConnectionTopic.md +1 -1
  14. package/docs/api/functions/mutation.md +1 -1
  15. package/docs/api/functions/toEntityId.md +1 -1
  16. package/docs/api/functions/view.md +1 -1
  17. package/docs/api/interfaces/FateThenable.md +3 -3
  18. package/docs/api/interfaces/Transport.md +7 -7
  19. package/docs/api/server/classes/FateRequestError.md +5 -5
  20. package/docs/api/server/drizzle/functions/createDrizzleFate.md +1 -1
  21. package/docs/api/server/drizzle/functions/createDrizzleSourceAdapter.md +1 -1
  22. package/docs/api/server/drizzle/functions/createDrizzleSourceRegistry.md +1 -1
  23. package/docs/api/server/drizzle/index.md +1 -1
  24. package/docs/api/server/drizzle/type-aliases/DrizzleManyToManyConfig.md +1 -1
  25. package/docs/api/server/drizzle/type-aliases/DrizzleManyToManyInput.md +1 -1
  26. package/docs/api/server/drizzle/type-aliases/DrizzleQueryExtra.md +3 -3
  27. package/docs/api/server/drizzle/type-aliases/DrizzleSourceAdapter.md +9 -9
  28. package/docs/api/server/drizzle/type-aliases/DrizzleViewConfig.md +1 -1
  29. package/docs/api/server/functions/bindSourceProcedures.md +1 -1
  30. package/docs/api/server/functions/computed.md +1 -1
  31. package/docs/api/server/functions/count.md +1 -1
  32. package/docs/api/server/functions/createFateFetchHandler.md +1 -1
  33. package/docs/api/server/functions/createFateServer.md +1 -1
  34. package/docs/api/server/functions/createHonoFateHandler.md +1 -1
  35. package/docs/api/server/functions/createLiveEventBus.md +2 -2
  36. package/docs/api/server/functions/createNestedSourcePlan.md +1 -1
  37. package/docs/api/server/functions/createResolver.md +1 -1
  38. package/docs/api/server/functions/createSourcePlan.md +1 -1
  39. package/docs/api/server/functions/createSourceProcedures.md +2 -2
  40. package/docs/api/server/functions/dataView.md +1 -1
  41. package/docs/api/server/functions/field.md +1 -1
  42. package/docs/api/server/functions/getNestedSelection.md +1 -1
  43. package/docs/api/server/functions/getScopedArgs.md +1 -1
  44. package/docs/api/server/functions/hasNestedSelection.md +1 -1
  45. package/docs/api/server/functions/list.md +1 -1
  46. package/docs/api/server/functions/refetchSourceById.md +1 -1
  47. package/docs/api/server/functions/resolveSourceById.md +1 -1
  48. package/docs/api/server/functions/resolveSourceByIds.md +1 -1
  49. package/docs/api/server/functions/resolveSourceConnection.md +1 -1
  50. package/docs/api/server/functions/resolver.md +1 -1
  51. package/docs/api/server/functions/toPrismaSelect.md +1 -1
  52. package/docs/api/server/functions/withConnection.md +1 -1
  53. package/docs/api/server/prisma/functions/createPrismaFate.md +1 -1
  54. package/docs/api/server/prisma/functions/createPrismaSourceAdapter.md +1 -1
  55. package/docs/api/server/prisma/functions/createPrismaSourceRegistry.md +1 -1
  56. package/docs/api/server/prisma/functions/prismaConnectionArgs.md +1 -1
  57. package/docs/api/server/prisma/index.md +1 -1
  58. package/docs/api/server/prisma/type-aliases/PrismaDelegate.md +4 -4
  59. package/docs/api/server/prisma/type-aliases/PrismaQueryExtra.md +1 -1
  60. package/docs/api/server/prisma/type-aliases/PrismaSourceAdapter.md +9 -9
  61. package/docs/api/server/prisma/type-aliases/PrismaViewConfig.md +1 -1
  62. package/docs/api/server/type-aliases/ComputedField.md +5 -5
  63. package/docs/api/server/type-aliases/ComputedSelection.md +1 -1
  64. package/docs/api/server/type-aliases/ConnectionItem.md +3 -3
  65. package/docs/api/server/type-aliases/ConnectionPagination.md +5 -5
  66. package/docs/api/server/type-aliases/ConnectionResult.md +3 -3
  67. package/docs/api/server/type-aliases/CountSelection.md +4 -4
  68. package/docs/api/server/type-aliases/CountWhere.md +1 -1
  69. package/docs/api/server/type-aliases/DataViewListOptions.md +2 -2
  70. package/docs/api/server/type-aliases/DataViewOrderBy.md +1 -1
  71. package/docs/api/server/type-aliases/DataViewOrderDirection.md +1 -1
  72. package/docs/api/server/type-aliases/DataViewResult.md +1 -1
  73. package/docs/api/server/type-aliases/Entity.md +1 -1
  74. package/docs/api/server/type-aliases/FateServer.md +5 -5
  75. package/docs/api/server/type-aliases/FateServerManifest.md +1 -1
  76. package/docs/api/server/type-aliases/FieldSelection.md +3 -3
  77. package/docs/api/server/type-aliases/LiveConnectionEventType.md +1 -1
  78. package/docs/api/server/type-aliases/LiveConnectionSourceEvent.md +1 -1
  79. package/docs/api/server/type-aliases/LiveEventBus.md +1 -1
  80. package/docs/api/server/type-aliases/LiveEventType.md +1 -1
  81. package/docs/api/server/type-aliases/LiveSourceEvent.md +1 -1
  82. package/docs/api/server/type-aliases/NativeFateAPI.md +4 -4
  83. package/docs/api/server/type-aliases/OrderDirection.md +1 -1
  84. package/docs/api/server/type-aliases/SourceConfig.md +6 -6
  85. package/docs/api/server/type-aliases/SourceDefinition.md +6 -6
  86. package/docs/api/server/type-aliases/SourceOrder.md +1 -1
  87. package/docs/api/server/type-aliases/SourceOrderField.md +3 -3
  88. package/docs/api/server/type-aliases/SourcePlan.md +1 -1
  89. package/docs/api/server/type-aliases/SourcePlanNode.md +1 -1
  90. package/docs/api/server/type-aliases/SourceRegistry.md +1 -1
  91. package/docs/api/server/type-aliases/SourceRelation.md +1 -1
  92. package/docs/api/server/type-aliases/SourceRelationConfig.md +1 -1
  93. package/docs/api/server/variables/byIdInput.md +1 -1
  94. package/docs/api/server/variables/connectionArgs.md +1 -1
  95. package/docs/api/type-aliases/ConnectionMetadata.md +1 -1
  96. package/docs/api/type-aliases/ConnectionRef.md +1 -1
  97. package/docs/api/type-aliases/Entity.md +2 -2
  98. package/docs/api/type-aliases/EntityId.md +1 -1
  99. package/docs/api/type-aliases/FateLiveConnectionEvent.md +1 -1
  100. package/docs/api/type-aliases/FateLiveEvent.md +1 -1
  101. package/docs/api/type-aliases/FateMutations.md +1 -1
  102. package/docs/api/type-aliases/FateOperation.md +1 -1
  103. package/docs/api/type-aliases/FateProtocolRequest.md +1 -1
  104. package/docs/api/type-aliases/FateProtocolResponse.md +1 -1
  105. package/docs/api/type-aliases/FateRecord.md +1 -1
  106. package/docs/api/type-aliases/FateRoots.md +1 -1
  107. package/docs/api/type-aliases/InferFateAPI.md +1 -1
  108. package/docs/api/type-aliases/List.md +1 -1
  109. package/docs/api/type-aliases/ListEntry.md +1 -1
  110. package/docs/api/type-aliases/ListItem.md +1 -1
  111. package/docs/api/type-aliases/Mask.md +1 -1
  112. package/docs/api/type-aliases/MutationDefinition.md +1 -1
  113. package/docs/api/type-aliases/MutationEntity.md +1 -1
  114. package/docs/api/type-aliases/MutationIdentifier.md +1 -1
  115. package/docs/api/type-aliases/MutationInput.md +1 -1
  116. package/docs/api/type-aliases/MutationResult.md +1 -1
  117. package/docs/api/type-aliases/NodesItem.md +1 -1
  118. package/docs/api/type-aliases/Pagination.md +5 -5
  119. package/docs/api/type-aliases/Request.md +1 -1
  120. package/docs/api/type-aliases/RequestMode.md +1 -1
  121. package/docs/api/type-aliases/RequestOptions.md +1 -1
  122. package/docs/api/type-aliases/RequestResult.md +1 -1
  123. package/docs/api/type-aliases/Selection.md +1 -1
  124. package/docs/api/type-aliases/Snapshot.md +1 -1
  125. package/docs/api/type-aliases/TypeConfig.md +4 -4
  126. package/docs/api/type-aliases/View.md +1 -1
  127. package/docs/api/type-aliases/ViewData.md +1 -1
  128. package/docs/api/type-aliases/ViewEntity.md +1 -1
  129. package/docs/api/type-aliases/ViewEntityName.md +1 -1
  130. package/docs/api/type-aliases/ViewRef.md +1 -1
  131. package/docs/api/type-aliases/ViewSelection.md +1 -1
  132. package/docs/api/type-aliases/ViewSnapshot.md +1 -1
  133. package/docs/api/type-aliases/ViewTag.md +1 -1
  134. package/docs/api/variables/ConnectionTag.md +1 -1
  135. package/docs/guide/actions.md +46 -4
  136. package/docs/guide/live-views.md +15 -2
  137. package/docs/guide/requests.md +1 -1
  138. package/docs/guide/server-integration.md +35 -21
  139. package/docs/guide/views.md +1 -1
  140. package/docs/guide/void-integration.md +3 -3
  141. package/lib/index.d.mts +1 -1
  142. package/lib/index.mjs +5 -4
  143. package/lib/{record-ENh92gyb.d.mts → record-CirbfZWX.d.mts} +2 -1
  144. package/lib/server/drizzle.d.mts +2 -0
  145. package/lib/server/drizzle.mjs +21 -5
  146. package/lib/server/prisma.mjs +2 -2
  147. package/lib/server.d.mts +2 -2
  148. package/lib/server.mjs +39 -8
  149. package/lib/{sourceRouter-Bwpkr062.mjs → sourceRouter-C22uFcZg.mjs} +1 -1
  150. package/package.json +1 -1
package/README.md CHANGED
@@ -245,7 +245,7 @@ This code fetches the author associated with the Post and makes it available to
245
245
  In fate, views are composable and reusable. Instead of inlining the selection, we can define a `UserView` and compose it into the `PostView` like this:
246
246
 
247
247
  ```tsx
248
- import type { Post, User } from '@your-org/server/trpc/views';
248
+ import type { Post, User } from '@your-org/server/views';
249
249
  import { view } from 'react-fate';
250
250
 
251
251
  export const UserView = view<User>()({
@@ -446,7 +446,7 @@ This component suspends or throws errors, which bubble up to the nearest error b
446
446
 
447
447
  > [!NOTE]
448
448
  >
449
- > `useRequest` might issue multiple requests which are automatically batched together by tRPC's [HTTP Batch Link](https://trpc.io/docs/client/links/httpBatchLink) into a single network request.
449
+ > `useRequest` may issue multiple operations in the same render pass. fate transports can batch those operations into fewer network requests: the native HTTP transport batches same-microtask operations into one `POST /fate` request, and the tRPC adapter can use tRPC's [HTTP Batch Link](https://trpc.io/docs/client/links/httpBatchLink).
450
450
 
451
451
  ### Requesting Objects by ID
452
452
 
@@ -660,7 +660,7 @@ The API mirrors `useView`: pass a view and a ref, and get back the same masked d
660
660
 
661
661
  ### How Live Updates Work
662
662
 
663
- The native HTTP transport opens one Server-Sent Events (SSE) connection per Fate client. When components mount or unmount live views, the client sends subscribe and unsubscribe control messages to the server. The server keeps those selections on the connection and sends updates only for records that connection subscribed to.
663
+ The native HTTP transport opens one Server-Sent Events (SSE) connection per fate client. When components mount or unmount live views, the client sends subscribe and unsubscribe control messages to the server. The server keeps those selections on the connection and sends updates only for records that connection subscribed to.
664
664
 
665
665
  When the server sends an update, fate normalizes the selected record into the same cache used by requests, actions, and mutations. Components that read affected fields re-render automatically.
666
666
 
@@ -670,7 +670,7 @@ Live deletion events remove the record from the normalized cache in the same way
670
670
 
671
671
  ### Client Setup
672
672
 
673
- Generate the client with the native transport and point it at your Fate endpoint:
673
+ Configure the native transport and point the client at your fate endpoint:
674
674
 
675
675
  ```tsx
676
676
  import { FateClient } from 'react-fate';
@@ -721,6 +721,19 @@ export const fate = createFateServer<AppContext>({
721
721
  app.all('/fate/*', createHonoFateHandler(fate));
722
722
  ```
723
723
 
724
+ fate keeps a bounded in-memory queue for each native SSE connection while live events are waiting to be resolved and sent. The default limit is `1000` queued events per connection. If a client falls behind and exceeds the limit, fate closes that live connection so server memory cannot grow without bound. You can tune the limit by passing the object form:
725
+
726
+ ```tsx
727
+ export const fate = createFateServer<AppContext>({
728
+ live: {
729
+ bus: live,
730
+ maxQueueSize: 500,
731
+ },
732
+ roots: Root,
733
+ sources,
734
+ });
735
+ ```
736
+
724
737
  Once this is in place, components can switch from `useView` to `useLiveView` without changing their view definitions or return types.
725
738
 
726
739
  ### Live List Views
@@ -889,9 +902,13 @@ fate does not provide hooks for mutations like traditional data fetching librari
889
902
  - `fate.actions` for use with [`useActionState`](https://react.dev/reference/react/useActionState) and React Actions.
890
903
  - `fate.mutations` for traditional imperative mutation calls.
891
904
 
892
- Mutations in your tRPC backend are made available as actions and mutations by fate's generated client.
905
+ Server mutations are exposed automatically as actions and mutations by fate's Vite plugin. The transport determines where those mutations are declared:
906
+
907
+ - With the [native HTTP transport](/docs/guide/server-integration.md#native-fate-protocol), mutations come from the `mutations` object passed to `createFateServer`.
908
+ - With the [tRPC adapter](/docs/guide/server-integration.md#trpc-fate-setup), mutations come from tRPC mutation procedures exposed through your fate-enabled router.
909
+ - With [Void](/docs/guide/void-integration.md), mutations use the same native fate server shape and are exposed through the Void route helpers.
893
910
 
894
- Let's assume that our `Post` entity has a tRPC mutation for liking a post called `post.like`. A `LikeButton` component using fate Actions and an async component library could then look like this:
911
+ If you have a mutation named `post.like`, a `LikeButton` component using fate Actions and an async component library could look like this:
895
912
 
896
913
  ```tsx
897
914
  import { useActionState } from 'react';
@@ -1026,7 +1043,45 @@ You can call mutations from anywhere, and without waiting for previous mutations
1026
1043
 
1027
1044
  ### Mutation Server Implementation
1028
1045
 
1029
- fate Actions & Mutations are backed by regular tRPC mutations on the server. Here is an example implementation of the `like` mutation in the `postRouter`.
1046
+ fate Actions & Mutations are backed by regular server mutations. If you already know how your fate server is wired, the client-side API above is the same regardless of transport. If not, start with the server setup for your environment:
1047
+
1048
+ - [Native HTTP custom mutations](/docs/guide/server-integration.md#custom-mutations) use `createFateServer({ mutations })`.
1049
+ - [tRPC fate setup](/docs/guide/server-integration.md#trpc-fate-setup) wires fate into your tRPC router; custom writes can use the same `fate.createPlan` and `fate.resolveById` helpers shown there.
1050
+ - [Void integration](/docs/guide/void-integration.md) exposes a native fate server from Void routes; define mutations with the native `createFateServer({ mutations })` API and serve them through `defineVoidFateRoute`.
1051
+
1052
+ Here is a native HTTP mutation for `post.like`:
1053
+
1054
+ ```tsx
1055
+ export const fate = createFateServer({
1056
+ mutations: {
1057
+ 'post.like': {
1058
+ input: likeInput,
1059
+ resolve: async ({ ctx, input, select }) => {
1060
+ await ctx.prisma.post.update({
1061
+ data: {
1062
+ likes: {
1063
+ increment: 1,
1064
+ },
1065
+ },
1066
+ where: { id: input.id },
1067
+ });
1068
+
1069
+ return sources.resolveById({
1070
+ ctx,
1071
+ id: input.id,
1072
+ input: { select },
1073
+ view: postDataView,
1074
+ });
1075
+ },
1076
+ type: 'Post',
1077
+ },
1078
+ },
1079
+ roots: Root,
1080
+ sources,
1081
+ });
1082
+ ```
1083
+
1084
+ The equivalent tRPC mutation lives in your router and returns the selected shape that the client asked for:
1030
1085
 
1031
1086
  ```tsx
1032
1087
  import { z } from 'zod';
@@ -1065,7 +1120,7 @@ export const postRouter = router({
1065
1120
  });
1066
1121
  ```
1067
1122
 
1068
- See the [Server Integration](#server-integration) section for more details on how to integrate tRPC routers with fate.
1123
+ See [Server Integration](/docs/guide/server-integration.md) for complete native HTTP and tRPC setup examples, and [Void Integration](/docs/guide/void-integration.md) for route helpers when your app runs on Void.
1069
1124
 
1070
1125
  ### Action & Mutation Error Handling
1071
1126
 
@@ -1148,9 +1203,9 @@ addComment({
1148
1203
 
1149
1204
  ## Server Integration
1150
1205
 
1151
- Until now, we have focused on the client-side API of fate. You'll need a backend that follows fate's data protocol so the Vite plugin can provide a typed client module. _fate_ currently ships two server paths:
1206
+ Until now, we have focused on the client-side API of fate. You'll need a backend that follows fate's data protocol so the Vite plugin can wire the typed fate APIs into your app. _fate_ currently ships two server paths:
1152
1207
 
1153
- - The native Fate protocol, which is transport-agnostic and can be hosted by any Fetch-compatible server.
1208
+ - The native fate protocol, which is transport-agnostic and can be hosted by any Fetch-compatible server.
1154
1209
  - The tRPC adapter, which keeps compatibility with existing tRPC backends.
1155
1210
 
1156
1211
  _fate_ currently provides database adapters for Prisma and Drizzle, but the framework itself is not coupled to a particular ORM. The adapters plug into the same source execution runtime and can be exposed through the native protocol or through tRPC.
@@ -1164,7 +1219,7 @@ fate expects that data is served by a backend that follows these conventions:
1164
1219
 
1165
1220
  Objects are identified by their ID and type name (`__typename`, e.g. `Post`, `User`), and stored by `__typename:id` (e.g. "Post:123") in the client cache. fate keeps list orderings under stable keys derived from the backend procedure and args. Relations are stored as IDs and returned to components as ViewRef tokens.
1166
1221
 
1167
- fate's type definitions might seem verbose at first glance. However, with fate's minimal API surface, AI tools can easily generate this code for you, or you can let the Vite plugin provide the typed client module for your app.
1222
+ fate's type definitions might seem verbose at first glance. However, with fate's minimal API surface, AI tools can easily write this code for you, and the Vite plugin takes care of connecting it to your app.
1168
1223
 
1169
1224
  > [!NOTE]
1170
1225
  > You can adopt _fate_ incrementally in an existing tRPC codebase without changing your existing schema by adding these queries alongside your existing procedures.
@@ -1260,9 +1315,9 @@ export const Root = {
1260
1315
  };
1261
1316
  ```
1262
1317
 
1263
- Entries that wrap their view in `list(...)` are treated as list resolvers. In the native protocol, the root key is the operation name sent by the generated client. In the tRPC adapter, `procedure` can point that root at a specific router procedure. If you omit `list(...)`, fate treats the entry as a standard query.
1318
+ Entries that wrap their view in `list(...)` are treated as list resolvers. In the native protocol, the root key is the operation name used by the client. In the tRPC adapter, `procedure` can point that root at a specific router procedure. If you omit `list(...)`, fate treats the entry as a standard query.
1264
1319
 
1265
- You can pass default list options such as `orderBy` to `list(...)`. Ordering is scoped to that specific list wrapper: `Root.posts` can order posts by `createdAt desc`, while `categoryDataView.posts` or `postDataView.comments` can choose their own order. If no order is provided, Fate orders by `id asc`. Fate always appends `id asc` as a tie-breaker when no `id` order is present; include `id` yourself when you need a different tie-breaker direction such as `id desc`. Use the array form when ordering by multiple fields so the priority is unambiguous.
1320
+ You can pass default list options such as `orderBy` to `list(...)`. Ordering is scoped to that specific list wrapper: `Root.posts` can order posts by `createdAt desc`, while `categoryDataView.posts` or `postDataView.comments` can choose their own order. If no order is provided, fate orders by `id asc`. fate always appends `id asc` as a tie-breaker when no `id` order is present; include `id` yourself when you need a different tie-breaker direction such as `id desc`. Use the array form when ordering by multiple fields so the priority is unambiguous.
1266
1321
 
1267
1322
  For the above `Root` definitions, you can make the following requests using `useRequest`:
1268
1323
 
@@ -1283,7 +1338,7 @@ const { posts, categories, viewer } = useRequest({
1283
1338
  });
1284
1339
  ```
1285
1340
 
1286
- ### Native Fate Protocol
1341
+ ### Native fate protocol
1287
1342
 
1288
1343
  The native protocol keeps tRPC optional. Create a source adapter from your ORM integration, pass it to `createFateServer`, and expose the returned server through a Fetch-compatible handler.
1289
1344
 
@@ -1346,7 +1401,7 @@ export default defineConfig({
1346
1401
  });
1347
1402
  ```
1348
1403
 
1349
- The generated client uses `createHTTPTransport`:
1404
+ With the native transport, the Vite plugin handles the HTTP transport setup. If you need to create a client manually, use `createFateClient` with the same route:
1350
1405
 
1351
1406
  ```tsx
1352
1407
  import { createFateClient } from 'react-fate/client';
@@ -1356,7 +1411,7 @@ const client = createFateClient({
1356
1411
  });
1357
1412
  ```
1358
1413
 
1359
- The HTTP transport batches operations issued in the same microtask into one `POST /fate` request. Live views use one `GET /fate/live` SSE stream per Fate client and `POST /fate/live` control messages when views subscribe or unsubscribe.
1414
+ The HTTP transport batches operations issued in the same microtask into one `POST /fate` request. Live views use one `GET /fate/live` SSE stream per fate client and `POST /fate/live` control messages when views subscribe or unsubscribe.
1360
1415
 
1361
1416
  #### Custom Queries
1362
1417
 
@@ -1445,15 +1500,17 @@ live.update('Post', post.id, {
1445
1500
 
1446
1501
  `changed` is optional. When provided, fate resolves only the changed fields selected by each live subscription and skips subscriptions that do not select those fields. `createLiveEventBus` is an in-memory fanout bus. It forwards `eventId` to SSE clients, but it does not replay events after reconnects. If your app needs lossless reconnect behavior, provide a durable live bus implementation that uses the `lastEventId` passed to `listen`, `listenConnection`, `subscribe`, and `subscribeConnection`.
1447
1502
 
1448
- ### tRPC Fate Setup
1503
+ Native SSE connections keep a bounded in-memory queue while events are waiting to be resolved and sent. The default is `1000` queued events per connection. If a client falls behind and exceeds that limit, fate closes the live connection instead of buffering indefinitely. Configure it with `live: { bus: live, maxQueueSize: 500 }`.
1504
+
1505
+ ### tRPC fate setup
1449
1506
 
1450
1507
  The Prisma and Drizzle tRPC integrations connect your data views to your database, bind fate's standard tRPC procedures, and expose helpers for custom queries and mutations.
1451
1508
 
1452
- Pass the `Root` export from `views.ts` to Fate in your tRPC `init.ts` file. Fate walks that view graph to find the data views it needs. `id` defaults to `"id"`, and Fate uses it as the fallback ordering for cursor pagination. Relations are inferred from the data view and ORM schema: a nested data view is loaded as a singular relation, `list(view)` is loaded as a list relation, and Drizzle join tables are discovered from relation metadata.
1509
+ Pass the `Root` export from `views.ts` to fate in your tRPC `init.ts` file. fate walks that view graph to find the data views it needs. `id` defaults to `"id"`, and fate uses it as the fallback ordering for cursor pagination. Relations are inferred from the data view and ORM schema: a nested data view is loaded as a singular relation, `list(view)` is loaded as a list relation, and Drizzle join tables are discovered from relation metadata.
1453
1510
 
1454
1511
  #### Prisma
1455
1512
 
1456
- Use `createPrismaFate` from `@nkzw/fate/server/prisma` next to your tRPC helpers. By default, Fate reads Prisma delegates from `ctx.prisma` using each data view's type name:
1513
+ Use `createPrismaFate` from `@nkzw/fate/server/prisma` next to your tRPC helpers. By default, fate reads Prisma delegates from `ctx.prisma` using each data view's type name:
1457
1514
 
1458
1515
  ```tsx
1459
1516
  import { initTRPC } from '@trpc/server';
@@ -1502,7 +1559,7 @@ return plan.resolve(post);
1502
1559
 
1503
1560
  #### Drizzle
1504
1561
 
1505
- Use `createDrizzleFate` from `@nkzw/fate/server/drizzle`. Fate matches data view type names to Drizzle tables from your schema. The `db` option can be a Drizzle database object or a function that receives your tRPC context and returns a request-scoped database object:
1562
+ Use `createDrizzleFate` from `@nkzw/fate/server/drizzle`. fate matches data view type names to Drizzle tables from your schema. The `db` option can be a Drizzle database object or a function that receives your tRPC context and returns a request-scoped database object:
1506
1563
 
1507
1564
  ```tsx
1508
1565
  import { initTRPC } from '@trpc/server';
@@ -1541,9 +1598,21 @@ export const fate = createDrizzleFate<AppContext, typeof procedure>({
1541
1598
 
1542
1599
  The Drizzle adapter builds SQL queries from your registered data views. It selects only requested columns, hydrates singular, list, and many-to-many relations, supports nested cursor pagination, and hydrates computed `count(...)` dependencies with SQL grouped counts. Count filters may be plain equality objects or Drizzle SQL predicates written as `(columns) => eq(columns.status, 'GOING')`.
1543
1600
 
1601
+ Nested paginated relations are resolved with one child-page query per parent row. fate runs those child queries with a default concurrency limit of `10` so a single request cannot flood the database connection pool. Tune this with `nestedPaginationConcurrency` if your database pool or workload needs a different limit:
1602
+
1603
+ ```tsx
1604
+ export const fate = createDrizzleFate<AppContext, typeof procedure>({
1605
+ db,
1606
+ nestedPaginationConcurrency: 5,
1607
+ procedure,
1608
+ schema,
1609
+ views: Root,
1610
+ });
1611
+ ```
1612
+
1544
1613
  For request-specific sorting, prefer a custom root query that validates and translates explicit sort args.
1545
1614
 
1546
- For many-to-many relations, define the join table relations in your Drizzle schema. Fate discovers a join table that points at both the source table and the target table:
1615
+ For many-to-many relations, define the join table relations in your Drizzle schema. fate discovers a join table that points at both the source table and the target table:
1547
1616
 
1548
1617
  ```tsx
1549
1618
  export const fate = createDrizzleFate<AppContext, typeof procedure>({
@@ -1601,7 +1670,7 @@ return post;
1601
1670
 
1602
1671
  ### tRPC Procedures
1603
1672
 
1604
- Use `fate.procedures` to build the standard `byId` and `list` procedures expected by the generated fate client:
1673
+ Use `fate.procedures` to build the standard `byId` and `list` procedures expected by fate's request APIs:
1605
1674
 
1606
1675
  ```tsx
1607
1676
  import { fate, router } from '../init.ts';
@@ -1695,11 +1764,11 @@ export const postDataView = dataView<PostItem>('Post')({
1695
1764
 
1696
1765
  The adapters fetch the hidden `field(...)` and `count(...)` dependencies for you. This keeps private fields like `email` available to the resolver without exposing them to the client selection.
1697
1766
 
1698
- ### Configuring the typed client
1767
+ ### Connecting the Client
1699
1768
 
1700
- Now that we have defined our client views and our tRPC server, we need to connect them with some glue code. We recommend using fate's Vite plugin for convenience.
1769
+ Now that we have defined our client views and our server module, add fate's Vite plugin to the client app. The plugin reads your server exports and wires the typed fate APIs into your app.
1701
1770
 
1702
- First, make sure our tRPC `router.ts` file exports the `appRouter` object, `AppRouter` type and all the views we have defined:
1771
+ For tRPC, make sure the `router.ts` file exports the `appRouter` object, `AppRouter` type and all the views we have defined:
1703
1772
 
1704
1773
  ```tsx
1705
1774
  import { router } from './init.ts';
@@ -1731,11 +1800,11 @@ export default defineConfig({
1731
1800
  });
1732
1801
  ```
1733
1802
 
1734
- _Note: fate uses the specified server module name to extract the server types it needs and uses the same module name in the generated client. Make sure that the module is available to the client package's Vite config._
1803
+ _Note: fate uses the specified server module name to find the server types it needs. Make sure that the module is available to the client package's Vite config._
1735
1804
 
1736
- During development, the plugin watches the server module and the files it imports. When one of those files changes, fate regenerates the project-local client and invalidates `@nkzw/fate/client` in Vite's module graph.
1805
+ During development, the plugin watches the server module and the files it imports. When one of those files changes, fate updates the internal client wiring and invalidates `@nkzw/fate/client` in Vite's module graph.
1737
1806
 
1738
- For a barebones client without React, import the plugin from `@nkzw/fate/vite` and the generated client from `@nkzw/fate/client`. The plugin writes the project-local client for the selected client module path.
1807
+ For a barebones client without React, import the plugin from `@nkzw/fate/vite` and the client APIs from `@nkzw/fate/client`. The plugin wires the same server types for the selected import path.
1739
1808
 
1740
1809
  The plugin writes project-local types under `.fate/`. If your TypeScript config does not already include dot-directories, extend the generated config:
1741
1810
 
@@ -1747,7 +1816,7 @@ The plugin writes project-local types under `.fate/`. If your TypeScript config
1747
1816
 
1748
1817
  ### Creating a _fate_ Client
1749
1818
 
1750
- Now that the Vite plugin provides the client types, all that remains is creating an instance of the fate client, and using it in our React app using the `FateClient` context provider:
1819
+ Now that the Vite plugin has connected the types, create a fate client instance and provide it to your React app with the `FateClient` context provider:
1751
1820
 
1752
1821
  ```tsx
1753
1822
  import { httpBatchLink } from '@trpc/client';
@@ -1,6 +1,6 @@
1
1
  # Class: FateClient\<Roots, Mutations\>
2
2
 
3
- Defined in: [packages/fate/src/client.ts:361](https://github.com/nkzw-tech/fate/blob/17081c4f677e224e55b75d9a31bd6e0a7ee94af1/packages/fate/src/client.ts#L361)
3
+ Defined in: [packages/fate/src/client.ts:361](https://github.com/nkzw-tech/fate/blob/641aeb0396b93477dc2e75fdb2c29a4c2b62a272/packages/fate/src/client.ts#L361)
4
4
 
5
5
  Core client that normalizes records, manages the view cache, and coordinates
6
6
  data fetching.
@@ -21,7 +21,7 @@ data fetching.
21
21
 
22
22
  > **new FateClient**\<`Roots`, `Mutations`\>(`options`): `FateClient`\<`Roots`, `Mutations`\>
23
23
 
24
- Defined in: [packages/fate/src/client.ts:400](https://github.com/nkzw-tech/fate/blob/17081c4f677e224e55b75d9a31bd6e0a7ee94af1/packages/fate/src/client.ts#L400)
24
+ Defined in: [packages/fate/src/client.ts:400](https://github.com/nkzw-tech/fate/blob/641aeb0396b93477dc2e75fdb2c29a4c2b62a272/packages/fate/src/client.ts#L400)
25
25
 
26
26
  #### Parameters
27
27
 
@@ -39,7 +39,7 @@ Defined in: [packages/fate/src/client.ts:400](https://github.com/nkzw-tech/fate/
39
39
 
40
40
  > `readonly` **actions**: `MutationTreeFromRecord`\<`Mutations`\>
41
41
 
42
- Defined in: [packages/fate/src/client.ts:396](https://github.com/nkzw-tech/fate/blob/17081c4f677e224e55b75d9a31bd6e0a7ee94af1/packages/fate/src/client.ts#L396)
42
+ Defined in: [packages/fate/src/client.ts:396](https://github.com/nkzw-tech/fate/blob/641aeb0396b93477dc2e75fdb2c29a4c2b62a272/packages/fate/src/client.ts#L396)
43
43
 
44
44
  ***
45
45
 
@@ -47,7 +47,7 @@ Defined in: [packages/fate/src/client.ts:396](https://github.com/nkzw-tech/fate/
47
47
 
48
48
  > `readonly` **mutations**: `MutationTreeFromRecord`\<`Mutations`\>
49
49
 
50
- Defined in: [packages/fate/src/client.ts:397](https://github.com/nkzw-tech/fate/blob/17081c4f677e224e55b75d9a31bd6e0a7ee94af1/packages/fate/src/client.ts#L397)
50
+ Defined in: [packages/fate/src/client.ts:397](https://github.com/nkzw-tech/fate/blob/641aeb0396b93477dc2e75fdb2c29a4c2b62a272/packages/fate/src/client.ts#L397)
51
51
 
52
52
  ***
53
53
 
@@ -55,7 +55,7 @@ Defined in: [packages/fate/src/client.ts:397](https://github.com/nkzw-tech/fate/
55
55
 
56
56
  > `readonly` **roots**: `Roots`
57
57
 
58
- Defined in: [packages/fate/src/client.ts:398](https://github.com/nkzw-tech/fate/blob/17081c4f677e224e55b75d9a31bd6e0a7ee94af1/packages/fate/src/client.ts#L398)
58
+ Defined in: [packages/fate/src/client.ts:398](https://github.com/nkzw-tech/fate/blob/641aeb0396b93477dc2e75fdb2c29a4c2b62a272/packages/fate/src/client.ts#L398)
59
59
 
60
60
  ***
61
61
 
@@ -63,7 +63,7 @@ Defined in: [packages/fate/src/client.ts:398](https://github.com/nkzw-tech/fate/
63
63
 
64
64
  > `readonly` **store**: `Store`
65
65
 
66
- Defined in: [packages/fate/src/client.ts:389](https://github.com/nkzw-tech/fate/blob/17081c4f677e224e55b75d9a31bd6e0a7ee94af1/packages/fate/src/client.ts#L389)
66
+ Defined in: [packages/fate/src/client.ts:389](https://github.com/nkzw-tech/fate/blob/641aeb0396b93477dc2e75fdb2c29a4c2b62a272/packages/fate/src/client.ts#L389)
67
67
 
68
68
  ## Methods
69
69
 
@@ -71,7 +71,7 @@ Defined in: [packages/fate/src/client.ts:389](https://github.com/nkzw-tech/fate/
71
71
 
72
72
  > **assertLiveConnectionSupport**(): `void`
73
73
 
74
- Defined in: [packages/fate/src/client.ts:845](https://github.com/nkzw-tech/fate/blob/17081c4f677e224e55b75d9a31bd6e0a7ee94af1/packages/fate/src/client.ts#L845)
74
+ Defined in: [packages/fate/src/client.ts:845](https://github.com/nkzw-tech/fate/blob/641aeb0396b93477dc2e75fdb2c29a4c2b62a272/packages/fate/src/client.ts#L845)
75
75
 
76
76
  #### Returns
77
77
 
@@ -83,7 +83,7 @@ Defined in: [packages/fate/src/client.ts:845](https://github.com/nkzw-tech/fate/
83
83
 
84
84
  > **assertLiveViewSupport**(): `void`
85
85
 
86
- Defined in: [packages/fate/src/client.ts:837](https://github.com/nkzw-tech/fate/blob/17081c4f677e224e55b75d9a31bd6e0a7ee94af1/packages/fate/src/client.ts#L837)
86
+ Defined in: [packages/fate/src/client.ts:837](https://github.com/nkzw-tech/fate/blob/641aeb0396b93477dc2e75fdb2c29a4c2b62a272/packages/fate/src/client.ts#L837)
87
87
 
88
88
  #### Returns
89
89
 
@@ -95,7 +95,7 @@ Defined in: [packages/fate/src/client.ts:837](https://github.com/nkzw-tech/fate/
95
95
 
96
96
  > **clearOptimisticUpdate**(`token`): `void`
97
97
 
98
- Defined in: [packages/fate/src/client.ts:1496](https://github.com/nkzw-tech/fate/blob/17081c4f677e224e55b75d9a31bd6e0a7ee94af1/packages/fate/src/client.ts#L1496)
98
+ Defined in: [packages/fate/src/client.ts:1496](https://github.com/nkzw-tech/fate/blob/641aeb0396b93477dc2e75fdb2c29a4c2b62a272/packages/fate/src/client.ts#L1496)
99
99
 
100
100
  #### Parameters
101
101
 
@@ -113,7 +113,7 @@ Defined in: [packages/fate/src/client.ts:1496](https://github.com/nkzw-tech/fate
113
113
 
114
114
  > **deleteRecord**(`type`, `id`, `snapshots?`, `listSnapshots?`): `void`
115
115
 
116
- Defined in: [packages/fate/src/client.ts:650](https://github.com/nkzw-tech/fate/blob/17081c4f677e224e55b75d9a31bd6e0a7ee94af1/packages/fate/src/client.ts#L650)
116
+ Defined in: [packages/fate/src/client.ts:650](https://github.com/nkzw-tech/fate/blob/641aeb0396b93477dc2e75fdb2c29a4c2b62a272/packages/fate/src/client.ts#L650)
117
117
 
118
118
  #### Parameters
119
119
 
@@ -143,7 +143,7 @@ Defined in: [packages/fate/src/client.ts:650](https://github.com/nkzw-tech/fate/
143
143
 
144
144
  > **executeMutation**(`key`, `input`, `select`, `options?`): `Promise`\<`unknown`\>
145
145
 
146
- Defined in: [packages/fate/src/client.ts:594](https://github.com/nkzw-tech/fate/blob/17081c4f677e224e55b75d9a31bd6e0a7ee94af1/packages/fate/src/client.ts#L594)
146
+ Defined in: [packages/fate/src/client.ts:594](https://github.com/nkzw-tech/fate/blob/641aeb0396b93477dc2e75fdb2c29a4c2b62a272/packages/fate/src/client.ts#L594)
147
147
 
148
148
  #### Parameters
149
149
 
@@ -179,7 +179,7 @@ Defined in: [packages/fate/src/client.ts:594](https://github.com/nkzw-tech/fate/
179
179
 
180
180
  > **filterSelectionForPendingOptimistics**(`entityId`, `select`, `options?`): `Set`\<`string`\>
181
181
 
182
- Defined in: [packages/fate/src/client.ts:1559](https://github.com/nkzw-tech/fate/blob/17081c4f677e224e55b75d9a31bd6e0a7ee94af1/packages/fate/src/client.ts#L1559)
182
+ Defined in: [packages/fate/src/client.ts:1559](https://github.com/nkzw-tech/fate/blob/641aeb0396b93477dc2e75fdb2c29a4c2b62a272/packages/fate/src/client.ts#L1559)
183
183
 
184
184
  #### Parameters
185
185
 
@@ -207,7 +207,7 @@ Defined in: [packages/fate/src/client.ts:1559](https://github.com/nkzw-tech/fate
207
207
 
208
208
  > **gc**(): `void`
209
209
 
210
- Defined in: [packages/fate/src/client.ts:1868](https://github.com/nkzw-tech/fate/blob/17081c4f677e224e55b75d9a31bd6e0a7ee94af1/packages/fate/src/client.ts#L1868)
210
+ Defined in: [packages/fate/src/client.ts:1871](https://github.com/nkzw-tech/fate/blob/641aeb0396b93477dc2e75fdb2c29a4c2b62a272/packages/fate/src/client.ts#L1871)
211
211
 
212
212
  Removes records and lists that are not reachable from retained requests or
213
213
  the release buffer.
@@ -226,7 +226,7 @@ memory-management flows.
226
226
 
227
227
  > **getPendingOptimisticMask**(`entityId`, `options?`): `FieldMask` \| `null`
228
228
 
229
- Defined in: [packages/fate/src/client.ts:1518](https://github.com/nkzw-tech/fate/blob/17081c4f677e224e55b75d9a31bd6e0a7ee94af1/packages/fate/src/client.ts#L1518)
229
+ Defined in: [packages/fate/src/client.ts:1518](https://github.com/nkzw-tech/fate/blob/641aeb0396b93477dc2e75fdb2c29a4c2b62a272/packages/fate/src/client.ts#L1518)
230
230
 
231
231
  #### Parameters
232
232
 
@@ -250,7 +250,7 @@ Defined in: [packages/fate/src/client.ts:1518](https://github.com/nkzw-tech/fate
250
250
 
251
251
  > **getRequestKey**(`request`): `string`
252
252
 
253
- Defined in: [packages/fate/src/client.ts:2086](https://github.com/nkzw-tech/fate/blob/17081c4f677e224e55b75d9a31bd6e0a7ee94af1/packages/fate/src/client.ts#L2086)
253
+ Defined in: [packages/fate/src/client.ts:2089](https://github.com/nkzw-tech/fate/blob/641aeb0396b93477dc2e75fdb2c29a4c2b62a272/packages/fate/src/client.ts#L2089)
254
254
 
255
255
  #### Parameters
256
256
 
@@ -268,7 +268,7 @@ Defined in: [packages/fate/src/client.ts:2086](https://github.com/nkzw-tech/fate
268
268
 
269
269
  > **getRequestResult**\<`R`\>(`request`): [`RequestResult`](../type-aliases/RequestResult.md)\<`Roots`, `R`\>
270
270
 
271
- Defined in: [packages/fate/src/client.ts:2226](https://github.com/nkzw-tech/fate/blob/17081c4f677e224e55b75d9a31bd6e0a7ee94af1/packages/fate/src/client.ts#L2226)
271
+ Defined in: [packages/fate/src/client.ts:2229](https://github.com/nkzw-tech/fate/blob/641aeb0396b93477dc2e75fdb2c29a4c2b62a272/packages/fate/src/client.ts#L2229)
272
272
 
273
273
  #### Type Parameters
274
274
 
@@ -292,7 +292,7 @@ Defined in: [packages/fate/src/client.ts:2226](https://github.com/nkzw-tech/fate
292
292
 
293
293
  > **getTypeConfig**(`type`): [`TypeConfig`](../type-aliases/TypeConfig.md)
294
294
 
295
- Defined in: [packages/fate/src/client.ts:586](https://github.com/nkzw-tech/fate/blob/17081c4f677e224e55b75d9a31bd6e0a7ee94af1/packages/fate/src/client.ts#L586)
295
+ Defined in: [packages/fate/src/client.ts:586](https://github.com/nkzw-tech/fate/blob/641aeb0396b93477dc2e75fdb2c29a4c2b62a272/packages/fate/src/client.ts#L586)
296
296
 
297
297
  #### Parameters
298
298
 
@@ -310,7 +310,7 @@ Defined in: [packages/fate/src/client.ts:586](https://github.com/nkzw-tech/fate/
310
310
 
311
311
  > **loadConnection**\<`V`\>(`view`, `connection`, `args`, `options?`): `Promise`\<`Readonly`\<\{ `backwardPageLimit?`: `number`; `cursors?`: readonly (`string` \| `undefined`)[]; `forwardPageLimit?`: `number`; `ids`: readonly `string`[]; `liveAfterIds?`: readonly `string`[]; `liveBeforeIds?`: readonly `string`[]; `pagination?`: [`Pagination`](../type-aliases/Pagination.md); `pendingAfterIds?`: readonly `string`[]; `pendingBeforeIds?`: readonly `string`[]; \}\> \| `undefined`\>
312
312
 
313
- Defined in: [packages/fate/src/client.ts:1583](https://github.com/nkzw-tech/fate/blob/17081c4f677e224e55b75d9a31bd6e0a7ee94af1/packages/fate/src/client.ts#L1583)
313
+ Defined in: [packages/fate/src/client.ts:1583](https://github.com/nkzw-tech/fate/blob/641aeb0396b93477dc2e75fdb2c29a4c2b62a272/packages/fate/src/client.ts#L1583)
314
314
 
315
315
  #### Type Parameters
316
316
 
@@ -348,7 +348,7 @@ Defined in: [packages/fate/src/client.ts:1583](https://github.com/nkzw-tech/fate
348
348
 
349
349
  > **prepareRequestForRender**\<`R`\>(`request`, `options`): `Readonly`\<\{ `promise`: `Promise`\<[`RequestResult`](../type-aliases/RequestResult.md)\<`Roots`, `R`\>\>; `requestKey`: `string`; \}\>
350
350
 
351
- Defined in: [packages/fate/src/client.ts:1753](https://github.com/nkzw-tech/fate/blob/17081c4f677e224e55b75d9a31bd6e0a7ee94af1/packages/fate/src/client.ts#L1753)
351
+ Defined in: [packages/fate/src/client.ts:1753](https://github.com/nkzw-tech/fate/blob/641aeb0396b93477dc2e75fdb2c29a4c2b62a272/packages/fate/src/client.ts#L1753)
352
352
 
353
353
  #### Type Parameters
354
354
 
@@ -376,7 +376,7 @@ Defined in: [packages/fate/src/client.ts:1753](https://github.com/nkzw-tech/fate
376
376
 
377
377
  > **readView**\<`T`, `S`, `V`\>(`view`, `ref`): [`FateThenable`](../interfaces/FateThenable.md)\<`Readonly`\<\{ `coverage`: readonly readonly \[`string`, `ReadonlySet`\<`string`\>\][]; `data`: [`ViewData`](../type-aliases/ViewData.md)\<`T`, `S`\>; \}\>\>
378
378
 
379
- Defined in: [packages/fate/src/client.ts:713](https://github.com/nkzw-tech/fate/blob/17081c4f677e224e55b75d9a31bd6e0a7ee94af1/packages/fate/src/client.ts#L713)
379
+ Defined in: [packages/fate/src/client.ts:713](https://github.com/nkzw-tech/fate/blob/641aeb0396b93477dc2e75fdb2c29a4c2b62a272/packages/fate/src/client.ts#L713)
380
380
 
381
381
  #### Type Parameters
382
382
 
@@ -412,7 +412,7 @@ Defined in: [packages/fate/src/client.ts:713](https://github.com/nkzw-tech/fate/
412
412
 
413
413
  > **ref**\<`T`\>(`type`, `id`, `view`): [`ViewRef`](../type-aliases/ViewRef.md)\<`T`\[`"__typename"`\]\>
414
414
 
415
- Defined in: [packages/fate/src/client.ts:700](https://github.com/nkzw-tech/fate/blob/17081c4f677e224e55b75d9a31bd6e0a7ee94af1/packages/fate/src/client.ts#L700)
415
+ Defined in: [packages/fate/src/client.ts:700](https://github.com/nkzw-tech/fate/blob/641aeb0396b93477dc2e75fdb2c29a4c2b62a272/packages/fate/src/client.ts#L700)
416
416
 
417
417
  #### Type Parameters
418
418
 
@@ -444,7 +444,7 @@ Defined in: [packages/fate/src/client.ts:700](https://github.com/nkzw-tech/fate/
444
444
 
445
445
  > **registerOptimisticUpdate**(`entityId`, `select`): `number` \| `null`
446
446
 
447
- Defined in: [packages/fate/src/client.ts:1477](https://github.com/nkzw-tech/fate/blob/17081c4f677e224e55b75d9a31bd6e0a7ee94af1/packages/fate/src/client.ts#L1477)
447
+ Defined in: [packages/fate/src/client.ts:1477](https://github.com/nkzw-tech/fate/blob/641aeb0396b93477dc2e75fdb2c29a4c2b62a272/packages/fate/src/client.ts#L1477)
448
448
 
449
449
  #### Parameters
450
450
 
@@ -466,7 +466,7 @@ Defined in: [packages/fate/src/client.ts:1477](https://github.com/nkzw-tech/fate
466
466
 
467
467
  > **registerPendingOptimisticMutation**(`entityId`, `promise`): `void`
468
468
 
469
- Defined in: [packages/fate/src/client.ts:1447](https://github.com/nkzw-tech/fate/blob/17081c4f677e224e55b75d9a31bd6e0a7ee94af1/packages/fate/src/client.ts#L1447)
469
+ Defined in: [packages/fate/src/client.ts:1447](https://github.com/nkzw-tech/fate/blob/641aeb0396b93477dc2e75fdb2c29a4c2b62a272/packages/fate/src/client.ts#L1447)
470
470
 
471
471
  #### Parameters
472
472
 
@@ -488,7 +488,7 @@ Defined in: [packages/fate/src/client.ts:1447](https://github.com/nkzw-tech/fate
488
488
 
489
489
  > **releaseRequest**(`request`, `mode`): `void`
490
490
 
491
- Defined in: [packages/fate/src/client.ts:1807](https://github.com/nkzw-tech/fate/blob/17081c4f677e224e55b75d9a31bd6e0a7ee94af1/packages/fate/src/client.ts#L1807)
491
+ Defined in: [packages/fate/src/client.ts:1810](https://github.com/nkzw-tech/fate/blob/641aeb0396b93477dc2e75fdb2c29a4c2b62a272/packages/fate/src/client.ts#L1810)
492
492
 
493
493
  #### Parameters
494
494
 
@@ -510,7 +510,7 @@ Defined in: [packages/fate/src/client.ts:1807](https://github.com/nkzw-tech/fate
510
510
 
511
511
  > **releaseRequestKey**(`requestKey`, `mode`): `void`
512
512
 
513
- Defined in: [packages/fate/src/client.ts:1811](https://github.com/nkzw-tech/fate/blob/17081c4f677e224e55b75d9a31bd6e0a7ee94af1/packages/fate/src/client.ts#L1811)
513
+ Defined in: [packages/fate/src/client.ts:1814](https://github.com/nkzw-tech/fate/blob/641aeb0396b93477dc2e75fdb2c29a4c2b62a272/packages/fate/src/client.ts#L1814)
514
514
 
515
515
  #### Parameters
516
516
 
@@ -532,7 +532,7 @@ Defined in: [packages/fate/src/client.ts:1811](https://github.com/nkzw-tech/fate
532
532
 
533
533
  > **request**\<`R`\>(`request`, `options?`): `Promise`\<[`RequestResult`](../type-aliases/RequestResult.md)\<`Roots`, `R`\>\>
534
534
 
535
- Defined in: [packages/fate/src/client.ts:1736](https://github.com/nkzw-tech/fate/blob/17081c4f677e224e55b75d9a31bd6e0a7ee94af1/packages/fate/src/client.ts#L1736)
535
+ Defined in: [packages/fate/src/client.ts:1736](https://github.com/nkzw-tech/fate/blob/641aeb0396b93477dc2e75fdb2c29a4c2b62a272/packages/fate/src/client.ts#L1736)
536
536
 
537
537
  #### Type Parameters
538
538
 
@@ -560,7 +560,7 @@ Defined in: [packages/fate/src/client.ts:1736](https://github.com/nkzw-tech/fate
560
560
 
561
561
  > **requestForRender**\<`R`\>(`request`, `options?`): `Promise`\<[`RequestResult`](../type-aliases/RequestResult.md)\<`Roots`, `R`\>\>
562
562
 
563
- Defined in: [packages/fate/src/client.ts:1746](https://github.com/nkzw-tech/fate/blob/17081c4f677e224e55b75d9a31bd6e0a7ee94af1/packages/fate/src/client.ts#L1746)
563
+ Defined in: [packages/fate/src/client.ts:1746](https://github.com/nkzw-tech/fate/blob/641aeb0396b93477dc2e75fdb2c29a4c2b62a272/packages/fate/src/client.ts#L1746)
564
564
 
565
565
  #### Type Parameters
566
566
 
@@ -588,7 +588,7 @@ Defined in: [packages/fate/src/client.ts:1746](https://github.com/nkzw-tech/fate
588
588
 
589
589
  > **resolveOptimisticEntity**(`optimisticEntityId`, `resolvedEntityId`): `void`
590
590
 
591
- Defined in: [packages/fate/src/client.ts:1472](https://github.com/nkzw-tech/fate/blob/17081c4f677e224e55b75d9a31bd6e0a7ee94af1/packages/fate/src/client.ts#L1472)
591
+ Defined in: [packages/fate/src/client.ts:1472](https://github.com/nkzw-tech/fate/blob/641aeb0396b93477dc2e75fdb2c29a4c2b62a272/packages/fate/src/client.ts#L1472)
592
592
 
593
593
  #### Parameters
594
594
 
@@ -610,7 +610,7 @@ Defined in: [packages/fate/src/client.ts:1472](https://github.com/nkzw-tech/fate
610
610
 
611
611
  > **restore**(`id`, `snapshot`): `void`
612
612
 
613
- Defined in: [packages/fate/src/client.ts:668](https://github.com/nkzw-tech/fate/blob/17081c4f677e224e55b75d9a31bd6e0a7ee94af1/packages/fate/src/client.ts#L668)
613
+ Defined in: [packages/fate/src/client.ts:668](https://github.com/nkzw-tech/fate/blob/641aeb0396b93477dc2e75fdb2c29a4c2b62a272/packages/fate/src/client.ts#L668)
614
614
 
615
615
  #### Parameters
616
616
 
@@ -632,7 +632,7 @@ Defined in: [packages/fate/src/client.ts:668](https://github.com/nkzw-tech/fate/
632
632
 
633
633
  > **restoreList**(`name`, `list?`): `void`
634
634
 
635
- Defined in: [packages/fate/src/client.ts:673](https://github.com/nkzw-tech/fate/blob/17081c4f677e224e55b75d9a31bd6e0a7ee94af1/packages/fate/src/client.ts#L673)
635
+ Defined in: [packages/fate/src/client.ts:673](https://github.com/nkzw-tech/fate/blob/641aeb0396b93477dc2e75fdb2c29a4c2b62a272/packages/fate/src/client.ts#L673)
636
636
 
637
637
  #### Parameters
638
638
 
@@ -654,7 +654,7 @@ Defined in: [packages/fate/src/client.ts:673](https://github.com/nkzw-tech/fate/
654
654
 
655
655
  > **retain**(`request`): `RetainHandle`
656
656
 
657
- Defined in: [packages/fate/src/client.ts:1842](https://github.com/nkzw-tech/fate/blob/17081c4f677e224e55b75d9a31bd6e0a7ee94af1/packages/fate/src/client.ts#L1842)
657
+ Defined in: [packages/fate/src/client.ts:1845](https://github.com/nkzw-tech/fate/blob/641aeb0396b93477dc2e75fdb2c29a4c2b62a272/packages/fate/src/client.ts#L1845)
658
658
 
659
659
  Keeps the records and lists reachable from a request alive until the
660
660
  returned handle is disposed.
@@ -679,7 +679,7 @@ that must survive manual garbage collection.
679
679
 
680
680
  > **retainRequestKey**(`requestKey`, `mode?`): `RetainHandle`
681
681
 
682
- Defined in: [packages/fate/src/client.ts:1823](https://github.com/nkzw-tech/fate/blob/17081c4f677e224e55b75d9a31bd6e0a7ee94af1/packages/fate/src/client.ts#L1823)
682
+ Defined in: [packages/fate/src/client.ts:1826](https://github.com/nkzw-tech/fate/blob/641aeb0396b93477dc2e75fdb2c29a4c2b62a272/packages/fate/src/client.ts#L1826)
683
683
 
684
684
  #### Parameters
685
685
 
@@ -701,7 +701,7 @@ Defined in: [packages/fate/src/client.ts:1823](https://github.com/nkzw-tech/fate
701
701
 
702
702
  > **rootListRef**(`entityId`, `rootView`): `Readonly`\<\{ `__typename`: `string`; `[ViewsTag]`: `Set`\<`string`\>; `id`: `string` \| `number`; \}\>
703
703
 
704
- Defined in: [packages/fate/src/client.ts:708](https://github.com/nkzw-tech/fate/blob/17081c4f677e224e55b75d9a31bd6e0a7ee94af1/packages/fate/src/client.ts#L708)
704
+ Defined in: [packages/fate/src/client.ts:708](https://github.com/nkzw-tech/fate/blob/641aeb0396b93477dc2e75fdb2c29a4c2b62a272/packages/fate/src/client.ts#L708)
705
705
 
706
706
  #### Parameters
707
707
 
@@ -723,7 +723,7 @@ Defined in: [packages/fate/src/client.ts:708](https://github.com/nkzw-tech/fate/
723
723
 
724
724
  > **subscribeLiveListView**\<`V`\>(`view`, `connection`): () => `void`
725
725
 
726
- Defined in: [packages/fate/src/client.ts:937](https://github.com/nkzw-tech/fate/blob/17081c4f677e224e55b75d9a31bd6e0a7ee94af1/packages/fate/src/client.ts#L937)
726
+ Defined in: [packages/fate/src/client.ts:937](https://github.com/nkzw-tech/fate/blob/641aeb0396b93477dc2e75fdb2c29a4c2b62a272/packages/fate/src/client.ts#L937)
727
727
 
728
728
  #### Type Parameters
729
729
 
@@ -751,7 +751,7 @@ Defined in: [packages/fate/src/client.ts:937](https://github.com/nkzw-tech/fate/
751
751
 
752
752
  > **subscribeLiveView**\<`T`, `S`, `V`\>(`view`, `ref`): () => `void`
753
753
 
754
- Defined in: [packages/fate/src/client.ts:853](https://github.com/nkzw-tech/fate/blob/17081c4f677e224e55b75d9a31bd6e0a7ee94af1/packages/fate/src/client.ts#L853)
754
+ Defined in: [packages/fate/src/client.ts:853](https://github.com/nkzw-tech/fate/blob/641aeb0396b93477dc2e75fdb2c29a4c2b62a272/packages/fate/src/client.ts#L853)
755
755
 
756
756
  #### Type Parameters
757
757
 
@@ -787,7 +787,7 @@ Defined in: [packages/fate/src/client.ts:853](https://github.com/nkzw-tech/fate/
787
787
 
788
788
  > **write**(`type`, `data`, `select`, `snapshots?`, `plan?`, `pathPrefix?`, `blockedMask?`, `insert?`, `listSnapshots?`): `string`
789
789
 
790
- Defined in: [packages/fate/src/client.ts:626](https://github.com/nkzw-tech/fate/blob/17081c4f677e224e55b75d9a31bd6e0a7ee94af1/packages/fate/src/client.ts#L626)
790
+ Defined in: [packages/fate/src/client.ts:626](https://github.com/nkzw-tech/fate/blob/641aeb0396b93477dc2e75fdb2c29a4c2b62a272/packages/fate/src/client.ts#L626)
791
791
 
792
792
  #### Parameters
793
793
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  > **clientRoot**\<`Result`, `Type`\>(`type`): `RootDefinition`\<`Type`, `Result`\>
4
4
 
5
- Defined in: [packages/fate/src/root.ts:7](https://github.com/nkzw-tech/fate/blob/17081c4f677e224e55b75d9a31bd6e0a7ee94af1/packages/fate/src/root.ts#L7)
5
+ Defined in: [packages/fate/src/root.ts:7](https://github.com/nkzw-tech/fate/blob/641aeb0396b93477dc2e75fdb2c29a4c2b62a272/packages/fate/src/root.ts#L7)
6
6
 
7
7
  Defines a root query for an entity type, capturing the response shape.
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  > **createClient**\<`T`\>(`options`): [`FateClient`](../classes/FateClient.md)\<`T`\[`0`\], `T`\[`1`\]\>
4
4
 
5
- Defined in: [packages/fate/src/client.ts:3006](https://github.com/nkzw-tech/fate/blob/17081c4f677e224e55b75d9a31bd6e0a7ee94af1/packages/fate/src/client.ts#L3006)
5
+ Defined in: [packages/fate/src/client.ts:3009](https://github.com/nkzw-tech/fate/blob/641aeb0396b93477dc2e75fdb2c29a4c2b62a272/packages/fate/src/client.ts#L3009)
6
6
 
7
7
  ## Type Parameters
8
8