effect-app 4.0.0-beta.26 → 4.0.0-beta.261

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 (368) hide show
  1. package/CHANGELOG.md +1194 -0
  2. package/dist/Array.d.ts +3 -2
  3. package/dist/Array.d.ts.map +1 -1
  4. package/dist/Array.js +4 -4
  5. package/dist/Chunk.d.ts +1 -1
  6. package/dist/Chunk.d.ts.map +1 -1
  7. package/dist/Config/SecretURL.d.ts +4 -2
  8. package/dist/Config/SecretURL.d.ts.map +1 -1
  9. package/dist/Config/SecretURL.js +3 -6
  10. package/dist/Config/internal/configSecretURL.d.ts +1 -1
  11. package/dist/Config/internal/configSecretURL.d.ts.map +1 -1
  12. package/dist/Config/internal/configSecretURL.js +2 -2
  13. package/dist/Config.d.ts +7 -0
  14. package/dist/Config.d.ts.map +1 -0
  15. package/dist/Config.js +6 -0
  16. package/dist/ConfigProvider.d.ts +39 -0
  17. package/dist/ConfigProvider.d.ts.map +1 -0
  18. package/dist/ConfigProvider.js +42 -0
  19. package/dist/Context.d.ts +42 -0
  20. package/dist/Context.d.ts.map +1 -0
  21. package/dist/Context.js +67 -0
  22. package/dist/DataDependencies.d.ts +158 -0
  23. package/dist/DataDependencies.d.ts.map +1 -0
  24. package/dist/DataDependencies.js +39 -0
  25. package/dist/Effect.d.ts +13 -12
  26. package/dist/Effect.d.ts.map +1 -1
  27. package/dist/Effect.js +5 -8
  28. package/dist/Emailer.d.ts +51 -0
  29. package/dist/Emailer.d.ts.map +1 -0
  30. package/dist/Emailer.js +7 -0
  31. package/dist/Function.d.ts +1 -1
  32. package/dist/Function.d.ts.map +1 -1
  33. package/dist/Inputify.type.d.ts +1 -1
  34. package/dist/Layer.d.ts +11 -7
  35. package/dist/Layer.d.ts.map +1 -1
  36. package/dist/Layer.js +3 -2
  37. package/dist/Model/Repository/Registry.d.ts +21 -0
  38. package/dist/Model/Repository/Registry.d.ts.map +1 -0
  39. package/dist/Model/Repository/Registry.js +18 -0
  40. package/dist/Model/Repository/ext.d.ts +60 -0
  41. package/dist/Model/Repository/ext.d.ts.map +1 -0
  42. package/dist/Model/Repository/ext.js +122 -0
  43. package/dist/Model/Repository/internal/internal.d.ts +63 -0
  44. package/dist/Model/Repository/internal/internal.d.ts.map +1 -0
  45. package/dist/Model/Repository/internal/internal.js +430 -0
  46. package/dist/Model/Repository/legacy.d.ts +21 -0
  47. package/dist/Model/Repository/legacy.d.ts.map +1 -0
  48. package/dist/Model/Repository/legacy.js +2 -0
  49. package/dist/Model/Repository/makeRepo.d.ts +54 -0
  50. package/dist/Model/Repository/makeRepo.d.ts.map +1 -0
  51. package/dist/Model/Repository/makeRepo.js +27 -0
  52. package/dist/Model/Repository/service.d.ts +121 -0
  53. package/dist/Model/Repository/service.d.ts.map +1 -0
  54. package/dist/Model/Repository/service.js +2 -0
  55. package/dist/Model/Repository/validation.d.ts +58 -0
  56. package/dist/Model/Repository/validation.d.ts.map +1 -0
  57. package/dist/Model/Repository/validation.js +32 -0
  58. package/dist/Model/Repository.d.ts +7 -0
  59. package/dist/Model/Repository.d.ts.map +1 -0
  60. package/dist/Model/Repository.js +7 -0
  61. package/dist/Model/dsl.d.ts +33 -0
  62. package/dist/Model/dsl.d.ts.map +1 -0
  63. package/dist/Model/dsl.js +43 -0
  64. package/dist/Model/filter/filterApi.d.ts +30 -0
  65. package/dist/Model/filter/filterApi.d.ts.map +1 -0
  66. package/dist/Model/filter/filterApi.js +2 -0
  67. package/dist/Model/filter/types/errors.d.ts +29 -0
  68. package/dist/Model/filter/types/errors.d.ts.map +1 -0
  69. package/dist/Model/filter/types/errors.js +2 -0
  70. package/dist/Model/filter/types/fields.d.ts +15 -0
  71. package/dist/Model/filter/types/fields.d.ts.map +1 -0
  72. package/dist/Model/filter/types/fields.js +2 -0
  73. package/dist/Model/filter/types/path/common.d.ts +316 -0
  74. package/dist/Model/filter/types/path/common.d.ts.map +1 -0
  75. package/dist/Model/filter/types/path/common.js +2 -0
  76. package/dist/Model/filter/types/path/eager.d.ts +95 -0
  77. package/dist/Model/filter/types/path/eager.d.ts.map +1 -0
  78. package/dist/Model/filter/types/path/eager.js +31 -0
  79. package/dist/Model/filter/types/path/index.d.ts +4 -0
  80. package/dist/Model/filter/types/path/index.d.ts.map +1 -0
  81. package/dist/Model/filter/types/path/index.js +3 -0
  82. package/dist/Model/filter/types/utils.d.ts +79 -0
  83. package/dist/Model/filter/types/utils.d.ts.map +1 -0
  84. package/dist/Model/filter/types/utils.js +2 -0
  85. package/dist/Model/filter/types/validator.d.ts +30 -0
  86. package/dist/Model/filter/types/validator.d.ts.map +1 -0
  87. package/dist/Model/filter/types/validator.js +2 -0
  88. package/dist/Model/filter/types.d.ts +5 -0
  89. package/dist/Model/filter/types.d.ts.map +1 -0
  90. package/dist/Model/filter/types.js +7 -0
  91. package/dist/Model/query/dsl.d.ts +493 -0
  92. package/dist/Model/query/dsl.d.ts.map +1 -0
  93. package/dist/Model/query/dsl.js +376 -0
  94. package/dist/Model/query/new-kid-interpreter.d.ts +136 -0
  95. package/dist/Model/query/new-kid-interpreter.d.ts.map +1 -0
  96. package/dist/Model/query/new-kid-interpreter.js +336 -0
  97. package/dist/Model/query.d.ts +15 -0
  98. package/dist/Model/query.d.ts.map +1 -0
  99. package/dist/Model/query.js +3 -0
  100. package/dist/Model.d.ts +5 -0
  101. package/dist/Model.d.ts.map +1 -0
  102. package/dist/Model.js +5 -0
  103. package/dist/NonEmptySet.d.ts +4 -2
  104. package/dist/NonEmptySet.d.ts.map +1 -1
  105. package/dist/NonEmptySet.js +2 -2
  106. package/dist/Option.d.ts +2 -1
  107. package/dist/Option.d.ts.map +1 -1
  108. package/dist/Option.js +3 -1
  109. package/dist/Pure.d.ts +8 -6
  110. package/dist/Pure.d.ts.map +1 -1
  111. package/dist/Pure.js +17 -14
  112. package/dist/QueueMaker.d.ts +13 -0
  113. package/dist/QueueMaker.d.ts.map +1 -0
  114. package/dist/QueueMaker.js +4 -0
  115. package/dist/RequestContext.d.ts +91 -0
  116. package/dist/RequestContext.d.ts.map +1 -0
  117. package/dist/RequestContext.js +49 -0
  118. package/dist/Schema/Class.d.ts +66 -20
  119. package/dist/Schema/Class.d.ts.map +1 -1
  120. package/dist/Schema/Class.js +192 -27
  121. package/dist/Schema/FastCheck.d.ts +1 -1
  122. package/dist/Schema/FastCheck.d.ts.map +1 -1
  123. package/dist/Schema/Methods.d.ts +1 -1
  124. package/dist/Schema/SchemaParser.d.ts +5 -0
  125. package/dist/Schema/SchemaParser.d.ts.map +1 -0
  126. package/dist/Schema/SchemaParser.js +6 -0
  127. package/dist/Schema/SpecialJsonSchema.d.ts +34 -0
  128. package/dist/Schema/SpecialJsonSchema.d.ts.map +1 -0
  129. package/dist/Schema/SpecialJsonSchema.js +118 -0
  130. package/dist/Schema/SpecialOpenApi.d.ts +32 -0
  131. package/dist/Schema/SpecialOpenApi.d.ts.map +1 -0
  132. package/dist/Schema/SpecialOpenApi.js +123 -0
  133. package/dist/Schema/brand.d.ts +5 -3
  134. package/dist/Schema/brand.d.ts.map +1 -1
  135. package/dist/Schema/brand.js +3 -1
  136. package/dist/Schema/email.d.ts +1 -1
  137. package/dist/Schema/email.d.ts.map +1 -1
  138. package/dist/Schema/email.js +7 -4
  139. package/dist/Schema/ext.d.ts +339 -56
  140. package/dist/Schema/ext.d.ts.map +1 -1
  141. package/dist/Schema/ext.js +358 -53
  142. package/dist/Schema/moreStrings.d.ts +83 -37
  143. package/dist/Schema/moreStrings.d.ts.map +1 -1
  144. package/dist/Schema/moreStrings.js +49 -42
  145. package/dist/Schema/numbers.d.ts +35 -22
  146. package/dist/Schema/numbers.d.ts.map +1 -1
  147. package/dist/Schema/numbers.js +55 -12
  148. package/dist/Schema/phoneNumber.d.ts +1 -1
  149. package/dist/Schema/phoneNumber.d.ts.map +1 -1
  150. package/dist/Schema/phoneNumber.js +6 -3
  151. package/dist/Schema/schema.d.ts +1 -1
  152. package/dist/Schema/strings.d.ts +19 -5
  153. package/dist/Schema/strings.d.ts.map +1 -1
  154. package/dist/Schema/strings.js +1 -5
  155. package/dist/Schema.d.ts +214 -8
  156. package/dist/Schema.d.ts.map +1 -1
  157. package/dist/Schema.js +190 -11
  158. package/dist/Set.d.ts +5 -2
  159. package/dist/Set.d.ts.map +1 -1
  160. package/dist/Set.js +3 -2
  161. package/dist/Store.d.ts +170 -0
  162. package/dist/Store.d.ts.map +1 -0
  163. package/dist/Store.js +121 -0
  164. package/dist/TypeTest.d.ts +1 -1
  165. package/dist/Types.d.ts +1 -1
  166. package/dist/Widen.type.d.ts +1 -1
  167. package/dist/_ext/Array.d.ts +2 -2
  168. package/dist/_ext/Array.d.ts.map +1 -1
  169. package/dist/_ext/Array.js +4 -2
  170. package/dist/_ext/date.d.ts +1 -1
  171. package/dist/_ext/misc.d.ts +5 -2
  172. package/dist/_ext/misc.d.ts.map +1 -1
  173. package/dist/_ext/misc.js +4 -2
  174. package/dist/_ext/ord.ext.d.ts +3 -2
  175. package/dist/_ext/ord.ext.d.ts.map +1 -1
  176. package/dist/_ext/ord.ext.js +2 -2
  177. package/dist/builtin.d.ts +1 -1
  178. package/dist/builtin.d.ts.map +1 -1
  179. package/dist/client/InvalidationKeys.d.ts +29 -0
  180. package/dist/client/InvalidationKeys.d.ts.map +1 -0
  181. package/dist/client/InvalidationKeys.js +33 -0
  182. package/dist/client/apiClientFactory.d.ts +20 -32
  183. package/dist/client/apiClientFactory.d.ts.map +1 -1
  184. package/dist/client/apiClientFactory.js +104 -34
  185. package/dist/client/clientFor.d.ts +53 -19
  186. package/dist/client/clientFor.d.ts.map +1 -1
  187. package/dist/client/clientFor.js +9 -1
  188. package/dist/client/errors.d.ts +49 -25
  189. package/dist/client/errors.d.ts.map +1 -1
  190. package/dist/client/errors.js +43 -17
  191. package/dist/client/makeClient.d.ts +495 -33
  192. package/dist/client/makeClient.d.ts.map +1 -1
  193. package/dist/client/makeClient.js +66 -24
  194. package/dist/client.d.ts +6 -5
  195. package/dist/client.d.ts.map +1 -1
  196. package/dist/client.js +2 -1
  197. package/dist/faker.d.ts +1 -1
  198. package/dist/faker.d.ts.map +1 -1
  199. package/dist/http/Request.d.ts +2 -2
  200. package/dist/http/Request.d.ts.map +1 -1
  201. package/dist/http/Request.js +2 -2
  202. package/dist/http/internal/lib.d.ts +1 -1
  203. package/dist/http.d.ts +1 -1
  204. package/dist/ids.d.ts +43 -15
  205. package/dist/ids.d.ts.map +1 -1
  206. package/dist/ids.js +30 -5
  207. package/dist/index.d.ts +7 -8
  208. package/dist/index.d.ts.map +1 -1
  209. package/dist/index.js +8 -8
  210. package/dist/logger.d.ts +1 -1
  211. package/dist/middleware.d.ts +14 -8
  212. package/dist/middleware.d.ts.map +1 -1
  213. package/dist/middleware.js +14 -8
  214. package/dist/rpc/Invalidation.d.ts +420 -0
  215. package/dist/rpc/Invalidation.d.ts.map +1 -0
  216. package/dist/rpc/Invalidation.js +168 -0
  217. package/dist/rpc/MiddlewareMaker.d.ts +12 -8
  218. package/dist/rpc/MiddlewareMaker.d.ts.map +1 -1
  219. package/dist/rpc/MiddlewareMaker.js +59 -38
  220. package/dist/rpc/RpcContextMap.d.ts +4 -4
  221. package/dist/rpc/RpcContextMap.d.ts.map +1 -1
  222. package/dist/rpc/RpcContextMap.js +4 -4
  223. package/dist/rpc/RpcMiddleware.d.ts +15 -11
  224. package/dist/rpc/RpcMiddleware.d.ts.map +1 -1
  225. package/dist/rpc/RpcMiddleware.js +1 -1
  226. package/dist/rpc.d.ts +2 -2
  227. package/dist/rpc.d.ts.map +1 -1
  228. package/dist/rpc.js +2 -2
  229. package/dist/runtime.d.ts +19 -0
  230. package/dist/runtime.d.ts.map +1 -0
  231. package/dist/runtime.js +40 -0
  232. package/dist/setupRequest.d.ts +19 -0
  233. package/dist/setupRequest.d.ts.map +1 -0
  234. package/dist/setupRequest.js +69 -0
  235. package/dist/toast.d.ts +51 -0
  236. package/dist/toast.d.ts.map +1 -0
  237. package/dist/toast.js +34 -0
  238. package/dist/transform.d.ts +2 -2
  239. package/dist/transform.d.ts.map +1 -1
  240. package/dist/transform.js +4 -5
  241. package/dist/utils/effectify.d.ts +2 -2
  242. package/dist/utils/effectify.d.ts.map +1 -1
  243. package/dist/utils/effectify.js +2 -2
  244. package/dist/utils/extend.d.ts +1 -1
  245. package/dist/utils/extend.d.ts.map +1 -1
  246. package/dist/utils/gen.d.ts +5 -5
  247. package/dist/utils/gen.d.ts.map +1 -1
  248. package/dist/utils/logLevel.d.ts +3 -3
  249. package/dist/utils/logLevel.d.ts.map +1 -1
  250. package/dist/utils/logger.d.ts +5 -4
  251. package/dist/utils/logger.d.ts.map +1 -1
  252. package/dist/utils/logger.js +4 -4
  253. package/dist/utils.d.ts +40 -45
  254. package/dist/utils.d.ts.map +1 -1
  255. package/dist/utils.js +19 -27
  256. package/dist/validation/validators.d.ts +1 -1
  257. package/dist/validation/validators.d.ts.map +1 -1
  258. package/dist/validation.d.ts +1 -1
  259. package/dist/validation.d.ts.map +1 -1
  260. package/dist/withToast.d.ts +30 -0
  261. package/dist/withToast.d.ts.map +1 -0
  262. package/dist/withToast.js +64 -0
  263. package/package.json +20 -245
  264. package/src/Array.ts +3 -3
  265. package/src/Config/SecretURL.ts +5 -2
  266. package/src/Config/internal/configSecretURL.ts +1 -1
  267. package/src/Config.ts +14 -0
  268. package/src/ConfigProvider.ts +48 -0
  269. package/src/{ServiceMap.ts → Context.ts} +56 -63
  270. package/src/Effect.ts +12 -14
  271. package/src/Emailer.ts +51 -0
  272. package/src/Layer.ts +10 -6
  273. package/src/Model/Repository/Registry.ts +34 -0
  274. package/src/Model/Repository/ext.ts +375 -0
  275. package/src/Model/Repository/internal/internal.ts +741 -0
  276. package/src/Model/Repository/legacy.ts +29 -0
  277. package/src/Model/Repository/makeRepo.ts +145 -0
  278. package/src/Model/Repository/service.ts +666 -0
  279. package/src/Model/Repository/validation.ts +31 -0
  280. package/src/Model/Repository.ts +6 -0
  281. package/src/Model/dsl.ts +129 -0
  282. package/src/Model/filter/filterApi.ts +60 -0
  283. package/src/Model/filter/types/errors.ts +47 -0
  284. package/src/Model/filter/types/fields.ts +50 -0
  285. package/src/Model/filter/types/path/common.ts +404 -0
  286. package/src/Model/filter/types/path/eager.ts +297 -0
  287. package/src/Model/filter/types/path/index.ts +4 -0
  288. package/src/Model/filter/types/utils.ts +128 -0
  289. package/src/Model/filter/types/validator.ts +46 -0
  290. package/src/Model/filter/types.ts +6 -0
  291. package/src/Model/query/dsl.ts +2694 -0
  292. package/src/Model/query/new-kid-interpreter.ts +484 -0
  293. package/src/Model/query.ts +13 -0
  294. package/src/Model.ts +4 -0
  295. package/src/NonEmptySet.ts +3 -1
  296. package/src/Option.ts +2 -0
  297. package/src/Pure.ts +21 -19
  298. package/src/QueueMaker.ts +19 -0
  299. package/src/RequestContext.ts +62 -0
  300. package/src/Schema/Class.ts +274 -68
  301. package/src/Schema/SchemaParser.ts +12 -0
  302. package/src/Schema/SpecialJsonSchema.ts +139 -0
  303. package/src/Schema/SpecialOpenApi.ts +130 -0
  304. package/src/Schema/brand.ts +22 -2
  305. package/src/Schema/email.ts +7 -2
  306. package/src/Schema/ext.ts +443 -88
  307. package/src/Schema/moreStrings.ts +146 -67
  308. package/src/Schema/numbers.ts +96 -27
  309. package/src/Schema/phoneNumber.ts +5 -1
  310. package/src/Schema/strings.ts +22 -13
  311. package/src/Schema.ts +374 -10
  312. package/src/Set.ts +5 -1
  313. package/src/Store.ts +277 -0
  314. package/src/_ext/Array.ts +3 -1
  315. package/src/_ext/misc.ts +4 -1
  316. package/src/_ext/ord.ext.ts +2 -1
  317. package/src/client/InvalidationKeys.ts +50 -0
  318. package/src/client/apiClientFactory.ts +230 -131
  319. package/src/client/clientFor.ts +102 -31
  320. package/src/client/errors.ts +52 -26
  321. package/src/client/makeClient.ts +592 -71
  322. package/src/client.ts +5 -4
  323. package/src/http/Request.ts +1 -1
  324. package/src/ids.ts +32 -5
  325. package/src/index.ts +7 -10
  326. package/src/middleware.ts +13 -9
  327. package/src/rpc/Invalidation.ts +261 -0
  328. package/src/rpc/MiddlewareMaker.ts +83 -75
  329. package/src/rpc/README.md +2 -2
  330. package/src/rpc/RpcContextMap.ts +6 -5
  331. package/src/rpc/RpcMiddleware.ts +18 -12
  332. package/src/rpc.ts +1 -1
  333. package/src/runtime.ts +56 -0
  334. package/src/setupRequest.ts +134 -0
  335. package/src/toast.ts +54 -0
  336. package/src/transform.ts +3 -3
  337. package/src/utils/effectify.ts +1 -1
  338. package/src/utils/gen.ts +8 -8
  339. package/src/utils/logLevel.ts +1 -1
  340. package/src/utils/logger.ts +4 -3
  341. package/src/utils.ts +62 -139
  342. package/src/withToast.ts +133 -0
  343. package/test/dist/rpc-dynamic-middleware.test.d.ts.map +1 -0
  344. package/test/dist/rpc.test.d.ts.map +1 -1
  345. package/test/dist/secretURL.test.d.ts.map +1 -0
  346. package/test/dist/special.test.d.ts.map +1 -0
  347. package/test/dist/stream-error.types.d.ts +2 -0
  348. package/test/dist/stream-error.types.d.ts.map +1 -0
  349. package/test/dist/stream-error.types.js +27 -0
  350. package/test/moreStrings.test.ts +1 -1
  351. package/test/rpc.test.ts +46 -6
  352. package/test/schema.test.ts +459 -30
  353. package/test/secretURL.test.ts +160 -0
  354. package/test/special.test.ts +1026 -0
  355. package/test/utils.test.ts +7 -7
  356. package/tsconfig.base.json +6 -5
  357. package/tsconfig.json +2 -1
  358. package/tsconfig.json.bak +2 -2
  359. package/tsconfig.src.json +29 -29
  360. package/tsconfig.test.json +2 -2
  361. package/dist/Operations.d.ts +0 -123
  362. package/dist/Operations.d.ts.map +0 -1
  363. package/dist/Operations.js +0 -29
  364. package/dist/ServiceMap.d.ts +0 -44
  365. package/dist/ServiceMap.d.ts.map +0 -1
  366. package/dist/ServiceMap.js +0 -91
  367. package/eslint.config.mjs +0 -26
  368. package/src/Operations.ts +0 -55
@@ -0,0 +1,666 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import type * as Scope from "effect/Scope"
3
+ import type { InvalidStateError, NotFoundError, OptimisticConcurrencyException } from "../../client/errors.js"
4
+ import type * as Effect from "../../Effect.js"
5
+ import type * as Option from "../../Option.js"
6
+ import type * as S from "../../Schema.js"
7
+ import type { NonNegativeInt } from "../../Schema/numbers.js"
8
+ import type { FieldValues, IsNever, ResolveFirstLevel } from "../filter/types.js"
9
+ import type { QAll, Query, QueryProjection, RawQuery } from "../query.js"
10
+ import type { Mapped } from "./legacy.js"
11
+ import type { ValidationResult } from "./validation.js"
12
+
13
+ /**
14
+ * Event emitted by a repository's ChangeFeed.
15
+ *
16
+ * Tuple shape: `[items, op, namespace]` — `namespace` is the `storeId`
17
+ * context value at publish time (defaults to `"primary"`).
18
+ */
19
+ export type ChangeFeedEvent<T> = readonly [items: T[], op: "save" | "remove", namespace: string]
20
+
21
+ /**
22
+ * Synchronous broadcast channel for repository change events.
23
+ *
24
+ * `publish` only completes after every matching handler's Effect has
25
+ * finished — callers must await all handlers before continuing. Subscribers
26
+ * can target a single namespace via `options.namespace`, or omit it to
27
+ * receive events from every namespace (wildcard).
28
+ *
29
+ * Handlers are auto-removed when the subscriber's Scope closes; the full
30
+ * handler set is cleared when the repository's own scope closes.
31
+ */
32
+ export interface ChangeFeed<T> {
33
+ readonly publish: (evt: [T[], "save" | "remove"]) => Effect.Effect<void>
34
+ readonly subscribe: (
35
+ handler: (evt: ChangeFeedEvent<T>) => Effect.Effect<void>,
36
+ options?: { readonly namespace?: string }
37
+ ) => Effect.Effect<void, never, Scope.Scope>
38
+ }
39
+
40
+ export interface Repository<
41
+ T,
42
+ Encoded extends FieldValues,
43
+ Evt,
44
+ ItemType extends string,
45
+ IdKey extends keyof T,
46
+ RSchema,
47
+ RPublish,
48
+ RProvided = never
49
+ > {
50
+ readonly itemType: ItemType
51
+ readonly idKey: IdKey
52
+ readonly find: (id: T[IdKey]) => Effect.Effect<Option.Option<T>, never, RSchema>
53
+ readonly all: Effect.Effect<T[], never, RSchema>
54
+ readonly saveAndPublish: (
55
+ items: Iterable<T>,
56
+ events?: Iterable<Evt>
57
+ ) => Effect.Effect<void, InvalidStateError | OptimisticConcurrencyException, RSchema | RPublish>
58
+ readonly changeFeed: ChangeFeed<T>
59
+ readonly removeAndPublish: (
60
+ items: Iterable<T>,
61
+ events?: Iterable<Evt>
62
+ ) => Effect.Effect<void, never, RSchema | RPublish>
63
+
64
+ readonly removeById: (
65
+ idOrIds: T[IdKey] | ReadonlyArray<T[IdKey]>
66
+ ) => Effect.Effect<void, never, RSchema>
67
+
68
+ readonly queryRaw: <T, Out, R>(
69
+ schema: S.Codec<T, Out, R>,
70
+ raw: RawQuery<Encoded, Out>
71
+ ) => Effect.Effect<readonly T[], S.SchemaError, R>
72
+
73
+ /**
74
+ * Explicitly seed a namespace. Primary is seeded eagerly on initialization.
75
+ * Non-primary namespaces must be seeded explicitly before use.
76
+ */
77
+ readonly seedNamespace: (namespace: string) => Effect.Effect<void>
78
+
79
+ readonly query: {
80
+ // ending with projection
81
+ <
82
+ A,
83
+ R,
84
+ From extends FieldValues,
85
+ TType extends "one" | "many" | "count" = "many",
86
+ E extends boolean = false
87
+ >(
88
+ q: (
89
+ initial: Query<Encoded>
90
+ ) => QueryProjection<From extends Encoded ? From : never, A, R, TType, E>
91
+ ): Effect.Effect<
92
+ TType extends "many" ? readonly A[] : TType extends "count" ? NonNegativeInt : A,
93
+ | (TType extends "many" ? never : NotFoundError<ItemType>)
94
+ | (TType extends "count" ? never : S.SchemaError),
95
+ Exclude<R, RProvided> | RSchema
96
+ >
97
+ <
98
+ A,
99
+ R,
100
+ From extends FieldValues,
101
+ TType extends "one" | "many" | "count" = "many",
102
+ $A = never,
103
+ E extends boolean = false
104
+ >(
105
+ q1: (
106
+ initial: Query<Encoded>
107
+ ) => $A,
108
+ q2: (
109
+ _: $A
110
+ ) => QueryProjection<From extends Encoded ? From : never, A, R, TType, E>
111
+ ): Effect.Effect<
112
+ TType extends "many" ? readonly A[] : TType extends "count" ? NonNegativeInt : A,
113
+ | (TType extends "many" ? never : NotFoundError<ItemType>)
114
+ | (TType extends "count" ? never : S.SchemaError),
115
+ Exclude<R, RProvided> | RSchema
116
+ >
117
+ <
118
+ A,
119
+ R,
120
+ From extends FieldValues,
121
+ TType extends "one" | "many" | "count" = "many",
122
+ $A = never,
123
+ $B = never,
124
+ E extends boolean = false
125
+ >(
126
+ q1: (
127
+ initial: Query<Encoded>
128
+ ) => $A,
129
+ q2: (_: $A) => $B,
130
+ q3: (
131
+ _: $B
132
+ ) => QueryProjection<From extends Encoded ? From : never, A, R, TType, E>
133
+ ): Effect.Effect<
134
+ TType extends "many" ? readonly A[] : TType extends "count" ? NonNegativeInt : A,
135
+ | (TType extends "many" ? never : NotFoundError<ItemType>)
136
+ | (TType extends "count" ? never : S.SchemaError),
137
+ Exclude<R, RProvided> | RSchema
138
+ >
139
+ <
140
+ A,
141
+ R,
142
+ From extends FieldValues,
143
+ TType extends "one" | "many" | "count" = "many",
144
+ $A = never,
145
+ $B = never,
146
+ $C = never,
147
+ E extends boolean = false
148
+ >(
149
+ q1: (
150
+ initial: Query<Encoded>
151
+ ) => $A,
152
+ q2: (_: $A) => $B,
153
+ q3: (_: $B) => $C,
154
+ q4: (
155
+ _: $C
156
+ ) => QueryProjection<From extends Encoded ? From : never, A, R, TType, E>
157
+ ): Effect.Effect<
158
+ TType extends "many" ? readonly A[] : TType extends "count" ? NonNegativeInt : A,
159
+ | (TType extends "many" ? never : NotFoundError<ItemType>)
160
+ | (TType extends "count" ? never : S.SchemaError),
161
+ Exclude<R, RProvided> | RSchema
162
+ >
163
+ <
164
+ A,
165
+ R,
166
+ From extends FieldValues,
167
+ TType extends "one" | "many" | "count" = "many",
168
+ $A = never,
169
+ $B = never,
170
+ $C = never,
171
+ $D = never,
172
+ E extends boolean = false
173
+ >(
174
+ q1: (
175
+ initial: Query<Encoded>
176
+ ) => $A,
177
+ q2: (_: $A) => $B,
178
+ q3: (_: $B) => $C,
179
+ q4: (_: $C) => $D,
180
+ q5: (
181
+ _: $D
182
+ ) => QueryProjection<From extends Encoded ? From : never, A, R, TType, E>
183
+ ): Effect.Effect<
184
+ TType extends "many" ? readonly A[] : TType extends "count" ? NonNegativeInt : A,
185
+ | (TType extends "many" ? never : NotFoundError<ItemType>)
186
+ | (TType extends "count" ? never : S.SchemaError),
187
+ Exclude<R, RProvided> | RSchema
188
+ >
189
+ <
190
+ A,
191
+ R,
192
+ From extends FieldValues,
193
+ TType extends "one" | "many" | "count" = "many",
194
+ $A = never,
195
+ $B = never,
196
+ $C = never,
197
+ $D = never,
198
+ $E = never,
199
+ E extends boolean = false
200
+ >(
201
+ q1: (
202
+ initial: Query<Encoded>
203
+ ) => $A,
204
+ q2: (_: $A) => $B,
205
+ q3: (_: $B) => $C,
206
+ q4: (_: $C) => $D,
207
+ q5: (_: $D) => $E,
208
+ q6: (_: $E) => QueryProjection<From extends Encoded ? From : never, A, R, TType, E>
209
+ ): Effect.Effect<
210
+ TType extends "many" ? readonly A[] : TType extends "count" ? NonNegativeInt : A,
211
+ | (TType extends "many" ? never : NotFoundError<ItemType>)
212
+ | (TType extends "count" ? never : S.SchemaError),
213
+ Exclude<R, RProvided> | RSchema
214
+ >
215
+ <
216
+ A,
217
+ R,
218
+ From extends FieldValues,
219
+ TType extends "one" | "many" | "count" = "many",
220
+ $A = never,
221
+ $B = never,
222
+ $C = never,
223
+ $D = never,
224
+ $E = never,
225
+ $F = never,
226
+ E extends boolean = false
227
+ >(
228
+ q1: (
229
+ initial: Query<Encoded>
230
+ ) => $A,
231
+ q2: (_: $A) => $B,
232
+ q3: (_: $B) => $C,
233
+ q4: (_: $C) => $D,
234
+ q5: (_: $D) => $E,
235
+ q6: (_: $E) => $F,
236
+ q7: (_: $F) => QueryProjection<From extends Encoded ? From : never, A, R, TType, E>
237
+ ): Effect.Effect<
238
+ TType extends "many" ? readonly A[] : TType extends "count" ? NonNegativeInt : A,
239
+ | (TType extends "many" ? never : NotFoundError<ItemType>)
240
+ | (TType extends "count" ? never : S.SchemaError),
241
+ Exclude<R, RProvided> | RSchema
242
+ >
243
+ <
244
+ A,
245
+ R,
246
+ From extends FieldValues,
247
+ TType extends "one" | "many" | "count" = "many",
248
+ $A = never,
249
+ $B = never,
250
+ $C = never,
251
+ $D = never,
252
+ $E = never,
253
+ $F = never,
254
+ $G = never,
255
+ E extends boolean = false
256
+ >(
257
+ q1: (
258
+ initial: Query<Encoded>
259
+ ) => $A,
260
+ q2: (_: $A) => $B,
261
+ q3: (_: $B) => $C,
262
+ q4: (_: $C) => $D,
263
+ q5: (_: $D) => $E,
264
+ q6: (_: $E) => $F,
265
+ q7: (_: $F) => $G,
266
+ q8: (_: $G) => QueryProjection<From extends Encoded ? From : never, A, R, TType, E>
267
+ ): Effect.Effect<
268
+ TType extends "many" ? readonly A[] : TType extends "count" ? NonNegativeInt : A,
269
+ | (TType extends "many" ? never : NotFoundError<ItemType>)
270
+ | (TType extends "count" ? never : S.SchemaError),
271
+ Exclude<R, RProvided> | RSchema
272
+ >
273
+ <
274
+ A,
275
+ R,
276
+ From extends FieldValues,
277
+ TType extends "one" | "many" | "count" = "many",
278
+ $A = never,
279
+ $B = never,
280
+ $C = never,
281
+ $D = never,
282
+ $E = never,
283
+ $F = never,
284
+ $G = never,
285
+ $H = never,
286
+ E extends boolean = false
287
+ >(
288
+ q1: (
289
+ initial: Query<Encoded>
290
+ ) => $A,
291
+ q2: (_: $A) => $B,
292
+ q3: (_: $B) => $C,
293
+ q4: (_: $C) => $D,
294
+ q5: (_: $D) => $E,
295
+ q6: (_: $E) => $F,
296
+ q7: (_: $F) => $G,
297
+ q8: (_: $G) => $H,
298
+ q9: (_: $H) => QueryProjection<From extends Encoded ? From : never, A, R, TType, E>
299
+ ): Effect.Effect<
300
+ TType extends "many" ? readonly A[] : TType extends "count" ? NonNegativeInt : A,
301
+ | (TType extends "many" ? never : NotFoundError<ItemType>)
302
+ | (TType extends "count" ? never : S.SchemaError),
303
+ Exclude<R, RProvided> | RSchema
304
+ >
305
+ <
306
+ A,
307
+ R,
308
+ From extends FieldValues,
309
+ TType extends "one" | "many" | "count" = "many",
310
+ $A = never,
311
+ $B = never,
312
+ $C = never,
313
+ $D = never,
314
+ $E = never,
315
+ $F = never,
316
+ $G = never,
317
+ $H = never,
318
+ $I = never,
319
+ E extends boolean = false
320
+ >(
321
+ q1: (
322
+ initial: Query<Encoded>
323
+ ) => $A,
324
+ q2: (_: $A) => $B,
325
+ q3: (_: $B) => $C,
326
+ q4: (_: $C) => $D,
327
+ q5: (_: $D) => $E,
328
+ q6: (_: $E) => $F,
329
+ q7: (_: $F) => $G,
330
+ q8: (_: $G) => $H,
331
+ q9: (_: $H) => $I,
332
+ q10: (_: $I) => QueryProjection<From extends Encoded ? From : never, A, R, TType, E>
333
+ ): Effect.Effect<
334
+ TType extends "many" ? readonly A[] : TType extends "count" ? NonNegativeInt : A,
335
+ | (TType extends "many" ? never : NotFoundError<ItemType>)
336
+ | (TType extends "count" ? never : S.SchemaError),
337
+ Exclude<R, RProvided> | RSchema
338
+ >
339
+
340
+ // ending with generic query
341
+ <
342
+ R = never,
343
+ TType extends "one" | "many" = "many",
344
+ EncodedRefined extends Encoded = Encoded,
345
+ E extends boolean = false
346
+ >(
347
+ q: (initial: Query<Encoded>) => QAll<Encoded, EncodedRefined, RefineTHelper<T, EncodedRefined>, R, TType, E>
348
+ ): Effect.Effect<
349
+ TType extends "many" ? DistributeQueryIfExclusiveOnArray<E, T, EncodedRefined> : RefineTHelper<T, EncodedRefined>,
350
+ TType extends "many" ? never : NotFoundError<ItemType>,
351
+ Exclude<R, RProvided> | RSchema
352
+ >
353
+ <
354
+ R = never,
355
+ TType extends "one" | "many" = "many",
356
+ EncodedRefined extends Encoded = Encoded,
357
+ $A = never,
358
+ E extends boolean = false
359
+ >(
360
+ q1: (initial: Query<Encoded>) => $A,
361
+ q2: (
362
+ _: $A
363
+ ) => QAll<Encoded, EncodedRefined, RefineTHelper<T, EncodedRefined>, R, TType, E>
364
+ ): Effect.Effect<
365
+ TType extends "many" ? DistributeQueryIfExclusiveOnArray<E, T, EncodedRefined> : RefineTHelper<T, EncodedRefined>,
366
+ TType extends "many" ? never : NotFoundError<ItemType>,
367
+ Exclude<R, RProvided> | RSchema
368
+ >
369
+ <
370
+ R = never,
371
+ TType extends "one" | "many" = "many",
372
+ EncodedRefined extends Encoded = Encoded,
373
+ $A = never,
374
+ $B = never,
375
+ E extends boolean = false
376
+ >(
377
+ q1: (initial: Query<Encoded>) => $A,
378
+ q2: (
379
+ _: $A
380
+ ) => $B,
381
+ q3: (
382
+ _: $B
383
+ ) => QAll<Encoded, EncodedRefined, RefineTHelper<T, EncodedRefined>, R, TType, E>
384
+ ): Effect.Effect<
385
+ TType extends "many" ? DistributeQueryIfExclusiveOnArray<E, T, EncodedRefined> : RefineTHelper<T, EncodedRefined>,
386
+ TType extends "many" ? never : NotFoundError<ItemType>,
387
+ Exclude<R, RProvided> | RSchema
388
+ >
389
+ <
390
+ R = never,
391
+ TType extends "one" | "many" = "many",
392
+ EncodedRefined extends Encoded = Encoded,
393
+ $A = never,
394
+ $B = never,
395
+ $C = never,
396
+ E extends boolean = false
397
+ >(
398
+ q1: (initial: Query<Encoded>) => $A,
399
+ q2: (_: $A) => $B,
400
+ q3: (_: $B) => $C,
401
+ q4: (
402
+ _: $C
403
+ ) => QAll<Encoded, EncodedRefined, RefineTHelper<T, EncodedRefined>, R, TType, E>
404
+ ): Effect.Effect<
405
+ TType extends "many" ? DistributeQueryIfExclusiveOnArray<E, T, EncodedRefined> : RefineTHelper<T, EncodedRefined>,
406
+ TType extends "many" ? never : NotFoundError<ItemType>,
407
+ Exclude<R, RProvided> | RSchema
408
+ >
409
+ <
410
+ R = never,
411
+ TType extends "one" | "many" = "many",
412
+ EncodedRefined extends Encoded = Encoded,
413
+ $A = never,
414
+ $B = never,
415
+ $C = never,
416
+ $D = never,
417
+ E extends boolean = false
418
+ >(
419
+ q1: (initial: Query<Encoded>) => $A,
420
+ q2: (_: $A) => $B,
421
+ q3: (_: $B) => $C,
422
+ q4: (_: $C) => $D,
423
+ q5: (
424
+ _: $D
425
+ ) => QAll<Encoded, EncodedRefined, RefineTHelper<T, EncodedRefined>, R, TType, E>
426
+ ): Effect.Effect<
427
+ TType extends "many" ? DistributeQueryIfExclusiveOnArray<E, T, EncodedRefined> : RefineTHelper<T, EncodedRefined>,
428
+ TType extends "many" ? never : NotFoundError<ItemType>,
429
+ Exclude<R, RProvided> | RSchema
430
+ >
431
+ <
432
+ R = never,
433
+ TType extends "one" | "many" = "many",
434
+ EncodedRefined extends Encoded = Encoded,
435
+ $A = never,
436
+ $B = never,
437
+ $C = never,
438
+ $D = never,
439
+ $E = never,
440
+ E extends boolean = false
441
+ >(
442
+ q1: (initial: Query<Encoded>) => $A,
443
+ q2: (_: $A) => $B,
444
+ q3: (_: $B) => $C,
445
+ q4: (_: $C) => $D,
446
+ q5: (_: $D) => $E,
447
+ q6: (
448
+ _: $E
449
+ ) => QAll<Encoded, EncodedRefined, RefineTHelper<T, EncodedRefined>, R, TType, E>
450
+ ): Effect.Effect<
451
+ TType extends "many" ? DistributeQueryIfExclusiveOnArray<E, T, EncodedRefined> : RefineTHelper<T, EncodedRefined>,
452
+ TType extends "many" ? never : NotFoundError<ItemType>,
453
+ Exclude<R, RProvided> | RSchema
454
+ >
455
+ <
456
+ R = never,
457
+ TType extends "one" | "many" = "many",
458
+ EncodedRefined extends Encoded = Encoded,
459
+ $A = never,
460
+ $B = never,
461
+ $C = never,
462
+ $D = never,
463
+ $E = never,
464
+ $F = never,
465
+ E extends boolean = false
466
+ >(
467
+ q1: (initial: Query<Encoded>) => $A,
468
+ q2: (_: $A) => $B,
469
+ q3: (_: $B) => $C,
470
+ q4: (_: $C) => $D,
471
+ q5: (_: $D) => $E,
472
+ q6: (_: $E) => $F,
473
+ q7: (
474
+ _: $F
475
+ ) => QAll<Encoded, EncodedRefined, RefineTHelper<T, EncodedRefined>, R, TType, E>
476
+ ): Effect.Effect<
477
+ TType extends "many" ? DistributeQueryIfExclusiveOnArray<E, T, EncodedRefined> : RefineTHelper<T, EncodedRefined>,
478
+ TType extends "many" ? never : NotFoundError<ItemType>,
479
+ Exclude<R, RProvided> | RSchema
480
+ >
481
+ <
482
+ R = never,
483
+ TType extends "one" | "many" = "many",
484
+ EncodedRefined extends Encoded = Encoded,
485
+ $A = never,
486
+ $B = never,
487
+ $C = never,
488
+ $D = never,
489
+ $E = never,
490
+ $F = never,
491
+ $G = never,
492
+ E extends boolean = false
493
+ >(
494
+ q1: (initial: Query<Encoded>) => $A,
495
+ q2: (_: $A) => $B,
496
+ q3: (_: $B) => $C,
497
+ q4: (_: $C) => $D,
498
+ q5: (_: $D) => $E,
499
+ q6: (_: $E) => $F,
500
+ q7: (_: $F) => $G,
501
+ q8: (
502
+ _: $G
503
+ ) => QAll<Encoded, EncodedRefined, RefineTHelper<T, EncodedRefined>, R, TType, E>
504
+ ): Effect.Effect<
505
+ TType extends "many" ? DistributeQueryIfExclusiveOnArray<E, T, EncodedRefined>
506
+ : RefineTHelper<T, EncodedRefined>,
507
+ TType extends "many" ? never : NotFoundError<ItemType>,
508
+ Exclude<R, RProvided> | RSchema
509
+ >
510
+ <
511
+ R = never,
512
+ TType extends "one" | "many" = "many",
513
+ EncodedRefined extends Encoded = Encoded,
514
+ $A = never,
515
+ $B = never,
516
+ $C = never,
517
+ $D = never,
518
+ $E = never,
519
+ $F = never,
520
+ $G = never,
521
+ $H = never,
522
+ E extends boolean = false
523
+ >(
524
+ q1: (initial: Query<Encoded>) => $A,
525
+ q2: (_: $A) => $B,
526
+ q3: (_: $B) => $C,
527
+ q4: (_: $C) => $D,
528
+ q5: (_: $D) => $E,
529
+ q6: (_: $E) => $F,
530
+ q7: (_: $F) => $G,
531
+ q8: (_: $G) => $H,
532
+ q9: (
533
+ _: $H
534
+ ) => QAll<Encoded, EncodedRefined, RefineTHelper<T, EncodedRefined>, R, TType, E>
535
+ ): Effect.Effect<
536
+ TType extends "many" ? DistributeQueryIfExclusiveOnArray<E, T, EncodedRefined>
537
+ : RefineTHelper<T, EncodedRefined>,
538
+ TType extends "many" ? never : NotFoundError<ItemType>,
539
+ Exclude<R, RProvided> | RSchema
540
+ >
541
+ <
542
+ R = never,
543
+ TType extends "one" | "many" = "many",
544
+ EncodedRefined extends Encoded = Encoded,
545
+ $A = never,
546
+ $B = never,
547
+ $C = never,
548
+ $D = never,
549
+ $E = never,
550
+ $F = never,
551
+ $G = never,
552
+ $H = never,
553
+ $I = never,
554
+ E extends boolean = false
555
+ >(
556
+ q1: (initial: Query<Encoded>) => $A,
557
+ q2: (_: $A) => $B,
558
+ q3: (_: $B) => $C,
559
+ q4: (_: $C) => $D,
560
+ q5: (_: $D) => $E,
561
+ q6: (_: $E) => $F,
562
+ q7: (_: $F) => $G,
563
+ q8: (_: $G) => $H,
564
+ q9: (_: $H) => $I,
565
+ q10: (
566
+ _: $I
567
+ ) => QAll<Encoded, EncodedRefined, RefineTHelper<T, EncodedRefined>, R, TType, E>
568
+ ): Effect.Effect<
569
+ TType extends "many" ? DistributeQueryIfExclusiveOnArray<E, T, EncodedRefined>
570
+ : RefineTHelper<T, EncodedRefined>,
571
+ TType extends "many" ? never : NotFoundError<ItemType>,
572
+ Exclude<R, RProvided> | RSchema
573
+ >
574
+ }
575
+
576
+ /** @deprecated use query */
577
+ readonly mapped: Mapped<Encoded>
578
+
579
+ /**
580
+ * Validates a random sample of repository items by applying jitM and schema decode.
581
+ * Useful for testing that migrations and schema changes work correctly on existing data.
582
+ */
583
+ readonly validateSample: (options?: {
584
+ /** percentage of items to sample (0.0-1.0), default 0.1 (10%) */
585
+ percentage?: number
586
+ /** optional maximum number of items to sample */
587
+ maxItems?: number
588
+ }) => Effect.Effect<ValidationResult, never, RSchema>
589
+ }
590
+
591
+ type DistributeQueryIfExclusiveOnArray<Exclusive extends boolean, T, EncodedRefined> = [Exclusive] extends [true]
592
+ ? T extends any ? RefineTHelper<T, EncodedRefined> extends infer R ? IsNever<R> extends true ? never
593
+ : readonly R[]
594
+ : never
595
+ : never
596
+ : readonly RefineTHelper<T, EncodedRefined>[]
597
+
598
+ type NullableRefined<T, EncodedRefined> = {
599
+ // EncodedRefined may be a union, so if you just keyof you'll get just common keys
600
+ // p.s. NullableRefined is homomorphic in T so it distributes itself over T
601
+ [k in keyof T]: [null] extends [T[k]] ? [null] extends [Extract<EncodedRefined, { [j in k]: any }>[k]] ? T[k]
602
+ : Exclude<T[k], null>
603
+ : T[k]
604
+ }
605
+
606
+ // for DX purposes
607
+ type ShouldRecursiveExtractTagged<T, EncodedRefined> = true extends {
608
+ [k in keyof T]: "_tag" extends keyof T[k]
609
+ ? k extends keyof EncodedRefined ? "_tag" extends keyof EncodedRefined[k] ? true
610
+ : false
611
+ : false
612
+ : false
613
+ }[keyof T] ? true
614
+ : false
615
+
616
+ // support is not 100% but we have to make compromises
617
+ type RecursiveExtractTagged<T, EncodedRefined> = ShouldRecursiveExtractTagged<T, EncodedRefined> extends true ? {
618
+ [k in keyof T]: "_tag" extends keyof T[k]
619
+ ? k extends keyof EncodedRefined ? "_tag" extends keyof EncodedRefined[k] ? ExtractTagged<T[k], EncodedRefined[k]>
620
+ : T[k]
621
+ : T[k]
622
+ : T[k]
623
+ }
624
+ : T
625
+
626
+ type ExtractTagged_<T, EncodedRefined> = EncodedRefined extends { _tag: string }
627
+ ? T extends { _tag: string } ? Extract<T, { _tag: EncodedRefined["_tag"] }>
628
+ : T
629
+ : T
630
+
631
+ type ExtractTagged<T, EncodedRefined> = ExtractTagged_<T, EncodedRefined> extends infer R
632
+ ? RecursiveExtractTagged<RecusiveExtractIded<R, EncodedRefined>, EncodedRefined>
633
+ : never
634
+
635
+ type ShouldRecursiveExtractIded<T, EncodedRefined> = true extends {
636
+ [k in keyof T]: "id" extends keyof T[k] ? k extends keyof EncodedRefined ? "id" extends keyof EncodedRefined[k] ? true
637
+ : false
638
+ : false
639
+ : false
640
+ }[keyof T] ? true
641
+ : false
642
+
643
+ type RecusiveExtractIded<T, EncodedRefined> = ShouldRecursiveExtractIded<T, EncodedRefined> extends true ? {
644
+ [k in keyof T]: "id" extends keyof T[k]
645
+ ? k extends keyof EncodedRefined ? "id" extends keyof EncodedRefined[k] ? ExtractIded<T[k], EncodedRefined[k]>
646
+ : T[k]
647
+ : T[k]
648
+ : T[k]
649
+ }
650
+ : T
651
+
652
+ type ExtractIded_<T, EncodedRefined> = EncodedRefined extends { id: string }
653
+ ? T extends { id: string } ? Extract<T, { id: EncodedRefined["id"] }>
654
+ : T
655
+ : T
656
+
657
+ type ExtractIded<T, EncodedRefined> = ExtractIded_<T, EncodedRefined> extends infer R
658
+ ? RecusiveExtractIded<RecursiveExtractTagged<R, EncodedRefined>, EncodedRefined>
659
+ : never
660
+
661
+ export type RefineTHelper<T, EncodedRefined> = ResolveFirstLevel<
662
+ NullableRefined<
663
+ ExtractIded<ExtractTagged<T, EncodedRefined>, EncodedRefined>,
664
+ EncodedRefined
665
+ >
666
+ >
@@ -0,0 +1,31 @@
1
+ import * as S from "../../Schema.js"
2
+ import { NonNegativeInt } from "../../Schema.js"
3
+
4
+ /**
5
+ * Represents a single validation error when decoding a repository item.
6
+ * Contains full context for debugging: raw data, jitM result, and decode error.
7
+ */
8
+ export class ValidationError extends S.Opaque<ValidationError>()(S.Struct({
9
+ /** the id of the item that failed validation */
10
+ id: S.Unknown,
11
+ /** the raw data from the database before jitM */
12
+ rawData: S.Unknown,
13
+ /** the data after applying jitM transformation */
14
+ jitMResult: S.Unknown,
15
+ /** the S.SchemaError from schema decode */
16
+ error: S.Unknown
17
+ })) {}
18
+
19
+ /**
20
+ * Result of validating a sample of repository items.
21
+ */
22
+ export class ValidationResult extends S.Opaque<ValidationResult>()(S.Struct({
23
+ /** total number of items in the repository */
24
+ total: NonNegativeInt,
25
+ /** number of items that were sampled for validation */
26
+ sampled: NonNegativeInt,
27
+ /** number of items that passed validation */
28
+ valid: NonNegativeInt,
29
+ /** list of validation errors with full context */
30
+ errors: S.Array(ValidationError)
31
+ })) {}
@@ -0,0 +1,6 @@
1
+ export * from "./Repository/ext.js"
2
+ export * from "./Repository/legacy.js"
3
+ export { makeRepo } from "./Repository/makeRepo.js"
4
+ export * from "./Repository/Registry.js"
5
+ export * from "./Repository/service.js"
6
+ export * from "./Repository/validation.js"