effect 4.0.0-rc.112 → 4.0.0-rc.113

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 (1229) hide show
  1. package/AGENTS.md +24 -9
  2. package/CLAUDE.md +24 -9
  3. package/ai-docs/package.json +2 -2
  4. package/ai-docs/src/01_effect/01_basics/02_effect-fn.ts +18 -5
  5. package/ai-docs/src/01_effect/01_basics/index.md +5 -3
  6. package/ai-docs/src/01_effect/03_services/20_layer-composition.ts +1 -1
  7. package/ai-docs/src/01_effect/03_services/20_layer-unwrap.ts +2 -2
  8. package/ai-docs/src/01_effect/05_resources/10_acquire-release.ts +2 -2
  9. package/ai-docs/src/03_stream/30_encoding.ts +5 -7
  10. package/ai-docs/src/08_observability/10_logging.ts +1 -1
  11. package/ai-docs/src/70_cli/10_basics.ts +7 -7
  12. package/ai-docs/src/71_ai/10_language-model.ts +2 -2
  13. package/ai-docs/src/71_ai/20_tools.ts +1 -1
  14. package/ai-docs/src/71_ai/30_chat.ts +1 -1
  15. package/dist/Array.d.ts +86 -50
  16. package/dist/Array.d.ts.map +1 -1
  17. package/dist/Array.js +58 -32
  18. package/dist/Array.js.map +1 -1
  19. package/dist/BigDecimal.d.ts +5 -1
  20. package/dist/BigDecimal.d.ts.map +1 -1
  21. package/dist/BigDecimal.js +40 -23
  22. package/dist/BigDecimal.js.map +1 -1
  23. package/dist/ByteSize.d.ts +633 -0
  24. package/dist/ByteSize.d.ts.map +1 -0
  25. package/dist/ByteSize.js +524 -0
  26. package/dist/ByteSize.js.map +1 -0
  27. package/dist/Cache.d.ts.map +1 -1
  28. package/dist/Cache.js +17 -3
  29. package/dist/Cache.js.map +1 -1
  30. package/dist/Cause.d.ts +1 -1
  31. package/dist/Cause.d.ts.map +1 -1
  32. package/dist/Channel.d.ts +97 -24
  33. package/dist/Channel.d.ts.map +1 -1
  34. package/dist/Channel.js +66 -39
  35. package/dist/Channel.js.map +1 -1
  36. package/dist/Chunk.d.ts +49 -28
  37. package/dist/Chunk.d.ts.map +1 -1
  38. package/dist/Chunk.js +27 -18
  39. package/dist/Chunk.js.map +1 -1
  40. package/dist/Config.d.ts +162 -201
  41. package/dist/Config.d.ts.map +1 -1
  42. package/dist/Config.js +103 -212
  43. package/dist/Config.js.map +1 -1
  44. package/dist/ConfigProvider.d.ts +4 -4
  45. package/dist/ConfigProvider.d.ts.map +1 -1
  46. package/dist/ConfigProvider.js +7 -7
  47. package/dist/ConfigProvider.js.map +1 -1
  48. package/dist/Context.d.ts +31 -0
  49. package/dist/Context.d.ts.map +1 -1
  50. package/dist/Context.js.map +1 -1
  51. package/dist/Cron.d.ts +2 -2
  52. package/dist/Cron.d.ts.map +1 -1
  53. package/dist/Cron.js +2 -2
  54. package/dist/Cron.js.map +1 -1
  55. package/dist/Crypto.d.ts +1 -1
  56. package/dist/Crypto.d.ts.map +1 -1
  57. package/dist/Crypto.js +3 -2
  58. package/dist/Crypto.js.map +1 -1
  59. package/dist/DateTime.d.ts +2 -2
  60. package/dist/DateTime.d.ts.map +1 -1
  61. package/dist/Deferred.d.ts.map +1 -1
  62. package/dist/Deferred.js +6 -6
  63. package/dist/Deferred.js.map +1 -1
  64. package/dist/Duration.d.ts +1 -1
  65. package/dist/Duration.d.ts.map +1 -1
  66. package/dist/Duration.js +1 -1
  67. package/dist/Duration.js.map +1 -1
  68. package/dist/Effect.d.ts +220 -113
  69. package/dist/Effect.d.ts.map +1 -1
  70. package/dist/Effect.js +27 -26
  71. package/dist/Effect.js.map +1 -1
  72. package/dist/Effectable.d.ts +58 -2
  73. package/dist/Effectable.d.ts.map +1 -1
  74. package/dist/Effectable.js +58 -6
  75. package/dist/Effectable.js.map +1 -1
  76. package/dist/Encoding.d.ts +3 -1
  77. package/dist/Encoding.d.ts.map +1 -1
  78. package/dist/Encoding.js +40 -10
  79. package/dist/Encoding.js.map +1 -1
  80. package/dist/Equal.d.ts +1 -1
  81. package/dist/Equal.d.ts.map +1 -1
  82. package/dist/Equal.js +1 -1
  83. package/dist/Equal.js.map +1 -1
  84. package/dist/ExecutionPlan.d.ts.map +1 -1
  85. package/dist/ExecutionPlan.js +1 -0
  86. package/dist/ExecutionPlan.js.map +1 -1
  87. package/dist/Fiber.d.ts +32 -8
  88. package/dist/Fiber.d.ts.map +1 -1
  89. package/dist/Fiber.js.map +1 -1
  90. package/dist/FiberHandle.js +3 -3
  91. package/dist/FiberHandle.js.map +1 -1
  92. package/dist/FiberMap.d.ts +12 -6
  93. package/dist/FiberMap.d.ts.map +1 -1
  94. package/dist/FiberMap.js +11 -6
  95. package/dist/FiberMap.js.map +1 -1
  96. package/dist/FileSystem.d.ts +42 -210
  97. package/dist/FileSystem.d.ts.map +1 -1
  98. package/dist/FileSystem.js +16 -148
  99. package/dist/FileSystem.js.map +1 -1
  100. package/dist/Formatter.d.ts +1 -0
  101. package/dist/Formatter.d.ts.map +1 -1
  102. package/dist/Formatter.js +19 -3
  103. package/dist/Formatter.js.map +1 -1
  104. package/dist/Graph.d.ts +48 -20
  105. package/dist/Graph.d.ts.map +1 -1
  106. package/dist/Graph.js +20 -5
  107. package/dist/Graph.js.map +1 -1
  108. package/dist/Hash.d.ts +1 -1
  109. package/dist/Hash.d.ts.map +1 -1
  110. package/dist/Hash.js +5 -14
  111. package/dist/Hash.js.map +1 -1
  112. package/dist/HashMap.d.ts +1 -1
  113. package/dist/HashMap.d.ts.map +1 -1
  114. package/dist/HashRing.d.ts +6 -1
  115. package/dist/HashRing.d.ts.map +1 -1
  116. package/dist/HashRing.js +9 -2
  117. package/dist/HashRing.js.map +1 -1
  118. package/dist/HashSet.d.ts +1 -1
  119. package/dist/HashSet.d.ts.map +1 -1
  120. package/dist/HashSet.js.map +1 -1
  121. package/dist/Iterable.d.ts +33 -15
  122. package/dist/Iterable.d.ts.map +1 -1
  123. package/dist/Iterable.js +58 -45
  124. package/dist/Iterable.js.map +1 -1
  125. package/dist/JsonPatch.js +4 -4
  126. package/dist/JsonPatch.js.map +1 -1
  127. package/dist/JsonPointer.d.ts +68 -4
  128. package/dist/JsonPointer.d.ts.map +1 -1
  129. package/dist/JsonPointer.js +90 -4
  130. package/dist/JsonPointer.js.map +1 -1
  131. package/dist/JsonSchema.js +8 -22
  132. package/dist/JsonSchema.js.map +1 -1
  133. package/dist/Layer.d.ts +47 -4
  134. package/dist/Layer.d.ts.map +1 -1
  135. package/dist/Layer.js +4 -6
  136. package/dist/Layer.js.map +1 -1
  137. package/dist/LayerMap.d.ts +1 -3
  138. package/dist/LayerMap.d.ts.map +1 -1
  139. package/dist/LayerMap.js +7 -5
  140. package/dist/LayerMap.js.map +1 -1
  141. package/dist/LayerRef.d.ts.map +1 -1
  142. package/dist/LayerRef.js +7 -5
  143. package/dist/LayerRef.js.map +1 -1
  144. package/dist/Logger.d.ts +114 -9
  145. package/dist/Logger.d.ts.map +1 -1
  146. package/dist/Logger.js +109 -9
  147. package/dist/Logger.js.map +1 -1
  148. package/dist/ManagedRuntime.js +1 -1
  149. package/dist/ManagedRuntime.js.map +1 -1
  150. package/dist/Match.d.ts +43 -31
  151. package/dist/Match.d.ts.map +1 -1
  152. package/dist/Match.js +5 -2
  153. package/dist/Match.js.map +1 -1
  154. package/dist/Metric.d.ts +11 -4
  155. package/dist/Metric.d.ts.map +1 -1
  156. package/dist/Metric.js +14 -18
  157. package/dist/Metric.js.map +1 -1
  158. package/dist/MutableHashMap.d.ts +1 -1
  159. package/dist/MutableHashMap.d.ts.map +1 -1
  160. package/dist/MutableHashMap.js +1 -1
  161. package/dist/MutableHashMap.js.map +1 -1
  162. package/dist/MutableHashSet.d.ts +1 -1
  163. package/dist/MutableHashSet.d.ts.map +1 -1
  164. package/dist/MutableHashSet.js +1 -1
  165. package/dist/MutableHashSet.js.map +1 -1
  166. package/dist/MutableList.d.ts +13 -2
  167. package/dist/MutableList.d.ts.map +1 -1
  168. package/dist/MutableList.js +18 -2
  169. package/dist/MutableList.js.map +1 -1
  170. package/dist/Number.d.ts +6 -0
  171. package/dist/Number.d.ts.map +1 -1
  172. package/dist/Number.js +3 -1
  173. package/dist/Number.js.map +1 -1
  174. package/dist/Optic.d.ts.map +1 -1
  175. package/dist/Optic.js +5 -4
  176. package/dist/Optic.js.map +1 -1
  177. package/dist/Option.d.ts +1 -1
  178. package/dist/Option.d.ts.map +1 -1
  179. package/dist/Option.js +1 -1
  180. package/dist/Option.js.map +1 -1
  181. package/dist/Order.d.ts +1 -0
  182. package/dist/Order.d.ts.map +1 -1
  183. package/dist/Order.js +3 -1
  184. package/dist/Order.js.map +1 -1
  185. package/dist/PartitionedSemaphore.d.ts.map +1 -1
  186. package/dist/PartitionedSemaphore.js +1 -2
  187. package/dist/PartitionedSemaphore.js.map +1 -1
  188. package/dist/Path.d.ts +1 -1
  189. package/dist/Path.d.ts.map +1 -1
  190. package/dist/Path.js +1 -1
  191. package/dist/Path.js.map +1 -1
  192. package/dist/PlatformError.d.ts +1 -1
  193. package/dist/PlatformError.d.ts.map +1 -1
  194. package/dist/PlatformError.js +1 -1
  195. package/dist/PlatformError.js.map +1 -1
  196. package/dist/Pool.d.ts +38 -1
  197. package/dist/Pool.d.ts.map +1 -1
  198. package/dist/Pool.js +81 -5
  199. package/dist/Pool.js.map +1 -1
  200. package/dist/PrimaryKey.d.ts +1 -1
  201. package/dist/PrimaryKey.d.ts.map +1 -1
  202. package/dist/PrimaryKey.js +1 -1
  203. package/dist/PrimaryKey.js.map +1 -1
  204. package/dist/PubSub.d.ts +21 -9
  205. package/dist/PubSub.d.ts.map +1 -1
  206. package/dist/PubSub.js +18 -14
  207. package/dist/PubSub.js.map +1 -1
  208. package/dist/Queue.d.ts +82 -6
  209. package/dist/Queue.d.ts.map +1 -1
  210. package/dist/Queue.js +116 -27
  211. package/dist/Queue.js.map +1 -1
  212. package/dist/Random.d.ts +17 -4
  213. package/dist/Random.d.ts.map +1 -1
  214. package/dist/Random.js +1 -1
  215. package/dist/Random.js.map +1 -1
  216. package/dist/RcMap.d.ts.map +1 -1
  217. package/dist/RcMap.js +15 -9
  218. package/dist/RcMap.js.map +1 -1
  219. package/dist/Redacted.d.ts +1 -1
  220. package/dist/Redacted.d.ts.map +1 -1
  221. package/dist/Redacted.js +1 -1
  222. package/dist/Redacted.js.map +1 -1
  223. package/dist/RequestResolver.d.ts +15 -9
  224. package/dist/RequestResolver.d.ts.map +1 -1
  225. package/dist/RequestResolver.js +33 -15
  226. package/dist/RequestResolver.js.map +1 -1
  227. package/dist/Result.d.ts +1 -1
  228. package/dist/Result.d.ts.map +1 -1
  229. package/dist/Result.js +1 -1
  230. package/dist/Result.js.map +1 -1
  231. package/dist/Scheduler.d.ts.map +1 -1
  232. package/dist/Scheduler.js +19 -10
  233. package/dist/Scheduler.js.map +1 -1
  234. package/dist/Schema.d.ts +2155 -2415
  235. package/dist/Schema.d.ts.map +1 -1
  236. package/dist/Schema.js +2755 -4174
  237. package/dist/Schema.js.map +1 -1
  238. package/dist/SchemaAST.d.ts +354 -183
  239. package/dist/SchemaAST.d.ts.map +1 -1
  240. package/dist/SchemaAST.js +277 -601
  241. package/dist/SchemaAST.js.map +1 -1
  242. package/dist/SchemaGetter.d.ts +46 -22
  243. package/dist/SchemaGetter.d.ts.map +1 -1
  244. package/dist/SchemaGetter.js +56 -53
  245. package/dist/SchemaGetter.js.map +1 -1
  246. package/dist/SchemaIssue.d.ts +122 -188
  247. package/dist/SchemaIssue.d.ts.map +1 -1
  248. package/dist/SchemaIssue.js +48 -263
  249. package/dist/SchemaIssue.js.map +1 -1
  250. package/dist/SchemaParser.js +2 -9
  251. package/dist/SchemaParser.js.map +1 -1
  252. package/dist/SchemaRepresentation.d.ts +1099 -16
  253. package/dist/SchemaRepresentation.d.ts.map +1 -1
  254. package/dist/SchemaRepresentation.js +1341 -20
  255. package/dist/SchemaRepresentation.js.map +1 -1
  256. package/dist/SchemaTransformation.d.ts +49 -16
  257. package/dist/SchemaTransformation.d.ts.map +1 -1
  258. package/dist/SchemaTransformation.js +75 -98
  259. package/dist/SchemaTransformation.js.map +1 -1
  260. package/dist/ScopedCache.d.ts.map +1 -1
  261. package/dist/ScopedCache.js +10 -3
  262. package/dist/ScopedCache.js.map +1 -1
  263. package/dist/Sink.d.ts +9 -4
  264. package/dist/Sink.d.ts.map +1 -1
  265. package/dist/Sink.js +49 -31
  266. package/dist/Sink.js.map +1 -1
  267. package/dist/Stream.d.ts +221 -35
  268. package/dist/Stream.d.ts.map +1 -1
  269. package/dist/Stream.js +168 -84
  270. package/dist/Stream.js.map +1 -1
  271. package/dist/String.d.ts +16 -6
  272. package/dist/String.d.ts.map +1 -1
  273. package/dist/String.js +12 -5
  274. package/dist/String.js.map +1 -1
  275. package/dist/Struct.d.ts.map +1 -1
  276. package/dist/Struct.js +7 -4
  277. package/dist/Struct.js.map +1 -1
  278. package/dist/SynchronizedRef.d.ts +3 -2
  279. package/dist/SynchronizedRef.d.ts.map +1 -1
  280. package/dist/SynchronizedRef.js.map +1 -1
  281. package/dist/Terminal.d.ts +3 -3
  282. package/dist/Terminal.d.ts.map +1 -1
  283. package/dist/Terminal.js +3 -3
  284. package/dist/Terminal.js.map +1 -1
  285. package/dist/Tracer.d.ts +27 -7
  286. package/dist/Tracer.d.ts.map +1 -1
  287. package/dist/Tracer.js +38 -13
  288. package/dist/Tracer.js.map +1 -1
  289. package/dist/Trie.d.ts +1 -1
  290. package/dist/Trie.d.ts.map +1 -1
  291. package/dist/Tuple.d.ts +2 -1
  292. package/dist/Tuple.d.ts.map +1 -1
  293. package/dist/Tuple.js.map +1 -1
  294. package/dist/TxChunk.d.ts +1 -1
  295. package/dist/TxChunk.d.ts.map +1 -1
  296. package/dist/TxChunk.js +1 -1
  297. package/dist/TxChunk.js.map +1 -1
  298. package/dist/TxDeferred.d.ts +1 -1
  299. package/dist/TxDeferred.d.ts.map +1 -1
  300. package/dist/TxDeferred.js +1 -1
  301. package/dist/TxDeferred.js.map +1 -1
  302. package/dist/TxHashMap.d.ts +1 -1
  303. package/dist/TxHashMap.d.ts.map +1 -1
  304. package/dist/TxHashMap.js +1 -1
  305. package/dist/TxHashMap.js.map +1 -1
  306. package/dist/TxHashSet.d.ts +1 -1
  307. package/dist/TxHashSet.d.ts.map +1 -1
  308. package/dist/TxHashSet.js +1 -1
  309. package/dist/TxHashSet.js.map +1 -1
  310. package/dist/TxPriorityQueue.d.ts +1 -1
  311. package/dist/TxPriorityQueue.d.ts.map +1 -1
  312. package/dist/TxPriorityQueue.js +1 -1
  313. package/dist/TxPriorityQueue.js.map +1 -1
  314. package/dist/TxPubSub.d.ts +1 -1
  315. package/dist/TxPubSub.d.ts.map +1 -1
  316. package/dist/TxPubSub.js +1 -1
  317. package/dist/TxPubSub.js.map +1 -1
  318. package/dist/TxQueue.d.ts +9 -9
  319. package/dist/TxQueue.d.ts.map +1 -1
  320. package/dist/TxQueue.js +93 -86
  321. package/dist/TxQueue.js.map +1 -1
  322. package/dist/TxReentrantLock.d.ts +29 -1
  323. package/dist/TxReentrantLock.d.ts.map +1 -1
  324. package/dist/TxReentrantLock.js +29 -1
  325. package/dist/TxReentrantLock.js.map +1 -1
  326. package/dist/TxRef.d.ts +1 -1
  327. package/dist/TxRef.d.ts.map +1 -1
  328. package/dist/TxRef.js +1 -1
  329. package/dist/TxRef.js.map +1 -1
  330. package/dist/TxSemaphore.d.ts +1 -1
  331. package/dist/TxSemaphore.d.ts.map +1 -1
  332. package/dist/TxSemaphore.js +1 -1
  333. package/dist/TxSemaphore.js.map +1 -1
  334. package/dist/TxSubscriptionRef.d.ts +1 -1
  335. package/dist/TxSubscriptionRef.d.ts.map +1 -1
  336. package/dist/TxSubscriptionRef.js +1 -1
  337. package/dist/TxSubscriptionRef.js.map +1 -1
  338. package/dist/Types.d.ts +33 -19
  339. package/dist/Types.d.ts.map +1 -1
  340. package/dist/Utils.d.ts.map +1 -1
  341. package/dist/Utils.js +2 -1
  342. package/dist/Utils.js.map +1 -1
  343. package/dist/index.d.ts +4 -0
  344. package/dist/index.d.ts.map +1 -1
  345. package/dist/index.js +4 -0
  346. package/dist/index.js.map +1 -1
  347. package/dist/internal/arbitrary/model.d.ts +2 -0
  348. package/dist/internal/arbitrary/model.d.ts.map +1 -0
  349. package/dist/internal/arbitrary/model.js +495 -0
  350. package/dist/internal/arbitrary/model.js.map +1 -0
  351. package/dist/internal/arbitrary/regexp.d.ts +2 -0
  352. package/dist/internal/arbitrary/regexp.d.ts.map +1 -0
  353. package/dist/internal/arbitrary/regexp.js +789 -0
  354. package/dist/internal/arbitrary/regexp.js.map +1 -0
  355. package/dist/internal/arbitrary/runner.d.ts +2 -0
  356. package/dist/internal/arbitrary/runner.d.ts.map +1 -0
  357. package/dist/internal/arbitrary/runner.js +496 -0
  358. package/dist/internal/arbitrary/runner.js.map +1 -0
  359. package/dist/internal/arbitrary/schema.d.ts.map +1 -0
  360. package/dist/internal/arbitrary/schema.js +1340 -0
  361. package/dist/internal/arbitrary/schema.js.map +1 -0
  362. package/dist/internal/core.js +27 -13
  363. package/dist/internal/core.js.map +1 -1
  364. package/dist/internal/count.d.ts +2 -0
  365. package/dist/internal/count.d.ts.map +1 -0
  366. package/dist/internal/count.js +14 -0
  367. package/dist/internal/count.js.map +1 -0
  368. package/dist/internal/dateTime.js +4 -10
  369. package/dist/internal/dateTime.js.map +1 -1
  370. package/dist/internal/effect.js +386 -251
  371. package/dist/internal/effect.js.map +1 -1
  372. package/dist/internal/graph.js +3 -1
  373. package/dist/internal/graph.js.map +1 -1
  374. package/dist/internal/hashMap.js +5 -3
  375. package/dist/internal/hashMap.js.map +1 -1
  376. package/dist/internal/hashSet.js +1 -1
  377. package/dist/internal/hashSet.js.map +1 -1
  378. package/dist/internal/matcher.js +1 -1
  379. package/dist/internal/matcher.js.map +1 -1
  380. package/dist/internal/metric.js +1 -1
  381. package/dist/internal/metric.js.map +1 -1
  382. package/dist/internal/option.js +6 -5
  383. package/dist/internal/option.js.map +1 -1
  384. package/dist/internal/random.js +17 -0
  385. package/dist/internal/random.js.map +1 -1
  386. package/dist/internal/rcRef.js +10 -7
  387. package/dist/internal/rcRef.js.map +1 -1
  388. package/dist/internal/references.js +1 -0
  389. package/dist/internal/references.js.map +1 -1
  390. package/dist/internal/request.js +13 -6
  391. package/dist/internal/request.js.map +1 -1
  392. package/dist/internal/result.js +11 -9
  393. package/dist/internal/result.js.map +1 -1
  394. package/dist/internal/schema/annotations.js +1 -1
  395. package/dist/internal/schema/annotations.js.map +1 -1
  396. package/dist/internal/schema/fromJsonSchemaDocument.js +14 -12
  397. package/dist/internal/schema/fromJsonSchemaDocument.js.map +1 -1
  398. package/dist/internal/schema/fromRepresentation.js +5 -5
  399. package/dist/internal/schema/fromRepresentation.js.map +1 -1
  400. package/dist/internal/schema/make.d.ts +2 -0
  401. package/dist/internal/schema/make.d.ts.map +1 -0
  402. package/dist/internal/schema/{schema.js → make.js} +1 -25
  403. package/dist/internal/schema/make.js.map +1 -0
  404. package/dist/internal/schema/parser.d.ts +0 -12
  405. package/dist/internal/schema/parser.d.ts.map +1 -1
  406. package/dist/internal/schema/parser.js +7 -0
  407. package/dist/internal/schema/parser.js.map +1 -1
  408. package/dist/internal/schema/standardSchema.d.ts +2 -0
  409. package/dist/internal/schema/standardSchema.d.ts.map +1 -0
  410. package/dist/internal/schema/standardSchema.js +112 -0
  411. package/dist/internal/schema/standardSchema.js.map +1 -0
  412. package/dist/internal/schema/toCodeDocument.js +34 -22
  413. package/dist/internal/schema/toCodeDocument.js.map +1 -1
  414. package/dist/internal/schema/toCodec.d.ts +2 -0
  415. package/dist/internal/schema/toCodec.d.ts.map +1 -0
  416. package/dist/internal/schema/toCodec.js +242 -0
  417. package/dist/internal/schema/toCodec.js.map +1 -0
  418. package/dist/internal/schema/toDifferJsonPatch.d.ts +2 -0
  419. package/dist/internal/schema/toDifferJsonPatch.d.ts.map +1 -0
  420. package/dist/internal/schema/toDifferJsonPatch.js +20 -0
  421. package/dist/internal/schema/toDifferJsonPatch.js.map +1 -0
  422. package/dist/internal/schema/toEncoderXml.d.ts +2 -0
  423. package/dist/internal/schema/toEncoderXml.d.ts.map +1 -0
  424. package/dist/internal/schema/toEncoderXml.js +104 -0
  425. package/dist/internal/schema/toEncoderXml.js.map +1 -0
  426. package/dist/internal/schema/toEquivalence.js +66 -0
  427. package/dist/internal/schema/toEquivalence.js.map +1 -1
  428. package/dist/internal/schema/toFormatter.d.ts +2 -0
  429. package/dist/internal/schema/toFormatter.d.ts.map +1 -0
  430. package/dist/internal/schema/toFormatter.js +227 -0
  431. package/dist/internal/schema/toFormatter.js.map +1 -0
  432. package/dist/internal/schema/toIso.d.ts +2 -0
  433. package/dist/internal/schema/toIso.d.ts.map +1 -0
  434. package/dist/internal/schema/toIso.js +17 -0
  435. package/dist/internal/schema/toIso.js.map +1 -0
  436. package/dist/internal/schema/toJsonSchemaDocument.js +122 -71
  437. package/dist/internal/schema/toJsonSchemaDocument.js.map +1 -1
  438. package/dist/internal/schema/toRepresentation.js +3 -1
  439. package/dist/internal/schema/toRepresentation.js.map +1 -1
  440. package/dist/internal/schemaError.d.ts +4 -0
  441. package/dist/internal/schemaError.d.ts.map +1 -0
  442. package/dist/internal/schemaError.js +6 -0
  443. package/dist/internal/schemaError.js.map +1 -0
  444. package/dist/internal/stream.js +5 -6
  445. package/dist/internal/stream.js.map +1 -1
  446. package/dist/internal/tracer.d.ts +1 -3
  447. package/dist/internal/tracer.d.ts.map +1 -1
  448. package/dist/internal/tracer.js +6 -0
  449. package/dist/internal/tracer.js.map +1 -1
  450. package/dist/internal/trie.js +2 -2
  451. package/dist/internal/trie.js.map +1 -1
  452. package/dist/internal/uuid.d.ts +1 -2
  453. package/dist/internal/uuid.d.ts.map +1 -1
  454. package/dist/internal/uuid.js +2 -0
  455. package/dist/internal/uuid.js.map +1 -1
  456. package/dist/testing/TestSchema.d.ts +9 -11
  457. package/dist/testing/TestSchema.d.ts.map +1 -1
  458. package/dist/testing/TestSchema.js +20 -18
  459. package/dist/testing/TestSchema.js.map +1 -1
  460. package/dist/testing/index.d.ts +0 -4
  461. package/dist/testing/index.d.ts.map +1 -1
  462. package/dist/testing/index.js +0 -4
  463. package/dist/testing/index.js.map +1 -1
  464. package/dist/unstable/ai/AiError.d.ts +74 -23
  465. package/dist/unstable/ai/AiError.d.ts.map +1 -1
  466. package/dist/unstable/ai/AiError.js +59 -5
  467. package/dist/unstable/ai/AiError.js.map +1 -1
  468. package/dist/unstable/ai/AnthropicStructuredOutput.d.ts.map +1 -1
  469. package/dist/unstable/ai/AnthropicStructuredOutput.js +2 -1
  470. package/dist/unstable/ai/AnthropicStructuredOutput.js.map +1 -1
  471. package/dist/unstable/ai/Chat.d.ts +27 -32
  472. package/dist/unstable/ai/Chat.d.ts.map +1 -1
  473. package/dist/unstable/ai/Chat.js +10 -13
  474. package/dist/unstable/ai/Chat.js.map +1 -1
  475. package/dist/unstable/ai/EmbeddingModel.d.ts +23 -16
  476. package/dist/unstable/ai/EmbeddingModel.d.ts.map +1 -1
  477. package/dist/unstable/ai/EmbeddingModel.js +13 -11
  478. package/dist/unstable/ai/EmbeddingModel.js.map +1 -1
  479. package/dist/unstable/ai/LanguageModel.d.ts +48 -37
  480. package/dist/unstable/ai/LanguageModel.d.ts.map +1 -1
  481. package/dist/unstable/ai/LanguageModel.js +150 -47
  482. package/dist/unstable/ai/LanguageModel.js.map +1 -1
  483. package/dist/unstable/ai/McpServer.d.ts +2 -2
  484. package/dist/unstable/ai/McpServer.d.ts.map +1 -1
  485. package/dist/unstable/ai/McpServer.js +21 -12
  486. package/dist/unstable/ai/McpServer.js.map +1 -1
  487. package/dist/unstable/ai/OpenAiStructuredOutput.d.ts.map +1 -1
  488. package/dist/unstable/ai/OpenAiStructuredOutput.js +2 -1
  489. package/dist/unstable/ai/OpenAiStructuredOutput.js.map +1 -1
  490. package/dist/unstable/ai/Prompt.d.ts +1 -1
  491. package/dist/unstable/ai/Prompt.d.ts.map +1 -1
  492. package/dist/unstable/ai/Prompt.js +15 -4
  493. package/dist/unstable/ai/Prompt.js.map +1 -1
  494. package/dist/unstable/ai/Response.d.ts +37 -94
  495. package/dist/unstable/ai/Response.d.ts.map +1 -1
  496. package/dist/unstable/ai/Response.js +46 -96
  497. package/dist/unstable/ai/Response.js.map +1 -1
  498. package/dist/unstable/ai/Tokenizer.js +4 -5
  499. package/dist/unstable/ai/Tokenizer.js.map +1 -1
  500. package/dist/unstable/ai/Tool.d.ts +38 -20
  501. package/dist/unstable/ai/Tool.d.ts.map +1 -1
  502. package/dist/unstable/ai/Tool.js +27 -1
  503. package/dist/unstable/ai/Tool.js.map +1 -1
  504. package/dist/unstable/ai/Toolkit.d.ts +1 -1
  505. package/dist/unstable/ai/Toolkit.d.ts.map +1 -1
  506. package/dist/unstable/ai/Toolkit.js +30 -18
  507. package/dist/unstable/ai/Toolkit.js.map +1 -1
  508. package/dist/unstable/ai/internal/structured-output.js +8 -5
  509. package/dist/unstable/ai/internal/structured-output.js.map +1 -1
  510. package/dist/unstable/arbitrary/Arbitrary.d.ts +626 -0
  511. package/dist/unstable/arbitrary/Arbitrary.d.ts.map +1 -0
  512. package/dist/unstable/arbitrary/Arbitrary.js +238 -0
  513. package/dist/unstable/arbitrary/Arbitrary.js.map +1 -0
  514. package/dist/unstable/arbitrary/index.d.ts +8 -0
  515. package/dist/unstable/arbitrary/index.d.ts.map +1 -0
  516. package/dist/unstable/arbitrary/index.js +9 -0
  517. package/dist/unstable/arbitrary/index.js.map +1 -0
  518. package/dist/unstable/cli/Argument.d.ts +104 -108
  519. package/dist/unstable/cli/Argument.d.ts.map +1 -1
  520. package/dist/unstable/cli/Argument.js +56 -57
  521. package/dist/unstable/cli/Argument.js.map +1 -1
  522. package/dist/unstable/cli/CliError.d.ts +2 -0
  523. package/dist/unstable/cli/CliError.d.ts.map +1 -1
  524. package/dist/unstable/cli/CliError.js +2 -0
  525. package/dist/unstable/cli/CliError.js.map +1 -1
  526. package/dist/unstable/cli/CliOutput.js +26 -3
  527. package/dist/unstable/cli/CliOutput.js.map +1 -1
  528. package/dist/unstable/cli/Command.d.ts +73 -73
  529. package/dist/unstable/cli/Command.js +18 -18
  530. package/dist/unstable/cli/Completions.d.ts +4 -4
  531. package/dist/unstable/cli/Completions.d.ts.map +1 -1
  532. package/dist/unstable/cli/Flag.d.ts +150 -161
  533. package/dist/unstable/cli/Flag.d.ts.map +1 -1
  534. package/dist/unstable/cli/Flag.js +79 -90
  535. package/dist/unstable/cli/Flag.js.map +1 -1
  536. package/dist/unstable/cli/GlobalFlag.d.ts +3 -3
  537. package/dist/unstable/cli/GlobalFlag.js +13 -13
  538. package/dist/unstable/cli/GlobalFlag.js.map +1 -1
  539. package/dist/unstable/cli/Param.d.ts +118 -126
  540. package/dist/unstable/cli/Param.d.ts.map +1 -1
  541. package/dist/unstable/cli/Param.js +104 -113
  542. package/dist/unstable/cli/Param.js.map +1 -1
  543. package/dist/unstable/cli/Primitive.d.ts +69 -58
  544. package/dist/unstable/cli/Primitive.d.ts.map +1 -1
  545. package/dist/unstable/cli/Primitive.js +65 -66
  546. package/dist/unstable/cli/Primitive.js.map +1 -1
  547. package/dist/unstable/cli/Prompt.d.ts +23 -24
  548. package/dist/unstable/cli/Prompt.d.ts.map +1 -1
  549. package/dist/unstable/cli/Prompt.js +68 -63
  550. package/dist/unstable/cli/Prompt.js.map +1 -1
  551. package/dist/unstable/cli/internal/completions/descriptor.js +23 -11
  552. package/dist/unstable/cli/internal/completions/descriptor.js.map +1 -1
  553. package/dist/unstable/cli/internal/completions/zsh.js +2 -2
  554. package/dist/unstable/cli/internal/completions/zsh.js.map +1 -1
  555. package/dist/unstable/cli/internal/config.js +4 -4
  556. package/dist/unstable/cli/internal/parser.js +1 -1
  557. package/dist/unstable/cli/internal/parser.js.map +1 -1
  558. package/dist/unstable/cli/internal/wizard.d.ts.map +1 -1
  559. package/dist/unstable/cli/internal/wizard.js +14 -13
  560. package/dist/unstable/cli/internal/wizard.js.map +1 -1
  561. package/dist/unstable/cluster/ClusterSchema.d.ts +13 -0
  562. package/dist/unstable/cluster/ClusterSchema.d.ts.map +1 -1
  563. package/dist/unstable/cluster/ClusterSchema.js +16 -1
  564. package/dist/unstable/cluster/ClusterSchema.js.map +1 -1
  565. package/dist/unstable/cluster/ClusterWorkflowEngine.d.ts.map +1 -1
  566. package/dist/unstable/cluster/ClusterWorkflowEngine.js +57 -14
  567. package/dist/unstable/cluster/ClusterWorkflowEngine.js.map +1 -1
  568. package/dist/unstable/cluster/Entity.d.ts.map +1 -1
  569. package/dist/unstable/cluster/Entity.js +2 -0
  570. package/dist/unstable/cluster/Entity.js.map +1 -1
  571. package/dist/unstable/cluster/EntityProxyServer.d.ts +2 -2
  572. package/dist/unstable/cluster/EntityProxyServer.d.ts.map +1 -1
  573. package/dist/unstable/cluster/EntityProxyServer.js.map +1 -1
  574. package/dist/unstable/cluster/Envelope.d.ts +4 -4
  575. package/dist/unstable/cluster/Envelope.d.ts.map +1 -1
  576. package/dist/unstable/cluster/Envelope.js +2 -3
  577. package/dist/unstable/cluster/Envelope.js.map +1 -1
  578. package/dist/unstable/cluster/HttpRunner.d.ts.map +1 -1
  579. package/dist/unstable/cluster/HttpRunner.js +5 -2
  580. package/dist/unstable/cluster/HttpRunner.js.map +1 -1
  581. package/dist/unstable/cluster/MessageStorage.d.ts +34 -4
  582. package/dist/unstable/cluster/MessageStorage.d.ts.map +1 -1
  583. package/dist/unstable/cluster/MessageStorage.js +28 -9
  584. package/dist/unstable/cluster/MessageStorage.js.map +1 -1
  585. package/dist/unstable/cluster/Reply.d.ts +1 -1
  586. package/dist/unstable/cluster/Sharding.d.ts +1 -1
  587. package/dist/unstable/cluster/Sharding.d.ts.map +1 -1
  588. package/dist/unstable/cluster/Sharding.js +32 -17
  589. package/dist/unstable/cluster/Sharding.js.map +1 -1
  590. package/dist/unstable/cluster/ShardingConfig.js +23 -23
  591. package/dist/unstable/cluster/ShardingConfig.js.map +1 -1
  592. package/dist/unstable/cluster/SocketRunner.d.ts +2 -2
  593. package/dist/unstable/cluster/SocketRunner.d.ts.map +1 -1
  594. package/dist/unstable/cluster/SocketRunner.js +4 -3
  595. package/dist/unstable/cluster/SocketRunner.js.map +1 -1
  596. package/dist/unstable/cluster/SqlMessageStorage.js +11 -8
  597. package/dist/unstable/cluster/SqlMessageStorage.js.map +1 -1
  598. package/dist/unstable/cluster/SqlRunnerStorage.d.ts.map +1 -1
  599. package/dist/unstable/cluster/SqlRunnerStorage.js +11 -4
  600. package/dist/unstable/cluster/SqlRunnerStorage.js.map +1 -1
  601. package/dist/unstable/cluster/internal/clusterAbandon.d.ts +5 -0
  602. package/dist/unstable/cluster/internal/clusterAbandon.d.ts.map +1 -0
  603. package/dist/unstable/cluster/internal/clusterAbandon.js +9 -0
  604. package/dist/unstable/cluster/internal/clusterAbandon.js.map +1 -0
  605. package/dist/unstable/cluster/internal/entityManager.js +7 -4
  606. package/dist/unstable/cluster/internal/entityManager.js.map +1 -1
  607. package/dist/unstable/cluster/internal/interruptors.js +30 -1
  608. package/dist/unstable/cluster/internal/interruptors.js.map +1 -1
  609. package/dist/unstable/cluster/internal/resourceRef.js +12 -7
  610. package/dist/unstable/cluster/internal/resourceRef.js.map +1 -1
  611. package/dist/unstable/devtools/DevToolsClient.d.ts.map +1 -1
  612. package/dist/unstable/devtools/DevToolsClient.js +12 -7
  613. package/dist/unstable/devtools/DevToolsClient.js.map +1 -1
  614. package/dist/unstable/encoding/Ini.d.ts +2 -0
  615. package/dist/unstable/encoding/Ini.d.ts.map +1 -1
  616. package/dist/unstable/encoding/Ini.js +2 -0
  617. package/dist/unstable/encoding/Ini.js.map +1 -1
  618. package/dist/unstable/encoding/SchemaBinary.d.ts +27 -3
  619. package/dist/unstable/encoding/SchemaBinary.d.ts.map +1 -1
  620. package/dist/unstable/encoding/SchemaBinary.js +108 -39
  621. package/dist/unstable/encoding/SchemaBinary.js.map +1 -1
  622. package/dist/unstable/encoding/Sse.js +1 -1
  623. package/dist/unstable/encoding/Sse.js.map +1 -1
  624. package/dist/unstable/encoding/Toml.d.ts +2 -0
  625. package/dist/unstable/encoding/Toml.d.ts.map +1 -1
  626. package/dist/unstable/encoding/Toml.js +6 -4
  627. package/dist/unstable/encoding/Toml.js.map +1 -1
  628. package/dist/unstable/encoding/Yaml.d.ts +2 -0
  629. package/dist/unstable/encoding/Yaml.d.ts.map +1 -1
  630. package/dist/unstable/encoding/Yaml.js +16 -5
  631. package/dist/unstable/encoding/Yaml.js.map +1 -1
  632. package/dist/unstable/encoding/index.d.ts +0 -4
  633. package/dist/unstable/encoding/index.d.ts.map +1 -1
  634. package/dist/unstable/encoding/index.js +0 -4
  635. package/dist/unstable/encoding/index.js.map +1 -1
  636. package/dist/unstable/eventlog/Event.d.ts +5 -5
  637. package/dist/unstable/eventlog/Event.d.ts.map +1 -1
  638. package/dist/unstable/eventlog/Event.js +3 -3
  639. package/dist/unstable/eventlog/Event.js.map +1 -1
  640. package/dist/unstable/eventlog/EventJournal.d.ts +7 -7
  641. package/dist/unstable/eventlog/EventJournal.d.ts.map +1 -1
  642. package/dist/unstable/eventlog/EventJournal.js +9 -9
  643. package/dist/unstable/eventlog/EventJournal.js.map +1 -1
  644. package/dist/unstable/eventlog/EventLog.d.ts +1 -1
  645. package/dist/unstable/eventlog/EventLog.d.ts.map +1 -1
  646. package/dist/unstable/eventlog/EventLog.js +4 -4
  647. package/dist/unstable/eventlog/EventLog.js.map +1 -1
  648. package/dist/unstable/eventlog/EventLogMessage.d.ts +11 -5
  649. package/dist/unstable/eventlog/EventLogMessage.d.ts.map +1 -1
  650. package/dist/unstable/eventlog/EventLogMessage.js +25 -15
  651. package/dist/unstable/eventlog/EventLogMessage.js.map +1 -1
  652. package/dist/unstable/eventlog/EventLogRemote.d.ts +7 -1
  653. package/dist/unstable/eventlog/EventLogRemote.d.ts.map +1 -1
  654. package/dist/unstable/eventlog/EventLogRemote.js +13 -3
  655. package/dist/unstable/eventlog/EventLogRemote.js.map +1 -1
  656. package/dist/unstable/eventlog/EventLogServerUnencrypted.js +2 -2
  657. package/dist/unstable/eventlog/EventLogServerUnencrypted.js.map +1 -1
  658. package/dist/unstable/eventlog/SqlEventJournal.d.ts.map +1 -1
  659. package/dist/unstable/eventlog/SqlEventJournal.js +26 -13
  660. package/dist/unstable/eventlog/SqlEventJournal.js.map +1 -1
  661. package/dist/unstable/eventlog/SqlEventLogServerUnencrypted.d.ts.map +1 -1
  662. package/dist/unstable/eventlog/SqlEventLogServerUnencrypted.js +5 -1
  663. package/dist/unstable/eventlog/SqlEventLogServerUnencrypted.js.map +1 -1
  664. package/dist/unstable/http/Cookies.d.ts +1 -45
  665. package/dist/unstable/http/Cookies.d.ts.map +1 -1
  666. package/dist/unstable/http/Cookies.js +2 -64
  667. package/dist/unstable/http/Cookies.js.map +1 -1
  668. package/dist/unstable/http/FetchHttpClient.js +1 -1
  669. package/dist/unstable/http/FetchHttpClient.js.map +1 -1
  670. package/dist/unstable/http/FindMyWay/internal/router.js +124 -33
  671. package/dist/unstable/http/FindMyWay/internal/router.js.map +1 -1
  672. package/dist/unstable/http/FindMyWay.d.ts +15 -5
  673. package/dist/unstable/http/FindMyWay.d.ts.map +1 -1
  674. package/dist/unstable/http/FindMyWay.js +3 -1
  675. package/dist/unstable/http/FindMyWay.js.map +1 -1
  676. package/dist/unstable/http/Headers.d.ts +0 -22
  677. package/dist/unstable/http/Headers.d.ts.map +1 -1
  678. package/dist/unstable/http/Headers.js +3 -34
  679. package/dist/unstable/http/Headers.js.map +1 -1
  680. package/dist/unstable/http/HttpBody.d.ts +41 -10
  681. package/dist/unstable/http/HttpBody.d.ts.map +1 -1
  682. package/dist/unstable/http/HttpBody.js +64 -10
  683. package/dist/unstable/http/HttpBody.js.map +1 -1
  684. package/dist/unstable/http/HttpClient.d.ts +1 -1
  685. package/dist/unstable/http/HttpClient.d.ts.map +1 -1
  686. package/dist/unstable/http/HttpClient.js +28 -18
  687. package/dist/unstable/http/HttpClient.js.map +1 -1
  688. package/dist/unstable/http/HttpClientRequest.d.ts +28 -6
  689. package/dist/unstable/http/HttpClientRequest.d.ts.map +1 -1
  690. package/dist/unstable/http/HttpClientRequest.js +8 -19
  691. package/dist/unstable/http/HttpClientRequest.js.map +1 -1
  692. package/dist/unstable/http/HttpClientResponse.d.ts +6 -1
  693. package/dist/unstable/http/HttpClientResponse.d.ts.map +1 -1
  694. package/dist/unstable/http/HttpClientResponse.js +10 -6
  695. package/dist/unstable/http/HttpClientResponse.js.map +1 -1
  696. package/dist/unstable/http/HttpEffect.d.ts +16 -0
  697. package/dist/unstable/http/HttpEffect.d.ts.map +1 -1
  698. package/dist/unstable/http/HttpEffect.js +121 -65
  699. package/dist/unstable/http/HttpEffect.js.map +1 -1
  700. package/dist/unstable/http/HttpIncomingMessage.d.ts +3 -3
  701. package/dist/unstable/http/HttpIncomingMessage.d.ts.map +1 -1
  702. package/dist/unstable/http/HttpIncomingMessage.js +1 -13
  703. package/dist/unstable/http/HttpIncomingMessage.js.map +1 -1
  704. package/dist/unstable/http/HttpMiddleware.d.ts +1 -1
  705. package/dist/unstable/http/HttpMiddleware.d.ts.map +1 -1
  706. package/dist/unstable/http/HttpMiddleware.js +29 -21
  707. package/dist/unstable/http/HttpMiddleware.js.map +1 -1
  708. package/dist/unstable/http/HttpPlatform.d.ts +12 -11
  709. package/dist/unstable/http/HttpPlatform.d.ts.map +1 -1
  710. package/dist/unstable/http/HttpPlatform.js +36 -10
  711. package/dist/unstable/http/HttpPlatform.js.map +1 -1
  712. package/dist/unstable/http/HttpRouter.d.ts +5 -1
  713. package/dist/unstable/http/HttpRouter.d.ts.map +1 -1
  714. package/dist/unstable/http/HttpRouter.js +22 -8
  715. package/dist/unstable/http/HttpRouter.js.map +1 -1
  716. package/dist/unstable/http/HttpServer.d.ts +11 -42
  717. package/dist/unstable/http/HttpServer.d.ts.map +1 -1
  718. package/dist/unstable/http/HttpServer.js +16 -20
  719. package/dist/unstable/http/HttpServer.js.map +1 -1
  720. package/dist/unstable/http/HttpServerRequest.d.ts.map +1 -1
  721. package/dist/unstable/http/HttpServerRequest.js +11 -11
  722. package/dist/unstable/http/HttpServerRequest.js.map +1 -1
  723. package/dist/unstable/http/HttpServerRespondable.js +1 -1
  724. package/dist/unstable/http/HttpServerRespondable.js.map +1 -1
  725. package/dist/unstable/http/HttpServerResponse.d.ts +9 -13
  726. package/dist/unstable/http/HttpServerResponse.d.ts.map +1 -1
  727. package/dist/unstable/http/HttpServerResponse.js +34 -44
  728. package/dist/unstable/http/HttpServerResponse.js.map +1 -1
  729. package/dist/unstable/http/HttpStaticServer.d.ts +2 -2
  730. package/dist/unstable/http/HttpStaticServer.d.ts.map +1 -1
  731. package/dist/unstable/http/HttpStaticServer.js +19 -19
  732. package/dist/unstable/http/HttpStaticServer.js.map +1 -1
  733. package/dist/unstable/http/Mime.d.ts +28 -0
  734. package/dist/unstable/http/Mime.d.ts.map +1 -0
  735. package/dist/unstable/http/Mime.js +72 -0
  736. package/dist/unstable/http/Mime.js.map +1 -0
  737. package/dist/unstable/http/Multipart.d.ts +22 -9
  738. package/dist/unstable/http/Multipart.d.ts.map +1 -1
  739. package/dist/unstable/http/Multipart.js +26 -10
  740. package/dist/unstable/http/Multipart.js.map +1 -1
  741. package/dist/unstable/http/MultipartParser/internal/multipart.d.ts +1 -1
  742. package/dist/unstable/http/MultipartParser/internal/multipart.d.ts.map +1 -1
  743. package/dist/unstable/http/MultipartParser/internal/multipart.js +8 -3
  744. package/dist/unstable/http/MultipartParser/internal/multipart.js.map +1 -1
  745. package/dist/unstable/http/MultipartParser.d.ts +4 -3
  746. package/dist/unstable/http/MultipartParser.d.ts.map +1 -1
  747. package/dist/unstable/http/MultipartParser.js.map +1 -1
  748. package/dist/unstable/http/UrlParams.d.ts +0 -97
  749. package/dist/unstable/http/UrlParams.d.ts.map +1 -1
  750. package/dist/unstable/http/UrlParams.js +3 -104
  751. package/dist/unstable/http/UrlParams.js.map +1 -1
  752. package/dist/unstable/http/index.d.ts +4 -0
  753. package/dist/unstable/http/index.d.ts.map +1 -1
  754. package/dist/unstable/http/index.js +4 -0
  755. package/dist/unstable/http/index.js.map +1 -1
  756. package/dist/unstable/http/internal/compression.js +8 -11
  757. package/dist/unstable/http/internal/compression.js.map +1 -1
  758. package/dist/unstable/http/internal/headers.d.ts +2 -0
  759. package/dist/unstable/http/internal/headers.d.ts.map +1 -0
  760. package/dist/unstable/http/internal/headers.js +5 -0
  761. package/dist/unstable/http/internal/headers.js.map +1 -0
  762. package/dist/unstable/http/internal/httpBody.js +8 -0
  763. package/dist/unstable/http/internal/httpBody.js.map +1 -1
  764. package/dist/unstable/http/internal/mimeTypes.d.ts +361 -0
  765. package/dist/unstable/http/internal/mimeTypes.d.ts.map +1 -0
  766. package/dist/unstable/http/internal/mimeTypes.js +363 -0
  767. package/dist/unstable/http/internal/mimeTypes.js.map +1 -0
  768. package/dist/unstable/httpapi/HttpApiBuilder.d.ts +13 -0
  769. package/dist/unstable/httpapi/HttpApiBuilder.d.ts.map +1 -1
  770. package/dist/unstable/httpapi/HttpApiBuilder.js +23 -6
  771. package/dist/unstable/httpapi/HttpApiBuilder.js.map +1 -1
  772. package/dist/unstable/httpapi/HttpApiClient.d.ts +4 -3
  773. package/dist/unstable/httpapi/HttpApiClient.d.ts.map +1 -1
  774. package/dist/unstable/httpapi/HttpApiClient.js +25 -13
  775. package/dist/unstable/httpapi/HttpApiClient.js.map +1 -1
  776. package/dist/unstable/httpapi/HttpApiEndpoint.d.ts +8 -3
  777. package/dist/unstable/httpapi/HttpApiEndpoint.d.ts.map +1 -1
  778. package/dist/unstable/httpapi/HttpApiEndpoint.js +9 -6
  779. package/dist/unstable/httpapi/HttpApiEndpoint.js.map +1 -1
  780. package/dist/unstable/httpapi/HttpApiError.d.ts.map +1 -1
  781. package/dist/unstable/httpapi/HttpApiError.js +3 -1
  782. package/dist/unstable/httpapi/HttpApiError.js.map +1 -1
  783. package/dist/unstable/httpapi/HttpApiMiddleware.d.ts.map +1 -1
  784. package/dist/unstable/httpapi/HttpApiMiddleware.js +7 -5
  785. package/dist/unstable/httpapi/HttpApiMiddleware.js.map +1 -1
  786. package/dist/unstable/httpapi/HttpApiSchema.d.ts +12 -0
  787. package/dist/unstable/httpapi/HttpApiSchema.d.ts.map +1 -1
  788. package/dist/unstable/httpapi/HttpApiSchema.js +8 -10
  789. package/dist/unstable/httpapi/HttpApiSchema.js.map +1 -1
  790. package/dist/unstable/httpapi/HttpApiTest.d.ts.map +1 -1
  791. package/dist/unstable/httpapi/HttpApiTest.js +8 -2
  792. package/dist/unstable/httpapi/HttpApiTest.js.map +1 -1
  793. package/dist/unstable/httpapi/OpenApi.d.ts.map +1 -1
  794. package/dist/unstable/httpapi/OpenApi.js +31 -20
  795. package/dist/unstable/httpapi/OpenApi.js.map +1 -1
  796. package/dist/unstable/net/IpInterface.d.ts +140 -0
  797. package/dist/unstable/net/IpInterface.d.ts.map +1 -0
  798. package/dist/unstable/net/IpInterface.js +149 -0
  799. package/dist/unstable/net/IpInterface.js.map +1 -0
  800. package/dist/unstable/net/IpNetwork.d.ts +227 -0
  801. package/dist/unstable/net/IpNetwork.d.ts.map +1 -0
  802. package/dist/unstable/net/IpNetwork.js +239 -0
  803. package/dist/unstable/net/IpNetwork.js.map +1 -0
  804. package/dist/unstable/net/NetAddress.d.ts +705 -0
  805. package/dist/unstable/net/NetAddress.d.ts.map +1 -0
  806. package/dist/unstable/net/NetAddress.js +956 -0
  807. package/dist/unstable/net/NetAddress.js.map +1 -0
  808. package/dist/unstable/net/index.d.ts +16 -0
  809. package/dist/unstable/net/index.d.ts.map +1 -0
  810. package/dist/unstable/net/index.js +17 -0
  811. package/dist/unstable/net/index.js.map +1 -0
  812. package/dist/unstable/observability/OtlpExporter.d.ts +1 -0
  813. package/dist/unstable/observability/OtlpExporter.d.ts.map +1 -1
  814. package/dist/unstable/observability/OtlpExporter.js +4 -6
  815. package/dist/unstable/observability/OtlpExporter.js.map +1 -1
  816. package/dist/unstable/observability/OtlpLogger.js +9 -9
  817. package/dist/unstable/observability/OtlpLogger.js.map +1 -1
  818. package/dist/unstable/observability/OtlpMetrics.d.ts.map +1 -1
  819. package/dist/unstable/observability/OtlpMetrics.js +9 -8
  820. package/dist/unstable/observability/OtlpMetrics.js.map +1 -1
  821. package/dist/unstable/observability/OtlpResource.d.ts.map +1 -1
  822. package/dist/unstable/observability/OtlpResource.js +2 -2
  823. package/dist/unstable/observability/OtlpResource.js.map +1 -1
  824. package/dist/unstable/observability/OtlpTracer.d.ts.map +1 -1
  825. package/dist/unstable/observability/OtlpTracer.js +82 -55
  826. package/dist/unstable/observability/OtlpTracer.js.map +1 -1
  827. package/dist/unstable/observability/internal/otlpEnv.d.ts +1 -1
  828. package/dist/unstable/observability/internal/otlpEnv.d.ts.map +1 -1
  829. package/dist/unstable/observability/internal/otlpEnv.js +5 -9
  830. package/dist/unstable/observability/internal/otlpEnv.js.map +1 -1
  831. package/dist/unstable/persistence/PersistedCache.js +1 -1
  832. package/dist/unstable/persistence/PersistedCache.js.map +1 -1
  833. package/dist/unstable/persistence/PersistedQueue.d.ts +114 -14
  834. package/dist/unstable/persistence/PersistedQueue.d.ts.map +1 -1
  835. package/dist/unstable/persistence/PersistedQueue.js +799 -234
  836. package/dist/unstable/persistence/PersistedQueue.js.map +1 -1
  837. package/dist/unstable/persistence/RateLimiter.d.ts +28 -15
  838. package/dist/unstable/persistence/RateLimiter.d.ts.map +1 -1
  839. package/dist/unstable/persistence/RateLimiter.js +33 -41
  840. package/dist/unstable/persistence/RateLimiter.js.map +1 -1
  841. package/dist/unstable/process/ChildProcess.d.ts +8 -2
  842. package/dist/unstable/process/ChildProcess.d.ts.map +1 -1
  843. package/dist/unstable/process/ChildProcess.js +7 -2
  844. package/dist/unstable/process/ChildProcess.js.map +1 -1
  845. package/dist/unstable/process/ChildProcessSpawner.d.ts +1 -1
  846. package/dist/unstable/process/ChildProcessSpawner.d.ts.map +1 -1
  847. package/dist/unstable/process/ChildProcessSpawner.js +1 -1
  848. package/dist/unstable/process/ChildProcessSpawner.js.map +1 -1
  849. package/dist/unstable/reactivity/Atom.d.ts.map +1 -1
  850. package/dist/unstable/reactivity/Atom.js +6 -3
  851. package/dist/unstable/reactivity/Atom.js.map +1 -1
  852. package/dist/unstable/reactivity/AtomHttpApi.d.ts +3 -6
  853. package/dist/unstable/reactivity/AtomHttpApi.d.ts.map +1 -1
  854. package/dist/unstable/reactivity/AtomHttpApi.js +6 -3
  855. package/dist/unstable/reactivity/AtomHttpApi.js.map +1 -1
  856. package/dist/unstable/reactivity/AtomRegistry.js +2 -3
  857. package/dist/unstable/reactivity/AtomRegistry.js.map +1 -1
  858. package/dist/unstable/reactivity/AtomRpc.d.ts +2 -2
  859. package/dist/unstable/reactivity/AtomRpc.d.ts.map +1 -1
  860. package/dist/unstable/reactivity/AtomRpc.js +1 -1
  861. package/dist/unstable/reactivity/AtomRpc.js.map +1 -1
  862. package/dist/unstable/reactivity/Hydration.d.ts +6 -4
  863. package/dist/unstable/reactivity/Hydration.d.ts.map +1 -1
  864. package/dist/unstable/reactivity/Hydration.js +20 -6
  865. package/dist/unstable/reactivity/Hydration.js.map +1 -1
  866. package/dist/unstable/reactivity/Reactivity.d.ts +26 -26
  867. package/dist/unstable/reactivity/Reactivity.d.ts.map +1 -1
  868. package/dist/unstable/reactivity/Reactivity.js +10 -12
  869. package/dist/unstable/reactivity/Reactivity.js.map +1 -1
  870. package/dist/unstable/rpc/RpcClient.d.ts.map +1 -1
  871. package/dist/unstable/rpc/RpcClient.js +64 -64
  872. package/dist/unstable/rpc/RpcClient.js.map +1 -1
  873. package/dist/unstable/rpc/RpcClientError.d.ts +1 -1
  874. package/dist/unstable/rpc/RpcMessage.d.ts +3 -1
  875. package/dist/unstable/rpc/RpcMessage.d.ts.map +1 -1
  876. package/dist/unstable/rpc/RpcMessage.js +1 -1
  877. package/dist/unstable/rpc/RpcMessage.js.map +1 -1
  878. package/dist/unstable/rpc/RpcMiddleware.d.ts.map +1 -1
  879. package/dist/unstable/rpc/RpcMiddleware.js +7 -5
  880. package/dist/unstable/rpc/RpcMiddleware.js.map +1 -1
  881. package/dist/unstable/rpc/RpcSerialization.d.ts +5 -39
  882. package/dist/unstable/rpc/RpcSerialization.d.ts.map +1 -1
  883. package/dist/unstable/rpc/RpcSerialization.js +22 -115
  884. package/dist/unstable/rpc/RpcSerialization.js.map +1 -1
  885. package/dist/unstable/rpc/RpcServer.d.ts.map +1 -1
  886. package/dist/unstable/rpc/RpcServer.js +104 -57
  887. package/dist/unstable/rpc/RpcServer.js.map +1 -1
  888. package/dist/unstable/schema/Model.d.ts.map +1 -1
  889. package/dist/unstable/schema/Model.js +7 -6
  890. package/dist/unstable/schema/Model.js.map +1 -1
  891. package/dist/unstable/schema/VariantSchema.d.ts.map +1 -1
  892. package/dist/unstable/schema/VariantSchema.js +3 -0
  893. package/dist/unstable/schema/VariantSchema.js.map +1 -1
  894. package/dist/unstable/socket/Socket.d.ts +287 -102
  895. package/dist/unstable/socket/Socket.d.ts.map +1 -1
  896. package/dist/unstable/socket/Socket.js +408 -215
  897. package/dist/unstable/socket/Socket.js.map +1 -1
  898. package/dist/unstable/socket/SocketServer.d.ts +5 -32
  899. package/dist/unstable/socket/SocketServer.d.ts.map +1 -1
  900. package/dist/unstable/socket/SocketServer.js +3 -3
  901. package/dist/unstable/socket/SocketServer.js.map +1 -1
  902. package/dist/unstable/sql/SqlClient.d.ts +20 -0
  903. package/dist/unstable/sql/SqlClient.d.ts.map +1 -1
  904. package/dist/unstable/sql/SqlClient.js +14 -7
  905. package/dist/unstable/sql/SqlClient.js.map +1 -1
  906. package/dist/unstable/sql/SqlConnection.d.ts +15 -0
  907. package/dist/unstable/sql/SqlConnection.d.ts.map +1 -1
  908. package/dist/unstable/sql/SqlConnection.js.map +1 -1
  909. package/dist/unstable/sql/SqlModel.d.ts +1 -1
  910. package/dist/unstable/sql/SqlModel.d.ts.map +1 -1
  911. package/dist/unstable/sql/Statement.d.ts +13 -5
  912. package/dist/unstable/sql/Statement.d.ts.map +1 -1
  913. package/dist/unstable/sql/Statement.js +29 -15
  914. package/dist/unstable/sql/Statement.js.map +1 -1
  915. package/dist/unstable/workers/Transferable.js +1 -1
  916. package/dist/unstable/workers/Worker.d.ts.map +1 -1
  917. package/dist/unstable/workers/Worker.js +3 -1
  918. package/dist/unstable/workers/Worker.js.map +1 -1
  919. package/dist/unstable/workflow/Activity.d.ts +7 -0
  920. package/dist/unstable/workflow/Activity.d.ts.map +1 -1
  921. package/dist/unstable/workflow/Activity.js +14 -4
  922. package/dist/unstable/workflow/Activity.js.map +1 -1
  923. package/dist/unstable/workflow/DurableClock.js +1 -1
  924. package/dist/unstable/workflow/DurableClock.js.map +1 -1
  925. package/dist/unstable/workflow/DurableDeferred.d.ts +2 -2
  926. package/dist/unstable/workflow/DurableDeferred.d.ts.map +1 -1
  927. package/dist/unstable/workflow/DurableDeferred.js.map +1 -1
  928. package/dist/unstable/workflow/DurableQueue.d.ts +8 -0
  929. package/dist/unstable/workflow/DurableQueue.d.ts.map +1 -1
  930. package/dist/unstable/workflow/DurableQueue.js +8 -0
  931. package/dist/unstable/workflow/DurableQueue.js.map +1 -1
  932. package/dist/unstable/workflow/Workflow.d.ts +5 -0
  933. package/dist/unstable/workflow/Workflow.d.ts.map +1 -1
  934. package/dist/unstable/workflow/Workflow.js +70 -12
  935. package/dist/unstable/workflow/Workflow.js.map +1 -1
  936. package/dist/unstable/workflow/WorkflowEngine.d.ts +6 -0
  937. package/dist/unstable/workflow/WorkflowEngine.d.ts.map +1 -1
  938. package/dist/unstable/workflow/WorkflowEngine.js +11 -0
  939. package/dist/unstable/workflow/WorkflowEngine.js.map +1 -1
  940. package/package.json +7 -9
  941. package/src/Array.ts +118 -67
  942. package/src/BigDecimal.ts +50 -28
  943. package/src/ByteSize.ts +838 -0
  944. package/src/Cache.ts +17 -3
  945. package/src/Cause.ts +1 -1
  946. package/src/Channel.ts +183 -48
  947. package/src/Chunk.ts +65 -36
  948. package/src/Config.ts +237 -248
  949. package/src/ConfigProvider.ts +7 -8
  950. package/src/Context.ts +31 -0
  951. package/src/Cron.ts +2 -2
  952. package/src/Crypto.ts +3 -2
  953. package/src/Deferred.ts +7 -6
  954. package/src/Duration.ts +1 -1
  955. package/src/Effect.ts +226 -122
  956. package/src/Effectable.ts +78 -9
  957. package/src/Encoding.ts +101 -11
  958. package/src/Equal.ts +1 -1
  959. package/src/ExecutionPlan.ts +3 -0
  960. package/src/Fiber.ts +33 -8
  961. package/src/FiberHandle.ts +3 -3
  962. package/src/FiberMap.ts +19 -10
  963. package/src/FileSystem.ts +55 -230
  964. package/src/Formatter.ts +21 -3
  965. package/src/Graph.ts +55 -25
  966. package/src/Hash.ts +5 -16
  967. package/src/HashRing.ts +9 -2
  968. package/src/HashSet.ts +56 -0
  969. package/src/Iterable.ts +66 -41
  970. package/src/JsonPatch.ts +4 -4
  971. package/src/JsonPointer.ts +97 -4
  972. package/src/JsonSchema.ts +8 -26
  973. package/src/Layer.ts +59 -18
  974. package/src/LayerMap.ts +8 -6
  975. package/src/LayerRef.ts +7 -5
  976. package/src/Logger.ts +125 -18
  977. package/src/ManagedRuntime.ts +1 -1
  978. package/src/Match.ts +33 -14
  979. package/src/Metric.ts +24 -21
  980. package/src/MutableHashMap.ts +1 -1
  981. package/src/MutableHashSet.ts +1 -1
  982. package/src/MutableList.ts +18 -2
  983. package/src/Number.ts +7 -1
  984. package/src/Optic.ts +8 -4
  985. package/src/Option.ts +1 -1
  986. package/src/Order.ts +3 -1
  987. package/src/PartitionedSemaphore.ts +1 -2
  988. package/src/Path.ts +1 -1
  989. package/src/PlatformError.ts +1 -1
  990. package/src/Pool.ts +125 -8
  991. package/src/PrimaryKey.ts +1 -1
  992. package/src/PubSub.ts +32 -20
  993. package/src/Queue.ts +119 -28
  994. package/src/Random.ts +20 -6
  995. package/src/RcMap.ts +20 -13
  996. package/src/Redacted.ts +1 -1
  997. package/src/RequestResolver.ts +49 -26
  998. package/src/Result.ts +1 -1
  999. package/src/Scheduler.ts +21 -11
  1000. package/src/Schema.ts +4809 -6368
  1001. package/src/SchemaAST.ts +1031 -284
  1002. package/src/SchemaGetter.ts +75 -21
  1003. package/src/SchemaIssue.ts +259 -15
  1004. package/src/SchemaParser.ts +2 -12
  1005. package/src/SchemaRepresentation.ts +1593 -29
  1006. package/src/SchemaTransformation.ts +145 -22
  1007. package/src/ScopedCache.ts +10 -3
  1008. package/src/Sink.ts +31 -15
  1009. package/src/Stream.ts +294 -76
  1010. package/src/String.ts +20 -9
  1011. package/src/Struct.ts +8 -4
  1012. package/src/SynchronizedRef.ts +3 -5
  1013. package/src/Terminal.ts +3 -3
  1014. package/src/Tracer.ts +43 -14
  1015. package/src/Tuple.ts +3 -1
  1016. package/src/TxChunk.ts +1 -1
  1017. package/src/TxDeferred.ts +1 -1
  1018. package/src/TxHashMap.ts +1 -1
  1019. package/src/TxHashSet.ts +92 -11
  1020. package/src/TxPriorityQueue.ts +1 -1
  1021. package/src/TxPubSub.ts +1 -1
  1022. package/src/TxQueue.ts +22 -17
  1023. package/src/TxReentrantLock.ts +29 -1
  1024. package/src/TxRef.ts +1 -1
  1025. package/src/TxSemaphore.ts +1 -1
  1026. package/src/TxSubscriptionRef.ts +1 -1
  1027. package/src/Types.ts +40 -17
  1028. package/src/Utils.ts +3 -1
  1029. package/src/index.ts +5 -0
  1030. package/src/internal/arbitrary/model.ts +701 -0
  1031. package/src/internal/arbitrary/regexp.ts +855 -0
  1032. package/src/internal/arbitrary/runner.ts +608 -0
  1033. package/src/internal/arbitrary/schema.ts +1800 -0
  1034. package/src/internal/core.ts +48 -22
  1035. package/src/internal/count.ts +14 -0
  1036. package/src/internal/dateTime.ts +8 -10
  1037. package/src/internal/effect.ts +475 -295
  1038. package/src/internal/graph.ts +6 -1
  1039. package/src/internal/hashMap.ts +5 -3
  1040. package/src/internal/hashSet.ts +1 -1
  1041. package/src/internal/matcher.ts +34 -19
  1042. package/src/internal/metric.ts +1 -1
  1043. package/src/internal/option.ts +8 -6
  1044. package/src/internal/random.ts +20 -7
  1045. package/src/internal/rcRef.ts +10 -7
  1046. package/src/internal/references.ts +1 -0
  1047. package/src/internal/request.ts +12 -7
  1048. package/src/internal/result.ts +15 -11
  1049. package/src/internal/schema/annotations.ts +3 -3
  1050. package/src/internal/schema/fromJsonSchemaDocument.ts +14 -29
  1051. package/src/internal/schema/fromRepresentation.ts +5 -3
  1052. package/src/internal/schema/{schema.ts → make.ts} +0 -40
  1053. package/src/internal/schema/parser.ts +8 -0
  1054. package/src/internal/schema/standardSchema.ts +125 -0
  1055. package/src/internal/schema/toCodeDocument.ts +58 -44
  1056. package/src/internal/schema/toCodec.ts +312 -0
  1057. package/src/internal/schema/toDifferJsonPatch.ts +24 -0
  1058. package/src/internal/schema/toEncoderXml.ts +110 -0
  1059. package/src/internal/schema/toEquivalence.ts +76 -0
  1060. package/src/internal/schema/toFormatter.ts +230 -0
  1061. package/src/internal/schema/toIso.ts +20 -0
  1062. package/src/internal/schema/toJsonSchemaDocument.ts +125 -67
  1063. package/src/internal/schema/toRepresentation.ts +1 -1
  1064. package/src/internal/schemaError.ts +8 -0
  1065. package/src/internal/stream.ts +14 -6
  1066. package/src/internal/tracer.ts +4 -0
  1067. package/src/internal/trie.ts +5 -2
  1068. package/src/internal/uuid.ts +4 -0
  1069. package/src/testing/TestSchema.ts +36 -30
  1070. package/src/testing/index.ts +0 -5
  1071. package/src/unstable/ai/AiError.ts +69 -5
  1072. package/src/unstable/ai/AnthropicStructuredOutput.ts +4 -1
  1073. package/src/unstable/ai/Chat.ts +35 -36
  1074. package/src/unstable/ai/EmbeddingModel.ts +27 -15
  1075. package/src/unstable/ai/LanguageModel.ts +283 -100
  1076. package/src/unstable/ai/McpServer.ts +36 -20
  1077. package/src/unstable/ai/OpenAiStructuredOutput.ts +4 -1
  1078. package/src/unstable/ai/Prompt.ts +19 -4
  1079. package/src/unstable/ai/Response.ts +107 -189
  1080. package/src/unstable/ai/Tokenizer.ts +4 -5
  1081. package/src/unstable/ai/Tool.ts +58 -35
  1082. package/src/unstable/ai/Toolkit.ts +43 -37
  1083. package/src/unstable/ai/internal/structured-output.ts +5 -5
  1084. package/src/unstable/arbitrary/Arbitrary.ts +715 -0
  1085. package/src/unstable/arbitrary/index.ts +10 -0
  1086. package/src/unstable/cli/Argument.ts +111 -115
  1087. package/src/unstable/cli/CliError.ts +2 -0
  1088. package/src/unstable/cli/CliOutput.ts +40 -3
  1089. package/src/unstable/cli/Command.ts +74 -74
  1090. package/src/unstable/cli/Completions.ts +4 -4
  1091. package/src/unstable/cli/Flag.ts +158 -169
  1092. package/src/unstable/cli/GlobalFlag.ts +13 -13
  1093. package/src/unstable/cli/Param.ts +150 -159
  1094. package/src/unstable/cli/Primitive.ts +75 -76
  1095. package/src/unstable/cli/Prompt.ts +88 -87
  1096. package/src/unstable/cli/internal/completions/descriptor.ts +23 -11
  1097. package/src/unstable/cli/internal/completions/zsh.ts +2 -2
  1098. package/src/unstable/cli/internal/config.ts +4 -4
  1099. package/src/unstable/cli/internal/parser.ts +1 -1
  1100. package/src/unstable/cli/internal/wizard.ts +18 -13
  1101. package/src/unstable/cluster/ClusterSchema.ts +19 -1
  1102. package/src/unstable/cluster/ClusterWorkflowEngine.ts +66 -16
  1103. package/src/unstable/cluster/Entity.ts +3 -0
  1104. package/src/unstable/cluster/EntityProxyServer.ts +6 -2
  1105. package/src/unstable/cluster/Envelope.ts +3 -3
  1106. package/src/unstable/cluster/HttpRunner.ts +7 -2
  1107. package/src/unstable/cluster/MessageStorage.ts +62 -21
  1108. package/src/unstable/cluster/Reply.ts +2 -2
  1109. package/src/unstable/cluster/Sharding.ts +44 -19
  1110. package/src/unstable/cluster/ShardingConfig.ts +23 -23
  1111. package/src/unstable/cluster/SocketRunner.ts +5 -4
  1112. package/src/unstable/cluster/SqlMessageStorage.ts +12 -8
  1113. package/src/unstable/cluster/SqlRunnerStorage.ts +18 -10
  1114. package/src/unstable/cluster/internal/clusterAbandon.ts +14 -0
  1115. package/src/unstable/cluster/internal/entityManager.ts +12 -4
  1116. package/src/unstable/cluster/internal/interruptors.ts +58 -1
  1117. package/src/unstable/cluster/internal/resourceRef.ts +15 -7
  1118. package/src/unstable/devtools/DevToolsClient.ts +13 -3
  1119. package/src/unstable/encoding/Ini.ts +2 -0
  1120. package/src/unstable/encoding/SchemaBinary.ts +150 -44
  1121. package/src/unstable/encoding/Sse.ts +1 -1
  1122. package/src/unstable/encoding/Toml.ts +7 -5
  1123. package/src/unstable/encoding/Yaml.ts +18 -5
  1124. package/src/unstable/encoding/index.ts +0 -5
  1125. package/src/unstable/eventlog/Event.ts +7 -7
  1126. package/src/unstable/eventlog/EventJournal.ts +9 -9
  1127. package/src/unstable/eventlog/EventLog.ts +5 -5
  1128. package/src/unstable/eventlog/EventLogMessage.ts +25 -15
  1129. package/src/unstable/eventlog/EventLogRemote.ts +15 -4
  1130. package/src/unstable/eventlog/EventLogServerUnencrypted.ts +2 -2
  1131. package/src/unstable/eventlog/SqlEventJournal.ts +32 -9
  1132. package/src/unstable/eventlog/SqlEventLogServerUnencrypted.ts +11 -1
  1133. package/src/unstable/http/Cookies.ts +2 -102
  1134. package/src/unstable/http/FetchHttpClient.ts +1 -1
  1135. package/src/unstable/http/FindMyWay/internal/router.ts +139 -33
  1136. package/src/unstable/http/FindMyWay.ts +15 -5
  1137. package/src/unstable/http/Headers.ts +3 -48
  1138. package/src/unstable/http/HttpBody.ts +107 -36
  1139. package/src/unstable/http/HttpClient.ts +41 -30
  1140. package/src/unstable/http/HttpClientRequest.ts +32 -18
  1141. package/src/unstable/http/HttpClientResponse.ts +16 -3
  1142. package/src/unstable/http/HttpEffect.ts +145 -73
  1143. package/src/unstable/http/HttpIncomingMessage.ts +4 -4
  1144. package/src/unstable/http/HttpMiddleware.ts +43 -24
  1145. package/src/unstable/http/HttpPlatform.ts +62 -20
  1146. package/src/unstable/http/HttpRouter.ts +27 -16
  1147. package/src/unstable/http/HttpServer.ts +18 -57
  1148. package/src/unstable/http/HttpServerRequest.ts +17 -15
  1149. package/src/unstable/http/HttpServerRespondable.ts +1 -1
  1150. package/src/unstable/http/HttpServerResponse.ts +49 -40
  1151. package/src/unstable/http/HttpStaticServer.ts +30 -28
  1152. package/src/unstable/http/Mime.ts +76 -0
  1153. package/src/unstable/http/Multipart.ts +35 -18
  1154. package/src/unstable/http/MultipartParser/internal/multipart.ts +10 -3
  1155. package/src/unstable/http/MultipartParser.ts +4 -3
  1156. package/src/unstable/http/UrlParams.ts +3 -161
  1157. package/src/unstable/http/index.ts +5 -0
  1158. package/src/unstable/http/internal/compression.ts +11 -12
  1159. package/src/unstable/http/internal/headers.ts +7 -0
  1160. package/src/unstable/http/internal/httpBody.ts +9 -0
  1161. package/src/unstable/http/internal/mimeTypes.ts +395 -0
  1162. package/src/unstable/httpapi/HttpApiBuilder.ts +52 -6
  1163. package/src/unstable/httpapi/HttpApiClient.ts +44 -24
  1164. package/src/unstable/httpapi/HttpApiEndpoint.ts +24 -11
  1165. package/src/unstable/httpapi/HttpApiError.ts +3 -1
  1166. package/src/unstable/httpapi/HttpApiMiddleware.ts +7 -5
  1167. package/src/unstable/httpapi/HttpApiSchema.ts +14 -7
  1168. package/src/unstable/httpapi/HttpApiTest.ts +6 -1
  1169. package/src/unstable/httpapi/OpenApi.ts +32 -22
  1170. package/src/unstable/net/IpInterface.ts +242 -0
  1171. package/src/unstable/net/IpNetwork.ts +357 -0
  1172. package/src/unstable/net/NetAddress.ts +1271 -0
  1173. package/src/unstable/net/index.ts +20 -0
  1174. package/src/unstable/observability/OtlpExporter.ts +5 -6
  1175. package/src/unstable/observability/OtlpLogger.ts +9 -9
  1176. package/src/unstable/observability/OtlpMetrics.ts +9 -8
  1177. package/src/unstable/observability/OtlpResource.ts +5 -4
  1178. package/src/unstable/observability/OtlpTracer.ts +103 -81
  1179. package/src/unstable/observability/internal/otlpEnv.ts +10 -13
  1180. package/src/unstable/persistence/PersistedCache.ts +1 -1
  1181. package/src/unstable/persistence/PersistedQueue.ts +1100 -291
  1182. package/src/unstable/persistence/RateLimiter.ts +64 -58
  1183. package/src/unstable/process/ChildProcess.ts +15 -4
  1184. package/src/unstable/process/ChildProcessSpawner.ts +1 -1
  1185. package/src/unstable/reactivity/Atom.ts +6 -3
  1186. package/src/unstable/reactivity/AtomHttpApi.ts +21 -10
  1187. package/src/unstable/reactivity/AtomRegistry.ts +2 -4
  1188. package/src/unstable/reactivity/AtomRpc.ts +6 -5
  1189. package/src/unstable/reactivity/Hydration.ts +26 -7
  1190. package/src/unstable/reactivity/Reactivity.ts +49 -36
  1191. package/src/unstable/rpc/RpcClient.ts +62 -59
  1192. package/src/unstable/rpc/RpcMessage.ts +3 -1
  1193. package/src/unstable/rpc/RpcMiddleware.ts +7 -5
  1194. package/src/unstable/rpc/RpcSerialization.ts +27 -117
  1195. package/src/unstable/rpc/RpcServer.ts +143 -80
  1196. package/src/unstable/schema/Model.ts +8 -7
  1197. package/src/unstable/schema/VariantSchema.ts +3 -0
  1198. package/src/unstable/socket/Socket.ts +714 -383
  1199. package/src/unstable/socket/SocketServer.ts +5 -35
  1200. package/src/unstable/sql/SqlClient.ts +42 -7
  1201. package/src/unstable/sql/SqlConnection.ts +18 -0
  1202. package/src/unstable/sql/SqlModel.ts +1 -1
  1203. package/src/unstable/sql/Statement.ts +46 -20
  1204. package/src/unstable/workers/Transferable.ts +1 -1
  1205. package/src/unstable/workers/Worker.ts +3 -1
  1206. package/src/unstable/workflow/Activity.ts +20 -9
  1207. package/src/unstable/workflow/DurableClock.ts +1 -1
  1208. package/src/unstable/workflow/DurableDeferred.ts +6 -0
  1209. package/src/unstable/workflow/DurableQueue.ts +8 -0
  1210. package/src/unstable/workflow/Workflow.ts +105 -28
  1211. package/src/unstable/workflow/WorkflowEngine.ts +22 -0
  1212. package/dist/internal/schema/schema.d.ts.map +0 -1
  1213. package/dist/internal/schema/schema.js.map +0 -1
  1214. package/dist/internal/schema/toArbitrary.d.ts +0 -2
  1215. package/dist/internal/schema/toArbitrary.d.ts.map +0 -1
  1216. package/dist/internal/schema/toArbitrary.js +0 -705
  1217. package/dist/internal/schema/toArbitrary.js.map +0 -1
  1218. package/dist/testing/FastCheck.d.ts +0 -90
  1219. package/dist/testing/FastCheck.d.ts.map +0 -1
  1220. package/dist/testing/FastCheck.js +0 -90
  1221. package/dist/testing/FastCheck.js.map +0 -1
  1222. package/dist/unstable/encoding/Msgpack.d.ts +0 -185
  1223. package/dist/unstable/encoding/Msgpack.d.ts.map +0 -1
  1224. package/dist/unstable/encoding/Msgpack.js +0 -227
  1225. package/dist/unstable/encoding/Msgpack.js.map +0 -1
  1226. package/src/internal/schema/toArbitrary.ts +0 -843
  1227. package/src/testing/FastCheck.ts +0 -90
  1228. package/src/unstable/encoding/Msgpack.ts +0 -432
  1229. /package/dist/internal/{schema → arbitrary}/schema.d.ts +0 -0
@@ -0,0 +1,1800 @@
1
+ import * as Effect from "../../Effect.ts"
2
+ import * as Equal from "../../Equal.ts"
3
+ import { identity } from "../../Function.ts"
4
+ import * as Hash from "../../Hash.ts"
5
+ import * as Option from "../../Option.ts"
6
+ import * as Order from "../../Order.ts"
7
+ import * as Schema from "../../Schema.ts"
8
+ import * as SchemaAST from "../../SchemaAST.ts"
9
+ import * as SchemaGetter from "../../SchemaGetter.ts"
10
+ import * as SchemaParser from "../../SchemaParser.ts"
11
+ import { effectIsExit } from "../effect.ts"
12
+ import { errorWithPath } from "../errors.ts"
13
+ import * as InternalRecord from "../record.ts"
14
+ import * as Model from "./model.ts"
15
+ import * as Regexp from "./regexp.ts"
16
+
17
+ type Constraint = Schema.Annotations.ToArbitrary.Constraint<any>
18
+ type GenerationConstraint = Schema.Annotations.ToArbitrary.GenerationConstraint<any>
19
+
20
+ interface Checks {
21
+ readonly constraint: Constraint | undefined
22
+ readonly filters: ReadonlyArray<SchemaAST.Filter<any>>
23
+ }
24
+
25
+ const infinity = Number.POSITIVE_INFINITY
26
+ const finiteNumberConstraint: Constraint = { number: "finite" }
27
+ const optionMatch = { onFailure: Option.none, onSuccess: Option.some }
28
+
29
+ const optionComputation = <A, E, R>(self: Effect.Effect<A, E, R>): Model.Computation<Option.Option<A>> => {
30
+ const result = Effect.matchEager(self, optionMatch) as Effect.Effect<Option.Option<A>>
31
+ return effectIsExit(result) && result._tag === "Success" ? result.value : result
32
+ }
33
+
34
+ /** @internal */
35
+ export function compileValidator<S extends Schema.Constraint>(
36
+ schema: S
37
+ ): (value: S["Type"]) => Model.Computation<Option.Option<S["Type"]>> {
38
+ const parse = SchemaParser.run<S["Type"], never>(SchemaAST.toType(schema.ast))
39
+ return (value) => optionComputation(parse(value))
40
+ }
41
+
42
+ function arbitraryError(what: string, path: ReadonlyArray<PropertyKey>) {
43
+ return errorWithPath(`Unable to derive an arbitrary for ${what}`, path)
44
+ }
45
+
46
+ function sumCosts(costs: Iterable<number>): number {
47
+ let out = 0
48
+ for (const cost of costs) {
49
+ if (cost === infinity) return infinity
50
+ out += cost
51
+ }
52
+ return out
53
+ }
54
+
55
+ function mergeOrderedBound<T>(
56
+ order: Order.Order<T>,
57
+ self: T | undefined,
58
+ selfExclusive: boolean | undefined,
59
+ that: T | undefined,
60
+ thatExclusive: boolean | undefined,
61
+ takeComparison: -1 | 1
62
+ ): readonly [T | undefined, boolean | undefined] {
63
+ if (that === undefined || self === undefined) {
64
+ return that === undefined ? [self, selfExclusive] : [that, thatExclusive]
65
+ }
66
+ const comparison = order(self, that)
67
+ return comparison === takeComparison
68
+ ? [that, thatExclusive]
69
+ : comparison === 0
70
+ ? [self, selfExclusive || thatExclusive]
71
+ : [self, selfExclusive]
72
+ }
73
+
74
+ function mergeMinimum(self: number | undefined, that: number | undefined): number | undefined {
75
+ return self === undefined ? that : that === undefined ? self : Math.max(self, that)
76
+ }
77
+
78
+ function mergeMaximum(self: number | undefined, that: number | undefined): number | undefined {
79
+ return self === undefined ? that : that === undefined ? self : Math.min(self, that)
80
+ }
81
+
82
+ function mergeConstraint(self: Constraint | undefined, that: Constraint): Constraint {
83
+ const order = that.order ?? self?.order
84
+ if (self?.order !== undefined && that.order !== undefined && self.order !== that.order) {
85
+ throw new Error("Cannot merge ordered arbitrary constraints with different Order instances")
86
+ }
87
+ const [minimum, exclusiveMinimum] = order === undefined
88
+ ? [that.minimum ?? self?.minimum, that.exclusiveMinimum ?? self?.exclusiveMinimum]
89
+ : mergeOrderedBound(
90
+ order,
91
+ self?.minimum,
92
+ self?.exclusiveMinimum,
93
+ that.minimum,
94
+ that.exclusiveMinimum,
95
+ -1
96
+ )
97
+ const [maximum, exclusiveMaximum] = order === undefined
98
+ ? [that.maximum ?? self?.maximum, that.exclusiveMaximum ?? self?.exclusiveMaximum]
99
+ : mergeOrderedBound(
100
+ order,
101
+ self?.maximum,
102
+ self?.exclusiveMaximum,
103
+ that.maximum,
104
+ that.exclusiveMaximum,
105
+ 1
106
+ )
107
+ const minLength = mergeMinimum(self?.minLength, that.minLength)
108
+ const maxLength = mergeMaximum(self?.maxLength, that.maxLength)
109
+ const minSize = mergeMinimum(self?.minSize, that.minSize)
110
+ const maxSize = mergeMaximum(self?.maxSize, that.maxSize)
111
+ const minProperties = mergeMinimum(self?.minProperties, that.minProperties)
112
+ const maxProperties = mergeMaximum(self?.maxProperties, that.maxProperties)
113
+ const patterns = self?.patterns === undefined
114
+ ? that.patterns
115
+ : that.patterns === undefined
116
+ ? self.patterns
117
+ : [...self.patterns, ...that.patterns] as [
118
+ Schema.Annotations.ToArbitrary.Pattern,
119
+ ...Array<Schema.Annotations.ToArbitrary.Pattern>
120
+ ]
121
+ const number = self?.number === "integer" || that.number === "integer"
122
+ ? "integer"
123
+ : self?.number === "finite" || that.number === "finite"
124
+ ? "finite"
125
+ : undefined
126
+ const uniqueBy = that.uniqueBy ?? self?.uniqueBy
127
+ return {
128
+ ...(order === undefined ? undefined : { order }),
129
+ ...(minimum === undefined ? undefined : { minimum }),
130
+ ...(exclusiveMinimum === true ? { exclusiveMinimum: true } : undefined),
131
+ ...(maximum === undefined ? undefined : { maximum }),
132
+ ...(exclusiveMaximum === true ? { exclusiveMaximum: true } : undefined),
133
+ ...(minLength === undefined ? undefined : { minLength }),
134
+ ...(maxLength === undefined ? undefined : { maxLength }),
135
+ ...(minSize === undefined ? undefined : { minSize }),
136
+ ...(maxSize === undefined ? undefined : { maxSize }),
137
+ ...(minProperties === undefined ? undefined : { minProperties }),
138
+ ...(maxProperties === undefined ? undefined : { maxProperties }),
139
+ ...(patterns === undefined ? undefined : { patterns }),
140
+ ...(number === undefined ? undefined : { number }),
141
+ ...(uniqueBy === undefined ? undefined : { uniqueBy })
142
+ }
143
+ }
144
+
145
+ function collectChecks(checks: SchemaAST.Checks | undefined, inherited: Constraint | undefined): Checks {
146
+ let constraint = inherited
147
+ const filters: Array<SchemaAST.Filter<any>> = []
148
+ const visit = (check: SchemaAST.Check<any>): void => {
149
+ const next = check.annotations?.arbitraryConstraint
150
+ if (next !== undefined) constraint = mergeConstraint(constraint, next)
151
+ if (check._tag === "Filter") {
152
+ filters.push(check)
153
+ } else {
154
+ check.checks.forEach(visit)
155
+ }
156
+ }
157
+ checks?.forEach(visit)
158
+ return { constraint, filters }
159
+ }
160
+
161
+ function applyFilters(
162
+ compiled: Model.Compiled<any>,
163
+ ast: SchemaAST.AST,
164
+ filters: ReadonlyArray<SchemaAST.Filter<any>>
165
+ ): void {
166
+ if (filters.length === 0) return
167
+ const generate = compiled.generate
168
+ const passes = (value: unknown) => {
169
+ for (let index = 0; index < filters.length; index++) {
170
+ if (filters[index].run(value, ast, SchemaAST.defaultParseOptions) !== undefined) return false
171
+ }
172
+ return true
173
+ }
174
+ compiled.generate = (state) =>
175
+ Model.mapGeneration(generate(state), (attempt) => {
176
+ if (attempt._tag === "Discarded") return Model.discarded
177
+ if (!state.shrinks) return passes(attempt.value) ? attempt : Model.discarded
178
+ const sample = Model.filterSample(attempt, passes)
179
+ return sample ?? Model.discarded
180
+ })
181
+ }
182
+
183
+ function validateConstraint(constraint: Constraint | undefined, path: ReadonlyArray<PropertyKey>): void {
184
+ if (constraint === undefined) return
185
+ const cardinalities = [
186
+ [constraint.minLength, constraint.maxLength],
187
+ [constraint.minSize, constraint.maxSize],
188
+ [constraint.minProperties, constraint.maxProperties]
189
+ ] as const
190
+ for (const [minimum, maximum] of cardinalities) {
191
+ if (
192
+ minimum !== undefined && (!Number.isSafeInteger(minimum) || minimum < 0) ||
193
+ maximum !== undefined && (!Number.isSafeInteger(maximum) || maximum < 0) ||
194
+ minimum !== undefined && maximum !== undefined && minimum > maximum
195
+ ) {
196
+ throw arbitraryError("constraints", path)
197
+ }
198
+ }
199
+ if (constraint.order !== undefined && constraint.minimum !== undefined && constraint.maximum !== undefined) {
200
+ const comparison = constraint.order(constraint.minimum, constraint.maximum)
201
+ if (
202
+ comparison > 0 ||
203
+ comparison === 0 && (constraint.exclusiveMinimum === true || constraint.exclusiveMaximum === true)
204
+ ) {
205
+ throw arbitraryError("constraints", path)
206
+ }
207
+ }
208
+ }
209
+
210
+ function withoutOrder(constraint: Constraint | undefined): GenerationConstraint | undefined {
211
+ if (constraint === undefined) return undefined
212
+ const { order: _, ...out } = constraint
213
+ return Object.keys(out).length === 0 ? undefined : out
214
+ }
215
+
216
+ const minimumDateTimestamp = -8_640_000_000_000_000
217
+ const maximumDateTimestamp = 8_640_000_000_000_000
218
+ const regexpArbitraryFlags = ["g", "i", "m", "s", "u", "y"] as const
219
+
220
+ function jsonSchema(): Schema.Codec<Schema.Json> {
221
+ let schema: Schema.Codec<Schema.Json>
222
+ schema = Schema.Union([
223
+ Schema.Null,
224
+ Schema.Finite,
225
+ Schema.Boolean,
226
+ Schema.String,
227
+ Schema.Array(Schema.suspend(() => schema)),
228
+ Schema.Record(Schema.String, Schema.suspend(() => schema))
229
+ ]) as Schema.Codec<Schema.Json>
230
+ return schema
231
+ }
232
+
233
+ function regexpSchema() {
234
+ return Schema.Struct({
235
+ source: Schema.Literals([
236
+ "",
237
+ ".",
238
+ ".*",
239
+ "\\d+",
240
+ "\\w+",
241
+ "[a-z]+",
242
+ "[A-Z]+",
243
+ "[0-9]+",
244
+ "^[a-zA-Z0-9]+$",
245
+ "^\\d{4}-\\d{2}-\\d{2}$"
246
+ ]),
247
+ flags: Schema.Struct({
248
+ g: Schema.Boolean,
249
+ i: Schema.Boolean,
250
+ m: Schema.Boolean,
251
+ s: Schema.Boolean,
252
+ u: Schema.Boolean,
253
+ y: Schema.Boolean
254
+ })
255
+ })
256
+ }
257
+
258
+ function urlSchema() {
259
+ return Schema.Struct({
260
+ protocol: Schema.Literals(["http", "https"]),
261
+ label: Schema.String.check(Schema.isPattern(/^[a-z0-9]+$/), Schema.isMinLength(1), Schema.isMaxLength(63)),
262
+ suffix: Schema.String.check(Schema.isPattern(/^[a-z]+$/), Schema.isMinLength(2), Schema.isMaxLength(10)),
263
+ path: Schema.Array(
264
+ Schema.String.check(Schema.isPattern(/^[A-Za-z0-9._~%-]*$/), Schema.isMaxLength(16))
265
+ ).check(Schema.isMaxLength(4))
266
+ })
267
+ }
268
+
269
+ function dateSchema(constraint: GenerationConstraint | undefined) {
270
+ const minimum = Math.max(
271
+ minimumDateTimestamp,
272
+ constraint?.minimum === undefined
273
+ ? minimumDateTimestamp
274
+ : constraint.minimum.getTime() + (constraint.exclusiveMinimum === true ? 1 : 0)
275
+ )
276
+ const maximum = Math.min(
277
+ maximumDateTimestamp,
278
+ constraint?.maximum === undefined
279
+ ? maximumDateTimestamp
280
+ : constraint.maximum.getTime() - (constraint.exclusiveMaximum === true ? 1 : 0)
281
+ )
282
+ return Schema.Int.check(Schema.isBetween({ minimum, maximum }))
283
+ }
284
+
285
+ const linkToArbitrary = Schema.linkDecoding
286
+
287
+ function builtInDeclarationLink(
288
+ ast: SchemaAST.Declaration,
289
+ typeParameters: ReadonlyArray<Schema.Constraint>,
290
+ constraint: GenerationConstraint | undefined
291
+ ): SchemaAST.Link | undefined {
292
+ const representation = (ast.annotations as Schema.Annotations.Declaration<any> | undefined)?.representation
293
+ if (representation === undefined) return undefined
294
+ switch (representation.id) {
295
+ case "effect/schema/Json":
296
+ return linkToArbitrary<Schema.Json>()(jsonSchema(), SchemaGetter.passthrough())
297
+ case "effect/schema/MutableJson":
298
+ return linkToArbitrary<Schema.MutableJson>()(
299
+ jsonSchema(),
300
+ SchemaGetter.passthrough<Schema.MutableJson, Schema.Json>({ strict: false })
301
+ )
302
+ case "effect/schema/RegExp":
303
+ return linkToArbitrary<globalThis.RegExp>()(
304
+ regexpSchema(),
305
+ SchemaGetter.transform(({ flags, source }) =>
306
+ new globalThis.RegExp(source, regexpArbitraryFlags.filter((flag) => flags[flag]).join(""))
307
+ )
308
+ )
309
+ case "effect/schema/URL":
310
+ return linkToArbitrary<globalThis.URL>()(
311
+ urlSchema(),
312
+ SchemaGetter.transform(({ label, path, protocol, suffix }) =>
313
+ new globalThis.URL(`${protocol}://${label}.${suffix}/${path.join("/")}`)
314
+ )
315
+ )
316
+ case "effect/schema/Date":
317
+ return linkToArbitrary<globalThis.Date>()(dateSchema(constraint), SchemaGetter.Date<number>())
318
+ case "effect/schema/ReadonlyMap": {
319
+ const [key, value] = typeParameters
320
+ return linkToArbitrary<globalThis.ReadonlyMap<unknown, unknown>>()(
321
+ Schema.withArrayLengthConstraints(
322
+ Schema.Array(Schema.Tuple([key, value])).check(Schema.isUniqueKey()),
323
+ constraint?.minSize,
324
+ constraint?.maxSize
325
+ ),
326
+ SchemaGetter.transform((entries) => new globalThis.Map(entries))
327
+ )
328
+ }
329
+ case "effect/schema/ReadonlySet":
330
+ return linkToArbitrary<globalThis.ReadonlySet<unknown>>()(
331
+ Schema.withArrayLengthConstraints(
332
+ Schema.Array(typeParameters[0]).check(Schema.isUnique()),
333
+ constraint?.minSize,
334
+ constraint?.maxSize
335
+ ),
336
+ SchemaGetter.transform((values) => new globalThis.Set(values))
337
+ )
338
+ case "effect/schema/Uint8Array":
339
+ return linkToArbitrary<globalThis.Uint8Array<ArrayBufferLike>>()(
340
+ Schema.withArrayLengthConstraints(
341
+ Schema.Array(Schema.Int.check(Schema.isBetween({ minimum: 0, maximum: 255 }))),
342
+ constraint?.minLength,
343
+ constraint?.maxLength
344
+ ),
345
+ SchemaGetter.transform<globalThis.Uint8Array<ArrayBufferLike>, ReadonlyArray<number>>((values) =>
346
+ globalThis.Uint8Array.from(values)
347
+ )
348
+ )
349
+ default:
350
+ return undefined
351
+ }
352
+ }
353
+
354
+ function lengthBounds(
355
+ constraint: Constraint | undefined,
356
+ keys: readonly [
357
+ minimum: "minLength" | "minSize" | "minProperties",
358
+ maximum: "maxLength" | "maxSize" | "maxProperties"
359
+ ],
360
+ path: ReadonlyArray<PropertyKey>,
361
+ label: string
362
+ ): readonly [minimum: number, maximum: number | undefined] {
363
+ const minimum = constraint?.[keys[0]] ?? 0
364
+ const maximum = constraint?.[keys[1]]
365
+ if (
366
+ !Number.isSafeInteger(minimum) || minimum < 0 ||
367
+ maximum !== undefined && (!Number.isSafeInteger(maximum) || maximum < minimum)
368
+ ) {
369
+ throw arbitraryError(`${label} constraints`, path)
370
+ }
371
+ return [minimum, maximum]
372
+ }
373
+
374
+ function constant<A>(value: A): Model.Compiled<A> {
375
+ const sample = Model.makeSample(value)
376
+ return Model.makeCompiled([], () => 0, () => sample)
377
+ }
378
+
379
+ function replaceAt<A>(values: ReadonlyArray<A>, index: number, value: A): Array<A> {
380
+ const out = values.slice()
381
+ out[index] = value
382
+ return out
383
+ }
384
+
385
+ function arraySample(
386
+ children: ReadonlyArray<Model.Sample<any>>,
387
+ shape: {
388
+ readonly fixedCount: number
389
+ readonly optionalCount: number
390
+ readonly repeatCount: number
391
+ readonly tailCount: number
392
+ readonly minimum: number
393
+ },
394
+ shrinks = true
395
+ ): Model.Sample<ReadonlyArray<any>> {
396
+ if (!shrinks) return Model.makeSample(children.map((child) => child.value))
397
+ const product = Model.productSample(
398
+ children,
399
+ (children) => children.map((child) => child.value),
400
+ (children) => arraySample(children, shape)
401
+ )
402
+ // Like fast-check v4.9.0's ArrayArbitrary (MIT), structural shrinks are tried before element shrinks.
403
+ // https://github.com/dubzzz/fast-check/blob/v4.9.0/packages/fast-check/src/arbitrary/_internals/ArrayArbitrary.ts
404
+ const structural: Array<() => Model.Sample<ReadonlyArray<any>>> = []
405
+ if (shape.repeatCount > 0 && children.length - 1 >= shape.minimum) {
406
+ const index = shape.fixedCount + shape.repeatCount - 1
407
+ structural.push(() =>
408
+ arraySample(children.slice(0, index).concat(children.slice(index + 1)), {
409
+ ...shape,
410
+ repeatCount: shape.repeatCount - 1
411
+ })
412
+ )
413
+ } else if (
414
+ shape.optionalCount > 0 && shape.repeatCount === 0 && shape.tailCount === 0 &&
415
+ children.length - 1 >= shape.minimum
416
+ ) {
417
+ structural.push(() =>
418
+ arraySample(children.slice(0, -1), {
419
+ ...shape,
420
+ fixedCount: shape.fixedCount - 1,
421
+ optionalCount: shape.optionalCount - 1
422
+ })
423
+ )
424
+ }
425
+ if (structural.length === 0) return product
426
+ const structuralPull = Effect.map(Model.pullFromArray(structural), (make) => make())
427
+ return Model.makeSample(
428
+ product.value,
429
+ product.shrinks === undefined ? structuralPull : Model.concatPulls([structuralPull, product.shrinks])
430
+ )
431
+ }
432
+
433
+ interface ObjectEntry {
434
+ readonly key: PropertyKey
435
+ readonly keySample?: Model.Sample<PropertyKey> | undefined
436
+ readonly sample: Model.Sample<any>
437
+ readonly removable: boolean
438
+ }
439
+
440
+ function normalizePropertyKeySample(sample: Model.Sample<any>): Model.Sample<PropertyKey> | undefined {
441
+ const filtered = Model.filterSample(
442
+ sample,
443
+ (value): value is string | number | symbol =>
444
+ typeof value === "string" || typeof value === "number" || typeof value === "symbol"
445
+ )
446
+ return filtered === undefined
447
+ ? undefined
448
+ : Model.mapSample(filtered, (value) => typeof value === "symbol" ? value : globalThis.String(value))
449
+ }
450
+
451
+ function objectSample(
452
+ entries: ReadonlyArray<ObjectEntry>,
453
+ minimum: number,
454
+ nullPrototype: boolean,
455
+ shrinks = true
456
+ ): Model.Sample<Record<PropertyKey, any>> {
457
+ const make = (entries: ReadonlyArray<ObjectEntry>) => {
458
+ const out = Model.makeObject(nullPrototype)
459
+ for (const entry of entries) InternalRecord.assignProperty(out, entry.key, entry.sample.value)
460
+ return out
461
+ }
462
+ if (!shrinks) return Model.makeSample(make(entries))
463
+ const childPulls = entries.flatMap((entry, index) =>
464
+ entry.sample.shrinks === undefined
465
+ ? []
466
+ : [
467
+ Effect.map(
468
+ entry.sample.shrinks,
469
+ (attempt) =>
470
+ Model.mapAttempt(
471
+ attempt,
472
+ (sample) => objectSample(replaceAt(entries, index, { ...entry, sample }), minimum, nullPrototype)
473
+ )
474
+ )
475
+ ]
476
+ )
477
+ // Key shrinking uses the same uniqueness-preserving descendant filtering principle as fast-check v4.9.0's
478
+ // ArrayArbitrary (MIT). Structural removals and value shrinks retain their established precedence.
479
+ // https://github.com/dubzzz/fast-check/blob/v4.9.0/packages/fast-check/src/arbitrary/_internals/ArrayArbitrary.ts
480
+ const keyPulls = entries.flatMap((entry, index) => {
481
+ if (entry.keySample === undefined || entry.keySample.shrinks === undefined) return []
482
+ const filtered = Model.filterSample(
483
+ entry.keySample,
484
+ (key) => !entries.some((other, otherIndex) => otherIndex !== index && other.key === key)
485
+ )
486
+ if (filtered?.shrinks === undefined) return []
487
+ return [Effect.map(
488
+ filtered.shrinks,
489
+ (attempt) =>
490
+ Model.mapAttempt(
491
+ attempt,
492
+ (keySample) =>
493
+ objectSample(
494
+ replaceAt(entries, index, { ...entry, key: keySample.value, keySample }),
495
+ minimum,
496
+ nullPrototype
497
+ )
498
+ )
499
+ )]
500
+ })
501
+ const structural: Array<() => Model.Sample<Record<PropertyKey, any>>> = entries.length <= minimum
502
+ ? []
503
+ : entries.flatMap((entry, index) =>
504
+ entry.removable
505
+ ? [() => objectSample(entries.slice(0, index).concat(entries.slice(index + 1)), minimum, nullPrototype)]
506
+ : []
507
+ )
508
+ const descendantPulls = [...childPulls, ...keyPulls]
509
+ const pulls = structural.length === 0
510
+ ? descendantPulls
511
+ : [Effect.map(Model.pullFromArray(structural), (make) => make()), ...descendantPulls]
512
+ return Model.makeSample(make(entries), pulls.length === 0 ? undefined : Model.concatPulls(pulls))
513
+ }
514
+
515
+ const generateSamples = (
516
+ children: ReadonlyArray<Model.Compiled<any>>,
517
+ state: Model.GenerationState,
518
+ additionalReserved = 0
519
+ ): Model.Computation<Array<Model.Sample<any>> | undefined> => {
520
+ let reserved = additionalReserved
521
+ let recursive: Array<number> | undefined
522
+ for (let index = 0; index < children.length; index++) {
523
+ const child = children[index]
524
+ if (reserved !== infinity) reserved += child.minCost
525
+ if (child.mayRecurse) (recursive ??= []).push(index)
526
+ }
527
+ if (reserved > state.budget.remaining) return undefined
528
+ let order: Array<number> | undefined
529
+ if (recursive !== undefined && recursive.length > 1) {
530
+ order = children.map((_, index) => index)
531
+ const shuffled = Model.shuffle(state, recursive)
532
+ let next = 0
533
+ for (let index = 0; index < order.length; index++) {
534
+ if (children[index].mayRecurse) order[index] = shuffled[next++]
535
+ }
536
+ }
537
+ return Model.generateProduct(children, state, order, reserved)
538
+ }
539
+
540
+ const generateRequiredObjectValues = (
541
+ properties: ReadonlyArray<{
542
+ readonly property: { readonly name: PropertyKey }
543
+ readonly compiled: Model.Compiled<any>
544
+ }>,
545
+ state: Model.GenerationState,
546
+ nullPrototype: boolean
547
+ ): Model.Generation<Record<PropertyKey, any>> => {
548
+ let reserved = 0
549
+ let recursive: Array<number> | undefined
550
+ for (let index = 0; index < properties.length; index++) {
551
+ const child = properties[index].compiled
552
+ if (reserved !== infinity) reserved += child.minCost
553
+ if (child.mayRecurse) (recursive ??= []).push(index)
554
+ }
555
+ if (reserved > state.budget.remaining) return Model.discarded
556
+ let order: Array<number> | undefined
557
+ if (recursive !== undefined && recursive.length > 1) {
558
+ order = properties.map((_, index) => index)
559
+ const shuffled = Model.shuffle(state, recursive)
560
+ let next = 0
561
+ for (let index = 0; index < order.length; index++) {
562
+ if (properties[index].compiled.mayRecurse) order[index] = shuffled[next++]
563
+ }
564
+ }
565
+ const values = new Array<any>(properties.length)
566
+ let index = 0
567
+ const loop = (): Model.Generation<Record<PropertyKey, any>> => {
568
+ while (index < properties.length) {
569
+ const childIndex = order?.[index] ?? index
570
+ index++
571
+ const child = properties[childIndex]
572
+ reserved -= child.compiled.minCost
573
+ const generated = Model.generateWithReservedBudget(child.compiled, state, reserved)
574
+ if (Model.isAttempt(generated)) {
575
+ if (generated._tag === "Discarded") return Model.discarded
576
+ values[childIndex] = generated.value
577
+ continue
578
+ }
579
+ return Effect.flatMapEager(generated, (attempt) => {
580
+ if (attempt._tag === "Discarded") return Effect.succeed(Model.discarded)
581
+ values[childIndex] = attempt.value
582
+ return Model.toEffectGeneration(loop())
583
+ })
584
+ }
585
+ const out = Model.makeObject(nullPrototype)
586
+ for (let index = 0; index < properties.length; index++) {
587
+ InternalRecord.assignProperty(out, properties[index].property.name, values[index])
588
+ }
589
+ return Model.makeSample(out)
590
+ }
591
+ return loop()
592
+ }
593
+
594
+ const generateRepeatedValues = (
595
+ child: Model.Compiled<any>,
596
+ count: number,
597
+ state: Model.GenerationState
598
+ ): Model.Generation<ReadonlyArray<any>> => {
599
+ // The packed push loop follows fast-check v4.9.0's ArrayArbitrary generation strategy (MIT).
600
+ // https://github.com/dubzzz/fast-check/blob/v4.9.0/packages/fast-check/src/arbitrary/_internals/ArrayArbitrary.ts
601
+ const out: Array<any> = []
602
+ let remaining = count
603
+ let reserved = count * child.minCost
604
+ const loop = (): Model.Generation<ReadonlyArray<any>> => {
605
+ while (remaining > 0) {
606
+ reserved -= child.minCost
607
+ const generated = Model.generateWithReservedBudget(child, state, reserved)
608
+ if (Model.isAttempt(generated)) {
609
+ if (generated._tag === "Discarded") return Model.discarded
610
+ out.push(generated.value)
611
+ remaining--
612
+ continue
613
+ }
614
+ return Effect.flatMapEager(generated, (attempt) => {
615
+ if (attempt._tag === "Discarded") return Effect.succeed(Model.discarded)
616
+ out.push(attempt.value)
617
+ remaining--
618
+ return Model.toEffectGeneration(loop())
619
+ })
620
+ }
621
+ return Model.makeSample(out)
622
+ }
623
+ return loop()
624
+ }
625
+
626
+ const generateRepeatedRecursiveValues = (
627
+ child: Model.Compiled<any>,
628
+ count: number,
629
+ state: Model.GenerationState
630
+ ): Model.Generation<ReadonlyArray<any>> => {
631
+ const out = new Array<any>(count)
632
+ const order = Model.shuffle(state, Array.from({ length: count }, (_, index) => index))
633
+ let index = 0
634
+ let reserved = count * child.minCost
635
+ const loop = (): Model.Generation<ReadonlyArray<any>> => {
636
+ while (index < count) {
637
+ reserved -= child.minCost
638
+ const generated = Model.generateWithReservedBudget(child, state, reserved)
639
+ if (Model.isAttempt(generated)) {
640
+ if (generated._tag === "Discarded") return Model.discarded
641
+ out[order[index++]] = generated.value
642
+ continue
643
+ }
644
+ return Effect.flatMapEager(generated, (attempt) => {
645
+ if (attempt._tag === "Discarded") return Effect.succeed(Model.discarded)
646
+ out[order[index++]] = attempt.value
647
+ return Model.toEffectGeneration(loop())
648
+ })
649
+ }
650
+ return Model.makeSample(out)
651
+ }
652
+ return loop()
653
+ }
654
+
655
+ // Selector-based uniqueness and primitive Set tracking follow fast-check v4.9.0's uniqueArray and SameValueSet
656
+ // strategies (MIT). Hash buckets extend them with Effect's equality semantics for objects.
657
+ // https://github.com/dubzzz/fast-check/blob/v4.9.0/packages/fast-check/src/arbitrary/uniqueArray.ts
658
+ // https://github.com/dubzzz/fast-check/blob/v4.9.0/packages/fast-check/src/arbitrary/_internals/helpers/SameValueSet.ts
659
+ const makeUniqueAdder = (): (value: any) => boolean => {
660
+ let primitives: Set<any> | undefined
661
+ let buckets: Map<number, Array<any>> | undefined
662
+ return (value) => {
663
+ if (value === null || typeof value !== "object" && typeof value !== "function") {
664
+ const set = primitives ??= new Set()
665
+ const size = set.size
666
+ set.add(value)
667
+ return set.size !== size
668
+ }
669
+ const hash = Hash.hash(value)
670
+ const map = buckets ??= new Map()
671
+ const bucket = map.get(hash)
672
+ if (bucket !== undefined) {
673
+ for (let index = 0; index < bucket.length; index++) {
674
+ if (Equal.equals(bucket[index], value)) return false
675
+ }
676
+ bucket.push(value)
677
+ } else {
678
+ map.set(hash, [value])
679
+ }
680
+ return true
681
+ }
682
+ }
683
+
684
+ const makeUniqueAdderBy = (
685
+ uniqueBy: (value: any) => unknown
686
+ ): (value: any) => boolean => {
687
+ const add = makeUniqueAdder()
688
+ return uniqueBy === identity ? add : (input) => add(uniqueBy(input))
689
+ }
690
+
691
+ const generateRepeatedUniqueValues = (
692
+ child: Model.Compiled<any>,
693
+ count: number,
694
+ state: Model.GenerationState,
695
+ uniqueBy: (value: any) => unknown
696
+ ): Model.Generation<ReadonlyArray<any>> => {
697
+ const out: Array<any> = []
698
+ const addUnique = makeUniqueAdderBy(uniqueBy)
699
+ let remaining = count
700
+ let reserved = count * child.minCost
701
+ let retries = 0
702
+ let budget = state.budget.remaining
703
+ const loop = (): Model.Generation<ReadonlyArray<any>> => {
704
+ while (remaining > 0) {
705
+ if (retries === 0) {
706
+ reserved -= child.minCost
707
+ budget = state.budget.remaining
708
+ }
709
+ const generated = Model.generateWithReservedBudget(child, state, reserved)
710
+ if (Model.isAttempt(generated)) {
711
+ if (generated._tag === "Discarded") return Model.discarded
712
+ if (!addUnique(generated.value)) {
713
+ if (++retries >= count) return Model.discarded
714
+ state.budget.remaining = budget
715
+ continue
716
+ }
717
+ out.push(generated.value)
718
+ remaining--
719
+ retries = 0
720
+ continue
721
+ }
722
+ return Effect.flatMapEager(generated, (attempt) => {
723
+ if (attempt._tag === "Discarded") return Effect.succeed(Model.discarded)
724
+ if (!addUnique(attempt.value)) {
725
+ if (++retries >= count) return Effect.succeed(Model.discarded)
726
+ state.budget.remaining = budget
727
+ } else {
728
+ out.push(attempt.value)
729
+ remaining--
730
+ retries = 0
731
+ }
732
+ return Model.toEffectGeneration(loop())
733
+ })
734
+ }
735
+ return Model.makeSample(out)
736
+ }
737
+ return loop()
738
+ }
739
+
740
+ function shrinkString(value: string, minimum: number): ReadonlyArray<string> {
741
+ const values = value.length <= minimum
742
+ ? []
743
+ : [
744
+ value.slice(0, minimum),
745
+ value.slice(0, Math.max(minimum, Math.floor(value.length / 2))),
746
+ value.slice(0, -1)
747
+ ]
748
+ // fast-check v4.9.0 builds strings from shrinkable units (MIT). Effect keeps UTF-16 code units as its string domain
749
+ // and applies its integer-halving shrink toward the Effect-owned null-unit target.
750
+ // https://github.com/dubzzz/fast-check/blob/v4.9.0/packages/fast-check/src/arbitrary/string.ts
751
+ for (let index = 0; index < value.length; index++) {
752
+ for (const candidate of shrinkInteger(value.charCodeAt(index), 0, true)) {
753
+ values.push(
754
+ value.slice(0, index) + globalThis.String.fromCharCode(candidate.value) + value.slice(index + 1)
755
+ )
756
+ }
757
+ }
758
+ return [...new Set(values)].filter((candidate) => candidate !== value)
759
+ }
760
+
761
+ // Edge-case injection is inspired by fast-check v4.9.0's cached dangerous slices (MIT). The concrete corpus is
762
+ // Effect-owned and also covers control, numeric-property, and UTF-16 boundaries.
763
+ // https://github.com/dubzzz/fast-check/blob/v4.9.0/packages/fast-check/src/arbitrary/_internals/helpers/SlicesForStringBuilder.ts
764
+ const stringEdgeCases = [
765
+ "",
766
+ " ",
767
+ "\t",
768
+ "\n",
769
+ "\0",
770
+ "0",
771
+ "-1",
772
+ "4294967295",
773
+ "__proto__",
774
+ "constructor",
775
+ "prototype",
776
+ "toString",
777
+ "\uD800",
778
+ "\uDC00",
779
+ "😀"
780
+ ] as const
781
+
782
+ function randomString(state: Model.GenerationState, minimum: number, maximum: number): string {
783
+ if (Model.randomInt(state, 1, state.biasFactor) === 1) {
784
+ let eligible = 0
785
+ for (const value of stringEdgeCases) {
786
+ if (value.length >= minimum && value.length <= maximum) eligible++
787
+ }
788
+ if (eligible > 0) {
789
+ let target = Model.randomIndex(state, eligible)
790
+ for (const value of stringEdgeCases) {
791
+ if (value.length < minimum || value.length > maximum) continue
792
+ if (target-- === 0) return value
793
+ }
794
+ }
795
+ }
796
+ const length = Model.randomLength(state, minimum, maximum)
797
+ let value = ""
798
+ for (let index = 0; index < length; index++) {
799
+ value += globalThis.String.fromCharCode(Model.randomInt(state, 32, 126))
800
+ }
801
+ return value
802
+ }
803
+
804
+ function numberBounds(constraint: Constraint | undefined, integer: boolean, path: ReadonlyArray<PropertyKey>) {
805
+ const ordered = constraint?.order === Order.Number ? constraint : undefined
806
+ let minimum = ordered?.minimum as number | undefined
807
+ let maximum = ordered?.maximum as number | undefined
808
+ if (minimum !== undefined && Number.isNaN(minimum) || maximum !== undefined && Number.isNaN(maximum)) {
809
+ throw arbitraryError(integer ? "integer constraints" : "number constraints", path)
810
+ }
811
+ if (integer) {
812
+ if (minimum !== undefined) {
813
+ minimum = ordered?.exclusiveMinimum === true
814
+ ? Math.floor(minimum) + 1
815
+ : Math.ceil(minimum)
816
+ }
817
+ if (maximum !== undefined) {
818
+ maximum = ordered?.exclusiveMaximum === true
819
+ ? Math.ceil(maximum) - 1
820
+ : Math.floor(maximum)
821
+ }
822
+ } else {
823
+ if (minimum !== undefined && ordered?.exclusiveMinimum === true && minimum === Infinity) {
824
+ throw arbitraryError("number constraints", path)
825
+ }
826
+ if (maximum !== undefined && ordered?.exclusiveMaximum === true && maximum === -Infinity) {
827
+ throw arbitraryError("number constraints", path)
828
+ }
829
+ if (minimum !== undefined) {
830
+ minimum = ordered?.exclusiveMinimum === true ? Model.nextNumber(minimum) : minimum === 0 ? -0 : minimum
831
+ }
832
+ if (maximum !== undefined) {
833
+ maximum = ordered?.exclusiveMaximum === true ? Model.previousNumber(maximum) : maximum === 0 ? 0 : maximum
834
+ }
835
+ }
836
+ if (integer || constraint?.number === "finite") {
837
+ if (minimum === Infinity || maximum === -Infinity) {
838
+ throw arbitraryError(integer ? "integer constraints" : "number constraints", path)
839
+ }
840
+ if (minimum === -Infinity) minimum = integer ? Number.MIN_SAFE_INTEGER : -Number.MAX_VALUE
841
+ if (maximum === Infinity) maximum = integer ? Number.MAX_SAFE_INTEGER : Number.MAX_VALUE
842
+ }
843
+ if (integer) {
844
+ if (
845
+ minimum !== undefined && minimum > Number.MAX_SAFE_INTEGER ||
846
+ maximum !== undefined && maximum < Number.MIN_SAFE_INTEGER
847
+ ) {
848
+ throw arbitraryError("integer constraints", path)
849
+ }
850
+ if (minimum !== undefined) minimum = Math.max(minimum, Number.MIN_SAFE_INTEGER)
851
+ if (maximum !== undefined) maximum = Math.min(maximum, Number.MAX_SAFE_INTEGER)
852
+ }
853
+ if (
854
+ minimum !== undefined && maximum !== undefined &&
855
+ (integer ? minimum > maximum : Model.numberToIndex(minimum) > Model.numberToIndex(maximum))
856
+ ) {
857
+ throw arbitraryError(integer ? "integer constraints" : "number constraints", path)
858
+ }
859
+ return { minimum, maximum }
860
+ }
861
+
862
+ interface NumberShrink {
863
+ readonly value: number
864
+ readonly context: number | undefined
865
+ }
866
+
867
+ function shrinkInteger(current: number, target: number, tryTargetAsap: boolean): ReadonlyArray<NumberShrink> {
868
+ const out: Array<NumberShrink> = []
869
+ const realGap = current - target
870
+ let previous = tryTargetAsap ? undefined : target
871
+ for (
872
+ let toRemove = tryTargetAsap ? realGap : Math.trunc(realGap / 2);
873
+ toRemove !== 0;
874
+ toRemove = Math.trunc(toRemove / 2)
875
+ ) {
876
+ const value = toRemove === realGap ? target : current - toRemove
877
+ out.push({ value, context: previous })
878
+ previous = value
879
+ }
880
+ return out
881
+ }
882
+
883
+ function shrinkNumber(current: number, target: number, tryTargetAsap: boolean): ReadonlyArray<NumberShrink> {
884
+ if (Number.isNaN(current)) return [{ value: target, context: undefined }]
885
+ const currentIndex = Model.numberToIndex(current)
886
+ const targetIndex = Model.numberToIndex(target)
887
+ const realGap = currentIndex - targetIndex
888
+ let previous = tryTargetAsap ? undefined : target
889
+ const out: Array<NumberShrink> = []
890
+ for (
891
+ let toRemove = tryTargetAsap ? realGap : realGap / BigInt(2);
892
+ toRemove !== BigInt(0);
893
+ toRemove /= BigInt(2)
894
+ ) {
895
+ const value = toRemove === realGap ? target : Model.indexToNumber(currentIndex - toRemove)
896
+ out.push({ value, context: previous })
897
+ previous = value
898
+ }
899
+ return out
900
+ }
901
+
902
+ function numberTarget(minimum: number | undefined, maximum: number | undefined): number {
903
+ if (minimum !== undefined && minimum > 0) return minimum
904
+ if (maximum !== undefined && maximum < 0) return maximum
905
+ return 0
906
+ }
907
+
908
+ function numberSample(
909
+ value: number,
910
+ minimum: number | undefined,
911
+ maximum: number | undefined,
912
+ integer: boolean,
913
+ context?: number
914
+ ): Model.Sample<number> {
915
+ if (!integer) {
916
+ // fast-check v4.9.0's double arbitrary shrinks the monotone IEEE-754 index through its BigInt arbitrary (MIT).
917
+ // The sample keeps the equivalent last-passing index context without exposing either representation.
918
+ // https://github.com/dubzzz/fast-check/blob/v4.9.0/packages/fast-check/src/arbitrary/double.ts
919
+ let candidates: ReadonlyArray<NumberShrink>
920
+ const target = numberTarget(minimum, maximum)
921
+ if (context === undefined) {
922
+ candidates = shrinkNumber(value, target, true)
923
+ } else if (
924
+ !Number.isNaN(value) &&
925
+ (Model.numberToIndex(value) === Model.numberToIndex(context) + BigInt(1) ||
926
+ Model.numberToIndex(value) === Model.numberToIndex(context) - BigInt(1))
927
+ ) {
928
+ candidates = [{ value: context, context: undefined }]
929
+ } else {
930
+ candidates = shrinkNumber(value, context, false)
931
+ }
932
+ return Model.makeSample(
933
+ value,
934
+ candidates.length === 0
935
+ ? undefined
936
+ : Effect.map(
937
+ Model.pullFromArray(candidates),
938
+ (candidate) => numberSample(candidate.value, minimum, maximum, false, candidate.context)
939
+ )
940
+ )
941
+ }
942
+ // The passing-value context and halving sequence are adapted from fast-check v4.9.0's IntegerArbitrary and
943
+ // ShrinkInteger (MIT). Retaining the closest passing candidate lets the runner converge on a local failure boundary.
944
+ // https://github.com/dubzzz/fast-check/blob/v4.9.0/packages/fast-check/src/arbitrary/_internals/IntegerArbitrary.ts
945
+ // https://github.com/dubzzz/fast-check/blob/v4.9.0/packages/fast-check/src/arbitrary/_internals/helpers/ShrinkInteger.ts
946
+ let candidates: ReadonlyArray<NumberShrink>
947
+ if (context === undefined) {
948
+ const target = Math.min(maximum ?? 0, Math.max(minimum ?? 0, 0))
949
+ candidates = shrinkInteger(value, target, true)
950
+ } else if (
951
+ value > 0 && value === context + 1 && (minimum === undefined || value > minimum) ||
952
+ value < 0 && value === context - 1 && (maximum === undefined || value < maximum)
953
+ ) {
954
+ candidates = [{ value: context, context: undefined }]
955
+ } else {
956
+ candidates = shrinkInteger(value, context, false)
957
+ }
958
+ return Model.makeSample(
959
+ value,
960
+ candidates.length === 0
961
+ ? undefined
962
+ : Effect.map(
963
+ Model.pullFromArray(candidates),
964
+ (candidate) => numberSample(candidate.value, minimum, maximum, true, candidate.context)
965
+ )
966
+ )
967
+ }
968
+
969
+ interface BigIntShrink {
970
+ readonly value: bigint
971
+ readonly context: bigint | undefined
972
+ }
973
+
974
+ function shrinkBigInt(current: bigint, target: bigint, tryTargetAsap: boolean): ReadonlyArray<BigIntShrink> {
975
+ const out: Array<BigIntShrink> = []
976
+ const realGap = current - target
977
+ let previous = tryTargetAsap ? undefined : target
978
+ for (
979
+ let toRemove = tryTargetAsap ? realGap : realGap / BigInt(2);
980
+ toRemove !== BigInt(0);
981
+ toRemove /= BigInt(2)
982
+ ) {
983
+ const value = current - toRemove
984
+ out.push({ value, context: previous })
985
+ previous = value
986
+ }
987
+ return out
988
+ }
989
+
990
+ function bigIntSample(
991
+ value: bigint,
992
+ minimum: bigint | undefined,
993
+ maximum: bigint | undefined,
994
+ context?: bigint
995
+ ): Model.Sample<bigint> {
996
+ // The passing-value context and gap-halving sequence are adapted from fast-check v4.9.0's BigIntArbitrary and
997
+ // ShrinkBigInt (MIT). Retaining the closest passing candidate lets the runner converge on a local failure boundary.
998
+ // https://github.com/dubzzz/fast-check/blob/v4.9.0/packages/fast-check/src/arbitrary/_internals/BigIntArbitrary.ts
999
+ // https://github.com/dubzzz/fast-check/blob/v4.9.0/packages/fast-check/src/arbitrary/_internals/helpers/ShrinkBigInt.ts
1000
+ let candidates: ReadonlyArray<BigIntShrink>
1001
+ if (context === undefined) {
1002
+ const target = minimum !== undefined && minimum > BigInt(0)
1003
+ ? minimum
1004
+ : maximum !== undefined && maximum < BigInt(0)
1005
+ ? maximum
1006
+ : BigInt(0)
1007
+ candidates = shrinkBigInt(value, target, true)
1008
+ } else if (
1009
+ value > BigInt(0) && value === context + BigInt(1) && (minimum === undefined || value > minimum) ||
1010
+ value < BigInt(0) && value === context - BigInt(1) && (maximum === undefined || value < maximum)
1011
+ ) {
1012
+ candidates = [{ value: context, context: undefined }]
1013
+ } else {
1014
+ candidates = shrinkBigInt(value, context, false)
1015
+ }
1016
+ return Model.makeSample(
1017
+ value,
1018
+ candidates.length === 0
1019
+ ? undefined
1020
+ : Effect.map(
1021
+ Model.pullFromArray(candidates),
1022
+ (candidate) => bigIntSample(candidate.value, minimum, maximum, candidate.context)
1023
+ )
1024
+ )
1025
+ }
1026
+
1027
+ /** @internal */
1028
+ export function compile<S extends Schema.Constraint>(schema: S): Model.Compiled<S["Type"]> {
1029
+ const rootAst = SchemaAST.toType(schema.ast)
1030
+ const cache = new WeakMap<SchemaAST.AST, Map<Constraint | undefined, Model.Compiled<any>>>()
1031
+ const nodes: Array<Model.Compiled<any>> = []
1032
+ const suspendBodies = new Map<Model.Compiled<any>, Model.Compiled<any>>()
1033
+ const pending: Array<() => void> = []
1034
+ const recur = (
1035
+ ast: SchemaAST.AST,
1036
+ path: ReadonlyArray<PropertyKey>,
1037
+ inherited?: Constraint
1038
+ ): Model.Compiled<any> => {
1039
+ let entries = cache.get(ast)
1040
+ const cached = entries?.get(inherited)
1041
+ if (cached !== undefined) return cached
1042
+ if (entries === undefined) {
1043
+ entries = new Map()
1044
+ cache.set(ast, entries)
1045
+ }
1046
+ const placeholder = Model.makeCompiled<any>([], () => infinity, () => Model.discarded)
1047
+ entries.set(inherited, placeholder)
1048
+ nodes.push(placeholder)
1049
+ pending.push(() => {
1050
+ const checks = collectChecks(ast.checks, inherited)
1051
+ const baseAst = ast.checks === undefined ? ast : SchemaAST.replaceChecks(ast, undefined)
1052
+ const base = compileBase(baseAst, path, checks.constraint)
1053
+ if (baseAst._tag === "Suspend") {
1054
+ const body = base.dependencies[0]
1055
+ placeholder.dependencies = [body]
1056
+ placeholder.computeMinCost = () => {
1057
+ if (body.minCost === infinity) return infinity
1058
+ return body.minCost + (placeholder.recursive ? 1 : 0)
1059
+ }
1060
+ placeholder.generate = (state) =>
1061
+ Effect.suspend(() => {
1062
+ if (placeholder.recursive) {
1063
+ if (state.budget.remaining <= 0) return Effect.succeed(Model.discarded)
1064
+ state.budget.remaining--
1065
+ }
1066
+ return Model.toEffectGeneration(body.generate(state))
1067
+ })
1068
+ suspendBodies.set(placeholder, body)
1069
+ } else {
1070
+ placeholder.dependencies = base.dependencies
1071
+ placeholder.computeMinCost = base.computeMinCost
1072
+ placeholder.generate = base.generate
1073
+ }
1074
+ applyFilters(placeholder, ast, checks.filters)
1075
+ })
1076
+ return placeholder
1077
+ }
1078
+
1079
+ const compileBase = (
1080
+ ast: SchemaAST.AST,
1081
+ path: ReadonlyArray<PropertyKey>,
1082
+ constraint: Constraint | undefined
1083
+ ): Model.Compiled<any> => {
1084
+ switch (ast._tag) {
1085
+ case "Never":
1086
+ throw arbitraryError("Never", path)
1087
+ case "Null":
1088
+ return constant(null)
1089
+ case "Undefined":
1090
+ case "Void":
1091
+ return constant(undefined)
1092
+ case "Literal":
1093
+ return constant(ast.literal)
1094
+ case "UniqueSymbol":
1095
+ return constant(ast.symbol)
1096
+ case "Boolean":
1097
+ return Model.makeCompiled(
1098
+ [],
1099
+ () => 0,
1100
+ (state) => {
1101
+ const value = Model.randomBoolean(state)
1102
+ return Model.makeSample(
1103
+ value,
1104
+ state.shrinks && value ? Model.pullFromArray([Model.makeSample(false)]) : undefined
1105
+ )
1106
+ }
1107
+ )
1108
+ case "String": {
1109
+ const patterns: Array<Regexp.Compiled> = []
1110
+ for (const candidate of constraint?.patterns ?? []) {
1111
+ const pattern = Regexp.compile(candidate)
1112
+ if (pattern !== undefined) patterns.push(pattern)
1113
+ }
1114
+ const [minimum, maximum] = lengthBounds(constraint, ["minLength", "maxLength"], path, "string")
1115
+ return Model.makeCompiled(
1116
+ [],
1117
+ () => 0,
1118
+ (state) => {
1119
+ const pattern = patterns.length === 0
1120
+ ? undefined
1121
+ : patterns.length === 1
1122
+ ? patterns[0]
1123
+ : patterns[Model.randomIndex(state, patterns.length)]
1124
+ const currentMaximum = Math.max(minimum, pattern?.minimumLength ?? 0, state.size)
1125
+ const upper = maximum === undefined ? currentMaximum : Math.min(maximum, currentMaximum)
1126
+ let value: string | undefined
1127
+ if (pattern === undefined) {
1128
+ value = randomString(state, minimum, upper)
1129
+ } else {
1130
+ value = pattern.generate(state, minimum, upper)
1131
+ }
1132
+ if (value === undefined) return Model.discarded
1133
+ return state.shrinks
1134
+ ? Model.sampleFromShrink(
1135
+ value,
1136
+ pattern === undefined
1137
+ ? (value) => shrinkString(value, minimum)
1138
+ : (value) => pattern.shrink(value, minimum)
1139
+ )
1140
+ : Model.makeSample(value)
1141
+ }
1142
+ )
1143
+ }
1144
+ case "Number": {
1145
+ const integer = constraint?.number === "integer"
1146
+ const bounds = numberBounds(constraint, integer, path)
1147
+ const numberMinimum = bounds.minimum ?? (constraint?.number !== undefined
1148
+ ? -Number.MAX_VALUE
1149
+ : Number.NEGATIVE_INFINITY)
1150
+ const numberMaximum = bounds.maximum ?? (constraint?.number !== undefined
1151
+ ? Number.MAX_VALUE
1152
+ : Number.POSITIVE_INFINITY)
1153
+ const randomNumber = integer
1154
+ ? undefined
1155
+ : Model.makeRandomNumber(
1156
+ numberMinimum,
1157
+ numberMaximum,
1158
+ constraint?.number === undefined && bounds.minimum === undefined
1159
+ )
1160
+ let integerMinimum: number | undefined
1161
+ let integerMaximum: number | undefined
1162
+ let randomInteger: ((state: Model.GenerationState) => number) | undefined
1163
+ return Model.makeCompiled(
1164
+ [],
1165
+ () => 0,
1166
+ (state) => {
1167
+ let minimum = numberMinimum
1168
+ let maximum = numberMaximum
1169
+ if (integer) {
1170
+ const magnitude = Math.max(1, state.size * state.size)
1171
+ const center = bounds.minimum !== undefined && bounds.minimum > 0
1172
+ ? bounds.minimum
1173
+ : bounds.maximum !== undefined && bounds.maximum < 0
1174
+ ? bounds.maximum
1175
+ : 0
1176
+ minimum = bounds.minimum ?? center - magnitude
1177
+ maximum = bounds.maximum ?? center + magnitude
1178
+ if (randomInteger === undefined || minimum !== integerMinimum || maximum !== integerMaximum) {
1179
+ integerMinimum = minimum
1180
+ integerMaximum = maximum
1181
+ randomInteger = Model.makeRandomNumericInt(minimum, maximum)
1182
+ }
1183
+ }
1184
+ const value = integer
1185
+ ? randomInteger!(state)
1186
+ : randomNumber!(state)
1187
+ return state.shrinks
1188
+ ? numberSample(value, bounds.minimum, bounds.maximum, integer)
1189
+ : Model.makeSample(value)
1190
+ }
1191
+ )
1192
+ }
1193
+ case "BigInt": {
1194
+ const ordered = constraint?.order === Order.BigInt ? constraint : undefined
1195
+ let minimum = ordered?.minimum as bigint | undefined
1196
+ let maximum = ordered?.maximum as bigint | undefined
1197
+ if (minimum !== undefined && ordered?.exclusiveMinimum === true) minimum++
1198
+ if (maximum !== undefined && ordered?.exclusiveMaximum === true) maximum--
1199
+ if (minimum !== undefined && maximum !== undefined && minimum > maximum) {
1200
+ throw arbitraryError("bigint constraints", path)
1201
+ }
1202
+ let previousLow: bigint | undefined
1203
+ let previousHigh: bigint | undefined
1204
+ let randomBigInt: ((state: Model.GenerationState) => bigint) | undefined
1205
+ return Model.makeCompiled(
1206
+ [],
1207
+ () => 0,
1208
+ (state) => {
1209
+ const magnitude = BigInt(Math.max(1, state.size * state.size))
1210
+ const center = minimum !== undefined && minimum > BigInt(0)
1211
+ ? minimum
1212
+ : maximum !== undefined && maximum < BigInt(0)
1213
+ ? maximum
1214
+ : BigInt(0)
1215
+ const low = minimum ?? center - magnitude
1216
+ const high = maximum ?? center + magnitude
1217
+ if (randomBigInt === undefined || low !== previousLow || high !== previousHigh) {
1218
+ previousLow = low
1219
+ previousHigh = high
1220
+ randomBigInt = Model.makeRandomNumericBigInt(low, high)
1221
+ }
1222
+ const value = randomBigInt(state)
1223
+ return state.shrinks
1224
+ ? bigIntSample(value, minimum, maximum)
1225
+ : Model.makeSample(value)
1226
+ }
1227
+ )
1228
+ }
1229
+ case "Symbol": {
1230
+ const strings = recur(SchemaAST.string, path, constraint)
1231
+ return Model.makeCompiled(
1232
+ [strings],
1233
+ () => strings.minCost,
1234
+ (state) =>
1235
+ Model.mapGeneration(strings.generate(state), (attempt) =>
1236
+ attempt._tag === "Discarded"
1237
+ ? attempt
1238
+ : Model.mapSample(attempt, (value) => Symbol.for(value)))
1239
+ )
1240
+ }
1241
+ case "Unknown":
1242
+ case "Any": {
1243
+ const json = recur(Schema.Json.ast, path)
1244
+ return Model.makeCompiled([json], () => json.minCost, (state) => json.generate(state))
1245
+ }
1246
+ case "ObjectKeyword": {
1247
+ const json = recur(Schema.Json.ast, path)
1248
+ return Model.makeCompiled(
1249
+ [json],
1250
+ () => 0,
1251
+ (state) =>
1252
+ Model.mapGeneration(json.generate(state), (attempt) => {
1253
+ if (
1254
+ attempt._tag === "Generated" && typeof attempt.value === "object" &&
1255
+ attempt.value !== null
1256
+ ) {
1257
+ return attempt
1258
+ }
1259
+ return Model.makeSample({})
1260
+ })
1261
+ )
1262
+ }
1263
+ case "Enum": {
1264
+ const values = [...new Set(ast.enums.map(([, value]) => value))]
1265
+ if (values.length === 0) throw arbitraryError("an enum with no members", path)
1266
+ return Model.makeCompiled(
1267
+ [],
1268
+ () => 0,
1269
+ (state) => Model.makeSample(values[Model.randomIndex(state, values.length)])
1270
+ )
1271
+ }
1272
+ case "TemplateLiteral": {
1273
+ const parts = ast.parts.map((part, index) => recur(part, [...path, index], finiteNumberConstraint))
1274
+ return Model.makeCompiled(
1275
+ parts,
1276
+ () => sumCosts(parts.map((part) => part.minCost)),
1277
+ (state) =>
1278
+ Model.mapComputation(generateSamples(parts, state), (generated) => {
1279
+ if (generated === undefined) return Model.discarded
1280
+ const sample = arraySample(generated, {
1281
+ fixedCount: generated.length,
1282
+ optionalCount: 0,
1283
+ repeatCount: 0,
1284
+ tailCount: 0,
1285
+ minimum: generated.length
1286
+ }, state.shrinks)
1287
+ return Model.mapSample(sample, (parts) => parts.map(globalThis.String).join(""))
1288
+ })
1289
+ )
1290
+ }
1291
+ case "Union": {
1292
+ const members = ast.types.map((member) => recur(member, path, constraint))
1293
+ if (members.length === 0) throw arbitraryError("a union with no members", path)
1294
+ let generate = (state: Model.GenerationState): Model.Generation<unknown> => Model.generateUnion(members, state)
1295
+ if (ast.options?.mode === "oneOf") {
1296
+ const parse = SchemaParser.run<unknown, never>(ast)
1297
+ const validate = (value: unknown) => optionComputation(parse(value))
1298
+ generate = (state) => Model.filterMapGeneration(Model.generateUnion(members, state), validate)
1299
+ }
1300
+ return Model.makeCompiled(
1301
+ members,
1302
+ () => Math.min(...members.map((member) => member.minCost)),
1303
+ generate
1304
+ )
1305
+ }
1306
+ case "Arrays":
1307
+ return compileArrays(ast, path, constraint)
1308
+ case "Objects": {
1309
+ const compiled = compileObjects(ast, path, constraint)
1310
+ if (
1311
+ ast.indexSignatures.length === 0 ||
1312
+ (ast.indexSignatures.length === 1 && ast.propertySignatures.length === 0)
1313
+ ) return compiled
1314
+ const parse = SchemaParser.run<Record<PropertyKey, any>, never>(
1315
+ new SchemaAST.Objects([], ast.indexSignatures)
1316
+ )
1317
+ const generate = compiled.generate
1318
+ compiled.generate = (state) =>
1319
+ Model.filterMapGeneration(
1320
+ generate(state),
1321
+ (value) =>
1322
+ Model.mapComputation(optionComputation(parse(value)), (parsed) =>
1323
+ Option.isNone(parsed) ? parsed : Option.some(value))
1324
+ )
1325
+ return compiled
1326
+ }
1327
+ case "Suspend": {
1328
+ const body = recur(ast.thunk(), path)
1329
+ return Model.makeCompiled([body], () => body.minCost, (state) => body.generate(state))
1330
+ }
1331
+ case "Declaration":
1332
+ return compileDeclaration(ast, path, constraint)
1333
+ }
1334
+ }
1335
+
1336
+ const compileArrays = (
1337
+ ast: SchemaAST.Arrays,
1338
+ path: ReadonlyArray<PropertyKey>,
1339
+ constraint: Constraint | undefined
1340
+ ): Model.Compiled<ReadonlyArray<any>> => {
1341
+ const uniqueBy = constraint?.uniqueBy
1342
+ const elements = ast.elements.map((element, index) => ({
1343
+ optional: SchemaAST.isOptional(element),
1344
+ compiled: recur(element, [...path, index])
1345
+ }))
1346
+ const requiredCount = elements.findIndex((element) => element.optional)
1347
+ const required = requiredCount === -1 ? elements.length : requiredCount
1348
+ const optional = elements.length - required
1349
+ const rest = ast.rest.map((element, index) => recur(element, [...path, elements.length + index]))
1350
+ const head = rest[0]
1351
+ const tail = rest.slice(1)
1352
+ const [minimum, maximum] = lengthBounds(constraint, ["minLength", "maxLength"], path, "array")
1353
+ if (
1354
+ maximum !== undefined && maximum < required + tail.length ||
1355
+ head === undefined && minimum > elements.length + tail.length
1356
+ ) {
1357
+ throw arbitraryError("array constraints", path)
1358
+ }
1359
+ const dependencies = [...elements.map((element) => element.compiled), ...rest]
1360
+ const combinations = (limit: number): Array<readonly [optional: number, repeat: number, cost: number]> => {
1361
+ const out: Array<readonly [number, number, number]> = []
1362
+ const requiredCost = sumCosts(elements.slice(0, required).map((element) => element.compiled.minCost))
1363
+ const tailCost = sumCosts(tail.map((element) => element.minCost))
1364
+ const currentMaximum = Math.max(minimum, required + tail.length, limit)
1365
+ const upper = maximum === undefined ? currentMaximum : Math.min(maximum, currentMaximum)
1366
+ for (let optionalCount = 0; optionalCount <= optional; optionalCount++) {
1367
+ const fixed = required + optionalCount + tail.length
1368
+ const minimumRepeat = Math.max(0, minimum - fixed)
1369
+ const maximumRepeat = head === undefined ? 0 : Math.max(minimumRepeat, upper - fixed)
1370
+ if (fixed + minimumRepeat > upper || head === undefined && minimumRepeat > 0) continue
1371
+ const optionalCost = sumCosts(
1372
+ elements.slice(required, required + optionalCount).map((element) => element.compiled.minCost)
1373
+ )
1374
+ for (let repeat = minimumRepeat; repeat <= maximumRepeat; repeat++) {
1375
+ if ((repeat > 0 || tail.length > 0) && optionalCount < optional) continue
1376
+ const repeatCost = repeat === 0 ? 0 : repeat * (head?.minCost ?? 0)
1377
+ const cost = requiredCost + optionalCost + tailCost + repeatCost
1378
+ out.push([optionalCount, repeat, cost])
1379
+ }
1380
+ }
1381
+ return out
1382
+ }
1383
+ let cachedLimit: number | undefined
1384
+ let cachedBudget: number | undefined
1385
+ let cachedCombinations: ReadonlyArray<readonly [optional: number, repeat: number, cost: number]> = []
1386
+ let cachedPossible: ReadonlyArray<readonly [optional: number, repeat: number, cost: number]> = []
1387
+ const possibleCombinations = (limit: number, budget: number) => {
1388
+ if (limit !== cachedLimit) {
1389
+ cachedLimit = limit
1390
+ cachedBudget = undefined
1391
+ cachedCombinations = combinations(limit)
1392
+ }
1393
+ if (budget !== cachedBudget) {
1394
+ cachedBudget = budget
1395
+ cachedPossible = cachedCombinations.filter(([, , cost]) => cost <= budget)
1396
+ }
1397
+ return cachedPossible
1398
+ }
1399
+ return Model.makeCompiled(
1400
+ dependencies,
1401
+ () => {
1402
+ const possible = combinations(0)
1403
+ return possible.length === 0 ? infinity : Math.min(...possible.map(([, , cost]) => cost))
1404
+ },
1405
+ (state) => {
1406
+ const possible = possibleCombinations(state.size, state.budget.remaining)
1407
+ if (possible.length === 0) return Model.discarded
1408
+ const [optionalCount, repeatCount] = possible[Model.randomLength(state, 0, possible.length - 1)]
1409
+ // Explicit collection minima must stay productive while progressive checks are still at size zero.
1410
+ const itemState = state.size >= repeatCount ? state : { ...state, size: repeatCount }
1411
+ // Lower homogeneous arrays directly when no shrink context is needed.
1412
+ if (
1413
+ !state.shrinks && elements.length === 0 && tail.length === 0 && head !== undefined &&
1414
+ (!head.mayRecurse || uniqueBy === undefined)
1415
+ ) {
1416
+ return head.mayRecurse
1417
+ ? generateRepeatedRecursiveValues(head, repeatCount, itemState)
1418
+ : uniqueBy !== undefined
1419
+ ? generateRepeatedUniqueValues(head, repeatCount, itemState, uniqueBy)
1420
+ : generateRepeatedValues(head, repeatCount, itemState)
1421
+ }
1422
+ const selected = [
1423
+ ...elements.slice(0, required + optionalCount).map((element) => element.compiled),
1424
+ ...Array.from({ length: repeatCount }, () => head!),
1425
+ ...tail
1426
+ ]
1427
+ const makeAttempt = (generated: ReadonlyArray<Model.Sample<any>>) =>
1428
+ arraySample(generated, {
1429
+ fixedCount: required + optionalCount,
1430
+ optionalCount,
1431
+ repeatCount,
1432
+ tailCount: tail.length,
1433
+ minimum
1434
+ }, state.shrinks)
1435
+ if (uniqueBy === undefined) {
1436
+ return Model.mapComputation(
1437
+ generateSamples(selected, itemState),
1438
+ (generated) => generated === undefined ? Model.discarded : makeAttempt(generated)
1439
+ )
1440
+ }
1441
+ // The requested-length consecutive duplicate circuit breaker follows fast-check v4.9.0's ArrayArbitrary
1442
+ // strategy (MIT).
1443
+ // https://github.com/dubzzz/fast-check/blob/v4.9.0/packages/fast-check/src/arbitrary/_internals/ArrayArbitrary.ts
1444
+ const generated: Array<Model.Sample<any>> = []
1445
+ const addUnique = makeUniqueAdderBy(uniqueBy)
1446
+ let reserved = sumCosts(selected.map((child) => child.minCost))
1447
+ const maximumRetries = selected.length
1448
+ let index = 0
1449
+ let retries = 0
1450
+ let budget = state.budget.remaining
1451
+ const loop = (): Model.Generation<ReadonlyArray<any>> => {
1452
+ while (index < selected.length) {
1453
+ const child = selected[index]
1454
+ if (retries === 0) {
1455
+ reserved -= child.minCost
1456
+ budget = state.budget.remaining
1457
+ }
1458
+ const generatedChild = Model.generateWithReservedBudget(child, itemState, reserved)
1459
+ if (Model.isAttempt(generatedChild)) {
1460
+ const attempt = generatedChild
1461
+ if (attempt._tag === "Discarded") return Model.discarded
1462
+ if (!addUnique(attempt.value)) {
1463
+ if (++retries >= maximumRetries) return Model.discarded
1464
+ state.budget.remaining = budget
1465
+ continue
1466
+ }
1467
+ generated.push(attempt)
1468
+ index++
1469
+ retries = 0
1470
+ continue
1471
+ }
1472
+ return Effect.flatMapEager(generatedChild, (attempt) => {
1473
+ if (attempt._tag === "Discarded") return Effect.succeed(Model.discarded)
1474
+ if (!addUnique(attempt.value)) {
1475
+ if (++retries >= maximumRetries) return Effect.succeed(Model.discarded)
1476
+ state.budget.remaining = budget
1477
+ } else {
1478
+ generated.push(attempt)
1479
+ index++
1480
+ retries = 0
1481
+ }
1482
+ return Model.toEffect(loop())
1483
+ })
1484
+ }
1485
+ return makeAttempt(generated)
1486
+ }
1487
+ return loop()
1488
+ }
1489
+ )
1490
+ }
1491
+
1492
+ const compileObjects = (
1493
+ ast: SchemaAST.Objects,
1494
+ path: ReadonlyArray<PropertyKey>,
1495
+ constraint: Constraint | undefined
1496
+ ): Model.Compiled<Record<PropertyKey, any>> => {
1497
+ const constrainedIndexes = ast.indexSignatures.flatMap((index, position) => {
1498
+ const constraint = collectChecks(index.type.checks, undefined).constraint
1499
+ return constraint === undefined ? [] : [{ index, position, constraint }]
1500
+ })
1501
+ const compileIndexedValue = (type: SchemaAST.AST, path: ReadonlyArray<PropertyKey>) => {
1502
+ const compiled = recur(type, path)
1503
+ // Scalar specializations have no recursive dependencies and keep the same minimum cost.
1504
+ const candidates = type._tag === "String" || type._tag === "Number" || type._tag === "BigInt"
1505
+ ? constrainedIndexes.filter(({ index }) => index.type !== type && index.type._tag === type._tag)
1506
+ : []
1507
+ const specializations = new Map<string, Model.Compiled<any>>()
1508
+ const forKey = (key: PropertyKey): Model.Compiled<any> => {
1509
+ if (candidates.length === 0) return compiled
1510
+ const input = { [key]: undefined }
1511
+ const matching = candidates.filter(({ index }) =>
1512
+ SchemaAST.getIndexSignatureKeys(input, index.parameter).length > 0
1513
+ )
1514
+ if (matching.length === 0) return compiled
1515
+ const cacheKey = matching.map(({ position }) => position).join(",")
1516
+ const cached = specializations.get(cacheKey)
1517
+ if (cached !== undefined) return cached
1518
+ let specialized = compiled
1519
+ try {
1520
+ let inherited: Constraint | undefined
1521
+ for (const match of matching) inherited = mergeConstraint(inherited, match.constraint)
1522
+ const checks = collectChecks(type.checks, inherited)
1523
+ specialized = compileBase(type, path, checks.constraint)
1524
+ specialized.minCost = 0
1525
+ applyFilters(specialized, type, checks.filters)
1526
+ } catch {
1527
+ // Incompatible scalar constraints keep the original generator and indexed validation.
1528
+ }
1529
+ specializations.set(cacheKey, specialized)
1530
+ return specialized
1531
+ }
1532
+ return {
1533
+ compiled,
1534
+ forKey
1535
+ }
1536
+ }
1537
+ const properties = ast.propertySignatures.map((property) => ({
1538
+ property,
1539
+ optional: SchemaAST.isOptional(property.type),
1540
+ compiled: compileIndexedValue(property.type, [...path, property.name]).forKey(property.name)
1541
+ }))
1542
+ const indexes = ast.indexSignatures.map((index, position) => {
1543
+ const value = compileIndexedValue(index.type, [...path, `index-${position}-value`])
1544
+ return {
1545
+ parameter: recur(index.parameter, [...path, `index-${position}-key`]),
1546
+ value: value.compiled,
1547
+ valueForKey: value.forKey
1548
+ }
1549
+ })
1550
+ const required = properties.filter((property) => !property.optional)
1551
+ const optional = properties.filter((property) => property.optional)
1552
+ const [minimum, maximum] = lengthBounds(
1553
+ constraint,
1554
+ ["minProperties", "maxProperties"],
1555
+ path,
1556
+ "object property"
1557
+ )
1558
+ if (maximum !== undefined && maximum < required.length || indexes.length === 0 && minimum > properties.length) {
1559
+ throw arbitraryError("object property constraints", path)
1560
+ }
1561
+ const needed = Math.max(0, minimum - required.length)
1562
+ const minOptional = indexes.length === 0 ? needed : 0
1563
+ const fallbackOptionalCount = Math.min(optional.length, needed)
1564
+ const dependencies = [
1565
+ ...properties.map((property) => property.compiled),
1566
+ ...indexes.flatMap((index) => [index.parameter, index.value])
1567
+ ]
1568
+ return Model.makeCompiled(
1569
+ dependencies,
1570
+ () => {
1571
+ const requiredCost = sumCosts(required.map((property) => property.compiled.minCost))
1572
+ const optionalCosts = optional.map((property) => property.compiled.minCost).sort((a, b) => a - b)
1573
+ if (needed <= optionalCosts.length) return requiredCost + sumCosts(optionalCosts.slice(0, needed))
1574
+ if (indexes.length === 0) return infinity
1575
+ const indexCost = Math.min(...indexes.map((index) => index.parameter.minCost + index.value.minCost))
1576
+ return requiredCost + sumCosts(optionalCosts) + (needed - optionalCosts.length) * indexCost
1577
+ },
1578
+ (state) => {
1579
+ if (!state.shrinks && optional.length === 0 && indexes.length === 0) {
1580
+ return generateRequiredObjectValues(required, state, state.nullPrototype)
1581
+ }
1582
+ const currentMaximum = Math.max(minimum, required.length, state.size)
1583
+ const upper = maximum === undefined ? currentMaximum : Math.min(maximum, currentMaximum)
1584
+ const maxOptional = Math.min(optional.length, upper - required.length)
1585
+ const minimumIndexCost = indexes.length === 0
1586
+ ? infinity
1587
+ : Math.min(...indexes.map((index) => index.parameter.minCost + index.value.minCost))
1588
+ const optionalCount = Model.randomInt(state, minOptional, maxOptional)
1589
+ const shuffledOptional = optionalCount === 0 ? undefined : Model.shuffle(state, optional)
1590
+ let selectedOptional = optionalCount === 0 ? [] : shuffledOptional!.slice(0, optionalCount)
1591
+ let named = [...required, ...selectedOptional]
1592
+ let minimumIndexes = Math.max(0, minimum - named.length)
1593
+ let namedCost = sumCosts(named.map((property) => property.compiled.minCost))
1594
+ if (namedCost + (minimumIndexes === 0 ? 0 : minimumIndexes * minimumIndexCost) > state.budget.remaining) {
1595
+ selectedOptional = (shuffledOptional ?? Model.shuffle(state, optional))
1596
+ .sort((a, b) => a.compiled.minCost - b.compiled.minCost)
1597
+ .slice(0, fallbackOptionalCount)
1598
+ named = [...required, ...selectedOptional]
1599
+ minimumIndexes = Math.max(0, minimum - named.length)
1600
+ namedCost = sumCosts(named.map((property) => property.compiled.minCost))
1601
+ }
1602
+ const maximumIndexes = indexes.length === 0
1603
+ ? 0
1604
+ : upper - named.length
1605
+ const affordableIndexes = minimumIndexCost === 0
1606
+ ? maximumIndexes
1607
+ : minimumIndexCost === infinity
1608
+ ? 0
1609
+ : Math.min(maximumIndexes, Math.floor((state.budget.remaining - namedCost) / minimumIndexCost))
1610
+ if (affordableIndexes < minimumIndexes) return Model.discarded
1611
+ const indexCount = Model.randomLength(state, minimumIndexes, affordableIndexes)
1612
+ const indexReserved = indexCount === 0 ? 0 : indexCount * minimumIndexCost
1613
+ return Model.flatMapComputation(
1614
+ generateSamples(named.map((property) => property.compiled), state, indexReserved),
1615
+ (samples) => {
1616
+ if (samples === undefined) return Model.discarded
1617
+ const entries: Array<ObjectEntry> = samples.map((sample, index) => ({
1618
+ key: named[index].property.name,
1619
+ sample,
1620
+ removable: named[index].optional
1621
+ }))
1622
+ if (indexCount === 0) {
1623
+ return objectSample(entries, minimum, state.nullPrototype, state.shrinks)
1624
+ }
1625
+ return Effect.gen(function*() {
1626
+ for (let position = 0; position < indexCount; position++) {
1627
+ const futureReserved = (indexCount - position - 1) * minimumIndexCost
1628
+ const eligible = indexes.filter((index) =>
1629
+ index.parameter.minCost + index.value.minCost + futureReserved <= state.budget.remaining
1630
+ )
1631
+ if (eligible.length === 0) return Model.discarded
1632
+ const index = eligible[Model.randomIndex(state, eligible.length)]
1633
+ const budget = state.budget.remaining
1634
+ const reservedAfterKey = index.value.minCost + futureReserved
1635
+ // Multiple required index entries need enough key diversity before progressive size can advance.
1636
+ const keyState = state.size >= indexCount ? state : { ...state, size: indexCount }
1637
+ let keyAttempt = yield* Model.toEffectGeneration(
1638
+ Model.generateWithReservedBudget(index.parameter, keyState, reservedAfterKey)
1639
+ )
1640
+ let keySample: Model.Sample<PropertyKey>
1641
+ let retries = 0
1642
+ while (true) {
1643
+ if (keyAttempt._tag === "Discarded") return Model.discarded
1644
+ const normalized = normalizePropertyKeySample(keyAttempt)
1645
+ if (normalized === undefined) return Model.discarded
1646
+ keySample = normalized
1647
+ if (!entries.some((entry) => entry.key === keySample.value)) break
1648
+ if (retries++ >= 10) return Model.discarded
1649
+ state.budget.remaining = budget
1650
+ keyAttempt = yield* Model.toEffectGeneration(
1651
+ Model.generateWithReservedBudget(index.parameter, keyState, reservedAfterKey)
1652
+ )
1653
+ }
1654
+ const value = yield* Model.toEffectGeneration(
1655
+ Model.generateWithReservedBudget(index.valueForKey(keySample.value), state, futureReserved)
1656
+ )
1657
+ if (value._tag === "Discarded") return Model.discarded
1658
+ entries.push({ key: keySample.value, keySample, sample: value, removable: true })
1659
+ }
1660
+ return objectSample(entries, minimum, state.nullPrototype, state.shrinks)
1661
+ })
1662
+ }
1663
+ )
1664
+ }
1665
+ )
1666
+ }
1667
+
1668
+ const compileDeclaration = (
1669
+ ast: SchemaAST.Declaration,
1670
+ path: ReadonlyArray<PropertyKey>,
1671
+ constraint: Constraint | undefined
1672
+ ): Model.Compiled<any> => {
1673
+ validateConstraint(constraint, path)
1674
+ const typeParameters = ast.typeParameters.map((parameter, index) => recur(parameter, [...path, index]))
1675
+ const parameters = ast.typeParameters.map((parameter) => Schema.make(SchemaAST.toType(parameter)))
1676
+ const getArbitrary = ast.annotations?.toCodecArbitrary
1677
+ let link: SchemaAST.Link
1678
+ if (typeof getArbitrary === "function") {
1679
+ link = getArbitrary({
1680
+ typeParameters: parameters,
1681
+ constraint: withoutOrder(constraint)
1682
+ })
1683
+ } else {
1684
+ const builtInLink = builtInDeclarationLink(ast, parameters, withoutOrder(constraint))
1685
+ if (builtInLink !== undefined) {
1686
+ link = builtInLink
1687
+ } else {
1688
+ const getJson = ast.annotations?.toCodecJson
1689
+ if (typeof getJson === "function") {
1690
+ const jsonLink = getJson(parameters)
1691
+ if (jsonLink === undefined) throw arbitraryError("an opaque self-canonical Declaration", path)
1692
+ link = jsonLink
1693
+ } else {
1694
+ const get = ast.annotations?.toCodec
1695
+ if (typeof get !== "function") throw arbitraryError("an unsupported Declaration", path)
1696
+ link = get(parameters)
1697
+ }
1698
+ }
1699
+ }
1700
+ const target = recur(SchemaAST.toType(link.to), path)
1701
+ const decodeDeclaration = SchemaParser.run<unknown, never>(ast)
1702
+ const decode = (value: unknown): Model.Computation<Option.Option<unknown>> => {
1703
+ const transformed = link.transformation._tag === "Transformation"
1704
+ ? link.transformation.decode.run(Option.some(value), SchemaAST.defaultParseOptions)
1705
+ : link.transformation.decode(Effect.succeed(Option.some(value)), SchemaAST.defaultParseOptions)
1706
+ return Model.flatMapComputation(optionComputation(transformed), (outer) => {
1707
+ if (Option.isNone(outer) || Option.isNone(outer.value)) return Option.none()
1708
+ return optionComputation(decodeDeclaration(outer.value.value))
1709
+ })
1710
+ }
1711
+ return Model.makeCompiled(
1712
+ [target, ...typeParameters],
1713
+ () => target.minCost,
1714
+ (state) => Model.filterMapGeneration(target.generate(state), decode)
1715
+ )
1716
+ }
1717
+
1718
+ const root = recur(rootAst, [])
1719
+ for (let index = 0; index < pending.length; index++) pending[index]()
1720
+ const dependents = analyzeDependencyGraph(nodes, suspendBodies)
1721
+ const recursiveQueue = nodes.filter((node) => node.recursive)
1722
+ for (let index = 0; index < recursiveQueue.length; index++) {
1723
+ const node = recursiveQueue[index]
1724
+ if (node.mayRecurse) continue
1725
+ node.mayRecurse = true
1726
+ recursiveQueue.push(...dependents.get(node)!)
1727
+ }
1728
+ const queue = nodes.slice()
1729
+ const queued = new Set(nodes)
1730
+ for (let index = 0; index < queue.length; index++) {
1731
+ const node = queue[index]
1732
+ queued.delete(node)
1733
+ const next = node.computeMinCost()
1734
+ if (next >= node.minCost) continue
1735
+ node.minCost = next
1736
+ for (const dependent of dependents.get(node)!) {
1737
+ if (!queued.has(dependent)) {
1738
+ queued.add(dependent)
1739
+ queue.push(dependent)
1740
+ }
1741
+ }
1742
+ }
1743
+ if (root.minCost === infinity) {
1744
+ throw arbitraryError("a recursive schema without a finite generation path", [])
1745
+ }
1746
+ return root
1747
+ }
1748
+
1749
+ function analyzeDependencyGraph(
1750
+ nodes: ReadonlyArray<Model.Compiled<any>>,
1751
+ suspendBodies: ReadonlyMap<Model.Compiled<any>, Model.Compiled<any>>
1752
+ ): ReadonlyMap<Model.Compiled<any>, ReadonlyArray<Model.Compiled<any>>> {
1753
+ const visited = new Set<Model.Compiled<any>>()
1754
+ const finished: Array<Model.Compiled<any>> = []
1755
+ for (const root of nodes) {
1756
+ if (visited.has(root)) continue
1757
+ visited.add(root)
1758
+ const stack: Array<{ readonly node: Model.Compiled<any>; index: number }> = [{ node: root, index: 0 }]
1759
+ while (stack.length > 0) {
1760
+ const frame = stack[stack.length - 1]
1761
+ if (frame.index < frame.node.dependencies.length) {
1762
+ const dependency = frame.node.dependencies[frame.index++]
1763
+ if (!visited.has(dependency)) {
1764
+ visited.add(dependency)
1765
+ stack.push({ node: dependency, index: 0 })
1766
+ }
1767
+ } else {
1768
+ finished.push(frame.node)
1769
+ stack.pop()
1770
+ }
1771
+ }
1772
+ }
1773
+
1774
+ const reverse = new Map<Model.Compiled<any>, Array<Model.Compiled<any>>>()
1775
+ for (const node of visited) reverse.set(node, [])
1776
+ for (const node of visited) {
1777
+ for (const dependency of node.dependencies) reverse.get(dependency)?.push(node)
1778
+ }
1779
+ const component = new Map<Model.Compiled<any>, number>()
1780
+ let componentId = 0
1781
+ for (let index = finished.length - 1; index >= 0; index--) {
1782
+ const root = finished[index]
1783
+ if (component.has(root)) continue
1784
+ component.set(root, componentId)
1785
+ const stack = [root]
1786
+ while (stack.length > 0) {
1787
+ const node = stack.pop()!
1788
+ for (const dependency of reverse.get(node)!) {
1789
+ if (component.has(dependency)) continue
1790
+ component.set(dependency, componentId)
1791
+ stack.push(dependency)
1792
+ }
1793
+ }
1794
+ componentId++
1795
+ }
1796
+ for (const [suspend, body] of suspendBodies) {
1797
+ suspend.recursive = component.get(suspend) === component.get(body)
1798
+ }
1799
+ return reverse
1800
+ }