functionalscript 0.44.0 → 0.45.0

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 (453) hide show
  1. package/fjs/asn.1/proof.f.d.mts +5 -0
  2. package/fjs/asn.1/proof.f.mjs +15 -3
  3. package/fjs/asserts/module.f.d.mts +14 -0
  4. package/fjs/asserts/module.f.mjs +20 -0
  5. package/fjs/asserts/proof.f.d.mts +3 -0
  6. package/fjs/asserts/proof.f.mjs +15 -1
  7. package/fjs/basen/base128/proof.f.d.mts +3 -1
  8. package/fjs/basen/base128/proof.f.mjs +3 -1
  9. package/fjs/basen/base64/module.f.mjs +7 -3
  10. package/fjs/basen/base64/proof.f.d.mts +3 -1
  11. package/fjs/basen/base64/proof.f.mjs +7 -4
  12. package/fjs/basen/cbase32/proof.f.d.mts +3 -1
  13. package/fjs/basen/cbase32/proof.f.mjs +3 -1
  14. package/fjs/bnf/data/proof.f.mjs +0 -1
  15. package/fjs/bnf/descent/module.f.d.mts +17 -2
  16. package/fjs/bnf/descent/module.f.mjs +118 -41
  17. package/fjs/bnf/descent/proof.f.d.mts +1 -0
  18. package/fjs/bnf/descent/proof.f.mjs +77 -1
  19. package/fjs/bnf/descent/types.d.ts +12 -4
  20. package/fjs/bnf/ll1/module.f.d.mts +28 -2
  21. package/fjs/bnf/ll1/module.f.mjs +180 -38
  22. package/fjs/bnf/ll1/proof.f.d.mts +2 -0
  23. package/fjs/bnf/ll1/proof.f.mjs +62 -1
  24. package/fjs/bnf/ll1/types.d.ts +14 -8
  25. package/fjs/bnf/module.f.d.mts +15 -6
  26. package/fjs/bnf/module.f.mjs +52 -11
  27. package/fjs/bnf/proof.f.d.mts +2 -0
  28. package/fjs/bnf/proof.f.mjs +79 -3
  29. package/fjs/bnf/token_symbol/module.f.d.mts +4 -3
  30. package/fjs/bnf/token_symbol/module.f.mjs +7 -6
  31. package/fjs/bnf/token_symbol/proof.f.mjs +5 -2
  32. package/fjs/bnf/token_symbol/types.d.ts +2 -2
  33. package/fjs/bnf/types.d.ts +10 -3
  34. package/fjs/cas/cli/proof.f.d.mts +3 -1
  35. package/fjs/cas/cli/proof.f.mjs +3 -1
  36. package/fjs/cas/evo/module.f.d.mts +7 -13
  37. package/fjs/cas/evo/module.f.mjs +103 -96
  38. package/fjs/cas/evo/proof.f.mjs +6 -3
  39. package/fjs/cas/module.f.mjs +96 -109
  40. package/fjs/ci/common/module.f.d.mts +1 -1
  41. package/fjs/ci/common/module.f.mjs +1 -0
  42. package/fjs/ci/config/module.f.d.mts +2 -2
  43. package/fjs/ci/config/module.f.mjs +2 -2
  44. package/fjs/ci/nix/proof.f.d.mts +2 -0
  45. package/fjs/ci/nix/proof.f.mjs +2 -2
  46. package/fjs/ci/proof.f.d.mts +4 -2
  47. package/fjs/ci/proof.f.mjs +4 -3
  48. package/fjs/cli/proof.f.d.mts +4 -2
  49. package/fjs/cli/proof.f.mjs +4 -2
  50. package/fjs/common/monoid/module.f.d.mts +70 -12
  51. package/fjs/common/monoid/module.f.mjs +177 -14
  52. package/fjs/common/monoid/proof.f.d.mts +12 -1
  53. package/fjs/common/monoid/proof.f.mjs +88 -4
  54. package/fjs/common/monoid/types.d.ts +23 -0
  55. package/fjs/crypto/secp/proof.f.d.mts +3 -1
  56. package/fjs/crypto/secp/proof.f.mjs +3 -1
  57. package/fjs/crypto/sha2/proof.f.d.mts +3 -1
  58. package/fjs/crypto/sha2/proof.f.mjs +3 -1
  59. package/fjs/crypto/vdf/module.f.d.mts +23 -4
  60. package/fjs/crypto/vdf/module.f.mjs +6 -4
  61. package/fjs/dev/module.f.d.mts +5 -2
  62. package/fjs/dev/module.f.mjs +5 -4
  63. package/fjs/dev/package_json/module.f.d.mts +7 -0
  64. package/fjs/dev/package_json/module.f.mjs +10 -7
  65. package/fjs/dev/update/module.f.d.mts +3 -0
  66. package/fjs/dev/update/module.f.mjs +3 -2
  67. package/fjs/dev/update/proof.f.d.mts +3 -0
  68. package/fjs/dev/update/proof.f.mjs +1 -2
  69. package/fjs/djs/parser/module.f.d.mts +3 -0
  70. package/fjs/djs/parser/module.f.mjs +18 -0
  71. package/fjs/djs/parser/proof.f.d.mts +3 -0
  72. package/fjs/djs/parser/proof.f.mjs +13 -1
  73. package/fjs/djs/proof.f.d.mts +3 -0
  74. package/fjs/djs/proof.f.mjs +4 -1
  75. package/fjs/djs/serializer/module.f.mjs +5 -4
  76. package/fjs/djs/tokenizer/module.f.mjs +21 -13
  77. package/fjs/djs/tokenizer/proof.f.d.mts +3 -0
  78. package/fjs/djs/tokenizer/proof.f.mjs +14 -2
  79. package/fjs/djs/transpiler/module.f.d.mts +1 -12
  80. package/fjs/djs/transpiler/module.f.mjs +1 -20
  81. package/fjs/djs/transpiler/types.d.ts +25 -0
  82. package/fjs/effects/eff/module.f.d.mts +10 -0
  83. package/fjs/effects/eff/module.f.mjs +4 -2
  84. package/fjs/effects/eff/proof.f.d.mts +3 -0
  85. package/fjs/effects/eff/proof.f.mjs +4 -1
  86. package/fjs/effects/list/module.f.d.mts +10 -2
  87. package/fjs/effects/list/module.f.mjs +4 -2
  88. package/fjs/effects/memory/module.f.d.mts +4 -2
  89. package/fjs/effects/memory/module.f.mjs +4 -3
  90. package/fjs/effects/memory/proof.f.d.mts +4 -0
  91. package/fjs/effects/memory/proof.f.mjs +5 -2
  92. package/fjs/effects/mock/module.f.d.mts +10 -2
  93. package/fjs/effects/mock/module.f.mjs +4 -2
  94. package/fjs/effects/module.d.mts +8 -0
  95. package/fjs/effects/module.f.d.mts +6 -4
  96. package/fjs/effects/module.f.mjs +6 -5
  97. package/fjs/effects/module.mjs +9 -1
  98. package/fjs/effects/node/memory/module.d.mts +3 -0
  99. package/fjs/effects/node/memory/module.mjs +3 -2
  100. package/fjs/effects/node/memory/proof.d.mts +2 -0
  101. package/fjs/effects/node/memory/proof.mjs +2 -1
  102. package/fjs/effects/node/module.d.mts +5 -0
  103. package/fjs/effects/node/module.f.d.mts +17 -12
  104. package/fjs/effects/node/module.f.mjs +6 -12
  105. package/fjs/effects/node/module.mjs +5 -17
  106. package/fjs/effects/node/virtual/module.f.d.mts +6 -3
  107. package/fjs/effects/node/virtual/module.f.mjs +6 -5
  108. package/fjs/effects/node/virtual/proof.f.d.mts +4 -1
  109. package/fjs/effects/node/virtual/proof.f.mjs +13 -1
  110. package/fjs/effects/proof.f.d.mts +3 -0
  111. package/fjs/effects/proof.f.mjs +4 -1
  112. package/fjs/emergent_testing/all.test.d.mts +8 -0
  113. package/fjs/emergent_testing/all.test.mjs +14 -0
  114. package/fjs/emergent_testing/module.f.d.mts +6 -1
  115. package/fjs/emergent_testing/module.f.mjs +40 -66
  116. package/fjs/emergent_testing/proof.f.mjs +5 -5
  117. package/fjs/fsc/bnf.f.d.mts +3 -0
  118. package/fjs/fsc/bnf.f.mjs +4 -1
  119. package/fjs/fsc/json.f.d.mts +3 -0
  120. package/fjs/fsc/json.f.mjs +4 -1
  121. package/fjs/fsc/module.f.d.mts +9 -0
  122. package/fjs/fsc/module.f.mjs +5 -3
  123. package/fjs/fsm/proof.f.d.mts +3 -0
  124. package/fjs/fsm/proof.f.mjs +4 -1
  125. package/fjs/js/tokenizer/module.f.d.mts +7 -0
  126. package/fjs/js/tokenizer/module.f.mjs +19 -55
  127. package/fjs/mcp/module.f.d.mts +36 -1
  128. package/fjs/mcp/module.f.mjs +9 -7
  129. package/fjs/mcp/proof.f.d.mts +11 -1
  130. package/fjs/mcp/proof.f.mjs +11 -18
  131. package/fjs/media/html/module.f.d.mts +12 -0
  132. package/fjs/media/html/module.f.mjs +6 -4
  133. package/fjs/media/html/proof.f.d.mts +3 -0
  134. package/fjs/media/html/proof.f.mjs +4 -1
  135. package/fjs/media/json/parser/module.f.d.mts +1 -1
  136. package/fjs/media/json/parser/module.f.mjs +25 -8
  137. package/fjs/media/json/parser/types.d.ts +5 -0
  138. package/fjs/media/json/rtti/proof.f.d.mts +3 -0
  139. package/fjs/media/json/rtti/proof.f.mjs +3 -3
  140. package/fjs/media/json/schema/module.f.d.mts +61 -27
  141. package/fjs/media/json/schema/module.f.mjs +228 -63
  142. package/fjs/media/json/schema/proof.f.d.mts +41 -0
  143. package/fjs/media/json/schema/proof.f.mjs +219 -7
  144. package/fjs/media/json/serializer/module.f.d.mts +13 -0
  145. package/fjs/media/json/serializer/module.f.mjs +7 -7
  146. package/fjs/media/json/tokenizer/module.f.d.mts +8 -0
  147. package/fjs/media/json/tokenizer/module.f.mjs +24 -5
  148. package/fjs/media/nix/module.f.d.mts +13 -0
  149. package/fjs/media/nix/module.f.mjs +4 -2
  150. package/fjs/media/nix/proof.f.d.mts +3 -0
  151. package/fjs/media/nix/proof.f.mjs +4 -1
  152. package/fjs/media/revision/module.f.d.mts +5 -0
  153. package/fjs/media/revision/module.f.mjs +8 -11
  154. package/fjs/media/revision/proof.f.d.mts +4 -0
  155. package/fjs/media/revision/proof.f.mjs +5 -2
  156. package/fjs/media/type/module.f.d.mts +28 -11
  157. package/fjs/media/type/module.f.mjs +69 -85
  158. package/fjs/media/type/proof.f.d.mts +16 -0
  159. package/fjs/media/type/proof.f.mjs +44 -4
  160. package/fjs/module.d.mts +5 -0
  161. package/fjs/module.f.d.mts +8 -0
  162. package/fjs/module.f.mjs +4 -2
  163. package/fjs/module.mjs +6 -0
  164. package/fjs/path/module.f.d.mts +8 -0
  165. package/fjs/path/module.f.mjs +4 -2
  166. package/fjs/proof.f.d.mts +4 -0
  167. package/fjs/proof.f.mjs +5 -2
  168. package/fjs/protocol/json_rpc/module.f.d.mts +1 -1
  169. package/fjs/protocol/json_rpc/module.f.mjs +7 -4
  170. package/fjs/protocol/json_rpc/proof.f.d.mts +6 -0
  171. package/fjs/protocol/json_rpc/proof.f.mjs +22 -1
  172. package/fjs/protocol/mcp/proof.f.d.mts +4 -0
  173. package/fjs/protocol/mcp/proof.f.mjs +47 -24
  174. package/fjs/protocol/mcp/stdio/module.f.d.mts +2 -4
  175. package/fjs/protocol/mcp/stdio/module.f.mjs +1 -8
  176. package/fjs/protocol/mcp/stdio/proof.f.d.mts +1 -1
  177. package/fjs/protocol/mcp/stdio/proof.f.mjs +1 -1
  178. package/fjs/protocol/mcp/stdio/types.d.ts +14 -0
  179. package/fjs/sul/id/module.f.d.mts +5 -0
  180. package/fjs/sul/id/module.f.mjs +5 -4
  181. package/fjs/sul/level/hash/module.f.d.mts +4 -1
  182. package/fjs/sul/level/hash/module.f.mjs +4 -3
  183. package/fjs/sul/level/hash/proof.f.d.mts +4 -0
  184. package/fjs/sul/level/hash/proof.f.mjs +5 -2
  185. package/fjs/sul/level/literal/module.f.d.mts +4 -1
  186. package/fjs/sul/level/literal/module.f.mjs +4 -3
  187. package/fjs/sul/level/literal/proof.f.d.mts +3 -0
  188. package/fjs/sul/level/literal/proof.f.mjs +4 -1
  189. package/fjs/sul/module.f.d.mts +5 -3
  190. package/fjs/sul/module.f.mjs +5 -4
  191. package/fjs/sul/proof.f.d.mts +4 -0
  192. package/fjs/sul/proof.f.mjs +5 -2
  193. package/fjs/text/ascii/module.f.d.mts +26 -0
  194. package/fjs/text/ascii/module.f.mjs +49 -1
  195. package/fjs/text/ascii/proof.f.d.mts +10 -0
  196. package/fjs/text/ascii/proof.f.mjs +33 -1
  197. package/fjs/text/code_point/module.f.d.mts +21 -3
  198. package/fjs/text/code_point/module.f.mjs +24 -8
  199. package/fjs/text/code_point/proof.f.d.mts +1 -0
  200. package/fjs/text/code_point/proof.f.mjs +28 -0
  201. package/fjs/text/module.f.d.mts +4 -2
  202. package/fjs/text/module.f.mjs +4 -3
  203. package/fjs/text/proof.f.d.mts +3 -0
  204. package/fjs/text/proof.f.mjs +4 -1
  205. package/fjs/text/sgr/module.f.d.mts +4 -1
  206. package/fjs/text/sgr/module.f.mjs +4 -3
  207. package/fjs/text/sgr/proof.f.d.mts +3 -0
  208. package/fjs/text/sgr/proof.f.mjs +4 -1
  209. package/fjs/text/utf16/module.f.d.mts +5 -1
  210. package/fjs/text/utf16/module.f.mjs +31 -33
  211. package/fjs/text/utf16/proof.f.d.mts +3 -1
  212. package/fjs/text/utf16/proof.f.mjs +18 -1
  213. package/fjs/text/utf8/module.f.d.mts +9 -5
  214. package/fjs/text/utf8/module.f.mjs +16 -18
  215. package/fjs/types/array/module.f.d.mts +2 -1
  216. package/fjs/types/array/module.f.mjs +2 -2
  217. package/fjs/types/bigfloat/module.f.d.mts +21 -1
  218. package/fjs/types/bigfloat/module.f.mjs +33 -7
  219. package/fjs/types/bigfloat/proof.f.d.mts +1 -0
  220. package/fjs/types/bigfloat/proof.f.mjs +46 -0
  221. package/fjs/types/bigint/module.f.d.mts +4 -0
  222. package/fjs/types/bigint/module.f.mjs +4 -3
  223. package/fjs/types/bit_vec/module.f.d.mts +10 -14
  224. package/fjs/types/bit_vec/module.f.mjs +61 -71
  225. package/fjs/types/bit_vec/proof.f.d.mts +6 -0
  226. package/fjs/types/bit_vec/proof.f.mjs +29 -3
  227. package/fjs/types/btree/find/module.f.d.mts +5 -1
  228. package/fjs/types/btree/find/module.f.mjs +5 -5
  229. package/fjs/types/btree/find/proof.f.d.mts +5 -1
  230. package/fjs/types/btree/find/proof.f.mjs +5 -3
  231. package/fjs/types/btree/module.f.d.mts +3 -0
  232. package/fjs/types/btree/module.f.mjs +3 -2
  233. package/fjs/types/btree/proof.f.d.mts +5 -1
  234. package/fjs/types/btree/proof.f.mjs +5 -3
  235. package/fjs/types/btree/remove/module.f.d.mts +11 -0
  236. package/fjs/types/btree/remove/module.f.mjs +9 -9
  237. package/fjs/types/btree/remove/proof.f.d.mts +3 -0
  238. package/fjs/types/btree/remove/proof.f.mjs +4 -1
  239. package/fjs/types/btree/set/module.f.d.mts +9 -0
  240. package/fjs/types/btree/set/module.f.mjs +5 -6
  241. package/fjs/types/btree/set/proof.f.d.mts +3 -0
  242. package/fjs/types/btree/set/proof.f.mjs +4 -1
  243. package/fjs/types/btree/types/module.f.d.mts +2 -1
  244. package/fjs/types/btree/types/module.f.mjs +2 -1
  245. package/fjs/types/byte_set/module.f.d.mts +10 -1
  246. package/fjs/types/byte_set/module.f.mjs +5 -3
  247. package/fjs/types/byte_set/proof.f.d.mts +3 -1
  248. package/fjs/types/byte_set/proof.f.mjs +3 -1
  249. package/fjs/types/function/compare/module.f.d.mts +3 -2
  250. package/fjs/types/function/compare/module.f.mjs +3 -2
  251. package/fjs/types/function/module.f.d.mts +8 -1
  252. package/fjs/types/function/module.f.mjs +8 -1
  253. package/fjs/types/function/operator/module.f.d.mts +2 -1
  254. package/fjs/types/function/operator/module.f.mjs +2 -2
  255. package/fjs/types/list/module.f.d.mts +9 -2
  256. package/fjs/types/list/module.f.mjs +5 -3
  257. package/fjs/types/list/proof.f.d.mts +4 -1
  258. package/fjs/types/list/proof.f.mjs +4 -2
  259. package/fjs/types/nibble_set/module.f.d.mts +2 -1
  260. package/fjs/types/nibble_set/module.f.mjs +2 -2
  261. package/fjs/types/nominal/module.f.d.mts +2 -1
  262. package/fjs/types/nominal/module.f.mjs +2 -1
  263. package/fjs/types/nullable/module.f.d.mts +8 -2
  264. package/fjs/types/nullable/module.f.mjs +4 -2
  265. package/fjs/types/number/module.f.d.mts +4 -0
  266. package/fjs/types/number/module.f.mjs +4 -3
  267. package/fjs/types/object/module.f.d.mts +14 -2
  268. package/fjs/types/object/module.f.mjs +15 -6
  269. package/fjs/types/object/proof.f.d.mts +5 -2
  270. package/fjs/types/object/proof.f.mjs +6 -3
  271. package/fjs/types/object/structurally_same/module.f.d.mts +39 -0
  272. package/fjs/types/object/structurally_same/module.f.mjs +59 -0
  273. package/fjs/types/object/structurally_same/proof.f.d.mts +6 -0
  274. package/fjs/types/object/structurally_same/proof.f.mjs +73 -0
  275. package/fjs/types/ordered_map/module.f.d.mts +5 -0
  276. package/fjs/types/ordered_map/module.f.mjs +5 -4
  277. package/fjs/types/ordered_map/proof.f.d.mts +3 -0
  278. package/fjs/types/ordered_map/proof.f.mjs +4 -1
  279. package/fjs/types/patricia_trie/module.f.d.mts +2 -1
  280. package/fjs/types/patricia_trie/module.f.mjs +2 -2
  281. package/fjs/types/patricia_trie/proof.f.d.mts +3 -0
  282. package/fjs/types/patricia_trie/proof.f.mjs +4 -1
  283. package/fjs/types/prime_field/module.f.d.mts +3 -1
  284. package/fjs/types/prime_field/module.f.mjs +3 -2
  285. package/fjs/types/range/module.f.d.mts +2 -1
  286. package/fjs/types/range/module.f.mjs +2 -2
  287. package/fjs/types/range_map/module.f.d.mts +6 -0
  288. package/fjs/types/range_map/module.f.mjs +6 -9
  289. package/fjs/types/range_map/proof.f.d.mts +5 -1
  290. package/fjs/types/range_map/proof.f.mjs +5 -3
  291. package/fjs/types/range_set/module.f.d.mts +5 -0
  292. package/fjs/types/range_set/module.f.mjs +1 -0
  293. package/fjs/types/range_set/proof.f.d.mts +3 -0
  294. package/fjs/types/range_set/proof.f.mjs +4 -1
  295. package/fjs/types/result/module.d.mts +8 -0
  296. package/fjs/types/result/module.f.d.mts +37 -7
  297. package/fjs/types/result/module.f.mjs +38 -8
  298. package/fjs/types/result/module.mjs +9 -1
  299. package/fjs/types/result/proof.f.d.mts +5 -0
  300. package/fjs/types/result/proof.f.mjs +22 -2
  301. package/fjs/types/rtti/common/module.f.d.mts +35 -2
  302. package/fjs/types/rtti/common/module.f.mjs +9 -7
  303. package/fjs/types/rtti/common/proof.f.d.mts +4 -0
  304. package/fjs/types/rtti/common/proof.f.mjs +5 -2
  305. package/fjs/types/rtti/data/module.f.d.mts +120 -0
  306. package/fjs/types/rtti/data/module.f.mjs +1030 -0
  307. package/fjs/types/rtti/data/proof.f.d.mts +75 -0
  308. package/fjs/types/rtti/data/proof.f.mjs +566 -0
  309. package/fjs/types/rtti/data/types.d.ts +83 -0
  310. package/fjs/types/rtti/module.f.d.mts +12 -5
  311. package/fjs/types/rtti/module.f.mjs +7 -5
  312. package/fjs/types/rtti/parse/module.f.d.mts +38 -0
  313. package/fjs/types/rtti/parse/module.f.mjs +9 -7
  314. package/fjs/types/rtti/parse/proof.f.mjs +18 -38
  315. package/fjs/types/rtti/proof.f.d.mts +3 -1
  316. package/fjs/types/rtti/proof.f.mjs +3 -1
  317. package/fjs/types/rtti/ts/module.f.d.mts +68 -9
  318. package/fjs/types/rtti/ts/module.f.mjs +262 -30
  319. package/fjs/types/rtti/ts/proof.f.d.mts +44 -0
  320. package/fjs/types/rtti/ts/proof.f.mjs +152 -4
  321. package/fjs/types/rtti/ts/types.d.ts +11 -0
  322. package/fjs/types/rtti/types.d.ts +40 -0
  323. package/fjs/types/rtti/validate/module.f.d.mts +36 -1
  324. package/fjs/types/rtti/validate/module.f.mjs +6 -4
  325. package/fjs/types/sorted_list/module.f.d.mts +4 -1
  326. package/fjs/types/sorted_list/module.f.mjs +21 -12
  327. package/fjs/types/sorted_list/proof.f.d.mts +3 -1
  328. package/fjs/types/sorted_list/proof.f.mjs +3 -1
  329. package/fjs/types/sorted_set/module.f.d.mts +31 -1
  330. package/fjs/types/sorted_set/module.f.mjs +4 -2
  331. package/fjs/types/sorted_set/proof.f.d.mts +3 -1
  332. package/fjs/types/sorted_set/proof.f.mjs +3 -1
  333. package/fjs/types/string/module.f.d.mts +4 -0
  334. package/fjs/types/string/module.f.mjs +4 -3
  335. package/fjs/types/string_set/module.f.d.mts +3 -1
  336. package/fjs/types/string_set/module.f.mjs +3 -2
  337. package/fjs/types/ts/module.f.d.mts +2 -0
  338. package/fjs/types/ts/module.f.mjs +3 -3
  339. package/fjs/types/ts/proof.f.d.mts +1 -0
  340. package/fjs/types/ts/proof.f.mjs +5 -0
  341. package/fjs/types/ts/types.d.ts +6 -1
  342. package/fjs/types/uint8array/module.f.d.mts +13 -2
  343. package/fjs/types/uint8array/module.f.mjs +20 -15
  344. package/fjs/website/module.f.d.mts +3 -0
  345. package/fjs/website/module.f.mjs +3 -2
  346. package/package.json +3 -3
  347. package/fjs/asn.1/types.js +0 -6
  348. package/fjs/asserts/types.js +0 -6
  349. package/fjs/basen/types.js +0 -6
  350. package/fjs/bnf/data/types.js +0 -6
  351. package/fjs/bnf/descent/types.js +0 -6
  352. package/fjs/bnf/ll1/types.js +0 -6
  353. package/fjs/bnf/token_symbol/types.js +0 -6
  354. package/fjs/bnf/types.js +0 -6
  355. package/fjs/cas/evo/types.js +0 -7
  356. package/fjs/cas/types.js +0 -6
  357. package/fjs/ci/common/types.js +0 -1
  358. package/fjs/ci/nix/types.js +0 -6
  359. package/fjs/ci/types.js +0 -6
  360. package/fjs/cli/types.js +0 -6
  361. package/fjs/common/monoid/types.js +0 -6
  362. package/fjs/crypto/pow/types.js +0 -6
  363. package/fjs/crypto/secp/types.js +0 -6
  364. package/fjs/crypto/sha2/types.js +0 -6
  365. package/fjs/crypto/sign/types.js +0 -6
  366. package/fjs/crypto/vdf/types.js +0 -6
  367. package/fjs/dev/types.js +0 -6
  368. package/fjs/djs/ast/types.js +0 -8
  369. package/fjs/djs/parser/types.js +0 -7
  370. package/fjs/djs/tokenizer/types.js +0 -7
  371. package/fjs/djs/types.js +0 -7
  372. package/fjs/effects/eff/types.js +0 -6
  373. package/fjs/effects/list/types.js +0 -6
  374. package/fjs/effects/memory/types.js +0 -6
  375. package/fjs/effects/mock/types.js +0 -6
  376. package/fjs/effects/node/types.js +0 -6
  377. package/fjs/effects/node/virtual/types.js +0 -7
  378. package/fjs/effects/types.js +0 -6
  379. package/fjs/emergent_testing/all.test.d.ts +0 -1
  380. package/fjs/emergent_testing/all.test.js +0 -5
  381. package/fjs/emergent_testing/scenarios/all.d.ts +0 -1
  382. package/fjs/emergent_testing/scenarios/all.js +0 -1
  383. package/fjs/emergent_testing/scenarios/async-subtests.fail.d.ts +0 -6
  384. package/fjs/emergent_testing/scenarios/async-subtests.fail.js +0 -9
  385. package/fjs/emergent_testing/scenarios/async-subtests.pass.d.ts +0 -6
  386. package/fjs/emergent_testing/scenarios/async-subtests.pass.js +0 -9
  387. package/fjs/emergent_testing/scenarios/async.fail.d.ts +0 -3
  388. package/fjs/emergent_testing/scenarios/async.fail.js +0 -6
  389. package/fjs/emergent_testing/scenarios/async.pass.d.ts +0 -3
  390. package/fjs/emergent_testing/scenarios/async.pass.js +0 -5
  391. package/fjs/emergent_testing/scenarios/fail.fail.d.ts +0 -3
  392. package/fjs/emergent_testing/scenarios/fail.fail.js +0 -3
  393. package/fjs/emergent_testing/scenarios/return-value.pass.d.ts +0 -3
  394. package/fjs/emergent_testing/scenarios/return-value.pass.js +0 -4
  395. package/fjs/emergent_testing/scenarios/thenable.pass.d.ts +0 -5
  396. package/fjs/emergent_testing/scenarios/thenable.pass.js +0 -11
  397. package/fjs/emergent_testing/scenarios/thenable2.pass.d.ts +0 -5
  398. package/fjs/emergent_testing/scenarios/thenable2.pass.js +0 -3
  399. package/fjs/emergent_testing/scenarios/throw.pass.d.ts +0 -5
  400. package/fjs/emergent_testing/scenarios/throw.pass.js +0 -3
  401. package/fjs/emergent_testing/types.js +0 -6
  402. package/fjs/js/tokenizer/types.js +0 -6
  403. package/fjs/media/html/types.js +0 -6
  404. package/fjs/media/json/parser/types.js +0 -6
  405. package/fjs/media/json/tokenizer/types.js +0 -6
  406. package/fjs/media/json/types.js +0 -13
  407. package/fjs/media/nix/types.js +0 -6
  408. package/fjs/media/revision/types.js +0 -8
  409. package/fjs/media/type/types.js +0 -6
  410. package/fjs/media/types.js +0 -7
  411. package/fjs/nanvm/types.js +0 -11
  412. package/fjs/protocol/json_rpc/types.js +0 -8
  413. package/fjs/protocol/mcp/types.js +0 -8
  414. package/fjs/sul/id/types.js +0 -6
  415. package/fjs/sul/level/hash/types.js +0 -6
  416. package/fjs/sul/level/literal/types.js +0 -6
  417. package/fjs/sul/types.js +0 -6
  418. package/fjs/text/sgr/types.js +0 -6
  419. package/fjs/text/types.js +0 -6
  420. package/fjs/text/utf16/types.js +0 -6
  421. package/fjs/text/utf8/types.js +0 -6
  422. package/fjs/types/array/types.js +0 -6
  423. package/fjs/types/bigfloat/types.js +0 -6
  424. package/fjs/types/bigint/types.js +0 -6
  425. package/fjs/types/bit_vec/types.js +0 -6
  426. package/fjs/types/btree/find/types.js +0 -6
  427. package/fjs/types/btree/types/types.js +0 -6
  428. package/fjs/types/byte_set/types.js +0 -6
  429. package/fjs/types/function/compare/types.js +0 -6
  430. package/fjs/types/function/operator/types.js +0 -6
  431. package/fjs/types/function/types.js +0 -6
  432. package/fjs/types/list/types.js +0 -6
  433. package/fjs/types/nibble_set/types.js +0 -6
  434. package/fjs/types/nominal/types.js +0 -6
  435. package/fjs/types/nullable/types.js +0 -6
  436. package/fjs/types/object/types.js +0 -8
  437. package/fjs/types/option/types.js +0 -6
  438. package/fjs/types/ordered_map/types.js +0 -6
  439. package/fjs/types/patricia_trie/types.js +0 -6
  440. package/fjs/types/phantom/types.js +0 -11
  441. package/fjs/types/prime_field/types.js +0 -6
  442. package/fjs/types/range/types.js +0 -6
  443. package/fjs/types/range_map/types.js +0 -6
  444. package/fjs/types/result/types.js +0 -6
  445. package/fjs/types/rtti/common/types.js +0 -1
  446. package/fjs/types/rtti/parse/types.js +0 -1
  447. package/fjs/types/rtti/ts/types.js +0 -1
  448. package/fjs/types/rtti/types.js +0 -1
  449. package/fjs/types/rtti/validate/types.js +0 -1
  450. package/fjs/types/sorted_list/types.js +0 -6
  451. package/fjs/types/sorted_set/types.js +0 -6
  452. package/fjs/types/string_set/types.js +0 -6
  453. package/fjs/types/ts/types.js +0 -8
@@ -1,23 +1,36 @@
1
1
  /**
2
2
  * Converts an rtti schema to a JSON Schema (draft 2020-12) object.
3
3
  *
4
- * Driven by `fjs/types/rtti/common/module.f.mjs`'s `visit`, the same shared
5
- * `Type`-ADT walker used by `validate` and `parse`.
4
+ * {@link toJsonSchema} routes through the serializable RTTI data form
5
+ * (`fjs/types/rtti/data`): `thunk RTTI toData dataToJsonSchema`. The data
6
+ * form is a finite graph, so recursive schemas — which the thunk graph
7
+ * represents as self-referencing functions with no leaves — terminate:
8
+ * every named rule is emitted exactly once under `$defs` and every graph
9
+ * edge becomes a local `$ref`.
10
+ *
11
+ * Graph discovery, canonical identity, and definition naming belong to the
12
+ * RTTI data layer; this module only translates the finite graph, so the
13
+ * output is deterministic for equal canonical data: `anyOf` members follow
14
+ * the data form's kind order (`null`, `undefined`, booleans, numbers,
15
+ * strings, bigints, arrays, objects), and `properties`/`required` follow
16
+ * its sorted key order.
6
17
  *
7
18
  * @module
8
19
  *
9
- * @import { Struct, Tuple, Type as RttiType } from '../../../types/rtti/types.ts'
10
- * @import { Visitor } from '../../../types/rtti/common/types.ts'
11
- * @import { Primitive } from '../../../djs/types.ts'
20
+ * @import { Type as RttiType } from '../../../types/rtti/types.ts'
21
+ * @import { ArraySet, Data, KindSet, Node, ObjectSet, RuleSet, UnionSet } from '../../../types/rtti/data/types.ts'
12
22
  * @import { Ts } from '../../../types/rtti/ts/types.ts'
13
23
  * @import { Phantom } from '../../../types/phantom/types.ts'
14
24
  */
15
25
 
16
- import { array, option, or, record, string } from '../../../types/rtti/module.f.mjs'
17
- import { visit } from '../../../types/rtti/common/module.f.mjs'
26
+ import { assert, assertNotNullish } from '../../../asserts/module.f.mjs'
27
+ import { at, definedEntries } from '../../../types/object/module.f.mjs'
28
+ import { array, number, option, or, record, string } from '../../../types/rtti/module.f.mjs'
29
+ import { cmp, toData, unitBit, unknown as top } from '../../../types/rtti/data/module.f.mjs'
18
30
  import { unknown as jsonUnknown } from '../rtti/module.f.mjs'
19
31
 
20
- const unknownThunk = () => /** @type {const} */ (['const', unknownConst])
32
+ /** @type {() => readonly ['const', typeof unknownConst]} */
33
+ const unknownThunk = () => ['const', unknownConst]
21
34
 
22
35
  /**
23
36
  * rtti schema for a JSON Schema (draft 2020-12) document.
@@ -29,12 +42,16 @@ export const unknown = unknownThunk
29
42
  /** @typedef {Ts<typeof unknown>} Unknown */
30
43
 
31
44
  const unknownConst = /** @type {const} */ ({
45
+ $schema: option(string),
46
+ $ref: option(string),
47
+ $defs: option(record(unknown)),
32
48
  type: or('boolean', 'number', 'string', 'integer', 'array', 'object', undefined),
33
49
  const: option(jsonUnknown),
34
50
  not: option(unknown),
35
51
  anyOf: option(array(unknown)),
36
52
  items: or(unknown, false, undefined),
37
53
  prefixItems: option(array(unknown)),
54
+ minItems: option(number),
38
55
  properties: option(record(unknown)),
39
56
  required: option(array(string)),
40
57
  additionalProperties: option(unknown),
@@ -45,100 +62,248 @@ const unknownConst = /** @type {const} */ ({
45
62
  *
46
63
  * The `?` markers are required even though `Ts<>` already includes `undefined`
47
64
  * in each field type. Without `?`, `Unknown = _UnknownConst` would require all
48
- * 9 fields to be present in every object literal returned by `toJsonSchema`,
65
+ * 12 fields to be present in every object literal returned by `toJsonSchema`,
49
66
  * because TypeScript distinguishes "field absent" (`?`) from "field present but
50
67
  * undefined" (`T | undefined`). JSON Schema objects only include the fields
51
- * they need, so all fields must be optional.
68
+ * they need, so all fields must be optional. `$defs` is an *open* map — an
69
+ * absent entry types as `undefined`, so missing-reference handling cannot be
70
+ * skipped.
52
71
  * @typedef {{
72
+ * readonly $schema?: Ts<typeof unknownConst.$schema>
73
+ * readonly $ref?: Ts<typeof unknownConst.$ref>
74
+ * readonly $defs?: Ts<typeof unknownConst.$defs>
53
75
  * readonly type?: Ts<typeof unknownConst.type>
54
76
  * readonly const?: Ts<typeof unknownConst.const>
55
77
  * readonly not?: Ts<typeof unknownConst.not>
56
78
  * readonly anyOf?: Ts<typeof unknownConst.anyOf>
57
79
  * readonly items?: Ts<typeof unknownConst.items>
58
80
  * readonly prefixItems?: Ts<typeof unknownConst.prefixItems>
81
+ * readonly minItems?: Ts<typeof unknownConst.minItems>
59
82
  * readonly properties?: Ts<typeof unknownConst.properties>
60
83
  * readonly required?: Ts<typeof unknownConst.required>
61
84
  * readonly additionalProperties?: Ts<typeof unknownConst.additionalProperties>
62
85
  * }} _UnknownConst
63
86
  */
64
87
 
65
- /** Returns true if the rtti schema admits the value `undefined`.
66
- * @type {(rtti: RttiType) => boolean}
88
+ const nullBit = unitBit(null)
89
+ const undefinedBit = unitBit(undefined)
90
+ const falseBit = unitBit(false)
91
+ const trueBit = unitBit(true)
92
+ const booleanBits = falseBit | trueBit
93
+
94
+ /**
95
+ * Encodes a definition name for use inside a local `$ref` URI fragment:
96
+ * JSON Pointer escaping first (`~` → `~0`, `/` → `~1`), then
97
+ * percent-encoding of the remaining code points for the URI-fragment path
98
+ * segment. The order matters: a literal name `%2F` must encode to `%252F`,
99
+ * so URI decoding restores the literal `%2F` segment instead of a `/` that
100
+ * JSON Pointer evaluation would then misread as a separator.
101
+ *
102
+ * @type {(name: string) => string}
67
103
  */
68
- const admitsUndefined = rtti => {
69
- if (rtti === undefined) { return true }
70
- if (typeof rtti !== 'function') { return false }
71
- const [t, ...r] = rtti()
72
- return t === 'or' ? r.some(admitsUndefined) : false
104
+ const refEncode = name => {
105
+ let result = ''
106
+ for (const c of name) {
107
+ result += c === '~' ? '~0' : c === '/' ? '~1' : encodeURIComponent(c)
108
+ }
109
+ return result
73
110
  }
74
111
 
75
- /** Returns the schema with `undefined` removed from any top-level `or`.
76
- * @type {(rtti: RttiType) => RttiType}
112
+ /**
113
+ * A local `$ref` to a named definition. A reference must name an existing
114
+ * definition — a dangling name is malformed data and panics. The lookup is
115
+ * own-property only, so a name inherited from `Object.prototype`
116
+ * (`toString`, `constructor`, …) is still rejected.
117
+ *
118
+ * @type {(rules: RuleSet) => (name: string) => Unknown}
77
119
  */
78
- const stripUndefined = rtti => {
79
- if (typeof rtti !== 'function') { return rtti }
80
- const [t, ...r] = rtti()
81
- if (t !== 'or') { return rtti }
82
- const rest = r.flatMap(t => t !== undefined ? [t] : [])
83
- return rest.length === 1 ? rest[0] : or(...rest)
120
+ const refSchema = rules => name => {
121
+ assert(at(name)(rules) !== null, `missing definition: ${name}`)
122
+ return { $ref: `#/$defs/${refEncode(name)}` }
84
123
  }
85
124
 
86
- // Struct: keys not admitting undefined go into `required`; optional keys have
87
- // undefined stripped from their property schema. additionalProperties is omitted
88
- // (lenient), matching rtti's open-struct validation semantics.
89
- /** @type {(rtti: Struct) => Unknown} */
90
- const structSchema = rtti => {
91
- const ents = Object.entries(rtti)
92
- const properties = Object.fromEntries(
93
- ents.map(([k, v]) => [k, toJsonSchema(stripUndefined(v))])
94
- )
95
- const required = ents
96
- .filter(([, v]) => !admitsUndefined(v))
97
- .map(([k]) => k)
125
+ /** @type {(rules: RuleSet) => (n: Node) => Unknown} */
126
+ const nodeSchema = rules => n =>
127
+ typeof n === 'string' ? refSchema(rules)(n) : unionSchema(rules)(n)
128
+
129
+ /**
130
+ * The schemas of one kind component: nothing when absent, the whole kind
131
+ * when `true`, one schema per member otherwise.
132
+ *
133
+ * @template T
134
+ * @param {KindSet<T> | undefined} k
135
+ * @param {Unknown} whole
136
+ * @param {(v: T) => Unknown} item
137
+ * @returns {readonly Unknown[]}
138
+ */
139
+ const kindSchemas = (k, whole, item) =>
140
+ k === undefined ? [] :
141
+ k === true ? [whole] :
142
+ k.map(item)
143
+
144
+ /** @type {(v: boolean | number | string | null) => Unknown} */
145
+ const constSchema = v => ({ const: v })
146
+
147
+ /** bigint consts are represented as numbers (lossy for |value| > MAX_SAFE_INTEGER) */
148
+ /** @type {(v: bigint) => Unknown} */
149
+ const bigintConstSchema = v => ({ const: Number(v) })
150
+
151
+ /**
152
+ * The unit kind: `null` and `undefined` are their own singletons — no JSON
153
+ * value is `undefined`, hence `{ "not": {} }` — and both boolean bits
154
+ * together are the `boolean` type with no special-case rule.
155
+ *
156
+ * @type {(bits: number) => readonly Unknown[]}
157
+ */
158
+ const unitSchemas = bits => [
159
+ ...((bits & nullBit) === 0 ? [] : [constSchema(null)]),
160
+ ...((bits & undefinedBit) === 0 ? [] : [{ not: {} }]),
161
+ ...((bits & booleanBits) === booleanBits ? [{ type: /** @type {const} */ ('boolean') }]
162
+ : (bits & falseBit) !== 0 ? [constSchema(false)]
163
+ : (bits & trueBit) !== 0 ? [constSchema(true)]
164
+ : []),
165
+ ]
166
+
167
+ /**
168
+ * A set of arrays: `prefixItems` for the tuple prefix, `items` for the
169
+ * elements past it — `false` when the length is exact, so a tuple admits
170
+ * nothing beyond its prefix and the empty tuple is `{ "items": false }`.
171
+ * `prefixItems` alone constrains only elements that exist (draft 2020-12
172
+ * implies no minimum length), so a non-empty prefix also emits `minItems`.
173
+ *
174
+ * @type {(rules: RuleSet) => (p: ArraySet) => Unknown}
175
+ */
176
+ const arraySetSchema = rules => p => ({
177
+ type: 'array',
178
+ ...(p.prefix.length === 0 ? {} : {
179
+ prefixItems: p.prefix.map(nodeSchema(rules)),
180
+ minItems: p.prefix.length,
181
+ }),
182
+ items: p.rest === undefined ? false : nodeSchema(rules)(p.rest),
183
+ })
184
+
185
+ /** Whether the node's value set admits `undefined` — its unit bit, read
186
+ * through a reference if needed.
187
+ * @type {(rules: RuleSet) => (n: Node) => boolean}
188
+ */
189
+ const admitsUndefined = rules => n => {
190
+ const u = typeof n === 'string' ? assertNotNullish(at(n)(rules)) : n
191
+ return ((u.unit ?? 0) & undefinedBit) !== 0
192
+ }
193
+
194
+ /**
195
+ * The node with `undefined` removed — for an optional property's schema,
196
+ * where absence is already expressed by the key not being `required`. A
197
+ * reference is kept as-is: its definition is shared, and the extra
198
+ * `{ "not": {} }` member it may carry matches no JSON value anyway.
199
+ *
200
+ * @type {(n: Node) => Node}
201
+ */
202
+ const stripUndefined = n => {
203
+ if (typeof n === 'string') { return n }
204
+ const unit = (n.unit ?? 0) & ~undefinedBit
205
+ return {
206
+ ...(unit === 0 ? {} : { unit }),
207
+ ...(n.number === undefined ? {} : { number: n.number }),
208
+ ...(n.string === undefined ? {} : { string: n.string }),
209
+ ...(n.bigint === undefined ? {} : { bigint: n.bigint }),
210
+ ...(n.array === undefined ? {} : { array: n.array }),
211
+ ...(n.object === undefined ? {} : { object: n.object }),
212
+ }
213
+ }
214
+
215
+ /**
216
+ * A set of objects: `properties` for the declared keys — a key admitting
217
+ * `undefined` is optional and has `undefined` stripped from its schema,
218
+ * every other key is `required` — and `additionalProperties` for the rest.
219
+ * No `rest` leaves the other keys unconstrained (lenient), matching rtti's
220
+ * open-struct validation semantics.
221
+ *
222
+ * @type {(rules: RuleSet) => (p: ObjectSet) => Unknown}
223
+ */
224
+ const objectSetSchema = rules => p => {
225
+ const ents = definedEntries(p.props)
226
+ const required = ents.filter(([, n]) => !admitsUndefined(rules)(n)).map(([k]) => k)
98
227
  return {
99
228
  type: 'object',
100
- properties,
101
- ...(required.length > 0 ? { required } : {}),
229
+ ...(ents.length === 0 ? {} : {
230
+ properties: Object.fromEntries(ents.map(
231
+ ([k, n]) => /** @type {const} */ ([k, nodeSchema(rules)(stripUndefined(n))]))),
232
+ }),
233
+ ...(required.length === 0 ? {} : { required }),
234
+ ...(p.rest === undefined ? {} : { additionalProperties: nodeSchema(rules)(p.rest) }),
102
235
  }
103
236
  }
104
237
 
105
- /** @type {(rtti: Primitive) => Unknown} */
106
- const constPrimitiveSchema = rtti =>
107
- rtti === undefined
108
- ? { not: {} }
109
- // bigint consts are represented as numbers (lossy for |value| > MAX_SAFE_INTEGER)
110
- : { const: typeof rtti === 'bigint' ? Number(rtti) : rtti }
111
-
112
- /** @type {Visitor<Unknown>} */
113
- const visitor = {
114
- tuple: (/** @type {Tuple} */ t) => ({ type: 'array', prefixItems: t.map(toJsonSchema), items: false }),
115
- struct: structSchema,
116
- array: item => ({ type: 'array', items: toJsonSchema(item) }),
117
- record: item => ({ type: 'object', additionalProperties: toJsonSchema(item) }),
118
- or: variants => ({ anyOf: variants.map(toJsonSchema) }),
119
- constPrimitive: constPrimitiveSchema,
120
- // bigint is not representable in JSON Schema; 'integer' is the closest approximation
121
- primitive0: tag => ({ type: tag === 'bigint' ? 'integer' : tag }),
122
- unknown: () => ({}),
238
+ /** @type {(u: UnionSet) => boolean} */
239
+ const isTop = u => cmp([{}, u])([{}, top]) === 0
240
+
241
+ /** @type {(rules: RuleSet) => (u: UnionSet) => Unknown} */
242
+ const unionSchema = rules => u => {
243
+ if (isTop(u)) { return {} }
244
+ const members = [
245
+ ...unitSchemas(u.unit ?? 0),
246
+ ...kindSchemas(u.number, { type: 'number' }, constSchema),
247
+ ...kindSchemas(u.string, { type: 'string' }, constSchema),
248
+ ...kindSchemas(u.bigint, { type: 'integer' }, bigintConstSchema),
249
+ ...kindSchemas(u.array, { type: 'array' }, arraySetSchema(rules)),
250
+ ...kindSchemas(u.object, { type: 'object' }, objectSetSchema(rules)),
251
+ ]
252
+ return members.length === 0 ? { not: {} }
253
+ : members.length === 1 ? members[0]
254
+ : { anyOf: members }
123
255
  }
124
256
 
125
257
  /**
126
- * Converts an rtti `Type` to a JSON Schema (draft 2020-12) object.
258
+ * Converts a serializable RTTI {@link Data} (from `toData`) to a JSON Schema
259
+ * (draft 2020-12) object.
260
+ *
261
+ * Every named rule is emitted exactly once under `$defs` and each reference
262
+ * becomes a local `$ref` — self- and mutual recursion terminate, and the
263
+ * root itself is a `$ref` when the entry is a named definition. Definition
264
+ * names come from the data form (deterministic for equal canonical data)
265
+ * and are JSON Pointer-escaped, then percent-encoded, for the `$ref`
266
+ * fragment. A reference naming a missing definition panics.
267
+ *
268
+ * @type {(data: Data) => Unknown}
269
+ */
270
+ export const dataToJsonSchema = ([rules, entry]) => {
271
+ const ruleEntries = definedEntries(rules)
272
+ const root = nodeSchema(rules)(entry)
273
+ return ruleEntries.length === 0 ? root : {
274
+ ...root,
275
+ $defs: Object.fromEntries(ruleEntries.map(
276
+ ([name, u]) => /** @type {const} */ ([name, unionSchema(rules)(u)]))),
277
+ }
278
+ }
279
+
280
+ /**
281
+ * Converts an rtti `Type` to a JSON Schema (draft 2020-12) object, through
282
+ * the canonical data form: `toData` first, then {@link dataToJsonSchema}.
127
283
  *
128
284
  * | rtti | JSON Schema |
129
285
  * |-----------------------------------------------|-------------------------------------------------------------------------------------|
130
286
  * | `boolean` / `number` / `string` | `{ "type": "..." }` |
131
287
  * | `bigint` | `{ "type": "integer" }` (lossy; JSON integers are IEEE-754 doubles) |
132
288
  * | `unknown` | `{}` (always-true schema) |
133
- * | primitive const (`42`, `'x'`, `true`, `null`) | `{ "const": <value> }` |
289
+ * | `never` / `or()` | `{ "not": {} }` (no JSON value satisfies this) |
290
+ * | primitive const (`42`, `'x'`, `null`) | `{ "const": <value> }` |
291
+ * | `or(true, false)` | `{ "type": "boolean" }` (the union normalizes to the whole kind) |
134
292
  * | `bigint` const | `{ "const": Number(value) }` (lossy for \|value\| > MAX_SAFE_INTEGER) |
135
- * | `undefined` const | `{ "not": {} }` (no JSON value satisfies this) |
293
+ * | `undefined` const | `{ "not": {} }` |
136
294
  * | struct `{ a: T, … }` | `{ "type": "object", "properties": { "a": …T… }, "required": [non-optional keys] }` |
137
- * | tuple `[A, B]` | `{ "type": "array", "prefixItems": […A…, …B…], "items": false }` |
295
+ * | tuple `[A, B]` | `{ "type": "array", "prefixItems": […A…, …B…], "minItems": 2, "items": false }` |
138
296
  * | `array(T)` | `{ "type": "array", "items": …T… }` |
139
297
  * | `record(T)` | `{ "type": "object", "additionalProperties": …T… }` |
140
- * | `or(...types)` | `{ "anyOf": […each…] }` |
298
+ * | `or(...types)` | `{ "anyOf": […each…] }`, normalized and in canonical kind order |
299
+ * | recursive schema | `{ "$ref": "#/$defs/<name>", "$defs": { "<name>": … } }` |
300
+ *
301
+ * The union rows follow the data form's normalization: operands are merged
302
+ * kind-wise, literals covered by their whole kind are absorbed
303
+ * (`or(42, number)` is all numbers), subsumed patterns are dropped, and
304
+ * duplicates collapse — so structurally different but equivalent thunk
305
+ * schemas produce the same JSON Schema.
141
306
  *
142
307
  * @type {(rtti: RttiType) => Unknown}
143
308
  */
144
- export const toJsonSchema = visit(visitor)
309
+ export const toJsonSchema = rtti => dataToJsonSchema(toData(rtti))
@@ -1,7 +1,14 @@
1
1
  /**
2
2
  * @import { Unknown as JsonValue } from '../types.ts'
3
3
  * @import { Unknown } from './module.f.mjs'
4
+ * @import { Data } from '../../../types/rtti/data/types.ts'
4
5
  */
6
+ import { number, string } from '../../../types/rtti/module.f.mjs';
7
+ export type _List = () => readonly ['array', _List];
8
+ export type _Tree = () => readonly ['or', typeof number, _Forest];
9
+ export type _Forest = () => readonly ['array', _Tree];
10
+ export type _Lock = () => readonly ['record', () => readonly ['or', typeof string, _Lock]];
11
+ export type _Rec = () => readonly ['record', _Rec];
5
12
  export declare const proof: {
6
13
  tag0: {
7
14
  boolean: () => void;
@@ -30,11 +37,45 @@ export declare const proof: {
30
37
  empty: () => void;
31
38
  orOptional: () => void;
32
39
  withConst: () => void;
40
+ optionalOfEveryKind: () => void;
33
41
  };
34
42
  schemaUnknownTag: () => void;
35
43
  nested: {
36
44
  arrayOfRecords: () => void;
37
45
  orWithConst: () => void;
38
46
  structWithOr: () => void;
47
+ topInsideTuple: () => void;
48
+ };
49
+ normalization: {
50
+ booleanFromConsts: () => void;
51
+ unitMembers: () => void;
52
+ literalAbsorbed: () => void;
53
+ duplicateLiteral: () => void;
54
+ never: () => void;
55
+ emptyTuple: () => void;
56
+ coverageCollapse: () => void;
57
+ commutative: () => void;
58
+ };
59
+ recursion: {
60
+ selfList: () => void;
61
+ mutualEntry: () => void;
62
+ mutualInline: () => void;
63
+ recursiveUnion: () => void;
64
+ recursiveRecord: () => void;
65
+ optionalRecursiveProperty: () => void;
66
+ revisionLock: () => void;
67
+ sharedNonRecursive: () => void;
68
+ };
69
+ data: {
70
+ plain: () => void;
71
+ tupleWithRest: () => void;
72
+ structWithRest: () => void;
73
+ optionalByReference: () => void;
74
+ };
75
+ refEncoding: () => void;
76
+ throw: {
77
+ missingRootDefinition: () => import("./module.f.mjs")._UnknownConst;
78
+ missingPrototypeDefinition: () => import("./module.f.mjs")._UnknownConst;
79
+ missingNestedDefinition: () => import("./module.f.mjs")._UnknownConst;
39
80
  };
40
81
  };