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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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,136 @@
1
+ import * as Option from "effect/Option";
2
+ import * as Result from "effect/Result";
3
+ import * as QueryStreamKey from "./QueryStreamKey";
4
+ import * as QueryStreamKeyLayout from "./QueryStreamKeyLayout";
5
+ import * as QueryStreamKeyValues from "./QueryStreamKeyValues";
6
+ /**
7
+ * One side of a range: a (possibly prefix) key and whether it's included.
8
+ *
9
+ * @experimental
10
+ */
11
+ export interface KeyBound {
12
+ readonly keyValues: QueryStreamKeyValues.QueryStreamKeyValues;
13
+ readonly inclusive: boolean;
14
+ }
15
+ /**
16
+ * Bounds over a stream's key, in _ascending key space_ (`narrow` converts from
17
+ * stream space, where `desc` reverses which end is which).
18
+ *
19
+ * @experimental
20
+ */
21
+ export interface KeyBounds {
22
+ readonly lower: Option.Option<KeyBound>;
23
+ readonly upper: Option.Option<KeyBound>;
24
+ }
25
+ /**
26
+ * Bounds in _full index-key space_: `eq`-pinned values appear as a shared
27
+ * prefix of both keys (`fromBounds` re-derives them as `eq` constraints). An
28
+ * empty key bounds nothing.
29
+ *
30
+ * @experimental
31
+ */
32
+ export interface IndexBounds {
33
+ readonly lower: KeyBound;
34
+ readonly upper: KeyBound;
35
+ }
36
+ /**
37
+ * The stricter (later) of two lower bounds.
38
+ *
39
+ * @experimental
40
+ */
41
+ export declare const tightestLower: (self: KeyBound, that: KeyBound) => KeyBound;
42
+ /**
43
+ * The stricter (earlier) of two upper bounds.
44
+ *
45
+ * @experimental
46
+ */
47
+ export declare const tightestUpper: (self: KeyBound, that: KeyBound) => KeyBound;
48
+ /**
49
+ * @experimental
50
+ */
51
+ export declare const intersect: (self: ParsedBounds, that: ParsedBounds) => Result.Result<ParsedBounds, QueryStreamKeyLayout.KeyLayoutMismatchError>;
52
+ /**
53
+ * @experimental
54
+ */
55
+ export declare const isEmpty: (indexBounds: IndexBounds) => boolean;
56
+ /**
57
+ * @experimental
58
+ */
59
+ export declare const intersectIndexBounds: (self: IndexBounds, that: IndexBounds) => IndexBounds;
60
+ /**
61
+ * Whether a compatible key sits after the lower bound (always, when unbounded).
62
+ *
63
+ * @experimental
64
+ */
65
+ export declare const admittedByLower: (parsedBounds: ParsedBounds) => (key: QueryStreamKey.Complete) => Result.Result<boolean, QueryStreamKeyLayout.KeyLayoutMismatchError>;
66
+ /**
67
+ * Whether a compatible key sits before the upper bound (always, when
68
+ * unbounded).
69
+ *
70
+ * @experimental
71
+ */
72
+ export declare const admittedByUpper: (parsedBounds: ParsedBounds) => (key: QueryStreamKey.Complete) => Result.Result<boolean, QueryStreamKeyLayout.KeyLayoutMismatchError>;
73
+ /**
74
+ * At least one endpoint in stream order. Omit the other to leave that side
75
+ * unbounded.
76
+ *
77
+ * @experimental
78
+ */
79
+ export type NarrowBounds = {
80
+ readonly start: KeyBound;
81
+ readonly end?: KeyBound | undefined;
82
+ } | {
83
+ readonly start?: KeyBound | undefined;
84
+ readonly end: KeyBound;
85
+ };
86
+ /**
87
+ * @experimental
88
+ */
89
+ export interface ParsedBound {
90
+ readonly key: QueryStreamKey.Prefix;
91
+ readonly inclusive: boolean;
92
+ }
93
+ declare const TypeId = "~@confect/server/QueryStreamKeyBounds";
94
+ /**
95
+ * @experimental
96
+ */
97
+ export interface ParsedBounds {
98
+ readonly [TypeId]: typeof TypeId;
99
+ readonly keyLayout: QueryStreamKeyLayout.QueryStreamKeyLayout;
100
+ readonly lower: Option.Option<ParsedBound>;
101
+ readonly upper: Option.Option<ParsedBound>;
102
+ }
103
+ /**
104
+ * @experimental
105
+ */
106
+ export declare const unbounded: (keyLayout: QueryStreamKeyLayout.QueryStreamKeyLayout) => ParsedBounds;
107
+ /**
108
+ * @experimental
109
+ */
110
+ export declare const forLayout: (keyLayout: QueryStreamKeyLayout.QueryStreamKeyLayout, parsedBounds: ParsedBounds) => Result.Result<ParsedBounds, QueryStreamKeyLayout.KeyLayoutMismatchError>;
111
+ /**
112
+ * @experimental
113
+ */
114
+ export declare const fromParsed: (keyLayout: QueryStreamKeyLayout.QueryStreamKeyLayout, endpoints: Pick<ParsedBounds, "lower" | "upper">) => Result.Result<ParsedBounds, QueryStreamKeyLayout.KeyLayoutMismatchError>;
115
+ /**
116
+ * @experimental
117
+ */
118
+ export declare const tightestParsedLower: (self: ParsedBound, that: ParsedBound) => Result.Result<ParsedBound, QueryStreamKeyLayout.KeyLayoutMismatchError>;
119
+ /**
120
+ * @experimental
121
+ */
122
+ export declare const tightestParsedUpper: (self: ParsedBound, that: ParsedBound) => Result.Result<ParsedBound, QueryStreamKeyLayout.KeyLayoutMismatchError>;
123
+ /**
124
+ * @experimental
125
+ */
126
+ export declare const parseBound: (keyLayout: QueryStreamKeyLayout.QueryStreamKeyLayout, { keyValues, inclusive }: KeyBound) => Result.Result<ParsedBound, QueryStreamKey.KeyWidthMismatchError>;
127
+ /**
128
+ * @experimental
129
+ */
130
+ export declare const parse: (keyLayout: QueryStreamKeyLayout.QueryStreamKeyLayout, keyBounds: KeyBounds) => Result.Result<ParsedBounds, QueryStreamKey.KeyWidthMismatchError>;
131
+ /**
132
+ * @experimental
133
+ */
134
+ export declare const toBounds: (parsedBounds: ParsedBounds) => KeyBounds;
135
+ export {};
136
+ //# sourceMappingURL=QueryStreamKeyBounds.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QueryStreamKeyBounds.d.ts","sourceRoot":"","sources":["../src/QueryStreamKeyBounds.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,208 @@
1
+ import { __exportAll } from "./_virtual/_rolldown/runtime.js";
2
+ import { validateEquivalence } from "./QueryStreamKeyLayout.js";
3
+ import { prefix, values } from "./QueryStreamKey.js";
4
+ import { Order as Order$1 } from "./QueryStreamKeyValues.js";
5
+ import * as Option from "effect/Option";
6
+ import * as Array from "effect/Array";
7
+ import * as Order from "effect/Order";
8
+ import * as Result from "effect/Result";
9
+ import * as Data from "effect/Data";
10
+ //#region src/QueryStreamKeyBounds.ts
11
+ var QueryStreamKeyBounds_exports = /* @__PURE__ */ __exportAll({
12
+ admittedByLower: () => admittedByLower,
13
+ admittedByUpper: () => admittedByUpper,
14
+ forLayout: () => forLayout,
15
+ fromParsed: () => fromParsed,
16
+ intersect: () => intersect,
17
+ intersectIndexBounds: () => intersectIndexBounds,
18
+ isEmpty: () => isEmpty,
19
+ parse: () => parse,
20
+ parseBound: () => parseBound,
21
+ tightestLower: () => tightestLower,
22
+ tightestParsedLower: () => tightestParsedLower,
23
+ tightestParsedUpper: () => tightestParsedUpper,
24
+ tightestUpper: () => tightestUpper,
25
+ toBounds: () => toBounds,
26
+ unbounded: () => unbounded
27
+ });
28
+ const KeyCut = Data.taggedEnum();
29
+ const cutRank = KeyCut.$match({
30
+ Predecessor: () => 0,
31
+ Exact: () => 1,
32
+ Successor: () => 2
33
+ });
34
+ const cutKeyValues = KeyCut.$match({
35
+ Predecessor: ({ keyValues }) => keyValues,
36
+ Exact: ({ key }) => values(key),
37
+ Successor: ({ keyValues }) => keyValues
38
+ });
39
+ const KeyCutOrder = Order.make((self, that) => {
40
+ const selfKeyValues = cutKeyValues(self);
41
+ const thatKeyValues = cutKeyValues(that);
42
+ const minLength = Math.min(selfKeyValues.length, thatKeyValues.length);
43
+ const prefixOrdering = Order$1("asc")(Array.take(selfKeyValues, minLength), Array.take(thatKeyValues, minLength));
44
+ if (prefixOrdering !== 0) return prefixOrdering;
45
+ if (selfKeyValues.length === thatKeyValues.length) return Order.Number(cutRank(self), cutRank(that));
46
+ const selfIsShorter = selfKeyValues.length < thatKeyValues.length;
47
+ const shorter = selfIsShorter ? self : that;
48
+ const shorterOrdering = KeyCut.$match(shorter, {
49
+ Predecessor: () => -1,
50
+ Exact: () => 1,
51
+ Successor: () => 1
52
+ });
53
+ return selfIsShorter ? shorterOrdering : -shorterOrdering;
54
+ });
55
+ const lowerCut = (bound) => bound.inclusive ? KeyCut.Predecessor({ keyValues: bound.keyValues }) : KeyCut.Successor({ keyValues: bound.keyValues });
56
+ const upperCut = (bound) => bound.inclusive ? KeyCut.Successor({ keyValues: bound.keyValues }) : KeyCut.Predecessor({ keyValues: bound.keyValues });
57
+ /**
58
+ * The stricter (later) of two lower bounds.
59
+ *
60
+ * @experimental
61
+ */
62
+ const tightestLower = (self, that) => Order.isGreaterThan(KeyCutOrder)(lowerCut(that), lowerCut(self)) ? that : self;
63
+ /**
64
+ * The stricter (earlier) of two upper bounds.
65
+ *
66
+ * @experimental
67
+ */
68
+ const tightestUpper = (self, that) => Order.isLessThan(KeyCutOrder)(upperCut(that), upperCut(self)) ? that : self;
69
+ const combineKeyBound = (self, that, combine) => Option.match(self, {
70
+ onNone: () => that,
71
+ onSome: (first) => Option.some(Option.match(that, {
72
+ onNone: () => first,
73
+ onSome: (second) => combine(first, second)
74
+ }))
75
+ });
76
+ /**
77
+ * @experimental
78
+ */
79
+ const intersect = (self, that) => Result.map(forLayout(self.keyLayout, that), () => make(self.keyLayout, {
80
+ lower: combineKeyBound(self.lower, that.lower, tighterLower),
81
+ upper: combineKeyBound(self.upper, that.upper, tighterUpper)
82
+ }));
83
+ /**
84
+ * @experimental
85
+ */
86
+ const isEmpty = (indexBounds) => KeyCutOrder(lowerCut(indexBounds.lower), upperCut(indexBounds.upper)) >= 0;
87
+ /**
88
+ * @experimental
89
+ */
90
+ const intersectIndexBounds = (self, that) => ({
91
+ lower: tightestLower(self.lower, that.lower),
92
+ upper: tightestUpper(self.upper, that.upper)
93
+ });
94
+ /**
95
+ * Whether a compatible key sits after the lower bound (always, when unbounded).
96
+ *
97
+ * @experimental
98
+ */
99
+ const admittedByLower = (parsedBounds) => (key) => Result.gen(function* () {
100
+ yield* validateEquivalence(parsedBounds.keyLayout, key.layout);
101
+ return Option.match(parsedBounds.lower, {
102
+ onNone: () => true,
103
+ onSome: (bound) => KeyCutOrder(KeyCut.Exact({ key }), lowerCut(rawBound(bound))) > 0
104
+ });
105
+ });
106
+ /**
107
+ * Whether a compatible key sits before the upper bound (always, when
108
+ * unbounded).
109
+ *
110
+ * @experimental
111
+ */
112
+ const admittedByUpper = (parsedBounds) => (key) => Result.gen(function* () {
113
+ yield* validateEquivalence(parsedBounds.keyLayout, key.layout);
114
+ return Option.match(parsedBounds.upper, {
115
+ onNone: () => true,
116
+ onSome: (bound) => KeyCutOrder(KeyCut.Exact({ key }), upperCut(rawBound(bound))) < 0
117
+ });
118
+ });
119
+ const TypeId = "~@confect/server/QueryStreamKeyBounds";
120
+ const make = (keyLayout, endpoints) => ({
121
+ [TypeId]: TypeId,
122
+ keyLayout,
123
+ lower: endpoints.lower,
124
+ upper: endpoints.upper
125
+ });
126
+ /**
127
+ * @experimental
128
+ */
129
+ const unbounded = (keyLayout) => make(keyLayout, {
130
+ lower: Option.none(),
131
+ upper: Option.none()
132
+ });
133
+ /**
134
+ * @experimental
135
+ */
136
+ const forLayout = (keyLayout, parsedBounds) => Result.gen(function* () {
137
+ yield* validateEquivalence(keyLayout, parsedBounds.keyLayout);
138
+ return parsedBounds;
139
+ });
140
+ /**
141
+ * @experimental
142
+ */
143
+ const fromParsed = (keyLayout, endpoints) => {
144
+ const validateEndpoint = (endpoint) => Option.match(endpoint, {
145
+ onNone: () => Result.succeed(void 0),
146
+ onSome: ({ key }) => validateEquivalence(keyLayout, key.layout)
147
+ });
148
+ return Result.gen(function* () {
149
+ yield* validateEndpoint(endpoints.lower);
150
+ yield* validateEndpoint(endpoints.upper);
151
+ return make(keyLayout, endpoints);
152
+ });
153
+ };
154
+ const rawBound = (bound) => ({
155
+ keyValues: values(bound.key),
156
+ inclusive: bound.inclusive
157
+ });
158
+ const tighterLower = (self, that) => KeyCutOrder(lowerCut(rawBound(that)), lowerCut(rawBound(self))) > 0 ? that : self;
159
+ const tighterUpper = (self, that) => KeyCutOrder(upperCut(rawBound(that)), upperCut(rawBound(self))) < 0 ? that : self;
160
+ /**
161
+ * @experimental
162
+ */
163
+ const tightestParsedLower = (self, that) => Result.gen(function* () {
164
+ yield* validateEquivalence(self.key.layout, that.key.layout);
165
+ return tighterLower(self, that);
166
+ });
167
+ /**
168
+ * @experimental
169
+ */
170
+ const tightestParsedUpper = (self, that) => Result.gen(function* () {
171
+ yield* validateEquivalence(self.key.layout, that.key.layout);
172
+ return tighterUpper(self, that);
173
+ });
174
+ /**
175
+ * @experimental
176
+ */
177
+ const parseBound = (keyLayout, { keyValues, inclusive }) => Result.map(prefix(keyLayout, keyValues), (key) => ({
178
+ key,
179
+ inclusive
180
+ }));
181
+ /**
182
+ * @experimental
183
+ */
184
+ const parse = (keyLayout, keyBounds) => {
185
+ const endpoint = (bound) => Option.match(bound, {
186
+ onNone: () => Result.succeed(Option.none()),
187
+ onSome: (value) => Result.map(parseBound(keyLayout, value), Option.some)
188
+ });
189
+ return Result.gen(function* () {
190
+ const lower = yield* endpoint(keyBounds.lower);
191
+ const upper = yield* endpoint(keyBounds.upper);
192
+ return make(keyLayout, {
193
+ lower,
194
+ upper
195
+ });
196
+ });
197
+ };
198
+ /**
199
+ * @experimental
200
+ */
201
+ const toBounds = (parsedBounds) => ({
202
+ lower: Option.map(parsedBounds.lower, rawBound),
203
+ upper: Option.map(parsedBounds.upper, rawBound)
204
+ });
205
+ //#endregion
206
+ export { QueryStreamKeyBounds_exports, admittedByLower, admittedByUpper, forLayout, fromParsed, intersect, intersectIndexBounds, isEmpty, parse, parseBound, tightestLower, tightestParsedLower, tightestParsedUpper, tightestUpper, toBounds, unbounded };
207
+
208
+ //# sourceMappingURL=QueryStreamKeyBounds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QueryStreamKeyBounds.js","names":["QueryStreamKey.values","QueryStreamKeyValues.Order","QueryStreamKeyLayout.validateEquivalence","QueryStreamKey.prefix"],"sources":["../src/QueryStreamKeyBounds.ts"],"sourcesContent":["import * as Array from \"effect/Array\";\nimport * as Data from \"effect/Data\";\nimport * as Option from \"effect/Option\";\nimport * as Order from \"effect/Order\";\nimport * as Result from \"effect/Result\";\nimport * as QueryStreamKey from \"./QueryStreamKey\";\nimport * as QueryStreamKeyLayout from \"./QueryStreamKeyLayout\";\nimport * as QueryStreamKeyValues from \"./QueryStreamKeyValues\";\n\n// A bound's key may be a *prefix* of the full key: bounding by `[\"a\"]` means\n// bounding by the whole family of keys that start with `\"a\"`. To compare\n// bounds and keys uniformly, each is modelled as a \"cut\"—a position\n// *between* keys: the `predecessor` cut of a prefix sits just before every\n// key extending it, the `successor` cut just after, and an `exact` cut is a\n// full key itself. (This is `convex-helpers`' `compareKeys` model.)\n\n/**\n * One side of a range: a (possibly prefix) key and whether it's included.\n *\n * @experimental\n */\nexport interface KeyBound {\n readonly keyValues: QueryStreamKeyValues.QueryStreamKeyValues;\n readonly inclusive: boolean;\n}\n\n/**\n * Bounds over a stream's key, in _ascending key space_ (`narrow` converts from\n * stream space, where `desc` reverses which end is which).\n *\n * @experimental\n */\nexport interface KeyBounds {\n readonly lower: Option.Option<KeyBound>;\n readonly upper: Option.Option<KeyBound>;\n}\n\n/**\n * Bounds in _full index-key space_: `eq`-pinned values appear as a shared\n * prefix of both keys (`fromBounds` re-derives them as `eq` constraints). An\n * empty key bounds nothing.\n *\n * @experimental\n */\nexport interface IndexBounds {\n readonly lower: KeyBound;\n readonly upper: KeyBound;\n}\n\ntype KeyCut = Data.TaggedEnum<{\n Predecessor: {\n readonly keyValues: QueryStreamKeyValues.QueryStreamKeyValues;\n };\n Exact: { readonly key: QueryStreamKey.Complete };\n Successor: { readonly keyValues: QueryStreamKeyValues.QueryStreamKeyValues };\n}>;\nconst KeyCut = Data.taggedEnum<KeyCut>();\n\nconst cutRank = KeyCut.$match({\n Predecessor: () => 0,\n Exact: () => 1,\n Successor: () => 2,\n});\n\nconst cutKeyValues = KeyCut.$match({\n Predecessor: ({ keyValues }) => keyValues,\n Exact: ({ key }) => QueryStreamKey.values(key),\n Successor: ({ keyValues }) => keyValues,\n});\n\nconst KeyCutOrder: Order.Order<KeyCut> = Order.make((self, that) => {\n const selfKeyValues = cutKeyValues(self);\n const thatKeyValues = cutKeyValues(that);\n const minLength = Math.min(selfKeyValues.length, thatKeyValues.length);\n const prefixOrdering = QueryStreamKeyValues.Order(\"asc\")(\n Array.take(selfKeyValues, minLength),\n Array.take(thatKeyValues, minLength),\n );\n if (prefixOrdering !== 0) {\n return prefixOrdering;\n }\n if (selfKeyValues.length === thatKeyValues.length) {\n return Order.Number(cutRank(self), cutRank(that));\n }\n // One key is a proper prefix of the other. The shorter cut sits just\n // before (`predecessor`) or just after (`successor`) *every* key\n // extending its prefix—the longer one included. (`exact` cuts are\n // always full keys, so an `exact` cut is never the shorter one here.)\n const selfIsShorter = selfKeyValues.length < thatKeyValues.length;\n const shorter = selfIsShorter ? self : that;\n const shorterOrdering = KeyCut.$match(shorter, {\n Predecessor: () => -1 as const,\n Exact: () => 1 as const,\n Successor: () => 1 as const,\n });\n return selfIsShorter ? shorterOrdering : (-shorterOrdering as -1 | 1);\n});\n\nconst lowerCut = (bound: KeyBound): KeyCut =>\n bound.inclusive\n ? KeyCut.Predecessor({ keyValues: bound.keyValues })\n : KeyCut.Successor({ keyValues: bound.keyValues });\n\nconst upperCut = (bound: KeyBound): KeyCut =>\n bound.inclusive\n ? KeyCut.Successor({ keyValues: bound.keyValues })\n : KeyCut.Predecessor({ keyValues: bound.keyValues });\n\n/**\n * The stricter (later) of two lower bounds.\n *\n * @experimental\n */\nexport const tightestLower = (self: KeyBound, that: KeyBound): KeyBound =>\n Order.isGreaterThan(KeyCutOrder)(lowerCut(that), lowerCut(self))\n ? that\n : self;\n\n/**\n * The stricter (earlier) of two upper bounds.\n *\n * @experimental\n */\nexport const tightestUpper = (self: KeyBound, that: KeyBound): KeyBound =>\n Order.isLessThan(KeyCutOrder)(upperCut(that), upperCut(self)) ? that : self;\n\nconst combineKeyBound = (\n self: Option.Option<ParsedBound>,\n that: Option.Option<ParsedBound>,\n combine: (self: ParsedBound, that: ParsedBound) => ParsedBound,\n): Option.Option<ParsedBound> =>\n Option.match(self, {\n onNone: () => that,\n onSome: (first) =>\n Option.some(\n Option.match(that, {\n onNone: () => first,\n onSome: (second) => combine(first, second),\n }),\n ),\n });\n\n/**\n * @experimental\n */\nexport const intersect = (\n self: ParsedBounds,\n that: ParsedBounds,\n): Result.Result<ParsedBounds, QueryStreamKeyLayout.KeyLayoutMismatchError> =>\n Result.map(forLayout(self.keyLayout, that), () =>\n make(self.keyLayout, {\n lower: combineKeyBound(self.lower, that.lower, tighterLower),\n upper: combineKeyBound(self.upper, that.upper, tighterUpper),\n }),\n );\n\n/**\n * @experimental\n */\nexport const isEmpty = (indexBounds: IndexBounds): boolean =>\n KeyCutOrder(lowerCut(indexBounds.lower), upperCut(indexBounds.upper)) >= 0;\n\n/**\n * @experimental\n */\nexport const intersectIndexBounds = (\n self: IndexBounds,\n that: IndexBounds,\n): IndexBounds => ({\n lower: tightestLower(self.lower, that.lower),\n upper: tightestUpper(self.upper, that.upper),\n});\n\n/**\n * Whether a compatible key sits after the lower bound (always, when unbounded).\n *\n * @experimental\n */\nexport const admittedByLower =\n (parsedBounds: ParsedBounds) =>\n (\n key: QueryStreamKey.Complete,\n ): Result.Result<boolean, QueryStreamKeyLayout.KeyLayoutMismatchError> =>\n Result.gen(function* () {\n yield* QueryStreamKeyLayout.validateEquivalence(\n parsedBounds.keyLayout,\n key.layout,\n );\n return Option.match(parsedBounds.lower, {\n onNone: () => true,\n onSome: (bound) =>\n KeyCutOrder(KeyCut.Exact({ key }), lowerCut(rawBound(bound))) > 0,\n });\n });\n\n/**\n * Whether a compatible key sits before the upper bound (always, when\n * unbounded).\n *\n * @experimental\n */\nexport const admittedByUpper =\n (parsedBounds: ParsedBounds) =>\n (\n key: QueryStreamKey.Complete,\n ): Result.Result<boolean, QueryStreamKeyLayout.KeyLayoutMismatchError> =>\n Result.gen(function* () {\n yield* QueryStreamKeyLayout.validateEquivalence(\n parsedBounds.keyLayout,\n key.layout,\n );\n return Option.match(parsedBounds.upper, {\n onNone: () => true,\n onSome: (bound) =>\n KeyCutOrder(KeyCut.Exact({ key }), upperCut(rawBound(bound))) < 0,\n });\n });\n\n/**\n * At least one endpoint in stream order. Omit the other to leave that side\n * unbounded.\n *\n * @experimental\n */\nexport type NarrowBounds =\n | {\n readonly start: KeyBound;\n readonly end?: KeyBound | undefined;\n }\n | {\n readonly start?: KeyBound | undefined;\n readonly end: KeyBound;\n };\n\n/**\n * @experimental\n */\nexport interface ParsedBound {\n readonly key: QueryStreamKey.Prefix;\n readonly inclusive: boolean;\n}\n\n// Endpoints validated against a stream layout. Operations that preserve the\n// key space retain these values; coordinate changes construct new endpoints.\nconst TypeId = \"~@confect/server/QueryStreamKeyBounds\";\n\n/**\n * @experimental\n */\nexport interface ParsedBounds {\n readonly [TypeId]: typeof TypeId;\n readonly keyLayout: QueryStreamKeyLayout.QueryStreamKeyLayout;\n readonly lower: Option.Option<ParsedBound>;\n readonly upper: Option.Option<ParsedBound>;\n}\n\nconst make = (\n keyLayout: QueryStreamKeyLayout.QueryStreamKeyLayout,\n endpoints: Pick<ParsedBounds, \"lower\" | \"upper\">,\n): ParsedBounds => ({\n [TypeId]: TypeId,\n keyLayout,\n lower: endpoints.lower,\n upper: endpoints.upper,\n});\n\n/**\n * @experimental\n */\nexport const unbounded = (\n keyLayout: QueryStreamKeyLayout.QueryStreamKeyLayout,\n): ParsedBounds =>\n make(keyLayout, { lower: Option.none(), upper: Option.none() });\n\n/**\n * @experimental\n */\nexport const forLayout = (\n keyLayout: QueryStreamKeyLayout.QueryStreamKeyLayout,\n parsedBounds: ParsedBounds,\n): Result.Result<ParsedBounds, QueryStreamKeyLayout.KeyLayoutMismatchError> =>\n Result.gen(function* () {\n yield* QueryStreamKeyLayout.validateEquivalence(\n keyLayout,\n parsedBounds.keyLayout,\n );\n return parsedBounds;\n });\n\n// Combining existing parsed endpoints still needs a shared layout, including\n// when one or both endpoints are absent.\n/**\n * @experimental\n */\nexport const fromParsed = (\n keyLayout: QueryStreamKeyLayout.QueryStreamKeyLayout,\n endpoints: Pick<ParsedBounds, \"lower\" | \"upper\">,\n): Result.Result<ParsedBounds, QueryStreamKeyLayout.KeyLayoutMismatchError> => {\n const validateEndpoint = (endpoint: Option.Option<ParsedBound>) =>\n Option.match(endpoint, {\n onNone: () => Result.succeed(undefined),\n onSome: ({ key }) =>\n QueryStreamKeyLayout.validateEquivalence(keyLayout, key.layout),\n });\n return Result.gen(function* () {\n yield* validateEndpoint(endpoints.lower);\n yield* validateEndpoint(endpoints.upper);\n return make(keyLayout, endpoints);\n });\n};\n\nconst rawBound = (bound: ParsedBound): KeyBound => ({\n keyValues: QueryStreamKey.values(bound.key),\n inclusive: bound.inclusive,\n});\n\n// Select existing endpoints so intersection retains their parsed keys.\nconst tighterLower = (self: ParsedBound, that: ParsedBound): ParsedBound =>\n KeyCutOrder(lowerCut(rawBound(that)), lowerCut(rawBound(self))) > 0\n ? that\n : self;\n\nconst tighterUpper = (self: ParsedBound, that: ParsedBound): ParsedBound =>\n KeyCutOrder(upperCut(rawBound(that)), upperCut(rawBound(self))) < 0\n ? that\n : self;\n\n/**\n * @experimental\n */\nexport const tightestParsedLower = (\n self: ParsedBound,\n that: ParsedBound,\n): Result.Result<ParsedBound, QueryStreamKeyLayout.KeyLayoutMismatchError> =>\n Result.gen(function* () {\n yield* QueryStreamKeyLayout.validateEquivalence(\n self.key.layout,\n that.key.layout,\n );\n return tighterLower(self, that);\n });\n\n/**\n * @experimental\n */\nexport const tightestParsedUpper = (\n self: ParsedBound,\n that: ParsedBound,\n): Result.Result<ParsedBound, QueryStreamKeyLayout.KeyLayoutMismatchError> =>\n Result.gen(function* () {\n yield* QueryStreamKeyLayout.validateEquivalence(\n self.key.layout,\n that.key.layout,\n );\n return tighterUpper(self, that);\n });\n\n/**\n * @experimental\n */\nexport const parseBound = (\n keyLayout: QueryStreamKeyLayout.QueryStreamKeyLayout,\n { keyValues, inclusive }: KeyBound,\n): Result.Result<ParsedBound, QueryStreamKey.KeyWidthMismatchError> =>\n Result.map(QueryStreamKey.prefix(keyLayout, keyValues), (key) => ({\n key,\n inclusive,\n }));\n\n/**\n * @experimental\n */\nexport const parse = (\n keyLayout: QueryStreamKeyLayout.QueryStreamKeyLayout,\n keyBounds: KeyBounds,\n): Result.Result<ParsedBounds, QueryStreamKey.KeyWidthMismatchError> => {\n const endpoint = (bound: Option.Option<KeyBound>) =>\n Option.match(bound, {\n onNone: () => Result.succeed(Option.none<ParsedBound>()),\n onSome: (value) => Result.map(parseBound(keyLayout, value), Option.some),\n });\n return Result.gen(function* () {\n const lower = yield* endpoint(keyBounds.lower);\n const upper = yield* endpoint(keyBounds.upper);\n return make(keyLayout, { lower, upper });\n });\n};\n\n/**\n * @experimental\n */\nexport const toBounds = (parsedBounds: ParsedBounds): KeyBounds => ({\n lower: Option.map(parsedBounds.lower, rawBound),\n upper: Option.map(parsedBounds.upper, rawBound),\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAwDA,MAAM,SAAS,KAAK,WAAmB;AAEvC,MAAM,UAAU,OAAO,OAAO;CAC5B,mBAAmB;CACnB,aAAa;CACb,iBAAiB;AACnB,CAAC;AAED,MAAM,eAAe,OAAO,OAAO;CACjC,cAAc,EAAE,gBAAgB;CAChC,QAAQ,EAAE,UAAUA,OAAsB,GAAG;CAC7C,YAAY,EAAE,gBAAgB;AAChC,CAAC;AAED,MAAM,cAAmC,MAAM,MAAM,MAAM,SAAS;CAClE,MAAM,gBAAgB,aAAa,IAAI;CACvC,MAAM,gBAAgB,aAAa,IAAI;CACvC,MAAM,YAAY,KAAK,IAAI,cAAc,QAAQ,cAAc,MAAM;CACrE,MAAM,iBAAiBC,QAA2B,KAAK,CAAC,CACtD,MAAM,KAAK,eAAe,SAAS,GACnC,MAAM,KAAK,eAAe,SAAS,CACrC;CACA,IAAI,mBAAmB,GACrB,OAAO;CAET,IAAI,cAAc,WAAW,cAAc,QACzC,OAAO,MAAM,OAAO,QAAQ,IAAI,GAAG,QAAQ,IAAI,CAAC;CAMlD,MAAM,gBAAgB,cAAc,SAAS,cAAc;CAC3D,MAAM,UAAU,gBAAgB,OAAO;CACvC,MAAM,kBAAkB,OAAO,OAAO,SAAS;EAC7C,mBAAmB;EACnB,aAAa;EACb,iBAAiB;CACnB,CAAC;CACD,OAAO,gBAAgB,kBAAmB,CAAC;AAC7C,CAAC;AAED,MAAM,YAAY,UAChB,MAAM,YACF,OAAO,YAAY,EAAE,WAAW,MAAM,UAAU,CAAC,IACjD,OAAO,UAAU,EAAE,WAAW,MAAM,UAAU,CAAC;AAErD,MAAM,YAAY,UAChB,MAAM,YACF,OAAO,UAAU,EAAE,WAAW,MAAM,UAAU,CAAC,IAC/C,OAAO,YAAY,EAAE,WAAW,MAAM,UAAU,CAAC;;;;;;AAOvD,MAAa,iBAAiB,MAAgB,SAC5C,MAAM,cAAc,WAAW,CAAC,CAAC,SAAS,IAAI,GAAG,SAAS,IAAI,CAAC,IAC3D,OACA;;;;;;AAON,MAAa,iBAAiB,MAAgB,SAC5C,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,IAAI,GAAG,SAAS,IAAI,CAAC,IAAI,OAAO;AAEzE,MAAM,mBACJ,MACA,MACA,YAEA,OAAO,MAAM,MAAM;CACjB,cAAc;CACd,SAAS,UACP,OAAO,KACL,OAAO,MAAM,MAAM;EACjB,cAAc;EACd,SAAS,WAAW,QAAQ,OAAO,MAAM;CAC3C,CAAC,CACH;AACJ,CAAC;;;;AAKH,MAAa,aACX,MACA,SAEA,OAAO,IAAI,UAAU,KAAK,WAAW,IAAI,SACvC,KAAK,KAAK,WAAW;CACnB,OAAO,gBAAgB,KAAK,OAAO,KAAK,OAAO,YAAY;CAC3D,OAAO,gBAAgB,KAAK,OAAO,KAAK,OAAO,YAAY;AAC7D,CAAC,CACH;;;;AAKF,MAAa,WAAW,gBACtB,YAAY,SAAS,YAAY,KAAK,GAAG,SAAS,YAAY,KAAK,CAAC,KAAK;;;;AAK3E,MAAa,wBACX,MACA,UACiB;CACjB,OAAO,cAAc,KAAK,OAAO,KAAK,KAAK;CAC3C,OAAO,cAAc,KAAK,OAAO,KAAK,KAAK;AAC7C;;;;;;AAOA,MAAa,mBACV,kBAEC,QAEA,OAAO,IAAI,aAAa;CACtB,OAAOC,oBACL,aAAa,WACb,IAAI,MACN;CACA,OAAO,OAAO,MAAM,aAAa,OAAO;EACtC,cAAc;EACd,SAAS,UACP,YAAY,OAAO,MAAM,EAAE,IAAI,CAAC,GAAG,SAAS,SAAS,KAAK,CAAC,CAAC,IAAI;CACpE,CAAC;AACH,CAAC;;;;;;;AAQL,MAAa,mBACV,kBAEC,QAEA,OAAO,IAAI,aAAa;CACtB,OAAOA,oBACL,aAAa,WACb,IAAI,MACN;CACA,OAAO,OAAO,MAAM,aAAa,OAAO;EACtC,cAAc;EACd,SAAS,UACP,YAAY,OAAO,MAAM,EAAE,IAAI,CAAC,GAAG,SAAS,SAAS,KAAK,CAAC,CAAC,IAAI;CACpE,CAAC;AACH,CAAC;AA4BL,MAAM,SAAS;AAYf,MAAM,QACJ,WACA,eACkB;EACjB,SAAS;CACV;CACA,OAAO,UAAU;CACjB,OAAO,UAAU;AACnB;;;;AAKA,MAAa,aACX,cAEA,KAAK,WAAW;CAAE,OAAO,OAAO,KAAK;CAAG,OAAO,OAAO,KAAK;AAAE,CAAC;;;;AAKhE,MAAa,aACX,WACA,iBAEA,OAAO,IAAI,aAAa;CACtB,OAAOA,oBACL,WACA,aAAa,SACf;CACA,OAAO;AACT,CAAC;;;;AAOH,MAAa,cACX,WACA,cAC6E;CAC7E,MAAM,oBAAoB,aACxB,OAAO,MAAM,UAAU;EACrB,cAAc,OAAO,QAAQ,KAAA,CAAS;EACtC,SAAS,EAAE,UACTA,oBAAyC,WAAW,IAAI,MAAM;CAClE,CAAC;CACH,OAAO,OAAO,IAAI,aAAa;EAC7B,OAAO,iBAAiB,UAAU,KAAK;EACvC,OAAO,iBAAiB,UAAU,KAAK;EACvC,OAAO,KAAK,WAAW,SAAS;CAClC,CAAC;AACH;AAEA,MAAM,YAAY,WAAkC;CAClD,WAAWF,OAAsB,MAAM,GAAG;CAC1C,WAAW,MAAM;AACnB;AAGA,MAAM,gBAAgB,MAAmB,SACvC,YAAY,SAAS,SAAS,IAAI,CAAC,GAAG,SAAS,SAAS,IAAI,CAAC,CAAC,IAAI,IAC9D,OACA;AAEN,MAAM,gBAAgB,MAAmB,SACvC,YAAY,SAAS,SAAS,IAAI,CAAC,GAAG,SAAS,SAAS,IAAI,CAAC,CAAC,IAAI,IAC9D,OACA;;;;AAKN,MAAa,uBACX,MACA,SAEA,OAAO,IAAI,aAAa;CACtB,OAAOE,oBACL,KAAK,IAAI,QACT,KAAK,IAAI,MACX;CACA,OAAO,aAAa,MAAM,IAAI;AAChC,CAAC;;;;AAKH,MAAa,uBACX,MACA,SAEA,OAAO,IAAI,aAAa;CACtB,OAAOA,oBACL,KAAK,IAAI,QACT,KAAK,IAAI,MACX;CACA,OAAO,aAAa,MAAM,IAAI;AAChC,CAAC;;;;AAKH,MAAa,cACX,WACA,EAAE,WAAW,gBAEb,OAAO,IAAIC,OAAsB,WAAW,SAAS,IAAI,SAAS;CAChE;CACA;AACF,EAAE;;;;AAKJ,MAAa,SACX,WACA,cACsE;CACtE,MAAM,YAAY,UAChB,OAAO,MAAM,OAAO;EAClB,cAAc,OAAO,QAAQ,OAAO,KAAkB,CAAC;EACvD,SAAS,UAAU,OAAO,IAAI,WAAW,WAAW,KAAK,GAAG,OAAO,IAAI;CACzE,CAAC;CACH,OAAO,OAAO,IAAI,aAAa;EAC7B,MAAM,QAAQ,OAAO,SAAS,UAAU,KAAK;EAC7C,MAAM,QAAQ,OAAO,SAAS,UAAU,KAAK;EAC7C,OAAO,KAAK,WAAW;GAAE;GAAO;EAAM,CAAC;CACzC,CAAC;AACH;;;;AAKA,MAAa,YAAY,kBAA2C;CAClE,OAAO,OAAO,IAAI,aAAa,OAAO,QAAQ;CAC9C,OAAO,OAAO,IAAI,aAAa,OAAO,QAAQ;AAChD"}
@@ -0,0 +1,27 @@
1
+ import * as Brand from "effect/Brand";
2
+ /**
3
+ * Ordered names for the visible components of a stream's ordering key. Names
4
+ * may repeat, and the sequence may be empty. They are aliases, not document
5
+ * field paths; implicit ID positions have no visible label.
6
+ *
7
+ * @experimental
8
+ */
9
+ export type QueryStreamKeyLabels<Names extends ReadonlyArray<string> = ReadonlyArray<string>> = Readonly<Names> & Brand.Brand<"@confect/server/QueryStreamKeyLabels">;
10
+ /**
11
+ * @experimental
12
+ */
13
+ export type Concat<LeftKeyLabels extends QueryStreamKeyLabels, RightKeyLabels extends QueryStreamKeyLabels> = LeftKeyLabels extends QueryStreamKeyLabels<infer LeftNames> ? RightKeyLabels extends QueryStreamKeyLabels<infer RightNames> ? QueryStreamKeyLabels<readonly [...LeftNames, ...RightNames]> : never : never;
14
+ /**
15
+ * Mark a tuple of names as labels without changing its runtime representation.
16
+ *
17
+ * @experimental
18
+ */
19
+ export declare function make<const Names extends ReadonlyArray<string>>(names: Names): QueryStreamKeyLabels<Names>;
20
+ /**
21
+ * Check whether the labels start with the given prefix, including order and
22
+ * multiplicity. The empty prefix always matches.
23
+ *
24
+ * @experimental
25
+ */
26
+ export declare const hasPrefix: (self: QueryStreamKeyLabels, prefixKeyLabels: QueryStreamKeyLabels) => boolean;
27
+ //# sourceMappingURL=QueryStreamKeyLabels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QueryStreamKeyLabels.d.ts","sourceRoot":"","sources":["../src/QueryStreamKeyLabels.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAEtC;;;;;;GAMG;AACH,MAAM,MAAM,oBAAoB,CAC9B,KAAK,SAAS,aAAa,CAAC,MAAM,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC,IACzD,QAAQ,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;AAM1E;;GAEG;AACH,MAAM,MAAM,MAAM,CAChB,aAAa,SAAS,oBAAoB,EAC1C,cAAc,SAAS,oBAAoB,IAE3C,aAAa,SAAS,oBAAoB,CAAC,MAAM,SAAS,CAAC,GACvD,cAAc,SAAS,oBAAoB,CAAC,MAAM,UAAU,CAAC,GAC3D,oBAAoB,CAAC,SAAS,CAAC,GAAG,SAAS,EAAE,GAAG,UAAU,CAAC,CAAC,GAC5D,KAAK,GACP,KAAK,CAAC;AAIZ;;;;GAIG;AACH,wBAAgB,IAAI,CAAC,KAAK,CAAC,KAAK,SAAS,aAAa,CAAC,MAAM,CAAC,EAC5D,KAAK,EAAE,KAAK,GACX,oBAAoB,CAAC,KAAK,CAAC,CAAC;AAK/B;;;;;GAKG;AACH,eAAO,MAAM,SAAS,SACd,oBAAoB,mBACT,oBAAoB,KACpC,OAE6D,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { __exportAll } from "./_virtual/_rolldown/runtime.js";
2
+ import * as Brand from "effect/Brand";
3
+ //#region src/QueryStreamKeyLabels.ts
4
+ var QueryStreamKeyLabels_exports = /* @__PURE__ */ __exportAll({
5
+ hasPrefix: () => hasPrefix,
6
+ make: () => make
7
+ });
8
+ const LabelsBrand = Brand.nominal();
9
+ function make(names) {
10
+ return LabelsBrand(names);
11
+ }
12
+ /**
13
+ * Check whether the labels start with the given prefix, including order and
14
+ * multiplicity. The empty prefix always matches.
15
+ *
16
+ * @experimental
17
+ */
18
+ const hasPrefix = (self, prefixKeyLabels) => prefixKeyLabels.length <= self.length && prefixKeyLabels.every((label, index) => label === self[index]);
19
+ //#endregion
20
+ export { QueryStreamKeyLabels_exports, hasPrefix, make };
21
+
22
+ //# sourceMappingURL=QueryStreamKeyLabels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QueryStreamKeyLabels.js","names":[],"sources":["../src/QueryStreamKeyLabels.ts"],"sourcesContent":["import * as Brand from \"effect/Brand\";\n\n/**\n * Ordered names for the visible components of a stream's ordering key. Names\n * may repeat, and the sequence may be empty. They are aliases, not document\n * field paths; implicit ID positions have no visible label.\n *\n * @experimental\n */\nexport type QueryStreamKeyLabels<\n Names extends ReadonlyArray<string> = ReadonlyArray<string>,\n> = Readonly<Names> & Brand.Brand<\"@confect/server/QueryStreamKeyLabels\">;\n\n// Tuple operations must use the underlying names: spreading a branded tuple\n// directly can widen its fixed positions into an array of element unions.\n// Defer extraction and concatenation until both label types are known to avoid\n// expanding unresolved tuple types while checking generic stream operations.\n/**\n * @experimental\n */\nexport type Concat<\n LeftKeyLabels extends QueryStreamKeyLabels,\n RightKeyLabels extends QueryStreamKeyLabels,\n> =\n LeftKeyLabels extends QueryStreamKeyLabels<infer LeftNames>\n ? RightKeyLabels extends QueryStreamKeyLabels<infer RightNames>\n ? QueryStreamKeyLabels<readonly [...LeftNames, ...RightNames]>\n : never\n : never;\n\nconst LabelsBrand = Brand.nominal<QueryStreamKeyLabels>();\n\n/**\n * Mark a tuple of names as labels without changing its runtime representation.\n *\n * @experimental\n */\nexport function make<const Names extends ReadonlyArray<string>>(\n names: Names,\n): QueryStreamKeyLabels<Names>;\nexport function make(names: ReadonlyArray<string>): QueryStreamKeyLabels {\n return LabelsBrand(names);\n}\n\n/**\n * Check whether the labels start with the given prefix, including order and\n * multiplicity. The empty prefix always matches.\n *\n * @experimental\n */\nexport const hasPrefix = (\n self: QueryStreamKeyLabels,\n prefixKeyLabels: QueryStreamKeyLabels,\n): boolean =>\n prefixKeyLabels.length <= self.length &&\n prefixKeyLabels.every((label, index) => label === self[index]);\n"],"mappings":";;;;;;;AA8BA,MAAM,cAAc,MAAM,QAA8B;AAUxD,SAAgB,KAAK,OAAoD;CACvE,OAAO,YAAY,KAAK;AAC1B;;;;;;;AAQA,MAAa,aACX,MACA,oBAEA,gBAAgB,UAAU,KAAK,UAC/B,gBAAgB,OAAO,OAAO,UAAU,UAAU,KAAK,MAAM"}
@@ -0,0 +1,179 @@
1
+ import * as Data from "effect/Data";
2
+ import * as Equivalence_ from "effect/Equivalence";
3
+ import * as Result from "effect/Result";
4
+ import type * as Types from "effect/Types";
5
+ import * as QueryStreamKeyLabels from "./QueryStreamKeyLabels";
6
+ /**
7
+ * One runtime position of a stream key. Explicit IDs and their aliases are
8
+ * visible; implicit ID tiebreakers have no label. Empty keys have no
9
+ * positions.
10
+ *
11
+ * @experimental
12
+ */
13
+ export type Position = Data.TaggedEnum<{
14
+ Visible: {
15
+ readonly label: string;
16
+ };
17
+ ImplicitId: {};
18
+ }>;
19
+ declare const TypeId = "@confect/server/QueryStreamKeyLayout";
20
+ /**
21
+ * Describes the positions in a stream's keys: their sequence, their labels, and
22
+ * where implicit document-ID tiebreakers occur. Every element has its own key
23
+ * values; the stream has one shared layout.
24
+ *
25
+ * For example, labels `["text", "_creationTime"]` describe the labeled
26
+ * positions in a key such as `["apple", 1, "n1"]`. Its layout also records the
27
+ * final implicit ID position. Joined layouts retain each component's ID, so
28
+ * their labels alone do not describe every key position.
29
+ *
30
+ * Layouts are compatible when they have the same total width, labels in the
31
+ * same positions, and implicit-ID positions. Direction is separate. Layouts
32
+ * contain no key values, value-type schemas, table identity, or equality-pinned
33
+ * values. Labels start as index field paths but may be renamed. An explicit ID,
34
+ * such as in `by_id`, has a label.
35
+ *
36
+ * Reuse a stream's `keyLayout` with `empty` or `flatMap`'s `innerKeyLayout`.
37
+ * Creating a stream to obtain its layout does not read documents. The
38
+ * `KeyLabels` parameter tracks only labels; implicit-ID positions are checked
39
+ * at runtime. Normally this type is inferred from the source stream.
40
+ *
41
+ * @experimental
42
+ */
43
+ export interface QueryStreamKeyLayout<out KeyLabels extends QueryStreamKeyLabels.QueryStreamKeyLabels = QueryStreamKeyLabels.QueryStreamKeyLabels> {
44
+ readonly [TypeId]: {
45
+ readonly _Labels: Types.Covariant<KeyLabels>;
46
+ readonly positions: ReadonlyArray<Position>;
47
+ };
48
+ }
49
+ /**
50
+ * The runtime positions, including implicit ID tiebreakers.
51
+ *
52
+ * @experimental
53
+ */
54
+ export declare const positions: (self: QueryStreamKeyLayout) => ReadonlyArray<Position>;
55
+ /**
56
+ * The source field paths remaining after an equality prefix.
57
+ *
58
+ * @experimental
59
+ */
60
+ export type RemainingFieldPaths<FieldPaths extends ReadonlyArray<string>, Count extends number> = Count extends unknown ? DropPrefix<FieldPaths, Count> : never;
61
+ type DropPrefix<FieldPaths extends ReadonlyArray<string>, Count extends number, Prefix extends ReadonlyArray<unknown> = []> = number extends Count ? ReadonlyArray<string> : Prefix["length"] extends Count ? Types.Mutable<FieldPaths> : FieldPaths extends readonly [
62
+ string,
63
+ ...infer TailFieldPaths extends ReadonlyArray<string>
64
+ ] ? DropPrefix<TailFieldPaths, Count, readonly [...Prefix, unknown]> : FieldPaths extends readonly [] ? [] : ReadonlyArray<string>;
65
+ declare const InvalidEqualityPrefixError_base: new <A extends Record<string, any> = {}>(args: Types.VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
66
+ readonly _tag: "InvalidEqualityPrefixError";
67
+ } & Readonly<A>;
68
+ /**
69
+ * The equality prefix cannot select a whole number of source field paths.
70
+ *
71
+ * @experimental
72
+ */
73
+ export declare class InvalidEqualityPrefixError extends InvalidEqualityPrefixError_base<{
74
+ readonly fieldPaths: ReadonlyArray<string>;
75
+ readonly eqCount: number;
76
+ }> {
77
+ get message(): string;
78
+ }
79
+ declare const InvalidLabelPrefixError_base: new <A extends Record<string, any> = {}>(args: Types.VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
80
+ readonly _tag: "InvalidLabelPrefixError";
81
+ } & Readonly<A>;
82
+ /**
83
+ * The requested labels do not form a prefix of the layout's visible labels.
84
+ *
85
+ * @experimental
86
+ */
87
+ export declare class InvalidLabelPrefixError extends InvalidLabelPrefixError_base<{
88
+ readonly keyLabels: QueryStreamKeyLabels.QueryStreamKeyLabels;
89
+ readonly prefixKeyLabels: QueryStreamKeyLabels.QueryStreamKeyLabels;
90
+ }> {
91
+ get message(): string;
92
+ }
93
+ declare const LabelCountMismatchError_base: new <A extends Record<string, any> = {}>(args: Types.VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
94
+ readonly _tag: "LabelCountMismatchError";
95
+ } & Readonly<A>;
96
+ /**
97
+ * The replacement labels cannot fill exactly the layout's visible positions.
98
+ *
99
+ * @experimental
100
+ */
101
+ export declare class LabelCountMismatchError extends LabelCountMismatchError_base<{
102
+ readonly keyLabels: QueryStreamKeyLabels.QueryStreamKeyLabels;
103
+ readonly replacementKeyLabels: QueryStreamKeyLabels.QueryStreamKeyLabels;
104
+ }> {
105
+ get message(): string;
106
+ }
107
+ /**
108
+ * Construct a scan layout from the original index field paths, before equality
109
+ * pinning. Only an ID absent from the end of that original key is implicit.
110
+ * Pinning every field of `by_id` produces a zero-width layout; pinning every
111
+ * visible field of another index leaves its implicit ID. Invalid equality
112
+ * prefix lengths return `InvalidEqualityPrefixError`.
113
+ *
114
+ * @experimental
115
+ */
116
+ export declare function fromIndex<const FieldPaths extends ReadonlyArray<string>>(fieldPaths: FieldPaths): Result.Result<QueryStreamKeyLayout<QueryStreamKeyLabels.QueryStreamKeyLabels<FieldPaths>>, InvalidEqualityPrefixError>;
117
+ /**
118
+ * @experimental
119
+ */
120
+ export declare function fromIndex<const FieldPaths extends ReadonlyArray<string>, const Count extends number>(fieldPaths: FieldPaths, eqCount: Count): Result.Result<QueryStreamKeyLayout<QueryStreamKeyLabels.QueryStreamKeyLabels<RemainingFieldPaths<FieldPaths, Count>>>, InvalidEqualityPrefixError>;
121
+ /**
122
+ * Concatenate layouts without losing component tiebreakers.
123
+ *
124
+ * @experimental
125
+ */
126
+ export declare const concat: <LeftKeyLabels extends QueryStreamKeyLabels.QueryStreamKeyLabels, RightKeyLabels extends QueryStreamKeyLabels.QueryStreamKeyLabels>(self: QueryStreamKeyLayout<LeftKeyLabels>, that: QueryStreamKeyLayout<RightKeyLabels>) => QueryStreamKeyLayout<QueryStreamKeyLabels.Concat<LeftKeyLabels, RightKeyLabels>>;
127
+ /**
128
+ * Format visible labels and implicit IDs for diagnostics.
129
+ *
130
+ * @experimental
131
+ */
132
+ export declare const format: (self: QueryStreamKeyLayout) => string;
133
+ /**
134
+ * The labels available to `distinct` and `renameKey`.
135
+ *
136
+ * @experimental
137
+ */
138
+ export declare function visibleLabels<KeyLabels extends QueryStreamKeyLabels.QueryStreamKeyLabels>(self: QueryStreamKeyLayout<KeyLabels>): KeyLabels;
139
+ /**
140
+ * Number of positions in an element's runtime key.
141
+ *
142
+ * @experimental
143
+ */
144
+ export declare const runtimeWidth: (self: QueryStreamKeyLayout) => number;
145
+ /**
146
+ * @experimental
147
+ */
148
+ export declare const Equivalence: Equivalence_.Equivalence<QueryStreamKeyLayout>;
149
+ declare const KeyLayoutMismatchError_base: new <A extends Record<string, any> = {}>(args: Types.VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
150
+ readonly _tag: "KeyLayoutMismatchError";
151
+ } & Readonly<A>;
152
+ /**
153
+ * @experimental
154
+ */
155
+ export declare class KeyLayoutMismatchError extends KeyLayoutMismatchError_base<{
156
+ readonly expectedKeyLayout: QueryStreamKeyLayout;
157
+ readonly actualKeyLayout: QueryStreamKeyLayout;
158
+ }> {
159
+ get message(): string;
160
+ }
161
+ /**
162
+ * @experimental
163
+ */
164
+ export declare const validateEquivalence: (expectedKeyLayout: QueryStreamKeyLayout, actualKeyLayout: QueryStreamKeyLayout) => Result.Result<void, KeyLayoutMismatchError>;
165
+ /**
166
+ * Parse a visible label prefix and resolve its runtime width. Implicit IDs
167
+ * before the last selected label are included; implicit IDs after it are not.
168
+ *
169
+ * @experimental
170
+ */
171
+ export declare const resolvePrefix: (self: QueryStreamKeyLayout, prefixKeyLabels: QueryStreamKeyLabels.QueryStreamKeyLabels) => Result.Result<number, InvalidLabelPrefixError>;
172
+ /**
173
+ * Relabel visible positions, preserving every implicit ID.
174
+ *
175
+ * @experimental
176
+ */
177
+ export declare const rename: <ReplacementKeyLabels extends QueryStreamKeyLabels.QueryStreamKeyLabels>(self: QueryStreamKeyLayout, replacementKeyLabels: ReplacementKeyLabels) => Result.Result<QueryStreamKeyLayout<ReplacementKeyLabels>, LabelCountMismatchError>;
178
+ export {};
179
+ //# sourceMappingURL=QueryStreamKeyLayout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QueryStreamKeyLayout.d.ts","sourceRoot":"","sources":["../src/QueryStreamKeyLayout.ts"],"names":[],"mappings":"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"}