@nkzw/fate 1.4.0 → 1.5.0

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 (189) hide show
  1. package/README.md +326 -0
  2. package/docs/api/classes/FateClient.md +51 -199
  3. package/docs/api/functions/clientRoot.md +1 -1
  4. package/docs/api/functions/createClient.md +1 -1
  5. package/docs/api/functions/createGraphQLTransport.md +1 -1
  6. package/docs/api/functions/createHTTPTransport.md +1 -1
  7. package/docs/api/functions/createTRPCTransport.md +5 -1
  8. package/docs/api/functions/defer.md +1 -1
  9. package/docs/api/functions/getDeferredMetadata.md +1 -1
  10. package/docs/api/functions/getListEntries.md +1 -1
  11. package/docs/api/functions/getSelectionPlan.md +1 -1
  12. package/docs/api/functions/graphqlMutation.md +1 -1
  13. package/docs/api/functions/isDeferred.md +1 -1
  14. package/docs/api/functions/isRecord.md +1 -1
  15. package/docs/api/functions/isViewTag.md +1 -1
  16. package/docs/api/functions/liveConnectionTopic.md +1 -1
  17. package/docs/api/functions/liveEntityTopic.md +1 -1
  18. package/docs/api/functions/liveGlobalConnectionTopic.md +1 -1
  19. package/docs/api/functions/mutation.md +1 -1
  20. package/docs/api/functions/toEntityId.md +1 -1
  21. package/docs/api/functions/view.md +1 -1
  22. package/docs/api/index.md +4 -1
  23. package/docs/api/interfaces/FateThenable.md +3 -3
  24. package/docs/api/interfaces/Persistence.md +23 -0
  25. package/docs/api/interfaces/PersistenceSession.md +109 -0
  26. package/docs/api/interfaces/Transport.md +46 -7
  27. package/docs/api/server/classes/FateRequestError.md +5 -5
  28. package/docs/api/server/drizzle/functions/createDrizzleFate.md +1 -1
  29. package/docs/api/server/drizzle/functions/createDrizzleSourceAdapter.md +1 -1
  30. package/docs/api/server/drizzle/functions/createDrizzleSourceRegistry.md +1 -1
  31. package/docs/api/server/drizzle/type-aliases/DrizzleManyToManyConfig.md +1 -1
  32. package/docs/api/server/drizzle/type-aliases/DrizzleManyToManyInput.md +1 -1
  33. package/docs/api/server/drizzle/type-aliases/DrizzleQueryExtra.md +3 -3
  34. package/docs/api/server/drizzle/type-aliases/DrizzleSourceAdapter.md +9 -9
  35. package/docs/api/server/drizzle/type-aliases/DrizzleViewConfig.md +1 -1
  36. package/docs/api/server/functions/bindSourceProcedures.md +1 -1
  37. package/docs/api/server/functions/computed.md +1 -1
  38. package/docs/api/server/functions/count.md +1 -1
  39. package/docs/api/server/functions/createFateFetchHandler.md +1 -1
  40. package/docs/api/server/functions/createFateServer.md +1 -1
  41. package/docs/api/server/functions/createHonoFateHandler.md +1 -1
  42. package/docs/api/server/functions/createLiveEventBus.md +1 -1
  43. package/docs/api/server/functions/createNestedSourcePlan.md +1 -1
  44. package/docs/api/server/functions/createResolver.md +1 -1
  45. package/docs/api/server/functions/createSourcePlan.md +1 -1
  46. package/docs/api/server/functions/createSourceProcedures.md +1 -1
  47. package/docs/api/server/functions/dataView.md +1 -1
  48. package/docs/api/server/functions/field.md +1 -1
  49. package/docs/api/server/functions/getNestedSelection.md +1 -1
  50. package/docs/api/server/functions/getScopedArgs.md +1 -1
  51. package/docs/api/server/functions/hasNestedSelection.md +1 -1
  52. package/docs/api/server/functions/list.md +1 -1
  53. package/docs/api/server/functions/refetchSourceById.md +1 -1
  54. package/docs/api/server/functions/resolveSourceById.md +1 -1
  55. package/docs/api/server/functions/resolveSourceByIds.md +1 -1
  56. package/docs/api/server/functions/resolveSourceConnection.md +1 -1
  57. package/docs/api/server/functions/resolver.md +1 -1
  58. package/docs/api/server/functions/toPrismaSelect.md +1 -1
  59. package/docs/api/server/functions/withConnection.md +1 -1
  60. package/docs/api/server/prisma/functions/createPrismaFate.md +1 -1
  61. package/docs/api/server/prisma/functions/createPrismaSourceAdapter.md +1 -1
  62. package/docs/api/server/prisma/functions/createPrismaSourceRegistry.md +1 -1
  63. package/docs/api/server/prisma/functions/prismaConnectionArgs.md +1 -1
  64. package/docs/api/server/prisma/type-aliases/PrismaDelegate.md +4 -4
  65. package/docs/api/server/prisma/type-aliases/PrismaQueryExtra.md +1 -1
  66. package/docs/api/server/prisma/type-aliases/PrismaSourceAdapter.md +9 -9
  67. package/docs/api/server/prisma/type-aliases/PrismaViewConfig.md +1 -1
  68. package/docs/api/server/type-aliases/ComputedField.md +5 -5
  69. package/docs/api/server/type-aliases/ComputedSelection.md +1 -1
  70. package/docs/api/server/type-aliases/ConnectionItem.md +3 -3
  71. package/docs/api/server/type-aliases/ConnectionPagination.md +5 -5
  72. package/docs/api/server/type-aliases/ConnectionResult.md +3 -3
  73. package/docs/api/server/type-aliases/CountSelection.md +4 -4
  74. package/docs/api/server/type-aliases/CountWhere.md +1 -1
  75. package/docs/api/server/type-aliases/DataViewListOptions.md +2 -2
  76. package/docs/api/server/type-aliases/DataViewOrderBy.md +1 -1
  77. package/docs/api/server/type-aliases/DataViewOrderDirection.md +1 -1
  78. package/docs/api/server/type-aliases/DataViewResult.md +1 -1
  79. package/docs/api/server/type-aliases/Entity.md +1 -1
  80. package/docs/api/server/type-aliases/FateServer.md +5 -5
  81. package/docs/api/server/type-aliases/FateServerManifest.md +1 -1
  82. package/docs/api/server/type-aliases/FieldSelection.md +3 -3
  83. package/docs/api/server/type-aliases/LiveConnectionEventType.md +1 -1
  84. package/docs/api/server/type-aliases/LiveConnectionSourceEvent.md +1 -1
  85. package/docs/api/server/type-aliases/LiveEventBus.md +1 -1
  86. package/docs/api/server/type-aliases/LiveEventType.md +1 -1
  87. package/docs/api/server/type-aliases/LiveSourceEvent.md +1 -1
  88. package/docs/api/server/type-aliases/NativeFateAPI.md +4 -4
  89. package/docs/api/server/type-aliases/OrderDirection.md +1 -1
  90. package/docs/api/server/type-aliases/SourceConfig.md +6 -6
  91. package/docs/api/server/type-aliases/SourceDefinition.md +6 -6
  92. package/docs/api/server/type-aliases/SourceOrder.md +1 -1
  93. package/docs/api/server/type-aliases/SourceOrderField.md +3 -3
  94. package/docs/api/server/type-aliases/SourcePlan.md +1 -1
  95. package/docs/api/server/type-aliases/SourcePlanNode.md +1 -1
  96. package/docs/api/server/type-aliases/SourceRegistry.md +1 -1
  97. package/docs/api/server/type-aliases/SourceRelation.md +1 -1
  98. package/docs/api/server/type-aliases/SourceRelationConfig.md +1 -1
  99. package/docs/api/server/variables/byIdInput.md +1 -1
  100. package/docs/api/server/variables/connectionArgs.md +1 -1
  101. package/docs/api/type-aliases/ConnectionMetadata.md +1 -1
  102. package/docs/api/type-aliases/ConnectionRef.md +1 -1
  103. package/docs/api/type-aliases/Deferred.md +1 -1
  104. package/docs/api/type-aliases/DeferredMetadata.md +1 -1
  105. package/docs/api/type-aliases/DeferredSelection.md +1 -1
  106. package/docs/api/type-aliases/DeferredSnapshot.md +1 -1
  107. package/docs/api/type-aliases/Entity.md +2 -2
  108. package/docs/api/type-aliases/EntityId.md +1 -1
  109. package/docs/api/type-aliases/FateDehydratedState.md +1 -1
  110. package/docs/api/type-aliases/FateLiveConnectionEvent.md +1 -1
  111. package/docs/api/type-aliases/FateLiveEvent.md +1 -1
  112. package/docs/api/type-aliases/FateMutations.md +1 -1
  113. package/docs/api/type-aliases/FateOperation.md +2 -2
  114. package/docs/api/type-aliases/FateProtocolRequest.md +1 -1
  115. package/docs/api/type-aliases/FateProtocolResponse.md +1 -1
  116. package/docs/api/type-aliases/FateRecord.md +1 -1
  117. package/docs/api/type-aliases/FateRoots.md +1 -1
  118. package/docs/api/type-aliases/GraphQLMutationDefinition.md +1 -1
  119. package/docs/api/type-aliases/GraphQLMutationInput.md +1 -1
  120. package/docs/api/type-aliases/GraphQLMutationMap.md +1 -1
  121. package/docs/api/type-aliases/GraphQLMutationOutput.md +1 -1
  122. package/docs/api/type-aliases/GraphQLTransportOptions.md +19 -11
  123. package/docs/api/type-aliases/HydrateOptions.md +1 -1
  124. package/docs/api/type-aliases/HydrationLimits.md +1 -1
  125. package/docs/api/type-aliases/InferFateAPI.md +1 -1
  126. package/docs/api/type-aliases/List.md +1 -1
  127. package/docs/api/type-aliases/ListEntry.md +1 -1
  128. package/docs/api/type-aliases/ListItem.md +1 -1
  129. package/docs/api/type-aliases/Mask.md +1 -1
  130. package/docs/api/type-aliases/MutationDefinition.md +1 -1
  131. package/docs/api/type-aliases/MutationEntity.md +1 -1
  132. package/docs/api/type-aliases/MutationIdentifier.md +1 -1
  133. package/docs/api/type-aliases/MutationIdentity.md +7 -0
  134. package/docs/api/type-aliases/MutationInput.md +1 -1
  135. package/docs/api/type-aliases/MutationResult.md +1 -1
  136. package/docs/api/type-aliases/NodesItem.md +1 -1
  137. package/docs/api/type-aliases/Pagination.md +5 -5
  138. package/docs/api/type-aliases/PersistenceSnapshot.md +5 -0
  139. package/docs/api/type-aliases/Request.md +1 -1
  140. package/docs/api/type-aliases/RequestMode.md +1 -1
  141. package/docs/api/type-aliases/RequestOptions.md +2 -2
  142. package/docs/api/type-aliases/RequestResult.md +1 -1
  143. package/docs/api/type-aliases/Selection.md +1 -1
  144. package/docs/api/type-aliases/TypeConfig.md +4 -4
  145. package/docs/api/type-aliases/View.md +1 -1
  146. package/docs/api/type-aliases/ViewData.md +1 -1
  147. package/docs/api/type-aliases/ViewEntity.md +1 -1
  148. package/docs/api/type-aliases/ViewEntityName.md +1 -1
  149. package/docs/api/type-aliases/ViewRef.md +1 -1
  150. package/docs/api/type-aliases/ViewSelection.md +1 -1
  151. package/docs/api/type-aliases/ViewSnapshot.md +1 -1
  152. package/docs/api/type-aliases/ViewTag.md +1 -1
  153. package/docs/api/variables/ConnectionTag.md +1 -1
  154. package/docs/api/variables/DeferTag.md +1 -1
  155. package/docs/api/variables/DeferredTag.md +1 -1
  156. package/docs/guide/getting-started.md +2 -0
  157. package/docs/guide/persistence.md +323 -0
  158. package/lib/{liveTopics-uVP0LG-Q.mjs → args-CRLIRl_v.mjs} +1 -59
  159. package/lib/{executor-BRudKWDY.d.mts → executor-DoiTBiVv.d.mts} +1 -1
  160. package/lib/{graphqlTransport-BDR1pnUQ.d.mts → graphqlTransport-DGLYyRxL.d.mts} +3 -2
  161. package/lib/{graphqlTransport-DSBVS2Fq.mjs → graphqlTransport-DmheG3AO.mjs} +3 -2
  162. package/lib/graphqlTransport.d.mts +1 -1
  163. package/lib/graphqlTransport.mjs +1 -1
  164. package/lib/hydration-DPZRJgnu.mjs +273 -0
  165. package/lib/idempotency-types-CqA-BFpn.d.mts +15 -0
  166. package/lib/idempotency.d.mts +26 -0
  167. package/lib/idempotency.mjs +34 -0
  168. package/lib/index.d.mts +5 -5
  169. package/lib/index.mjs +265 -1567
  170. package/lib/{list-Bb1SeABn.d.mts → list-BRT1VtiT.d.mts} +1 -1
  171. package/lib/list.d.mts +1 -1
  172. package/lib/liveTopics-DuFkDZQm.mjs +17 -0
  173. package/lib/persistence.d.mts +38 -0
  174. package/lib/persistence.mjs +1529 -0
  175. package/lib/protocol-DS5sf6sd.mjs +44 -0
  176. package/lib/{record-BTUXkHQU.d.mts → record-DITM4zb_.d.mts} +8 -4
  177. package/lib/server/drizzle.d.mts +2 -2
  178. package/lib/server/drizzle.mjs +1 -1
  179. package/lib/server/prisma.d.mts +2 -2
  180. package/lib/server/prisma.mjs +1 -6
  181. package/lib/server.d.mts +3 -3
  182. package/lib/server.mjs +19 -7
  183. package/lib/sortObjectKeys-yhuitEQZ.mjs +9 -0
  184. package/lib/{sourceRouter-DSaADXSf.mjs → sourceRouter-51POBlEE.mjs} +9 -6
  185. package/lib/store-CeatPJeK.mjs +1350 -0
  186. package/lib/{transport-Bo1Jgo9R.d.mts → transport-DqjhjLfC.d.mts} +594 -412
  187. package/lib/vite.mjs +18 -10
  188. package/package.json +12 -2
  189. package/docs/api/type-aliases/Snapshot.md +0 -7
package/lib/vite.mjs CHANGED
@@ -1,3 +1,4 @@
1
+ import { t as sortObjectKeys } from "./sortObjectKeys-yhuitEQZ.mjs";
1
2
  import path from "node:path";
2
3
  import { runnerImport, transformWithOxc } from "vite";
3
4
  import { mkdir, readFile, rm, writeFile } from "node:fs/promises";
@@ -69,12 +70,7 @@ const formatTypes = (types) => {
69
70
  };
70
71
  const indentBlock = (value, spaces) => value.split("\n").map((line) => line.length ? `${" ".repeat(spaces)}${line}` : line).join("\n");
71
72
  const compareStrings = (left, right) => left < right ? -1 : left > right ? 1 : 0;
72
- const canonicalizeHydrationScopeValue = (value) => {
73
- if (Array.isArray(value)) return value.map(canonicalizeHydrationScopeValue);
74
- if (!value || typeof value !== "object") return value;
75
- return Object.fromEntries(Object.entries(value).sort(([left], [right]) => compareStrings(left, right)).map(([key, entry]) => [key, canonicalizeHydrationScopeValue(entry)]));
76
- };
77
- const getHydrationScope = (moduleName, roots, types) => JSON.stringify(canonicalizeHydrationScopeValue({
73
+ const getHydrationScope = (moduleName, roots, types) => JSON.stringify(sortObjectKeys({
78
74
  moduleName,
79
75
  roots,
80
76
  types: [...types].sort((left, right) => compareStrings(left.type, right.type))
@@ -260,24 +256,27 @@ export type GeneratedClientMutations = typeof mutations;
260
256
  export type GeneratedClientRoots = typeof roots;
261
257
  const hydrationScope = ${JSON.stringify(getHydrationScope(moduleName, roots, types))} as const;
262
258
 
259
+ const trpcMutations = {
260
+ ${mutationResolverBlock}
261
+ } as const;
262
+
263
263
  export const createFateClient = (options: {
264
264
  links: Parameters<typeof createTRPCProxyClient>[0]['links'];
265
265
  ${indentBlock(liveOptions.trim(), 2)}
266
+ mutateDurably?: Parameters<typeof createTRPCTransport<AppRouter, typeof trpcMutations>>[0]['mutateDurably'];
266
267
  onLiveError?: (error: unknown) => void;
268
+ persistence?: import("@nkzw/fate").Persistence;
267
269
  }) => {
268
270
  const trpcClient = createTRPCProxyClient<AppRouter>(options);
269
271
  ${liveTransportSetup}
270
272
 
271
- const trpcMutations = {
272
- ${mutationResolverBlock}
273
- } as const;
274
-
275
273
  const transport = createTRPCTransport<AppRouter, typeof trpcMutations>({
276
274
  byId: {
277
275
  ${byIdBlock}
278
276
  },
279
277
  client: trpcClient,
280
278
  ${queriesBlock}${listsBlock} mutations: trpcMutations,
279
+ mutateDurably: options.mutateDurably,
281
280
  });
282
281
  ${liveTransportAssignment}
283
282
 
@@ -285,6 +284,7 @@ ${liveTransportAssignment}
285
284
  hydrationScope,
286
285
  mutations,
287
286
  onLiveError: options.onLiveError,
287
+ persistence: options.persistence,
288
288
  roots,
289
289
  transport,
290
290
  types: ${typesBlock.trimStart()},
@@ -395,13 +395,16 @@ export const createFateClient = (options: {
395
395
  fetch?: typeof fetch;
396
396
  headers?: HeadersInit | (() => HeadersInit | Promise<HeadersInit>);
397
397
  live?: Parameters<typeof createGraphQLTransport>[0]['live'];
398
+ mutateDurably?: Parameters<typeof createGraphQLTransport<GraphQLTransportMutations>>[0]['mutateDurably'];
398
399
  onLiveError?: (error: unknown) => void;
400
+ persistence?: import("@nkzw/fate").Persistence;
399
401
  url: string | URL;
400
402
  }) =>
401
403
  createClient<[GeneratedClientRoots, GeneratedClientMutations], typeof hydrationScope>({
402
404
  hydrationScope,
403
405
  mutations,
404
406
  onLiveError: options.onLiveError,
407
+ persistence: options.persistence,
405
408
  roots,
406
409
  transport: createGraphQLTransport<GraphQLTransportMutations>({
407
410
  decodeNodeId: options.decodeNodeId,
@@ -411,6 +414,7 @@ export const createFateClient = (options: {
411
414
  headers: options.headers,
412
415
  live: options.live,
413
416
  mutations: graphQL.mutations,
417
+ mutateDurably: options.mutateDurably,
414
418
  roots: graphQL.roots,
415
419
  types: ${typesBlock.trimStart()},
416
420
  url: options.url,
@@ -537,6 +541,7 @@ const toEndpointUrl = (url: string | URL | undefined, path: string, origin: stri
537
541
  liveRetryMs?: number;
538
542
  liveUrl?: string | URL;
539
543
  onLiveError?: (error: unknown) => void;
544
+ persistence?: import("@nkzw/fate").Persistence;
540
545
  origin?: string | URL;
541
546
  rpcPath?: string;
542
547
  url?: string | URL;
@@ -547,6 +552,7 @@ const toEndpointUrl = (url: string | URL | undefined, path: string, origin: stri
547
552
  liveRetryMs?: number;
548
553
  liveUrl?: string | URL;
549
554
  onLiveError?: (error: unknown) => void;
555
+ persistence?: import("@nkzw/fate").Persistence;
550
556
  url: string | URL;
551
557
  }`;
552
558
  const clientSetup = voidTransport || cloudflareTransport ? ` => {
@@ -556,6 +562,7 @@ const toEndpointUrl = (url: string | URL | undefined, path: string, origin: stri
556
562
  hydrationScope,
557
563
  mutations,
558
564
  onLiveError: options.onLiveError,
565
+ persistence: options.persistence,
559
566
  roots,
560
567
  transport: createHTTPTransport<FateAPI>({
561
568
  fetch: ${voidTransport ? "createVoidFetch(options)" : "options.fetch"},
@@ -576,6 +583,7 @@ const toEndpointUrl = (url: string | URL | undefined, path: string, origin: stri
576
583
  hydrationScope,
577
584
  mutations,
578
585
  onLiveError: options.onLiveError,
586
+ persistence: options.persistence,
579
587
  roots,
580
588
  transport: createHTTPTransport<FateAPI>({
581
589
  fetch: options.fetch,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nkzw/fate",
3
- "version": "1.4.0",
3
+ "version": "1.5.0",
4
4
  "description": "fate is a modern data client for React.",
5
5
  "homepage": "https://github.com/nkzw-tech/fate",
6
6
  "license": "MIT",
@@ -62,6 +62,16 @@
62
62
  "types": "./lib/vite.d.mts",
63
63
  "@nkzw/source": "./src/vite.ts",
64
64
  "default": "./lib/vite.mjs"
65
+ },
66
+ "./persistence": {
67
+ "types": "./lib/persistence.d.mts",
68
+ "@nkzw/source": "./src/persistence.ts",
69
+ "default": "./lib/persistence.mjs"
70
+ },
71
+ "./persistence/server": {
72
+ "types": "./lib/idempotency.d.mts",
73
+ "@nkzw/source": "./src/idempotency.ts",
74
+ "default": "./lib/idempotency.mjs"
65
75
  }
66
76
  },
67
77
  "dependencies": {
@@ -96,6 +106,6 @@
96
106
  }
97
107
  },
98
108
  "scripts": {
99
- "build": "vp pack --tsconfig tsconfig.json -d lib --target=node24 src/index.ts src/clientStub.ts src/list.ts src/cli.ts src/server.ts src/server/drizzle.ts src/server/prisma.ts src/graphqlTransport.ts src/vite.ts"
109
+ "build": "vp pack --tsconfig tsconfig.json -d lib --target=node24 src/index.ts src/clientStub.ts src/list.ts src/cli.ts src/server.ts src/server/drizzle.ts src/server/prisma.ts src/graphqlTransport.ts src/vite.ts src/persistence.ts src/idempotency.ts"
100
110
  }
101
111
  }
@@ -1,7 +0,0 @@
1
- # Type Alias: Snapshot
2
-
3
- > **Snapshot** = `Readonly`\<\{ `mask?`: `FieldMask`; `record?`: [`FateRecord`](FateRecord.md); \}\>
4
-
5
- Defined in: [packages/fate/src/types.ts:513](https://github.com/nkzw-tech/fate/blob/aec05ea2ab0386693600d573021cd2a93f1d8b59/packages/fate/src/types.ts#L513)
6
-
7
- Snapshot captured before mutating the cache, used to roll back on errors.