@gaganref/confect-server 0.0.0-stage → 10.3.1-fork.10

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 (367) hide show
  1. package/CHANGELOG.md +2119 -0
  2. package/LICENSE +7 -0
  3. package/README.md +16 -2
  4. package/dist/ActionCtx.d.ts +10 -0
  5. package/dist/ActionCtx.d.ts.map +1 -0
  6. package/dist/ActionCtx.js +18 -0
  7. package/dist/ActionCtx.js.map +1 -0
  8. package/dist/ActionRunner.d.ts +16 -0
  9. package/dist/ActionRunner.d.ts.map +1 -0
  10. package/dist/ActionRunner.js +18 -0
  11. package/dist/ActionRunner.js.map +1 -0
  12. package/dist/AiGatewayDecisionClient.d.ts +20 -0
  13. package/dist/AiGatewayDecisionClient.d.ts.map +1 -0
  14. package/dist/AiGatewayDecisionClient.js +31 -0
  15. package/dist/AiGatewayDecisionClient.js.map +1 -0
  16. package/dist/AiGatewayDecisionModel.d.ts +24 -0
  17. package/dist/AiGatewayDecisionModel.d.ts.map +1 -0
  18. package/dist/AiGatewayDecisionModel.js +27 -0
  19. package/dist/AiGatewayDecisionModel.js.map +1 -0
  20. package/dist/AiGatewayLanguageClient.d.ts +21 -0
  21. package/dist/AiGatewayLanguageClient.d.ts.map +1 -0
  22. package/dist/AiGatewayLanguageClient.js +32 -0
  23. package/dist/AiGatewayLanguageClient.js.map +1 -0
  24. package/dist/AiGatewayLanguageModel.d.ts +95 -0
  25. package/dist/AiGatewayLanguageModel.d.ts.map +1 -0
  26. package/dist/AiGatewayLanguageModel.js +42 -0
  27. package/dist/AiGatewayLanguageModel.js.map +1 -0
  28. package/dist/Auth.d.ts +20 -0
  29. package/dist/Auth.d.ts.map +1 -0
  30. package/dist/Auth.js +31 -0
  31. package/dist/Auth.js.map +1 -0
  32. package/dist/BlobNotFoundError.d.ts +9 -0
  33. package/dist/BlobNotFoundError.d.ts.map +1 -0
  34. package/dist/BlobNotFoundError.js +13 -0
  35. package/dist/BlobNotFoundError.js.map +1 -0
  36. package/dist/Callback.d.ts +31 -0
  37. package/dist/Callback.d.ts.map +1 -0
  38. package/dist/Callback.js +182 -0
  39. package/dist/Callback.js.map +1 -0
  40. package/dist/ComponentCtx.d.ts +71 -0
  41. package/dist/ComponentCtx.d.ts.map +1 -0
  42. package/dist/ComponentCtx.js +0 -0
  43. package/dist/ConvexConfigProvider.d.ts +21 -0
  44. package/dist/ConvexConfigProvider.d.ts.map +1 -0
  45. package/dist/ConvexConfigProvider.js +36 -0
  46. package/dist/ConvexConfigProvider.js.map +1 -0
  47. package/dist/ConvexFunctionDefinitions.d.ts +25 -0
  48. package/dist/ConvexFunctionDefinitions.d.ts.map +1 -0
  49. package/dist/ConvexFunctionDefinitions.js +25 -0
  50. package/dist/ConvexFunctionDefinitions.js.map +1 -0
  51. package/dist/ConvexLogger.d.ts +17 -0
  52. package/dist/ConvexLogger.d.ts.map +1 -0
  53. package/dist/ConvexLogger.js +33 -0
  54. package/dist/ConvexLogger.js.map +1 -0
  55. package/dist/CronJob.d.ts +14 -0
  56. package/dist/CronJob.d.ts.map +1 -0
  57. package/dist/CronJob.js +22 -0
  58. package/dist/CronJob.js.map +1 -0
  59. package/dist/CronJobs.d.ts +22 -0
  60. package/dist/CronJobs.d.ts.map +1 -0
  61. package/dist/CronJobs.js +83 -0
  62. package/dist/CronJobs.js.map +1 -0
  63. package/dist/DataModel.d.ts +28 -0
  64. package/dist/DataModel.d.ts.map +1 -0
  65. package/dist/DataModel.js +7 -0
  66. package/dist/DataModel.js.map +1 -0
  67. package/dist/DatabaseReader.d.ts +26 -0
  68. package/dist/DatabaseReader.d.ts.map +1 -0
  69. package/dist/DatabaseReader.js +33 -0
  70. package/dist/DatabaseReader.js.map +1 -0
  71. package/dist/DatabaseSchema.d.ts +67 -0
  72. package/dist/DatabaseSchema.d.ts.map +1 -0
  73. package/dist/DatabaseSchema.js +61 -0
  74. package/dist/DatabaseSchema.js.map +1 -0
  75. package/dist/DatabaseWriter.d.ts +44 -0
  76. package/dist/DatabaseWriter.d.ts.map +1 -0
  77. package/dist/DatabaseWriter.js +47 -0
  78. package/dist/DatabaseWriter.js.map +1 -0
  79. package/dist/Document.d.ts +37 -0
  80. package/dist/Document.d.ts.map +1 -0
  81. package/dist/Document.js +54 -0
  82. package/dist/Document.js.map +1 -0
  83. package/dist/ExecutionMetadata.d.ts +13 -0
  84. package/dist/ExecutionMetadata.d.ts.map +1 -0
  85. package/dist/ExecutionMetadata.js +19 -0
  86. package/dist/ExecutionMetadata.js.map +1 -0
  87. package/dist/FunctionImpl.d.ts +39 -0
  88. package/dist/FunctionImpl.d.ts.map +1 -0
  89. package/dist/FunctionImpl.js +46 -0
  90. package/dist/FunctionImpl.js.map +1 -0
  91. package/dist/FunctionRegistryItem.d.ts +36 -0
  92. package/dist/FunctionRegistryItem.d.ts.map +1 -0
  93. package/dist/FunctionRegistryItem.js +34 -0
  94. package/dist/FunctionRegistryItem.js.map +1 -0
  95. package/dist/GroupImpl.d.ts +77 -0
  96. package/dist/GroupImpl.d.ts.map +1 -0
  97. package/dist/GroupImpl.js +81 -0
  98. package/dist/GroupImpl.js.map +1 -0
  99. package/dist/GroupRegistry.d.ts +8 -0
  100. package/dist/GroupRegistry.d.ts.map +1 -0
  101. package/dist/GroupRegistry.js +26 -0
  102. package/dist/GroupRegistry.js.map +1 -0
  103. package/dist/Handler.d.ts +47 -0
  104. package/dist/Handler.d.ts.map +1 -0
  105. package/dist/Handler.js +7 -0
  106. package/dist/Handler.js.map +1 -0
  107. package/dist/HttpRouter.d.ts +80 -0
  108. package/dist/HttpRouter.d.ts.map +1 -0
  109. package/dist/HttpRouter.js +195 -0
  110. package/dist/HttpRouter.js.map +1 -0
  111. package/dist/MiddlewareImpl.d.ts +79 -0
  112. package/dist/MiddlewareImpl.d.ts.map +1 -0
  113. package/dist/MiddlewareImpl.js +58 -0
  114. package/dist/MiddlewareImpl.js.map +1 -0
  115. package/dist/MiddlewareRegistryItem.d.ts +12 -0
  116. package/dist/MiddlewareRegistryItem.d.ts.map +1 -0
  117. package/dist/MiddlewareRegistryItem.js +15 -0
  118. package/dist/MiddlewareRegistryItem.js.map +1 -0
  119. package/dist/MutationCtx.d.ts +10 -0
  120. package/dist/MutationCtx.d.ts.map +1 -0
  121. package/dist/MutationCtx.js +18 -0
  122. package/dist/MutationCtx.js.map +1 -0
  123. package/dist/MutationRunner.d.ts +27 -0
  124. package/dist/MutationRunner.d.ts.map +1 -0
  125. package/dist/MutationRunner.js +28 -0
  126. package/dist/MutationRunner.js.map +1 -0
  127. package/dist/MutationTransactionContext.d.ts +17 -0
  128. package/dist/MutationTransactionContext.d.ts.map +1 -0
  129. package/dist/MutationTransactionContext.js +20 -0
  130. package/dist/MutationTransactionContext.js.map +1 -0
  131. package/dist/OrderedQuery.d.ts +32 -0
  132. package/dist/OrderedQuery.d.ts.map +1 -0
  133. package/dist/OrderedQuery.js +36 -0
  134. package/dist/OrderedQuery.js.map +1 -0
  135. package/dist/QueryCtx.d.ts +10 -0
  136. package/dist/QueryCtx.d.ts.map +1 -0
  137. package/dist/QueryCtx.js +18 -0
  138. package/dist/QueryCtx.js.map +1 -0
  139. package/dist/QueryInitializer.d.ts +75 -0
  140. package/dist/QueryInitializer.d.ts.map +1 -0
  141. package/dist/QueryInitializer.js +105 -0
  142. package/dist/QueryInitializer.js.map +1 -0
  143. package/dist/QueryRunner.d.ts +46 -0
  144. package/dist/QueryRunner.d.ts.map +1 -0
  145. package/dist/QueryRunner.js +30 -0
  146. package/dist/QueryRunner.js.map +1 -0
  147. package/dist/QueryStream.d.ts +678 -0
  148. package/dist/QueryStream.d.ts.map +1 -0
  149. package/dist/QueryStream.js +943 -0
  150. package/dist/QueryStream.js.map +1 -0
  151. package/dist/QueryStreamCursor.d.ts +39 -0
  152. package/dist/QueryStreamCursor.d.ts.map +1 -0
  153. package/dist/QueryStreamCursor.js +52 -0
  154. package/dist/QueryStreamCursor.js.map +1 -0
  155. package/dist/QueryStreamIndexPrefix.d.ts +48 -0
  156. package/dist/QueryStreamIndexPrefix.d.ts.map +1 -0
  157. package/dist/QueryStreamIndexPrefix.js +38 -0
  158. package/dist/QueryStreamIndexPrefix.js.map +1 -0
  159. package/dist/QueryStreamIndexRange.d.ts +193 -0
  160. package/dist/QueryStreamIndexRange.d.ts.map +1 -0
  161. package/dist/QueryStreamIndexRange.js +241 -0
  162. package/dist/QueryStreamIndexRange.js.map +1 -0
  163. package/dist/QueryStreamKey.d.ts +64 -0
  164. package/dist/QueryStreamKey.d.ts.map +1 -0
  165. package/dist/QueryStreamKey.js +69 -0
  166. package/dist/QueryStreamKey.js.map +1 -0
  167. package/dist/QueryStreamKeyBounds.d.ts +136 -0
  168. package/dist/QueryStreamKeyBounds.d.ts.map +1 -0
  169. package/dist/QueryStreamKeyBounds.js +208 -0
  170. package/dist/QueryStreamKeyBounds.js.map +1 -0
  171. package/dist/QueryStreamKeyLabels.d.ts +27 -0
  172. package/dist/QueryStreamKeyLabels.d.ts.map +1 -0
  173. package/dist/QueryStreamKeyLabels.js +22 -0
  174. package/dist/QueryStreamKeyLabels.js.map +1 -0
  175. package/dist/QueryStreamKeyLayout.d.ts +179 -0
  176. package/dist/QueryStreamKeyLayout.d.ts.map +1 -0
  177. package/dist/QueryStreamKeyLayout.js +167 -0
  178. package/dist/QueryStreamKeyLayout.js.map +1 -0
  179. package/dist/QueryStreamKeyValues.d.ts +40 -0
  180. package/dist/QueryStreamKeyValues.d.ts.map +1 -0
  181. package/dist/QueryStreamKeyValues.js +57 -0
  182. package/dist/QueryStreamKeyValues.js.map +1 -0
  183. package/dist/QueryStreamOrderDirection.d.ts +24 -0
  184. package/dist/QueryStreamOrderDirection.d.ts.map +1 -0
  185. package/dist/QueryStreamOrderDirection.js +11 -0
  186. package/dist/QueryStreamOrderDirection.js.map +1 -0
  187. package/dist/QueryStreamPagination.d.ts +264 -0
  188. package/dist/QueryStreamPagination.d.ts.map +1 -0
  189. package/dist/QueryStreamPagination.js +172 -0
  190. package/dist/QueryStreamPagination.js.map +1 -0
  191. package/dist/QueryStreamReadBudget.d.ts +63 -0
  192. package/dist/QueryStreamReadBudget.d.ts.map +1 -0
  193. package/dist/QueryStreamReadBudget.js +81 -0
  194. package/dist/QueryStreamReadBudget.js.map +1 -0
  195. package/dist/QueryTransactionContext.d.ts +16 -0
  196. package/dist/QueryTransactionContext.d.ts.map +1 -0
  197. package/dist/QueryTransactionContext.js +17 -0
  198. package/dist/QueryTransactionContext.js.map +1 -0
  199. package/dist/RegisteredConvexFunction.d.ts +359 -0
  200. package/dist/RegisteredConvexFunction.d.ts.map +1 -0
  201. package/dist/RegisteredConvexFunction.js +154 -0
  202. package/dist/RegisteredConvexFunction.js.map +1 -0
  203. package/dist/RegisteredFunction.d.ts +143 -0
  204. package/dist/RegisteredFunction.d.ts.map +1 -0
  205. package/dist/RegisteredFunction.js +125 -0
  206. package/dist/RegisteredFunction.js.map +1 -0
  207. package/dist/RegisteredFunctions.d.ts +57 -0
  208. package/dist/RegisteredFunctions.d.ts.map +1 -0
  209. package/dist/RegisteredFunctions.js +32 -0
  210. package/dist/RegisteredFunctions.js.map +1 -0
  211. package/dist/RegisteredNodeFunction.d.ts +11 -0
  212. package/dist/RegisteredNodeFunction.d.ts.map +1 -0
  213. package/dist/RegisteredNodeFunction.js +45 -0
  214. package/dist/RegisteredNodeFunction.js.map +1 -0
  215. package/dist/Registry.d.ts +12 -0
  216. package/dist/Registry.d.ts.map +1 -0
  217. package/dist/Registry.js +17 -0
  218. package/dist/Registry.js.map +1 -0
  219. package/dist/RegistryItems.d.ts +21 -0
  220. package/dist/RegistryItems.d.ts.map +1 -0
  221. package/dist/RegistryItems.js +27 -0
  222. package/dist/RegistryItems.js.map +1 -0
  223. package/dist/RequestMetadata.d.ts +12 -0
  224. package/dist/RequestMetadata.d.ts.map +1 -0
  225. package/dist/RequestMetadata.js +16 -0
  226. package/dist/RequestMetadata.js.map +1 -0
  227. package/dist/ResolvedMiddleware.d.ts +24 -0
  228. package/dist/ResolvedMiddleware.d.ts.map +1 -0
  229. package/dist/ResolvedMiddleware.js +34 -0
  230. package/dist/ResolvedMiddleware.js.map +1 -0
  231. package/dist/Scheduler.d.ts +31 -0
  232. package/dist/Scheduler.d.ts.map +1 -0
  233. package/dist/Scheduler.js +35 -0
  234. package/dist/Scheduler.js.map +1 -0
  235. package/dist/Storage.d.ts +22 -0
  236. package/dist/Storage.d.ts.map +1 -0
  237. package/dist/Storage.js +27 -0
  238. package/dist/Storage.js.map +1 -0
  239. package/dist/StorageActionWriter.d.ts +35 -0
  240. package/dist/StorageActionWriter.d.ts.map +1 -0
  241. package/dist/StorageActionWriter.js +24 -0
  242. package/dist/StorageActionWriter.js.map +1 -0
  243. package/dist/StorageReader.d.ts +26 -0
  244. package/dist/StorageReader.d.ts.map +1 -0
  245. package/dist/StorageReader.js +22 -0
  246. package/dist/StorageReader.js.map +1 -0
  247. package/dist/StorageWriter.d.ts +29 -0
  248. package/dist/StorageWriter.d.ts.map +1 -0
  249. package/dist/StorageWriter.js +24 -0
  250. package/dist/StorageWriter.js.map +1 -0
  251. package/dist/Table.d.ts +274 -0
  252. package/dist/Table.d.ts.map +1 -0
  253. package/dist/Table.js +70 -0
  254. package/dist/Table.js.map +1 -0
  255. package/dist/TableInfo.d.ts +44 -0
  256. package/dist/TableInfo.d.ts.map +1 -0
  257. package/dist/TableInfo.js +7 -0
  258. package/dist/TableInfo.js.map +1 -0
  259. package/dist/TransactionMetadata.d.ts +12 -0
  260. package/dist/TransactionMetadata.d.ts.map +1 -0
  261. package/dist/TransactionMetadata.js +16 -0
  262. package/dist/TransactionMetadata.js.map +1 -0
  263. package/dist/VectorSearch.d.ts +23 -0
  264. package/dist/VectorSearch.d.ts.map +1 -0
  265. package/dist/VectorSearch.js +17 -0
  266. package/dist/VectorSearch.js.map +1 -0
  267. package/dist/_virtual/_rolldown/runtime.js +13 -0
  268. package/dist/index.d.ts +88 -0
  269. package/dist/index.d.ts.map +1 -0
  270. package/dist/index.js +61 -0
  271. package/dist/internal/AiGatewayDecisionClient.d.ts +7 -0
  272. package/dist/internal/AiGatewayDecisionClient.d.ts.map +1 -0
  273. package/dist/internal/AiGatewayDecisionClient.js +19 -0
  274. package/dist/internal/AiGatewayDecisionClient.js.map +1 -0
  275. package/dist/internal/AiGatewayLanguageClient.d.ts +7 -0
  276. package/dist/internal/AiGatewayLanguageClient.d.ts.map +1 -0
  277. package/dist/internal/AiGatewayLanguageClient.js +19 -0
  278. package/dist/internal/AiGatewayLanguageClient.js.map +1 -0
  279. package/dist/internal/AiGatewayServiceToken.d.ts +46 -0
  280. package/dist/internal/AiGatewayServiceToken.d.ts.map +1 -0
  281. package/dist/internal/AiGatewayServiceToken.js +62 -0
  282. package/dist/internal/AiGatewayServiceToken.js.map +1 -0
  283. package/dist/internal/constants.d.ts +2 -0
  284. package/dist/internal/constants.d.ts.map +1 -0
  285. package/dist/internal/constants.js +6 -0
  286. package/dist/internal/constants.js.map +1 -0
  287. package/dist/internal/utils.d.ts +13 -0
  288. package/dist/internal/utils.d.ts.map +1 -0
  289. package/dist/internal/utils.js +50 -0
  290. package/dist/internal/utils.js.map +1 -0
  291. package/dist/node.d.ts +2 -0
  292. package/dist/node.d.ts.map +1 -0
  293. package/dist/node.js +1 -0
  294. package/package.json +68 -3
  295. package/src/ActionCtx.ts +45 -0
  296. package/src/ActionRunner.ts +36 -0
  297. package/src/AiGatewayDecisionClient.ts +40 -0
  298. package/src/AiGatewayDecisionModel.ts +46 -0
  299. package/src/AiGatewayLanguageClient.ts +41 -0
  300. package/src/AiGatewayLanguageModel.ts +61 -0
  301. package/src/Auth.ts +51 -0
  302. package/src/BlobNotFoundError.ts +12 -0
  303. package/src/Callback.ts +313 -0
  304. package/src/ComponentCtx.ts +192 -0
  305. package/src/ConvexConfigProvider.ts +39 -0
  306. package/src/ConvexFunctionDefinitions.ts +91 -0
  307. package/src/ConvexLogger.ts +43 -0
  308. package/src/CronJob.ts +42 -0
  309. package/src/CronJobs.ts +165 -0
  310. package/src/DataModel.ts +81 -0
  311. package/src/DatabaseReader.ts +118 -0
  312. package/src/DatabaseSchema.ts +139 -0
  313. package/src/DatabaseWriter.ts +232 -0
  314. package/src/Document.ts +146 -0
  315. package/src/ExecutionMetadata.ts +26 -0
  316. package/src/FunctionImpl.ts +96 -0
  317. package/src/FunctionRegistryItem.ts +85 -0
  318. package/src/GroupImpl.ts +167 -0
  319. package/src/GroupRegistry.ts +41 -0
  320. package/src/Handler.ts +191 -0
  321. package/src/HttpRouter.ts +388 -0
  322. package/src/MiddlewareImpl.ts +247 -0
  323. package/src/MiddlewareRegistryItem.ts +21 -0
  324. package/src/MutationCtx.ts +45 -0
  325. package/src/MutationRunner.ts +66 -0
  326. package/src/MutationTransactionContext.ts +48 -0
  327. package/src/OrderedQuery.ts +136 -0
  328. package/src/QueryCtx.ts +45 -0
  329. package/src/QueryInitializer.ts +537 -0
  330. package/src/QueryRunner.ts +91 -0
  331. package/src/QueryStream.ts +2476 -0
  332. package/src/QueryStreamCursor.ts +99 -0
  333. package/src/QueryStreamIndexPrefix.ts +79 -0
  334. package/src/QueryStreamIndexRange.ts +489 -0
  335. package/src/QueryStreamKey.ts +118 -0
  336. package/src/QueryStreamKeyBounds.ts +395 -0
  337. package/src/QueryStreamKeyLabels.ts +56 -0
  338. package/src/QueryStreamKeyLayout.ts +382 -0
  339. package/src/QueryStreamKeyValues.ts +112 -0
  340. package/src/QueryStreamOrderDirection.ts +29 -0
  341. package/src/QueryStreamPagination.ts +357 -0
  342. package/src/QueryStreamReadBudget.ts +167 -0
  343. package/src/QueryTransactionContext.ts +37 -0
  344. package/src/RegisteredConvexFunction.ts +415 -0
  345. package/src/RegisteredFunction.ts +391 -0
  346. package/src/RegisteredFunctions.ts +88 -0
  347. package/src/RegisteredNodeFunction.ts +120 -0
  348. package/src/Registry.ts +17 -0
  349. package/src/RegistryItems.ts +40 -0
  350. package/src/RequestMetadata.ts +20 -0
  351. package/src/ResolvedMiddleware.ts +70 -0
  352. package/src/Scheduler.ts +85 -0
  353. package/src/Storage.ts +37 -0
  354. package/src/StorageActionWriter.ts +59 -0
  355. package/src/StorageReader.ts +59 -0
  356. package/src/StorageWriter.ts +58 -0
  357. package/src/Table.ts +156 -0
  358. package/src/TableInfo.ts +106 -0
  359. package/src/TransactionMetadata.ts +20 -0
  360. package/src/VectorSearch.ts +75 -0
  361. package/src/index.ts +87 -0
  362. package/src/internal/AiGatewayDecisionClient.ts +16 -0
  363. package/src/internal/AiGatewayLanguageClient.ts +16 -0
  364. package/src/internal/AiGatewayServiceToken.ts +129 -0
  365. package/src/internal/constants.ts +1 -0
  366. package/src/internal/utils.ts +89 -0
  367. package/src/node.ts +1 -0
@@ -0,0 +1,83 @@
1
+ import { __exportAll } from "./_virtual/_rolldown/runtime.js";
2
+ import { cronJobs } from "convex/server";
3
+ import { pipe } from "effect/Function";
4
+ import * as Match from "effect/Match";
5
+ import * as Option from "effect/Option";
6
+ import * as Array from "effect/Array";
7
+ import * as Order from "effect/Order";
8
+ import * as Predicate from "effect/Predicate";
9
+ import * as Record from "effect/Record";
10
+ import * as Duration from "effect/Duration";
11
+ import { Ref } from "@confect/core";
12
+ import * as DateTime from "effect/DateTime";
13
+ import * as Cron from "effect/Cron";
14
+ //#region src/CronJobs.ts
15
+ var CronJobs_exports = /* @__PURE__ */ __exportAll({
16
+ TypeId: () => TypeId,
17
+ cronToConvexCronString: () => cronToConvexCronString,
18
+ durationToConvexIntervalSchedule: () => durationToConvexIntervalSchedule,
19
+ isCronJobs: () => isCronJobs,
20
+ make: () => make
21
+ });
22
+ const TypeId = "~@confect/server/CronJobs";
23
+ const isCronJobs = (u) => Predicate.hasProperty(u, TypeId);
24
+ const Proto = {
25
+ [TypeId]: TypeId,
26
+ add(cronJob) {
27
+ const newConvexCrons = Object.assign(cronJobs(), { crons: { ...this.convexCronJobs.crons } });
28
+ const functionReference = Ref.getFunctionReference(cronJob.ref);
29
+ const encodedArgs = Ref.encodeArgsSync(cronJob.ref, cronJob.args);
30
+ Match.value(cronJob.schedule).pipe(Match.when(Cron.isCron, (cron) => {
31
+ newConvexCrons.cron(cronJob.identifier, cronToConvexCronString(cron), functionReference, encodedArgs);
32
+ }), Match.when(Duration.isDuration, (duration) => {
33
+ newConvexCrons.interval(cronJob.identifier, durationToConvexIntervalSchedule(duration), functionReference, encodedArgs);
34
+ }), Match.exhaustive);
35
+ return makeProto(Record.set(this.cronJobs, cronJob.identifier, cronJob), newConvexCrons);
36
+ }
37
+ };
38
+ const makeProto = (cronJobs, convexCronJobs) => Object.assign(Object.create(Proto), {
39
+ cronJobs,
40
+ convexCronJobs
41
+ });
42
+ const make = () => makeProto({}, cronJobs());
43
+ const cronToConvexCronString = (cron) => {
44
+ pipe(cron.tz, Option.filter((tz) => pipe(tz, Match.value, Match.tag("Offset", ({ offset }) => offset !== 0), Match.tag("Named", ({ id }) => id !== "UTC" && id !== "Etc/UTC"), Match.exhaustive)), Option.map((tz) => {
45
+ throw new Error(`Convex cron expressions are always evaluated in UTC, but this cron specifies the time zone "${DateTime.zoneToString(tz)}". Either omit the timezone or specify UTC.`);
46
+ }));
47
+ if (cron.seconds.size !== 1 || !cron.seconds.has(0)) throw new Error("Convex cron expressions do not support a seconds field. The seconds field must be the default {0}. Sub-minute scheduling is supported only by interval schedules defined using a Duration.");
48
+ return Array.join([
49
+ setToField(cron.minutes),
50
+ setToField(cron.hours),
51
+ setToField(cron.days),
52
+ setToField(cron.months),
53
+ setToField(cron.weekdays)
54
+ ], " ");
55
+ };
56
+ const setToField = (set) => {
57
+ if (set.size === 0) return "*";
58
+ return pipe(set, Array.sort(Order.Number), Array.map((n) => n.toString()), Array.join(","));
59
+ };
60
+ const durationToConvexIntervalSchedule = (duration) => {
61
+ const millis = Duration.toMillis(duration);
62
+ if (millis <= 0) throw new Error("Interval must be a positive duration.");
63
+ const hours = millis / Duration.hours(1).pipe(Duration.toMillis);
64
+ if (Number.isInteger(hours)) return {
65
+ type: "interval",
66
+ hours
67
+ };
68
+ const minutes = millis / Duration.minutes(1).pipe(Duration.toMillis);
69
+ if (Number.isInteger(minutes)) return {
70
+ type: "interval",
71
+ minutes
72
+ };
73
+ const seconds = millis / Duration.seconds(1).pipe(Duration.toMillis);
74
+ if (Number.isInteger(seconds)) return {
75
+ type: "interval",
76
+ seconds
77
+ };
78
+ throw new Error("Interval must be a whole number of seconds, minutes, or hours.");
79
+ };
80
+ //#endregion
81
+ export { CronJobs_exports, TypeId, cronToConvexCronString, durationToConvexIntervalSchedule, isCronJobs, make };
82
+
83
+ //# sourceMappingURL=CronJobs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CronJobs.js","names":["makeConvexCrons"],"sources":["../src/CronJobs.ts"],"sourcesContent":["import { Ref } from \"@confect/core\";\nimport type { CronJob as ConvexCronJob } from \"convex/server\";\nimport { cronJobs as makeConvexCrons, type Crons } from \"convex/server\";\nimport { pipe } from \"effect/Function\";\nimport * as Array from \"effect/Array\";\nimport * as Cron from \"effect/Cron\";\nimport * as DateTime from \"effect/DateTime\";\nimport * as Duration from \"effect/Duration\";\nimport * as Match from \"effect/Match\";\nimport * as Option from \"effect/Option\";\nimport * as Order from \"effect/Order\";\nimport * as Predicate from \"effect/Predicate\";\nimport * as Record from \"effect/Record\";\nimport type * as CronJob from \"./CronJob.js\";\n\nexport const TypeId = \"~@confect/server/CronJobs\";\nexport type TypeId = typeof TypeId;\n\nexport interface CronJobs {\n readonly [TypeId]: TypeId;\n readonly cronJobs: Record<string, CronJob.CronJob>;\n readonly convexCronJobs: Crons;\n\n add(cron: CronJob.CronJob): CronJobs;\n}\n\nexport const isCronJobs = (u: unknown): u is CronJobs =>\n Predicate.hasProperty(u, TypeId);\n\nconst Proto = {\n [TypeId]: TypeId,\n\n add(this: CronJobs, cronJob: CronJob.CronJob) {\n const newConvexCrons = Object.assign(makeConvexCrons(), {\n crons: { ...this.convexCronJobs.crons },\n });\n\n const functionReference = Ref.getFunctionReference(cronJob.ref);\n const encodedArgs = Ref.encodeArgsSync(cronJob.ref, cronJob.args);\n\n Match.value(cronJob.schedule).pipe(\n Match.when(Cron.isCron, (cron) => {\n newConvexCrons.cron(\n cronJob.identifier,\n cronToConvexCronString(cron),\n functionReference,\n encodedArgs,\n );\n }),\n Match.when(Duration.isDuration, (duration) => {\n newConvexCrons.interval(\n cronJob.identifier,\n durationToConvexIntervalSchedule(duration),\n functionReference,\n encodedArgs,\n );\n }),\n Match.exhaustive,\n );\n\n return makeProto(\n Record.set(this.cronJobs, cronJob.identifier, cronJob),\n newConvexCrons,\n );\n },\n};\n\nconst makeProto = (\n cronJobs: Record<string, CronJob.CronJob>,\n convexCronJobs: Crons,\n): CronJobs =>\n Object.assign(Object.create(Proto), {\n cronJobs,\n convexCronJobs,\n });\n\nexport const make = (): CronJobs => makeProto({}, makeConvexCrons());\n\nexport const cronToConvexCronString = (cron: Cron.Cron): string => {\n pipe(\n cron.tz,\n Option.filter((tz) =>\n pipe(\n tz,\n Match.value,\n Match.tag(\"Offset\", ({ offset }) => offset !== 0),\n Match.tag(\"Named\", ({ id }) => id !== \"UTC\" && id !== \"Etc/UTC\"),\n Match.exhaustive,\n ),\n ),\n Option.map((tz) => {\n throw new Error(\n `Convex cron expressions are always evaluated in UTC, but this cron ` +\n `specifies the time zone \"${DateTime.zoneToString(tz)}\". ` +\n `Either omit the timezone or specify UTC.`,\n );\n }),\n );\n\n const hasNonDefaultSeconds = cron.seconds.size !== 1 || !cron.seconds.has(0);\n if (hasNonDefaultSeconds) {\n throw new Error(\n \"Convex cron expressions do not support a seconds field. \" +\n \"The seconds field must be the default {0}. \" +\n \"Sub-minute scheduling is supported only by interval schedules defined using a Duration.\",\n );\n }\n\n return Array.join(\n [\n setToField(cron.minutes),\n setToField(cron.hours),\n setToField(cron.days),\n setToField(cron.months),\n setToField(cron.weekdays),\n ],\n \" \",\n );\n};\n\nconst setToField = (set: ReadonlySet<number>): string => {\n if (set.size === 0) return \"*\";\n return pipe(\n set,\n Array.sort(Order.Number),\n Array.map((n) => n.toString()),\n Array.join(\",\"),\n );\n};\n\nexport const durationToConvexIntervalSchedule = (\n duration: Duration.Duration,\n): IntervalSchedule => {\n const millis = Duration.toMillis(duration);\n if (millis <= 0) {\n throw new Error(\"Interval must be a positive duration.\");\n }\n\n const oneHourInMillis = Duration.hours(1).pipe(Duration.toMillis);\n const hours = millis / oneHourInMillis;\n if (Number.isInteger(hours)) {\n return { type: \"interval\", hours };\n }\n\n const oneMinuteInMillis = Duration.minutes(1).pipe(Duration.toMillis);\n const minutes = millis / oneMinuteInMillis;\n if (Number.isInteger(minutes)) {\n return { type: \"interval\", minutes };\n }\n\n const oneSecondInMillis = Duration.seconds(1).pipe(Duration.toMillis);\n const seconds = millis / oneSecondInMillis;\n if (Number.isInteger(seconds)) {\n return { type: \"interval\", seconds };\n }\n\n throw new Error(\n \"Interval must be a whole number of seconds, minutes, or hours.\",\n );\n};\n\ntype IntervalSchedule = Extract<\n ConvexCronJob[\"schedule\"],\n { type: \"interval\" }\n>;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAeA,MAAa,SAAS;AAWtB,MAAa,cAAc,MACzB,UAAU,YAAY,GAAG,MAAM;AAEjC,MAAM,QAAQ;EACX,SAAS;CAEV,IAAoB,SAA0B;EAC5C,MAAM,iBAAiB,OAAO,OAAOA,SAAgB,GAAG,EACtD,OAAO,EAAE,GAAG,KAAK,eAAe,MAAM,EACxC,CAAC;EAED,MAAM,oBAAoB,IAAI,qBAAqB,QAAQ,GAAG;EAC9D,MAAM,cAAc,IAAI,eAAe,QAAQ,KAAK,QAAQ,IAAI;EAEhE,MAAM,MAAM,QAAQ,QAAQ,CAAC,CAAC,KAC5B,MAAM,KAAK,KAAK,SAAS,SAAS;GAChC,eAAe,KACb,QAAQ,YACR,uBAAuB,IAAI,GAC3B,mBACA,WACF;EACF,CAAC,GACD,MAAM,KAAK,SAAS,aAAa,aAAa;GAC5C,eAAe,SACb,QAAQ,YACR,iCAAiC,QAAQ,GACzC,mBACA,WACF;EACF,CAAC,GACD,MAAM,UACR;EAEA,OAAO,UACL,OAAO,IAAI,KAAK,UAAU,QAAQ,YAAY,OAAO,GACrD,cACF;CACF;AACF;AAEA,MAAM,aACJ,UACA,mBAEA,OAAO,OAAO,OAAO,OAAO,KAAK,GAAG;CAClC;CACA;AACF,CAAC;AAEH,MAAa,aAAuB,UAAU,CAAC,GAAGA,SAAgB,CAAC;AAEnE,MAAa,0BAA0B,SAA4B;CACjE,KACE,KAAK,IACL,OAAO,QAAQ,OACb,KACE,IACA,MAAM,OACN,MAAM,IAAI,WAAW,EAAE,aAAa,WAAW,CAAC,GAChD,MAAM,IAAI,UAAU,EAAE,SAAS,OAAO,SAAS,OAAO,SAAS,GAC/D,MAAM,UACR,CACF,GACA,OAAO,KAAK,OAAO;EACjB,MAAM,IAAI,MACR,+FAC8B,SAAS,aAAa,EAAE,EAAE,4CAE1D;CACF,CAAC,CACH;CAGA,IAD6B,KAAK,QAAQ,SAAS,KAAK,CAAC,KAAK,QAAQ,IAAI,CAAC,GAEzE,MAAM,IAAI,MACR,4LAGF;CAGF,OAAO,MAAM,KACX;EACE,WAAW,KAAK,OAAO;EACvB,WAAW,KAAK,KAAK;EACrB,WAAW,KAAK,IAAI;EACpB,WAAW,KAAK,MAAM;EACtB,WAAW,KAAK,QAAQ;CAC1B,GACA,GACF;AACF;AAEA,MAAM,cAAc,QAAqC;CACvD,IAAI,IAAI,SAAS,GAAG,OAAO;CAC3B,OAAO,KACL,KACA,MAAM,KAAK,MAAM,MAAM,GACvB,MAAM,KAAK,MAAM,EAAE,SAAS,CAAC,GAC7B,MAAM,KAAK,GAAG,CAChB;AACF;AAEA,MAAa,oCACX,aACqB;CACrB,MAAM,SAAS,SAAS,SAAS,QAAQ;CACzC,IAAI,UAAU,GACZ,MAAM,IAAI,MAAM,uCAAuC;CAIzD,MAAM,QAAQ,SADU,SAAS,MAAM,CAAC,CAAC,CAAC,KAAK,SAAS,QACnB;CACrC,IAAI,OAAO,UAAU,KAAK,GACxB,OAAO;EAAE,MAAM;EAAY;CAAM;CAInC,MAAM,UAAU,SADU,SAAS,QAAQ,CAAC,CAAC,CAAC,KAAK,SAAS,QACnB;CACzC,IAAI,OAAO,UAAU,OAAO,GAC1B,OAAO;EAAE,MAAM;EAAY;CAAQ;CAIrC,MAAM,UAAU,SADU,SAAS,QAAQ,CAAC,CAAC,CAAC,KAAK,SAAS,QACnB;CACzC,IAAI,OAAO,UAAU,OAAO,GAC1B,OAAO;EAAE,MAAM;EAAY;CAAQ;CAGrC,MAAM,IAAI,MACR,gEACF;AACF"}
@@ -0,0 +1,28 @@
1
+ import type * as DatabaseSchema from "./DatabaseSchema.js";
2
+ import type * as Table from "./Table.js";
3
+ import type * as TableInfo from "./TableInfo.js";
4
+ import type * as GenericId from "@confect/core/GenericId";
5
+ export declare const TypeId: "~@confect/server/DataModel";
6
+ export type TypeId = typeof TypeId;
7
+ export interface DataModel<Tables_ extends Readonly<Record<string, Table.AnyWithProps>>> {
8
+ readonly [TypeId]: Readonly<Tables_>;
9
+ }
10
+ export interface Any {
11
+ readonly [TypeId]: unknown;
12
+ }
13
+ export interface AnyWithProps extends DataModel<Readonly<Record<string, Table.AnyWithProps>>> {
14
+ }
15
+ export type FromSchema<Schema extends DatabaseSchema.AnyWithProps> = DataModel<Schema[DatabaseSchema.TypeId]>;
16
+ export type FromTables<Tables_ extends Table.AnyWithProps> = DataModel<Table.TablesRecord<Tables_>>;
17
+ export type ToConvex<DataModel_ extends AnyWithProps> = {
18
+ [TableName_ in TableNames<DataModel_>]: TableInfoWithName<DataModel_, TableName_>;
19
+ };
20
+ export type Tables<DataModel_ extends AnyWithProps> = DataModel_[TypeId][keyof DataModel_[TypeId]];
21
+ export type TableNames<DataModel_ extends AnyWithProps> = Table.Name<Tables<DataModel_>> & string;
22
+ export type TableWithName<DataModel_ extends AnyWithProps, TableName extends TableNames<DataModel_>> = Table.WithName<Tables<DataModel_>, TableName>;
23
+ export type TableInfoWithName_<DataModel_ extends AnyWithProps, TableName extends TableNames<DataModel_>> = TableInfo.TableInfo<Table.WithName<Tables<DataModel_>, TableName>>;
24
+ export type TableInfoWithName<DataModel_ extends AnyWithProps, TableName extends TableNames<DataModel_>> = TableInfo.ConvexTableInfo<TableInfo.TableInfo<Table.WithName<Tables<DataModel_>, TableName>>>;
25
+ export type DocumentWithName<DataModel_ extends AnyWithProps, TableName extends TableNames<DataModel_>> = TableInfo.Document<TableInfo.TableInfo<Table.WithName<Tables<DataModel_>, TableName>>>;
26
+ export type DocumentByName<DataModel_ extends AnyWithProps, TableName extends TableNames<DataModel_>> = DocumentWithName<DataModel_, TableName>;
27
+ export type Id<DataModel_ extends AnyWithProps, TableName extends TableNames<DataModel_>> = GenericId.GenericId<TableName, Table.Scope<TableWithName<DataModel_, TableName>>>;
28
+ //# sourceMappingURL=DataModel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataModel.d.ts","sourceRoot":"","sources":["../src/DataModel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { __exportAll } from "./_virtual/_rolldown/runtime.js";
2
+ //#region src/DataModel.ts
3
+ var DataModel_exports = /* @__PURE__ */ __exportAll({});
4
+ //#endregion
5
+ export { DataModel_exports };
6
+
7
+ //# sourceMappingURL=DataModel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataModel.js","names":[],"sources":["../src/DataModel.ts"],"sourcesContent":["import type * as DatabaseSchema from \"./DatabaseSchema.js\";\nimport type * as Table from \"./Table.js\";\nimport type * as TableInfo from \"./TableInfo.js\";\nimport type * as GenericId from \"@confect/core/GenericId\";\n\nexport declare const TypeId: \"~@confect/server/DataModel\";\nexport type TypeId = typeof TypeId;\n\nexport interface DataModel<\n Tables_ extends Readonly<Record<string, Table.AnyWithProps>>,\n> {\n readonly [TypeId]: Readonly<Tables_>;\n}\n\nexport interface Any {\n readonly [TypeId]: unknown;\n}\n\nexport interface AnyWithProps extends DataModel<\n Readonly<Record<string, Table.AnyWithProps>>\n> {}\n\nexport type FromSchema<Schema extends DatabaseSchema.AnyWithProps> = DataModel<\n Schema[DatabaseSchema.TypeId]\n>;\n\nexport type FromTables<Tables_ extends Table.AnyWithProps> = DataModel<\n Table.TablesRecord<Tables_>\n>;\n\nexport type ToConvex<DataModel_ extends AnyWithProps> = {\n [TableName_ in TableNames<DataModel_>]: TableInfoWithName<\n DataModel_,\n TableName_\n >;\n};\n\nexport type Tables<DataModel_ extends AnyWithProps> =\n DataModel_[TypeId][keyof DataModel_[TypeId]];\n\nexport type TableNames<DataModel_ extends AnyWithProps> = Table.Name<\n Tables<DataModel_>\n> &\n string;\n\nexport type TableWithName<\n DataModel_ extends AnyWithProps,\n TableName extends TableNames<DataModel_>,\n> = Table.WithName<Tables<DataModel_>, TableName>;\n\nexport type TableInfoWithName_<\n DataModel_ extends AnyWithProps,\n TableName extends TableNames<DataModel_>,\n> = TableInfo.TableInfo<Table.WithName<Tables<DataModel_>, TableName>>;\n\nexport type TableInfoWithName<\n DataModel_ extends AnyWithProps,\n TableName extends TableNames<DataModel_>,\n> = TableInfo.ConvexTableInfo<\n TableInfo.TableInfo<Table.WithName<Tables<DataModel_>, TableName>>\n>;\n\nexport type DocumentWithName<\n DataModel_ extends AnyWithProps,\n TableName extends TableNames<DataModel_>,\n> = TableInfo.Document<\n TableInfo.TableInfo<Table.WithName<Tables<DataModel_>, TableName>>\n>;\n\nexport type DocumentByName<\n DataModel_ extends AnyWithProps,\n TableName extends TableNames<DataModel_>,\n> = DocumentWithName<DataModel_, TableName>;\n\nexport type Id<\n DataModel_ extends AnyWithProps,\n TableName extends TableNames<DataModel_>,\n> = GenericId.GenericId<\n TableName,\n Table.Scope<TableWithName<DataModel_, TableName>>\n>;\n"],"mappings":""}
@@ -0,0 +1,26 @@
1
+ import type { GenericDatabaseReader } from "convex/server";
2
+ import * as Context from "effect/Context";
3
+ import * as Layer from "effect/Layer";
4
+ import * as DatabaseSchema from "./DatabaseSchema.js";
5
+ import type * as DataModel from "./DataModel.js";
6
+ import * as QueryInitializer from "./QueryInitializer.js";
7
+ import * as Table from "./Table.js";
8
+ type IncludedTables<DatabaseSchema_ extends DatabaseSchema.AnyWithProps> = DatabaseSchema.Tables<DatabaseSchema_> | Table.SystemTables<DatabaseSchema.Scope<DatabaseSchema_>>;
9
+ type IncludedDataModel<DatabaseSchema_ extends DatabaseSchema.AnyWithProps> = DataModel.FromTables<IncludedTables<DatabaseSchema_>>;
10
+ export interface DatabaseReaderService<DatabaseSchema_ extends DatabaseSchema.AnyWithProps, Docs = {}> {
11
+ readonly table: <const TableName extends Table.Name<IncludedTables<DatabaseSchema_>>>(tableName: TableName) => QueryInitializer.QueryInitializer<IncludedDataModel<DatabaseSchema_>, TableName, TableName extends keyof Docs ? Docs[TableName] : DataModel.DocumentWithName<IncludedDataModel<DatabaseSchema_>, TableName>, DatabaseSchema_["target"]["kind"]>;
12
+ }
13
+ export declare const make: <DatabaseSchema_ extends DatabaseSchema.AnyWithProps>(databaseSchema: DatabaseSchema_, convexDatabaseReader: GenericDatabaseReader<DataModel.ToConvex<DataModel.FromSchema<DatabaseSchema_>>>) => DatabaseReaderService<DatabaseSchema_>;
14
+ /**
15
+ * The tag's _Identifier_ (the Effect requirements-channel type) is
16
+ * `Docs`-independent so a helper's `R` channel is the same whether or not a
17
+ * codegen document registry is supplied—this keeps it identical to what
18
+ * `Handler`/runtime provisioning provide. The tag's _Service_ (what `yield*`
19
+ * produces) carries `Docs`, so queries resolve to the named doc interfaces.
20
+ */
21
+ export type DatabaseReaderTag<DatabaseSchema_ extends DatabaseSchema.AnyWithProps, Docs = {}> = Context.Service<DatabaseReaderService<DatabaseSchema_>, DatabaseReaderService<DatabaseSchema_, Docs>>;
22
+ export declare const DatabaseReader: <DatabaseSchema_ extends DatabaseSchema.AnyWithProps, Docs = {}>() => DatabaseReaderTag<DatabaseSchema_, Docs>;
23
+ export type DatabaseReader<DatabaseSchema_ extends DatabaseSchema.AnyWithProps> = DatabaseReaderService<DatabaseSchema_>;
24
+ export declare const layer: <DatabaseSchema_ extends DatabaseSchema.AnyWithProps>(databaseSchema: DatabaseSchema_, convexDatabaseReader: GenericDatabaseReader<DataModel.ToConvex<DataModel.FromSchema<DatabaseSchema_>>>) => Layer.Layer<DatabaseReaderService<DatabaseSchema_, {}>, never, never>;
25
+ export {};
26
+ //# sourceMappingURL=DatabaseReader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DatabaseReader.d.ts","sourceRoot":"","sources":["../src/DatabaseReader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAEtC,OAAO,KAAK,cAAc,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,KAAK,SAAS,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,gBAAgB,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AAEpC,KAAK,cAAc,CAAC,eAAe,SAAS,cAAc,CAAC,YAAY,IACnE,cAAc,CAAC,MAAM,CAAC,eAAe,CAAC,GACtC,KAAK,CAAC,YAAY,CAAC,cAAc,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;AAE9D,KAAK,iBAAiB,CAAC,eAAe,SAAS,cAAc,CAAC,YAAY,IACxE,SAAS,CAAC,UAAU,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,CAAC;AAExD,MAAM,WAAW,qBAAqB,CACpC,eAAe,SAAS,cAAc,CAAC,YAAY,EACnD,IAAI,GAAG,EAAE;IAET,QAAQ,CAAC,KAAK,EAAE,CACd,KAAK,CAAC,SAAS,SAAS,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,EAEnE,SAAS,EAAE,SAAS,KACjB,gBAAgB,CAAC,gBAAgB,CACpC,iBAAiB,CAAC,eAAe,CAAC,EAClC,SAAS,EACT,SAAS,SAAS,MAAM,IAAI,GACxB,IAAI,CAAC,SAAS,CAAC,GACf,SAAS,CAAC,gBAAgB,CACxB,iBAAiB,CAAC,eAAe,CAAC,EAClC,SAAS,CACV,EACL,eAAe,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAClC,CAAC;CACH;AAED,eAAO,MAAM,IAAI,GAAI,eAAe,SAAS,cAAc,CAAC,YAAY,kBACtD,eAAe,wBACT,qBAAqB,CACzC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,CAC1D,KACA,qBAAqB,CAAC,eAAe,CAoCvC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,MAAM,iBAAiB,CAC3B,eAAe,SAAS,cAAc,CAAC,YAAY,EACnD,IAAI,GAAG,EAAE,IACP,OAAO,CAAC,OAAO,CACjB,qBAAqB,CAAC,eAAe,CAAC,EACtC,qBAAqB,CAAC,eAAe,EAAE,IAAI,CAAC,CAC7C,CAAC;AAEF,eAAO,MAAM,cAAc,GACzB,eAAe,SAAS,cAAc,CAAC,YAAY,EACnD,IAAI,GAAG,EAAE,OACN,iBAAiB,CAAC,eAAe,EAAE,IAAI,CAIP,CAAC;AAEtC,MAAM,MAAM,cAAc,CACxB,eAAe,SAAS,cAAc,CAAC,YAAY,IACjD,qBAAqB,CAAC,eAAe,CAAC,CAAC;AAE3C,eAAO,MAAM,KAAK,GAAI,eAAe,SAAS,cAAc,CAAC,YAAY,kBACvD,eAAe,wBACT,qBAAqB,CACzC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,CAC1D,0EAKA,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { __exportAll } from "./_virtual/_rolldown/runtime.js";
2
+ import { tables } from "./DatabaseSchema.js";
3
+ import { make as make$1 } from "./QueryInitializer.js";
4
+ import { systemTablesForScope } from "./Table.js";
5
+ import * as Context from "effect/Context";
6
+ import * as Layer from "effect/Layer";
7
+ //#region src/DatabaseReader.ts
8
+ var DatabaseReader_exports = /* @__PURE__ */ __exportAll({
9
+ DatabaseReader: () => DatabaseReader,
10
+ layer: () => layer,
11
+ make: () => make
12
+ });
13
+ const make = (databaseSchema, convexDatabaseReader) => {
14
+ const systemTables = systemTablesForScope(databaseSchema.target.scope);
15
+ return { table: (tableName) => {
16
+ const isSystem = Object.hasOwn(systemTables, tableName);
17
+ const baseDatabaseReader = isSystem ? {
18
+ get: convexDatabaseReader.system.get.bind(convexDatabaseReader.system),
19
+ query: convexDatabaseReader.system.query.bind(convexDatabaseReader.system)
20
+ } : {
21
+ get: convexDatabaseReader.get.bind(convexDatabaseReader),
22
+ query: convexDatabaseReader.query.bind(convexDatabaseReader)
23
+ };
24
+ const table = isSystem ? systemTables[tableName] : tables(databaseSchema)[tableName];
25
+ return make$1(baseDatabaseReader, table);
26
+ } };
27
+ };
28
+ const DatabaseReader = () => Context.Service("@confect/server/DatabaseReader");
29
+ const layer = (databaseSchema, convexDatabaseReader) => Layer.succeed(DatabaseReader(), make(databaseSchema, convexDatabaseReader));
30
+ //#endregion
31
+ export { DatabaseReader, DatabaseReader_exports, layer, make };
32
+
33
+ //# sourceMappingURL=DatabaseReader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DatabaseReader.js","names":["Table.systemTablesForScope","DatabaseSchema.tables","QueryInitializer.make"],"sources":["../src/DatabaseReader.ts"],"sourcesContent":["import type { GenericDatabaseReader } from \"convex/server\";\nimport * as Context from \"effect/Context\";\nimport * as Layer from \"effect/Layer\";\nimport type { BaseDatabaseReader } from \"@confect/core/Types\";\nimport * as DatabaseSchema from \"./DatabaseSchema.js\";\nimport type * as DataModel from \"./DataModel.js\";\nimport * as QueryInitializer from \"./QueryInitializer.js\";\nimport * as Table from \"./Table.js\";\n\ntype IncludedTables<DatabaseSchema_ extends DatabaseSchema.AnyWithProps> =\n | DatabaseSchema.Tables<DatabaseSchema_>\n | Table.SystemTables<DatabaseSchema.Scope<DatabaseSchema_>>;\n\ntype IncludedDataModel<DatabaseSchema_ extends DatabaseSchema.AnyWithProps> =\n DataModel.FromTables<IncludedTables<DatabaseSchema_>>;\n\nexport interface DatabaseReaderService<\n DatabaseSchema_ extends DatabaseSchema.AnyWithProps,\n Docs = {},\n> {\n readonly table: <\n const TableName extends Table.Name<IncludedTables<DatabaseSchema_>>,\n >(\n tableName: TableName,\n ) => QueryInitializer.QueryInitializer<\n IncludedDataModel<DatabaseSchema_>,\n TableName,\n TableName extends keyof Docs\n ? Docs[TableName]\n : DataModel.DocumentWithName<\n IncludedDataModel<DatabaseSchema_>,\n TableName\n >,\n DatabaseSchema_[\"target\"][\"kind\"]\n >;\n}\n\nexport const make = <DatabaseSchema_ extends DatabaseSchema.AnyWithProps>(\n databaseSchema: DatabaseSchema_,\n convexDatabaseReader: GenericDatabaseReader<\n DataModel.ToConvex<DataModel.FromSchema<DatabaseSchema_>>\n >,\n): DatabaseReaderService<DatabaseSchema_> => {\n const systemTables = Table.systemTablesForScope(databaseSchema.target.scope);\n return {\n table: <\n const TableName extends Table.Name<IncludedTables<DatabaseSchema_>>,\n >(\n tableName: TableName,\n ) => {\n const isSystem = Object.hasOwn(systemTables, tableName);\n\n const baseDatabaseReader: BaseDatabaseReader<any> = isSystem\n ? {\n get: convexDatabaseReader.system.get.bind(\n convexDatabaseReader.system,\n ),\n query: convexDatabaseReader.system.query.bind(\n convexDatabaseReader.system,\n ),\n }\n : {\n get: convexDatabaseReader.get.bind(convexDatabaseReader),\n query: convexDatabaseReader.query.bind(convexDatabaseReader),\n };\n\n const table = (\n isSystem\n ? (systemTables as Record<string, Table.AnyWithProps>)[tableName]\n : DatabaseSchema.tables(databaseSchema)[tableName]\n ) as Table.WithName<IncludedTables<DatabaseSchema_>, TableName>;\n\n return QueryInitializer.make<IncludedTables<DatabaseSchema_>, TableName>(\n baseDatabaseReader,\n table,\n );\n },\n } as DatabaseReaderService<DatabaseSchema_>;\n};\n\n/**\n * The tag's _Identifier_ (the Effect requirements-channel type) is\n * `Docs`-independent so a helper's `R` channel is the same whether or not a\n * codegen document registry is supplied—this keeps it identical to what\n * `Handler`/runtime provisioning provide. The tag's _Service_ (what `yield*`\n * produces) carries `Docs`, so queries resolve to the named doc interfaces.\n */\nexport type DatabaseReaderTag<\n DatabaseSchema_ extends DatabaseSchema.AnyWithProps,\n Docs = {},\n> = Context.Service<\n DatabaseReaderService<DatabaseSchema_>,\n DatabaseReaderService<DatabaseSchema_, Docs>\n>;\n\nexport const DatabaseReader = <\n DatabaseSchema_ extends DatabaseSchema.AnyWithProps,\n Docs = {},\n>(): DatabaseReaderTag<DatabaseSchema_, Docs> =>\n Context.Service<\n DatabaseReaderService<DatabaseSchema_>,\n DatabaseReaderService<DatabaseSchema_, Docs>\n >(\"@confect/server/DatabaseReader\");\n\nexport type DatabaseReader<\n DatabaseSchema_ extends DatabaseSchema.AnyWithProps,\n> = DatabaseReaderService<DatabaseSchema_>;\n\nexport const layer = <DatabaseSchema_ extends DatabaseSchema.AnyWithProps>(\n databaseSchema: DatabaseSchema_,\n convexDatabaseReader: GenericDatabaseReader<\n DataModel.ToConvex<DataModel.FromSchema<DatabaseSchema_>>\n >,\n) =>\n Layer.succeed(\n DatabaseReader<DatabaseSchema_>(),\n make(databaseSchema, convexDatabaseReader),\n );\n"],"mappings":";;;;;;;;;;;;AAqCA,MAAa,QACX,gBACA,yBAG2C;CAC3C,MAAM,eAAeA,qBAA2B,eAAe,OAAO,KAAK;CAC3E,OAAO,EACL,QAGE,cACG;EACH,MAAM,WAAW,OAAO,OAAO,cAAc,SAAS;EAEtD,MAAM,qBAA8C,WAChD;GACE,KAAK,qBAAqB,OAAO,IAAI,KACnC,qBAAqB,MACvB;GACA,OAAO,qBAAqB,OAAO,MAAM,KACvC,qBAAqB,MACvB;EACF,IACA;GACE,KAAK,qBAAqB,IAAI,KAAK,oBAAoB;GACvD,OAAO,qBAAqB,MAAM,KAAK,oBAAoB;EAC7D;EAEJ,MAAM,QACJ,WACK,aAAoD,aACrDC,OAAsB,cAAc,CAAC,CAAC;EAG5C,OAAOC,OACL,oBACA,KACF;CACF,EACF;AACF;AAiBA,MAAa,uBAIX,QAAQ,QAGN,gCAAgC;AAMpC,MAAa,SACX,gBACA,yBAIA,MAAM,QACJ,eAAgC,GAChC,KAAK,gBAAgB,oBAAoB,CAC3C"}
@@ -0,0 +1,67 @@
1
+ import * as IdScope from "@confect/core/IdScope";
2
+ import type * as Table from "./Table.js";
3
+ declare const EmptyDatabaseScopeError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
4
+ readonly _tag: "EmptyDatabaseScopeError";
5
+ } & Readonly<A>;
6
+ export declare class EmptyDatabaseScopeError extends EmptyDatabaseScopeError_base<{
7
+ readonly databaseScope: IdScope.IdScope;
8
+ }> {
9
+ get message(): string;
10
+ }
11
+ declare const TableBindingMismatchError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
12
+ readonly _tag: "TableBindingMismatchError";
13
+ } & Readonly<A>;
14
+ export declare class TableBindingMismatchError extends TableBindingMismatchError_base<{
15
+ readonly bindingName: string;
16
+ readonly tableName: string;
17
+ readonly tableScope: IdScope.IdScope;
18
+ readonly databaseScope: IdScope.IdScope;
19
+ }> {
20
+ get message(): string;
21
+ }
22
+ export declare const TypeId = "~@confect/server/DatabaseSchema";
23
+ export type TypeId = typeof TypeId;
24
+ export interface AppTarget {
25
+ readonly kind: "app";
26
+ readonly scope: IdScope.App;
27
+ }
28
+ export interface ComponentTarget<Scope_ extends IdScope.IdScope = IdScope.IdScope> {
29
+ readonly kind: "component";
30
+ readonly scope: Scope_;
31
+ }
32
+ export type Target = AppTarget | ComponentTarget;
33
+ export interface Any {
34
+ readonly [TypeId]: unknown;
35
+ }
36
+ export declare const isDatabaseSchema: (u: unknown) => u is Any;
37
+ /**
38
+ * A schema definition holding a record of bound `Table`s keyed by table name.
39
+ * Codegen emits a single static `DatabaseSchema.make({ ... })` call; laziness
40
+ * lives entirely on each `Table` (its `Fields` and `Doc` are lazy memoised
41
+ * getters), so this layer is a plain record indirection with no module-loading
42
+ * or async machinery.
43
+ */
44
+ export interface DatabaseSchema<Tables_ extends Readonly<Record<string, Table.AnyWithProps>> = {}, Target_ extends Target = AppTarget> {
45
+ readonly [TypeId]: Readonly<Tables_>;
46
+ readonly target: Target_;
47
+ }
48
+ export interface AnyWithProps extends DatabaseSchema<Readonly<Record<string, Table.AnyWithProps>>, Target> {
49
+ }
50
+ export type Scope<Schema extends AnyWithProps> = Schema["target"]["scope"];
51
+ export type Tables<DatabaseSchema_ extends AnyWithProps> = DatabaseSchema_[TypeId][keyof DatabaseSchema_[TypeId]];
52
+ /**
53
+ * The bound table record, without evaluating any table schemas.
54
+ */
55
+ export declare const tables: <Schema extends AnyWithProps>(self: Schema) => Schema[TypeId];
56
+ export type TableNames<DatabaseSchema_ extends AnyWithProps> = Table.Name<Tables<DatabaseSchema_>> & string;
57
+ export type TableWithName<DatabaseSchema_ extends AnyWithProps, TableName extends TableNames<DatabaseSchema_>> = Extract<Tables<DatabaseSchema_>, {
58
+ readonly tableName: TableName;
59
+ }>;
60
+ /**
61
+ * Construct a database schema from its bound table record. The record's keys
62
+ * must match their tables' names. Table schemas remain lazy; construction only
63
+ * stores the record. The empty case is `make({})`.
64
+ */
65
+ export declare const make: <const TablesRecord extends Readonly<Record<string, Table.AnyWithProps>>, const Target_ extends Target = AppTarget>(tableRecord: TablesRecord, target?: Target_) => DatabaseSchema<TablesRecord, Target_>;
66
+ export {};
67
+ //# sourceMappingURL=DatabaseSchema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DatabaseSchema.d.ts","sourceRoot":"","sources":["../src/DatabaseSchema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ import { __exportAll } from "./_virtual/_rolldown/runtime.js";
2
+ import * as Predicate from "effect/Predicate";
3
+ import * as Result from "effect/Result";
4
+ import * as Record from "effect/Record";
5
+ import * as Data from "effect/Data";
6
+ import * as IdScope from "@confect/core/IdScope";
7
+ //#region src/DatabaseSchema.ts
8
+ var DatabaseSchema_exports = /* @__PURE__ */ __exportAll({
9
+ EmptyDatabaseScopeError: () => EmptyDatabaseScopeError,
10
+ TableBindingMismatchError: () => TableBindingMismatchError,
11
+ TypeId: () => TypeId,
12
+ isDatabaseSchema: () => isDatabaseSchema,
13
+ make: () => make,
14
+ tables: () => tables
15
+ });
16
+ var EmptyDatabaseScopeError = class extends Data.TaggedError("EmptyDatabaseScopeError") {
17
+ get message() {
18
+ return "A component database schema requires a nonempty ID scope.";
19
+ }
20
+ };
21
+ var TableBindingMismatchError = class extends Data.TaggedError("TableBindingMismatchError") {
22
+ get message() {
23
+ return `Table '${this.bindingName}' must be bound to its database schema's name and ID scope.`;
24
+ }
25
+ };
26
+ const TypeId = "~@confect/server/DatabaseSchema";
27
+ const isDatabaseSchema = (u) => Predicate.hasProperty(u, TypeId);
28
+ /**
29
+ * The bound table record, without evaluating any table schemas.
30
+ */
31
+ const tables = (self) => self[TypeId];
32
+ const validateBindings = (tableRecord, target) => {
33
+ if (target.kind === "component" && target.scope === "") return Result.fail(new EmptyDatabaseScopeError({ databaseScope: target.scope }));
34
+ for (const [name, table] of Record.toEntries(tableRecord)) if (name !== table.tableName || table.scope !== target.scope) return Result.fail(new TableBindingMismatchError({
35
+ bindingName: name,
36
+ tableName: table.tableName,
37
+ tableScope: table.scope,
38
+ databaseScope: target.scope
39
+ }));
40
+ return Result.succeed(void 0);
41
+ };
42
+ /**
43
+ * Construct a database schema from its bound table record. The record's keys
44
+ * must match their tables' names. Table schemas remain lazy; construction only
45
+ * stores the record. The empty case is `make({})`.
46
+ */
47
+ const make = (tableRecord, target) => {
48
+ const resolvedTarget = target ?? {
49
+ kind: "app",
50
+ scope: IdScope.app
51
+ };
52
+ Result.getOrThrow(validateBindings(tableRecord, resolvedTarget));
53
+ return {
54
+ [TypeId]: tableRecord,
55
+ target: resolvedTarget
56
+ };
57
+ };
58
+ //#endregion
59
+ export { DatabaseSchema_exports, EmptyDatabaseScopeError, TableBindingMismatchError, TypeId, isDatabaseSchema, make, tables };
60
+
61
+ //# sourceMappingURL=DatabaseSchema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DatabaseSchema.js","names":[],"sources":["../src/DatabaseSchema.ts"],"sourcesContent":["import * as IdScope from \"@confect/core/IdScope\";\nimport * as Data from \"effect/Data\";\nimport * as Result from \"effect/Result\";\nimport * as Predicate from \"effect/Predicate\";\nimport * as Record from \"effect/Record\";\nimport type * as Table from \"./Table.js\";\n\nexport class EmptyDatabaseScopeError extends Data.TaggedError(\n \"EmptyDatabaseScopeError\",\n)<{\n readonly databaseScope: IdScope.IdScope;\n}> {\n override get message(): string {\n return \"A component database schema requires a nonempty ID scope.\";\n }\n}\n\nexport class TableBindingMismatchError extends Data.TaggedError(\n \"TableBindingMismatchError\",\n)<{\n readonly bindingName: string;\n readonly tableName: string;\n readonly tableScope: IdScope.IdScope;\n readonly databaseScope: IdScope.IdScope;\n}> {\n override get message(): string {\n return `Table '${this.bindingName}' must be bound to its database schema's name and ID scope.`;\n }\n}\n\nexport const TypeId = \"~@confect/server/DatabaseSchema\";\nexport type TypeId = typeof TypeId;\n\nexport interface AppTarget {\n readonly kind: \"app\";\n readonly scope: IdScope.App;\n}\n\nexport interface ComponentTarget<\n Scope_ extends IdScope.IdScope = IdScope.IdScope,\n> {\n readonly kind: \"component\";\n readonly scope: Scope_;\n}\n\nexport type Target = AppTarget | ComponentTarget;\n\nexport interface Any {\n readonly [TypeId]: unknown;\n}\n\nexport const isDatabaseSchema = (u: unknown): u is Any =>\n Predicate.hasProperty(u, TypeId);\n\n/**\n * A schema definition holding a record of bound `Table`s keyed by table name.\n * Codegen emits a single static `DatabaseSchema.make({ ... })` call; laziness\n * lives entirely on each `Table` (its `Fields` and `Doc` are lazy memoised\n * getters), so this layer is a plain record indirection with no module-loading\n * or async machinery.\n */\nexport interface DatabaseSchema<\n Tables_ extends Readonly<Record<string, Table.AnyWithProps>> = {},\n Target_ extends Target = AppTarget,\n> {\n readonly [TypeId]: Readonly<Tables_>;\n readonly target: Target_;\n}\n\nexport interface AnyWithProps extends DatabaseSchema<\n Readonly<Record<string, Table.AnyWithProps>>,\n Target\n> {}\n\nexport type Scope<Schema extends AnyWithProps> = Schema[\"target\"][\"scope\"];\n\nexport type Tables<DatabaseSchema_ extends AnyWithProps> =\n DatabaseSchema_[TypeId][keyof DatabaseSchema_[TypeId]];\n\n/**\n * The bound table record, without evaluating any table schemas.\n */\nexport const tables = <Schema extends AnyWithProps>(\n self: Schema,\n): Schema[TypeId] => self[TypeId];\n\nexport type TableNames<DatabaseSchema_ extends AnyWithProps> = Table.Name<\n Tables<DatabaseSchema_>\n> &\n string;\n\nexport type TableWithName<\n DatabaseSchema_ extends AnyWithProps,\n TableName extends TableNames<DatabaseSchema_>,\n> = Extract<Tables<DatabaseSchema_>, { readonly tableName: TableName }>;\n\nconst validateBindings = (\n tableRecord: Readonly<Record<string, Table.AnyWithProps>>,\n target: Target,\n): Result.Result<void, EmptyDatabaseScopeError | TableBindingMismatchError> => {\n if (target.kind === \"component\" && target.scope === \"\") {\n return Result.fail(\n new EmptyDatabaseScopeError({ databaseScope: target.scope }),\n );\n }\n for (const [name, table] of Record.toEntries(tableRecord)) {\n if (name !== table.tableName || table.scope !== target.scope) {\n return Result.fail(\n new TableBindingMismatchError({\n bindingName: name,\n tableName: table.tableName,\n tableScope: table.scope,\n databaseScope: target.scope,\n }),\n );\n }\n }\n return Result.succeed(undefined);\n};\n\n/**\n * Construct a database schema from its bound table record. The record's keys\n * must match their tables' names. Table schemas remain lazy; construction only\n * stores the record. The empty case is `make({})`.\n */\nexport const make = <\n const TablesRecord extends Readonly<Record<string, Table.AnyWithProps>>,\n const Target_ extends Target = AppTarget,\n>(\n tableRecord: TablesRecord,\n target?: Target_,\n): DatabaseSchema<TablesRecord, Target_> => {\n const resolvedTarget = target ?? { kind: \"app\", scope: IdScope.app };\n Result.getOrThrow(validateBindings(tableRecord, resolvedTarget));\n return {\n [TypeId]: tableRecord,\n target: resolvedTarget,\n } as DatabaseSchema<TablesRecord, Target_>;\n};\n"],"mappings":";;;;;;;;;;;;;;;AAOA,IAAa,0BAAb,cAA6C,KAAK,YAChD,yBACF,CAAC,CAEE;CACD,IAAa,UAAkB;EAC7B,OAAO;CACT;AACF;AAEA,IAAa,4BAAb,cAA+C,KAAK,YAClD,2BACF,CAAC,CAKE;CACD,IAAa,UAAkB;EAC7B,OAAO,UAAU,KAAK,YAAY;CACpC;AACF;AAEA,MAAa,SAAS;AAqBtB,MAAa,oBAAoB,MAC/B,UAAU,YAAY,GAAG,MAAM;;;;AA8BjC,MAAa,UACX,SACmB,KAAK;AAY1B,MAAM,oBACJ,aACA,WAC6E;CAC7E,IAAI,OAAO,SAAS,eAAe,OAAO,UAAU,IAClD,OAAO,OAAO,KACZ,IAAI,wBAAwB,EAAE,eAAe,OAAO,MAAM,CAAC,CAC7D;CAEF,KAAK,MAAM,CAAC,MAAM,UAAU,OAAO,UAAU,WAAW,GACtD,IAAI,SAAS,MAAM,aAAa,MAAM,UAAU,OAAO,OACrD,OAAO,OAAO,KACZ,IAAI,0BAA0B;EAC5B,aAAa;EACb,WAAW,MAAM;EACjB,YAAY,MAAM;EAClB,eAAe,OAAO;CACxB,CAAC,CACH;CAGJ,OAAO,OAAO,QAAQ,KAAA,CAAS;AACjC;;;;;;AAOA,MAAa,QAIX,aACA,WAC0C;CAC1C,MAAM,iBAAiB,UAAU;EAAE,MAAM;EAAO,OAAO,QAAQ;CAAI;CACnE,OAAO,WAAW,iBAAiB,aAAa,cAAc,CAAC;CAC/D,OAAO;GACJ,SAAS;EACV,QAAQ;CACV;AACF"}
@@ -0,0 +1,44 @@
1
+ import type { GenericDatabaseWriter } from "convex/server";
2
+ import * as Context from "effect/Context";
3
+ import * as Effect from "effect/Effect";
4
+ import * as Layer from "effect/Layer";
5
+ import * as DatabaseSchema from "./DatabaseSchema.js";
6
+ import type * as DataModel from "./DataModel.js";
7
+ import type { DocumentByName as DocumentByName_ } from "./DataModel.js";
8
+ import * as Document from "./Document.js";
9
+ import * as QueryInitializer from "./QueryInitializer.js";
10
+ /**
11
+ * The argument accepted by `patch`: like `Partial<Doc>` without system fields,
12
+ * but the fields that are already optional also accept `undefined`, since
13
+ * setting a field to `undefined` unsets it.
14
+ */
15
+ export type PatchValue<Doc> = {
16
+ [K in keyof Doc as K extends "_id" | "_creationTime" ? never : K]?: undefined extends Doc[K] ? Doc[K] | undefined : Doc[K];
17
+ };
18
+ export interface DatabaseWriterTableAccessor<DataModel_ extends DataModel.AnyWithProps, TableName extends DataModel.TableNames<DataModel_>, Doc = DocumentByName_<DataModel_, TableName>> {
19
+ readonly insert: (document: Document.WithoutSystemFields<Doc>) => Effect.Effect<DataModel.Id<DataModel_, TableName>, Document.DocumentEncodeError>;
20
+ readonly patch: (id: DataModel.Id<DataModel_, TableName>, patchedValues: PatchValue<Doc>) => Effect.Effect<void, QueryInitializer.GetByIdFailure | Document.DocumentDecodeError | Document.DocumentEncodeError>;
21
+ readonly replace: (id: DataModel.Id<DataModel_, TableName>, value: Document.WithoutSystemFields<Doc>) => Effect.Effect<void, Document.DocumentEncodeError>;
22
+ readonly delete: (id: DataModel.Id<DataModel_, TableName>) => Effect.Effect<void>;
23
+ }
24
+ /**
25
+ * The service shape backing the `DatabaseWriter` tag. Named (rather than an
26
+ * inferred anonymous object) so declaration emit prints
27
+ * `DatabaseWriterService<…>` by reference instead of expanding the data model.
28
+ * `Docs` is the optional named document registry (see
29
+ * `DatabaseReaderService`).
30
+ */
31
+ export interface DatabaseWriterService<DatabaseSchema_ extends DatabaseSchema.AnyWithProps, Docs = {}> {
32
+ readonly table: <const TableName extends DataModel.TableNames<DataModel.FromSchema<DatabaseSchema_>>>(tableName: TableName) => DatabaseWriterTableAccessor<DataModel.FromSchema<DatabaseSchema_>, TableName, TableName extends keyof Docs ? Docs[TableName] : DocumentByName_<DataModel.FromSchema<DatabaseSchema_>, TableName>>;
33
+ }
34
+ /**
35
+ * The tag's _Identifier_ is `Docs`-independent (see `DatabaseReaderTag`); only
36
+ * the _Service_ carries `Docs` so writer inputs print the named doc
37
+ * interfaces.
38
+ */
39
+ export type DatabaseWriterTag<DatabaseSchema_ extends DatabaseSchema.AnyWithProps, Docs = {}> = Context.Service<DatabaseWriterService<DatabaseSchema_>, DatabaseWriterService<DatabaseSchema_, Docs>>;
40
+ export declare const make: <DatabaseSchema_ extends DatabaseSchema.AnyWithProps>(databaseSchema: DatabaseSchema_, convexDatabaseWriter: GenericDatabaseWriter<DataModel.ToConvex<DataModel.FromSchema<DatabaseSchema_>>>) => DatabaseWriterService<DatabaseSchema_>;
41
+ export declare const DatabaseWriter: <DatabaseSchema_ extends DatabaseSchema.AnyWithProps, Docs = {}>() => DatabaseWriterTag<DatabaseSchema_, Docs>;
42
+ export type DatabaseWriter<DatabaseSchema_ extends DatabaseSchema.AnyWithProps> = DatabaseWriterService<DatabaseSchema_>;
43
+ export declare const layer: <DatabaseSchema_ extends DatabaseSchema.AnyWithProps>(databaseSchema: DatabaseSchema_, convexDatabaseWriter: GenericDatabaseWriter<DataModel.ToConvex<DataModel.FromSchema<DatabaseSchema_>>>) => Layer.Layer<DatabaseWriterService<DatabaseSchema_, {}>, never, never>;
44
+ //# sourceMappingURL=DatabaseWriter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DatabaseWriter.d.ts","sourceRoot":"","sources":["../src/DatabaseWriter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import { __exportAll } from "./_virtual/_rolldown/runtime.js";
2
+ import { tables } from "./DatabaseSchema.js";
3
+ import { encode } from "./Document.js";
4
+ import { getById } from "./QueryInitializer.js";
5
+ import * as Context from "effect/Context";
6
+ import * as Layer from "effect/Layer";
7
+ import * as Effect from "effect/Effect";
8
+ import { pipe } from "effect/Function";
9
+ import * as Record from "effect/Record";
10
+ //#region src/DatabaseWriter.ts
11
+ var DatabaseWriter_exports = /* @__PURE__ */ __exportAll({
12
+ DatabaseWriter: () => DatabaseWriter,
13
+ layer: () => layer,
14
+ make: () => make
15
+ });
16
+ const make = (databaseSchema, convexDatabaseWriter) => {
17
+ const table = (tableName) => {
18
+ const tableDef = tables(databaseSchema)[tableName];
19
+ const insert = Effect.fn("DatabaseWriter.insert")(function* (document) {
20
+ const encodedDocument = yield* encode(document, tableDef);
21
+ return yield* Effect.promise(() => convexDatabaseWriter.insert(tableName, encodedDocument));
22
+ });
23
+ const patch = Effect.fn("DatabaseWriter.patch")(function* (id, patchedValues) {
24
+ const originalDecodedDoc = yield* getById(convexDatabaseWriter, tableDef)(id);
25
+ const updatedEncodedDoc = yield* pipe(patchedValues, Record.reduce(originalDecodedDoc, (acc, value, key) => value === void 0 ? Record.remove(acc, key) : Record.set(acc, key, value)), encode(tableDef));
26
+ yield* Effect.promise(() => convexDatabaseWriter.replace(id, updatedEncodedDoc));
27
+ });
28
+ const replace = Effect.fn("DatabaseWriter.replace")(function* (id, value) {
29
+ const updatedEncodedDoc = yield* encode(value, tableDef);
30
+ yield* Effect.promise(() => convexDatabaseWriter.replace(id, updatedEncodedDoc));
31
+ });
32
+ const delete_ = (id) => Effect.promise(() => convexDatabaseWriter.delete(id));
33
+ return {
34
+ insert,
35
+ patch,
36
+ replace,
37
+ delete: delete_
38
+ };
39
+ };
40
+ return { table };
41
+ };
42
+ const DatabaseWriter = () => Context.Service("@confect/server/DatabaseWriter");
43
+ const layer = (databaseSchema, convexDatabaseWriter) => Layer.succeed(DatabaseWriter(), make(databaseSchema, convexDatabaseWriter));
44
+ //#endregion
45
+ export { DatabaseWriter, DatabaseWriter_exports, layer, make };
46
+
47
+ //# sourceMappingURL=DatabaseWriter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DatabaseWriter.js","names":["DatabaseSchema.tables","Document.encode","QueryInitializer.getById"],"sources":["../src/DatabaseWriter.ts"],"sourcesContent":["import type {\n BetterOmit,\n DocumentByName,\n Expand,\n GenericDatabaseWriter,\n WithoutSystemFields,\n} from \"convex/server\";\nimport type { GenericId } from \"convex/values\";\nimport { pipe } from \"effect/Function\";\nimport * as Context from \"effect/Context\";\nimport * as Effect from \"effect/Effect\";\nimport * as Layer from \"effect/Layer\";\nimport * as Record from \"effect/Record\";\nimport * as DatabaseSchema from \"./DatabaseSchema.js\";\nimport type * as DataModel from \"./DataModel.js\";\nimport type { DocumentByName as DocumentByName_ } from \"./DataModel.js\";\nimport * as Document from \"./Document.js\";\nimport * as QueryInitializer from \"./QueryInitializer.js\";\nimport type * as Table from \"./Table.js\";\n\n/**\n * The argument accepted by `patch`: like `Partial<Doc>` without system fields,\n * but the fields that are already optional also accept `undefined`, since\n * setting a field to `undefined` unsets it.\n */\nexport type PatchValue<Doc> = {\n [\n K in keyof Doc as K extends \"_id\" | \"_creationTime\" ? never : K\n ]?: undefined extends Doc[K] ? Doc[K] | undefined : Doc[K];\n};\n\nexport interface DatabaseWriterTableAccessor<\n DataModel_ extends DataModel.AnyWithProps,\n TableName extends DataModel.TableNames<DataModel_>,\n Doc = DocumentByName_<DataModel_, TableName>,\n> {\n readonly insert: (\n document: Document.WithoutSystemFields<Doc>,\n ) => Effect.Effect<\n DataModel.Id<DataModel_, TableName>,\n Document.DocumentEncodeError\n >;\n readonly patch: (\n id: DataModel.Id<DataModel_, TableName>,\n patchedValues: PatchValue<Doc>,\n ) => Effect.Effect<\n void,\n | QueryInitializer.GetByIdFailure\n | Document.DocumentDecodeError\n | Document.DocumentEncodeError\n >;\n readonly replace: (\n id: DataModel.Id<DataModel_, TableName>,\n value: Document.WithoutSystemFields<Doc>,\n ) => Effect.Effect<void, Document.DocumentEncodeError>;\n readonly delete: (\n id: DataModel.Id<DataModel_, TableName>,\n ) => Effect.Effect<void>;\n}\n\n/**\n * The service shape backing the `DatabaseWriter` tag. Named (rather than an\n * inferred anonymous object) so declaration emit prints\n * `DatabaseWriterService<…>` by reference instead of expanding the data model.\n * `Docs` is the optional named document registry (see\n * `DatabaseReaderService`).\n */\nexport interface DatabaseWriterService<\n DatabaseSchema_ extends DatabaseSchema.AnyWithProps,\n Docs = {},\n> {\n readonly table: <\n const TableName extends DataModel.TableNames<\n DataModel.FromSchema<DatabaseSchema_>\n >,\n >(\n tableName: TableName,\n ) => DatabaseWriterTableAccessor<\n DataModel.FromSchema<DatabaseSchema_>,\n TableName,\n TableName extends keyof Docs\n ? Docs[TableName]\n : DocumentByName_<DataModel.FromSchema<DatabaseSchema_>, TableName>\n >;\n}\n\n/**\n * The tag's _Identifier_ is `Docs`-independent (see `DatabaseReaderTag`); only\n * the _Service_ carries `Docs` so writer inputs print the named doc\n * interfaces.\n */\nexport type DatabaseWriterTag<\n DatabaseSchema_ extends DatabaseSchema.AnyWithProps,\n Docs = {},\n> = Context.Service<\n DatabaseWriterService<DatabaseSchema_>,\n DatabaseWriterService<DatabaseSchema_, Docs>\n>;\n\nexport const make = <DatabaseSchema_ extends DatabaseSchema.AnyWithProps>(\n databaseSchema: DatabaseSchema_,\n convexDatabaseWriter: GenericDatabaseWriter<\n DataModel.ToConvex<DataModel.FromSchema<DatabaseSchema_>>\n >,\n): DatabaseWriterService<DatabaseSchema_> => {\n type DataModel_ = DataModel.FromSchema<DatabaseSchema_>;\n\n const table = <const TableName extends DataModel.TableNames<DataModel_>>(\n tableName: TableName,\n ) => {\n const tableDef = DatabaseSchema.tables(databaseSchema)[tableName];\n\n const insert = Effect.fn(\"DatabaseWriter.insert\")(function* (\n document: Document.WithoutSystemFields<\n DocumentByName_<DataModel_, TableName>\n >,\n ) {\n const encodedDocument = yield* Document.encode(document, tableDef);\n\n const id = yield* Effect.promise(() =>\n convexDatabaseWriter.insert(\n tableName,\n encodedDocument as WithoutSystemFields<\n DocumentByName<DataModel.ToConvex<DataModel_>, TableName>\n >,\n ),\n );\n\n // The database supplies the ID in this table's execution scope. Its\n // scope brand is erased at the Convex syscall boundary.\n return id as unknown as DataModel.Id<DataModel_, TableName>;\n });\n\n const patch = Effect.fn(\"DatabaseWriter.patch\")(function* (\n id: DataModel.Id<DataModel_, TableName>,\n patchedValues: PatchValue<\n Document.WithoutSystemFields<DocumentByName_<DataModel_, TableName>>\n >,\n ) {\n const originalDecodedDoc = yield* QueryInitializer.getById<\n Table.AnyWithProps,\n TableName\n >(\n convexDatabaseWriter as any,\n tableDef,\n )(id as unknown as GenericId<TableName>);\n\n const updatedEncodedDoc = yield* pipe(\n patchedValues,\n Record.reduce(originalDecodedDoc, (acc, value, key) =>\n value === undefined\n ? Record.remove(acc, key)\n : Record.set(acc, key, value),\n ),\n Document.encode(tableDef),\n );\n\n yield* Effect.promise(() =>\n convexDatabaseWriter.replace(\n id as unknown as GenericId<TableName>,\n updatedEncodedDoc as Expand<\n BetterOmit<\n DocumentByName<DataModel.ToConvex<DataModel_>, TableName>,\n \"_creationTime\" | \"_id\"\n >\n >,\n ),\n );\n });\n\n const replace = Effect.fn(\"DatabaseWriter.replace\")(function* (\n id: DataModel.Id<DataModel_, TableName>,\n value: Document.WithoutSystemFields<\n DocumentByName_<DataModel_, TableName>\n >,\n ) {\n const updatedEncodedDoc = yield* Document.encode(value, tableDef);\n\n yield* Effect.promise(() =>\n convexDatabaseWriter.replace(\n id as unknown as GenericId<TableName>,\n updatedEncodedDoc as Expand<\n BetterOmit<\n DocumentByName<DataModel.ToConvex<DataModel_>, TableName>,\n \"_creationTime\" | \"_id\"\n >\n >,\n ),\n );\n });\n\n const delete_ = (id: DataModel.Id<DataModel_, TableName>) =>\n Effect.promise(() =>\n convexDatabaseWriter.delete(id as unknown as GenericId<TableName>),\n );\n\n return {\n insert,\n patch,\n replace,\n delete: delete_,\n };\n };\n\n return {\n table,\n } as DatabaseWriterService<DatabaseSchema_>;\n};\n\nexport const DatabaseWriter = <\n DatabaseSchema_ extends DatabaseSchema.AnyWithProps,\n Docs = {},\n>(): DatabaseWriterTag<DatabaseSchema_, Docs> =>\n Context.Service<\n DatabaseWriterService<DatabaseSchema_>,\n DatabaseWriterService<DatabaseSchema_, Docs>\n >(\"@confect/server/DatabaseWriter\");\n\nexport type DatabaseWriter<\n DatabaseSchema_ extends DatabaseSchema.AnyWithProps,\n> = DatabaseWriterService<DatabaseSchema_>;\n\nexport const layer = <DatabaseSchema_ extends DatabaseSchema.AnyWithProps>(\n databaseSchema: DatabaseSchema_,\n convexDatabaseWriter: GenericDatabaseWriter<\n DataModel.ToConvex<DataModel.FromSchema<DatabaseSchema_>>\n >,\n) =>\n Layer.succeed(\n DatabaseWriter<DatabaseSchema_>(),\n make(databaseSchema, convexDatabaseWriter),\n );\n"],"mappings":";;;;;;;;;;;;;;;AAmGA,MAAa,QACX,gBACA,yBAG2C;CAG3C,MAAM,SACJ,cACG;EACH,MAAM,WAAWA,OAAsB,cAAc,CAAC,CAAC;EAEvD,MAAM,SAAS,OAAO,GAAG,uBAAuB,CAAC,CAAC,WAChD,UAGA;GACA,MAAM,kBAAkB,OAAOC,OAAgB,UAAU,QAAQ;GAajE,OAAO,OAXW,OAAO,cACvB,qBAAqB,OACnB,WACA,eAGF,CACF;EAKF,CAAC;EAED,MAAM,QAAQ,OAAO,GAAG,sBAAsB,CAAC,CAAC,WAC9C,IACA,eAGA;GACA,MAAM,qBAAqB,OAAOC,QAIhC,sBACA,QACF,CAAC,CAAC,EAAqC;GAEvC,MAAM,oBAAoB,OAAO,KAC/B,eACA,OAAO,OAAO,qBAAqB,KAAK,OAAO,QAC7C,UAAU,KAAA,IACN,OAAO,OAAO,KAAK,GAAG,IACtB,OAAO,IAAI,KAAK,KAAK,KAAK,CAChC,GACAD,OAAgB,QAAQ,CAC1B;GAEA,OAAO,OAAO,cACZ,qBAAqB,QACnB,IACA,iBAMF,CACF;EACF,CAAC;EAED,MAAM,UAAU,OAAO,GAAG,wBAAwB,CAAC,CAAC,WAClD,IACA,OAGA;GACA,MAAM,oBAAoB,OAAOA,OAAgB,OAAO,QAAQ;GAEhE,OAAO,OAAO,cACZ,qBAAqB,QACnB,IACA,iBAMF,CACF;EACF,CAAC;EAED,MAAM,WAAW,OACf,OAAO,cACL,qBAAqB,OAAO,EAAqC,CACnE;EAEF,OAAO;GACL;GACA;GACA;GACA,QAAQ;EACV;CACF;CAEA,OAAO,EACL,MACF;AACF;AAEA,MAAa,uBAIX,QAAQ,QAGN,gCAAgC;AAMpC,MAAa,SACX,gBACA,yBAIA,MAAM,QACJ,eAAgC,GAChC,KAAK,gBAAgB,oBAAoB,CAC3C"}
@@ -0,0 +1,37 @@
1
+ import type { ReadonlyValue } from "@confect/core/SchemaToValidator";
2
+ import * as Effect from "effect/Effect";
3
+ import * as Schema from "effect/Schema";
4
+ import type { ReadonlyRecord } from "effect/Record";
5
+ import type * as DatabaseSchema from "./DatabaseSchema.js";
6
+ import type * as DataModel from "./DataModel.js";
7
+ import type * as TableInfo from "./TableInfo.js";
8
+ import type * as Table from "./Table.js";
9
+ export type Document<Schema_ extends DatabaseSchema.AnyWithProps, TableName extends DatabaseSchema.TableNames<Schema_>> = DataModel.DocumentByName<DataModel.FromSchema<Schema_>, TableName>;
10
+ export type WithoutSystemFields<Doc> = Doc extends unknown ? Omit<Doc, "_creationTime" | "_id"> : never;
11
+ export type Any = any;
12
+ export type AnyEncoded = ReadonlyRecord<string, ReadonlyValue>;
13
+ export declare const decode: (<Table_ extends Table.AnyWithProps>(table: Table_) => (self: TableInfo.TableInfo<Table_>["convexDocument"]) => Effect.Effect<TableInfo.TableInfo<Table_>["document"], DocumentDecodeError>) & (<Table_ extends Table.AnyWithProps>(self: TableInfo.TableInfo<Table_>["convexDocument"], table: Table_) => Effect.Effect<TableInfo.TableInfo<Table_>["document"], DocumentDecodeError>);
14
+ export declare const encode: (<Table_ extends Table.AnyWithProps>(table: Table_) => (self: Schema.Schema.Type<Table.Fields<Table_>>) => Effect.Effect<Schema.Codec.Encoded<Table.Fields<Table_>>, DocumentEncodeError>) & (<Table_ extends Table.AnyWithProps>(self: Schema.Schema.Type<Table.Fields<Table_>>, table: Table_) => Effect.Effect<Schema.Codec.Encoded<Table.Fields<Table_>>, DocumentEncodeError>);
15
+ declare const DocumentDecodeError_base: Schema.Class<DocumentDecodeError, Schema.TaggedStruct<"DocumentDecodeError", {
16
+ readonly tableName: Schema.String;
17
+ readonly id: Schema.String;
18
+ readonly parseError: Schema.String;
19
+ }>, import("effect/Cause").YieldableError>;
20
+ export declare class DocumentDecodeError extends DocumentDecodeError_base {
21
+ get message(): string;
22
+ }
23
+ declare const DocumentEncodeError_base: Schema.Class<DocumentEncodeError, Schema.TaggedStruct<"DocumentEncodeError", {
24
+ readonly tableName: Schema.String;
25
+ readonly id: Schema.String;
26
+ readonly parseError: Schema.String;
27
+ }>, import("effect/Cause").YieldableError>;
28
+ export declare class DocumentEncodeError extends DocumentEncodeError_base {
29
+ get message(): string;
30
+ }
31
+ export declare const documentErrorMessage: ({ id, tableName, message, }: {
32
+ id: string;
33
+ tableName: string;
34
+ message: string;
35
+ }) => string;
36
+ export {};
37
+ //# sourceMappingURL=Document.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Document.d.ts","sourceRoot":"","sources":["../src/Document.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAErE,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,KAAK,cAAc,MAAM,qBAAqB,CAAC;AAC3D,OAAO,KAAK,KAAK,SAAS,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,KAAK,SAAS,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,KAAK,KAAK,MAAM,YAAY,CAAC;AAEzC,MAAM,MAAM,QAAQ,CAClB,OAAO,SAAS,cAAc,CAAC,YAAY,EAC3C,SAAS,SAAS,cAAc,CAAC,UAAU,CAAC,OAAO,CAAC,IAClD,SAAS,CAAC,cAAc,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,CAAC;AAEvE,MAAM,MAAM,mBAAmB,CAAC,GAAG,IAAI,GAAG,SAAS,OAAO,GACtD,IAAI,CAAC,GAAG,EAAE,eAAe,GAAG,KAAK,CAAC,GAClC,KAAK,CAAC;AAEV,MAAM,MAAM,GAAG,GAAG,GAAG,CAAC;AACtB,MAAM,MAAM,UAAU,GAAG,cAAc,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AAE/D,eAAO,MAAM,MAAM,IAChB,MAAM,SAAS,KAAK,CAAC,YAAY,SACzB,MAAM,KACV,CACH,IAAI,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,gBAAgB,CAAC,KAChD,MAAM,CAAC,MAAM,CAChB,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,EACvC,mBAAmB,CACpB,MACA,MAAM,SAAS,KAAK,CAAC,YAAY,QAC1B,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,gBAAgB,CAAC,SAC5C,MAAM,KACV,MAAM,CAAC,MAAM,CAChB,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,EACvC,mBAAmB,CACpB,CAuBF,CAAC;AAEF,eAAO,MAAM,MAAM,IAChB,MAAM,SAAS,KAAK,CAAC,YAAY,SACzB,MAAM,KACV,CACH,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAC3C,MAAM,CAAC,MAAM,CAChB,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAC1C,mBAAmB,CACpB,MACA,MAAM,SAAS,KAAK,CAAC,YAAY,QAC1B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SACvC,MAAM,KACV,MAAM,CAAC,MAAM,CAChB,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAC1C,mBAAmB,CACpB,CAuBF,CAAC;;;;;;AAEF,qBAAa,mBAAoB,SAAQ,wBAOxC;IACC,IAAa,OAAO,IAAI,MAAM,CAM7B;CACF;;;;;;AAED,qBAAa,mBAAoB,SAAQ,wBAOxC;IACC,IAAa,OAAO,IAAI,MAAM,CAM7B;CACF;AAED,eAAO,MAAM,oBAAoB,gCAI9B;IACD,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB,WAAkE,CAAC"}
@@ -0,0 +1,54 @@
1
+ import { __exportAll } from "./_virtual/_rolldown/runtime.js";
2
+ import * as Effect from "effect/Effect";
3
+ import * as Schema from "effect/Schema";
4
+ import * as Function from "effect/Function";
5
+ import { pipe } from "effect/Function";
6
+ //#region src/Document.ts
7
+ var Document_exports = /* @__PURE__ */ __exportAll({
8
+ DocumentDecodeError: () => DocumentDecodeError,
9
+ DocumentEncodeError: () => DocumentEncodeError,
10
+ decode: () => decode,
11
+ documentErrorMessage: () => documentErrorMessage,
12
+ encode: () => encode
13
+ });
14
+ const decode = Function.dual(2, (self, table) => pipe(self, Schema.decodeUnknownEffect(table.Doc), Effect.catchIf(Schema.isSchemaError, (schemaError) => Effect.fail(new DocumentDecodeError({
15
+ tableName: table.tableName,
16
+ id: self._id,
17
+ parseError: schemaError.message
18
+ })))));
19
+ const encode = Function.dual(2, (self, table) => pipe(self, Schema.encodeEffect(table.Fields), Effect.catchIf(Schema.isSchemaError, (schemaError) => Effect.fail(new DocumentEncodeError({
20
+ tableName: table.tableName,
21
+ id: self._id,
22
+ parseError: schemaError.message
23
+ })))));
24
+ var DocumentDecodeError = class extends Schema.TaggedError()("DocumentDecodeError", {
25
+ tableName: Schema.String,
26
+ id: Schema.String,
27
+ parseError: Schema.String
28
+ }) {
29
+ get message() {
30
+ return documentErrorMessage({
31
+ id: this.id,
32
+ tableName: this.tableName,
33
+ message: `could not be decoded:\n\n${this.parseError}`
34
+ });
35
+ }
36
+ };
37
+ var DocumentEncodeError = class extends Schema.TaggedError()("DocumentEncodeError", {
38
+ tableName: Schema.String,
39
+ id: Schema.String,
40
+ parseError: Schema.String
41
+ }) {
42
+ get message() {
43
+ return documentErrorMessage({
44
+ id: this.id,
45
+ tableName: this.tableName,
46
+ message: `could not be encoded:\n\n${this.parseError}`
47
+ });
48
+ }
49
+ };
50
+ const documentErrorMessage = ({ id, tableName, message }) => `Document with ID '${id}' in table '${tableName}' ${message}`;
51
+ //#endregion
52
+ export { DocumentDecodeError, DocumentEncodeError, Document_exports, decode, documentErrorMessage, encode };
53
+
54
+ //# sourceMappingURL=Document.js.map