effect 4.0.0-beta.98 → 4.0.0-rc.108

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 (1848) hide show
  1. package/AGENTS.md +381 -0
  2. package/CLAUDE.md +381 -0
  3. package/README.md +13 -20
  4. package/ai-docs/README.md +44 -0
  5. package/ai-docs/package.json +36 -0
  6. package/ai-docs/src/01_effect/01_basics/01_effect-gen.ts +30 -0
  7. package/ai-docs/src/01_effect/01_basics/02_effect-fn.ts +39 -0
  8. package/ai-docs/src/01_effect/01_basics/10_creating-effects.ts +74 -0
  9. package/ai-docs/src/01_effect/01_basics/index.md +5 -0
  10. package/ai-docs/src/01_effect/02_schema/10_schema-basics.ts +43 -0
  11. package/ai-docs/src/01_effect/02_schema/index.md +7 -0
  12. package/ai-docs/src/01_effect/03_services/01_service.ts +45 -0
  13. package/ai-docs/src/01_effect/03_services/10_reference.ts +10 -0
  14. package/ai-docs/src/01_effect/03_services/20_layer-composition.ts +70 -0
  15. package/ai-docs/src/01_effect/03_services/20_layer-unwrap.ts +66 -0
  16. package/ai-docs/src/01_effect/03_services/index.md +5 -0
  17. package/ai-docs/src/01_effect/04_errors/01_error-handling.ts +30 -0
  18. package/ai-docs/src/01_effect/04_errors/10_catch-tags.ts +24 -0
  19. package/ai-docs/src/01_effect/04_errors/20_reason-errors.ts +64 -0
  20. package/ai-docs/src/01_effect/04_errors/index.md +1 -0
  21. package/ai-docs/src/01_effect/05_resources/10_acquire-release.ts +105 -0
  22. package/ai-docs/src/01_effect/05_resources/20_layer-side-effects.ts +31 -0
  23. package/ai-docs/src/01_effect/05_resources/30_layer-map.ts +86 -0
  24. package/ai-docs/src/01_effect/05_resources/index.md +3 -0
  25. package/ai-docs/src/01_effect/06_running/10_run-main.ts +30 -0
  26. package/ai-docs/src/01_effect/06_running/20_layer-launch.ts +27 -0
  27. package/ai-docs/src/01_effect/06_running/index.md +1 -0
  28. package/ai-docs/src/01_effect/07_pubsub/10_pubsub.ts +56 -0
  29. package/ai-docs/src/01_effect/07_pubsub/index.md +3 -0
  30. package/ai-docs/src/03_stream/10_creating-streams.ts +103 -0
  31. package/ai-docs/src/03_stream/20_consuming-streams.ts +137 -0
  32. package/ai-docs/src/03_stream/30_encoding.ts +165 -0
  33. package/ai-docs/src/03_stream/index.md +4 -0
  34. package/ai-docs/src/04_integration/10_managed-runtime.ts +129 -0
  35. package/ai-docs/src/04_integration/index.md +5 -0
  36. package/ai-docs/src/05_batching/10_request-resolver.ts +89 -0
  37. package/ai-docs/src/05_batching/index.md +3 -0
  38. package/ai-docs/src/06_schedule/10_schedules.ts +110 -0
  39. package/ai-docs/src/06_schedule/index.md +3 -0
  40. package/ai-docs/src/07_datetime/10_creating-and-formatting.ts +30 -0
  41. package/ai-docs/src/07_datetime/20_time-zones.ts +44 -0
  42. package/ai-docs/src/07_datetime/index.md +5 -0
  43. package/ai-docs/src/08_observability/10_logging.ts +66 -0
  44. package/ai-docs/src/08_observability/20_otlp-tracing.ts +95 -0
  45. package/ai-docs/src/08_observability/index.md +7 -0
  46. package/ai-docs/src/09_testing/10_effect-tests.ts +55 -0
  47. package/ai-docs/src/09_testing/20_layer-tests.ts +138 -0
  48. package/ai-docs/src/09_testing/index.md +1 -0
  49. package/ai-docs/src/10_predicate/01_basics.ts +14 -0
  50. package/ai-docs/src/10_predicate/index.md +9 -0
  51. package/ai-docs/src/50_http-client/10_basics.ts +102 -0
  52. package/ai-docs/src/50_http-client/index.md +3 -0
  53. package/ai-docs/src/51_http-server/10_basics.ts +116 -0
  54. package/ai-docs/src/51_http-server/fixtures/api/Api.ts +14 -0
  55. package/ai-docs/src/51_http-server/fixtures/api/Authorization.ts +36 -0
  56. package/ai-docs/src/51_http-server/fixtures/api/System.ts +10 -0
  57. package/ai-docs/src/51_http-server/fixtures/api/Users.ts +91 -0
  58. package/ai-docs/src/51_http-server/fixtures/domain/User.ts +12 -0
  59. package/ai-docs/src/51_http-server/fixtures/domain/UserErrors.ts +22 -0
  60. package/ai-docs/src/51_http-server/fixtures/server/Authorization.ts +36 -0
  61. package/ai-docs/src/51_http-server/fixtures/server/Users/http.ts +71 -0
  62. package/ai-docs/src/51_http-server/fixtures/server/Users.ts +62 -0
  63. package/ai-docs/src/51_http-server/index.md +3 -0
  64. package/ai-docs/src/60_child-process/10_working-with-child-processes.ts +117 -0
  65. package/ai-docs/src/60_child-process/index.md +3 -0
  66. package/ai-docs/src/70_cli/10_basics.ts +136 -0
  67. package/ai-docs/src/70_cli/index.md +5 -0
  68. package/ai-docs/src/71_ai/10_language-model.ts +156 -0
  69. package/ai-docs/src/71_ai/20_tools.ts +226 -0
  70. package/ai-docs/src/71_ai/30_chat.ts +158 -0
  71. package/ai-docs/src/71_ai/fixtures/domain/LaunchPlan.ts +9 -0
  72. package/ai-docs/src/71_ai/index.md +5 -0
  73. package/ai-docs/src/80_cluster/10_entities.ts +97 -0
  74. package/ai-docs/src/80_cluster/index.md +4 -0
  75. package/ai-docs/src/index.md +10 -0
  76. package/ai-docs/tsconfig.json +24 -0
  77. package/dist/Array.d.ts +971 -1037
  78. package/dist/Array.d.ts.map +1 -1
  79. package/dist/Array.js +463 -413
  80. package/dist/Array.js.map +1 -1
  81. package/dist/BigDecimal.d.ts +433 -756
  82. package/dist/BigDecimal.d.ts.map +1 -1
  83. package/dist/BigDecimal.js +200 -325
  84. package/dist/BigDecimal.js.map +1 -1
  85. package/dist/BigInt.d.ts +207 -267
  86. package/dist/BigInt.d.ts.map +1 -1
  87. package/dist/BigInt.js +107 -135
  88. package/dist/BigInt.js.map +1 -1
  89. package/dist/Boolean.d.ts +146 -188
  90. package/dist/Boolean.d.ts.map +1 -1
  91. package/dist/Boolean.js +64 -84
  92. package/dist/Boolean.js.map +1 -1
  93. package/dist/Brand.d.ts +3 -3
  94. package/dist/Brand.d.ts.map +1 -1
  95. package/dist/Brand.js +4 -3
  96. package/dist/Brand.js.map +1 -1
  97. package/dist/Cache.d.ts +409 -256
  98. package/dist/Cache.d.ts.map +1 -1
  99. package/dist/Cache.js +213 -134
  100. package/dist/Cache.js.map +1 -1
  101. package/dist/Cause.d.ts +167 -277
  102. package/dist/Cause.d.ts.map +1 -1
  103. package/dist/Cause.js +122 -176
  104. package/dist/Cause.js.map +1 -1
  105. package/dist/Channel.d.ts +756 -769
  106. package/dist/Channel.d.ts.map +1 -1
  107. package/dist/Channel.js +588 -449
  108. package/dist/Channel.js.map +1 -1
  109. package/dist/ChannelSchema.d.ts +1 -1
  110. package/dist/ChannelSchema.d.ts.map +1 -1
  111. package/dist/ChannelSchema.js.map +1 -1
  112. package/dist/Chunk.d.ts +834 -1173
  113. package/dist/Chunk.d.ts.map +1 -1
  114. package/dist/Chunk.js +326 -439
  115. package/dist/Chunk.js.map +1 -1
  116. package/dist/Clock.d.ts +180 -49
  117. package/dist/Clock.d.ts.map +1 -1
  118. package/dist/Clock.js +96 -31
  119. package/dist/Clock.js.map +1 -1
  120. package/dist/Combiner.d.ts +20 -33
  121. package/dist/Combiner.d.ts.map +1 -1
  122. package/dist/Combiner.js +18 -30
  123. package/dist/Combiner.js.map +1 -1
  124. package/dist/Config.d.ts +226 -174
  125. package/dist/Config.d.ts.map +1 -1
  126. package/dist/Config.js +361 -267
  127. package/dist/Config.js.map +1 -1
  128. package/dist/ConfigProvider.d.ts +229 -71
  129. package/dist/ConfigProvider.d.ts.map +1 -1
  130. package/dist/ConfigProvider.js +164 -95
  131. package/dist/ConfigProvider.js.map +1 -1
  132. package/dist/Console.d.ts +233 -33
  133. package/dist/Console.d.ts.map +1 -1
  134. package/dist/Console.js +232 -32
  135. package/dist/Console.js.map +1 -1
  136. package/dist/Context.d.ts +153 -277
  137. package/dist/Context.d.ts.map +1 -1
  138. package/dist/Context.js +172 -236
  139. package/dist/Context.js.map +1 -1
  140. package/dist/Cron.d.ts +144 -176
  141. package/dist/Cron.d.ts.map +1 -1
  142. package/dist/Cron.js +227 -162
  143. package/dist/Cron.js.map +1 -1
  144. package/dist/Crypto.d.ts +13 -15
  145. package/dist/Crypto.d.ts.map +1 -1
  146. package/dist/Crypto.js +22 -15
  147. package/dist/Crypto.js.map +1 -1
  148. package/dist/Data.d.ts +60 -80
  149. package/dist/Data.d.ts.map +1 -1
  150. package/dist/Data.js +18 -24
  151. package/dist/Data.js.map +1 -1
  152. package/dist/DateTime.d.ts +562 -660
  153. package/dist/DateTime.d.ts.map +1 -1
  154. package/dist/DateTime.js +307 -362
  155. package/dist/DateTime.js.map +1 -1
  156. package/dist/Deferred.d.ts +253 -256
  157. package/dist/Deferred.d.ts.map +1 -1
  158. package/dist/Deferred.js +110 -98
  159. package/dist/Deferred.js.map +1 -1
  160. package/dist/Duration.d.ts +216 -308
  161. package/dist/Duration.d.ts.map +1 -1
  162. package/dist/Duration.js +157 -188
  163. package/dist/Duration.js.map +1 -1
  164. package/dist/Effect.d.ts +3142 -3345
  165. package/dist/Effect.d.ts.map +1 -1
  166. package/dist/Effect.js +1452 -1570
  167. package/dist/Effect.js.map +1 -1
  168. package/dist/Effectable.js.map +1 -1
  169. package/dist/Encoding.d.ts +22 -40
  170. package/dist/Encoding.d.ts.map +1 -1
  171. package/dist/Encoding.js +22 -40
  172. package/dist/Encoding.js.map +1 -1
  173. package/dist/Equal.d.ts +33 -37
  174. package/dist/Equal.d.ts.map +1 -1
  175. package/dist/Equal.js +39 -23
  176. package/dist/Equal.js.map +1 -1
  177. package/dist/Equivalence.d.ts +103 -105
  178. package/dist/Equivalence.d.ts.map +1 -1
  179. package/dist/Equivalence.js +77 -79
  180. package/dist/Equivalence.js.map +1 -1
  181. package/dist/ErrorReporter.d.ts +51 -27
  182. package/dist/ErrorReporter.d.ts.map +1 -1
  183. package/dist/ErrorReporter.js +50 -26
  184. package/dist/ErrorReporter.js.map +1 -1
  185. package/dist/ExecutionPlan.d.ts +86 -55
  186. package/dist/ExecutionPlan.d.ts.map +1 -1
  187. package/dist/ExecutionPlan.js +8 -29
  188. package/dist/ExecutionPlan.js.map +1 -1
  189. package/dist/Exit.d.ts +116 -192
  190. package/dist/Exit.d.ts.map +1 -1
  191. package/dist/Exit.js +82 -130
  192. package/dist/Exit.js.map +1 -1
  193. package/dist/Fiber.d.ts +83 -147
  194. package/dist/Fiber.d.ts.map +1 -1
  195. package/dist/Fiber.js +48 -87
  196. package/dist/Fiber.js.map +1 -1
  197. package/dist/FiberHandle.d.ts +152 -105
  198. package/dist/FiberHandle.d.ts.map +1 -1
  199. package/dist/FiberHandle.js +109 -75
  200. package/dist/FiberHandle.js.map +1 -1
  201. package/dist/FiberMap.d.ts +213 -168
  202. package/dist/FiberMap.d.ts.map +1 -1
  203. package/dist/FiberMap.js +114 -89
  204. package/dist/FiberMap.js.map +1 -1
  205. package/dist/FiberSet.d.ts +123 -81
  206. package/dist/FiberSet.d.ts.map +1 -1
  207. package/dist/FiberSet.js +86 -60
  208. package/dist/FiberSet.js.map +1 -1
  209. package/dist/FileSystem.d.ts +154 -265
  210. package/dist/FileSystem.d.ts.map +1 -1
  211. package/dist/FileSystem.js +42 -147
  212. package/dist/FileSystem.js.map +1 -1
  213. package/dist/Filter.d.ts +61 -33
  214. package/dist/Filter.d.ts.map +1 -1
  215. package/dist/Filter.js +26 -15
  216. package/dist/Filter.js.map +1 -1
  217. package/dist/Formatter.d.ts +24 -32
  218. package/dist/Formatter.d.ts.map +1 -1
  219. package/dist/Formatter.js +55 -60
  220. package/dist/Formatter.js.map +1 -1
  221. package/dist/Function.d.ts +106 -148
  222. package/dist/Function.d.ts.map +1 -1
  223. package/dist/Function.js +81 -62
  224. package/dist/Function.js.map +1 -1
  225. package/dist/Graph.d.ts +1412 -775
  226. package/dist/Graph.d.ts.map +1 -1
  227. package/dist/Graph.js +1180 -561
  228. package/dist/Graph.js.map +1 -1
  229. package/dist/HKT.d.ts +12 -6
  230. package/dist/HKT.d.ts.map +1 -1
  231. package/dist/Hash.d.ts +47 -83
  232. package/dist/Hash.d.ts.map +1 -1
  233. package/dist/Hash.js +46 -68
  234. package/dist/Hash.js.map +1 -1
  235. package/dist/HashMap.d.ts +319 -411
  236. package/dist/HashMap.d.ts.map +1 -1
  237. package/dist/HashMap.js +122 -166
  238. package/dist/HashMap.js.map +1 -1
  239. package/dist/HashRing.d.ts.map +1 -1
  240. package/dist/HashRing.js +1 -0
  241. package/dist/HashRing.js.map +1 -1
  242. package/dist/HashSet.d.ts +177 -284
  243. package/dist/HashSet.d.ts.map +1 -1
  244. package/dist/HashSet.js +68 -109
  245. package/dist/HashSet.js.map +1 -1
  246. package/dist/Inspectable.d.ts +19 -18
  247. package/dist/Inspectable.d.ts.map +1 -1
  248. package/dist/Inspectable.js +20 -16
  249. package/dist/Inspectable.js.map +1 -1
  250. package/dist/Iterable.d.ts +620 -786
  251. package/dist/Iterable.d.ts.map +1 -1
  252. package/dist/Iterable.js +282 -318
  253. package/dist/Iterable.js.map +1 -1
  254. package/dist/JsonPatch.d.ts +11 -13
  255. package/dist/JsonPatch.d.ts.map +1 -1
  256. package/dist/JsonPatch.js +46 -103
  257. package/dist/JsonPatch.js.map +1 -1
  258. package/dist/JsonPointer.d.ts +8 -8
  259. package/dist/JsonPointer.js +8 -8
  260. package/dist/JsonPointer.js.map +1 -1
  261. package/dist/JsonSchema.d.ts +98 -44
  262. package/dist/JsonSchema.d.ts.map +1 -1
  263. package/dist/JsonSchema.js +319 -241
  264. package/dist/JsonSchema.js.map +1 -1
  265. package/dist/Latch.d.ts +23 -35
  266. package/dist/Latch.d.ts.map +1 -1
  267. package/dist/Latch.js +16 -28
  268. package/dist/Latch.js.map +1 -1
  269. package/dist/Layer.d.ts +359 -260
  270. package/dist/Layer.d.ts.map +1 -1
  271. package/dist/Layer.js +202 -180
  272. package/dist/Layer.js.map +1 -1
  273. package/dist/LayerMap.d.ts +42 -29
  274. package/dist/LayerMap.d.ts.map +1 -1
  275. package/dist/LayerMap.js +31 -21
  276. package/dist/LayerMap.js.map +1 -1
  277. package/dist/LayerRef.d.ts +6 -2
  278. package/dist/LayerRef.d.ts.map +1 -1
  279. package/dist/LayerRef.js +6 -2
  280. package/dist/LayerRef.js.map +1 -1
  281. package/dist/LogLevel.d.ts +114 -214
  282. package/dist/LogLevel.d.ts.map +1 -1
  283. package/dist/LogLevel.js +41 -76
  284. package/dist/LogLevel.js.map +1 -1
  285. package/dist/Logger.d.ts +218 -467
  286. package/dist/Logger.d.ts.map +1 -1
  287. package/dist/Logger.js +208 -453
  288. package/dist/Logger.js.map +1 -1
  289. package/dist/ManagedRuntime.d.ts +16 -5
  290. package/dist/ManagedRuntime.d.ts.map +1 -1
  291. package/dist/ManagedRuntime.js +10 -5
  292. package/dist/ManagedRuntime.js.map +1 -1
  293. package/dist/Match.d.ts +217 -252
  294. package/dist/Match.d.ts.map +1 -1
  295. package/dist/Match.js +150 -183
  296. package/dist/Match.js.map +1 -1
  297. package/dist/Metric.d.ts +442 -993
  298. package/dist/Metric.d.ts.map +1 -1
  299. package/dist/Metric.js +202 -645
  300. package/dist/Metric.js.map +1 -1
  301. package/dist/MutableHashMap.d.ts +144 -173
  302. package/dist/MutableHashMap.d.ts.map +1 -1
  303. package/dist/MutableHashMap.js +68 -79
  304. package/dist/MutableHashMap.js.map +1 -1
  305. package/dist/MutableHashSet.d.ts +84 -89
  306. package/dist/MutableHashSet.d.ts.map +1 -1
  307. package/dist/MutableHashSet.js +44 -47
  308. package/dist/MutableHashSet.js.map +1 -1
  309. package/dist/MutableList.d.ts +71 -370
  310. package/dist/MutableList.d.ts.map +1 -1
  311. package/dist/MutableList.js +63 -284
  312. package/dist/MutableList.js.map +1 -1
  313. package/dist/MutableRef.d.ts +420 -243
  314. package/dist/MutableRef.d.ts.map +1 -1
  315. package/dist/MutableRef.js +209 -120
  316. package/dist/MutableRef.js.map +1 -1
  317. package/dist/Newtype.d.ts +21 -14
  318. package/dist/Newtype.d.ts.map +1 -1
  319. package/dist/Newtype.js +15 -13
  320. package/dist/Newtype.js.map +1 -1
  321. package/dist/NonEmptyIterable.d.ts +7 -137
  322. package/dist/NonEmptyIterable.d.ts.map +1 -1
  323. package/dist/NonEmptyIterable.js +5 -93
  324. package/dist/NonEmptyIterable.js.map +1 -1
  325. package/dist/Number.d.ts +196 -233
  326. package/dist/Number.d.ts.map +1 -1
  327. package/dist/Number.js +90 -109
  328. package/dist/Number.js.map +1 -1
  329. package/dist/Optic.d.ts +132 -210
  330. package/dist/Optic.d.ts.map +1 -1
  331. package/dist/Optic.js +221 -324
  332. package/dist/Optic.js.map +1 -1
  333. package/dist/Option.d.ts +447 -812
  334. package/dist/Option.d.ts.map +1 -1
  335. package/dist/Option.js +213 -393
  336. package/dist/Option.js.map +1 -1
  337. package/dist/Order.d.ts +109 -109
  338. package/dist/Order.js +91 -91
  339. package/dist/Order.js.map +1 -1
  340. package/dist/Ordering.d.ts +20 -23
  341. package/dist/Ordering.d.ts.map +1 -1
  342. package/dist/Ordering.js +8 -9
  343. package/dist/Ordering.js.map +1 -1
  344. package/dist/PartitionedSemaphore.d.ts.map +1 -1
  345. package/dist/PartitionedSemaphore.js +1 -4
  346. package/dist/PartitionedSemaphore.js.map +1 -1
  347. package/dist/Path.d.ts +38 -41
  348. package/dist/Path.d.ts.map +1 -1
  349. package/dist/Path.js +3 -4
  350. package/dist/Path.js.map +1 -1
  351. package/dist/Pipeable.d.ts +6 -5
  352. package/dist/Pipeable.d.ts.map +1 -1
  353. package/dist/Pipeable.js +2 -2
  354. package/dist/Pipeable.js.map +1 -1
  355. package/dist/PlatformError.d.ts +4 -4
  356. package/dist/PlatformError.js +3 -3
  357. package/dist/PlatformError.js.map +1 -1
  358. package/dist/Pool.d.ts +4 -2
  359. package/dist/Pool.d.ts.map +1 -1
  360. package/dist/Pool.js +4 -2
  361. package/dist/Pool.js.map +1 -1
  362. package/dist/Predicate.d.ts +200 -181
  363. package/dist/Predicate.d.ts.map +1 -1
  364. package/dist/Predicate.js +100 -108
  365. package/dist/Predicate.js.map +1 -1
  366. package/dist/PrimaryKey.d.ts +7 -7
  367. package/dist/PrimaryKey.js +5 -5
  368. package/dist/PrimaryKey.js.map +1 -1
  369. package/dist/PubSub.d.ts +425 -494
  370. package/dist/PubSub.d.ts.map +1 -1
  371. package/dist/PubSub.js +373 -362
  372. package/dist/PubSub.js.map +1 -1
  373. package/dist/Pull.d.ts +24 -18
  374. package/dist/Pull.d.ts.map +1 -1
  375. package/dist/Pull.js +11 -9
  376. package/dist/Pull.js.map +1 -1
  377. package/dist/Queue.d.ts +200 -159
  378. package/dist/Queue.d.ts.map +1 -1
  379. package/dist/Queue.js +166 -138
  380. package/dist/Queue.js.map +1 -1
  381. package/dist/Random.d.ts +49 -74
  382. package/dist/Random.d.ts.map +1 -1
  383. package/dist/Random.js +35 -54
  384. package/dist/Random.js.map +1 -1
  385. package/dist/RcMap.d.ts +121 -63
  386. package/dist/RcMap.d.ts.map +1 -1
  387. package/dist/RcMap.js +42 -21
  388. package/dist/RcMap.js.map +1 -1
  389. package/dist/RcRef.d.ts +24 -13
  390. package/dist/RcRef.d.ts.map +1 -1
  391. package/dist/RcRef.js +15 -9
  392. package/dist/RcRef.js.map +1 -1
  393. package/dist/Record.d.ts +361 -466
  394. package/dist/Record.d.ts.map +1 -1
  395. package/dist/Record.js +163 -216
  396. package/dist/Record.js.map +1 -1
  397. package/dist/Redactable.d.ts +6 -2
  398. package/dist/Redactable.d.ts.map +1 -1
  399. package/dist/Redactable.js +7 -2
  400. package/dist/Redactable.js.map +1 -1
  401. package/dist/Redacted.d.ts +25 -25
  402. package/dist/Redacted.d.ts.map +1 -1
  403. package/dist/Redacted.js +19 -20
  404. package/dist/Redacted.js.map +1 -1
  405. package/dist/Reducer.d.ts +8 -15
  406. package/dist/Reducer.d.ts.map +1 -1
  407. package/dist/Reducer.js +6 -12
  408. package/dist/Reducer.js.map +1 -1
  409. package/dist/Ref.d.ts +95 -165
  410. package/dist/Ref.d.ts.map +1 -1
  411. package/dist/Ref.js +75 -122
  412. package/dist/Ref.js.map +1 -1
  413. package/dist/References.d.ts +102 -213
  414. package/dist/References.d.ts.map +1 -1
  415. package/dist/References.js +102 -213
  416. package/dist/References.js.map +1 -1
  417. package/dist/RegExp.d.ts +10 -14
  418. package/dist/RegExp.d.ts.map +1 -1
  419. package/dist/RegExp.js +10 -14
  420. package/dist/RegExp.js.map +1 -1
  421. package/dist/Request.d.ts +31 -21
  422. package/dist/Request.d.ts.map +1 -1
  423. package/dist/Request.js +25 -19
  424. package/dist/Request.js.map +1 -1
  425. package/dist/RequestResolver.d.ts +201 -90
  426. package/dist/RequestResolver.d.ts.map +1 -1
  427. package/dist/RequestResolver.js +87 -41
  428. package/dist/RequestResolver.js.map +1 -1
  429. package/dist/Resource.js.map +1 -1
  430. package/dist/Result.d.ts +302 -470
  431. package/dist/Result.d.ts.map +1 -1
  432. package/dist/Result.js +135 -218
  433. package/dist/Result.js.map +1 -1
  434. package/dist/Runtime.d.ts +50 -75
  435. package/dist/Runtime.d.ts.map +1 -1
  436. package/dist/Runtime.js +39 -60
  437. package/dist/Runtime.js.map +1 -1
  438. package/dist/Schedule.d.ts +292 -1638
  439. package/dist/Schedule.d.ts.map +1 -1
  440. package/dist/Schedule.js +164 -805
  441. package/dist/Schedule.js.map +1 -1
  442. package/dist/Scheduler.d.ts +5 -5
  443. package/dist/Scheduler.d.ts.map +1 -1
  444. package/dist/Scheduler.js +18 -6
  445. package/dist/Scheduler.js.map +1 -1
  446. package/dist/Schema.d.ts +2056 -1269
  447. package/dist/Schema.d.ts.map +1 -1
  448. package/dist/Schema.js +2869 -1136
  449. package/dist/Schema.js.map +1 -1
  450. package/dist/SchemaAST.d.ts +64 -72
  451. package/dist/SchemaAST.d.ts.map +1 -1
  452. package/dist/SchemaAST.js +698 -468
  453. package/dist/SchemaAST.js.map +1 -1
  454. package/dist/SchemaGetter.d.ts +236 -188
  455. package/dist/SchemaGetter.d.ts.map +1 -1
  456. package/dist/SchemaGetter.js +281 -234
  457. package/dist/SchemaGetter.js.map +1 -1
  458. package/dist/SchemaIssue.d.ts +219 -190
  459. package/dist/SchemaIssue.d.ts.map +1 -1
  460. package/dist/SchemaIssue.js +303 -309
  461. package/dist/SchemaIssue.js.map +1 -1
  462. package/dist/SchemaParser.d.ts +32 -2
  463. package/dist/SchemaParser.d.ts.map +1 -1
  464. package/dist/SchemaParser.js +170 -118
  465. package/dist/SchemaParser.js.map +1 -1
  466. package/dist/SchemaRepresentation.d.ts +433 -1511
  467. package/dist/SchemaRepresentation.d.ts.map +1 -1
  468. package/dist/SchemaRepresentation.js +301 -2854
  469. package/dist/SchemaRepresentation.js.map +1 -1
  470. package/dist/SchemaTransformation.d.ts +117 -77
  471. package/dist/SchemaTransformation.d.ts.map +1 -1
  472. package/dist/SchemaTransformation.js +139 -104
  473. package/dist/SchemaTransformation.js.map +1 -1
  474. package/dist/Scope.d.ts +123 -151
  475. package/dist/Scope.d.ts.map +1 -1
  476. package/dist/Scope.js +72 -92
  477. package/dist/Scope.js.map +1 -1
  478. package/dist/ScopedCache.js +1 -1
  479. package/dist/ScopedCache.js.map +1 -1
  480. package/dist/ScopedRef.d.ts +3 -3
  481. package/dist/ScopedRef.d.ts.map +1 -1
  482. package/dist/ScopedRef.js +2 -2
  483. package/dist/ScopedRef.js.map +1 -1
  484. package/dist/Semaphore.d.ts +101 -13
  485. package/dist/Semaphore.d.ts.map +1 -1
  486. package/dist/Semaphore.js +78 -39
  487. package/dist/Semaphore.js.map +1 -1
  488. package/dist/Sink.d.ts +118 -108
  489. package/dist/Sink.d.ts.map +1 -1
  490. package/dist/Sink.js +107 -100
  491. package/dist/Sink.js.map +1 -1
  492. package/dist/Stdio.d.ts +18 -5
  493. package/dist/Stdio.d.ts.map +1 -1
  494. package/dist/Stdio.js +6 -3
  495. package/dist/Stdio.js.map +1 -1
  496. package/dist/Stream.d.ts +2467 -2962
  497. package/dist/Stream.d.ts.map +1 -1
  498. package/dist/Stream.js +1154 -1413
  499. package/dist/Stream.js.map +1 -1
  500. package/dist/String.d.ts +262 -308
  501. package/dist/String.d.ts.map +1 -1
  502. package/dist/String.js +184 -215
  503. package/dist/String.js.map +1 -1
  504. package/dist/Struct.d.ts +109 -114
  505. package/dist/Struct.d.ts.map +1 -1
  506. package/dist/Struct.js +46 -54
  507. package/dist/Struct.js.map +1 -1
  508. package/dist/SubscriptionRef.d.ts +282 -250
  509. package/dist/SubscriptionRef.d.ts.map +1 -1
  510. package/dist/SubscriptionRef.js +104 -92
  511. package/dist/SubscriptionRef.js.map +1 -1
  512. package/dist/Symbol.d.ts +3 -3
  513. package/dist/Symbol.js +3 -3
  514. package/dist/Symbol.js.map +1 -1
  515. package/dist/SynchronizedRef.js +1 -1
  516. package/dist/SynchronizedRef.js.map +1 -1
  517. package/dist/Take.js.map +1 -1
  518. package/dist/Terminal.d.ts +2 -2
  519. package/dist/Terminal.js +2 -2
  520. package/dist/Terminal.js.map +1 -1
  521. package/dist/Tracer.d.ts +100 -54
  522. package/dist/Tracer.d.ts.map +1 -1
  523. package/dist/Tracer.js +41 -24
  524. package/dist/Tracer.js.map +1 -1
  525. package/dist/Trie.d.ts +287 -679
  526. package/dist/Trie.d.ts.map +1 -1
  527. package/dist/Trie.js +109 -251
  528. package/dist/Trie.js.map +1 -1
  529. package/dist/Tuple.d.ts +98 -131
  530. package/dist/Tuple.d.ts.map +1 -1
  531. package/dist/Tuple.js +42 -57
  532. package/dist/Tuple.js.map +1 -1
  533. package/dist/TxChunk.d.ts +201 -121
  534. package/dist/TxChunk.d.ts.map +1 -1
  535. package/dist/TxChunk.js +85 -56
  536. package/dist/TxChunk.js.map +1 -1
  537. package/dist/TxDeferred.d.ts +62 -46
  538. package/dist/TxDeferred.d.ts.map +1 -1
  539. package/dist/TxDeferred.js +30 -22
  540. package/dist/TxDeferred.js.map +1 -1
  541. package/dist/TxHashMap.d.ts +631 -779
  542. package/dist/TxHashMap.d.ts.map +1 -1
  543. package/dist/TxHashMap.js +268 -330
  544. package/dist/TxHashMap.js.map +1 -1
  545. package/dist/TxHashSet.d.ts +297 -236
  546. package/dist/TxHashSet.d.ts.map +1 -1
  547. package/dist/TxHashSet.js +130 -100
  548. package/dist/TxHashSet.js.map +1 -1
  549. package/dist/TxPriorityQueue.d.ts +126 -95
  550. package/dist/TxPriorityQueue.d.ts.map +1 -1
  551. package/dist/TxPriorityQueue.js +74 -56
  552. package/dist/TxPriorityQueue.js.map +1 -1
  553. package/dist/TxPubSub.d.ts +101 -88
  554. package/dist/TxPubSub.d.ts.map +1 -1
  555. package/dist/TxPubSub.js +87 -66
  556. package/dist/TxPubSub.js.map +1 -1
  557. package/dist/TxQueue.d.ts +200 -180
  558. package/dist/TxQueue.d.ts.map +1 -1
  559. package/dist/TxQueue.js +161 -137
  560. package/dist/TxQueue.js.map +1 -1
  561. package/dist/TxReentrantLock.d.ts +89 -114
  562. package/dist/TxReentrantLock.d.ts.map +1 -1
  563. package/dist/TxReentrantLock.js +75 -53
  564. package/dist/TxReentrantLock.js.map +1 -1
  565. package/dist/TxRef.d.ts +51 -32
  566. package/dist/TxRef.d.ts.map +1 -1
  567. package/dist/TxRef.js +23 -15
  568. package/dist/TxRef.js.map +1 -1
  569. package/dist/TxSemaphore.d.ts +129 -95
  570. package/dist/TxSemaphore.d.ts.map +1 -1
  571. package/dist/TxSemaphore.js +85 -70
  572. package/dist/TxSemaphore.js.map +1 -1
  573. package/dist/TxSubscriptionRef.d.ts +97 -70
  574. package/dist/TxSubscriptionRef.d.ts.map +1 -1
  575. package/dist/TxSubscriptionRef.js +44 -34
  576. package/dist/TxSubscriptionRef.js.map +1 -1
  577. package/dist/Types.d.ts +127 -70
  578. package/dist/Types.d.ts.map +1 -1
  579. package/dist/UndefinedOr.js.map +1 -1
  580. package/dist/Unify.d.ts +45 -65
  581. package/dist/Unify.d.ts.map +1 -1
  582. package/dist/Unify.js +6 -9
  583. package/dist/Unify.js.map +1 -1
  584. package/dist/Utils.d.ts +23 -16
  585. package/dist/Utils.d.ts.map +1 -1
  586. package/dist/Utils.js +3 -7
  587. package/dist/Utils.js.map +1 -1
  588. package/dist/index.d.ts +0 -8
  589. package/dist/index.d.ts.map +1 -1
  590. package/dist/index.js +0 -8
  591. package/dist/index.js.map +1 -1
  592. package/dist/internal/array.js.map +1 -1
  593. package/dist/internal/core.js +4 -3
  594. package/dist/internal/core.js.map +1 -1
  595. package/dist/internal/dateTime.js +5 -1
  596. package/dist/internal/dateTime.js.map +1 -1
  597. package/dist/internal/doNotation.js.map +1 -1
  598. package/dist/internal/effect.js +261 -111
  599. package/dist/internal/effect.js.map +1 -1
  600. package/dist/internal/equal.js.map +1 -1
  601. package/dist/internal/errors.js.map +1 -1
  602. package/dist/internal/executionPlan.js +52 -3
  603. package/dist/internal/executionPlan.js.map +1 -1
  604. package/dist/internal/hashMap.js +12 -8
  605. package/dist/internal/hashMap.js.map +1 -1
  606. package/dist/internal/hashSet.js.map +1 -1
  607. package/dist/internal/layer.js.map +1 -1
  608. package/dist/internal/matcher.js +2 -2
  609. package/dist/internal/matcher.js.map +1 -1
  610. package/dist/internal/metric.js.map +1 -1
  611. package/dist/internal/option.js.map +1 -1
  612. package/dist/internal/persistence.d.ts +2 -0
  613. package/dist/internal/persistence.d.ts.map +1 -0
  614. package/dist/internal/persistence.js +3 -0
  615. package/dist/internal/persistence.js.map +1 -0
  616. package/dist/internal/random.js.map +1 -1
  617. package/dist/internal/rcRef.js +18 -13
  618. package/dist/internal/rcRef.js.map +1 -1
  619. package/dist/internal/record.d.ts +0 -3
  620. package/dist/internal/record.d.ts.map +1 -1
  621. package/dist/internal/record.js +10 -5
  622. package/dist/internal/record.js.map +1 -1
  623. package/dist/internal/redacted.js.map +1 -1
  624. package/dist/internal/references.js +3 -4
  625. package/dist/internal/references.js.map +1 -1
  626. package/dist/internal/request.js.map +1 -1
  627. package/dist/internal/result.js.map +1 -1
  628. package/dist/internal/schedule.js.map +1 -1
  629. package/dist/internal/schema/annotations.js +15 -1
  630. package/dist/internal/schema/annotations.js.map +1 -1
  631. package/dist/internal/schema/cause.js.map +1 -1
  632. package/dist/internal/schema/fromJsonSchemaDocument.d.ts +2 -0
  633. package/dist/internal/schema/fromJsonSchemaDocument.d.ts.map +1 -0
  634. package/dist/internal/schema/fromJsonSchemaDocument.js +761 -0
  635. package/dist/internal/schema/fromJsonSchemaDocument.js.map +1 -0
  636. package/dist/internal/schema/fromRepresentation.d.ts +2 -0
  637. package/dist/internal/schema/fromRepresentation.d.ts.map +1 -0
  638. package/dist/internal/schema/fromRepresentation.js +245 -0
  639. package/dist/internal/schema/fromRepresentation.js.map +1 -0
  640. package/dist/internal/schema/parser.d.ts +14 -0
  641. package/dist/internal/schema/parser.d.ts.map +1 -0
  642. package/dist/internal/schema/parser.js +13 -0
  643. package/dist/internal/schema/parser.js.map +1 -0
  644. package/dist/internal/schema/schema.js +29 -49
  645. package/dist/internal/schema/schema.js.map +1 -1
  646. package/dist/internal/schema/toArbitrary.d.ts +2 -0
  647. package/dist/internal/schema/toArbitrary.d.ts.map +1 -0
  648. package/dist/internal/schema/{arbitrary.js → toArbitrary.js} +8 -83
  649. package/dist/internal/schema/toArbitrary.js.map +1 -0
  650. package/dist/internal/schema/toCodeDocument.d.ts +2 -0
  651. package/dist/internal/schema/toCodeDocument.d.ts.map +1 -0
  652. package/dist/internal/schema/toCodeDocument.js +438 -0
  653. package/dist/internal/schema/toCodeDocument.js.map +1 -0
  654. package/dist/internal/schema/toEquivalence.d.ts +2 -0
  655. package/dist/internal/schema/toEquivalence.d.ts.map +1 -0
  656. package/dist/internal/schema/{equivalence.js → toEquivalence.js} +15 -13
  657. package/dist/internal/schema/toEquivalence.js.map +1 -0
  658. package/dist/internal/schema/toJsonSchemaDocument.d.ts +2 -0
  659. package/dist/internal/schema/toJsonSchemaDocument.d.ts.map +1 -0
  660. package/dist/internal/schema/toJsonSchemaDocument.js +522 -0
  661. package/dist/internal/schema/toJsonSchemaDocument.js.map +1 -0
  662. package/dist/internal/schema/toRepresentation.d.ts +2 -0
  663. package/dist/internal/schema/toRepresentation.d.ts.map +1 -0
  664. package/dist/internal/schema/toRepresentation.js +351 -0
  665. package/dist/internal/schema/toRepresentation.js.map +1 -0
  666. package/dist/internal/stackTraceLimit.js +3 -6
  667. package/dist/internal/stackTraceLimit.js.map +1 -1
  668. package/dist/internal/stream.js.map +1 -1
  669. package/dist/internal/tracer.js.map +1 -1
  670. package/dist/internal/trie.js +24 -10
  671. package/dist/internal/trie.js.map +1 -1
  672. package/dist/testing/FastCheck.d.ts +8 -7
  673. package/dist/testing/FastCheck.d.ts.map +1 -1
  674. package/dist/testing/FastCheck.js +8 -7
  675. package/dist/testing/FastCheck.js.map +1 -1
  676. package/dist/testing/TestClock.d.ts +57 -28
  677. package/dist/testing/TestClock.d.ts.map +1 -1
  678. package/dist/testing/TestClock.js +65 -20
  679. package/dist/testing/TestClock.js.map +1 -1
  680. package/dist/testing/TestConsole.d.ts +32 -31
  681. package/dist/testing/TestConsole.d.ts.map +1 -1
  682. package/dist/testing/TestConsole.js +24 -22
  683. package/dist/testing/TestConsole.js.map +1 -1
  684. package/dist/testing/TestSchema.d.ts +31 -31
  685. package/dist/testing/TestSchema.d.ts.map +1 -1
  686. package/dist/testing/TestSchema.js +35 -34
  687. package/dist/testing/TestSchema.js.map +1 -1
  688. package/dist/testing/index.js.map +1 -1
  689. package/dist/unstable/ai/AiError.d.ts +121 -144
  690. package/dist/unstable/ai/AiError.d.ts.map +1 -1
  691. package/dist/unstable/ai/AiError.js +118 -140
  692. package/dist/unstable/ai/AiError.js.map +1 -1
  693. package/dist/unstable/ai/AnthropicStructuredOutput.d.ts +22 -7
  694. package/dist/unstable/ai/AnthropicStructuredOutput.d.ts.map +1 -1
  695. package/dist/unstable/ai/AnthropicStructuredOutput.js +87 -317
  696. package/dist/unstable/ai/AnthropicStructuredOutput.js.map +1 -1
  697. package/dist/unstable/ai/Chat.d.ts +132 -97
  698. package/dist/unstable/ai/Chat.d.ts.map +1 -1
  699. package/dist/unstable/ai/Chat.js +56 -52
  700. package/dist/unstable/ai/Chat.js.map +1 -1
  701. package/dist/unstable/ai/EmbeddingModel.d.ts +1 -1
  702. package/dist/unstable/ai/EmbeddingModel.js +1 -1
  703. package/dist/unstable/ai/EmbeddingModel.js.map +1 -1
  704. package/dist/unstable/ai/IdGenerator.d.ts +32 -28
  705. package/dist/unstable/ai/IdGenerator.d.ts.map +1 -1
  706. package/dist/unstable/ai/IdGenerator.js +26 -21
  707. package/dist/unstable/ai/IdGenerator.js.map +1 -1
  708. package/dist/unstable/ai/LanguageModel.d.ts +111 -68
  709. package/dist/unstable/ai/LanguageModel.d.ts.map +1 -1
  710. package/dist/unstable/ai/LanguageModel.js +127 -83
  711. package/dist/unstable/ai/LanguageModel.js.map +1 -1
  712. package/dist/unstable/ai/McpProtocol.d.ts +30 -0
  713. package/dist/unstable/ai/McpProtocol.d.ts.map +1 -0
  714. package/dist/unstable/ai/McpProtocol.js +20 -0
  715. package/dist/unstable/ai/McpProtocol.js.map +1 -0
  716. package/dist/unstable/ai/McpSchema.d.ts +198 -132
  717. package/dist/unstable/ai/McpSchema.d.ts.map +1 -1
  718. package/dist/unstable/ai/McpSchema.js +79 -71
  719. package/dist/unstable/ai/McpSchema.js.map +1 -1
  720. package/dist/unstable/ai/McpServer.d.ts +71 -62
  721. package/dist/unstable/ai/McpServer.d.ts.map +1 -1
  722. package/dist/unstable/ai/McpServer.js +777 -245
  723. package/dist/unstable/ai/McpServer.js.map +1 -1
  724. package/dist/unstable/ai/Model.d.ts +8 -19
  725. package/dist/unstable/ai/Model.d.ts.map +1 -1
  726. package/dist/unstable/ai/Model.js +9 -20
  727. package/dist/unstable/ai/Model.js.map +1 -1
  728. package/dist/unstable/ai/OpenAiStructuredOutput.d.ts +33 -11
  729. package/dist/unstable/ai/OpenAiStructuredOutput.d.ts.map +1 -1
  730. package/dist/unstable/ai/OpenAiStructuredOutput.js +194 -378
  731. package/dist/unstable/ai/OpenAiStructuredOutput.js.map +1 -1
  732. package/dist/unstable/ai/Prompt.d.ts +131 -44
  733. package/dist/unstable/ai/Prompt.d.ts.map +1 -1
  734. package/dist/unstable/ai/Prompt.js +100 -36
  735. package/dist/unstable/ai/Prompt.js.map +1 -1
  736. package/dist/unstable/ai/Response.d.ts +47 -33
  737. package/dist/unstable/ai/Response.d.ts.map +1 -1
  738. package/dist/unstable/ai/Response.js +23 -18
  739. package/dist/unstable/ai/Response.js.map +1 -1
  740. package/dist/unstable/ai/ResponseIdTracker.js.map +1 -1
  741. package/dist/unstable/ai/Telemetry.d.ts +46 -13
  742. package/dist/unstable/ai/Telemetry.d.ts.map +1 -1
  743. package/dist/unstable/ai/Telemetry.js +18 -7
  744. package/dist/unstable/ai/Telemetry.js.map +1 -1
  745. package/dist/unstable/ai/Tokenizer.d.ts +14 -3
  746. package/dist/unstable/ai/Tokenizer.d.ts.map +1 -1
  747. package/dist/unstable/ai/Tokenizer.js +10 -2
  748. package/dist/unstable/ai/Tokenizer.js.map +1 -1
  749. package/dist/unstable/ai/Tool.d.ts +63 -44
  750. package/dist/unstable/ai/Tool.d.ts.map +1 -1
  751. package/dist/unstable/ai/Tool.js +70 -55
  752. package/dist/unstable/ai/Tool.js.map +1 -1
  753. package/dist/unstable/ai/Toolkit.d.ts +35 -9
  754. package/dist/unstable/ai/Toolkit.d.ts.map +1 -1
  755. package/dist/unstable/ai/Toolkit.js +32 -14
  756. package/dist/unstable/ai/Toolkit.js.map +1 -1
  757. package/dist/unstable/ai/index.d.ts +4 -0
  758. package/dist/unstable/ai/index.d.ts.map +1 -1
  759. package/dist/unstable/ai/index.js +4 -0
  760. package/dist/unstable/ai/index.js.map +1 -1
  761. package/dist/unstable/ai/internal/codec-transformer.js +15 -12
  762. package/dist/unstable/ai/internal/codec-transformer.js.map +1 -1
  763. package/dist/unstable/ai/internal/mcpProtocol.d.ts +21 -0
  764. package/dist/unstable/ai/internal/mcpProtocol.d.ts.map +1 -0
  765. package/dist/unstable/ai/internal/mcpProtocol.js +22 -0
  766. package/dist/unstable/ai/internal/mcpProtocol.js.map +1 -0
  767. package/dist/unstable/ai/internal/mcpProtocolRegistry.d.ts +2 -0
  768. package/dist/unstable/ai/internal/mcpProtocolRegistry.d.ts.map +1 -0
  769. package/dist/unstable/ai/internal/mcpProtocolRegistry.js +32 -0
  770. package/dist/unstable/ai/internal/mcpProtocolRegistry.js.map +1 -0
  771. package/dist/unstable/ai/internal/structured-output.d.ts +2 -0
  772. package/dist/unstable/ai/internal/structured-output.d.ts.map +1 -0
  773. package/dist/unstable/ai/internal/structured-output.js +315 -0
  774. package/dist/unstable/ai/internal/structured-output.js.map +1 -0
  775. package/dist/unstable/cli/Argument.d.ts +279 -72
  776. package/dist/unstable/cli/Argument.d.ts.map +1 -1
  777. package/dist/unstable/cli/Argument.js +113 -34
  778. package/dist/unstable/cli/Argument.js.map +1 -1
  779. package/dist/unstable/cli/CliConfig.d.ts +76 -0
  780. package/dist/unstable/cli/CliConfig.d.ts.map +1 -0
  781. package/dist/unstable/cli/CliConfig.js +63 -0
  782. package/dist/unstable/cli/CliConfig.js.map +1 -0
  783. package/dist/unstable/cli/CliError.d.ts +126 -76
  784. package/dist/unstable/cli/CliError.d.ts.map +1 -1
  785. package/dist/unstable/cli/CliError.js +138 -75
  786. package/dist/unstable/cli/CliError.js.map +1 -1
  787. package/dist/unstable/cli/CliOutput.d.ts +35 -54
  788. package/dist/unstable/cli/CliOutput.d.ts.map +1 -1
  789. package/dist/unstable/cli/CliOutput.js +26 -42
  790. package/dist/unstable/cli/CliOutput.js.map +1 -1
  791. package/dist/unstable/cli/Command.d.ts +765 -109
  792. package/dist/unstable/cli/Command.d.ts.map +1 -1
  793. package/dist/unstable/cli/Command.js +335 -52
  794. package/dist/unstable/cli/Command.js.map +1 -1
  795. package/dist/unstable/cli/Completions.js.map +1 -1
  796. package/dist/unstable/cli/Flag.d.ts +418 -138
  797. package/dist/unstable/cli/Flag.d.ts.map +1 -1
  798. package/dist/unstable/cli/Flag.js +197 -71
  799. package/dist/unstable/cli/Flag.js.map +1 -1
  800. package/dist/unstable/cli/GlobalFlag.d.ts +24 -3
  801. package/dist/unstable/cli/GlobalFlag.d.ts.map +1 -1
  802. package/dist/unstable/cli/GlobalFlag.js +20 -4
  803. package/dist/unstable/cli/GlobalFlag.js.map +1 -1
  804. package/dist/unstable/cli/HelpDoc.d.ts +12 -4
  805. package/dist/unstable/cli/HelpDoc.d.ts.map +1 -1
  806. package/dist/unstable/cli/Param.d.ts +299 -83
  807. package/dist/unstable/cli/Param.d.ts.map +1 -1
  808. package/dist/unstable/cli/Param.js +152 -62
  809. package/dist/unstable/cli/Param.js.map +1 -1
  810. package/dist/unstable/cli/Primitive.d.ts +370 -149
  811. package/dist/unstable/cli/Primitive.d.ts.map +1 -1
  812. package/dist/unstable/cli/Primitive.js +377 -162
  813. package/dist/unstable/cli/Primitive.js.map +1 -1
  814. package/dist/unstable/cli/Prompt.d.ts +23 -14
  815. package/dist/unstable/cli/Prompt.d.ts.map +1 -1
  816. package/dist/unstable/cli/Prompt.js +54 -31
  817. package/dist/unstable/cli/Prompt.js.map +1 -1
  818. package/dist/unstable/cli/index.d.ts +4 -0
  819. package/dist/unstable/cli/index.d.ts.map +1 -1
  820. package/dist/unstable/cli/index.js +4 -0
  821. package/dist/unstable/cli/index.js.map +1 -1
  822. package/dist/unstable/cli/internal/ansi.d.ts.map +1 -1
  823. package/dist/unstable/cli/internal/ansi.js +4 -2
  824. package/dist/unstable/cli/internal/ansi.js.map +1 -1
  825. package/dist/unstable/cli/internal/auto-suggest.js.map +1 -1
  826. package/dist/unstable/cli/internal/command.d.ts +5 -3
  827. package/dist/unstable/cli/internal/command.d.ts.map +1 -1
  828. package/dist/unstable/cli/internal/command.js +21 -13
  829. package/dist/unstable/cli/internal/command.js.map +1 -1
  830. package/dist/unstable/cli/internal/completions/bash.js +69 -9
  831. package/dist/unstable/cli/internal/completions/bash.js.map +1 -1
  832. package/dist/unstable/cli/internal/completions/descriptor.js +24 -18
  833. package/dist/unstable/cli/internal/completions/descriptor.js.map +1 -1
  834. package/dist/unstable/cli/internal/completions/fish.js +5 -5
  835. package/dist/unstable/cli/internal/completions/fish.js.map +1 -1
  836. package/dist/unstable/cli/internal/completions/zsh.js.map +1 -1
  837. package/dist/unstable/cli/internal/config.d.ts +0 -48
  838. package/dist/unstable/cli/internal/config.d.ts.map +1 -1
  839. package/dist/unstable/cli/internal/config.js +8 -10
  840. package/dist/unstable/cli/internal/config.js.map +1 -1
  841. package/dist/unstable/cli/internal/help.d.ts.map +1 -1
  842. package/dist/unstable/cli/internal/help.js +4 -2
  843. package/dist/unstable/cli/internal/help.js.map +1 -1
  844. package/dist/unstable/cli/internal/lexer.js +17 -7
  845. package/dist/unstable/cli/internal/lexer.js.map +1 -1
  846. package/dist/unstable/cli/internal/parser.js +16 -7
  847. package/dist/unstable/cli/internal/parser.js.map +1 -1
  848. package/dist/unstable/cli/internal/wizard.d.ts +13 -0
  849. package/dist/unstable/cli/internal/wizard.d.ts.map +1 -0
  850. package/dist/unstable/cli/internal/wizard.js +212 -0
  851. package/dist/unstable/cli/internal/wizard.js.map +1 -0
  852. package/dist/unstable/cluster/ClusterCron.js.map +1 -1
  853. package/dist/unstable/cluster/ClusterError.js +7 -7
  854. package/dist/unstable/cluster/ClusterError.js.map +1 -1
  855. package/dist/unstable/cluster/ClusterMetrics.js.map +1 -1
  856. package/dist/unstable/cluster/ClusterSchema.d.ts +8 -8
  857. package/dist/unstable/cluster/ClusterSchema.js +8 -8
  858. package/dist/unstable/cluster/ClusterSchema.js.map +1 -1
  859. package/dist/unstable/cluster/ClusterWorkflowEngine.d.ts.map +1 -1
  860. package/dist/unstable/cluster/ClusterWorkflowEngine.js +32 -16
  861. package/dist/unstable/cluster/ClusterWorkflowEngine.js.map +1 -1
  862. package/dist/unstable/cluster/DeliverAt.js.map +1 -1
  863. package/dist/unstable/cluster/Entity.d.ts +12 -12
  864. package/dist/unstable/cluster/Entity.d.ts.map +1 -1
  865. package/dist/unstable/cluster/Entity.js +9 -9
  866. package/dist/unstable/cluster/Entity.js.map +1 -1
  867. package/dist/unstable/cluster/EntityAddress.js.map +1 -1
  868. package/dist/unstable/cluster/EntityId.js.map +1 -1
  869. package/dist/unstable/cluster/EntityProxy.d.ts +7 -5
  870. package/dist/unstable/cluster/EntityProxy.d.ts.map +1 -1
  871. package/dist/unstable/cluster/EntityProxy.js +8 -5
  872. package/dist/unstable/cluster/EntityProxy.js.map +1 -1
  873. package/dist/unstable/cluster/EntityProxyServer.js.map +1 -1
  874. package/dist/unstable/cluster/EntityResource.d.ts +2 -2
  875. package/dist/unstable/cluster/EntityResource.js +2 -2
  876. package/dist/unstable/cluster/EntityResource.js.map +1 -1
  877. package/dist/unstable/cluster/EntityType.js.map +1 -1
  878. package/dist/unstable/cluster/Envelope.d.ts +3 -3
  879. package/dist/unstable/cluster/Envelope.d.ts.map +1 -1
  880. package/dist/unstable/cluster/Envelope.js +5 -4
  881. package/dist/unstable/cluster/Envelope.js.map +1 -1
  882. package/dist/unstable/cluster/HttpRunner.d.ts +2 -2
  883. package/dist/unstable/cluster/HttpRunner.d.ts.map +1 -1
  884. package/dist/unstable/cluster/HttpRunner.js +6 -4
  885. package/dist/unstable/cluster/HttpRunner.js.map +1 -1
  886. package/dist/unstable/cluster/K8sHttpClient.js.map +1 -1
  887. package/dist/unstable/cluster/MachineId.js.map +1 -1
  888. package/dist/unstable/cluster/Message.d.ts +9 -9
  889. package/dist/unstable/cluster/Message.js +6 -6
  890. package/dist/unstable/cluster/Message.js.map +1 -1
  891. package/dist/unstable/cluster/MessageStorage.d.ts +15 -15
  892. package/dist/unstable/cluster/MessageStorage.d.ts.map +1 -1
  893. package/dist/unstable/cluster/MessageStorage.js +13 -6
  894. package/dist/unstable/cluster/MessageStorage.js.map +1 -1
  895. package/dist/unstable/cluster/Reply.d.ts +8 -0
  896. package/dist/unstable/cluster/Reply.d.ts.map +1 -1
  897. package/dist/unstable/cluster/Reply.js +17 -5
  898. package/dist/unstable/cluster/Reply.js.map +1 -1
  899. package/dist/unstable/cluster/Runner.d.ts +1 -1
  900. package/dist/unstable/cluster/Runner.js +1 -1
  901. package/dist/unstable/cluster/Runner.js.map +1 -1
  902. package/dist/unstable/cluster/RunnerAddress.d.ts +1 -1
  903. package/dist/unstable/cluster/RunnerAddress.js +1 -1
  904. package/dist/unstable/cluster/RunnerAddress.js.map +1 -1
  905. package/dist/unstable/cluster/RunnerHealth.d.ts +1 -1
  906. package/dist/unstable/cluster/RunnerHealth.js +1 -1
  907. package/dist/unstable/cluster/RunnerHealth.js.map +1 -1
  908. package/dist/unstable/cluster/RunnerServer.d.ts +2 -1
  909. package/dist/unstable/cluster/RunnerServer.d.ts.map +1 -1
  910. package/dist/unstable/cluster/RunnerServer.js +29 -23
  911. package/dist/unstable/cluster/RunnerServer.js.map +1 -1
  912. package/dist/unstable/cluster/RunnerStorage.d.ts +3 -4
  913. package/dist/unstable/cluster/RunnerStorage.d.ts.map +1 -1
  914. package/dist/unstable/cluster/RunnerStorage.js +9 -8
  915. package/dist/unstable/cluster/RunnerStorage.js.map +1 -1
  916. package/dist/unstable/cluster/Runners.d.ts +11 -15
  917. package/dist/unstable/cluster/Runners.d.ts.map +1 -1
  918. package/dist/unstable/cluster/Runners.js +32 -22
  919. package/dist/unstable/cluster/Runners.js.map +1 -1
  920. package/dist/unstable/cluster/ShardId.js +1 -1
  921. package/dist/unstable/cluster/ShardId.js.map +1 -1
  922. package/dist/unstable/cluster/Sharding.d.ts +2 -2
  923. package/dist/unstable/cluster/Sharding.d.ts.map +1 -1
  924. package/dist/unstable/cluster/Sharding.js +164 -31
  925. package/dist/unstable/cluster/Sharding.js.map +1 -1
  926. package/dist/unstable/cluster/ShardingConfig.d.ts +13 -5
  927. package/dist/unstable/cluster/ShardingConfig.d.ts.map +1 -1
  928. package/dist/unstable/cluster/ShardingConfig.js +3 -3
  929. package/dist/unstable/cluster/ShardingConfig.js.map +1 -1
  930. package/dist/unstable/cluster/ShardingRegistrationEvent.js.map +1 -1
  931. package/dist/unstable/cluster/SingleRunner.d.ts +4 -2
  932. package/dist/unstable/cluster/SingleRunner.d.ts.map +1 -1
  933. package/dist/unstable/cluster/SingleRunner.js +2 -1
  934. package/dist/unstable/cluster/SingleRunner.js.map +1 -1
  935. package/dist/unstable/cluster/Singleton.js.map +1 -1
  936. package/dist/unstable/cluster/SingletonAddress.d.ts +1 -1
  937. package/dist/unstable/cluster/SingletonAddress.js +1 -1
  938. package/dist/unstable/cluster/SingletonAddress.js.map +1 -1
  939. package/dist/unstable/cluster/Snowflake.d.ts +8 -8
  940. package/dist/unstable/cluster/Snowflake.js +8 -8
  941. package/dist/unstable/cluster/Snowflake.js.map +1 -1
  942. package/dist/unstable/cluster/SocketRunner.js.map +1 -1
  943. package/dist/unstable/cluster/SqlMessageStorage.d.ts +7 -4
  944. package/dist/unstable/cluster/SqlMessageStorage.d.ts.map +1 -1
  945. package/dist/unstable/cluster/SqlMessageStorage.js +56 -25
  946. package/dist/unstable/cluster/SqlMessageStorage.js.map +1 -1
  947. package/dist/unstable/cluster/SqlRunnerStorage.d.ts.map +1 -1
  948. package/dist/unstable/cluster/SqlRunnerStorage.js +141 -79
  949. package/dist/unstable/cluster/SqlRunnerStorage.js.map +1 -1
  950. package/dist/unstable/cluster/TestRunner.js.map +1 -1
  951. package/dist/unstable/cluster/index.js.map +1 -1
  952. package/dist/unstable/cluster/internal/entityManager.js +25 -13
  953. package/dist/unstable/cluster/internal/entityManager.js.map +1 -1
  954. package/dist/unstable/cluster/internal/entityReaper.js.map +1 -1
  955. package/dist/unstable/cluster/internal/hash.js.map +1 -1
  956. package/dist/unstable/cluster/internal/interruptors.js.map +1 -1
  957. package/dist/unstable/cluster/internal/resourceMap.js +2 -2
  958. package/dist/unstable/cluster/internal/resourceMap.js.map +1 -1
  959. package/dist/unstable/cluster/internal/resourceRef.js +17 -0
  960. package/dist/unstable/cluster/internal/resourceRef.js.map +1 -1
  961. package/dist/unstable/cluster/internal/shardLock.d.ts +2 -0
  962. package/dist/unstable/cluster/internal/shardLock.d.ts.map +1 -0
  963. package/dist/unstable/cluster/internal/shardLock.js +4 -0
  964. package/dist/unstable/cluster/internal/shardLock.js.map +1 -0
  965. package/dist/unstable/devtools/DevTools.js.map +1 -1
  966. package/dist/unstable/devtools/DevToolsClient.d.ts.map +1 -1
  967. package/dist/unstable/devtools/DevToolsClient.js +7 -2
  968. package/dist/unstable/devtools/DevToolsClient.js.map +1 -1
  969. package/dist/unstable/devtools/DevToolsSchema.d.ts +20 -20
  970. package/dist/unstable/devtools/DevToolsSchema.d.ts.map +1 -1
  971. package/dist/unstable/devtools/DevToolsSchema.js +8 -5
  972. package/dist/unstable/devtools/DevToolsSchema.js.map +1 -1
  973. package/dist/unstable/devtools/DevToolsServer.js.map +1 -1
  974. package/dist/unstable/devtools/index.js.map +1 -1
  975. package/dist/unstable/encoding/Ini.d.ts +20 -0
  976. package/dist/unstable/encoding/Ini.d.ts.map +1 -0
  977. package/dist/unstable/encoding/Ini.js +153 -0
  978. package/dist/unstable/encoding/Ini.js.map +1 -0
  979. package/dist/unstable/encoding/Msgpack.d.ts +2 -1
  980. package/dist/unstable/encoding/Msgpack.d.ts.map +1 -1
  981. package/dist/unstable/encoding/Msgpack.js +31 -19
  982. package/dist/unstable/encoding/Msgpack.js.map +1 -1
  983. package/dist/unstable/encoding/Ndjson.d.ts.map +1 -1
  984. package/dist/unstable/encoding/Ndjson.js +7 -1
  985. package/dist/unstable/encoding/Ndjson.js.map +1 -1
  986. package/dist/unstable/encoding/Sse.d.ts +72 -8
  987. package/dist/unstable/encoding/Sse.d.ts.map +1 -1
  988. package/dist/unstable/encoding/Sse.js +72 -31
  989. package/dist/unstable/encoding/Sse.js.map +1 -1
  990. package/dist/unstable/encoding/Toml.d.ts +19 -0
  991. package/dist/unstable/encoding/Toml.d.ts.map +1 -0
  992. package/dist/unstable/encoding/Toml.js +434 -0
  993. package/dist/unstable/encoding/Toml.js.map +1 -0
  994. package/dist/unstable/encoding/Yaml.d.ts +19 -0
  995. package/dist/unstable/encoding/Yaml.d.ts.map +1 -0
  996. package/dist/unstable/encoding/Yaml.js +461 -0
  997. package/dist/unstable/encoding/Yaml.js.map +1 -0
  998. package/dist/unstable/encoding/index.d.ts +12 -0
  999. package/dist/unstable/encoding/index.d.ts.map +1 -1
  1000. package/dist/unstable/encoding/index.js +12 -0
  1001. package/dist/unstable/encoding/index.js.map +1 -1
  1002. package/dist/unstable/eventlog/Event.d.ts +20 -20
  1003. package/dist/unstable/eventlog/Event.js.map +1 -1
  1004. package/dist/unstable/eventlog/EventGroup.d.ts +4 -4
  1005. package/dist/unstable/eventlog/EventGroup.js.map +1 -1
  1006. package/dist/unstable/eventlog/EventJournal.d.ts +17 -17
  1007. package/dist/unstable/eventlog/EventJournal.d.ts.map +1 -1
  1008. package/dist/unstable/eventlog/EventJournal.js +27 -19
  1009. package/dist/unstable/eventlog/EventJournal.js.map +1 -1
  1010. package/dist/unstable/eventlog/EventLog.d.ts +3 -3
  1011. package/dist/unstable/eventlog/EventLog.d.ts.map +1 -1
  1012. package/dist/unstable/eventlog/EventLog.js +18 -14
  1013. package/dist/unstable/eventlog/EventLog.js.map +1 -1
  1014. package/dist/unstable/eventlog/EventLogEncryption.d.ts +8 -7
  1015. package/dist/unstable/eventlog/EventLogEncryption.d.ts.map +1 -1
  1016. package/dist/unstable/eventlog/EventLogEncryption.js +16 -14
  1017. package/dist/unstable/eventlog/EventLogEncryption.js.map +1 -1
  1018. package/dist/unstable/eventlog/EventLogMessage.d.ts +31 -31
  1019. package/dist/unstable/eventlog/EventLogMessage.d.ts.map +1 -1
  1020. package/dist/unstable/eventlog/EventLogMessage.js +12 -8
  1021. package/dist/unstable/eventlog/EventLogMessage.js.map +1 -1
  1022. package/dist/unstable/eventlog/EventLogRemote.d.ts +15 -15
  1023. package/dist/unstable/eventlog/EventLogRemote.js +5 -5
  1024. package/dist/unstable/eventlog/EventLogRemote.js.map +1 -1
  1025. package/dist/unstable/eventlog/EventLogServer.d.ts +11 -2
  1026. package/dist/unstable/eventlog/EventLogServer.d.ts.map +1 -1
  1027. package/dist/unstable/eventlog/EventLogServer.js +45 -21
  1028. package/dist/unstable/eventlog/EventLogServer.js.map +1 -1
  1029. package/dist/unstable/eventlog/EventLogServerEncrypted.d.ts +4 -4
  1030. package/dist/unstable/eventlog/EventLogServerEncrypted.d.ts.map +1 -1
  1031. package/dist/unstable/eventlog/EventLogServerEncrypted.js +16 -7
  1032. package/dist/unstable/eventlog/EventLogServerEncrypted.js.map +1 -1
  1033. package/dist/unstable/eventlog/EventLogServerUnencrypted.d.ts +5 -5
  1034. package/dist/unstable/eventlog/EventLogServerUnencrypted.d.ts.map +1 -1
  1035. package/dist/unstable/eventlog/EventLogServerUnencrypted.js +15 -7
  1036. package/dist/unstable/eventlog/EventLogServerUnencrypted.js.map +1 -1
  1037. package/dist/unstable/eventlog/EventLogSessionAuth.d.ts +1 -1
  1038. package/dist/unstable/eventlog/EventLogSessionAuth.js +1 -1
  1039. package/dist/unstable/eventlog/EventLogSessionAuth.js.map +1 -1
  1040. package/dist/unstable/eventlog/SqlEventJournal.d.ts.map +1 -1
  1041. package/dist/unstable/eventlog/SqlEventJournal.js +3 -6
  1042. package/dist/unstable/eventlog/SqlEventJournal.js.map +1 -1
  1043. package/dist/unstable/eventlog/SqlEventLogServerEncrypted.js +1 -1
  1044. package/dist/unstable/eventlog/SqlEventLogServerEncrypted.js.map +1 -1
  1045. package/dist/unstable/eventlog/SqlEventLogServerUnencrypted.js +3 -3
  1046. package/dist/unstable/eventlog/SqlEventLogServerUnencrypted.js.map +1 -1
  1047. package/dist/unstable/eventlog/index.js.map +1 -1
  1048. package/dist/unstable/eventlog/internal/identityRootSecretDerivation.js.map +1 -1
  1049. package/dist/unstable/http/Cookies.d.ts +2 -2
  1050. package/dist/unstable/http/Cookies.d.ts.map +1 -1
  1051. package/dist/unstable/http/Cookies.js +54 -40
  1052. package/dist/unstable/http/Cookies.js.map +1 -1
  1053. package/dist/unstable/http/Etag.d.ts +1 -1
  1054. package/dist/unstable/http/Etag.js +1 -1
  1055. package/dist/unstable/http/Etag.js.map +1 -1
  1056. package/dist/unstable/http/FetchHttpClient.d.ts.map +1 -1
  1057. package/dist/unstable/http/FetchHttpClient.js.map +1 -1
  1058. package/dist/unstable/http/FindMyWay/internal/queryString.d.ts +11 -0
  1059. package/dist/unstable/http/FindMyWay/internal/queryString.d.ts.map +1 -0
  1060. package/dist/unstable/http/FindMyWay/internal/queryString.js +259 -0
  1061. package/dist/unstable/http/FindMyWay/internal/queryString.js.map +1 -0
  1062. package/dist/unstable/http/FindMyWay/internal/router.d.ts +2 -0
  1063. package/dist/unstable/http/FindMyWay/internal/router.d.ts.map +1 -0
  1064. package/dist/unstable/http/FindMyWay/internal/router.js +665 -0
  1065. package/dist/unstable/http/FindMyWay/internal/router.js.map +1 -0
  1066. package/dist/unstable/http/FindMyWay.d.ts +33 -8
  1067. package/dist/unstable/http/FindMyWay.d.ts.map +1 -1
  1068. package/dist/unstable/http/FindMyWay.js +4 -7
  1069. package/dist/unstable/http/FindMyWay.js.map +1 -1
  1070. package/dist/unstable/http/Headers.d.ts +2 -2
  1071. package/dist/unstable/http/Headers.js +10 -10
  1072. package/dist/unstable/http/Headers.js.map +1 -1
  1073. package/dist/unstable/http/HttpBody.d.ts +5 -3
  1074. package/dist/unstable/http/HttpBody.d.ts.map +1 -1
  1075. package/dist/unstable/http/HttpBody.js +11 -5
  1076. package/dist/unstable/http/HttpBody.js.map +1 -1
  1077. package/dist/unstable/http/HttpClient.d.ts +110 -47
  1078. package/dist/unstable/http/HttpClient.d.ts.map +1 -1
  1079. package/dist/unstable/http/HttpClient.js +79 -36
  1080. package/dist/unstable/http/HttpClient.js.map +1 -1
  1081. package/dist/unstable/http/HttpClientError.js +1 -1
  1082. package/dist/unstable/http/HttpClientError.js.map +1 -1
  1083. package/dist/unstable/http/HttpClientRequest.d.ts +44 -0
  1084. package/dist/unstable/http/HttpClientRequest.d.ts.map +1 -1
  1085. package/dist/unstable/http/HttpClientRequest.js +16 -12
  1086. package/dist/unstable/http/HttpClientRequest.js.map +1 -1
  1087. package/dist/unstable/http/HttpClientResponse.d.ts +4 -4
  1088. package/dist/unstable/http/HttpClientResponse.js +3 -18
  1089. package/dist/unstable/http/HttpClientResponse.js.map +1 -1
  1090. package/dist/unstable/http/HttpEffect.d.ts +7 -9
  1091. package/dist/unstable/http/HttpEffect.d.ts.map +1 -1
  1092. package/dist/unstable/http/HttpEffect.js +7 -8
  1093. package/dist/unstable/http/HttpEffect.js.map +1 -1
  1094. package/dist/unstable/http/HttpIncomingMessage.js.map +1 -1
  1095. package/dist/unstable/http/HttpMethod.d.ts +6 -9
  1096. package/dist/unstable/http/HttpMethod.d.ts.map +1 -1
  1097. package/dist/unstable/http/HttpMethod.js +6 -9
  1098. package/dist/unstable/http/HttpMethod.js.map +1 -1
  1099. package/dist/unstable/http/HttpMiddleware.d.ts +75 -9
  1100. package/dist/unstable/http/HttpMiddleware.d.ts.map +1 -1
  1101. package/dist/unstable/http/HttpMiddleware.js +164 -39
  1102. package/dist/unstable/http/HttpMiddleware.js.map +1 -1
  1103. package/dist/unstable/http/HttpPlatform.d.ts +76 -0
  1104. package/dist/unstable/http/HttpPlatform.d.ts.map +1 -1
  1105. package/dist/unstable/http/HttpPlatform.js +53 -3
  1106. package/dist/unstable/http/HttpPlatform.js.map +1 -1
  1107. package/dist/unstable/http/HttpRouter.d.ts +91 -92
  1108. package/dist/unstable/http/HttpRouter.d.ts.map +1 -1
  1109. package/dist/unstable/http/HttpRouter.js +78 -79
  1110. package/dist/unstable/http/HttpRouter.js.map +1 -1
  1111. package/dist/unstable/http/HttpServer.d.ts +13 -13
  1112. package/dist/unstable/http/HttpServer.js +6 -6
  1113. package/dist/unstable/http/HttpServer.js.map +1 -1
  1114. package/dist/unstable/http/HttpServerError.d.ts +2 -2
  1115. package/dist/unstable/http/HttpServerError.js +2 -2
  1116. package/dist/unstable/http/HttpServerError.js.map +1 -1
  1117. package/dist/unstable/http/HttpServerRequest.d.ts +4 -4
  1118. package/dist/unstable/http/HttpServerRequest.d.ts.map +1 -1
  1119. package/dist/unstable/http/HttpServerRequest.js +23 -15
  1120. package/dist/unstable/http/HttpServerRequest.js.map +1 -1
  1121. package/dist/unstable/http/HttpServerRespondable.js.map +1 -1
  1122. package/dist/unstable/http/HttpServerResponse.d.ts +22 -0
  1123. package/dist/unstable/http/HttpServerResponse.d.ts.map +1 -1
  1124. package/dist/unstable/http/HttpServerResponse.js +17 -5
  1125. package/dist/unstable/http/HttpServerResponse.js.map +1 -1
  1126. package/dist/unstable/http/HttpStaticServer.d.ts +35 -7
  1127. package/dist/unstable/http/HttpStaticServer.d.ts.map +1 -1
  1128. package/dist/unstable/http/HttpStaticServer.js +35 -7
  1129. package/dist/unstable/http/HttpStaticServer.js.map +1 -1
  1130. package/dist/unstable/http/HttpTraceContext.js.map +1 -1
  1131. package/dist/unstable/http/Multipart.d.ts +28 -9
  1132. package/dist/unstable/http/Multipart.d.ts.map +1 -1
  1133. package/dist/unstable/http/Multipart.js +68 -36
  1134. package/dist/unstable/http/Multipart.js.map +1 -1
  1135. package/dist/unstable/http/MultipartParser/HeadersParser.d.ts +53 -0
  1136. package/dist/unstable/http/MultipartParser/HeadersParser.d.ts.map +1 -0
  1137. package/dist/unstable/http/MultipartParser/HeadersParser.js +14 -0
  1138. package/dist/unstable/http/MultipartParser/HeadersParser.js.map +1 -0
  1139. package/dist/unstable/http/MultipartParser/Search.d.ts +11 -0
  1140. package/dist/unstable/http/MultipartParser/Search.d.ts.map +1 -0
  1141. package/dist/unstable/http/MultipartParser/Search.js +14 -0
  1142. package/dist/unstable/http/MultipartParser/Search.js.map +1 -0
  1143. package/dist/unstable/http/MultipartParser/internal/contentType.d.ts +5 -0
  1144. package/dist/unstable/http/MultipartParser/internal/contentType.d.ts.map +1 -0
  1145. package/dist/unstable/http/MultipartParser/internal/contentType.js +82 -0
  1146. package/dist/unstable/http/MultipartParser/internal/contentType.js.map +1 -0
  1147. package/dist/unstable/http/MultipartParser/internal/headers.d.ts +3 -0
  1148. package/dist/unstable/http/MultipartParser/internal/headers.d.ts.map +1 -0
  1149. package/dist/unstable/http/MultipartParser/internal/headers.js +208 -0
  1150. package/dist/unstable/http/MultipartParser/internal/headers.js.map +1 -0
  1151. package/dist/unstable/http/MultipartParser/internal/multipart.d.ts +8 -0
  1152. package/dist/unstable/http/MultipartParser/internal/multipart.d.ts.map +1 -0
  1153. package/dist/unstable/http/MultipartParser/internal/multipart.js +241 -0
  1154. package/dist/unstable/http/MultipartParser/internal/multipart.js.map +1 -0
  1155. package/dist/unstable/http/MultipartParser/internal/search.d.ts +5 -0
  1156. package/dist/unstable/http/MultipartParser/internal/search.d.ts.map +1 -0
  1157. package/dist/unstable/http/MultipartParser/internal/search.js +120 -0
  1158. package/dist/unstable/http/MultipartParser/internal/search.js.map +1 -0
  1159. package/dist/unstable/http/MultipartParser.d.ts +98 -0
  1160. package/dist/unstable/http/MultipartParser.d.ts.map +1 -0
  1161. package/dist/unstable/http/MultipartParser.js +23 -0
  1162. package/dist/unstable/http/MultipartParser.js.map +1 -0
  1163. package/dist/unstable/http/Template.d.ts.map +1 -1
  1164. package/dist/unstable/http/Template.js +3 -3
  1165. package/dist/unstable/http/Template.js.map +1 -1
  1166. package/dist/unstable/http/Url.d.ts +33 -63
  1167. package/dist/unstable/http/Url.d.ts.map +1 -1
  1168. package/dist/unstable/http/Url.js +14 -28
  1169. package/dist/unstable/http/Url.js.map +1 -1
  1170. package/dist/unstable/http/UrlParams.d.ts +10 -18
  1171. package/dist/unstable/http/UrlParams.d.ts.map +1 -1
  1172. package/dist/unstable/http/UrlParams.js +26 -31
  1173. package/dist/unstable/http/UrlParams.js.map +1 -1
  1174. package/dist/unstable/http/index.d.ts +1 -1
  1175. package/dist/unstable/http/index.d.ts.map +1 -1
  1176. package/dist/unstable/http/index.js +1 -1
  1177. package/dist/unstable/http/index.js.map +1 -1
  1178. package/dist/unstable/http/internal/compression.d.ts +2 -0
  1179. package/dist/unstable/http/internal/compression.d.ts.map +1 -0
  1180. package/dist/unstable/http/internal/compression.js +155 -0
  1181. package/dist/unstable/http/internal/compression.js.map +1 -0
  1182. package/dist/unstable/http/internal/httpBody.d.ts +2 -0
  1183. package/dist/unstable/http/internal/httpBody.d.ts.map +1 -0
  1184. package/dist/unstable/http/internal/httpBody.js +10 -0
  1185. package/dist/unstable/http/internal/httpBody.js.map +1 -0
  1186. package/dist/unstable/http/internal/preResponseHandler.js.map +1 -1
  1187. package/dist/unstable/httpapi/HttpApi.d.ts.map +1 -1
  1188. package/dist/unstable/httpapi/HttpApi.js +9 -9
  1189. package/dist/unstable/httpapi/HttpApi.js.map +1 -1
  1190. package/dist/unstable/httpapi/HttpApiBuilder.d.ts +2 -2
  1191. package/dist/unstable/httpapi/HttpApiBuilder.d.ts.map +1 -1
  1192. package/dist/unstable/httpapi/HttpApiBuilder.js +82 -30
  1193. package/dist/unstable/httpapi/HttpApiBuilder.js.map +1 -1
  1194. package/dist/unstable/httpapi/HttpApiClient.d.ts +4 -5
  1195. package/dist/unstable/httpapi/HttpApiClient.d.ts.map +1 -1
  1196. package/dist/unstable/httpapi/HttpApiClient.js +89 -51
  1197. package/dist/unstable/httpapi/HttpApiClient.js.map +1 -1
  1198. package/dist/unstable/httpapi/HttpApiEndpoint.d.ts +48 -46
  1199. package/dist/unstable/httpapi/HttpApiEndpoint.d.ts.map +1 -1
  1200. package/dist/unstable/httpapi/HttpApiEndpoint.js +73 -16
  1201. package/dist/unstable/httpapi/HttpApiEndpoint.js.map +1 -1
  1202. package/dist/unstable/httpapi/HttpApiError.d.ts +18 -18
  1203. package/dist/unstable/httpapi/HttpApiError.d.ts.map +1 -1
  1204. package/dist/unstable/httpapi/HttpApiError.js +30 -30
  1205. package/dist/unstable/httpapi/HttpApiError.js.map +1 -1
  1206. package/dist/unstable/httpapi/HttpApiGroup.d.ts +15 -15
  1207. package/dist/unstable/httpapi/HttpApiGroup.js +2 -2
  1208. package/dist/unstable/httpapi/HttpApiGroup.js.map +1 -1
  1209. package/dist/unstable/httpapi/HttpApiMiddleware.d.ts +71 -24
  1210. package/dist/unstable/httpapi/HttpApiMiddleware.d.ts.map +1 -1
  1211. package/dist/unstable/httpapi/HttpApiMiddleware.js +57 -10
  1212. package/dist/unstable/httpapi/HttpApiMiddleware.js.map +1 -1
  1213. package/dist/unstable/httpapi/HttpApiScalar.d.ts +0 -12
  1214. package/dist/unstable/httpapi/HttpApiScalar.d.ts.map +1 -1
  1215. package/dist/unstable/httpapi/HttpApiScalar.js.map +1 -1
  1216. package/dist/unstable/httpapi/HttpApiSchema.d.ts +225 -6
  1217. package/dist/unstable/httpapi/HttpApiSchema.d.ts.map +1 -1
  1218. package/dist/unstable/httpapi/HttpApiSchema.js +174 -4
  1219. package/dist/unstable/httpapi/HttpApiSchema.js.map +1 -1
  1220. package/dist/unstable/httpapi/HttpApiSecurity.js.map +1 -1
  1221. package/dist/unstable/httpapi/HttpApiSwagger.js.map +1 -1
  1222. package/dist/unstable/httpapi/HttpApiTest.js.map +1 -1
  1223. package/dist/unstable/httpapi/OpenApi.d.ts +21 -13
  1224. package/dist/unstable/httpapi/OpenApi.d.ts.map +1 -1
  1225. package/dist/unstable/httpapi/OpenApi.js +110 -57
  1226. package/dist/unstable/httpapi/OpenApi.js.map +1 -1
  1227. package/dist/unstable/httpapi/index.js.map +1 -1
  1228. package/dist/unstable/httpapi/internal/html.js.map +1 -1
  1229. package/dist/unstable/httpapi/internal/httpApiScalar.js.map +1 -1
  1230. package/dist/unstable/httpapi/internal/httpApiSwagger.js.map +1 -1
  1231. package/dist/unstable/httpapi/internal/mediaType.js.map +1 -1
  1232. package/dist/unstable/observability/Otlp.js.map +1 -1
  1233. package/dist/unstable/observability/OtlpExporter.d.ts +71 -2
  1234. package/dist/unstable/observability/OtlpExporter.d.ts.map +1 -1
  1235. package/dist/unstable/observability/OtlpExporter.js +86 -7
  1236. package/dist/unstable/observability/OtlpExporter.js.map +1 -1
  1237. package/dist/unstable/observability/OtlpLogger.d.ts +4 -3
  1238. package/dist/unstable/observability/OtlpLogger.d.ts.map +1 -1
  1239. package/dist/unstable/observability/OtlpLogger.js +4 -4
  1240. package/dist/unstable/observability/OtlpLogger.js.map +1 -1
  1241. package/dist/unstable/observability/OtlpMetrics.d.ts +11 -4
  1242. package/dist/unstable/observability/OtlpMetrics.d.ts.map +1 -1
  1243. package/dist/unstable/observability/OtlpMetrics.js +31 -15
  1244. package/dist/unstable/observability/OtlpMetrics.js.map +1 -1
  1245. package/dist/unstable/observability/OtlpResource.d.ts +16 -7
  1246. package/dist/unstable/observability/OtlpResource.d.ts.map +1 -1
  1247. package/dist/unstable/observability/OtlpResource.js +21 -12
  1248. package/dist/unstable/observability/OtlpResource.js.map +1 -1
  1249. package/dist/unstable/observability/OtlpSerialization.js.map +1 -1
  1250. package/dist/unstable/observability/OtlpTracer.d.ts +4 -3
  1251. package/dist/unstable/observability/OtlpTracer.d.ts.map +1 -1
  1252. package/dist/unstable/observability/OtlpTracer.js +3 -3
  1253. package/dist/unstable/observability/OtlpTracer.js.map +1 -1
  1254. package/dist/unstable/observability/PrometheusMetrics.d.ts +13 -4
  1255. package/dist/unstable/observability/PrometheusMetrics.d.ts.map +1 -1
  1256. package/dist/unstable/observability/PrometheusMetrics.js +10 -3
  1257. package/dist/unstable/observability/PrometheusMetrics.js.map +1 -1
  1258. package/dist/unstable/observability/index.js.map +1 -1
  1259. package/dist/unstable/observability/internal/otlpEnv.js +1 -1
  1260. package/dist/unstable/observability/internal/otlpEnv.js.map +1 -1
  1261. package/dist/unstable/observability/internal/otlpProtobuf.js.map +1 -1
  1262. package/dist/unstable/observability/internal/protobuf.js +3 -0
  1263. package/dist/unstable/observability/internal/protobuf.js.map +1 -1
  1264. package/dist/unstable/persistence/KeyValueStore.d.ts +8 -3
  1265. package/dist/unstable/persistence/KeyValueStore.d.ts.map +1 -1
  1266. package/dist/unstable/persistence/KeyValueStore.js +22 -13
  1267. package/dist/unstable/persistence/KeyValueStore.js.map +1 -1
  1268. package/dist/unstable/persistence/Persistable.d.ts +8 -8
  1269. package/dist/unstable/persistence/Persistable.d.ts.map +1 -1
  1270. package/dist/unstable/persistence/Persistable.js +2 -1
  1271. package/dist/unstable/persistence/Persistable.js.map +1 -1
  1272. package/dist/unstable/persistence/PersistedCache.js.map +1 -1
  1273. package/dist/unstable/persistence/PersistedQueue.d.ts +6 -6
  1274. package/dist/unstable/persistence/PersistedQueue.d.ts.map +1 -1
  1275. package/dist/unstable/persistence/PersistedQueue.js +15 -15
  1276. package/dist/unstable/persistence/PersistedQueue.js.map +1 -1
  1277. package/dist/unstable/persistence/Persistence.d.ts +3 -3
  1278. package/dist/unstable/persistence/Persistence.d.ts.map +1 -1
  1279. package/dist/unstable/persistence/Persistence.js +108 -22
  1280. package/dist/unstable/persistence/Persistence.js.map +1 -1
  1281. package/dist/unstable/persistence/RateLimiter.d.ts +47 -26
  1282. package/dist/unstable/persistence/RateLimiter.d.ts.map +1 -1
  1283. package/dist/unstable/persistence/RateLimiter.js +31 -47
  1284. package/dist/unstable/persistence/RateLimiter.js.map +1 -1
  1285. package/dist/unstable/persistence/Redis.d.ts +2 -2
  1286. package/dist/unstable/persistence/Redis.d.ts.map +1 -1
  1287. package/dist/unstable/persistence/Redis.js +9 -7
  1288. package/dist/unstable/persistence/Redis.js.map +1 -1
  1289. package/dist/unstable/persistence/index.js.map +1 -1
  1290. package/dist/unstable/process/ChildProcess.d.ts +72 -21
  1291. package/dist/unstable/process/ChildProcess.d.ts.map +1 -1
  1292. package/dist/unstable/process/ChildProcess.js +14 -5
  1293. package/dist/unstable/process/ChildProcess.js.map +1 -1
  1294. package/dist/unstable/process/ChildProcessSpawner.d.ts +21 -10
  1295. package/dist/unstable/process/ChildProcessSpawner.d.ts.map +1 -1
  1296. package/dist/unstable/process/ChildProcessSpawner.js +4 -2
  1297. package/dist/unstable/process/ChildProcessSpawner.js.map +1 -1
  1298. package/dist/unstable/process/index.js.map +1 -1
  1299. package/dist/unstable/reactivity/AsyncResult.d.ts +8 -8
  1300. package/dist/unstable/reactivity/AsyncResult.d.ts.map +1 -1
  1301. package/dist/unstable/reactivity/AsyncResult.js +14 -13
  1302. package/dist/unstable/reactivity/AsyncResult.js.map +1 -1
  1303. package/dist/unstable/reactivity/Atom.d.ts +131 -30
  1304. package/dist/unstable/reactivity/Atom.d.ts.map +1 -1
  1305. package/dist/unstable/reactivity/Atom.js +53 -34
  1306. package/dist/unstable/reactivity/Atom.js.map +1 -1
  1307. package/dist/unstable/reactivity/AtomHttpApi.d.ts +1 -1
  1308. package/dist/unstable/reactivity/AtomHttpApi.d.ts.map +1 -1
  1309. package/dist/unstable/reactivity/AtomHttpApi.js +4 -1
  1310. package/dist/unstable/reactivity/AtomHttpApi.js.map +1 -1
  1311. package/dist/unstable/reactivity/AtomRef.js.map +1 -1
  1312. package/dist/unstable/reactivity/AtomRegistry.js +25 -4
  1313. package/dist/unstable/reactivity/AtomRegistry.js.map +1 -1
  1314. package/dist/unstable/reactivity/AtomRpc.d.ts +1 -1
  1315. package/dist/unstable/reactivity/AtomRpc.d.ts.map +1 -1
  1316. package/dist/unstable/reactivity/AtomRpc.js +4 -1
  1317. package/dist/unstable/reactivity/AtomRpc.js.map +1 -1
  1318. package/dist/unstable/reactivity/Hydration.d.ts +1 -1
  1319. package/dist/unstable/reactivity/Hydration.js +1 -1
  1320. package/dist/unstable/reactivity/Hydration.js.map +1 -1
  1321. package/dist/unstable/reactivity/Reactivity.js.map +1 -1
  1322. package/dist/unstable/reactivity/index.js.map +1 -1
  1323. package/dist/unstable/rpc/Rpc.d.ts +35 -33
  1324. package/dist/unstable/rpc/Rpc.d.ts.map +1 -1
  1325. package/dist/unstable/rpc/Rpc.js +4 -2
  1326. package/dist/unstable/rpc/Rpc.js.map +1 -1
  1327. package/dist/unstable/rpc/RpcClient.d.ts +26 -12
  1328. package/dist/unstable/rpc/RpcClient.d.ts.map +1 -1
  1329. package/dist/unstable/rpc/RpcClient.js +40 -22
  1330. package/dist/unstable/rpc/RpcClient.js.map +1 -1
  1331. package/dist/unstable/rpc/RpcClientError.js +2 -2
  1332. package/dist/unstable/rpc/RpcClientError.js.map +1 -1
  1333. package/dist/unstable/rpc/RpcGroup.d.ts +8 -8
  1334. package/dist/unstable/rpc/RpcGroup.js +1 -1
  1335. package/dist/unstable/rpc/RpcGroup.js.map +1 -1
  1336. package/dist/unstable/rpc/RpcMessage.d.ts +31 -30
  1337. package/dist/unstable/rpc/RpcMessage.d.ts.map +1 -1
  1338. package/dist/unstable/rpc/RpcMessage.js +6 -6
  1339. package/dist/unstable/rpc/RpcMessage.js.map +1 -1
  1340. package/dist/unstable/rpc/RpcMiddleware.d.ts +10 -10
  1341. package/dist/unstable/rpc/RpcMiddleware.js +1 -1
  1342. package/dist/unstable/rpc/RpcMiddleware.js.map +1 -1
  1343. package/dist/unstable/rpc/RpcSchema.d.ts +4 -4
  1344. package/dist/unstable/rpc/RpcSchema.js +3 -3
  1345. package/dist/unstable/rpc/RpcSchema.js.map +1 -1
  1346. package/dist/unstable/rpc/RpcSerialization.d.ts +58 -7
  1347. package/dist/unstable/rpc/RpcSerialization.d.ts.map +1 -1
  1348. package/dist/unstable/rpc/RpcSerialization.js +177 -96
  1349. package/dist/unstable/rpc/RpcSerialization.js.map +1 -1
  1350. package/dist/unstable/rpc/RpcServer.d.ts +13 -13
  1351. package/dist/unstable/rpc/RpcServer.d.ts.map +1 -1
  1352. package/dist/unstable/rpc/RpcServer.js +20 -15
  1353. package/dist/unstable/rpc/RpcServer.js.map +1 -1
  1354. package/dist/unstable/rpc/RpcTest.js.map +1 -1
  1355. package/dist/unstable/rpc/RpcWorker.d.ts +5 -5
  1356. package/dist/unstable/rpc/RpcWorker.js +4 -4
  1357. package/dist/unstable/rpc/RpcWorker.js.map +1 -1
  1358. package/dist/unstable/rpc/Utils.js.map +1 -1
  1359. package/dist/unstable/rpc/index.js.map +1 -1
  1360. package/dist/unstable/schema/Model.d.ts +53 -51
  1361. package/dist/unstable/schema/Model.d.ts.map +1 -1
  1362. package/dist/unstable/schema/Model.js +35 -33
  1363. package/dist/unstable/schema/Model.js.map +1 -1
  1364. package/dist/unstable/schema/VariantSchema.d.ts +11 -12
  1365. package/dist/unstable/schema/VariantSchema.d.ts.map +1 -1
  1366. package/dist/unstable/schema/VariantSchema.js +28 -17
  1367. package/dist/unstable/schema/VariantSchema.js.map +1 -1
  1368. package/dist/unstable/schema/index.js.map +1 -1
  1369. package/dist/unstable/socket/Socket.d.ts +12 -4
  1370. package/dist/unstable/socket/Socket.d.ts.map +1 -1
  1371. package/dist/unstable/socket/Socket.js +38 -17
  1372. package/dist/unstable/socket/Socket.js.map +1 -1
  1373. package/dist/unstable/socket/SocketServer.js.map +1 -1
  1374. package/dist/unstable/socket/index.js.map +1 -1
  1375. package/dist/unstable/sql/Migrator.d.ts +9 -1
  1376. package/dist/unstable/sql/Migrator.d.ts.map +1 -1
  1377. package/dist/unstable/sql/Migrator.js +15 -2
  1378. package/dist/unstable/sql/Migrator.js.map +1 -1
  1379. package/dist/unstable/sql/SqlClient.d.ts +2 -3
  1380. package/dist/unstable/sql/SqlClient.d.ts.map +1 -1
  1381. package/dist/unstable/sql/SqlClient.js +8 -4
  1382. package/dist/unstable/sql/SqlClient.js.map +1 -1
  1383. package/dist/unstable/sql/SqlConnection.js.map +1 -1
  1384. package/dist/unstable/sql/SqlError.d.ts +2 -2
  1385. package/dist/unstable/sql/SqlError.js +15 -15
  1386. package/dist/unstable/sql/SqlError.js.map +1 -1
  1387. package/dist/unstable/sql/SqlModel.d.ts +2 -2
  1388. package/dist/unstable/sql/SqlModel.js +2 -2
  1389. package/dist/unstable/sql/SqlModel.js.map +1 -1
  1390. package/dist/unstable/sql/SqlResolver.d.ts +5 -5
  1391. package/dist/unstable/sql/SqlResolver.d.ts.map +1 -1
  1392. package/dist/unstable/sql/SqlResolver.js +30 -24
  1393. package/dist/unstable/sql/SqlResolver.js.map +1 -1
  1394. package/dist/unstable/sql/SqlSchema.js.map +1 -1
  1395. package/dist/unstable/sql/SqlStream.js.map +1 -1
  1396. package/dist/unstable/sql/Statement.d.ts +6 -6
  1397. package/dist/unstable/sql/Statement.d.ts.map +1 -1
  1398. package/dist/unstable/sql/Statement.js +30 -27
  1399. package/dist/unstable/sql/Statement.js.map +1 -1
  1400. package/dist/unstable/sql/index.js.map +1 -1
  1401. package/dist/unstable/workers/Transferable.d.ts +1 -1
  1402. package/dist/unstable/workers/Transferable.js +1 -1
  1403. package/dist/unstable/workers/Transferable.js.map +1 -1
  1404. package/dist/unstable/workers/Worker.d.ts +2 -2
  1405. package/dist/unstable/workers/Worker.d.ts.map +1 -1
  1406. package/dist/unstable/workers/Worker.js +13 -14
  1407. package/dist/unstable/workers/Worker.js.map +1 -1
  1408. package/dist/unstable/workers/WorkerError.d.ts +7 -7
  1409. package/dist/unstable/workers/WorkerError.js +11 -11
  1410. package/dist/unstable/workers/WorkerError.js.map +1 -1
  1411. package/dist/unstable/workers/WorkerRunner.d.ts +1 -1
  1412. package/dist/unstable/workers/WorkerRunner.js +1 -1
  1413. package/dist/unstable/workers/WorkerRunner.js.map +1 -1
  1414. package/dist/unstable/workers/index.js.map +1 -1
  1415. package/dist/unstable/workflow/Activity.d.ts +2 -2
  1416. package/dist/unstable/workflow/Activity.js +2 -2
  1417. package/dist/unstable/workflow/Activity.js.map +1 -1
  1418. package/dist/unstable/workflow/DurableClock.d.ts +1 -1
  1419. package/dist/unstable/workflow/DurableClock.js +1 -1
  1420. package/dist/unstable/workflow/DurableClock.js.map +1 -1
  1421. package/dist/unstable/workflow/DurableDeferred.d.ts +10 -10
  1422. package/dist/unstable/workflow/DurableDeferred.d.ts.map +1 -1
  1423. package/dist/unstable/workflow/DurableDeferred.js +13 -8
  1424. package/dist/unstable/workflow/DurableDeferred.js.map +1 -1
  1425. package/dist/unstable/workflow/DurableQueue.d.ts +22 -20
  1426. package/dist/unstable/workflow/DurableQueue.d.ts.map +1 -1
  1427. package/dist/unstable/workflow/DurableQueue.js +22 -20
  1428. package/dist/unstable/workflow/DurableQueue.js.map +1 -1
  1429. package/dist/unstable/workflow/Workflow.d.ts +21 -21
  1430. package/dist/unstable/workflow/Workflow.d.ts.map +1 -1
  1431. package/dist/unstable/workflow/Workflow.js +13 -14
  1432. package/dist/unstable/workflow/Workflow.js.map +1 -1
  1433. package/dist/unstable/workflow/WorkflowEngine.d.ts +26 -3
  1434. package/dist/unstable/workflow/WorkflowEngine.d.ts.map +1 -1
  1435. package/dist/unstable/workflow/WorkflowEngine.js +72 -6
  1436. package/dist/unstable/workflow/WorkflowEngine.js.map +1 -1
  1437. package/dist/unstable/workflow/WorkflowProxy.d.ts +4 -2
  1438. package/dist/unstable/workflow/WorkflowProxy.d.ts.map +1 -1
  1439. package/dist/unstable/workflow/WorkflowProxy.js +4 -2
  1440. package/dist/unstable/workflow/WorkflowProxy.js.map +1 -1
  1441. package/dist/unstable/workflow/WorkflowProxyServer.js.map +1 -1
  1442. package/dist/unstable/workflow/index.js.map +1 -1
  1443. package/dist/unstable/workflow/internal/crypto.js.map +1 -1
  1444. package/package.json +12 -16
  1445. package/src/Array.ts +1069 -1071
  1446. package/src/BigDecimal.ts +433 -756
  1447. package/src/BigInt.ts +213 -269
  1448. package/src/Boolean.ts +146 -188
  1449. package/src/Brand.ts +4 -4
  1450. package/src/Cache.ts +469 -851
  1451. package/src/Cause.ts +167 -277
  1452. package/src/Channel.ts +982 -831
  1453. package/src/ChannelSchema.ts +1 -1
  1454. package/src/Chunk.ts +841 -1181
  1455. package/src/Clock.ts +181 -49
  1456. package/src/Combiner.ts +20 -33
  1457. package/src/Config.ts +642 -335
  1458. package/src/ConfigProvider.ts +267 -135
  1459. package/src/Console.ts +289 -39
  1460. package/src/Context.ts +323 -404
  1461. package/src/Cron.ts +271 -219
  1462. package/src/Crypto.ts +30 -23
  1463. package/src/Data.ts +63 -82
  1464. package/src/DateTime.ts +564 -660
  1465. package/src/Deferred.ts +259 -258
  1466. package/src/Duration.ts +244 -311
  1467. package/src/Effect.ts +3215 -3394
  1468. package/src/Encoding.ts +22 -40
  1469. package/src/Equal.ts +59 -41
  1470. package/src/Equivalence.ts +103 -105
  1471. package/src/ErrorReporter.ts +51 -27
  1472. package/src/ExecutionPlan.ts +91 -56
  1473. package/src/Exit.ts +116 -192
  1474. package/src/Fiber.ts +82 -149
  1475. package/src/FiberHandle.ts +155 -107
  1476. package/src/FiberMap.ts +225 -174
  1477. package/src/FiberSet.ts +125 -83
  1478. package/src/FileSystem.ts +156 -264
  1479. package/src/Filter.ts +61 -33
  1480. package/src/Formatter.ts +69 -76
  1481. package/src/Function.ts +119 -151
  1482. package/src/Graph.ts +3258 -1102
  1483. package/src/HKT.ts +12 -6
  1484. package/src/Hash.ts +52 -83
  1485. package/src/HashMap.ts +319 -411
  1486. package/src/HashRing.ts +1 -0
  1487. package/src/HashSet.ts +177 -284
  1488. package/src/Inspectable.ts +22 -20
  1489. package/src/Iterable.ts +665 -799
  1490. package/src/JsonPatch.ts +60 -113
  1491. package/src/JsonPointer.ts +8 -8
  1492. package/src/JsonSchema.ts +408 -251
  1493. package/src/Latch.ts +23 -35
  1494. package/src/Layer.ts +366 -265
  1495. package/src/LayerMap.ts +49 -29
  1496. package/src/LayerRef.ts +6 -2
  1497. package/src/LogLevel.ts +114 -214
  1498. package/src/Logger.ts +348 -700
  1499. package/src/ManagedRuntime.ts +20 -5
  1500. package/src/Match.ts +217 -252
  1501. package/src/Metric.ts +520 -1092
  1502. package/src/MutableHashMap.ts +218 -255
  1503. package/src/MutableHashSet.ts +84 -89
  1504. package/src/MutableList.ts +77 -370
  1505. package/src/MutableRef.ts +420 -243
  1506. package/src/Newtype.ts +21 -14
  1507. package/src/NonEmptyIterable.ts +7 -137
  1508. package/src/Number.ts +196 -233
  1509. package/src/Optic.ts +303 -441
  1510. package/src/Option.ts +449 -813
  1511. package/src/Order.ts +109 -109
  1512. package/src/Ordering.ts +20 -23
  1513. package/src/PartitionedSemaphore.ts +1 -4
  1514. package/src/Path.ts +38 -41
  1515. package/src/Pipeable.ts +6 -5
  1516. package/src/PlatformError.ts +4 -4
  1517. package/src/Pool.ts +4 -2
  1518. package/src/Predicate.ts +200 -181
  1519. package/src/PrimaryKey.ts +7 -7
  1520. package/src/PubSub.ts +526 -552
  1521. package/src/Pull.ts +24 -18
  1522. package/src/Queue.ts +204 -165
  1523. package/src/Random.ts +49 -74
  1524. package/src/RcMap.ts +121 -63
  1525. package/src/RcRef.ts +24 -13
  1526. package/src/Record.ts +387 -487
  1527. package/src/Redactable.ts +10 -3
  1528. package/src/Redacted.ts +25 -25
  1529. package/src/Reducer.ts +8 -15
  1530. package/src/Ref.ts +221 -361
  1531. package/src/References.ts +102 -214
  1532. package/src/RegExp.ts +10 -14
  1533. package/src/Request.ts +36 -28
  1534. package/src/RequestResolver.ts +202 -91
  1535. package/src/Result.ts +314 -485
  1536. package/src/Runtime.ts +50 -75
  1537. package/src/Schedule.ts +311 -1737
  1538. package/src/Scheduler.ts +20 -7
  1539. package/src/Schema.ts +3476 -1914
  1540. package/src/SchemaAST.ts +902 -573
  1541. package/src/SchemaGetter.ts +351 -233
  1542. package/src/SchemaIssue.ts +367 -334
  1543. package/src/SchemaParser.ts +254 -148
  1544. package/src/SchemaRepresentation.ts +732 -3414
  1545. package/src/SchemaTransformation.ts +186 -97
  1546. package/src/Scope.ts +123 -151
  1547. package/src/ScopedCache.ts +1 -1
  1548. package/src/ScopedRef.ts +6 -4
  1549. package/src/Semaphore.ts +157 -54
  1550. package/src/Sink.ts +129 -114
  1551. package/src/Stdio.ts +24 -5
  1552. package/src/Stream.ts +2745 -3173
  1553. package/src/String.ts +275 -312
  1554. package/src/Struct.ts +114 -118
  1555. package/src/SubscriptionRef.ts +284 -252
  1556. package/src/Symbol.ts +3 -3
  1557. package/src/SynchronizedRef.ts +1 -1
  1558. package/src/Terminal.ts +3 -3
  1559. package/src/Tracer.ts +102 -55
  1560. package/src/Trie.ts +287 -679
  1561. package/src/Tuple.ts +99 -131
  1562. package/src/TxChunk.ts +201 -121
  1563. package/src/TxDeferred.ts +62 -46
  1564. package/src/TxHashMap.ts +645 -799
  1565. package/src/TxHashSet.ts +443 -356
  1566. package/src/TxPriorityQueue.ts +130 -98
  1567. package/src/TxPubSub.ts +107 -80
  1568. package/src/TxQueue.ts +215 -184
  1569. package/src/TxReentrantLock.ts +136 -101
  1570. package/src/TxRef.ts +51 -32
  1571. package/src/TxSemaphore.ts +129 -95
  1572. package/src/TxSubscriptionRef.ts +97 -70
  1573. package/src/Types.ts +127 -70
  1574. package/src/Unify.ts +45 -65
  1575. package/src/Utils.ts +23 -16
  1576. package/src/index.ts +0 -10
  1577. package/src/internal/core.ts +6 -5
  1578. package/src/internal/dateTime.ts +7 -1
  1579. package/src/internal/effect.ts +313 -137
  1580. package/src/internal/executionPlan.ts +106 -10
  1581. package/src/internal/hashMap.ts +20 -14
  1582. package/src/internal/matcher.ts +3 -3
  1583. package/src/internal/persistence.ts +2 -0
  1584. package/src/internal/rcRef.ts +24 -16
  1585. package/src/internal/record.ts +11 -7
  1586. package/src/internal/references.ts +3 -7
  1587. package/src/internal/schedule.ts +4 -4
  1588. package/src/internal/schema/annotations.ts +48 -1
  1589. package/src/internal/schema/fromJsonSchemaDocument.ts +977 -0
  1590. package/src/internal/schema/fromRepresentation.ts +339 -0
  1591. package/src/internal/schema/parser.ts +22 -0
  1592. package/src/internal/schema/schema.ts +46 -63
  1593. package/src/internal/schema/{arbitrary.ts → toArbitrary.ts} +9 -81
  1594. package/src/internal/schema/toCodeDocument.ts +572 -0
  1595. package/src/internal/schema/{equivalence.ts → toEquivalence.ts} +12 -7
  1596. package/src/internal/schema/toJsonSchemaDocument.ts +549 -0
  1597. package/src/internal/schema/toRepresentation.ts +404 -0
  1598. package/src/internal/stackTraceLimit.ts +3 -7
  1599. package/src/internal/trie.ts +21 -12
  1600. package/src/testing/FastCheck.ts +8 -7
  1601. package/src/testing/TestClock.ts +86 -32
  1602. package/src/testing/TestConsole.ts +32 -31
  1603. package/src/testing/TestSchema.ts +40 -40
  1604. package/src/unstable/ai/AiError.ts +119 -141
  1605. package/src/unstable/ai/AnthropicStructuredOutput.ts +103 -334
  1606. package/src/unstable/ai/Chat.ts +133 -98
  1607. package/src/unstable/ai/EmbeddingModel.ts +1 -1
  1608. package/src/unstable/ai/IdGenerator.ts +32 -28
  1609. package/src/unstable/ai/LanguageModel.ts +141 -97
  1610. package/src/unstable/ai/McpProtocol.ts +48 -0
  1611. package/src/unstable/ai/McpSchema.ts +92 -81
  1612. package/src/unstable/ai/McpServer.ts +1057 -303
  1613. package/src/unstable/ai/Model.ts +9 -20
  1614. package/src/unstable/ai/OpenAiStructuredOutput.ts +231 -396
  1615. package/src/unstable/ai/Prompt.ts +212 -63
  1616. package/src/unstable/ai/Response.ts +52 -38
  1617. package/src/unstable/ai/Telemetry.ts +46 -13
  1618. package/src/unstable/ai/Tokenizer.ts +14 -3
  1619. package/src/unstable/ai/Tool.ts +94 -64
  1620. package/src/unstable/ai/Toolkit.ts +45 -15
  1621. package/src/unstable/ai/index.ts +5 -0
  1622. package/src/unstable/ai/internal/codec-transformer.ts +13 -7
  1623. package/src/unstable/ai/internal/mcpProtocol.ts +85 -0
  1624. package/src/unstable/ai/internal/mcpProtocolRegistry.ts +70 -0
  1625. package/src/unstable/ai/internal/structured-output.ts +453 -0
  1626. package/src/unstable/cli/Argument.ts +279 -72
  1627. package/src/unstable/cli/CliConfig.ts +85 -0
  1628. package/src/unstable/cli/CliError.ts +161 -90
  1629. package/src/unstable/cli/CliOutput.ts +44 -58
  1630. package/src/unstable/cli/Command.ts +839 -123
  1631. package/src/unstable/cli/Flag.ts +418 -138
  1632. package/src/unstable/cli/GlobalFlag.ts +34 -6
  1633. package/src/unstable/cli/HelpDoc.ts +12 -4
  1634. package/src/unstable/cli/Param.ts +351 -103
  1635. package/src/unstable/cli/Primitive.ts +383 -156
  1636. package/src/unstable/cli/Prompt.ts +64 -34
  1637. package/src/unstable/cli/index.ts +5 -0
  1638. package/src/unstable/cli/internal/ansi.ts +5 -2
  1639. package/src/unstable/cli/internal/command.ts +28 -15
  1640. package/src/unstable/cli/internal/completions/bash.ts +59 -9
  1641. package/src/unstable/cli/internal/completions/descriptor.ts +14 -20
  1642. package/src/unstable/cli/internal/completions/fish.ts +5 -7
  1643. package/src/unstable/cli/internal/config.ts +8 -10
  1644. package/src/unstable/cli/internal/help.ts +4 -2
  1645. package/src/unstable/cli/internal/lexer.ts +8 -2
  1646. package/src/unstable/cli/internal/parser.ts +19 -7
  1647. package/src/unstable/cli/internal/wizard.ts +283 -0
  1648. package/src/unstable/cluster/ClusterError.ts +7 -7
  1649. package/src/unstable/cluster/ClusterSchema.ts +8 -8
  1650. package/src/unstable/cluster/ClusterWorkflowEngine.ts +36 -20
  1651. package/src/unstable/cluster/Entity.ts +23 -19
  1652. package/src/unstable/cluster/EntityProxy.ts +16 -7
  1653. package/src/unstable/cluster/EntityResource.ts +2 -2
  1654. package/src/unstable/cluster/Envelope.ts +5 -4
  1655. package/src/unstable/cluster/HttpRunner.ts +6 -4
  1656. package/src/unstable/cluster/Message.ts +9 -9
  1657. package/src/unstable/cluster/MessageStorage.ts +24 -20
  1658. package/src/unstable/cluster/Reply.ts +26 -7
  1659. package/src/unstable/cluster/Runner.ts +1 -1
  1660. package/src/unstable/cluster/RunnerAddress.ts +1 -1
  1661. package/src/unstable/cluster/RunnerHealth.ts +1 -1
  1662. package/src/unstable/cluster/RunnerServer.ts +45 -18
  1663. package/src/unstable/cluster/RunnerStorage.ts +12 -10
  1664. package/src/unstable/cluster/Runners.ts +48 -26
  1665. package/src/unstable/cluster/ShardId.ts +1 -1
  1666. package/src/unstable/cluster/Sharding.ts +223 -55
  1667. package/src/unstable/cluster/ShardingConfig.ts +8 -4
  1668. package/src/unstable/cluster/SingleRunner.ts +4 -2
  1669. package/src/unstable/cluster/SingletonAddress.ts +1 -1
  1670. package/src/unstable/cluster/Snowflake.ts +8 -8
  1671. package/src/unstable/cluster/SqlMessageStorage.ts +84 -36
  1672. package/src/unstable/cluster/SqlRunnerStorage.ts +223 -133
  1673. package/src/unstable/cluster/internal/entityManager.ts +43 -26
  1674. package/src/unstable/cluster/internal/resourceMap.ts +5 -2
  1675. package/src/unstable/cluster/internal/resourceRef.ts +27 -5
  1676. package/src/unstable/cluster/internal/shardLock.ts +9 -0
  1677. package/src/unstable/devtools/DevToolsClient.ts +3 -2
  1678. package/src/unstable/devtools/DevToolsSchema.ts +10 -5
  1679. package/src/unstable/encoding/Ini.ts +174 -0
  1680. package/src/unstable/encoding/Msgpack.ts +61 -40
  1681. package/src/unstable/encoding/Ndjson.ts +9 -1
  1682. package/src/unstable/encoding/Sse.ts +109 -37
  1683. package/src/unstable/encoding/Toml.ts +504 -0
  1684. package/src/unstable/encoding/Yaml.ts +541 -0
  1685. package/src/unstable/encoding/index.ts +15 -0
  1686. package/src/unstable/eventlog/Event.ts +20 -20
  1687. package/src/unstable/eventlog/EventGroup.ts +4 -4
  1688. package/src/unstable/eventlog/EventJournal.ts +30 -22
  1689. package/src/unstable/eventlog/EventLog.ts +24 -14
  1690. package/src/unstable/eventlog/EventLogEncryption.ts +17 -18
  1691. package/src/unstable/eventlog/EventLogMessage.ts +15 -9
  1692. package/src/unstable/eventlog/EventLogRemote.ts +5 -5
  1693. package/src/unstable/eventlog/EventLogServer.ts +41 -7
  1694. package/src/unstable/eventlog/EventLogServerEncrypted.ts +15 -7
  1695. package/src/unstable/eventlog/EventLogServerUnencrypted.ts +15 -7
  1696. package/src/unstable/eventlog/EventLogSessionAuth.ts +1 -1
  1697. package/src/unstable/eventlog/SqlEventJournal.ts +8 -6
  1698. package/src/unstable/eventlog/SqlEventLogServerEncrypted.ts +1 -1
  1699. package/src/unstable/eventlog/SqlEventLogServerUnencrypted.ts +6 -3
  1700. package/src/unstable/http/Cookies.ts +64 -45
  1701. package/src/unstable/http/Etag.ts +1 -1
  1702. package/src/unstable/http/FetchHttpClient.ts +3 -1
  1703. package/src/unstable/http/FindMyWay/internal/queryString.ts +420 -0
  1704. package/src/unstable/http/FindMyWay/internal/router.ts +950 -0
  1705. package/src/unstable/http/FindMyWay.ts +65 -6
  1706. package/src/unstable/http/Headers.ts +10 -10
  1707. package/src/unstable/http/HttpBody.ts +20 -5
  1708. package/src/unstable/http/HttpClient.ts +215 -78
  1709. package/src/unstable/http/HttpClientError.ts +1 -1
  1710. package/src/unstable/http/HttpClientRequest.ts +59 -12
  1711. package/src/unstable/http/HttpClientResponse.ts +5 -21
  1712. package/src/unstable/http/HttpEffect.ts +20 -19
  1713. package/src/unstable/http/HttpMethod.ts +6 -9
  1714. package/src/unstable/http/HttpMiddleware.ts +202 -39
  1715. package/src/unstable/http/HttpPlatform.ts +129 -6
  1716. package/src/unstable/http/HttpRouter.ts +109 -101
  1717. package/src/unstable/http/HttpServer.ts +13 -13
  1718. package/src/unstable/http/HttpServerError.ts +2 -2
  1719. package/src/unstable/http/HttpServerRequest.ts +31 -17
  1720. package/src/unstable/http/HttpServerResponse.ts +38 -6
  1721. package/src/unstable/http/HttpStaticServer.ts +35 -7
  1722. package/src/unstable/http/Multipart.ts +70 -37
  1723. package/src/unstable/http/MultipartParser/HeadersParser.ts +68 -0
  1724. package/src/unstable/http/MultipartParser/Search.ts +17 -0
  1725. package/src/unstable/http/MultipartParser/internal/contentType.ts +103 -0
  1726. package/src/unstable/http/MultipartParser/internal/headers.ts +244 -0
  1727. package/src/unstable/http/MultipartParser/internal/multipart.ts +279 -0
  1728. package/src/unstable/http/MultipartParser/internal/search.ts +167 -0
  1729. package/src/unstable/http/MultipartParser.ts +115 -0
  1730. package/src/unstable/http/Template.ts +7 -6
  1731. package/src/unstable/http/Url.ts +33 -63
  1732. package/src/unstable/http/UrlParams.ts +27 -32
  1733. package/src/unstable/http/index.ts +1 -1
  1734. package/src/unstable/http/internal/compression.ts +196 -0
  1735. package/src/unstable/http/internal/httpBody.ts +15 -0
  1736. package/src/unstable/httpapi/HttpApi.ts +10 -11
  1737. package/src/unstable/httpapi/HttpApiBuilder.ts +155 -34
  1738. package/src/unstable/httpapi/HttpApiClient.ts +142 -61
  1739. package/src/unstable/httpapi/HttpApiEndpoint.ts +159 -71
  1740. package/src/unstable/httpapi/HttpApiError.ts +46 -52
  1741. package/src/unstable/httpapi/HttpApiGroup.ts +17 -17
  1742. package/src/unstable/httpapi/HttpApiMiddleware.ts +71 -24
  1743. package/src/unstable/httpapi/HttpApiScalar.ts +0 -12
  1744. package/src/unstable/httpapi/HttpApiSchema.ts +359 -6
  1745. package/src/unstable/httpapi/OpenApi.ts +153 -62
  1746. package/src/unstable/observability/OtlpExporter.ts +130 -12
  1747. package/src/unstable/observability/OtlpLogger.ts +8 -6
  1748. package/src/unstable/observability/OtlpMetrics.ts +42 -21
  1749. package/src/unstable/observability/OtlpResource.ts +26 -17
  1750. package/src/unstable/observability/OtlpTracer.ts +9 -5
  1751. package/src/unstable/observability/PrometheusMetrics.ts +13 -4
  1752. package/src/unstable/observability/internal/otlpEnv.ts +1 -1
  1753. package/src/unstable/observability/internal/protobuf.ts +3 -0
  1754. package/src/unstable/persistence/KeyValueStore.ts +72 -49
  1755. package/src/unstable/persistence/Persistable.ts +11 -10
  1756. package/src/unstable/persistence/PersistedQueue.ts +18 -15
  1757. package/src/unstable/persistence/Persistence.ts +153 -26
  1758. package/src/unstable/persistence/RateLimiter.ts +79 -45
  1759. package/src/unstable/persistence/Redis.ts +14 -9
  1760. package/src/unstable/process/ChildProcess.ts +72 -21
  1761. package/src/unstable/process/ChildProcessSpawner.ts +22 -11
  1762. package/src/unstable/reactivity/AsyncResult.ts +23 -18
  1763. package/src/unstable/reactivity/Atom.ts +161 -47
  1764. package/src/unstable/reactivity/AtomHttpApi.ts +5 -4
  1765. package/src/unstable/reactivity/AtomRegistry.ts +25 -4
  1766. package/src/unstable/reactivity/AtomRpc.ts +5 -4
  1767. package/src/unstable/reactivity/Hydration.ts +1 -1
  1768. package/src/unstable/rpc/Rpc.ts +35 -33
  1769. package/src/unstable/rpc/RpcClient.ts +65 -29
  1770. package/src/unstable/rpc/RpcClientError.ts +2 -2
  1771. package/src/unstable/rpc/RpcGroup.ts +8 -8
  1772. package/src/unstable/rpc/RpcMessage.ts +31 -30
  1773. package/src/unstable/rpc/RpcMiddleware.ts +10 -10
  1774. package/src/unstable/rpc/RpcSchema.ts +4 -4
  1775. package/src/unstable/rpc/RpcSerialization.ts +167 -68
  1776. package/src/unstable/rpc/RpcServer.ts +22 -17
  1777. package/src/unstable/rpc/RpcWorker.ts +5 -5
  1778. package/src/unstable/schema/Model.ts +52 -50
  1779. package/src/unstable/schema/VariantSchema.ts +51 -43
  1780. package/src/unstable/socket/Socket.ts +42 -19
  1781. package/src/unstable/sql/Migrator.ts +22 -9
  1782. package/src/unstable/sql/SqlClient.ts +65 -58
  1783. package/src/unstable/sql/SqlError.ts +15 -15
  1784. package/src/unstable/sql/SqlModel.ts +2 -2
  1785. package/src/unstable/sql/SqlResolver.ts +41 -31
  1786. package/src/unstable/sql/Statement.ts +44 -37
  1787. package/src/unstable/workers/Transferable.ts +1 -1
  1788. package/src/unstable/workers/Worker.ts +15 -16
  1789. package/src/unstable/workers/WorkerError.ts +12 -12
  1790. package/src/unstable/workers/WorkerRunner.ts +1 -1
  1791. package/src/unstable/workflow/Activity.ts +2 -2
  1792. package/src/unstable/workflow/DurableClock.ts +1 -1
  1793. package/src/unstable/workflow/DurableDeferred.ts +18 -13
  1794. package/src/unstable/workflow/DurableQueue.ts +22 -20
  1795. package/src/unstable/workflow/Workflow.ts +23 -26
  1796. package/src/unstable/workflow/WorkflowEngine.ts +111 -8
  1797. package/src/unstable/workflow/WorkflowProxy.ts +4 -2
  1798. package/dist/SchemaError.d.ts +0 -53
  1799. package/dist/SchemaError.d.ts.map +0 -1
  1800. package/dist/SchemaError.js +0 -61
  1801. package/dist/SchemaError.js.map +0 -1
  1802. package/dist/SchemaUtils.d.ts +0 -28
  1803. package/dist/SchemaUtils.d.ts.map +0 -1
  1804. package/dist/SchemaUtils.js +0 -45
  1805. package/dist/SchemaUtils.js.map +0 -1
  1806. package/dist/internal/schema/arbitrary.d.ts +0 -5
  1807. package/dist/internal/schema/arbitrary.d.ts.map +0 -1
  1808. package/dist/internal/schema/arbitrary.js.map +0 -1
  1809. package/dist/internal/schema/equivalence.d.ts +0 -2
  1810. package/dist/internal/schema/equivalence.d.ts.map +0 -1
  1811. package/dist/internal/schema/equivalence.js.map +0 -1
  1812. package/dist/internal/schema/representation.d.ts +0 -2
  1813. package/dist/internal/schema/representation.d.ts.map +0 -1
  1814. package/dist/internal/schema/representation.js +0 -865
  1815. package/dist/internal/schema/representation.js.map +0 -1
  1816. package/dist/internal/version.d.ts +0 -3
  1817. package/dist/internal/version.d.ts.map +0 -1
  1818. package/dist/internal/version.js +0 -2
  1819. package/dist/internal/version.js.map +0 -1
  1820. package/dist/unstable/http/Multipasta/HeadersParser.d.ts +0 -14
  1821. package/dist/unstable/http/Multipasta/HeadersParser.d.ts.map +0 -1
  1822. package/dist/unstable/http/Multipasta/HeadersParser.js +0 -14
  1823. package/dist/unstable/http/Multipasta/HeadersParser.js.map +0 -1
  1824. package/dist/unstable/http/Multipasta/Node.d.ts +0 -14
  1825. package/dist/unstable/http/Multipasta/Node.d.ts.map +0 -1
  1826. package/dist/unstable/http/Multipasta/Node.js +0 -14
  1827. package/dist/unstable/http/Multipasta/Node.js.map +0 -1
  1828. package/dist/unstable/http/Multipasta/Search.d.ts +0 -14
  1829. package/dist/unstable/http/Multipasta/Search.d.ts.map +0 -1
  1830. package/dist/unstable/http/Multipasta/Search.js +0 -14
  1831. package/dist/unstable/http/Multipasta/Search.js.map +0 -1
  1832. package/dist/unstable/http/Multipasta/Web.d.ts +0 -14
  1833. package/dist/unstable/http/Multipasta/Web.d.ts.map +0 -1
  1834. package/dist/unstable/http/Multipasta/Web.js +0 -14
  1835. package/dist/unstable/http/Multipasta/Web.js.map +0 -1
  1836. package/dist/unstable/http/Multipasta.d.ts +0 -15
  1837. package/dist/unstable/http/Multipasta.d.ts.map +0 -1
  1838. package/dist/unstable/http/Multipasta.js +0 -15
  1839. package/dist/unstable/http/Multipasta.js.map +0 -1
  1840. package/src/SchemaError.ts +0 -64
  1841. package/src/SchemaUtils.ts +0 -51
  1842. package/src/internal/schema/representation.ts +0 -795
  1843. package/src/internal/version.ts +0 -2
  1844. package/src/unstable/http/Multipasta/HeadersParser.ts +0 -14
  1845. package/src/unstable/http/Multipasta/Node.ts +0 -14
  1846. package/src/unstable/http/Multipasta/Search.ts +0 -14
  1847. package/src/unstable/http/Multipasta/Web.ts +0 -14
  1848. package/src/unstable/http/Multipasta.ts +0 -15
@@ -1,72 +1,156 @@
1
1
  /**
2
- * Plain data structures for describing schemas in a serializable form. A
3
- * `Representation` is not the original `Schema` object; it is a JSON-friendly
4
- * description of the schema's types, fields, unions, checks, annotations, and
5
- * references.
6
- *
7
- * This module defines the representation node types, document types, and
8
- * codecs used to validate those documents. It can build representation
9
- * documents from schema ASTs, turn representation documents back into schemas,
10
- * convert them to and from JSON Schema documents, and generate TypeScript code
11
- * artifacts for schema definitions.
2
+ * Open, compiler-extensible representation of Effect schemas.
12
3
  *
13
4
  * @since 4.0.0
14
5
  */
15
- import * as Arr from "./Array.ts"
16
- import { format, formatPropertyKey } from "./Formatter.ts"
17
- import { collectBrands } from "./internal/schema/annotations.ts"
18
- import * as InternalRepresentation from "./internal/schema/representation.ts"
19
- import { unescapeToken } from "./JsonPointer.ts"
6
+ import * as InternalRecord from "./internal/record.ts"
7
+ import * as InternalFromJsonSchemaDocument from "./internal/schema/fromJsonSchemaDocument.ts"
8
+ import * as InternalFromRepresentation from "./internal/schema/fromRepresentation.ts"
9
+ import * as InternalSchema from "./internal/schema/schema.ts"
10
+ import * as InternalToCodeDocument from "./internal/schema/toCodeDocument.ts"
11
+ import * as InternalToJsonSchemaDocument from "./internal/schema/toJsonSchemaDocument.ts"
12
+ import * as InternalToRepresentation from "./internal/schema/toRepresentation.ts"
20
13
  import type * as JsonSchema from "./JsonSchema.ts"
21
- import { remainder } from "./Number.ts"
22
14
  import * as Option from "./Option.ts"
23
- import * as Predicate from "./Predicate.ts"
24
- import * as Rec from "./Record.ts"
25
15
  import * as Schema from "./Schema.ts"
26
16
  import * as SchemaAST from "./SchemaAST.ts"
27
17
  import * as SchemaGetter from "./SchemaGetter.ts"
28
18
 
29
- // -----------------------------------------------------------------------------
30
- // specification
31
- // -----------------------------------------------------------------------------
32
-
33
19
  /**
34
- * A custom type declaration, such as `Date`, `Option`, or `ReadonlySet`.
35
- *
36
- * **When to use**
20
+ * Open persistence identity carried by declarations and opaque checks.
37
21
  *
38
- * Use when inspecting or transforming non-primitive schema types.
22
+ * @category annotations
23
+ * @since 4.0.0
24
+ */
25
+ export interface RepresentationAnnotation {
26
+ readonly id: string
27
+ readonly payload: Schema.Json
28
+ }
29
+
30
+ /**
31
+ * Open persistence identity and schema dependencies carried by opaque checks.
39
32
  *
40
- * **Details**
33
+ * @category annotations
34
+ * @since 4.0.0
35
+ */
36
+ export interface CheckRepresentationAnnotation<S> extends RepresentationAnnotation {
37
+ readonly schemas?: ReadonlyArray<S> | undefined
38
+ }
39
+
40
+ /**
41
+ * Input passed to JSON Schema compiler annotations.
41
42
  *
42
- * `typeParameters` holds the inner type arguments, such as the `A` in
43
- * `Option<A>`. `encodedSchema` is the fallback representation when no
44
- * {@link Reviver} recognizes this declaration. `annotations.typeConstructor`
45
- * identifies the declaration kind, such as `{ _tag: "effect/Option" }`.
43
+ * @since 4.0.0
44
+ */
45
+ export declare namespace ToJsonSchema {
46
+ /**
47
+ * Input for a check compiler.
48
+ *
49
+ * @category models
50
+ * @since 4.0.0
51
+ */
52
+ export interface CheckInput {
53
+ readonly type: JsonSchema.Type | undefined
54
+ readonly schemas: ReadonlyArray<JsonSchema.JsonSchema>
55
+ }
56
+
57
+ /**
58
+ * Compiles a check to a JSON Schema fragment.
59
+ *
60
+ * **Gotchas**
61
+ *
62
+ * Treat the input schemas as immutable. The returned value must be a valid JSON Schema object graph and must not be
63
+ * mutated after this function returns. Return a new object graph to produce different output during a later
64
+ * compilation.
65
+ *
66
+ * @category models
67
+ * @since 4.0.0
68
+ */
69
+ export type Check = (input: CheckInput) => JsonSchema.JsonSchema
70
+ }
71
+
72
+ /**
73
+ * Input and output contracts for code generation annotations.
46
74
  *
47
- * @see {@link Reviver}
48
- * @see {@link toSchemaDefaultReviver}
75
+ * @since 4.0.0
76
+ */
77
+ export declare namespace Generation {
78
+ /**
79
+ * Input for declaration code generation.
80
+ *
81
+ * @category models
82
+ * @since 4.0.0
83
+ */
84
+ export interface DeclarationInput {
85
+ readonly typeParameters: ReadonlyArray<Code>
86
+ }
87
+
88
+ /**
89
+ * Output of declaration code generation.
90
+ *
91
+ * @category models
92
+ * @since 4.0.0
93
+ */
94
+ export interface DeclarationOutput {
95
+ readonly runtime: string
96
+ readonly Type: string
97
+ readonly importDeclarations?: ReadonlyArray<string> | undefined
98
+ }
99
+
100
+ /**
101
+ * Declaration code generator.
102
+ *
103
+ * @category models
104
+ * @since 4.0.0
105
+ */
106
+ export type Declaration = (input: DeclarationInput) => DeclarationOutput
107
+
108
+ /**
109
+ * Input for check code generation.
110
+ *
111
+ * @category models
112
+ * @since 4.0.0
113
+ */
114
+ export interface CheckInput {
115
+ readonly schemas: ReadonlyArray<Code>
116
+ }
117
+
118
+ /**
119
+ * Output of check code generation.
120
+ *
121
+ * @category models
122
+ * @since 4.0.0
123
+ */
124
+ export interface CheckOutput {
125
+ readonly runtime: string
126
+ readonly importDeclarations?: ReadonlyArray<string> | undefined
127
+ }
128
+
129
+ /**
130
+ * Check code generator.
131
+ *
132
+ * @category models
133
+ * @since 4.0.0
134
+ */
135
+ export type Check = (input: CheckInput) => CheckOutput
136
+ }
137
+
138
+ /**
139
+ * A custom opaque declaration.
49
140
  *
50
141
  * @category models
51
142
  * @since 4.0.0
52
143
  */
53
144
  export interface Declaration {
54
145
  readonly _tag: "Declaration"
146
+ readonly representation?: RepresentationAnnotation | undefined
55
147
  readonly annotations?: Schema.Annotations.Annotations | undefined
56
148
  readonly typeParameters: ReadonlyArray<Representation>
57
- readonly checks: ReadonlyArray<Check<DeclarationMeta>>
58
- readonly encodedSchema: Representation
149
+ readonly checks: ReadonlyArray<Check>
59
150
  }
60
151
 
61
152
  /**
62
- * A lazily resolved representation used for recursive schemas.
63
- *
64
- * **Details**
65
- *
66
- * `thunk` points to the actual representation, possibly via a
67
- * {@link Reference}. `checks` is always empty on `Suspend` nodes.
68
- *
69
- * @see {@link Reference}
153
+ * A lazily resolved representation.
70
154
  *
71
155
  * @category models
72
156
  * @since 4.0.0
@@ -79,25 +163,7 @@ export interface Suspend {
79
163
  }
80
164
 
81
165
  /**
82
- * A named reference to a definition in the {@link References} map.
83
- *
84
- * **When to use**
85
- *
86
- * Use when a representation should point to a named definition instead of
87
- * embedding the definition inline.
88
- *
89
- * **Details**
90
- *
91
- * `$ref` is the key into `Document.references` or `MultiDocument.references`.
92
- * References are resolved lazily by {@link toSchema} and
93
- * {@link toCodeDocument}.
94
- *
95
- * **Gotchas**
96
- *
97
- * Resolution throws at runtime if the key is not found in the references map.
98
- *
99
- * @see {@link References}
100
- * @see {@link Document}
166
+ * A named reference.
101
167
  *
102
168
  * @category models
103
169
  * @since 4.0.0
@@ -107,244 +173,152 @@ export interface Reference {
107
173
  readonly $ref: string
108
174
  }
109
175
 
110
- /**
111
- * The `null` type.
112
- *
113
- * @category models
114
- * @since 4.0.0
115
- */
116
- export interface Null {
117
- readonly _tag: "Null"
176
+ interface Keyword<Tag extends string> {
177
+ readonly _tag: Tag
118
178
  readonly annotations?: Schema.Annotations.Annotations | undefined
179
+ readonly checks: ReadonlyArray<Check>
119
180
  }
120
181
 
121
182
  /**
122
- * The `undefined` type.
183
+ * The null keyword representation.
123
184
  *
124
185
  * @category models
125
186
  * @since 4.0.0
126
187
  */
127
- export interface Undefined {
128
- readonly _tag: "Undefined"
129
- readonly annotations?: Schema.Annotations.Annotations | undefined
130
- }
131
-
188
+ export interface Null extends Keyword<"Null"> {}
132
189
  /**
133
- * The `void` type.
190
+ * The undefined keyword representation.
134
191
  *
135
192
  * @category models
136
193
  * @since 4.0.0
137
194
  */
138
- export interface Void {
139
- readonly _tag: "Void"
140
- readonly annotations?: Schema.Annotations.Annotations | undefined
141
- }
142
-
195
+ export interface Undefined extends Keyword<"Undefined"> {}
143
196
  /**
144
- * The `never` type (no valid values).
197
+ * The void keyword representation.
145
198
  *
146
199
  * @category models
147
200
  * @since 4.0.0
148
201
  */
149
- export interface Never {
150
- readonly _tag: "Never"
151
- readonly annotations?: Schema.Annotations.Annotations | undefined
152
- }
153
-
202
+ export interface Void extends Keyword<"Void"> {}
154
203
  /**
155
- * The `unknown` type (any value accepted).
204
+ * The never keyword representation.
156
205
  *
157
206
  * @category models
158
207
  * @since 4.0.0
159
208
  */
160
- export interface Unknown {
161
- readonly _tag: "Unknown"
162
- readonly annotations?: Schema.Annotations.Annotations | undefined
163
- }
164
-
209
+ export interface Never extends Keyword<"Never"> {}
165
210
  /**
166
- * The `any` type.
211
+ * The unknown keyword representation.
167
212
  *
168
213
  * @category models
169
214
  * @since 4.0.0
170
215
  */
171
- export interface Any {
172
- readonly _tag: "Any"
173
- readonly annotations?: Schema.Annotations.Annotations | undefined
174
- }
175
-
216
+ export interface Unknown extends Keyword<"Unknown"> {}
176
217
  /**
177
- * The `string` type with optional validation checks.
178
- *
179
- * **Details**
180
- *
181
- * `checks` holds string-specific constraints, such as min/max length, pattern,
182
- * and UUID checks. `contentMediaType` and `contentSchema` indicate that the
183
- * string contains encoded data, such as `"application/json"` with a nested
184
- * schema.
185
- *
186
- * @see {@link StringMeta}
187
- * @see {@link Check}
218
+ * The any keyword representation.
188
219
  *
189
220
  * @category models
190
221
  * @since 4.0.0
191
222
  */
192
- export interface String {
193
- readonly _tag: "String"
194
- readonly annotations?: Schema.Annotations.Annotations | undefined
195
- readonly checks: ReadonlyArray<Check<StringMeta>>
196
- readonly contentMediaType?: string | undefined
197
- readonly contentSchema?: Representation | undefined
198
- }
223
+ export interface Any extends Keyword<"Any"> {}
199
224
 
200
225
  /**
201
- * The `number` type with optional validation checks.
202
- *
203
- * **Details**
204
- *
205
- * `checks` holds number-specific constraints, such as int, finite, min, max,
206
- * multipleOf, and between checks.
207
- *
208
- * @see {@link NumberMeta}
226
+ * A string representation.
209
227
  *
210
228
  * @category models
211
229
  * @since 4.0.0
212
230
  */
213
- export interface Number {
214
- readonly _tag: "Number"
215
- readonly annotations?: Schema.Annotations.Annotations | undefined
216
- readonly checks: ReadonlyArray<Check<NumberMeta>>
217
- }
231
+ export interface String extends Keyword<"String"> {}
218
232
 
219
233
  /**
220
- * The `boolean` type.
234
+ * A number representation.
221
235
  *
222
236
  * @category models
223
237
  * @since 4.0.0
224
238
  */
225
- export interface Boolean {
226
- readonly _tag: "Boolean"
227
- readonly annotations?: Schema.Annotations.Annotations | undefined
228
- }
229
-
239
+ export interface Number extends Keyword<"Number"> {}
230
240
  /**
231
- * The `bigint` type with optional validation checks.
232
- *
233
- * @see {@link BigIntMeta}
241
+ * A boolean representation.
234
242
  *
235
243
  * @category models
236
244
  * @since 4.0.0
237
245
  */
238
- export interface BigInt {
239
- readonly _tag: "BigInt"
240
- readonly annotations?: Schema.Annotations.Annotations | undefined
241
- readonly checks: ReadonlyArray<Check<BigIntMeta>>
242
- }
243
-
246
+ export interface Boolean extends Keyword<"Boolean"> {}
244
247
  /**
245
- * The `symbol` type.
248
+ * A bigint representation.
246
249
  *
247
250
  * @category models
248
251
  * @since 4.0.0
249
252
  */
250
- export interface Symbol {
251
- readonly _tag: "Symbol"
252
- readonly annotations?: Schema.Annotations.Annotations | undefined
253
- }
254
-
253
+ export interface BigInt extends Keyword<"BigInt"> {}
255
254
  /**
256
- * A specific literal value (`string`, `number`, `boolean`, or `bigint`).
255
+ * A symbol representation.
257
256
  *
258
257
  * @category models
259
258
  * @since 4.0.0
260
259
  */
261
- export interface Literal {
262
- readonly _tag: "Literal"
263
- readonly annotations?: Schema.Annotations.Annotations | undefined
264
- readonly literal: string | number | boolean | bigint
265
- }
260
+ export interface Symbol extends Keyword<"Symbol"> {}
266
261
 
267
262
  /**
268
- * A specific unique `symbol` value.
263
+ * A literal representation.
264
+ *
265
+ * **Details**
266
+ *
267
+ * The live representation stores the native literal value. Persistent codecs
268
+ * add an explicit type discriminator when encoding it.
269
269
  *
270
270
  * @category models
271
271
  * @since 4.0.0
272
272
  */
273
- export interface UniqueSymbol {
274
- readonly _tag: "UniqueSymbol"
275
- readonly annotations?: Schema.Annotations.Annotations | undefined
276
- readonly symbol: symbol
273
+ export interface Literal extends Keyword<"Literal"> {
274
+ readonly literal: SchemaAST.LiteralValue
277
275
  }
278
276
 
279
277
  /**
280
- * The `object` keyword type (matches any non-primitive).
278
+ * A unique global symbol representation.
281
279
  *
282
280
  * @category models
283
281
  * @since 4.0.0
284
282
  */
285
- export interface ObjectKeyword {
286
- readonly _tag: "ObjectKeyword"
287
- readonly annotations?: Schema.Annotations.Annotations | undefined
283
+ export interface UniqueSymbol extends Keyword<"UniqueSymbol"> {
284
+ readonly symbol: symbol
288
285
  }
289
286
 
290
287
  /**
291
- * A TypeScript-style enum. Each entry is a `[name, value]` pair.
288
+ * The object keyword representation.
292
289
  *
293
290
  * @category models
294
291
  * @since 4.0.0
295
292
  */
296
- export interface Enum {
297
- readonly _tag: "Enum"
298
- readonly annotations?: Schema.Annotations.Annotations | undefined
299
- readonly enums: ReadonlyArray<readonly [string, string | number]>
300
- }
293
+ export interface ObjectKeyword extends Keyword<"ObjectKeyword"> {}
301
294
 
302
295
  /**
303
- * A template literal type composed of a sequence of parts (literals, strings,
304
- * numbers, etc.).
296
+ * An enum representation.
297
+ *
298
+ * **Details**
299
+ *
300
+ * Enum members are stored as native string or number values. Persistent
301
+ * codecs add an explicit type discriminator when encoding them.
305
302
  *
306
303
  * @category models
307
304
  * @since 4.0.0
308
305
  */
309
- export interface TemplateLiteral {
310
- readonly _tag: "TemplateLiteral"
311
- readonly annotations?: Schema.Annotations.Annotations | undefined
312
- readonly parts: ReadonlyArray<Representation>
306
+ export interface Enum extends Keyword<"Enum"> {
307
+ readonly enums: ReadonlyArray<readonly [string, string | number]>
313
308
  }
314
309
 
315
310
  /**
316
- * An array or tuple type.
317
- *
318
- * **Details**
319
- *
320
- * `elements` are the fixed positional elements, or tuple prefix, and each may
321
- * be optional. `rest` contains the variadic tail types; a single-element
322
- * `rest` with no `elements` produces a plain `Array<T>`. `checks` holds
323
- * array-specific constraints, such as minLength, maxLength, and unique checks.
324
- *
325
- * @see {@link Element}
326
- * @see {@link ArraysMeta}
311
+ * A template literal representation.
327
312
  *
328
313
  * @category models
329
314
  * @since 4.0.0
330
315
  */
331
- export interface Arrays {
332
- readonly _tag: "Arrays"
333
- readonly annotations?: Schema.Annotations.Annotations | undefined
334
- readonly elements: ReadonlyArray<Element>
335
- readonly rest: ReadonlyArray<Representation>
336
- readonly checks: ReadonlyArray<Check<ArraysMeta>>
316
+ export interface TemplateLiteral extends Keyword<"TemplateLiteral"> {
317
+ readonly parts: ReadonlyArray<Representation>
337
318
  }
338
319
 
339
320
  /**
340
- * A positional element within an {@link Arrays} tuple.
341
- *
342
- * **Details**
343
- *
344
- * `isOptional` indicates whether this element can be absent. `type` is the
345
- * schema representation for this element's value.
346
- *
347
- * @see {@link Arrays}
321
+ * A tuple element.
348
322
  *
349
323
  * @category models
350
324
  * @since 4.0.0
@@ -356,39 +330,28 @@ export interface Element {
356
330
  }
357
331
 
358
332
  /**
359
- * An object/struct type with named properties and optional index signatures.
360
- *
361
- * **Details**
362
- *
363
- * `propertySignatures` are the explicitly named fields. `indexSignatures`
364
- * define catch-all key/value types, such as `Record<string, T>`. `checks`
365
- * holds object-specific constraints, such as minProperties and maxProperties.
366
- *
367
- * @see {@link PropertySignature}
368
- * @see {@link IndexSignature}
369
- * @see {@link ObjectsMeta}
333
+ * An array or tuple representation.
370
334
  *
371
335
  * @category models
372
336
  * @since 4.0.0
373
337
  */
374
- export interface Objects {
375
- readonly _tag: "Objects"
376
- readonly annotations?: Schema.Annotations.Annotations | undefined
377
- readonly propertySignatures: ReadonlyArray<PropertySignature>
378
- readonly indexSignatures: ReadonlyArray<IndexSignature>
379
- readonly checks: ReadonlyArray<Check<ObjectsMeta>>
338
+ export interface Arrays extends Keyword<"Arrays"> {
339
+ readonly elements: ReadonlyArray<Element>
340
+ readonly rest: ReadonlyArray<Representation>
380
341
  }
381
342
 
382
343
  /**
383
- * A named property within an {@link Objects} representation.
344
+ * A property signature.
384
345
  *
385
346
  * **Details**
386
347
  *
387
- * `name` is the property key, which can be a string, number, or symbol.
388
- * `isOptional` indicates whether the key can be absent. `isMutable` indicates
389
- * whether the property is mutable rather than readonly.
348
+ * The live representation stores the native property key. Persistent codecs
349
+ * add an explicit type discriminator when encoding it.
350
+ *
351
+ * **Gotchas**
390
352
  *
391
- * @see {@link Objects}
353
+ * Local symbols can be represented while the schema is live, but persistent
354
+ * codecs reject them because they cannot be reconstructed by identity.
392
355
  *
393
356
  * @category models
394
357
  * @since 4.0.0
@@ -402,15 +365,7 @@ export interface PropertySignature {
402
365
  }
403
366
 
404
367
  /**
405
- * An index signature, such as `[key: string]: number`, within an
406
- * {@link Objects}.
407
- *
408
- * **Details**
409
- *
410
- * `parameter` is the key type representation. `type` is the value type
411
- * representation.
412
- *
413
- * @see {@link Objects}
368
+ * An index signature.
414
369
  *
415
370
  * @category models
416
371
  * @since 4.0.0
@@ -421,34 +376,29 @@ export interface IndexSignature {
421
376
  }
422
377
 
423
378
  /**
424
- * A union of multiple representations.
425
- *
426
- * **Details**
379
+ * An object representation.
427
380
  *
428
- * `types` are the union members. `mode` controls JSON Schema output as either
429
- * `"anyOf"` (the default) or mutually exclusive `"oneOf"`.
381
+ * @category models
382
+ * @since 4.0.0
383
+ */
384
+ export interface Objects extends Keyword<"Objects"> {
385
+ readonly propertySignatures: ReadonlyArray<PropertySignature>
386
+ readonly indexSignatures: ReadonlyArray<IndexSignature>
387
+ }
388
+
389
+ /**
390
+ * A union representation.
430
391
  *
431
392
  * @category models
432
393
  * @since 4.0.0
433
394
  */
434
- export interface Union {
435
- readonly _tag: "Union"
436
- readonly annotations?: Schema.Annotations.Annotations | undefined
395
+ export interface Union extends Keyword<"Union"> {
437
396
  readonly types: ReadonlyArray<Representation>
438
397
  readonly mode: "anyOf" | "oneOf"
439
398
  }
440
399
 
441
400
  /**
442
- * The core tagged union of all supported schema shapes.
443
- *
444
- * **Details**
445
- *
446
- * Each variant has a `_tag` discriminator. Switch on `_tag` to handle each
447
- * shape. Most variants carry optional `annotations` and some carry `checks`
448
- * for validation constraints.
449
- *
450
- * @see {@link Document}
451
- * @see {@link fromAST}
401
+ * The structural schema representation.
452
402
  *
453
403
  * @category models
454
404
  * @since 4.0.0
@@ -478,3430 +428,798 @@ export type Representation =
478
428
  | Union
479
429
 
480
430
  /**
481
- * A validation constraint attached to a type. Either a single {@link Filter}
482
- * or a {@link FilterGroup} combining multiple checks.
483
- *
484
- * @see {@link Filter}
485
- * @see {@link FilterGroup}
431
+ * A structural check.
486
432
  *
487
433
  * @category models
488
434
  * @since 4.0.0
489
435
  */
490
- export type Check<M> = Filter<M> | FilterGroup<M>
436
+ export type Check = Filter | FilterGroup
491
437
 
492
438
  /**
493
- * A single validation constraint with typed metadata describing the check
494
- * (e.g. `{ _tag: "isMinLength", minLength: 3 }`).
495
- *
496
- * @see {@link Check}
439
+ * An opaque leaf check.
497
440
  *
498
441
  * @category models
499
442
  * @since 4.0.0
500
443
  */
501
- export interface Filter<M> {
444
+ export interface Filter {
502
445
  readonly _tag: "Filter"
503
- readonly annotations?: Schema.Annotations.Filter | undefined
504
- readonly meta: M
446
+ readonly representation?: CheckRepresentationAnnotation<Representation> | undefined
447
+ readonly annotations?: Schema.Annotations.Annotations | undefined
448
+ readonly aborted: boolean
505
449
  }
506
450
 
507
451
  /**
508
- * A group of validation constraints that are logically combined. Contains
509
- * at least one {@link Check}.
510
- *
511
- * @see {@link Check}
452
+ * A non-empty group of checks.
512
453
  *
513
454
  * @category models
514
455
  * @since 4.0.0
515
456
  */
516
- export interface FilterGroup<M> {
457
+ export interface FilterGroup {
517
458
  readonly _tag: "FilterGroup"
518
- readonly annotations?: Schema.Annotations.Filter | undefined
519
- readonly checks: readonly [Check<M>, ...Array<Check<M>>]
459
+ readonly representation?: CheckRepresentationAnnotation<Representation> | undefined
460
+ readonly annotations?: Schema.Annotations.Annotations | undefined
461
+ readonly checks: readonly [Check, ...Array<Check>]
520
462
  }
521
463
 
522
464
  /**
523
- * Metadata union for string-specific validation checks (minLength, maxLength,
524
- * pattern, UUID, trimmed, etc.).
525
- *
526
- * @see {@link String}
527
- * @see {@link Check}
528
- *
529
- * @category models
530
- * @since 4.0.0
531
- */
532
- export type StringMeta = Schema.Annotations.BuiltInMetaDefinitions[
533
- | "isStringFinite"
534
- | "isStringBigInt"
535
- | "isStringSymbol"
536
- | "isMinLength"
537
- | "isMaxLength"
538
- | "isPattern"
539
- | "isLengthBetween"
540
- | "isTrimmed"
541
- | "isUUID"
542
- | "isGUID"
543
- | "isULID"
544
- | "isBase64"
545
- | "isBase64Url"
546
- | "isStartsWith"
547
- | "isEndsWith"
548
- | "isIncludes"
549
- | "isUppercased"
550
- | "isLowercased"
551
- | "isCapitalized"
552
- | "isUncapitalized"
553
- ]
554
-
555
- /**
556
- * Metadata union for number-specific validation checks (int, finite,
557
- * min, max, multipleOf, between).
558
- *
559
- * @see {@link Number}
560
- * @see {@link Check}
465
+ * Named representation definitions.
561
466
  *
562
467
  * @category models
563
468
  * @since 4.0.0
564
469
  */
565
- export type NumberMeta = Schema.Annotations.BuiltInMetaDefinitions[
566
- | "isInt"
567
- | "isFinite"
568
- | "isMultipleOf"
569
- | "isGreaterThanOrEqualTo"
570
- | "isLessThanOrEqualTo"
571
- | "isGreaterThan"
572
- | "isLessThan"
573
- | "isBetween"
574
- ]
470
+ export interface References {
471
+ readonly [$ref: string]: Representation
472
+ }
575
473
 
576
474
  /**
577
- * Metadata union for bigint-specific validation checks (min, max, between).
578
- *
579
- * @see {@link BigInt}
580
- * @see {@link Check}
475
+ * A single representation and its definitions.
581
476
  *
582
477
  * @category models
583
478
  * @since 4.0.0
584
479
  */
585
- export type BigIntMeta = Schema.Annotations.BuiltInMetaDefinitions[
586
- | "isGreaterThanOrEqualToBigInt"
587
- | "isLessThanOrEqualToBigInt"
588
- | "isGreaterThanBigInt"
589
- | "isLessThanBigInt"
590
- | "isBetweenBigInt"
591
- ]
480
+ export interface Document {
481
+ readonly representation: Representation
482
+ readonly references: References
483
+ }
592
484
 
593
485
  /**
594
- * Metadata union for array-specific validation checks (minLength, maxLength,
595
- * length, unique).
596
- *
597
- * @see {@link Arrays}
598
- * @see {@link Check}
486
+ * Multiple representations sharing definitions.
599
487
  *
600
488
  * @category models
601
489
  * @since 4.0.0
602
490
  */
603
- export type ArraysMeta = Schema.Annotations.BuiltInMetaDefinitions[
604
- | "isMinLength"
605
- | "isMaxLength"
606
- | "isLengthBetween"
607
- | "isUnique"
608
- ]
491
+ export interface MultiDocument {
492
+ readonly representations: readonly [Representation, ...Array<Representation>]
493
+ readonly references: References
494
+ }
609
495
 
610
496
  /**
611
- * Metadata union for object-specific validation checks (minProperties,
612
- * maxProperties, propertiesLength, propertyNames).
613
- *
614
- * @see {@link Objects}
615
- * @see {@link Check}
497
+ * Reviver for a declaration.
616
498
  *
617
499
  * @category models
618
500
  * @since 4.0.0
619
501
  */
620
- export type ObjectsMeta =
621
- | Schema.Annotations.BuiltInMetaDefinitions[
622
- | "isMinProperties"
623
- | "isMaxProperties"
624
- | "isPropertiesLengthBetween"
625
- ]
626
- | { readonly _tag: "isPropertyNames"; readonly propertyNames: Representation }
502
+ export interface DeclarationReviver<P> {
503
+ readonly id: string
504
+ readonly payloadSchema: Schema.Decoder<P>
505
+ readonly revive: (input: {
506
+ readonly payload: P
507
+ readonly typeParameters: ReadonlyArray<Schema.Top>
508
+ readonly annotations: Schema.Annotations.Annotations | undefined
509
+ }) => Schema.Top
510
+ }
627
511
 
628
512
  /**
629
- * Metadata union for Date-specific validation checks (valid, min, max, between).
630
- *
631
- * @see {@link Declaration}
632
- * @see {@link DeclarationMeta}
513
+ * Reviver for a leaf check.
633
514
  *
634
515
  * @category models
635
516
  * @since 4.0.0
636
517
  */
637
- export type DateMeta = Schema.Annotations.BuiltInMetaDefinitions[
638
- | "isDateValid"
639
- | "isGreaterThanDate"
640
- | "isGreaterThanOrEqualToDate"
641
- | "isLessThanDate"
642
- | "isLessThanOrEqualToDate"
643
- | "isBetweenDate"
644
- ]
518
+ export interface FilterReviver<P> {
519
+ readonly id: string
520
+ readonly payloadSchema: Schema.Decoder<P>
521
+ readonly revive: (input: {
522
+ readonly payload: P
523
+ readonly schemas: ReadonlyArray<Schema.Top>
524
+ readonly annotations: Schema.Annotations.Filter | undefined
525
+ }) => SchemaAST.Filter<any>
526
+ }
645
527
 
646
528
  /**
647
- * Metadata union for size-based validation checks (minSize, maxSize, size).
648
- * Used for collection types like `Set`, `Map`.
649
- *
650
- * @see {@link Declaration}
651
- * @see {@link DeclarationMeta}
529
+ * Reviver for a check group.
652
530
  *
653
531
  * @category models
654
532
  * @since 4.0.0
655
533
  */
656
- export type SizeMeta = Schema.Annotations.BuiltInMetaDefinitions[
657
- | "isMinSize"
658
- | "isMaxSize"
659
- | "isSizeBetween"
660
- ]
534
+ export interface FilterGroupReviver<P> {
535
+ readonly id: string
536
+ readonly payloadSchema: Schema.Decoder<P>
537
+ readonly revive: (input: {
538
+ readonly payload: P
539
+ readonly schemas: ReadonlyArray<Schema.Top>
540
+ readonly annotations: Schema.Annotations.Filter | undefined
541
+ }) => SchemaAST.FilterGroup<any>
542
+ }
661
543
 
662
544
  /**
663
- * Metadata union for {@link Declaration} checks — either {@link DateMeta}
664
- * or {@link SizeMeta}.
545
+ * A check reviver.
665
546
  *
666
547
  * @category models
667
548
  * @since 4.0.0
668
549
  */
669
- export type DeclarationMeta = DateMeta | SizeMeta
670
-
671
- /** @internal */
672
- export type Meta = StringMeta | NumberMeta | BigIntMeta | ArraysMeta | ObjectsMeta | DeclarationMeta
550
+ export type CheckReviver<P> = FilterReviver<P> | FilterGroupReviver<P>
673
551
 
674
552
  /**
675
- * A string-keyed map of named {@link Representation} definitions. Used by
676
- * {@link Document} and {@link MultiDocument} for `$ref` resolution (analogous
677
- * to JSON Schema `$defs`).
678
- *
679
- * @see {@link Reference}
680
- * @see {@link Document}
553
+ * A typed reviver.
681
554
  *
682
555
  * @category models
683
556
  * @since 4.0.0
684
557
  */
685
- export interface References {
686
- readonly [$ref: string]: Representation
687
- }
558
+ export type Reviver<P> = DeclarationReviver<P> | CheckReviver<P>
688
559
 
689
560
  /**
690
- * A single {@link Representation} together with its named {@link References}.
691
- *
692
- * **When to use**
693
- *
694
- * Use when representing a single Schema AST together with its named references
695
- * before reconstructing a runtime Schema, converting to JSON Schema, or
696
- * wrapping it as a {@link MultiDocument}.
697
- *
698
- * @see {@link MultiDocument}
699
- * @see {@link fromAST}
561
+ * A reviver erased only at collection boundaries.
700
562
  *
701
563
  * @category models
702
564
  * @since 4.0.0
703
565
  */
704
- export type Document = {
705
- readonly representation: Representation
706
- readonly references: References
707
- }
566
+ export type AnyReviver = Reviver<any>
708
567
 
709
568
  /**
710
- * One or more {@link Representation}s sharing a common {@link References} map.
711
- *
712
- * **When to use**
713
- *
714
- * Use when you use {@link fromASTs} to create this from multiple Schema ASTs,
715
- * {@link toCodeDocument} to generate TypeScript code, and
716
- * {@link toJsonSchemaMultiDocument} to convert to JSON Schema.
569
+ * Creates a declaration reviver while inferring its payload type from `payloadSchema`.
717
570
  *
718
- * @see {@link Document}
719
- * @see {@link fromASTs}
720
- *
721
- * @category models
571
+ * @category constructors
722
572
  * @since 4.0.0
723
573
  */
724
- export type MultiDocument = {
725
- readonly representations: readonly [Representation, ...Array<Representation>]
726
- readonly references: References
727
- }
728
-
729
- // -----------------------------------------------------------------------------
730
- // schemas
731
- // -----------------------------------------------------------------------------
732
-
733
- const Representation$ref = Schema.suspend(() => $Representation)
734
-
735
- const toJsonAnnotationsBlacklist: Set<string> = new Set([
736
- ...InternalRepresentation.fromASTBlacklist,
737
- "expected",
738
- "contentMediaType",
739
- "contentSchema"
740
- ])
574
+ export const makeDeclarationReviver: <P>(
575
+ id: string,
576
+ payloadSchema: Schema.Decoder<P>,
577
+ revive: DeclarationReviver<P>["revive"]
578
+ ) => DeclarationReviver<P> = InternalSchema.makeDeclarationReviver
741
579
 
742
580
  /**
743
- * A tree of primitive values used to serialize annotations to JSON.
581
+ * Creates a filter reviver while inferring its payload type from `payloadSchema`.
744
582
  *
745
- * @category Tree
583
+ * @category constructors
746
584
  * @since 4.0.0
747
585
  */
748
- export type PrimitiveTree = Schema.Tree<null | number | boolean | bigint | symbol | string>
586
+ export const makeFilterReviver: <P>(
587
+ id: string,
588
+ payloadSchema: Schema.Decoder<P>,
589
+ revive: FilterReviver<P>["revive"]
590
+ ) => FilterReviver<P> = InternalSchema.makeFilterReviver
749
591
 
750
592
  /**
751
- * Schema for {@link PrimitiveTree}.
752
- *
753
- * **When to use**
754
- *
755
- * Use to validate recursive annotation metadata trees whose leaves are `null`,
756
- * `number`, `boolean`, `bigint`, `symbol`, or `string`.
593
+ * Creates a filter group reviver while inferring its payload type from `payloadSchema`.
757
594
  *
758
- * @see {@link PrimitiveTree} for the recursive tree type accepted by this codec
759
- * @see {@link $Annotations} for the annotation codec that filters values through this codec
760
- *
761
- * @category schemas
595
+ * @category constructors
762
596
  * @since 4.0.0
763
597
  */
764
- export const $PrimitiveTree: Schema.Codec<PrimitiveTree> = Schema.Tree(
765
- Schema.Union([
766
- Schema.Null,
767
- Schema.Number, // allows NaN, Infinity, -Infinity
768
- Schema.Boolean,
769
- Schema.BigInt,
770
- Schema.Symbol,
771
- Schema.String
772
- ])
773
- )
774
-
775
- const isPrimitiveTree = Schema.is($PrimitiveTree)
598
+ export const makeFilterGroupReviver: <P>(
599
+ id: string,
600
+ payloadSchema: Schema.Decoder<P>,
601
+ revive: FilterGroupReviver<P>["revive"]
602
+ ) => FilterGroupReviver<P> = InternalSchema.makeFilterGroupReviver
776
603
 
777
604
  /**
778
- * Schema for serializing public `Schema.Annotations.Annotations` values. It
779
- * filters out internal annotation keys and non-primitive values during
780
- * encoding.
605
+ * Options for importing JSON Schema Draft 2020-12 documents.
781
606
  *
782
607
  * **When to use**
783
608
  *
784
- * Use to serialize schema annotations in representation schemas while retaining
785
- * only primitive-tree metadata.
609
+ * Use when you need to configure pattern handling or transform each JSON Schema node before translation.
786
610
  *
787
611
  * **Details**
788
612
  *
789
- * Decoding is passthrough. Encoding removes internal annotation keys and values
790
- * that are not accepted by `$PrimitiveTree`.
613
+ * `patterns` controls pattern constraints reached during best-effort translation, including `pattern`, the keys of
614
+ * `patternProperties`, and patterns nested in `propertyNames`:
615
+ *
616
+ * - `"error"` rejects the document and is the default.
617
+ * - `"ignore"` skips the constraint.
618
+ * - `"apply"` compiles and enforces the constraint with the runtime's native regular expression engine.
619
+ *
620
+ * **Gotchas**
791
621
  *
792
- * @see {@link $PrimitiveTree} for the codec used to filter annotation values
622
+ * Use `patterns: "apply"` only for trusted documents because regular expression evaluation may block for an unbounded
623
+ * amount of time. `patterns: "ignore"` weakens validation by accepting values that the source document may reject.
624
+ * Ignoring `patternProperties` also skips its value constraints and `additionalProperties`, because matching keys cannot
625
+ * be determined without evaluating the patterns.
626
+ * `onEnter` must return a JSON Schema object. Its result is used directly, and exceptions raised by the callback pass
627
+ * through unchanged.
793
628
  *
794
- * @category schemas
629
+ * @category models
795
630
  * @since 4.0.0
796
631
  */
797
- export const $Annotations = Schema.Record(Schema.String, Schema.Unknown).pipe(
798
- Schema.encodeTo(Schema.Record(Schema.String, $PrimitiveTree), {
799
- decode: SchemaGetter.passthrough(),
800
- encode: SchemaGetter.transformOptional(Option.flatMap((r) => {
801
- const out: Record<string, typeof $PrimitiveTree["Type"]> = {}
802
- for (const [k, v] of Object.entries(r)) {
803
- if (!toJsonAnnotationsBlacklist.has(k) && isPrimitiveTree(v)) {
804
- out[k] = v
805
- }
806
- }
807
- return Rec.isEmptyRecord(out) ? Option.none() : Option.some(out)
808
- }))
809
- })
810
- ).annotate({ identifier: "Annotations" })
632
+ export interface FromJsonSchemaOptions {
633
+ readonly onEnter?: ((schema: JsonSchema.JsonSchema) => JsonSchema.JsonSchema) | undefined
634
+ /**
635
+ * Controls how reached JSON Schema regular expression patterns are imported.
636
+ *
637
+ * @default "error"
638
+ */
639
+ readonly patterns?: "error" | "ignore" | "apply" | undefined
640
+ }
811
641
 
812
642
  /**
813
- * Schema for the {@link Null} representation node.
643
+ * Runtime and TypeScript source generated for one schema.
814
644
  *
815
- * @category schemas
645
+ * @category models
816
646
  * @since 4.0.0
817
647
  */
818
- export const $Null = Schema.Struct({
819
- _tag: Schema.tag("Null"),
820
- annotations: Schema.optional($Annotations)
821
- }).annotate({ identifier: "Null" })
648
+ export interface Code {
649
+ readonly runtime: string
650
+ readonly Type: string
651
+ }
822
652
 
823
653
  /**
824
- * Schema for the {@link Undefined} representation node.
654
+ * Creates generated runtime and TypeScript source strings for a schema.
825
655
  *
826
- * @category schemas
656
+ * @category constructors
827
657
  * @since 4.0.0
828
658
  */
829
- export const $Undefined = Schema.Struct({
830
- _tag: Schema.tag("Undefined"),
831
- annotations: Schema.optional($Annotations)
832
- }).annotate({ identifier: "Undefined" })
659
+ export const makeCode: (runtime: string, Type: string) => Code = InternalToCodeDocument.makeCode
833
660
 
834
661
  /**
835
- * Schema for the {@link Void} representation node.
662
+ * Auxiliary source artifact emitted while generating schema code.
836
663
  *
837
- * @category schemas
664
+ * @category models
838
665
  * @since 4.0.0
839
666
  */
840
- export const $Void = Schema.Struct({
841
- _tag: Schema.tag("Void"),
842
- annotations: Schema.optional($Annotations)
843
- }).annotate({ identifier: "Void" })
667
+ export type Artifact =
668
+ | {
669
+ readonly _tag: "Symbol"
670
+ readonly identifier: string
671
+ readonly code: Code
672
+ }
673
+ | {
674
+ readonly _tag: "Enum"
675
+ readonly identifier: string
676
+ readonly code: Code
677
+ }
678
+ | {
679
+ readonly _tag: "Import"
680
+ readonly importDeclaration: string
681
+ }
844
682
 
845
683
  /**
846
- * Schema for the {@link Never} representation node.
684
+ * Generated schema code together with named references and auxiliary artifacts.
847
685
  *
848
- * @category schemas
686
+ * @category models
849
687
  * @since 4.0.0
850
688
  */
851
- export const $Never = Schema.Struct({
852
- _tag: Schema.tag("Never"),
853
- annotations: Schema.optional($Annotations)
854
- }).annotate({ identifier: "Never" })
689
+ export interface CodeDocument {
690
+ readonly codes: ReadonlyArray<Code>
691
+ readonly references: {
692
+ readonly nonRecursives: ReadonlyArray<{
693
+ readonly $ref: string
694
+ readonly code: Code
695
+ }>
696
+ readonly recursives: Readonly<Record<string, Code>>
697
+ }
698
+ readonly artifacts: ReadonlyArray<Artifact>
699
+ }
855
700
 
856
701
  /**
857
- * Schema for the {@link Unknown} representation node.
702
+ * Lowers the encoded side of an AST to a live representation document.
858
703
  *
859
- * @category schemas
860
- * @since 4.0.0
861
- */
862
- export const $Unknown = Schema.Struct({
863
- _tag: Schema.tag("Unknown"),
864
- annotations: Schema.optional($Annotations)
865
- }).annotate({ identifier: "Unknown" })
866
-
867
- /**
868
- * Schema for the {@link Any} representation node.
704
+ * **Details**
705
+ *
706
+ * Apply `SchemaAST.toType` to the AST first to lower its type side instead.
869
707
  *
870
- * @category schemas
708
+ * @category constructors
871
709
  * @since 4.0.0
872
710
  */
873
- export const $Any = Schema.Struct({
874
- _tag: Schema.tag("Any"),
875
- annotations: Schema.optional($Annotations)
876
- }).annotate({ identifier: "Any" })
877
-
878
- const $IsStringFinite = Schema.Struct({
879
- _tag: Schema.tag("isStringFinite"),
880
- regExp: Schema.RegExp
881
- }).annotate({ identifier: "IsStringFinite" })
882
-
883
- const $IsStringBigInt = Schema.Struct({
884
- _tag: Schema.tag("isStringBigInt"),
885
- regExp: Schema.RegExp
886
- }).annotate({ identifier: "IsStringBigInt" })
887
-
888
- const $IsStringSymbol = Schema.Struct({
889
- _tag: Schema.tag("isStringSymbol"),
890
- regExp: Schema.RegExp
891
- }).annotate({ identifier: "IsStringSymbol" })
892
-
893
- const $IsTrimmed = Schema.Struct({
894
- _tag: Schema.tag("isTrimmed"),
895
- regExp: Schema.RegExp
896
- }).annotate({ identifier: "IsTrimmed" })
897
-
898
- const $IsUUID = Schema.Struct({
899
- _tag: Schema.tag("isUUID"),
900
- regExp: Schema.RegExp,
901
- version: Schema.UndefinedOr(Schema.Literals([1, 2, 3, 4, 5, 6, 7, 8]))
902
- }).annotate({ identifier: "IsUUID" })
903
-
904
- const $IsGUID = Schema.Struct({
905
- _tag: Schema.tag("isGUID"),
906
- regExp: Schema.RegExp
907
- }).annotate({ identifier: "IsGUID" })
908
-
909
- const $IsULID = Schema.Struct({
910
- _tag: Schema.tag("isULID"),
911
- regExp: Schema.RegExp
912
- }).annotate({ identifier: "IsULID" })
913
-
914
- const $IsBase64 = Schema.Struct({
915
- _tag: Schema.tag("isBase64"),
916
- regExp: Schema.RegExp
917
- }).annotate({ identifier: "IsBase64" })
918
-
919
- const $IsBase64Url = Schema.Struct({
920
- _tag: Schema.tag("isBase64Url"),
921
- regExp: Schema.RegExp
922
- }).annotate({ identifier: "IsBase64Url" })
923
-
924
- const $IsStartsWith = Schema.Struct({
925
- _tag: Schema.tag("isStartsWith"),
926
- startsWith: Schema.String,
927
- regExp: Schema.RegExp
928
- }).annotate({ identifier: "IsStartsWith" })
929
-
930
- const $IsEndsWith = Schema.Struct({
931
- _tag: Schema.tag("isEndsWith"),
932
- endsWith: Schema.String,
933
- regExp: Schema.RegExp
934
- }).annotate({ identifier: "IsEndsWith" })
935
-
936
- const $IsIncludes = Schema.Struct({
937
- _tag: Schema.tag("isIncludes"),
938
- includes: Schema.String,
939
- regExp: Schema.RegExp
940
- }).annotate({ identifier: "IsIncludes" })
941
-
942
- const $IsUppercased = Schema.Struct({
943
- _tag: Schema.tag("isUppercased"),
944
- regExp: Schema.RegExp
945
- }).annotate({ identifier: "IsUppercased" })
946
-
947
- const $IsLowercased = Schema.Struct({
948
- _tag: Schema.tag("isLowercased"),
949
- regExp: Schema.RegExp
950
- }).annotate({ identifier: "IsLowercased" })
951
-
952
- const $IsCapitalized = Schema.Struct({
953
- _tag: Schema.tag("isCapitalized"),
954
- regExp: Schema.RegExp
955
- }).annotate({ identifier: "IsCapitalized" })
956
-
957
- const $IsUncapitalized = Schema.Struct({
958
- _tag: Schema.tag("isUncapitalized"),
959
- regExp: Schema.RegExp
960
- }).annotate({ identifier: "IsUncapitalized" })
961
-
962
- const NonNegativeInt = Schema.Int.check(Schema.isGreaterThanOrEqualTo(0))
963
-
964
- const $IsMinLength = Schema.Struct({
965
- _tag: Schema.tag("isMinLength"),
966
- minLength: NonNegativeInt
967
- }).annotate({ identifier: "IsMinLength" })
968
-
969
- const $IsMaxLength = Schema.Struct({
970
- _tag: Schema.tag("isMaxLength"),
971
- maxLength: NonNegativeInt
972
- }).annotate({ identifier: "IsMaxLength" })
973
-
974
- const $IsLengthBetween = Schema.Struct({
975
- _tag: Schema.tag("isLengthBetween"),
976
- minimum: NonNegativeInt,
977
- maximum: NonNegativeInt
978
- }).annotate({ identifier: "IsLengthBetween" })
979
-
980
- const $IsPattern = Schema.Struct({
981
- _tag: Schema.tag("isPattern"),
982
- regExp: Schema.RegExp
983
- }).annotate({ identifier: "IsPattern" })
984
-
985
- /**
986
- * Schema for {@link StringMeta}.
987
- *
988
- * @category schemas
989
- * @since 4.0.0
990
- */
991
- export const $StringMeta = Schema.Union([
992
- $IsStringFinite,
993
- $IsStringBigInt,
994
- $IsStringSymbol,
995
- $IsTrimmed,
996
- $IsUUID,
997
- $IsGUID,
998
- $IsULID,
999
- $IsBase64,
1000
- $IsBase64Url,
1001
- $IsStartsWith,
1002
- $IsEndsWith,
1003
- $IsIncludes,
1004
- $IsUppercased,
1005
- $IsLowercased,
1006
- $IsCapitalized,
1007
- $IsUncapitalized,
1008
- $IsMinLength,
1009
- $IsMaxLength,
1010
- $IsPattern,
1011
- $IsLengthBetween
1012
- ]).annotate({ identifier: "StringMeta" })
1013
-
1014
- function makeCheck<T>(meta: Schema.Codec<T>, identifier: string) {
1015
- const Check$ref = Schema.suspend(() => Check)
1016
- const Check: Schema.Codec<Check<T>> = Schema.Union([
1017
- Schema.Struct({
1018
- _tag: Schema.tag("Filter"),
1019
- annotations: Schema.optional($Annotations),
1020
- meta
1021
- }).annotate({ identifier: `${identifier}Filter` }),
1022
- Schema.Struct({
1023
- _tag: Schema.tag("FilterGroup"),
1024
- annotations: Schema.optional($Annotations),
1025
- checks: Schema.NonEmptyArray(Check$ref)
1026
- }).annotate({ identifier: `${identifier}FilterGroup` })
1027
- ]).annotate({ identifier: `${identifier}Check` })
1028
- return Check
711
+ export function toRepresentation(ast: SchemaAST.AST): Document {
712
+ return InternalToRepresentation.toRepresentation(ast)
1029
713
  }
1030
714
 
1031
715
  /**
1032
- * Schema for the {@link String} representation node.
716
+ * Lowers one or more AST encoded sides in a shared reference environment.
1033
717
  *
1034
- * @category schemas
1035
- * @since 4.0.0
1036
- */
1037
- export const $String = Schema.Struct({
1038
- _tag: Schema.tag("String"),
1039
- annotations: Schema.optional($Annotations),
1040
- checks: Schema.Array(makeCheck($StringMeta, "String")),
1041
- contentMediaType: Schema.optional(Schema.String),
1042
- contentSchema: Schema.optional(Representation$ref)
1043
- }).annotate({ identifier: "String" })
1044
-
1045
- const $IsInt = Schema.Struct({
1046
- _tag: Schema.tag("isInt")
1047
- }).annotate({ identifier: "IsInt" })
1048
-
1049
- const $IsMultipleOf = Schema.Struct({
1050
- _tag: Schema.tag("isMultipleOf"),
1051
- divisor: Schema.Finite
1052
- }).annotate({ identifier: "IsMultipleOf" })
1053
-
1054
- const $IsFinite = Schema.Struct({
1055
- _tag: Schema.tag("isFinite")
1056
- }).annotate({ identifier: "IsFinite" })
1057
-
1058
- const $IsGreaterThan = Schema.Struct({
1059
- _tag: Schema.tag("isGreaterThan"),
1060
- exclusiveMinimum: Schema.Finite
1061
- }).annotate({ identifier: "IsGreaterThan" })
1062
-
1063
- const $IsGreaterThanOrEqualTo = Schema.Struct({
1064
- _tag: Schema.tag("isGreaterThanOrEqualTo"),
1065
- minimum: Schema.Finite
1066
- }).annotate({ identifier: "IsGreaterThanOrEqualTo" })
1067
-
1068
- const $IsLessThan = Schema.Struct({
1069
- _tag: Schema.tag("isLessThan"),
1070
- exclusiveMaximum: Schema.Finite
1071
- }).annotate({ identifier: "IsLessThan" })
1072
-
1073
- const $IsLessThanOrEqualTo = Schema.Struct({
1074
- _tag: Schema.tag("isLessThanOrEqualTo"),
1075
- maximum: Schema.Finite
1076
- }).annotate({ identifier: "IsLessThanOrEqualTo" })
1077
-
1078
- const $IsBetween = Schema.Struct({
1079
- _tag: Schema.tag("isBetween"),
1080
- minimum: Schema.Finite,
1081
- maximum: Schema.Finite,
1082
- exclusiveMinimum: Schema.optional(Schema.Boolean),
1083
- exclusiveMaximum: Schema.optional(Schema.Boolean)
1084
- }).annotate({ identifier: "IsBetween" })
1085
-
1086
- /**
1087
- * Schema for {@link NumberMeta}.
718
+ * **Details**
1088
719
  *
1089
- * @category schemas
1090
- * @since 4.0.0
1091
- */
1092
- export const $NumberMeta = Schema.Union([
1093
- $IsInt,
1094
- $IsMultipleOf,
1095
- $IsFinite,
1096
- $IsGreaterThan,
1097
- $IsGreaterThanOrEqualTo,
1098
- $IsLessThan,
1099
- $IsLessThanOrEqualTo,
1100
- $IsBetween
1101
- ]).annotate({ identifier: "NumberMeta" })
1102
-
1103
- /**
1104
- * Schema for the {@link Number} representation node.
720
+ * Apply `SchemaAST.toType` to an AST first to lower its type side instead.
1105
721
  *
1106
- * @category schemas
722
+ * @category constructors
1107
723
  * @since 4.0.0
1108
724
  */
1109
- export const $Number = Schema.Struct({
1110
- _tag: Schema.tag("Number"),
1111
- annotations: Schema.optional($Annotations),
1112
- checks: Schema.Array(makeCheck($NumberMeta, "Number"))
1113
- }).annotate({ identifier: "Number" })
725
+ export function toRepresentations(
726
+ asts: readonly [SchemaAST.AST, ...Array<SchemaAST.AST>]
727
+ ): MultiDocument {
728
+ return InternalToRepresentation.toRepresentations(asts)
729
+ }
1114
730
 
1115
731
  /**
1116
- * Schema for the {@link Boolean} representation node.
732
+ * Wraps a single representation document as a multi-document with one root.
733
+ *
734
+ * **When to use**
1117
735
  *
1118
- * @category schemas
736
+ * Use when an API such as `toCodeDocument` requires a `MultiDocument`.
737
+ *
738
+ * @category transforming
1119
739
  * @since 4.0.0
1120
740
  */
1121
- export const $Boolean = Schema.Struct({
1122
- _tag: Schema.tag("Boolean"),
1123
- annotations: Schema.optional($Annotations)
1124
- }).annotate({ identifier: "Boolean" })
1125
-
1126
- const $IsGreaterThanBigInt = Schema.Struct({
1127
- _tag: Schema.tag("isGreaterThanBigInt"),
1128
- exclusiveMinimum: Schema.BigInt
1129
- }).annotate({ identifier: "IsGreaterThanBigInt" })
1130
-
1131
- const $IsGreaterThanOrEqualToBigInt = Schema.Struct({
1132
- _tag: Schema.tag("isGreaterThanOrEqualToBigInt"),
1133
- minimum: Schema.BigInt
1134
- }).annotate({ identifier: "IsGreaterThanOrEqualToBigInt" })
1135
-
1136
- const $IsLessThanBigInt = Schema.Struct({
1137
- _tag: Schema.tag("isLessThanBigInt"),
1138
- exclusiveMaximum: Schema.BigInt
1139
- }).annotate({ identifier: "IsLessThanBigInt" })
1140
-
1141
- const $IsLessThanOrEqualToBigInt = Schema.Struct({
1142
- _tag: Schema.tag("isLessThanOrEqualToBigInt"),
1143
- maximum: Schema.BigInt
1144
- }).annotate({ identifier: "IsLessThanOrEqualToBigInt" })
1145
-
1146
- const $IsBetweenBigInt = Schema.Struct({
1147
- _tag: Schema.tag("isBetweenBigInt"),
1148
- minimum: Schema.BigInt,
1149
- maximum: Schema.BigInt,
1150
- exclusiveMinimum: Schema.optional(Schema.Boolean),
1151
- exclusiveMaximum: Schema.optional(Schema.Boolean)
1152
- }).annotate({ identifier: "IsBetweenBigInt" })
1153
-
1154
- const $BigIntMeta = Schema.Union([
1155
- $IsGreaterThanBigInt,
1156
- $IsGreaterThanOrEqualToBigInt,
1157
- $IsLessThanBigInt,
1158
- $IsLessThanOrEqualToBigInt,
1159
- $IsBetweenBigInt
1160
- ]).annotate({ identifier: "BigIntMeta" })
741
+ export function toMultiDocument(document: Document): MultiDocument {
742
+ return {
743
+ representations: [document.representation],
744
+ references: document.references
745
+ }
746
+ }
1161
747
 
1162
748
  /**
1163
- * Schema for the {@link BigInt} representation node.
749
+ * Compiles a live representation document to JSON Schema Draft 2020-12.
1164
750
  *
1165
751
  * **When to use**
1166
752
  *
1167
- * Use to encode, decode, or validate serialized `BigInt` representation nodes,
1168
- * not application `bigint` values.
753
+ * Use when you need JSON Schema output from a representation whose checks carry compiler annotations.
1169
754
  *
1170
- * **Details**
755
+ * **Gotchas**
1171
756
  *
1172
- * Accepts representation nodes with `_tag: "BigInt"`, optional annotations,
1173
- * and bigint-specific validation metadata in `checks`.
757
+ * Opaque declarations are represented by an unconstrained JSON Schema. Check callback results are used directly, and
758
+ * exceptions raised by a callback pass through unchanged. Callbacks must treat their input schemas as immutable. Each
759
+ * returned value must be a valid JSON Schema object graph and must not be mutated after the callback returns. Local
760
+ * definition references returned by callbacks are resolved together with compiler-generated references.
1174
761
  *
1175
- * @see {@link BigIntMeta} for the metadata accepted by the `checks` array
762
+ * @see {@link toJsonSchemaMultiDocument} for multiple roots sharing definitions
1176
763
  *
1177
- * @category schemas
764
+ * @category transforming
1178
765
  * @since 4.0.0
1179
766
  */
1180
- export const $BigInt = Schema.Struct({
1181
- _tag: Schema.tag("BigInt"),
1182
- annotations: Schema.optional($Annotations),
1183
- checks: Schema.Array(makeCheck($BigIntMeta, "BigInt"))
1184
- }).annotate({ identifier: "BigInt" })
767
+ export function toJsonSchemaDocument(
768
+ document: Document,
769
+ options?: Schema.ToJsonSchemaOptions
770
+ ): JsonSchema.Document<"draft-2020-12"> {
771
+ return InternalToJsonSchemaDocument.toJsonSchemaDocument(document, options)
772
+ }
1185
773
 
1186
774
  /**
1187
- * Schema for the {@link Symbol} representation node.
775
+ * Compiles multiple live representations to a shared JSON Schema Draft 2020-12 document.
1188
776
  *
1189
- * @category schemas
1190
- * @since 4.0.0
1191
- */
1192
- export const $Symbol = Schema.Struct({
1193
- _tag: Schema.tag("Symbol"),
1194
- annotations: Schema.optional($Annotations)
1195
- }).annotate({ identifier: "Symbol" })
1196
-
1197
- /**
1198
- * Schema for the literal value types allowed in a {@link Literal} node
1199
- * (string, finite number, boolean, or bigint).
777
+ * **When to use**
1200
778
  *
1201
- * @category schemas
1202
- * @since 4.0.0
1203
- */
1204
- export const $LiteralValue = Schema.Union([
1205
- Schema.String,
1206
- Schema.Finite,
1207
- Schema.Boolean,
1208
- Schema.BigInt
1209
- ]).annotate({ identifier: "LiteralValue" })
1210
-
1211
- /**
1212
- * Schema for the {@link Literal} representation node.
779
+ * Use when several representation roots must share the same JSON Schema definitions.
1213
780
  *
1214
- * @category schemas
1215
- * @since 4.0.0
1216
- */
1217
- export const $Literal = Schema.Struct({
1218
- _tag: Schema.tag("Literal"),
1219
- annotations: Schema.optional($Annotations),
1220
- literal: $LiteralValue
1221
- }).annotate({ identifier: "Literal" })
1222
-
1223
- /**
1224
- * Schema for the {@link UniqueSymbol} representation node.
781
+ * **Gotchas**
1225
782
  *
1226
- * @category schemas
1227
- * @since 4.0.0
1228
- */
1229
- export const $UniqueSymbol = Schema.Struct({
1230
- _tag: Schema.tag("UniqueSymbol"),
1231
- annotations: Schema.optional($Annotations),
1232
- symbol: Schema.Symbol
1233
- }).annotate({ identifier: "UniqueSymbol" })
1234
-
1235
- /**
1236
- * Schema for the {@link ObjectKeyword} representation node.
783
+ * Every definition is compiled, including definitions that are not reachable from a root. Check callbacks must treat
784
+ * their input schemas as immutable. Each returned value must be a valid JSON Schema object graph and must not be
785
+ * mutated after the callback returns. Local definition references returned by callbacks are resolved together with
786
+ * compiler-generated references.
1237
787
  *
1238
- * @category schemas
1239
- * @since 4.0.0
1240
- */
1241
- export const $ObjectKeyword = Schema.Struct({
1242
- _tag: Schema.tag("ObjectKeyword"),
1243
- annotations: Schema.optional($Annotations)
1244
- }).annotate({ identifier: "ObjectKeyword" })
1245
-
1246
- /**
1247
- * Schema for the {@link Enum} representation node.
788
+ * @see {@link toJsonSchemaDocument} for a single root
1248
789
  *
1249
- * @category schemas
790
+ * @category transforming
1250
791
  * @since 4.0.0
1251
792
  */
1252
- export const $Enum = Schema.Struct({
1253
- _tag: Schema.tag("Enum"),
1254
- annotations: Schema.optional($Annotations),
1255
- enums: Schema.Array(
1256
- Schema.Tuple([
1257
- Schema.String,
1258
- Schema.Union([
1259
- Schema.String,
1260
- Schema.Number // NaN, Infinity, -Infinity are allowed enum values
1261
- ])
1262
- ])
1263
- )
1264
- }).annotate({ identifier: "Enum" })
793
+ export function toJsonSchemaMultiDocument(
794
+ document: MultiDocument,
795
+ options?: Schema.ToJsonSchemaOptions
796
+ ): JsonSchema.MultiDocument<"draft-2020-12"> {
797
+ return InternalToJsonSchemaDocument.toJsonSchemaMultiDocument(document, options)
798
+ }
1265
799
 
1266
800
  /**
1267
- * Schema for the {@link TemplateLiteral} representation node.
801
+ * Generates TypeScript source for live schema representations and their definitions.
1268
802
  *
1269
- * @category schemas
1270
- * @since 4.0.0
1271
- */
1272
- export const $TemplateLiteral = Schema.Struct({
1273
- _tag: Schema.tag("TemplateLiteral"),
1274
- annotations: Schema.optional($Annotations),
1275
- parts: Schema.Array(Representation$ref)
1276
- }).annotate({ identifier: "TemplateLiteral" })
1277
-
1278
- /**
1279
- * Schema for the {@link Element} type (positional tuple element).
803
+ * **When to use**
1280
804
  *
1281
- * @category schemas
1282
- * @since 4.0.0
1283
- */
1284
- export const $Element = Schema.Struct({
1285
- isOptional: Schema.Boolean,
1286
- type: Representation$ref,
1287
- annotations: Schema.optional($Annotations)
1288
- }).annotate({ identifier: "Element" })
1289
-
1290
- const $IsUnique = Schema.Struct({
1291
- _tag: Schema.tag("isUnique")
1292
- }).annotate({ identifier: "IsUnique" })
1293
-
1294
- const $ArraysMeta = Schema.Union([
1295
- $IsMinLength,
1296
- $IsMaxLength,
1297
- $IsLengthBetween,
1298
- $IsUnique
1299
- ]).annotate({ identifier: "ArraysMeta" })
1300
-
1301
- /**
1302
- * Schema for the {@link Arrays} representation node.
805
+ * Use when custom declarations and checks provide `toCode` callbacks and must be emitted without a central handler registry.
1303
806
  *
1304
- * @category schemas
1305
- * @since 4.0.0
1306
- */
1307
- export const $Arrays = Schema.Struct({
1308
- _tag: Schema.tag("Arrays"),
1309
- annotations: Schema.optional($Annotations),
1310
- elements: Schema.Array($Element),
1311
- rest: Schema.Array(Representation$ref),
1312
- checks: Schema.Array(makeCheck($ArraysMeta, "Arrays"))
1313
- }).annotate({ identifier: "Arrays" })
1314
-
1315
- /**
1316
- * Schema for the {@link PropertySignature} type.
807
+ * **Gotchas**
1317
808
  *
1318
- * @category schemas
1319
- * @since 4.0.0
1320
- */
1321
- export const $PropertySignature = Schema.Struct({
1322
- annotations: Schema.optional($Annotations),
1323
- name: Schema.PropertyKey,
1324
- type: Representation$ref,
1325
- isOptional: Schema.Boolean,
1326
- isMutable: Schema.Boolean
1327
- }).annotate({ identifier: "PropertySignature" })
1328
-
1329
- /**
1330
- * Schema for the {@link IndexSignature} type.
809
+ * Opaque declarations and leaf checks require `toCode` callbacks. Callback results are used directly, and exceptions raised by a callback pass through unchanged.
1331
810
  *
1332
- * @category schemas
811
+ * @category transforming
1333
812
  * @since 4.0.0
1334
813
  */
1335
- export const $IndexSignature = Schema.Struct({
1336
- parameter: Representation$ref,
1337
- type: Representation$ref
1338
- }).annotate({ identifier: "IndexSignature" })
814
+ export function toCodeDocument(document: MultiDocument): CodeDocument {
815
+ return InternalToCodeDocument.toCodeDocument(document)
816
+ }
1339
817
 
1340
- const $IsMinProperties = Schema.Struct({
1341
- _tag: Schema.tag("isMinProperties"),
1342
- minProperties: NonNegativeInt
1343
- }).annotate({ identifier: "IsMinProperties" })
818
+ const RepresentationSchema = Schema.suspend(
819
+ (): Schema.Codec<Representation, unknown> => RepresentationUnion
820
+ )
821
+ const RepresentationsSchema = Schema.Array(RepresentationSchema)
1344
822
 
1345
- const $IsMaxProperties = Schema.Struct({
1346
- _tag: Schema.tag("isMaxProperties"),
1347
- maxProperties: NonNegativeInt
1348
- }).annotate({ identifier: "IsMaxProperties" })
823
+ const RepresentationAnnotationSchema = Schema.Struct({
824
+ id: Schema.NonEmptyString,
825
+ payload: Schema.Json
826
+ })
1349
827
 
1350
- const $IsPropertiesLengthBetween = Schema.Struct({
1351
- _tag: Schema.tag("isPropertiesLengthBetween"),
1352
- minimum: NonNegativeInt,
1353
- maximum: NonNegativeInt
1354
- }).annotate({ identifier: "IsPropertiesLengthBetween" })
828
+ const CheckRepresentationAnnotationSchema = Schema.Struct({
829
+ ...RepresentationAnnotationSchema.fields,
830
+ schemas: Schema.optional(RepresentationsSchema)
831
+ })
1355
832
 
1356
- const $IsPropertyNames = Schema.Struct({
1357
- _tag: Schema.tag("isPropertyNames"),
1358
- propertyNames: Representation$ref
1359
- }).annotate({ identifier: "IsPropertyNames" })
833
+ const LiveAnnotationsSchema = Schema.Record(Schema.String, Schema.Unknown)
834
+ const JsonAnnotationsSchema = Schema.Record(Schema.String, Schema.Json)
1360
835
 
1361
- /**
1362
- * Schema for {@link ObjectsMeta}.
1363
- *
1364
- * @category schemas
1365
- * @since 4.0.0
1366
- */
1367
- export const $ObjectsMeta = Schema.Union([
1368
- $IsMinProperties,
1369
- $IsMaxProperties,
1370
- $IsPropertiesLengthBetween,
1371
- $IsPropertyNames
1372
- ]).annotate({ identifier: "ObjectsMeta" })
836
+ function pruneAnnotations(
837
+ annotations: Readonly<Record<string, unknown>>
838
+ ): Option.Option<Readonly<Record<string, Schema.Json>>> {
839
+ const out: Record<string, Schema.Json> = {}
840
+ for (const [key, value] of Object.entries(annotations)) {
841
+ if (SchemaAST.isJson(value)) {
842
+ InternalRecord.assignProperty(out, key, value)
843
+ }
844
+ }
845
+ return Object.keys(out).length === 0 ? Option.none() : Option.some(out)
846
+ }
1373
847
 
1374
- /**
1375
- * Schema for the {@link Objects} representation node.
1376
- *
1377
- * @category schemas
1378
- * @since 4.0.0
1379
- */
1380
- export const $Objects = Schema.Struct({
1381
- _tag: Schema.tag("Objects"),
1382
- annotations: Schema.optional($Annotations),
1383
- propertySignatures: Schema.Array($PropertySignature),
1384
- indexSignatures: Schema.Array($IndexSignature),
1385
- checks: Schema.Array(makeCheck($ObjectsMeta, "Objects"))
1386
- }).annotate({ identifier: "Objects" })
848
+ const AnnotationsSchema = Schema.optional(LiveAnnotationsSchema).pipe(
849
+ Schema.encodeTo(Schema.optionalKey(JsonAnnotationsSchema), {
850
+ decode: SchemaGetter.passthroughSubtype(),
851
+ encode: SchemaGetter.transformOptional((annotations) =>
852
+ Option.isNone(annotations) || annotations.value === undefined
853
+ ? Option.none()
854
+ : pruneAnnotations(annotations.value)
855
+ )
856
+ })
857
+ )
1387
858
 
1388
- /**
1389
- * Schema for the {@link Union} representation node.
1390
- *
1391
- * @category schemas
1392
- * @since 4.0.0
1393
- */
1394
- export const $Union = Schema.Struct({
859
+ const CheckSchema = Schema.suspend((): Schema.Codec<Check, unknown> => CheckUnion)
860
+ const ChecksSchema = Schema.Array(CheckSchema)
861
+ const KeywordFields = {
862
+ annotations: AnnotationsSchema,
863
+ checks: ChecksSchema
864
+ }
865
+ const FilterSchema = Schema.Struct({
866
+ _tag: Schema.tag("Filter"),
867
+ representation: CheckRepresentationAnnotationSchema,
868
+ annotations: AnnotationsSchema,
869
+ aborted: Schema.Boolean
870
+ })
871
+ const FilterGroupSchema = Schema.Struct({
872
+ _tag: Schema.tag("FilterGroup"),
873
+ representation: Schema.optional(CheckRepresentationAnnotationSchema),
874
+ annotations: AnnotationsSchema,
875
+ checks: Schema.NonEmptyArray(CheckSchema)
876
+ })
877
+ const CheckUnion = Schema.Union([FilterSchema, FilterGroupSchema])
878
+
879
+ function makeKeywordSchema<Tag extends Exclude<Representation["_tag"], "Reference">>(tag: Tag) {
880
+ return Schema.Struct({
881
+ _tag: Schema.tag(tag),
882
+ ...KeywordFields
883
+ })
884
+ }
885
+
886
+ const DeclarationSchema = Schema.Struct({
887
+ _tag: Schema.tag("Declaration"),
888
+ representation: RepresentationAnnotationSchema,
889
+ annotations: AnnotationsSchema,
890
+ typeParameters: RepresentationsSchema,
891
+ checks: ChecksSchema
892
+ })
893
+ const SuspendSchema = Schema.Struct({
894
+ _tag: Schema.tag("Suspend"),
895
+ annotations: AnnotationsSchema,
896
+ checks: Schema.Tuple([]),
897
+ thunk: RepresentationSchema
898
+ })
899
+ function makeValueSchema<Type extends string, Value>(type: Type, value: Schema.Codec<Value>) {
900
+ return value.pipe(
901
+ Schema.encodeTo(Schema.Struct({ type: Schema.tag(type), value }), {
902
+ decode: SchemaGetter.transform((encoded: { readonly type: Type; readonly value: Value }) => encoded.value),
903
+ encode: SchemaGetter.transform((value: Value) => ({ type, value }))
904
+ })
905
+ )
906
+ }
907
+ const StringValueCodec = makeValueSchema("string", Schema.String)
908
+ const NumberValueCodec = makeValueSchema("number", Schema.Number)
909
+ const LiteralSchema = Schema.Struct({
910
+ _tag: Schema.tag("Literal"),
911
+ ...KeywordFields,
912
+ literal: Schema.Union([
913
+ StringValueCodec,
914
+ makeValueSchema("number", Schema.Finite),
915
+ makeValueSchema("bigint", Schema.BigInt),
916
+ makeValueSchema("boolean", Schema.Boolean)
917
+ ])
918
+ })
919
+ const UniqueSymbolSchema = Schema.Struct({
920
+ _tag: Schema.tag("UniqueSymbol"),
921
+ ...KeywordFields,
922
+ symbol: Schema.Symbol
923
+ })
924
+ const EnumSchema = Schema.Struct({
925
+ _tag: Schema.tag("Enum"),
926
+ ...KeywordFields,
927
+ enums: Schema.Array(Schema.Tuple([
928
+ Schema.String,
929
+ Schema.Union([StringValueCodec, NumberValueCodec])
930
+ ]))
931
+ })
932
+ const TemplateLiteralSchema = Schema.Struct({
933
+ _tag: Schema.tag("TemplateLiteral"),
934
+ ...KeywordFields,
935
+ parts: RepresentationsSchema
936
+ })
937
+ const ElementSchema = Schema.Struct({
938
+ isOptional: Schema.Boolean,
939
+ type: RepresentationSchema,
940
+ annotations: AnnotationsSchema
941
+ })
942
+ const ArraysSchema = Schema.Struct({
943
+ _tag: Schema.tag("Arrays"),
944
+ ...KeywordFields,
945
+ elements: Schema.Array(ElementSchema),
946
+ rest: RepresentationsSchema
947
+ })
948
+ const PropertySignatureSchema = Schema.Struct({
949
+ name: Schema.Union([
950
+ StringValueCodec,
951
+ NumberValueCodec,
952
+ makeValueSchema("symbol", Schema.Symbol)
953
+ ]),
954
+ type: RepresentationSchema,
955
+ isOptional: Schema.Boolean,
956
+ isMutable: Schema.Boolean,
957
+ annotations: AnnotationsSchema
958
+ })
959
+ const IndexSignatureSchema = Schema.Struct({
960
+ parameter: RepresentationSchema,
961
+ type: RepresentationSchema
962
+ })
963
+ const ObjectsSchema = Schema.Struct({
964
+ _tag: Schema.tag("Objects"),
965
+ ...KeywordFields,
966
+ propertySignatures: Schema.Array(PropertySignatureSchema),
967
+ indexSignatures: Schema.Array(IndexSignatureSchema)
968
+ })
969
+ const UnionSchema = Schema.Struct({
1395
970
  _tag: Schema.tag("Union"),
1396
- annotations: Schema.optional($Annotations),
1397
- types: Schema.Array(Representation$ref),
971
+ ...KeywordFields,
972
+ types: RepresentationsSchema,
1398
973
  mode: Schema.Literals(["anyOf", "oneOf"])
1399
- }).annotate({ identifier: "Union" })
1400
-
1401
- /**
1402
- * Schema for the {@link Reference} representation node.
1403
- *
1404
- * @category schemas
1405
- * @since 4.0.0
1406
- */
1407
- export const $Reference = Schema.Struct({
974
+ })
975
+ const ReferenceSchema = Schema.Struct({
1408
976
  _tag: Schema.tag("Reference"),
1409
- $ref: Schema.String
1410
- }).annotate({ identifier: "Reference" })
1411
-
1412
- const $IsDateValid = Schema.Struct({
1413
- _tag: Schema.tag("isDateValid")
1414
- }).annotate({ identifier: "IsDateValid" })
1415
-
1416
- const $IsGreaterThanDate = Schema.Struct({
1417
- _tag: Schema.tag("isGreaterThanDate"),
1418
- exclusiveMinimum: Schema.Date
1419
- }).annotate({ identifier: "IsGreaterThanDate" })
977
+ $ref: Schema.NonEmptyString
978
+ })
979
+
980
+ const RepresentationUnion = Schema.Union([
981
+ DeclarationSchema,
982
+ ReferenceSchema,
983
+ SuspendSchema,
984
+ makeKeywordSchema("Null"),
985
+ makeKeywordSchema("Undefined"),
986
+ makeKeywordSchema("Void"),
987
+ makeKeywordSchema("Never"),
988
+ makeKeywordSchema("Unknown"),
989
+ makeKeywordSchema("Any"),
990
+ makeKeywordSchema("String"),
991
+ makeKeywordSchema("Number"),
992
+ makeKeywordSchema("Boolean"),
993
+ makeKeywordSchema("BigInt"),
994
+ makeKeywordSchema("Symbol"),
995
+ makeKeywordSchema("ObjectKeyword"),
996
+ LiteralSchema,
997
+ UniqueSymbolSchema,
998
+ EnumSchema,
999
+ TemplateLiteralSchema,
1000
+ ArraysSchema,
1001
+ ObjectsSchema,
1002
+ UnionSchema
1003
+ ])
1420
1004
 
1421
- const $IsGreaterThanOrEqualToDate = Schema.Struct({
1422
- _tag: Schema.tag("isGreaterThanOrEqualToDate"),
1423
- minimum: Schema.Date
1424
- }).annotate({ identifier: "IsGreaterThanOrEqualToDate" })
1005
+ const ReferencesSchema = Schema.Record(Schema.String, RepresentationSchema)
1425
1006
 
1426
- const $IsLessThanDate = Schema.Struct({
1427
- _tag: Schema.tag("isLessThanDate"),
1428
- exclusiveMaximum: Schema.Date
1429
- }).annotate({ identifier: "IsLessThanDate" })
1007
+ const DocumentFromJson: Schema.Codec<Document, Schema.Json> = Schema.toCodecJson(
1008
+ Schema.Struct({
1009
+ representation: RepresentationSchema,
1010
+ references: ReferencesSchema
1011
+ })
1012
+ )
1430
1013
 
1431
- const $IsLessThanOrEqualToDate = Schema.Struct({
1432
- _tag: Schema.tag("isLessThanOrEqualToDate"),
1433
- maximum: Schema.Date
1434
- }).annotate({ identifier: "IsLessThanOrEqualToDate" })
1014
+ const MultiDocumentFromJson: Schema.Codec<MultiDocument, Schema.Json> = Schema.toCodecJson(
1015
+ Schema.Struct({
1016
+ representations: Schema.NonEmptyArray(RepresentationSchema),
1017
+ references: ReferencesSchema
1018
+ })
1019
+ )
1435
1020
 
1436
- const $IsBetweenDate = Schema.Struct({
1437
- _tag: Schema.tag("isBetweenDate"),
1438
- minimum: Schema.Date,
1439
- maximum: Schema.Date,
1440
- exclusiveMinimum: Schema.optional(Schema.Boolean),
1441
- exclusiveMaximum: Schema.optional(Schema.Boolean)
1442
- }).annotate({ identifier: "IsBetweenDate" })
1021
+ const encodeDocument = Schema.encodeSync(DocumentFromJson)
1022
+ const encodeMultiDocument = Schema.encodeSync(MultiDocumentFromJson)
1023
+ const decodeDocument = Schema.decodeSync(DocumentFromJson)
1024
+ const decodeMultiDocument = Schema.decodeSync(MultiDocumentFromJson)
1443
1025
 
1444
1026
  /**
1445
- * Schema for {@link DateMeta}.
1027
+ * Projects a live single-root representation document and encodes it as JSON.
1446
1028
  *
1447
- * @category schemas
1448
- * @since 4.0.0
1449
- */
1450
- export const $DateMeta = Schema.Union([
1451
- $IsDateValid,
1452
- $IsGreaterThanDate,
1453
- $IsGreaterThanOrEqualToDate,
1454
- $IsLessThanDate,
1455
- $IsLessThanOrEqualToDate,
1456
- $IsBetweenDate
1457
- ]).annotate({ identifier: "DateMeta" })
1458
-
1459
- const $IsMinSize = Schema.Struct({
1460
- _tag: Schema.tag("isMinSize"),
1461
- minSize: NonNegativeInt
1462
- }).annotate({ identifier: "IsMinSize" })
1463
-
1464
- const $IsMaxSize = Schema.Struct({
1465
- _tag: Schema.tag("isMaxSize"),
1466
- maxSize: NonNegativeInt
1467
- }).annotate({ identifier: "IsMaxSize" })
1468
-
1469
- const $IsSizeBetween = Schema.Struct({
1470
- _tag: Schema.tag("isSizeBetween"),
1471
- minimum: NonNegativeInt,
1472
- maximum: NonNegativeInt
1473
- }).annotate({ identifier: "IsSizeBetween" })
1474
-
1475
- /**
1476
- * Schema for {@link SizeMeta}.
1029
+ * **When to use**
1477
1030
  *
1478
- * @category schemas
1479
- * @since 4.0.0
1480
- */
1481
- export const $SizeMeta = Schema.Union([
1482
- $IsMinSize,
1483
- $IsMaxSize,
1484
- $IsSizeBetween
1485
- ]).annotate({ identifier: "SizeMeta" })
1486
-
1487
- /**
1488
- * Schema for {@link DeclarationMeta}.
1031
+ * Use when you need a stable JSON value for storage or transport after calling `toRepresentation`.
1489
1032
  *
1490
- * @category schemas
1491
- * @since 4.0.0
1492
- */
1493
- export const $DeclarationMeta = Schema.Union([
1494
- $DateMeta,
1495
- $SizeMeta
1496
- ]).annotate({ identifier: "DeclarationMeta" })
1497
-
1498
- /**
1499
- * Schema for the {@link Declaration} representation node.
1033
+ * **Gotchas**
1500
1034
  *
1501
- * @category schemas
1502
- * @since 4.0.0
1503
- */
1504
- export const $Declaration = Schema.Struct({
1505
- _tag: Schema.tag("Declaration"),
1506
- annotations: Schema.optional($Annotations),
1507
- typeParameters: Schema.Array(Representation$ref),
1508
- checks: Schema.Array(makeCheck($DeclarationMeta, "Declaration")),
1509
- encodedSchema: Representation$ref
1510
- }).annotate({ identifier: "Declaration" })
1511
-
1512
- /**
1513
- * Schema for the {@link Suspend} representation node.
1035
+ * Generic annotations that are not JSON are omitted. Invalid persistence identities and unsupported structural values throw an `Error` containing their representation path.
1514
1036
  *
1515
- * @category schemas
1516
- * @since 4.0.0
1517
- */
1518
- export const $Suspend = Schema.Struct({
1519
- _tag: Schema.tag("Suspend"),
1520
- annotations: Schema.optional($Annotations),
1521
- checks: Schema.Tuple([]),
1522
- thunk: Representation$ref
1523
- }).annotate({ identifier: "Suspend" })
1524
-
1525
- /**
1526
- * Type-level helper for the recursive {@link $Representation} codec.
1037
+ * @see {@link toRepresentation} for constructing the live document
1038
+ * @see {@link toJsonMultiDocument} for documents with multiple roots
1527
1039
  *
1528
- * @category schemas
1040
+ * @category encoding
1529
1041
  * @since 4.0.0
1530
1042
  */
1531
- export interface $Representation extends Schema.Codec<Representation> {}
1043
+ export function toJson(document: Document): Schema.Json {
1044
+ return encodeDocument(document)
1045
+ }
1532
1046
 
1533
1047
  /**
1534
- * Schema for the full {@link Representation} union. It recursively validates
1535
- * and encodes any representation node.
1048
+ * Projects a live multi-root representation document and encodes it as JSON.
1049
+ *
1050
+ * **When to use**
1051
+ *
1052
+ * Use when you need one JSON value for multiple live roots that share a reference environment.
1536
1053
  *
1537
- * @category schemas
1054
+ * **Gotchas**
1055
+ *
1056
+ * The root order and shared reference keys are preserved, while non-JSON generic annotations are omitted.
1057
+ *
1058
+ * @see {@link toRepresentations} for constructing the live multi-document
1059
+ * @see {@link toJson} for a single-root document
1060
+ *
1061
+ * @category encoding
1538
1062
  * @since 4.0.0
1539
1063
  */
1540
- export const $Representation: $Representation = Schema.Union([
1541
- $Null,
1542
- $Undefined,
1543
- $Void,
1544
- $Never,
1545
- $Unknown,
1546
- $Any,
1547
- $String,
1548
- $Number,
1549
- $Boolean,
1550
- $BigInt,
1551
- $Symbol,
1552
- $Literal,
1553
- $UniqueSymbol,
1554
- $ObjectKeyword,
1555
- $Enum,
1556
- $TemplateLiteral,
1557
- $Arrays,
1558
- $Objects,
1559
- $Union,
1560
- $Reference,
1561
- $Declaration,
1562
- $Suspend
1563
- ]).annotate({ identifier: "Schema" })
1064
+ export function toJsonMultiDocument(document: MultiDocument): Schema.Json {
1065
+ return encodeMultiDocument(document)
1066
+ }
1564
1067
 
1565
1068
  /**
1566
- * Schema for {@link Document}.
1069
+ * Decodes a persisted single-root representation document from JSON.
1567
1070
  *
1568
1071
  * **When to use**
1569
1072
  *
1570
- * Use to validate or serialize a single schema representation document with
1571
- * `Schema.decodeUnknownSync` or `Schema.encodeSync`.
1073
+ * Use when reading a representation document from storage or transport before inspecting it or passing it to `fromRepresentation`.
1572
1074
  *
1573
1075
  * **Gotchas**
1574
1076
  *
1575
- * This codec validates document structure but does not resolve `$ref` keys
1576
- * against `references`.
1077
+ * Invalid documents throw a schema decoding error. Decoding does not reconstruct runtime callbacks.
1577
1078
  *
1578
- * @see {@link DocumentFromJson} for the JSON-string codec wrapper
1579
- * @see {@link $MultiDocument} for validating documents with multiple root representations
1079
+ * @see {@link toJson} for encoding a document
1080
+ * @see {@link fromRepresentation} for reconstructing a runtime schema
1081
+ * @see {@link fromJsonMultiDocument} for multiple roots sharing references
1580
1082
  *
1581
- * @category schemas
1083
+ * @category decoding
1582
1084
  * @since 4.0.0
1583
1085
  */
1584
- export const $Document = Schema.Struct({
1585
- representation: $Representation,
1586
- references: Schema.Record(Schema.String, $Representation)
1587
- }).annotate({ identifier: "Document" })
1086
+ export function fromJson(input: Schema.Json): Document {
1087
+ return decodeDocument(input)
1088
+ }
1588
1089
 
1589
1090
  /**
1590
- * Schema for {@link MultiDocument}.
1091
+ * Decodes a persisted multi-root representation document from JSON.
1092
+ *
1093
+ * **When to use**
1591
1094
  *
1592
- * @category schemas
1095
+ * Use when reading multiple representation roots that share references before inspecting them or passing them to `fromRepresentations`.
1096
+ *
1097
+ * **Gotchas**
1098
+ *
1099
+ * Invalid documents throw a schema decoding error. Decoding does not reconstruct runtime callbacks.
1100
+ *
1101
+ * @see {@link toJsonMultiDocument} for encoding a multi-document
1102
+ * @see {@link fromRepresentations} for reconstructing runtime schemas
1103
+ * @see {@link fromJson} for a single root
1104
+ *
1105
+ * @category decoding
1593
1106
  * @since 4.0.0
1594
1107
  */
1595
- export const $MultiDocument = Schema.Struct({
1596
- representations: Schema.NonEmptyArray($Representation),
1597
- references: Schema.Record(Schema.String, $Representation)
1598
- }).annotate({ identifier: "MultiDocument" })
1599
-
1600
- // -----------------------------------------------------------------------------
1601
- // APIs
1602
- // -----------------------------------------------------------------------------
1108
+ export function fromJsonMultiDocument(input: Schema.Json): MultiDocument {
1109
+ return decodeMultiDocument(input)
1110
+ }
1603
1111
 
1604
1112
  /**
1605
- * Converts a Schema AST into a {@link Document}.
1113
+ * Reconstructs a runtime schema from a representation document.
1606
1114
  *
1607
1115
  * **When to use**
1608
1116
  *
1609
- * Use when you have a single Schema AST and need a schema representation
1610
- * document.
1117
+ * Use when you have decoded or constructed a document whose declaration and check annotations may require revivers.
1611
1118
  *
1612
- * **Details**
1119
+ * **Gotchas**
1613
1120
  *
1614
- * Shared/recursive sub-schemas are extracted into the `references` map.
1121
+ * Revivers are resolved locally by `id`; none are installed implicitly. Reviver results are used directly, and exceptions raised by a reviver pass through unchanged.
1615
1122
  *
1616
- * **Example** (Converting a Schema to a Document)
1123
+ * **Example** (Restoring a persisted schema)
1617
1124
  *
1618
- * ```ts
1125
+ * ```ts import.meta.vitest
1619
1126
  * import { Schema, SchemaRepresentation } from "effect"
1620
1127
  *
1621
- * const Person = Schema.Struct({
1622
- * name: Schema.String,
1623
- * age: Schema.Number
1624
- * })
1128
+ * const document = SchemaRepresentation.toRepresentation(Schema.Struct({ name: Schema.String }).ast)
1129
+ * const persisted = SchemaRepresentation.toJson(document)
1130
+ * const restored = SchemaRepresentation.fromJson(persisted)
1131
+ * const schema = SchemaRepresentation.fromRepresentation(restored, { revivers: [] })
1132
+ * const Person = Schema.make<Schema.Codec<{ readonly name: string }>>(schema.ast)
1625
1133
  *
1626
- * const doc = SchemaRepresentation.fromAST(Person.ast)
1627
- * console.log(doc.representation._tag)
1628
- * // "Objects"
1134
+ * Schema.decodeUnknownSync(Person)({ name: "Ada" }) // => { name: "Ada" }
1629
1135
  * ```
1630
1136
  *
1631
- * @see {@link Document}
1632
- * @see {@link fromASTs}
1137
+ * @see {@link fromJson} for decoding a persisted document
1138
+ * @see {@link fromRepresentations} for multiple roots sharing references
1633
1139
  *
1634
- * @category constructors
1140
+ * @category transforming
1635
1141
  * @since 4.0.0
1636
1142
  */
1637
- export const fromAST: (ast: SchemaAST.AST) => Document = InternalRepresentation.fromAST
1143
+ export function fromRepresentation(
1144
+ document: Document,
1145
+ options: { readonly revivers: ReadonlyArray<AnyReviver> }
1146
+ ): Schema.Top {
1147
+ return InternalFromRepresentation.fromRepresentation(document, options.revivers)
1148
+ }
1638
1149
 
1639
1150
  /**
1640
- * Converts one or more Schema ASTs into a {@link MultiDocument}.
1151
+ * Reconstructs multiple runtime schemas from a representation multi-document.
1641
1152
  *
1642
1153
  * **When to use**
1643
1154
  *
1644
- * Use when you have multiple Schema ASTs and need one schema representation
1645
- * `MultiDocument` with shared references.
1155
+ * Use when multiple roots must be rebuilt in one shared reference environment.
1646
1156
  *
1647
- * **Details**
1157
+ * **Gotchas**
1648
1158
  *
1649
- * All schemas share a single `references` map.
1159
+ * Only references reachable from a root are revived. Revivers are resolved locally by `id`; none are installed implicitly.
1650
1160
  *
1651
- * @see {@link MultiDocument}
1652
- * @see {@link fromAST}
1161
+ * @see {@link fromJsonMultiDocument} for decoding a persisted multi-document
1162
+ * @see {@link fromRepresentation} for a single root
1653
1163
  *
1654
- * @category constructors
1164
+ * @category transforming
1655
1165
  * @since 4.0.0
1656
1166
  */
1657
- export const fromASTs: (asts: readonly [SchemaAST.AST, ...Array<SchemaAST.AST>]) => MultiDocument =
1658
- InternalRepresentation.fromASTs
1167
+ export function fromRepresentations(
1168
+ document: MultiDocument,
1169
+ options: { readonly revivers: ReadonlyArray<AnyReviver> }
1170
+ ): readonly [Schema.Top, ...Array<Schema.Top>] {
1171
+ return InternalFromRepresentation.fromRepresentations(document, options.revivers)
1172
+ }
1659
1173
 
1660
1174
  /**
1661
- * Schema that decodes a {@link Document} from JSON and encodes it back.
1175
+ * Imports a JSON Schema Draft 2020-12 document as a runtime schema.
1662
1176
  *
1663
1177
  * **When to use**
1664
1178
  *
1665
- * Use when you need a JSON codec for schema representation documents with
1666
- * `Schema.decodeUnknownSync` or `Schema.encodeSync`.
1667
- *
1668
- * **Example** (Round-tripping a Document through JSON)
1179
+ * Use when you need to validate or transform values described by an external JSON Schema document.
1669
1180
  *
1670
- * ```ts
1671
- * import { Schema, SchemaRepresentation } from "effect"
1181
+ * **Gotchas**
1672
1182
  *
1673
- * const doc = SchemaRepresentation.fromAST(Schema.String.ast)
1674
- * const json = Schema.encodeSync(SchemaRepresentation.DocumentFromJson)(doc)
1675
- * const back = Schema.decodeUnknownSync(SchemaRepresentation.DocumentFromJson)(json)
1676
- * ```
1183
+ * Import is best-effort. Built-in declarations and checks are reconstructed with importer-owned revivers. Pattern
1184
+ * constraints reached during translation cause an error by default. Use `patterns: "apply"` only for trusted documents,
1185
+ * or `patterns: "ignore"` to weaken validation explicitly. Callback results are used directly, and exceptions raised by a
1186
+ * callback pass through unchanged.
1677
1187
  *
1678
- * @see {@link $Document}
1679
- * @see {@link MultiDocumentFromJson}
1188
+ * @see {@link fromJsonSchemaMultiDocument} for multiple roots sharing definitions
1189
+ * @see {@link toRepresentation} for converting the result to a representation document
1680
1190
  *
1681
- * @category schemas
1191
+ * @category constructors
1682
1192
  * @since 4.0.0
1683
1193
  */
1684
- export const DocumentFromJson: Schema.Codec<Document, Schema.Json> = Schema.toCodecJson($Document)
1194
+ export function fromJsonSchemaDocument(
1195
+ document: JsonSchema.Document<"draft-2020-12">,
1196
+ options?: FromJsonSchemaOptions
1197
+ ): Schema.Top {
1198
+ return InternalFromJsonSchemaDocument.fromJsonSchemaDocument(document, options)
1199
+ }
1685
1200
 
1686
1201
  /**
1687
- * Schema for `MultiDocument` values encoded as JSON.
1202
+ * Imports multiple JSON Schema Draft 2020-12 roots as runtime schemas with shared definitions.
1688
1203
  *
1689
- * @see {@link $MultiDocument}
1690
- * @see {@link DocumentFromJson}
1204
+ * **When to use**
1691
1205
  *
1692
- * @category schemas
1693
- * @since 4.0.0
1694
- */
1695
- export const MultiDocumentFromJson: Schema.Codec<MultiDocument, Schema.Json> = Schema.toCodecJson($MultiDocument)
1696
-
1697
- /**
1698
- * Wraps a single {@link Document} as a {@link MultiDocument} with one
1699
- * representation.
1206
+ * Use when multiple imported roots share reachable definitions, aliases, or recursion.
1700
1207
  *
1701
- * **When to use**
1208
+ * **Gotchas**
1702
1209
  *
1703
- * Use when you need to pass a single schema representation `Document` where an
1704
- * API expects a `MultiDocument`.
1210
+ * Only definitions reachable from a root are translated. Pattern constraints reached during translation cause an error
1211
+ * by default. Use `patterns: "apply"` only for trusted documents, or `patterns: "ignore"` to weaken validation explicitly.
1212
+ * Callback results are used directly, and exceptions raised by a callback pass through unchanged.
1705
1213
  *
1706
- * @see {@link Document}
1707
- * @see {@link MultiDocument}
1214
+ * @see {@link fromJsonSchemaDocument} for a single root
1215
+ * @see {@link toRepresentations} for converting the returned schema ASTs to a representation document
1708
1216
  *
1709
- * @category transforming
1217
+ * @category constructors
1710
1218
  * @since 4.0.0
1711
1219
  */
1712
- export function toMultiDocument(document: Document): MultiDocument {
1713
- return {
1714
- representations: [document.representation],
1715
- references: document.references
1716
- }
1717
- }
1718
-
1719
- /**
1720
- * A callback that handles {@link Declaration} nodes during reconstruction
1721
- * ({@link toSchema}) or code generation ({@link toCodeDocument}).
1722
- *
1723
- * **Details**
1724
- *
1725
- * Return a value to handle the declaration. Return `undefined` to fall back to
1726
- * default behavior, which uses `encodedSchema` for `toSchema` or the
1727
- * `generation` annotation for `toCodeDocument`. `recur` processes child
1728
- * representations recursively.
1729
- *
1730
- * @see {@link toSchema}
1731
- * @see {@link toSchemaDefaultReviver}
1732
- * @see {@link toCodeDocument}
1733
- *
1734
- * @category models
1735
- * @since 4.0.0
1736
- */
1737
- export type Reviver<T> = (declaration: Declaration, recur: (representation: Representation) => T) => T | undefined
1738
-
1739
- /**
1740
- * Default {@link Reviver} for {@link toSchema} that handles built-in Effect
1741
- * types, including Option, Result, Redacted, Cause, Exit, ReadonlyMap, HashMap,
1742
- * ReadonlySet, Date, Duration, URL, and RegExp.
1743
- *
1744
- * **When to use**
1745
- *
1746
- * Use when you need the default `options.reviver` for {@link toSchema} to
1747
- * reconstruct runtime schemas for built-in Effect declarations.
1748
- *
1749
- * **Details**
1750
- *
1751
- * The reviver returns `undefined` for unrecognized declarations, causing
1752
- * fallback to `encodedSchema`.
1753
- *
1754
- * @see {@link toSchema}
1755
- * @see {@link Reviver}
1756
- *
1757
- * @category transforming
1758
- * @since 4.0.0
1759
- */
1760
- export const toSchemaDefaultReviver: Reviver<Schema.Top> = (s, recur) => {
1761
- const typeConstructor = s.annotations?.typeConstructor
1762
- if (Predicate.isObject(typeConstructor) && typeof typeConstructor._tag === "string") {
1763
- const typeParameters = s.typeParameters.map(recur)
1764
- switch (typeConstructor._tag) {
1765
- // built-in types
1766
- case "Date":
1767
- return Schema.Date
1768
- case "Error":
1769
- return Schema.Error(typeConstructor.options as Schema.ErrorOptions | undefined)
1770
- case "File":
1771
- return Schema.File
1772
- case "FormData":
1773
- return Schema.FormData
1774
- case "ReadonlyMap":
1775
- return Schema.ReadonlyMap(typeParameters[0], typeParameters[1])
1776
- case "ReadonlySet":
1777
- return Schema.ReadonlySet(typeParameters[0])
1778
- case "RegExp":
1779
- return Schema.RegExp
1780
- case "Uint8Array":
1781
- return Schema.Uint8Array
1782
- case "URL":
1783
- return Schema.URL
1784
- case "URLSearchParams":
1785
- return Schema.URLSearchParams
1786
- // effect types
1787
- case "effect/Option":
1788
- return Schema.Option(typeParameters[0])
1789
- case "effect/Result":
1790
- return Schema.Result(typeParameters[0], typeParameters[1])
1791
- case "effect/Redacted":
1792
- return Schema.Redacted(typeParameters[0], typeConstructor.options as any)
1793
- case "effect/DateTime.TimeZone":
1794
- return Schema.TimeZone
1795
- case "effect/DateTime.TimeZone.Named":
1796
- return Schema.TimeZoneNamed
1797
- case "effect/DateTime.TimeZone.Offset":
1798
- return Schema.TimeZoneOffset
1799
- case "effect/DateTime.Utc":
1800
- return Schema.DateTimeUtc
1801
- case "effect/DateTime.Zoned":
1802
- return Schema.DateTimeZoned
1803
- case "effect/BigDecimal":
1804
- return Schema.BigDecimal
1805
- case "effect/Chunk":
1806
- return Schema.Chunk(typeParameters[0])
1807
- case "effect/Cause":
1808
- return Schema.Cause(typeParameters[0], typeParameters[1])
1809
- case "effect/Cause/Failure":
1810
- return Schema.CauseReason(typeParameters[0], typeParameters[1])
1811
- case "effect/Duration":
1812
- return Schema.Duration
1813
- case "effect/Exit":
1814
- return Schema.Exit(typeParameters[0], typeParameters[1], typeParameters[2])
1815
- case "effect/Json":
1816
- return Schema.Json
1817
- case "effect/MutableJson":
1818
- return Schema.MutableJson
1819
- case "effect/HashMap":
1820
- return Schema.HashMap(typeParameters[0], typeParameters[1])
1821
- case "effect/HashSet":
1822
- return Schema.HashSet(typeParameters[0])
1823
- }
1824
- }
1825
- }
1826
-
1827
- /**
1828
- * Creates a runtime Schema from a {@link Document}.
1829
- *
1830
- * **When to use**
1831
- *
1832
- * Use when you have a serialized or computed schema representation document and
1833
- * need a runtime Schema for decoding/encoding.
1834
- *
1835
- * **Details**
1836
- *
1837
- * Pass `options.reviver`, such as {@link toSchemaDefaultReviver}, to handle
1838
- * {@link Declaration} nodes for types like `Date` and `Option`. Without a
1839
- * reviver, declarations fall back to their `encodedSchema`. Circular references
1840
- * are handled via lazy `Schema.suspend`.
1841
- *
1842
- * **Gotchas**
1843
- *
1844
- * This throws if a `$ref` is not found in `document.references`.
1845
- *
1846
- * **Example** (Reconstructing a Schema)
1847
- *
1848
- * ```ts
1849
- * import { Schema, SchemaRepresentation } from "effect"
1850
- *
1851
- * const doc = SchemaRepresentation.fromAST(
1852
- * Schema.Struct({ name: Schema.String }).ast
1853
- * )
1854
- *
1855
- * const schema = SchemaRepresentation.toSchema(doc)
1856
- * console.log(JSON.stringify(Schema.toJsonSchemaDocument(schema), null, 2))
1857
- * ```
1858
- *
1859
- * @see {@link Document}
1860
- * @see {@link Reviver}
1861
- * @see {@link toSchemaDefaultReviver}
1862
- *
1863
- * @category Runtime Generation
1864
- * @since 4.0.0
1865
- */
1866
- export function toSchema<S extends Schema.Top = Schema.Top>(document: Document, options?: {
1867
- readonly reviver?: Reviver<Schema.Top> | undefined
1868
- }): S {
1869
- type Slot = {
1870
- // 0 = not started, 1 = building, 2 = done
1871
- state: 0 | 1 | 2
1872
- value: Schema.Top | undefined
1873
- ref: Schema.Top
1874
- }
1875
-
1876
- const slots = new Map<string, Slot>()
1877
-
1878
- return recur(document.representation) as S
1879
-
1880
- function recur(r: Representation): Schema.Top {
1881
- let out = on(r)
1882
- if ("annotations" in r && r.annotations) out = out.annotate(r.annotations)
1883
- out = toSchemaChecks(out, r)
1884
- return out
1885
- }
1886
-
1887
- function getSlot(identifier: string): Slot {
1888
- const existing = slots.get(identifier)
1889
- if (existing) return existing
1890
-
1891
- // Create the slot *before* resolving, so self-references can see it.
1892
- const slot: Slot = {
1893
- state: 0,
1894
- value: undefined,
1895
- ref: Schema.suspend(() => {
1896
- if (slot.value === undefined) {
1897
- return Schema.Unknown
1898
- }
1899
- return slot.value
1900
- })
1901
- }
1902
- slots.set(identifier, slot)
1903
- return slot
1904
- }
1905
-
1906
- function resolveReference($ref: string): Schema.Top {
1907
- const definition = document.references[$ref]
1908
- if (definition === undefined) {
1909
- throw new Error(`Reference ${$ref} not found`)
1910
- }
1911
-
1912
- const slot = getSlot($ref)
1913
-
1914
- if (slot.state === 2) {
1915
- // Already built: return the built schema directly
1916
- return slot.value!
1917
- }
1918
-
1919
- if (slot.state === 1) {
1920
- // Circular: we're currently building this identifier.
1921
- return slot.ref
1922
- }
1923
-
1924
- // First time: build it.
1925
- slot.state = 1
1926
- try {
1927
- slot.value = recur(definition)
1928
- slot.state = 2
1929
- return slot.value
1930
- } catch (e) {
1931
- // Leave the slot in a safe state so future thunks don't silently succeed.
1932
- slot.state = 0
1933
- slot.value = undefined
1934
- throw e
1935
- }
1936
- }
1937
-
1938
- function on(r: Representation): Schema.Top {
1939
- switch (r._tag) {
1940
- case "Declaration":
1941
- return options?.reviver?.(r, recur) ?? recur(r.encodedSchema)
1942
- case "Reference":
1943
- return resolveReference(r.$ref)
1944
- case "Suspend":
1945
- return recur(r.thunk)
1946
- case "Null":
1947
- return Schema.Null
1948
- case "Undefined":
1949
- return Schema.Undefined
1950
- case "Void":
1951
- return Schema.Void
1952
- case "Never":
1953
- return Schema.Never
1954
- case "Unknown":
1955
- return Schema.Unknown
1956
- case "Any":
1957
- return Schema.Any
1958
- case "String": {
1959
- const contentMediaType = r.contentMediaType
1960
- const contentSchema = r.contentSchema
1961
- if (contentMediaType === "application/json" && contentSchema !== undefined) {
1962
- return Schema.fromJsonString(recur(contentSchema))
1963
- }
1964
- return Schema.String
1965
- }
1966
- case "Number":
1967
- return Schema.Number
1968
- case "Boolean":
1969
- return Schema.Boolean
1970
- case "BigInt":
1971
- return Schema.BigInt
1972
- case "Symbol":
1973
- return Schema.Symbol
1974
- case "Literal":
1975
- return Schema.Literal(r.literal)
1976
- case "UniqueSymbol":
1977
- return Schema.UniqueSymbol(r.symbol)
1978
- case "ObjectKeyword":
1979
- return Schema.ObjectKeyword
1980
- case "Enum":
1981
- return Schema.Enum(Object.fromEntries(r.enums))
1982
- case "TemplateLiteral": {
1983
- const parts = r.parts.map(recur) as Schema.TemplateLiteral.Parts
1984
- return Schema.TemplateLiteral(parts)
1985
- }
1986
- case "Arrays": {
1987
- const elements = r.elements.map((e) => {
1988
- const s = recur(e.type)
1989
- return e.isOptional ? Schema.optionalKey(s) : s
1990
- })
1991
- const rest = r.rest.map(recur)
1992
- if (Arr.isArrayNonEmpty(rest)) {
1993
- if (r.elements.length === 0 && r.rest.length === 1) {
1994
- return Schema.Array(rest[0])
1995
- }
1996
- return Schema.TupleWithRest(Schema.Tuple(elements), rest)
1997
- }
1998
- return Schema.Tuple(elements)
1999
- }
2000
- case "Objects": {
2001
- const fields: Record<PropertyKey, Schema.Top> = {}
2002
-
2003
- for (const ps of r.propertySignatures) {
2004
- const s = recur(ps.type)
2005
- const withOptional = ps.isOptional ? Schema.optionalKey(s) : s
2006
- fields[ps.name] = ps.isMutable ? Schema.mutableKey(withOptional) : withOptional
2007
- }
2008
-
2009
- const indexSignatures = r.indexSignatures.map((is) =>
2010
- Schema.Record(recur(is.parameter) as Schema.Record.Key, recur(is.type))
2011
- )
2012
-
2013
- if (Arr.isArrayNonEmpty(indexSignatures)) {
2014
- if (r.propertySignatures.length === 0 && indexSignatures.length === 1) {
2015
- return indexSignatures[0]
2016
- }
2017
- return Schema.StructWithRest(Schema.Struct(fields), indexSignatures)
2018
- }
2019
-
2020
- return Schema.Struct(fields)
2021
- }
2022
- case "Union": {
2023
- if (r.types.length === 0) return Schema.Never
2024
- if (r.types.every((t) => t._tag === "Literal")) {
2025
- if (r.types.length === 1) {
2026
- return Schema.Literal(r.types[0].literal)
2027
- }
2028
- return Schema.Literals(r.types.map((t) => t.literal))
2029
- }
2030
- return Schema.Union(r.types.map(recur), { mode: r.mode })
2031
- }
2032
- }
2033
- }
2034
-
2035
- function toSchemaChecks(top: Schema.Top, schema: Representation): Schema.Top {
2036
- switch (schema._tag) {
2037
- default:
2038
- return top
2039
- case "String":
2040
- case "Number":
2041
- case "BigInt":
2042
- case "Arrays":
2043
- case "Objects":
2044
- case "Declaration": {
2045
- const checks = schema.checks.map(toSchemaCheck)
2046
- return Arr.isArrayNonEmpty(checks) ? top.check(...checks) : top
2047
- }
2048
- }
2049
- }
2050
-
2051
- function toSchemaCheck(check: Check<Meta>): SchemaAST.Check<any> {
2052
- switch (check._tag) {
2053
- case "Filter":
2054
- return toSchemaFilter(check)
2055
- case "FilterGroup": {
2056
- return Schema.makeFilterGroup(Arr.map(check.checks, toSchemaCheck), check.annotations)
2057
- }
2058
- }
2059
- }
2060
-
2061
- function toSchemaFilter(filter: Filter<Meta>): SchemaAST.Check<any> {
2062
- const a = filter.annotations
2063
- switch (filter.meta._tag) {
2064
- // String Meta
2065
- case "isStringFinite":
2066
- return Schema.isStringFinite(a)
2067
- case "isStringBigInt":
2068
- return Schema.isStringBigInt(a)
2069
- case "isStringSymbol":
2070
- return Schema.isStringSymbol(a)
2071
- case "isMinLength":
2072
- return Schema.isMinLength(filter.meta.minLength, a)
2073
- case "isMaxLength":
2074
- return Schema.isMaxLength(filter.meta.maxLength, a)
2075
- case "isLengthBetween":
2076
- return Schema.isLengthBetween(filter.meta.minimum, filter.meta.maximum, a)
2077
- case "isPattern":
2078
- return Schema.isPattern(filter.meta.regExp, a)
2079
- case "isTrimmed":
2080
- return Schema.isTrimmed(a)
2081
- case "isUUID":
2082
- return Schema.isUUID(filter.meta.version, a)
2083
- case "isGUID":
2084
- return Schema.isGUID(a)
2085
- case "isULID":
2086
- return Schema.isULID(a)
2087
- case "isBase64":
2088
- return Schema.isBase64(a)
2089
- case "isBase64Url":
2090
- return Schema.isBase64Url(a)
2091
- case "isStartsWith":
2092
- return Schema.isStartsWith(filter.meta.startsWith, a)
2093
- case "isEndsWith":
2094
- return Schema.isEndsWith(filter.meta.endsWith, a)
2095
- case "isIncludes":
2096
- return Schema.isIncludes(filter.meta.includes, a)
2097
- case "isUppercased":
2098
- return Schema.isUppercased(a)
2099
- case "isLowercased":
2100
- return Schema.isLowercased(a)
2101
- case "isCapitalized":
2102
- return Schema.isCapitalized(a)
2103
- case "isUncapitalized":
2104
- return Schema.isUncapitalized(a)
2105
-
2106
- // Number Meta
2107
- case "isFinite":
2108
- return Schema.isFinite(a)
2109
- case "isInt":
2110
- return Schema.isInt(a)
2111
- case "isMultipleOf":
2112
- return Schema.isMultipleOf(filter.meta.divisor, a)
2113
- case "isGreaterThan":
2114
- return Schema.isGreaterThan(filter.meta.exclusiveMinimum, a)
2115
- case "isGreaterThanOrEqualTo":
2116
- return Schema.isGreaterThanOrEqualTo(filter.meta.minimum, a)
2117
- case "isLessThan":
2118
- return Schema.isLessThan(filter.meta.exclusiveMaximum, a)
2119
- case "isLessThanOrEqualTo":
2120
- return Schema.isLessThanOrEqualTo(filter.meta.maximum, a)
2121
- case "isBetween":
2122
- return Schema.isBetween(filter.meta, a)
2123
-
2124
- // BigInt Meta
2125
- case "isGreaterThanBigInt":
2126
- return Schema.isGreaterThanBigInt(filter.meta.exclusiveMinimum, a)
2127
- case "isGreaterThanOrEqualToBigInt":
2128
- return Schema.isGreaterThanOrEqualToBigInt(filter.meta.minimum, a)
2129
- case "isLessThanBigInt":
2130
- return Schema.isLessThanBigInt(filter.meta.exclusiveMaximum, a)
2131
- case "isLessThanOrEqualToBigInt":
2132
- return Schema.isLessThanOrEqualToBigInt(filter.meta.maximum, a)
2133
- case "isBetweenBigInt":
2134
- return Schema.isBetweenBigInt(filter.meta, a)
2135
-
2136
- // Object Meta
2137
- case "isMinProperties":
2138
- return Schema.isMinProperties(filter.meta.minProperties, a)
2139
- case "isMaxProperties":
2140
- return Schema.isMaxProperties(filter.meta.maxProperties, a)
2141
- case "isPropertiesLengthBetween":
2142
- return Schema.isPropertiesLengthBetween(filter.meta.minimum, filter.meta.maximum, a)
2143
- case "isPropertyNames":
2144
- return Schema.isPropertyNames(recur(filter.meta.propertyNames) as Schema.Record.Key, a)
2145
-
2146
- // Arrays Meta
2147
- case "isUnique":
2148
- return Schema.isUnique(a)
2149
-
2150
- // Date Meta
2151
- case "isDateValid":
2152
- return Schema.isDateValid(a)
2153
- case "isGreaterThanDate":
2154
- return Schema.isGreaterThanDate(filter.meta.exclusiveMinimum, a)
2155
- case "isGreaterThanOrEqualToDate":
2156
- return Schema.isGreaterThanOrEqualToDate(filter.meta.minimum, a)
2157
- case "isLessThanDate":
2158
- return Schema.isLessThanDate(filter.meta.exclusiveMaximum, a)
2159
- case "isLessThanOrEqualToDate":
2160
- return Schema.isLessThanOrEqualToDate(filter.meta.maximum, a)
2161
- case "isBetweenDate":
2162
- return Schema.isBetweenDate(filter.meta, a)
2163
-
2164
- // Size Meta
2165
- case "isMinSize":
2166
- return Schema.isMinSize(filter.meta.minSize, a)
2167
- case "isMaxSize":
2168
- return Schema.isMaxSize(filter.meta.maxSize, a)
2169
- case "isSizeBetween":
2170
- return Schema.isSizeBetween(filter.meta.minimum, filter.meta.maximum, a)
2171
- }
2172
- }
2173
- }
2174
-
2175
- /**
2176
- * Converts a {@link Document} to a Draft 2020-12 JSON Schema document.
2177
- *
2178
- * **When to use**
2179
- *
2180
- * Use when you need to produce a standard JSON Schema document from a schema
2181
- * representation `Document`.
2182
- *
2183
- * **Gotchas**
2184
- *
2185
- * JSON Schema generation is best-effort. Some Effect schema representation
2186
- * semantics cannot be represented exactly in JSON Schema, and importing an
2187
- * emitted JSON Schema may produce an equivalent approximation rather than the
2188
- * original representation shape.
2189
- *
2190
- * **Example** (Generating JSON Schema)
2191
- *
2192
- * ```ts
2193
- * import { Schema, SchemaRepresentation } from "effect"
2194
- *
2195
- * const doc = SchemaRepresentation.fromAST(Schema.String.ast)
2196
- * const jsonSchema = SchemaRepresentation.toJsonSchemaDocument(doc)
2197
- * console.log(jsonSchema.schema.type)
2198
- * // "string"
2199
- * ```
2200
- *
2201
- * @see {@link Document}
2202
- * @see {@link toJsonSchemaMultiDocument}
2203
- * @see {@link fromJsonSchemaDocument}
2204
- *
2205
- * @category transforming
2206
- * @since 4.0.0
2207
- */
2208
- export const toJsonSchemaDocument: (
2209
- document: Document,
2210
- options?: Schema.ToJsonSchemaOptions
2211
- ) => JsonSchema.Document<"draft-2020-12"> = InternalRepresentation.toJsonSchemaDocument
2212
-
2213
- /**
2214
- * Converts a {@link MultiDocument} to a Draft 2020-12 JSON Schema
2215
- * multi-document.
2216
- *
2217
- * **When to use**
2218
- *
2219
- * Use when you need to export related schema representation documents together
2220
- * so shared definitions stay in multi-document JSON Schema form.
2221
- *
2222
- * **Gotchas**
2223
- *
2224
- * JSON Schema generation is best-effort. Some Effect schema representation
2225
- * semantics cannot be represented exactly in JSON Schema, and importing an
2226
- * emitted JSON Schema may produce equivalent approximations rather than the
2227
- * original representation shapes.
2228
- *
2229
- * @see {@link MultiDocument}
2230
- * @see {@link toJsonSchemaDocument}
2231
- * @see {@link fromJsonSchemaMultiDocument}
2232
- *
2233
- * @category transforming
2234
- * @since 4.0.0
2235
- */
2236
- export const toJsonSchemaMultiDocument: (
2237
- document: MultiDocument,
2238
- options?: Schema.ToJsonSchemaOptions
2239
- ) => JsonSchema.MultiDocument<"draft-2020-12"> = InternalRepresentation.toJsonSchemaMultiDocument
2240
-
2241
- /**
2242
- * A pair of TypeScript source strings for a schema: `runtime` is the
2243
- * executable Schema expression, `Type` is the corresponding TypeScript type.
2244
- *
2245
- * @see {@link makeCode}
2246
- * @see {@link CodeDocument}
2247
- *
2248
- * @category Code Generation
2249
- * @since 4.0.0
2250
- */
2251
- export type Code = {
2252
- readonly runtime: string
2253
- readonly Type: string
2254
- }
2255
-
2256
- /**
2257
- * Constructs a {@link Code} value from a runtime expression string and a
2258
- * TypeScript type string.
2259
- *
2260
- * @see {@link Code}
2261
- *
2262
- * @category Code Generation
2263
- * @since 4.0.0
2264
- */
2265
- export function makeCode(runtime: string, Type: string): Code {
2266
- return { runtime, Type }
2267
- }
2268
-
2269
- /**
2270
- * An auxiliary code artifact produced during code generation — a symbol
2271
- * declaration, an enum declaration, or an import statement.
2272
- *
2273
- * @see {@link CodeDocument}
2274
- * @see {@link toCodeDocument}
2275
- *
2276
- * @category Code Generation
2277
- * @since 4.0.0
2278
- */
2279
- export type Artifact =
2280
- | {
2281
- readonly _tag: "Symbol"
2282
- readonly identifier: string
2283
- readonly generation: Code
2284
- }
2285
- | {
2286
- readonly _tag: "Enum"
2287
- readonly identifier: string
2288
- readonly generation: Code
2289
- }
2290
- | {
2291
- readonly _tag: "Import"
2292
- readonly importDeclaration: string
2293
- }
2294
-
2295
- /**
2296
- * The output of {@link toCodeDocument}: generated TypeScript code for one or
2297
- * more schemas plus their shared references and auxiliary artifacts.
2298
- *
2299
- * **Details**
2300
- *
2301
- * `codes` contains one {@link Code} per input representation.
2302
- * `references.nonRecursives` contains topologically sorted non-recursive
2303
- * definitions. `references.recursives` contains definitions involved in cycles.
2304
- * `artifacts` contains symbols, enums, and import statements needed by the
2305
- * code.
2306
- *
2307
- * @see {@link toCodeDocument}
2308
- * @see {@link Code}
2309
- * @see {@link Artifact}
2310
- *
2311
- * @category Code Generation
2312
- * @since 4.0.0
2313
- */
2314
- export type CodeDocument = {
2315
- readonly codes: ReadonlyArray<Code>
2316
- readonly references: {
2317
- readonly nonRecursives: ReadonlyArray<{
2318
- readonly $ref: string
2319
- readonly code: Code
2320
- }>
2321
- readonly recursives: {
2322
- readonly [$ref: string]: Code
2323
- }
2324
- }
2325
- readonly artifacts: ReadonlyArray<Artifact>
2326
- }
2327
-
2328
- /**
2329
- * Generates TypeScript code strings from a {@link MultiDocument}.
2330
- *
2331
- * **When to use**
2332
- *
2333
- * Use when you need to produce source code for Effect Schema definitions from a
2334
- * schema representation `MultiDocument`.
2335
- *
2336
- * **Details**
2337
- *
2338
- * `options.reviver` can customize code generation for {@link Declaration}
2339
- * nodes. Return `undefined` to fall back to the default logic, which uses
2340
- * `generation` annotations or the encoded schema. References are
2341
- * topologically sorted so non-recursive definitions are emitted before their
2342
- * dependents. `$ref` keys are converted to sanitized JavaScript identifiers.
2343
- *
2344
- * **Example** (Generating TypeScript code)
2345
- *
2346
- * ```ts
2347
- * import { Schema, SchemaRepresentation } from "effect"
2348
- *
2349
- * const Person = Schema.Struct({
2350
- * name: Schema.String,
2351
- * age: Schema.Int
2352
- * })
2353
- *
2354
- * const multi = SchemaRepresentation.toMultiDocument(
2355
- * SchemaRepresentation.fromAST(Person.ast)
2356
- * )
2357
- * const codeDoc = SchemaRepresentation.toCodeDocument(multi)
2358
- * console.log(codeDoc.codes[0].runtime)
2359
- * // Schema.Struct({ ... })
2360
- * ```
2361
- *
2362
- * @see {@link CodeDocument}
2363
- * @see {@link MultiDocument}
2364
- * @see {@link Reviver}
2365
- *
2366
- * @category Code Generation
2367
- * @since 4.0.0
2368
- */
2369
- export function toCodeDocument(multiDocument: MultiDocument, options?: {
2370
- /**
2371
- * The reviver can return `undefined` to indicate that the generation should be generated by the default logic
2372
- */
2373
- readonly reviver?: Reviver<Code> | undefined
2374
- }): CodeDocument {
2375
- const artifacts: Array<Artifact> = []
2376
-
2377
- const ts = topologicalSort(multiDocument.references)
2378
-
2379
- // Phase 1: Build sanitization map with collision handling
2380
- const sanitizedReferenceMap = new Map<string, string>()
2381
- const uniqueSanitizedReferences = new Set<string>()
2382
- const referenceCount = new Map<string, number>()
2383
-
2384
- // Process all references first to build the map
2385
- const allRefs = [
2386
- ...ts.nonRecursives.map(({ $ref }) => $ref),
2387
- ...Object.keys(ts.recursives)
2388
- ]
2389
-
2390
- for (const ref of allRefs) {
2391
- ensureUniqueSanitized(ref)
2392
- }
2393
-
2394
- // Phase 2: Use the map when processing references
2395
- const nonRecursives = ts.nonRecursives.map(({ $ref, representation }) => ({
2396
- $ref: sanitizedReferenceMap.get($ref)!,
2397
- code: recur(representation)
2398
- }))
2399
- const recursives = Rec.mapEntries(ts.recursives, (representation, $ref) => [
2400
- sanitizedReferenceMap.get($ref)!,
2401
- recur(representation)
2402
- ])
2403
-
2404
- const codes = multiDocument.representations.map(recur)
2405
-
2406
- return {
2407
- codes,
2408
- references: {
2409
- nonRecursives: nonRecursives.filter(({ $ref }) => (referenceCount.get($ref) ?? 0) > 0),
2410
- recursives: Rec.filter(recursives, (_, $ref) => (referenceCount.get($ref) ?? 0) > 0)
2411
- },
2412
- artifacts
2413
- }
2414
-
2415
- function ensureUniqueSanitized(originalRef: string): string {
2416
- // Check if already mapped (consistency)
2417
- const sanitized = sanitizedReferenceMap.get(originalRef)
2418
- if (sanitized !== undefined) {
2419
- return sanitized
2420
- }
2421
-
2422
- // Find unique sanitized name
2423
- const seed = sanitizeJavaScriptIdentifier(originalRef)
2424
- let candidate = seed
2425
- let suffix = 0
2426
-
2427
- while (uniqueSanitizedReferences.has(candidate)) {
2428
- candidate = `${seed}${++suffix}`
2429
- }
2430
-
2431
- uniqueSanitizedReferences.add(candidate)
2432
- sanitizedReferenceMap.set(originalRef, candidate)
2433
- return candidate
2434
- }
2435
-
2436
- function addSymbol(s: symbol): string {
2437
- const identifier = ensureUniqueSanitized("_symbol")
2438
- const key = globalThis.Symbol.keyFor(s)
2439
- const description = s.description
2440
- const generation = key === undefined
2441
- ? makeCode(`Symbol(${description === undefined ? "" : format(description)})`, `typeof ${identifier}`)
2442
- : makeCode(`Symbol.for(${format(key)})`, `typeof ${identifier}`)
2443
- artifacts.push({ _tag: "Symbol", identifier, generation })
2444
- return identifier
2445
- }
2446
-
2447
- function addEnum(s: Enum): string {
2448
- const identifier = ensureUniqueSanitized("_Enum")
2449
- artifacts.push({
2450
- _tag: "Enum",
2451
- identifier,
2452
- generation: makeCode(
2453
- `enum ${identifier} { ${s.enums.map(([name, value]) => `${format(name)}: ${format(value)}`).join(", ")} }`,
2454
- `typeof ${identifier}`
2455
- )
2456
- })
2457
- return identifier
2458
- }
2459
-
2460
- function addImport(importDeclaration: string) {
2461
- if (!artifacts.some((a) => a._tag === "Import" && a.importDeclaration === importDeclaration)) {
2462
- artifacts.push({ _tag: "Import", importDeclaration })
2463
- }
2464
- }
2465
-
2466
- function recur(s: Representation): Code {
2467
- const g = on(s)
2468
- switch (s._tag) {
2469
- default:
2470
- return makeCode(
2471
- g.runtime + toRuntimeAnnotate(s.annotations) + toRuntimeBrand(s.annotations),
2472
- g.Type + toTypeBrand(s.annotations)
2473
- )
2474
- case "Reference":
2475
- return g
2476
- case "Declaration":
2477
- case "String":
2478
- case "Number":
2479
- case "BigInt":
2480
- case "Arrays":
2481
- case "Objects":
2482
- case "Suspend":
2483
- return makeCode(
2484
- g.runtime + toRuntimeAnnotate(s.annotations) + toRuntimeBrand(s.annotations) + toRuntimeChecks(s.checks),
2485
- g.Type + toTypeBrand(s.annotations) + toTypeChecks(s.checks)
2486
- )
2487
- }
2488
- }
2489
-
2490
- function on(s: Representation): Code {
2491
- switch (s._tag) {
2492
- case "Declaration": {
2493
- // if there is a reviver, use it to generate the generation
2494
- if (options?.reviver !== undefined) {
2495
- // the reviver can return `undefined` to indicate that the generation should be generated by the default logic
2496
- const out = options.reviver(s, recur)
2497
- if (out !== undefined) {
2498
- return out
2499
- }
2500
- }
2501
- // otherwise, use the generation from the annotations
2502
- const generation = s.annotations?.generation
2503
- if (
2504
- Predicate.isObject(generation) && typeof generation.runtime === "string" &&
2505
- typeof generation.Type === "string"
2506
- ) {
2507
- const typeParameters = s.typeParameters.map(recur)
2508
- if (typeof generation.importDeclaration === "string") {
2509
- addImport(generation.importDeclaration)
2510
- }
2511
- return makeCode(
2512
- replacePlaceholders(generation.runtime, typeParameters.map((p) => p.runtime)),
2513
- replacePlaceholders(generation.Type, typeParameters.map((p) => p.Type))
2514
- )
2515
- }
2516
- // otherwise, use the generation from the encoded schema
2517
- return recur(s.encodedSchema)
2518
- }
2519
- case "Reference": {
2520
- const sanitized = ensureUniqueSanitized(s.$ref)
2521
- referenceCount.set(sanitized, (referenceCount.get(sanitized) ?? 0) + 1)
2522
- return makeCode(sanitized, sanitized)
2523
- }
2524
- case "Suspend": {
2525
- const thunk = recur(s.thunk)
2526
- return makeCode(
2527
- `Schema.suspend((): Schema.Codec<${thunk.Type}> => ${thunk.runtime})`,
2528
- thunk.Type
2529
- )
2530
- }
2531
- case "Null":
2532
- return makeCode(`Schema.Null`, "null")
2533
- case "Undefined":
2534
- return makeCode(`Schema.Undefined`, "undefined")
2535
- case "Void":
2536
- return makeCode(`Schema.Void`, "void")
2537
- case "Never":
2538
- return makeCode(`Schema.Never`, "never")
2539
- case "Unknown":
2540
- return makeCode(`Schema.Unknown`, "unknown")
2541
- case "Any":
2542
- return makeCode(`Schema.Any`, "any")
2543
- case "Number":
2544
- return makeCode(`Schema.Number`, "number")
2545
- case "Boolean":
2546
- return makeCode(`Schema.Boolean`, "boolean")
2547
- case "BigInt":
2548
- return makeCode(`Schema.BigInt`, "bigint")
2549
- case "Symbol":
2550
- return makeCode(`Schema.Symbol`, "symbol")
2551
- case "String": {
2552
- const contentMediaType = s.contentMediaType
2553
- const contentSchema = s.contentSchema
2554
- if (contentMediaType === "application/json" && contentSchema !== undefined) {
2555
- return makeCode(`Schema.fromJsonString(${recur(contentSchema)})`, "string")
2556
- } else {
2557
- return makeCode(`Schema.String`, "string")
2558
- }
2559
- }
2560
- case "Literal": {
2561
- const literal = format(s.literal)
2562
- return makeCode(`Schema.Literal(${literal})`, literal)
2563
- }
2564
- case "UniqueSymbol": {
2565
- const identifier = addSymbol(s.symbol)
2566
- return makeCode(`Schema.UniqueSymbol(${identifier})`, `typeof ${identifier}`)
2567
- }
2568
- case "ObjectKeyword":
2569
- return makeCode(`Schema.ObjectKeyword`, "object")
2570
- case "Enum": {
2571
- const identifier = addEnum(s)
2572
- return makeCode(`Schema.Enum(${identifier})`, `typeof ${identifier}`)
2573
- }
2574
- case "TemplateLiteral": {
2575
- const parts = s.parts.map(recur)
2576
- const type = toTypeParts(s.parts).map((p) => "`" + p + "`").join(" | ")
2577
- return makeCode(`Schema.TemplateLiteral([${parts.map((p) => p.runtime).join(", ")}])`, type)
2578
- }
2579
- case "Arrays": {
2580
- const elements = s.elements.map((e) => {
2581
- return {
2582
- isOptional: e.isOptional,
2583
- type: recur(e.type),
2584
- annotations: e.annotations
2585
- }
2586
- })
2587
-
2588
- const rest = s.rest.map(recur)
2589
-
2590
- if (Arr.isArrayNonEmpty(rest)) {
2591
- const item = rest[0]
2592
- if (elements.length === 0 && rest.length === 1) {
2593
- return makeCode(
2594
- `Schema.Array(${item.runtime})`,
2595
- `ReadonlyArray<${item.Type}>`
2596
- )
2597
- }
2598
- const post = rest.slice(1)
2599
- return makeCode(
2600
- `Schema.TupleWithRest(Schema.Tuple([${
2601
- elements.map((e) =>
2602
- toRuntimeIsOptional(e.isOptional, e.type.runtime) + toRuntimeAnnotateKey(e.annotations)
2603
- ).join(", ")
2604
- }]), [${rest.map((r) => r.runtime).join(", ")}])`,
2605
- `readonly [${
2606
- elements.map((e) => toTypeIsOptional(e.isOptional, e.type.Type)).join(", ")
2607
- }, ...Array<${item.Type}>${post.length > 0 ? `, ${post.map((p) => p.Type).join(", ")}` : ""}]`
2608
- )
2609
- }
2610
- return makeCode(
2611
- `Schema.Tuple([${
2612
- elements.map((e) => toRuntimeIsOptional(e.isOptional, e.type.runtime) + toRuntimeAnnotateKey(e.annotations))
2613
- .join(", ")
2614
- }])`,
2615
- `readonly [${elements.map((e) => toTypeIsOptional(e.isOptional, e.type.Type)).join(", ")}]`
2616
- )
2617
- }
2618
- case "Objects": {
2619
- const pss = s.propertySignatures.map((p) => {
2620
- const isSymbol = typeof p.name === "symbol"
2621
- const name = isSymbol ? addSymbol(p.name) : formatPropertyKey(p.name)
2622
- const nameType = toTypeIsOptional(
2623
- p.isOptional,
2624
- toTypeIsMutable(p.isMutable, isSymbol ? `[typeof ${name}]` : name)
2625
- )
2626
- const type = recur(p.type)
2627
- return makeCode(
2628
- `${isSymbol ? `[${name}]` : name}: ${
2629
- toRuntimeIsOptional(p.isOptional, toRuntimeIsMutable(p.isMutable, type.runtime))
2630
- }` +
2631
- toRuntimeAnnotateKey(p.annotations),
2632
- `${nameType}: ${type.Type}`
2633
- )
2634
- })
2635
-
2636
- const iss = s.indexSignatures.map((is) => {
2637
- return {
2638
- parameter: recur(is.parameter),
2639
- type: recur(is.type)
2640
- }
2641
- })
2642
-
2643
- if (iss.length === 0) {
2644
- // 1) Only properties -> Struct
2645
- return makeCode(
2646
- `Schema.Struct({ ${pss.map((p) => p.runtime).join(", ")} })`,
2647
- `{ ${pss.map((p) => p.Type).join(", ")} }`
2648
- )
2649
- } else if (pss.length === 0 && iss.length === 1) {
2650
- // 2) Only one index signature and no properties -> Record
2651
- return makeCode(
2652
- `Schema.Record(${iss[0].parameter.runtime}, ${iss[0].type.runtime})`,
2653
- `{ readonly [x: ${iss[0].parameter.Type}]: ${iss[0].type.Type} }`
2654
- )
2655
- } else {
2656
- // 3) Properties + index signatures -> StructWithRest
2657
- return makeCode(
2658
- `Schema.StructWithRest(Schema.Struct({ ${pss.map((p) => p.runtime).join(", ")} }), [${
2659
- iss.map((is) => `Schema.Record(${is.parameter.runtime}, ${is.type.runtime})`).join(", ")
2660
- }])`,
2661
- `{ ${pss.map((p) => p.Type).join(", ")}, ${
2662
- iss.map((is) => `readonly [x: ${is.parameter.Type}]: ${is.type.Type}`).join(", ")
2663
- } }`
2664
- )
2665
- }
2666
- }
2667
- case "Union": {
2668
- if (s.types.length === 0) {
2669
- return makeCode("Schema.Never", "never")
2670
- }
2671
- if (s.types.every((t) => t._tag === "Literal")) {
2672
- const literals = s.types.map((l) => format(l.literal))
2673
- if (literals.length === 1) {
2674
- return makeCode(`Schema.Literal(${literals[0]})`, literals[0])
2675
- }
2676
- return makeCode(`Schema.Literals([${literals.join(", ")}])`, literals.join(" | "))
2677
- }
2678
- const mode = s.mode === "anyOf" ? "" : `, { mode: "oneOf" }`
2679
- const types = s.types.map((t) => recur(t))
2680
- return makeCode(
2681
- `Schema.Union([${types.map((t) => t.runtime).join(", ")}]${mode})`,
2682
- types.map((t) => t.Type).join(" | ")
2683
- )
2684
- }
2685
- }
2686
- }
2687
-
2688
- function toTypeBrand(annotations: Schema.Annotations.Annotations | undefined): string {
2689
- const brands = collectBrands(annotations)
2690
- if (brands.length === 0) return ""
2691
- addImport(`import type * as Brand from "effect/Brand"`)
2692
- return brands.map((b) => ` & Brand.Brand<${format(b)}>`).join("")
2693
- }
2694
-
2695
- function toTypeChecks(checks: ReadonlyArray<Check<Meta>>): string {
2696
- return checks.map((c) => toTypeCheck(c)).join("")
2697
- }
2698
-
2699
- function toTypeCheck(check: Check<Meta>): string {
2700
- switch (check._tag) {
2701
- case "Filter":
2702
- return toTypeBrand(check.annotations)
2703
- case "FilterGroup": {
2704
- return toTypeChecks(check.checks)
2705
- }
2706
- }
2707
- }
2708
-
2709
- function toRuntimeChecks(checks: ReadonlyArray<Check<Meta>>): string {
2710
- return checks.map((c) => `.check(${toRuntimeCheck(c)})` + toRuntimeBrand(c.annotations)).join("")
2711
- }
2712
-
2713
- function toRuntimeCheck(check: Check<Meta>): string {
2714
- switch (check._tag) {
2715
- case "Filter":
2716
- return toRuntimeFilter(check)
2717
- case "FilterGroup": {
2718
- const a = toRuntimeAnnotations(check.annotations)
2719
- const ca = a === "" ? "" : `, ${a}`
2720
- return `Schema.makeFilterGroup([${check.checks.map((c) => toRuntimeCheck(c)).join(", ")}]${ca})`
2721
- }
2722
- }
2723
- }
2724
-
2725
- function toRuntimeFilter(filter: Filter<Meta>): string {
2726
- const a = toRuntimeAnnotations(filter.annotations)
2727
- const ca = a === "" ? "" : `, ${a}`
2728
- switch (filter.meta._tag) {
2729
- case "isTrimmed":
2730
- case "isGUID":
2731
- case "isULID":
2732
- case "isBase64":
2733
- case "isBase64Url":
2734
- case "isUppercased":
2735
- case "isLowercased":
2736
- case "isCapitalized":
2737
- case "isUncapitalized":
2738
- case "isFinite":
2739
- case "isInt":
2740
- case "isUnique":
2741
- case "isDateValid":
2742
- return `Schema.${filter.meta._tag}(${a})`
2743
-
2744
- case "isStringFinite":
2745
- case "isStringBigInt":
2746
- case "isStringSymbol":
2747
- case "isPattern":
2748
- return `Schema.${filter.meta._tag}(${toRuntimeRegExp(filter.meta.regExp)}${ca})`
2749
-
2750
- case "isMinLength":
2751
- return `Schema.isMinLength(${filter.meta.minLength}${ca})`
2752
- case "isMaxLength":
2753
- return `Schema.isMaxLength(${filter.meta.maxLength}${ca})`
2754
- case "isLengthBetween":
2755
- return `Schema.isLengthBetween(${filter.meta.minimum}, ${filter.meta.maximum}${ca})`
2756
- case "isUUID":
2757
- return `Schema.isUUID(${filter.meta.version}${ca})`
2758
- case "isStartsWith":
2759
- return `Schema.isStartsWith(${format(filter.meta.startsWith)}${ca})`
2760
- case "isEndsWith":
2761
- return `Schema.isEndsWith(${format(filter.meta.endsWith)}${ca})`
2762
- case "isIncludes":
2763
- return `Schema.isIncludes(${format(filter.meta.includes)}${ca})`
2764
-
2765
- case "isGreaterThan":
2766
- case "isGreaterThanBigInt":
2767
- case "isGreaterThanDate":
2768
- return `Schema.${filter.meta._tag}(${toRuntimeValue(filter.meta.exclusiveMinimum)}${ca})`
2769
- case "isGreaterThanOrEqualTo":
2770
- case "isGreaterThanOrEqualToBigInt":
2771
- case "isGreaterThanOrEqualToDate":
2772
- return `Schema.${filter.meta._tag}(${toRuntimeValue(filter.meta.minimum)}${ca})`
2773
- case "isLessThan":
2774
- case "isLessThanBigInt":
2775
- case "isLessThanDate":
2776
- return `Schema.${filter.meta._tag}(${toRuntimeValue(filter.meta.exclusiveMaximum)}${ca})`
2777
- case "isLessThanOrEqualTo":
2778
- case "isLessThanOrEqualToBigInt":
2779
- case "isLessThanOrEqualToDate":
2780
- return `Schema.${filter.meta._tag}(${toRuntimeValue(filter.meta.maximum)}${ca})`
2781
- case "isBetween":
2782
- case "isBetweenBigInt":
2783
- case "isBetweenDate":
2784
- return `Schema.${filter.meta._tag}({ minimum: ${toRuntimeValue(filter.meta.minimum)}, maximum: ${
2785
- toRuntimeValue(filter.meta.maximum)
2786
- }, exclusiveMinimum: ${toRuntimeValue(filter.meta.exclusiveMinimum)}, exclusiveMaximum: ${
2787
- toRuntimeValue(filter.meta.exclusiveMaximum)
2788
- }${ca})`
2789
-
2790
- case "isMultipleOf":
2791
- return `Schema.isMultipleOf(${filter.meta.divisor}${ca})`
2792
-
2793
- case "isMinProperties":
2794
- return `Schema.isMinProperties(${filter.meta.minProperties}${ca})`
2795
- case "isMaxProperties":
2796
- return `Schema.isMaxProperties(${filter.meta.maxProperties}${ca})`
2797
- case "isPropertiesLengthBetween":
2798
- return `Schema.isPropertiesLengthBetween(${filter.meta.minimum}, ${filter.meta.maximum}${ca})`
2799
- case "isPropertyNames":
2800
- return `Schema.isPropertyNames(${recur(filter.meta.propertyNames).runtime}${ca})`
2801
-
2802
- case "isMinSize":
2803
- return `Schema.isMinSize(${filter.meta.minSize}${ca})`
2804
- case "isMaxSize":
2805
- return `Schema.isMaxSize(${filter.meta.maxSize}${ca})`
2806
- case "isSizeBetween":
2807
- return `Schema.isSizeBetween(${filter.meta.minimum}, ${filter.meta.maximum}${ca})`
2808
- }
2809
- }
2810
- }
2811
-
2812
- const VALID_ASCII_UPPER_JAVASCRIPT_IDENTIFIER_REGEXP = /^[A-Z_$][A-Za-z0-9_$]*$/
2813
-
2814
- /**
2815
- * Converts an arbitrary string into a valid (ASCII) JavaScript identifier
2816
- * starting with an uppercase letter, `$`, or `_`.
2817
- *
2818
- * - Replaces invalid identifier characters with `_`
2819
- * - Uppercases a leading ASCII letter
2820
- * - If the first character is a digit, prefixes `_`
2821
- * - Empty input becomes `_`
2822
- *
2823
- * @internal
2824
- */
2825
- export function sanitizeJavaScriptIdentifier(s: string): string {
2826
- if (s.length === 0) return "_"
2827
- if (VALID_ASCII_UPPER_JAVASCRIPT_IDENTIFIER_REGEXP.test(s)) return s
2828
-
2829
- const out: Array<string> = []
2830
- let needsPrefix = false
2831
- let i = 0
2832
-
2833
- for (const ch of s) {
2834
- if (i === 0) {
2835
- if (ch === "_" || ch === "$" || (ch >= "A" && ch <= "Z")) {
2836
- out.push(ch)
2837
- } else if (ch >= "a" && ch <= "z") {
2838
- out.push(ch.toUpperCase())
2839
- } else if (ch >= "0" && ch <= "9") {
2840
- out.push(ch)
2841
- needsPrefix = true
2842
- } else {
2843
- out.push("_")
2844
- }
2845
- } else {
2846
- out.push(isAsciiIdPart(ch) ? ch : "_")
2847
- }
2848
- i++
2849
- }
2850
-
2851
- return needsPrefix ? "_" + out.join("") : out.join("")
2852
- }
2853
-
2854
- function isAsciiIdStart(ch: string): boolean {
2855
- return (
2856
- ch === "_" ||
2857
- ch === "$" ||
2858
- (ch >= "A" && ch <= "Z") ||
2859
- (ch >= "a" && ch <= "z")
2860
- )
2861
- }
2862
-
2863
- function isAsciiIdPart(ch: string): boolean {
2864
- return isAsciiIdStart(ch) || (ch >= "0" && ch <= "9")
2865
- }
2866
-
2867
- function replacePlaceholders(template: string, items: ReadonlyArray<string>) {
2868
- let i = 0
2869
- return template.replace(/\?/g, () => items[i++]);
2870
- }
2871
-
2872
- function toTypeParts(parts: ReadonlyArray<Representation>): ReadonlyArray<string> {
2873
- if (parts.length === 0) {
2874
- return [""]
2875
- }
2876
- const [first, ...rest] = parts
2877
- const restPatterns = toTypeParts(rest)
2878
- return toTypePart(first).flatMap((f) => restPatterns.map((r) => f + r))
2879
- }
2880
-
2881
- function toTypePart(r: Representation): ReadonlyArray<string> {
2882
- switch (r._tag) {
2883
- case "Literal":
2884
- return [globalThis.String(r.literal)]
2885
- case "String":
2886
- return ["${string}"]
2887
- case "Number":
2888
- return ["${number}"]
2889
- case "BigInt":
2890
- return ["${bigint}"]
2891
- case "TemplateLiteral":
2892
- return toTypeParts(r.parts)
2893
- case "Union":
2894
- return r.types.flatMap(toTypePart)
2895
- default:
2896
- return []
2897
- }
2898
- }
2899
-
2900
- const toCodeAnnotationsBlacklist: Set<string> = new Set([
2901
- ...toJsonAnnotationsBlacklist,
2902
- "typeConstructor",
2903
- "generation",
2904
- "brands"
2905
- ])
2906
-
2907
- function toRuntimeAnnotations(annotations: Schema.Annotations.Annotations | undefined): string {
2908
- if (!annotations) return ""
2909
- const entries: Array<string> = []
2910
- for (const [key, value] of Object.entries(annotations)) {
2911
- if (toCodeAnnotationsBlacklist.has(key)) continue
2912
- entries.push(`${formatPropertyKey(key)}: ${format(value)}`)
2913
- }
2914
- if (entries.length === 0) return ""
2915
- return `{ ${entries.join(", ")} }`
2916
- }
2917
-
2918
- function toRuntimeBrand(annotations: Schema.Annotations.Annotations | undefined): string {
2919
- const brands = collectBrands(annotations)
2920
- return brands.length > 0 ? `.pipe(${brands.map((b) => `Schema.brand(${format(b)})`).join(", ")})` : ""
2921
- }
2922
-
2923
- function toRuntimeAnnotate(annotations: Schema.Annotations.Annotations | undefined): string {
2924
- const s = toRuntimeAnnotations(annotations)
2925
- return s === "" ? "" : `.annotate(${s})`
2926
- }
2927
-
2928
- function toRuntimeAnnotateKey(annotations: Schema.Annotations.Annotations | undefined): string {
2929
- const s = toRuntimeAnnotations(annotations)
2930
- return s === "" ? "" : `.annotateKey(${s})`
2931
- }
2932
-
2933
- function toRuntimeIsOptional(isOptional: boolean, runtime: string): string {
2934
- return isOptional ? `Schema.optionalKey(${runtime})` : runtime
2935
- }
2936
-
2937
- function toTypeIsOptional(isOptional: boolean, type: string): string {
2938
- return isOptional ? `${type}?` : type
2939
- }
2940
-
2941
- function toRuntimeIsMutable(isMutable: boolean, runtime: string): string {
2942
- return isMutable ? `Schema.mutableKey(${runtime})` : runtime
2943
- }
2944
-
2945
- function toTypeIsMutable(isMutable: boolean, type: string): string {
2946
- return isMutable ? type : `readonly ${type}`
2947
- }
2948
-
2949
- function toRuntimeValue(value: undefined | number | boolean | bigint | Date): string {
2950
- if (value instanceof Date) {
2951
- return `new Date(${value.getTime()})`
2952
- }
2953
- return format(value)
2954
- }
2955
-
2956
- function toRuntimeRegExp(regExp: RegExp): string {
2957
- const args = [format(regExp.source)]
2958
- const flags = regExp.flags.trim()
2959
- if (flags !== "") {
2960
- args.push(format(flags))
2961
- }
2962
- return `new RegExp(${args.join(", ")})`
2963
- }
2964
-
2965
- /**
2966
- * Parses a Draft 2020-12 JSON Schema document into a {@link Document}.
2967
- *
2968
- * **When to use**
2969
- *
2970
- * Use when you need to import a Draft 2020-12 JSON Schema document into the
2971
- * Effect schema representation system.
2972
- *
2973
- * **Details**
2974
- *
2975
- * `options.onEnter` is an optional hook called on each JSON Schema node before
2976
- * processing, allowing pre-transformation.
2977
- *
2978
- * **Gotchas**
2979
- *
2980
- * JSON Schema import is best-effort. Some JSON Schema constructs do not map
2981
- * exactly to Effect schema representations, and importing a schema previously
2982
- * emitted by `toJsonSchemaDocument` may produce an equivalent approximation
2983
- * rather than the original representation shape.
2984
- *
2985
- * This throws if a `$ref` cannot be resolved within the document's definitions.
2986
- * Circular `$ref`s are detected and cause an error.
2987
- *
2988
- * @see {@link Document}
2989
- * @see {@link toJsonSchemaDocument}
2990
- * @see {@link fromJsonSchemaMultiDocument}
2991
- *
2992
- * @category constructors
2993
- * @since 4.0.0
2994
- */
2995
- export function fromJsonSchemaDocument(document: JsonSchema.Document<"draft-2020-12">, options?: {
2996
- readonly onEnter?: ((js: JsonSchema.JsonSchema) => JsonSchema.JsonSchema) | undefined
2997
- }): Document {
2998
- const { references, representations: schemas } = fromJsonSchemaMultiDocument({
2999
- dialect: document.dialect,
3000
- schemas: [document.schema],
3001
- definitions: document.definitions
3002
- }, options)
3003
- return {
3004
- representation: schemas[0],
3005
- references
3006
- }
3007
- }
3008
-
3009
- /**
3010
- * Parses a Draft 2020-12 JSON Schema multi-document into a
3011
- * {@link MultiDocument}.
3012
- *
3013
- * **When to use**
3014
- *
3015
- * Use when you need to import a Draft 2020-12 JSON Schema multi-document whose
3016
- * schemas share definitions.
3017
- *
3018
- * **Details**
3019
- *
3020
- * `options.onEnter` is an optional hook called on each JSON Schema node before
3021
- * processing.
3022
- *
3023
- * **Gotchas**
3024
- *
3025
- * JSON Schema import is best-effort. Some JSON Schema constructs do not map
3026
- * exactly to Effect schema representations, and importing schemas previously
3027
- * emitted by `toJsonSchemaMultiDocument` may produce equivalent approximations
3028
- * rather than the original representation shapes.
3029
- *
3030
- * This throws if a `$ref` cannot be resolved.
3031
- *
3032
- * @see {@link MultiDocument}
3033
- * @see {@link toJsonSchemaMultiDocument}
3034
- * @see {@link fromJsonSchemaDocument}
3035
- *
3036
- * @category constructors
3037
- * @since 4.0.0
3038
- */
3039
- export function fromJsonSchemaMultiDocument(document: JsonSchema.MultiDocument<"draft-2020-12">, options?: {
3040
- readonly onEnter?: ((js: JsonSchema.JsonSchema) => JsonSchema.JsonSchema) | undefined
3041
- }): MultiDocument {
3042
- let definitionIdentifier: string | undefined
3043
- const references: Record<string, Representation> = {}
3044
-
3045
- type ResolvedReference = Exclude<Representation, { _tag: "Reference" }>
3046
- const resolvedReferences = new Map<string, ResolvedReference | null>()
3047
-
3048
- function resolveReference($ref: string): ResolvedReference {
3049
- const definition = document.definitions[$ref]
3050
- if (definition === undefined) {
3051
- throw new Error(`Reference ${$ref} not found`)
3052
- }
3053
-
3054
- const resolved = resolvedReferences.get($ref)
3055
- if (resolved === null) {
3056
- throw new Error(`Circular reference detected: ${$ref}`)
3057
- }
3058
- if (resolved !== undefined) return resolved
3059
-
3060
- resolvedReferences.set($ref, null)
3061
- const value = recur(definition)
3062
- const out = value._tag === "Reference" ? resolveReference(value.$ref) : value
3063
- resolvedReferences.set($ref, out)
3064
- return out
3065
- }
3066
-
3067
- for (const [identifier, definition] of Object.entries(document.definitions)) {
3068
- definitionIdentifier = identifier
3069
- references[identifier] = unknownToJson(recur(definition))
3070
- }
3071
-
3072
- definitionIdentifier = undefined
3073
- const representations = Arr.map(document.schemas, (schema) => unknownToJson(recur(schema)))
3074
- return {
3075
- representations,
3076
- references
3077
- }
3078
-
3079
- function recur(u: unknown): Representation {
3080
- if (u === false) return never
3081
- if (!Predicate.isObject(u)) return unknown
3082
-
3083
- let js: JsonSchema.JsonSchema = options?.onEnter?.(u) ?? u
3084
- if (Array.isArray(js.type)) {
3085
- if (js.type.every(isType)) {
3086
- const { type, ...rest } = js
3087
- js = {
3088
- anyOf: type.map((type) => ({ type })),
3089
- ...rest
3090
- }
3091
- } else {
3092
- js = {}
3093
- }
3094
- }
3095
-
3096
- let out = on(js)
3097
-
3098
- const annotations = collectAnnotations(js)
3099
- if (annotations !== undefined) {
3100
- out = combine(out, { _tag: "Unknown", annotations })
3101
- }
3102
-
3103
- if (Array.isArray(js.allOf)) {
3104
- out = js.allOf.reduce((acc, curr) => combine(acc, recur(curr)), out)
3105
- }
3106
- if (Array.isArray(js.anyOf)) {
3107
- out = combine({ _tag: "Union", types: js.anyOf.map((type) => recur(type)), mode: "anyOf" }, out)
3108
- }
3109
- if (Array.isArray(js.oneOf)) {
3110
- out = combine({ _tag: "Union", types: js.oneOf.map((type) => recur(type)), mode: "oneOf" }, out)
3111
- }
3112
-
3113
- return out
3114
- }
3115
-
3116
- function on(js: JsonSchema.JsonSchema): Representation {
3117
- if (typeof js.$ref === "string") {
3118
- const $ref = js.$ref.slice(2).split("/").at(-1)
3119
- if ($ref !== undefined) {
3120
- const reference: Reference = { _tag: "Reference", $ref: unescapeToken($ref) }
3121
- if (definitionIdentifier === $ref) {
3122
- return { _tag: "Suspend", thunk: reference, checks: [] }
3123
- } else {
3124
- return reference
3125
- }
3126
- }
3127
- } else if ("const" in js) {
3128
- if (isLiteralValue(js.const)) {
3129
- return { _tag: "Literal", literal: js.const }
3130
- } else if (js.const === null) {
3131
- return null_
3132
- }
3133
- } else if (Array.isArray(js.enum)) {
3134
- const types: Array<Representation> = []
3135
- for (const e of js.enum) {
3136
- if (isLiteralValue(e)) {
3137
- types.push({ _tag: "Literal", literal: e })
3138
- } else if (e === null) {
3139
- types.push(null_)
3140
- } else {
3141
- types.push(recur(e))
3142
- }
3143
- }
3144
- if (types.length === 1) {
3145
- return types[0]
3146
- } else {
3147
- return { _tag: "Union", types, mode: "anyOf" }
3148
- }
3149
- }
3150
-
3151
- const type = isType(js.type) ? js.type : getType(js)
3152
- if (type !== undefined) {
3153
- switch (type) {
3154
- case "null":
3155
- return null_
3156
- case "string": {
3157
- const checks = collectStringChecks(js)
3158
- if (checks.length > 0) {
3159
- return { ...string, checks }
3160
- }
3161
- return string
3162
- }
3163
- case "number":
3164
- return {
3165
- _tag: "Number",
3166
- checks: [{ _tag: "Filter", meta: { _tag: "isFinite" } }, ...collectNumberChecks(js)]
3167
- }
3168
- case "integer":
3169
- return {
3170
- _tag: "Number",
3171
- checks: [{ _tag: "Filter", meta: { _tag: "isInt" } }, ...collectNumberChecks(js)]
3172
- }
3173
- case "boolean":
3174
- return boolean
3175
- case "array": {
3176
- const minItems = typeof js.minItems === "number" ? js.minItems : 0
3177
-
3178
- const elements: Array<Element> = (Array.isArray(js.prefixItems) ? js.prefixItems : []).map((e, i) => ({
3179
- isOptional: i + 1 > minItems,
3180
- type: recur(e)
3181
- }))
3182
-
3183
- const rest: Array<Representation> = js.items !== undefined ?
3184
- [recur(js.items)]
3185
- : js.prefixItems !== undefined && typeof js.maxItems === "number"
3186
- ? []
3187
- : [unknown]
3188
-
3189
- return { _tag: "Arrays", elements, rest, checks: collectArraysChecks(js) }
3190
- }
3191
- case "object": {
3192
- return {
3193
- _tag: "Objects",
3194
- propertySignatures: collectProperties(js),
3195
- indexSignatures: collectIndexSignatures(js),
3196
- checks: collectObjectsChecks(js)
3197
- }
3198
- }
3199
- }
3200
- }
3201
-
3202
- return { _tag: "Unknown" }
3203
- }
3204
-
3205
- function collectObjectsChecks(js: JsonSchema.JsonSchema): Array<Check<ObjectsMeta>> {
3206
- const checks: Array<Check<ObjectsMeta>> = []
3207
- if (typeof js.minProperties === "number") {
3208
- checks.push({ _tag: "Filter", meta: { _tag: "isMinProperties", minProperties: js.minProperties } })
3209
- }
3210
- if (typeof js.maxProperties === "number") {
3211
- checks.push({ _tag: "Filter", meta: { _tag: "isMaxProperties", maxProperties: js.maxProperties } })
3212
- }
3213
- if (js.propertyNames !== undefined) {
3214
- const propertyNames = recur(js.propertyNames)
3215
- checks.push({ _tag: "Filter", meta: { _tag: "isPropertyNames", propertyNames } })
3216
- }
3217
- return checks
3218
- }
3219
-
3220
- function combine(a: Representation, b: Representation): Representation {
3221
- switch (a._tag) {
3222
- default:
3223
- return never
3224
- case "Reference":
3225
- return combine(resolveReference(a.$ref), b)
3226
- case "Never":
3227
- return a
3228
- case "Unknown": {
3229
- const resolved = b._tag === "Reference" ? resolveReference(b.$ref) : b
3230
- return { ...resolved, ...combineAnnotations(a.annotations, resolved.annotations) }
3231
- }
3232
- case "Null":
3233
- case "String":
3234
- case "Number":
3235
- case "Boolean":
3236
- case "Literal":
3237
- case "Arrays":
3238
- case "Objects":
3239
- case "Union":
3240
- break
3241
- }
3242
-
3243
- if (b._tag === "Reference") {
3244
- return combine(a, resolveReference(b.$ref))
3245
- }
3246
- if (b._tag === "Unknown") {
3247
- return { ...a, ...combineAnnotations(a.annotations, b.annotations) }
3248
- }
3249
- if (a._tag === "Union") {
3250
- const types = a.types.map((s) => combine(s, b)).filter((s) => s !== never)
3251
- if (types.length === 0) return never
3252
- return {
3253
- _tag: "Union",
3254
- types,
3255
- mode: a.mode,
3256
- ...makeAnnotations(a.annotations)
3257
- }
3258
- }
3259
- if (b._tag === "Union") {
3260
- return combine(b, a)
3261
- }
3262
-
3263
- switch (a._tag) {
3264
- case "Null":
3265
- return b._tag === "Null" ? { ...a, ...combineAnnotations(a.annotations, b.annotations) } : never
3266
- case "String": {
3267
- if (b._tag === "Literal") {
3268
- return satisfiesLiteral(a, b) ? { ...b, ...combineAnnotations(a.annotations, b.annotations) } : never
3269
- }
3270
- if (b._tag !== "String") return never
3271
- const checks = combineChecks(a.checks, b.checks, b.annotations)
3272
- return {
3273
- _tag: "String",
3274
- checks: checks ?? a.checks,
3275
- ...combineAnnotations(a.annotations, checks ? undefined : b.annotations)
3276
- }
3277
- }
3278
- case "Number": {
3279
- if (b._tag === "Literal") {
3280
- return satisfiesLiteral(a, b) ? { ...b, ...combineAnnotations(a.annotations, b.annotations) } : never
3281
- }
3282
- if (b._tag !== "Number") return never
3283
- const checks = combineNumberChecks(a.checks, b.checks, b.annotations)
3284
- return {
3285
- _tag: "Number",
3286
- checks: checks ?? a.checks,
3287
- ...combineAnnotations(a.annotations, checks ? undefined : b.annotations)
3288
- }
3289
- }
3290
- case "Boolean":
3291
- if (b._tag === "Boolean") {
3292
- return { _tag: "Boolean", ...combineAnnotations(a.annotations, b.annotations) }
3293
- }
3294
- return b._tag === "Literal" && typeof b.literal === "boolean"
3295
- ? { ...b, ...combineAnnotations(a.annotations, b.annotations) }
3296
- : never
3297
- case "Literal":
3298
- switch (b._tag) {
3299
- case "Literal":
3300
- return a.literal === b.literal
3301
- ? { ...a, ...combineAnnotations(a.annotations, b.annotations) }
3302
- : never
3303
- case "String":
3304
- case "Number":
3305
- return satisfiesLiteral(b, a) ? { ...a, ...combineAnnotations(a.annotations, b.annotations) } : never
3306
- case "Boolean":
3307
- return typeof a.literal === "boolean"
3308
- ? { ...a, ...combineAnnotations(a.annotations, b.annotations) }
3309
- : never
3310
- default:
3311
- return never
3312
- }
3313
- case "Arrays": {
3314
- if (b._tag !== "Arrays") return never
3315
- const arrays = combineArrays(a, b)
3316
- if (arrays === undefined) return never
3317
- const checks = combineArraysChecks(a.checks, b.checks, b.annotations)
3318
- return {
3319
- _tag: "Arrays",
3320
- elements: arrays.elements,
3321
- rest: arrays.rest,
3322
- checks: checks ?? a.checks,
3323
- ...combineAnnotations(a.annotations, checks ? undefined : b.annotations)
3324
- }
3325
- }
3326
- case "Objects": {
3327
- if (b._tag !== "Objects") return never
3328
- const checks = combineChecks(a.checks, b.checks, b.annotations)
3329
- return {
3330
- _tag: "Objects",
3331
- propertySignatures: combinePropertySignatures(a.propertySignatures, b.propertySignatures),
3332
- indexSignatures: combineIndexSignatures(a.indexSignatures, b.indexSignatures),
3333
- checks: checks ?? a.checks,
3334
- ...combineAnnotations(a.annotations, checks ? undefined : b.annotations)
3335
- }
3336
- }
3337
- default:
3338
- return never
3339
- }
3340
- }
3341
-
3342
- function satisfiesPrimitiveCheck(check: Check<Meta>, value: unknown): boolean {
3343
- if (check._tag === "FilterGroup") {
3344
- return check.checks.every((check) => satisfiesPrimitiveCheck(check, value))
3345
- }
3346
- const meta = check.meta
3347
- switch (meta._tag) {
3348
- case "isMinLength":
3349
- return typeof value === "string" && value.length >= meta.minLength
3350
- case "isMaxLength":
3351
- return typeof value === "string" && value.length <= meta.maxLength
3352
- case "isPattern":
3353
- return typeof value === "string" && meta.regExp.test(value)
3354
- case "isFinite":
3355
- return typeof value === "number" && globalThis.Number.isFinite(value)
3356
- case "isInt":
3357
- return typeof value === "number" && globalThis.Number.isSafeInteger(value)
3358
- case "isMultipleOf":
3359
- return typeof value === "number" && remainder(value, meta.divisor) === 0
3360
- case "isGreaterThan":
3361
- return typeof value === "number" && value > meta.exclusiveMinimum
3362
- case "isGreaterThanOrEqualTo":
3363
- return typeof value === "number" && value >= meta.minimum
3364
- case "isLessThan":
3365
- return typeof value === "number" && value < meta.exclusiveMaximum
3366
- case "isLessThanOrEqualTo":
3367
- return typeof value === "number" && value <= meta.maximum
3368
- default:
3369
- return false
3370
- }
3371
- }
3372
-
3373
- function satisfiesLiteral(type: String | Number, literal: Literal): boolean {
3374
- const value = literal.literal
3375
- if (type._tag === "String" ? typeof value !== "string" : typeof value !== "number") {
3376
- return false
3377
- }
3378
- return type.checks.every((check) => satisfiesPrimitiveCheck(check, value))
3379
- }
3380
-
3381
- function collectProperties(js: JsonSchema.JsonSchema): Array<PropertySignature> {
3382
- const properties: Record<string, unknown> = Predicate.isObject(js.properties) ? js.properties : {}
3383
- const required = Array.isArray(js.required) ? js.required : []
3384
- required.forEach((key) => {
3385
- if (!Object.hasOwn(properties, key)) {
3386
- properties[key] = {}
3387
- }
3388
- })
3389
- return Object.entries(properties).map(([key, v]) => ({
3390
- name: key,
3391
- type: recur(v),
3392
- isOptional: !required.includes(key),
3393
- isMutable: false
3394
- }))
3395
- }
3396
-
3397
- function collectIndexSignatures(js: JsonSchema.JsonSchema): Array<IndexSignature> {
3398
- const out: Array<IndexSignature> = []
3399
-
3400
- if (Predicate.isObject(js.patternProperties)) {
3401
- for (const [pattern, value] of Object.entries(js.patternProperties)) {
3402
- out.push({ parameter: recur({ pattern }), type: recur(value) })
3403
- }
3404
- }
3405
-
3406
- if (js.additionalProperties === undefined || js.additionalProperties === true) {
3407
- out.push({ parameter: string, type: unknown })
3408
- } else if (Predicate.isObject(js.additionalProperties)) {
3409
- out.push({ parameter: string, type: recur(js.additionalProperties) })
3410
- }
3411
-
3412
- return out
3413
- }
3414
-
3415
- function combineArrays(a: Arrays, b: Arrays): Pick<Arrays, "elements" | "rest"> | undefined {
3416
- const elements: Array<Element> = []
3417
- const len = Math.max(a.elements.length, b.elements.length)
3418
- for (let i = 0; i < len; i++) {
3419
- const ae = a.elements[i]
3420
- const be = b.elements[i]
3421
- const isOptional = ae?.isOptional !== false && be?.isOptional !== false
3422
- const at = ae?.type ?? a.rest[0]
3423
- const bt = be?.type ?? b.rest[0]
3424
- if (at === undefined || bt === undefined) {
3425
- return isOptional ? { elements, rest: [] } : undefined
3426
- }
3427
- const type = combine(at, bt)
3428
- if (type === never) {
3429
- return isOptional ? { elements, rest: [] } : undefined
3430
- }
3431
- elements.push({ isOptional, type })
3432
- }
3433
-
3434
- const ar = a.rest[0]
3435
- const br = b.rest[0]
3436
- if (ar === undefined || br === undefined) {
3437
- return { elements, rest: [] }
3438
- }
3439
- const rest = combine(ar, br)
3440
- return { elements, rest: rest === never ? [] : [rest] }
3441
- }
3442
-
3443
- function combinePropertySignatures(
3444
- a: ReadonlyArray<PropertySignature>,
3445
- b: ReadonlyArray<PropertySignature>
3446
- ): Array<PropertySignature> {
3447
- const propertySignatures: Array<PropertySignature> = []
3448
- const thatPropertiesMap: Record<PropertyKey, PropertySignature> = {}
3449
- for (const p of b) {
3450
- thatPropertiesMap[p.name] = p
3451
- }
3452
- const keys = new Set<PropertyKey>()
3453
- for (const p of a) {
3454
- keys.add(p.name)
3455
- const thatp = thatPropertiesMap[p.name]
3456
- if (thatp) {
3457
- propertySignatures.push(
3458
- {
3459
- name: p.name,
3460
- type: combine(p.type, thatp.type),
3461
- isOptional: p.isOptional && thatp.isOptional,
3462
- isMutable: p.isMutable
3463
- }
3464
- )
3465
- } else {
3466
- propertySignatures.push(p)
3467
- }
3468
- }
3469
- for (const p of b) {
3470
- if (!keys.has(p.name)) propertySignatures.push(p)
3471
- }
3472
- return propertySignatures
3473
- }
3474
-
3475
- function combineIndexSignatures(
3476
- a: ReadonlyArray<IndexSignature>,
3477
- b: ReadonlyArray<IndexSignature>
3478
- ): Array<IndexSignature> {
3479
- if (a.length === 0 || b.length === 0) return []
3480
- const out: Array<IndexSignature> = [...a]
3481
- for (const is of b) {
3482
- if (is.parameter === string) {
3483
- const i = a.findIndex((is) => is.parameter === string)
3484
- if (i !== -1) {
3485
- out[i] = { parameter: string, type: combine(a[i].type, is.type) }
3486
- } else {
3487
- out.push(is)
3488
- }
3489
- } else {
3490
- out.push(is)
3491
- }
3492
- }
3493
- return out
3494
- }
3495
-
3496
- function unknownToJson(representation: Representation): Representation {
3497
- switch (representation._tag) {
3498
- case "Unknown":
3499
- return representation.annotations === undefined ?
3500
- json :
3501
- {
3502
- ...json,
3503
- annotations: {
3504
- ...json.annotations,
3505
- ...representation.annotations
3506
- }
3507
- }
3508
- case "Suspend": {
3509
- const thunk = unknownToJson(representation.thunk)
3510
- return thunk === representation.thunk ? representation : { ...representation, thunk }
3511
- }
3512
- case "String": {
3513
- if (representation.contentSchema === undefined) return representation
3514
- const contentSchema = unknownToJson(representation.contentSchema)
3515
- return contentSchema === representation.contentSchema ? representation : { ...representation, contentSchema }
3516
- }
3517
- case "Arrays": {
3518
- const elements = SchemaAST.mapOrSame(representation.elements, (element) => {
3519
- const type = unknownToJson(element.type)
3520
- return type === element.type ? element : { ...element, type }
3521
- })
3522
- const rest = SchemaAST.mapOrSame(representation.rest, unknownToJson)
3523
- return elements === representation.elements && rest === representation.rest ?
3524
- representation :
3525
- { ...representation, elements, rest }
3526
- }
3527
- case "Objects": {
3528
- const propertySignatures = SchemaAST.mapOrSame(representation.propertySignatures, (propertySignature) => {
3529
- const type = unknownToJson(propertySignature.type)
3530
- return type === propertySignature.type ? propertySignature : { ...propertySignature, type }
3531
- })
3532
- const indexSignatures = SchemaAST.mapOrSame(representation.indexSignatures, (indexSignature) => {
3533
- const type = unknownToJson(indexSignature.type)
3534
- return type === indexSignature.type ? indexSignature : { ...indexSignature, type }
3535
- })
3536
- return propertySignatures === representation.propertySignatures &&
3537
- indexSignatures === representation.indexSignatures ?
3538
- representation :
3539
- { ...representation, propertySignatures, indexSignatures }
3540
- }
3541
- case "Union": {
3542
- const types = SchemaAST.mapOrSame(representation.types, unknownToJson)
3543
- return types === representation.types ? representation : { ...representation, types }
3544
- }
3545
- default:
3546
- return representation
3547
- }
3548
- }
3549
- }
3550
-
3551
- function asChecks<M>(
3552
- checks: ReadonlyArray<Check<M>>,
3553
- annotations: Schema.Annotations.Annotations | undefined
3554
- ): ReadonlyArray<Check<M>> | undefined {
3555
- if (Arr.isReadonlyArrayNonEmpty(checks)) {
3556
- if (annotations !== undefined) {
3557
- if (checks.length === 1) {
3558
- const check = checks[0]
3559
- if (check.annotations === undefined) {
3560
- return [{ ...check, annotations }]
3561
- } else {
3562
- return [{ _tag: "FilterGroup", checks, annotations }]
3563
- }
3564
- } else {
3565
- return [{ _tag: "FilterGroup", checks, annotations }]
3566
- }
3567
- }
3568
- return checks
3569
- }
3570
- }
3571
-
3572
- function combineChecks<M>(
3573
- a: ReadonlyArray<Check<M>>,
3574
- b: ReadonlyArray<Check<M>>,
3575
- annotations: Schema.Annotations.Annotations | undefined
3576
- ): Array<Check<M>> | undefined {
3577
- const checks = asChecks(b, annotations)
3578
- if (checks) {
3579
- return [...a, ...checks]
3580
- }
3581
- }
3582
-
3583
- function combineNumberChecks(
3584
- a: ReadonlyArray<Check<NumberMeta>>,
3585
- b: ReadonlyArray<Check<NumberMeta>>,
3586
- annotations: Schema.Annotations.Annotations | undefined
3587
- ): Array<Check<NumberMeta>> | undefined {
3588
- if (a.some((c) => c._tag === "Filter" && c.meta._tag === "isFinite")) {
3589
- b = b.filter((c) => c._tag !== "Filter" || c.meta._tag !== "isFinite")
3590
- }
3591
- if (a.some((c) => c._tag === "Filter" && c.meta._tag === "isInt")) {
3592
- b = b.filter((c) => c._tag !== "Filter" || c.meta._tag !== "isInt")
3593
- }
3594
- return combineChecks(a, b, annotations)
3595
- }
3596
-
3597
- function combineArraysChecks(
3598
- a: ReadonlyArray<Check<ArraysMeta>>,
3599
- b: ReadonlyArray<Check<ArraysMeta>>,
3600
- annotations: Schema.Annotations.Annotations | undefined
3601
- ): Array<Check<ArraysMeta>> | undefined {
3602
- if (a.some((c) => c._tag === "Filter" && c.meta._tag === "isUnique")) {
3603
- b = b.filter((c) => c._tag !== "Filter" || c.meta._tag !== "isUnique")
3604
- }
3605
- return combineChecks(a, b, annotations)
3606
- }
3607
-
3608
- function makeAnnotations(
3609
- annotations: Schema.Annotations.Annotations | undefined
3610
- ): { annotations: Schema.Annotations.Annotations } | undefined {
3611
- return annotations ? { annotations } : undefined
3612
- }
3613
-
3614
- function combineAnnotations(
3615
- a: Schema.Annotations.Annotations | undefined,
3616
- b: Schema.Annotations.Annotations | undefined
3617
- ): { annotations: Schema.Annotations.Annotations } | undefined {
3618
- if (a === undefined) return makeAnnotations(b)
3619
- if (b === undefined) return makeAnnotations(a)
3620
- return { annotations: { ...a, ...b } } // TODO: better merge
3621
- }
3622
-
3623
- function collectStringChecks(js: JsonSchema.JsonSchema): Array<Check<StringMeta>> {
3624
- const checks: Array<Check<StringMeta>> = []
3625
- if (typeof js.minLength === "number") {
3626
- checks.push({ _tag: "Filter", meta: { _tag: "isMinLength", minLength: js.minLength } })
3627
- }
3628
- if (typeof js.maxLength === "number") {
3629
- checks.push({ _tag: "Filter", meta: { _tag: "isMaxLength", maxLength: js.maxLength } })
3630
- }
3631
- if (typeof js.pattern === "string") {
3632
- checks.push({ _tag: "Filter", meta: { _tag: "isPattern", regExp: new RegExp(js.pattern) } })
3633
- }
3634
- return checks
3635
- }
3636
-
3637
- function collectNumberChecks(js: JsonSchema.JsonSchema): Array<Check<NumberMeta>> {
3638
- const checks: Array<Check<NumberMeta>> = []
3639
- if (typeof js.minimum === "number") {
3640
- checks.push({ _tag: "Filter", meta: { _tag: "isGreaterThanOrEqualTo", minimum: js.minimum } })
3641
- }
3642
- if (typeof js.maximum === "number") {
3643
- checks.push({ _tag: "Filter", meta: { _tag: "isLessThanOrEqualTo", maximum: js.maximum } })
3644
- }
3645
- if (typeof js.exclusiveMinimum === "number") {
3646
- checks.push({ _tag: "Filter", meta: { _tag: "isGreaterThan", exclusiveMinimum: js.exclusiveMinimum } })
3647
- }
3648
- if (typeof js.exclusiveMaximum === "number") {
3649
- checks.push({ _tag: "Filter", meta: { _tag: "isLessThan", exclusiveMaximum: js.exclusiveMaximum } })
3650
- }
3651
- if (typeof js.multipleOf === "number") {
3652
- checks.push({ _tag: "Filter", meta: { _tag: "isMultipleOf", divisor: js.multipleOf } })
3653
- }
3654
- return checks
3655
- }
3656
-
3657
- function collectArraysChecks(js: JsonSchema.JsonSchema): Array<Check<ArraysMeta>> {
3658
- const checks: Array<Check<ArraysMeta>> = []
3659
- if (js.prefixItems === undefined) {
3660
- if (typeof js.minItems === "number") {
3661
- checks.push({ _tag: "Filter", meta: { _tag: "isMinLength", minLength: js.minItems } })
3662
- }
3663
- if (typeof js.maxItems === "number") {
3664
- checks.push({ _tag: "Filter", meta: { _tag: "isMaxLength", maxLength: js.maxItems } })
3665
- }
3666
- }
3667
- if (typeof js.uniqueItems === "boolean") {
3668
- checks.push({ _tag: "Filter", meta: { _tag: "isUnique" } })
3669
- }
3670
- return checks
3671
- }
3672
-
3673
- const unknown: Unknown = { _tag: "Unknown" }
3674
- const json: Declaration = {
3675
- _tag: "Declaration",
3676
- annotations: {
3677
- expected: "JSON value",
3678
- generation: {
3679
- Type: "Schema.Json",
3680
- runtime: "Schema.Json"
3681
- },
3682
- typeConstructor: {
3683
- _tag: "effect/Json"
3684
- }
3685
- },
3686
- checks: [],
3687
- encodedSchema: unknown,
3688
- typeParameters: []
3689
- }
3690
- const never: Never = { _tag: "Never" }
3691
- const null_: Null = { _tag: "Null" }
3692
- const string: String = { _tag: "String", checks: [] }
3693
- const boolean: Boolean = { _tag: "Boolean" }
3694
-
3695
- function collectAnnotations(
3696
- schema: JsonSchema.JsonSchema
3697
- ): Schema.Annotations.Annotations | undefined {
3698
- const as: Record<string, unknown> = {}
3699
-
3700
- if (typeof schema.title === "string") as.title = schema.title
3701
- if (typeof schema.description === "string") as.description = schema.description
3702
- if (schema.default !== undefined) as.default = schema.default
3703
- if (Array.isArray(schema.examples)) as.examples = schema.examples
3704
- if (typeof schema.readOnly === "boolean") as.readOnly = schema.readOnly
3705
- if (typeof schema.writeOnly === "boolean") as.writeOnly = schema.writeOnly
3706
- if (typeof schema.format === "string") as.format = schema.format
3707
- if (typeof schema.contentEncoding === "string") as.contentEncoding = schema.contentEncoding
3708
- if (typeof schema.contentMediaType === "string") as.contentMediaType = schema.contentMediaType
3709
-
3710
- return Rec.isEmptyRecord(as) ? undefined : as
3711
- }
3712
-
3713
- function isLiteralValue(value: unknown): value is SchemaAST.LiteralValue {
3714
- return typeof value === "string" || typeof value === "number" || typeof value === "boolean"
3715
- }
3716
-
3717
- const stringKeys = ["minLength", "maxLength", "pattern", "format", "contentMediaType", "contentSchema"]
3718
- const numberKeys = ["minimum", "maximum", "exclusiveMinimum", "exclusiveMaximum", "multipleOf"]
3719
- const objectKeys = [
3720
- "properties",
3721
- "required",
3722
- "additionalProperties",
3723
- "patternProperties",
3724
- "propertyNames",
3725
- "minProperties",
3726
- "maxProperties"
3727
- ]
3728
- const arrayKeys = ["items", "prefixItems", "additionalItems", "minItems", "maxItems", "uniqueItems"]
3729
-
3730
- function getType(js: JsonSchema.JsonSchema): JsonSchema.Type | undefined {
3731
- if (stringKeys.some((key) => js[key] !== undefined)) {
3732
- return "string"
3733
- }
3734
- if (numberKeys.some((key) => js[key] !== undefined)) {
3735
- return "number"
3736
- }
3737
- if (objectKeys.some((key) => js[key] !== undefined)) {
3738
- return "object"
3739
- }
3740
- if (arrayKeys.some((key) => js[key] !== undefined)) {
3741
- return "array"
3742
- }
3743
- }
3744
-
3745
- const types = ["null", "string", "number", "integer", "boolean", "object", "array"]
3746
-
3747
- function isType(type: unknown): type is JsonSchema.Type {
3748
- return typeof type === "string" && types.includes(type)
3749
- }
3750
-
3751
- /** @internal */
3752
- export type TopologicalSort = {
3753
- /**
3754
- * The definitions that are not recursive.
3755
- * The definitions that depends on other definitions are placed after the definitions they depend on
3756
- */
3757
- readonly nonRecursives: ReadonlyArray<{
3758
- readonly $ref: string
3759
- readonly representation: Representation
3760
- }>
3761
- /**
3762
- * The recursive definitions (with no particular order).
3763
- */
3764
- readonly recursives: {
3765
- readonly [$ref: string]: Representation
3766
- }
3767
- }
3768
-
3769
- /** @internal */
3770
- export function topologicalSort(references: References): TopologicalSort {
3771
- const identifiers = Object.keys(references)
3772
- const identifierSet = new Set(identifiers)
3773
-
3774
- const collectRefs = (root: Representation): Set<string> => {
3775
- const refs = new Set<string>()
3776
- const visited = new WeakSet<object>()
3777
- const stack: Array<Representation> = [root]
3778
-
3779
- while (stack.length > 0) {
3780
- const r = stack.pop()!
3781
- if (visited.has(r)) continue
3782
- visited.add(r)
3783
-
3784
- if (r._tag === "Reference") {
3785
- if (identifierSet.has(r.$ref)) {
3786
- refs.add(r.$ref)
3787
- }
3788
- }
3789
-
3790
- // Push nested Representation schemas onto the stack
3791
- switch (r._tag) {
3792
- case "Declaration":
3793
- for (const typeParam of r.typeParameters) stack.push(typeParam)
3794
- stack.push(r.encodedSchema)
3795
- break
3796
- case "Suspend":
3797
- stack.push(r.thunk)
3798
- break
3799
- case "String":
3800
- if (r.contentSchema !== undefined) stack.push(r.contentSchema)
3801
- break
3802
- case "TemplateLiteral":
3803
- for (const part of r.parts) stack.push(part)
3804
- break
3805
- case "Arrays":
3806
- for (const element of r.elements) stack.push(element.type)
3807
- for (const rest of r.rest) stack.push(rest)
3808
- break
3809
- case "Objects":
3810
- for (const propertySignature of r.propertySignatures) stack.push(propertySignature.type)
3811
- for (const indexSignature of r.indexSignatures) {
3812
- stack.push(indexSignature.parameter)
3813
- stack.push(indexSignature.type)
3814
- }
3815
- break
3816
- case "Union":
3817
- for (const type of r.types) stack.push(type)
3818
- break
3819
- }
3820
- }
3821
-
3822
- return refs
3823
- }
3824
-
3825
- // identifier -> internal identifiers it depends on
3826
- const dependencies = new Map<string, Set<string>>(
3827
- identifiers.map((id) => [id, collectRefs(references[id])])
3828
- )
3829
-
3830
- // Mark only nodes that are part of cycles
3831
- const recursive = new Set<string>()
3832
- const state = new Map<string, 0 | 1 | 2>() // 0 = new, 1 = visiting, 2 = done
3833
- const stack: Array<string> = []
3834
- const indexInStack = new Map<string, number>()
3835
-
3836
- const dfs = (id: string): void => {
3837
- const s = state.get(id) ?? 0
3838
- if (s === 1) {
3839
- const start = indexInStack.get(id)
3840
- if (start !== undefined) {
3841
- for (let i = start; i < stack.length; i++) {
3842
- recursive.add(stack[i])
3843
- }
3844
- }
3845
- return
3846
- }
3847
- if (s === 2) return
3848
-
3849
- state.set(id, 1)
3850
- indexInStack.set(id, stack.length)
3851
- stack.push(id)
3852
-
3853
- for (const dep of dependencies.get(id) ?? []) {
3854
- dfs(dep)
3855
- }
3856
-
3857
- stack.pop()
3858
- indexInStack.delete(id)
3859
- state.set(id, 2)
3860
- }
3861
-
3862
- for (const id of identifiers) dfs(id)
3863
-
3864
- // Topologically sort the non-recursive nodes (ignoring edges to recursive nodes)
3865
- const inDegree = new Map<string, number>()
3866
- const dependents = new Map<string, Set<string>>() // dep -> nodes that depend on it
3867
-
3868
- for (const id of identifiers) {
3869
- if (!recursive.has(id)) {
3870
- inDegree.set(id, 0)
3871
- dependents.set(id, new Set())
3872
- }
3873
- }
3874
-
3875
- for (const [id, deps] of dependencies) {
3876
- if (recursive.has(id)) continue
3877
- for (const dep of deps) {
3878
- if (recursive.has(dep)) continue
3879
- inDegree.set(id, (inDegree.get(id) ?? 0) + 1)
3880
- dependents.get(dep)?.add(id)
3881
- }
3882
- }
3883
-
3884
- const queue: Array<string> = []
3885
- for (const [id, deg] of inDegree) {
3886
- if (deg === 0) queue.push(id)
3887
- }
3888
-
3889
- const nonRecursives: Array<{ readonly $ref: string; readonly representation: Representation }> = []
3890
- for (let i = 0; i < queue.length; i++) {
3891
- const $ref = queue[i]
3892
- nonRecursives.push({ $ref, representation: references[$ref] })
3893
-
3894
- for (const next of dependents.get($ref) ?? []) {
3895
- const deg = (inDegree.get(next) ?? 0) - 1
3896
- inDegree.set(next, deg)
3897
- if (deg === 0) queue.push(next)
3898
- }
3899
- }
3900
-
3901
- const recursives: Record<string, Representation> = {}
3902
- for (const $ref of recursive) {
3903
- recursives[$ref] = references[$ref]
3904
- }
3905
-
3906
- return { nonRecursives, recursives }
1220
+ export function fromJsonSchemaMultiDocument(
1221
+ document: JsonSchema.MultiDocument<"draft-2020-12">,
1222
+ options?: FromJsonSchemaOptions
1223
+ ): readonly [Schema.Top, ...Array<Schema.Top>] {
1224
+ return InternalFromJsonSchemaDocument.fromJsonSchemaMultiDocument(document, options)
3907
1225
  }