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
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Types for the serializable RTTI data form.
3
+ *
4
+ * A schema in data form denotes a set of values. The representation
5
+ * partitions that set into six disjoint *kinds* — unit values (`null`,
6
+ * `undefined`, `false`, `true`), numbers, strings, bigints, arrays and
7
+ * objects — so that union, equality and subset reduce to kind-wise set
8
+ * operations. See `./README.md` for the design rationale.
9
+ *
10
+ * @module
11
+ */
12
+ import type { StringMap } from '../../object/types.ts';
13
+ /**
14
+ * A set of values of one kind: `true` is the whole kind, an array lists its
15
+ * members (literals or patterns), canonically sorted and deduplicated. An
16
+ * empty kind is an absent property of {@link UnionSet}, never an empty array.
17
+ */
18
+ export type KindSet<T> = true | readonly T[];
19
+ /**
20
+ * A set of arrays: a tuple with an optional rest.
21
+ *
22
+ * - `prefix` constrains the value set of each leading position.
23
+ * - `rest` present: the array may be any length `>= prefix.length`, and every
24
+ * element past the prefix belongs to `rest`.
25
+ * - `rest` absent: the array length is exactly `prefix.length`.
26
+ *
27
+ * A tuple schema is `{ prefix }`; a uniform array schema is
28
+ * `{ prefix: [], rest }`. Both are points of the same kind, so
29
+ * `readonly [number] ⊂ readonly number[]` is a plain pattern inclusion.
30
+ */
31
+ export type ArraySet = {
32
+ readonly prefix: readonly Node[];
33
+ readonly rest?: Node;
34
+ };
35
+ /**
36
+ * A set of objects: per-key value sets with an optional rest.
37
+ *
38
+ * - `props` constrains, per declared key, the value *read* at that key — an
39
+ * absent property reads as `undefined`, so a key is required exactly when
40
+ * its set excludes `undefined`. Keys are canonically sorted, and a key
41
+ * whose set is the whole value domain is omitted.
42
+ * - `rest` present: the value at every other *present* key belongs to `rest`.
43
+ * - `rest` absent: other keys are unconstrained.
44
+ *
45
+ * A struct schema is `{ props }`; a uniform record schema is
46
+ * `{ props: {}, rest }`.
47
+ */
48
+ export type ObjectSet = {
49
+ readonly props: StringMap<Node>;
50
+ readonly rest?: Node;
51
+ };
52
+ /**
53
+ * A set of values as a disjoint union over the six kinds. An absent
54
+ * component is the empty set of that kind, so `{}` is `never` and a union
55
+ * with every component at its maximum (see `unknown` in `./module.f.mjs`)
56
+ * is `unknown`.
57
+ *
58
+ * `unit` is a bitset over the four singleton values; bit `1 << i` stands for
59
+ * `unitList[i]` from `./module.f.mjs` (`['null', 'undefined', 'false',
60
+ * 'true']`), so `or(true, false)` collapses to the two boolean bits with no
61
+ * special-case rule.
62
+ */
63
+ export type UnionSet = {
64
+ readonly unit?: number;
65
+ readonly number?: KindSet<number>;
66
+ readonly string?: KindSet<string>;
67
+ readonly bigint?: KindSet<bigint>;
68
+ readonly array?: KindSet<ArraySet>;
69
+ readonly object?: KindSet<ObjectSet>;
70
+ };
71
+ /**
72
+ * A nested type position: an inline {@link UnionSet}, or the name of a rule
73
+ * in the enclosing {@link RuleSet}. Only recursive definitions are named;
74
+ * everything else is inlined, so non-recursive schemas are pure trees.
75
+ */
76
+ export type Node = UnionSet | string;
77
+ /** Named recursive definitions, referenced by {@link Node} strings. */
78
+ export type RuleSet = StringMap<UnionSet>;
79
+ /**
80
+ * A complete serializable schema: the named recursive definitions plus the
81
+ * entry node. Produced by `toData` in `./module.f.mjs`.
82
+ */
83
+ export type Data = readonly [RuleSet, Node];
@@ -1,11 +1,18 @@
1
+ /**
2
+ * Runtime type information (RTTI) — a type-safe schema system for describing and
3
+ * converting TypeScript types. See `./types.ts` for the type-level API.
4
+ *
5
+ * @module
6
+ *
7
+ * @import { Includes } from '../array/types.ts'
8
+ * @import { Assert } from '../../asserts/types.ts'
9
+ * @import { Equal } from '../ts/types.ts'
10
+ * @import { Tag0, Primitive0, _Type0, Bigint, Unknown, Tag1, _MakeType1, Array, Record, Or, Type } from './types.ts'
11
+ */
1
12
  import type { Includes } from '../array/types.ts';
2
13
  import type { Assert } from '../../asserts/types.ts';
3
14
  import type { Equal } from '../ts/types.ts';
4
15
  import type { Primitive0, _Type0, Bigint, Unknown, Tag1, _MakeType1, Or, Type } from './types.ts';
5
- /** @import { Includes } from '../array/types.ts' */
6
- /** @import { Assert } from '../../asserts/types.ts' */
7
- /** @import { Equal } from '../ts/types.ts' */
8
- /** @import { Tag0, Primitive0, _Type0, Bigint, Unknown, Tag1, _MakeType1, Array, Record, Or, Type } from './types.ts' */
9
16
  declare const primitive0List: readonly ['bigint', 'boolean', 'number', 'string'];
10
17
  export type _Primitive0Pinned = Assert<Equal<Primitive0, typeof primitive0List[number]>>;
11
18
  /** @typedef {Assert<Equal<Primitive0, typeof primitive0List[number]>>} _Primitive0Pinned */
@@ -53,7 +60,7 @@ export declare const record: _MakeType1<'record'>;
53
60
  * `or` is intentionally a lazy, allocation-free constructor: it captures its
54
61
  * arguments in a thunk and does no flattening, deduplication, subset analysis,
55
62
  * or canonical-form work. All such algebra lives on the serializable data form
56
- * — see `issues/143-rtti-data.md`.
63
+ * — see `./data/README.md`.
57
64
  *
58
65
  * @template {readonly Type[]} T
59
66
  * @param {T} types
@@ -3,12 +3,14 @@
3
3
  * converting TypeScript types. See `./types.ts` for the type-level API.
4
4
  *
5
5
  * @module
6
+ *
7
+ * @import { Includes } from '../array/types.ts'
8
+ * @import { Assert } from '../../asserts/types.ts'
9
+ * @import { Equal } from '../ts/types.ts'
10
+ * @import { Tag0, Primitive0, _Type0, Bigint, Unknown, Tag1, _MakeType1, Array, Record, Or, Type } from './types.ts'
6
11
  */
12
+
7
13
  import { includes } from '../array/module.f.mjs'
8
- /** @import { Includes } from '../array/types.ts' */
9
- /** @import { Assert } from '../../asserts/types.ts' */
10
- /** @import { Equal } from '../ts/types.ts' */
11
- /** @import { Tag0, Primitive0, _Type0, Bigint, Unknown, Tag1, _MakeType1, Array, Record, Or, Type } from './types.ts' */
12
14
 
13
15
  const primitive0List = /** @type {const} */ (['bigint', 'boolean', 'number', 'string'])
14
16
 
@@ -84,7 +86,7 @@ export const record = type1('record')
84
86
  * `or` is intentionally a lazy, allocation-free constructor: it captures its
85
87
  * arguments in a thunk and does no flattening, deduplication, subset analysis,
86
88
  * or canonical-form work. All such algebra lives on the serializable data form
87
- * — see `issues/143-rtti-data.md`.
89
+ * — see `./data/README.md`.
88
90
  *
89
91
  * @template {readonly Type[]} T
90
92
  * @param {T} types
@@ -1,3 +1,41 @@
1
+ /**
2
+ * Runtime deserialization of unknown values against RTTI schemas.
3
+ *
4
+ * The main entry point is `parse(rtti)`, which takes a schema `Type` and returns
5
+ * a `Parse<T>` function. When called with an unknown value, it returns a `Result`
6
+ * that is either `['ok', newValue]` or `['error', { path, message }]`.
7
+ *
8
+ * Unlike `validate`, which checks an existing value in-place and returns it
9
+ * unchanged on success, `parse` always returns a freshly constructed value that
10
+ * contains only the fields/elements declared by the schema. This makes both
11
+ * structs and tuples effectively closed at runtime, matching the TypeScript
12
+ * type produced by `Ts<T>`:
13
+ *
14
+ * - Tuples: the result has exactly the schema's length; extra elements are dropped.
15
+ * - Structs: the result contains only the schema's keys; extra properties are dropped.
16
+ * - Arrays/records: every element/value is itself parsed, so a fresh container is
17
+ * always returned even if the inner type is a primitive.
18
+ *
19
+ * This also provides forward compatibility with extended serialization formats:
20
+ * a schema-based parser keeps working when newer versions of the format add
21
+ * extra fields or tuple elements.
22
+ *
23
+ * The error shape, path bookkeeping, primitive checks, and schema
24
+ * recognition (`visit`) are shared with `validate` through
25
+ * `../common/module.f.mjs`; only container construction differs.
26
+ *
27
+ * See `./types.ts` for the `Result`/`Parse` type-level API.
28
+ *
29
+ * @module
30
+ *
31
+ * @import { Info1, Struct, Tag1, Tuple, Type } from '../types.ts'
32
+ * @import { Result as CommonResult } from '../../result/types.ts'
33
+ * @import { StringMap } from '../../object/types.ts'
34
+ * @import { List } from '../../list/types.ts'
35
+ * @import { Container, IsContainer, ValidateE, ValidationError, Visitor } from '../common/types.ts'
36
+ * @import { Unknown } from '../ts/types.ts'
37
+ * @import { Parse } from './types.ts'
38
+ */
1
39
  import type { Type } from '../types.ts';
2
40
  import type { Result as CommonResult } from '../../result/types.ts';
3
41
  import type { ValidationError } from '../common/types.ts';
@@ -27,12 +27,17 @@
27
27
  * See `./types.ts` for the `Result`/`Parse` type-level API.
28
28
  *
29
29
  * @module
30
+ *
31
+ * @import { Info1, Struct, Tag1, Tuple, Type } from '../types.ts'
32
+ * @import { Result as CommonResult } from '../../result/types.ts'
33
+ * @import { StringMap } from '../../object/types.ts'
34
+ * @import { List } from '../../list/types.ts'
35
+ * @import { Container, IsContainer, ValidateE, ValidationError, Visitor } from '../common/types.ts'
36
+ * @import { Unknown } from '../ts/types.ts'
37
+ * @import { Parse } from './types.ts'
30
38
  */
31
- /** @import { Info1, Struct, Tag1, Tuple, Type } from '../types.ts' */
32
- /** @import { Result as CommonResult } from '../../result/types.ts' */
39
+
33
40
  import { ok } from '../../result/module.f.mjs'
34
- /** @import { StringMap } from '../../object/types.ts' */
35
- /** @import { List } from '../../list/types.ts' */
36
41
  import { reverse, toArray } from '../../list/module.f.mjs'
37
42
  import {
38
43
  constPrimitiveValidate,
@@ -44,9 +49,6 @@ import {
44
49
  verror,
45
50
  visit,
46
51
  } from '../common/module.f.mjs'
47
- /** @import { Container, IsContainer, ValidateE, ValidationError, Visitor } from '../common/types.ts' */
48
- /** @import { Unknown } from '../ts/types.ts' */
49
- /** @import { Parse } from './types.ts' */
50
52
 
51
53
  const { entries } = Object
52
54
 
@@ -8,7 +8,11 @@
8
8
 
9
9
  import { parse } from './module.f.mjs'
10
10
  import { boolean, number, string, bigint, unknown, array, record, or, option } from '../module.f.mjs'
11
- import { assert, assertEq } from '../../../asserts/module.f.mjs'
11
+ import {
12
+ assert,
13
+ assertEq,
14
+ assertStructurallySame,
15
+ } from '../../../asserts/module.f.mjs'
12
16
 
13
17
  /** @type {(r: readonly [string, unknown]) => void} */
14
18
  const assertOk = ([k]) => { assertEq(k, 'ok', 'expected ok') }
@@ -31,33 +35,9 @@ const assertErrorPath = expected =>
31
35
  r => {
32
36
  assert(r[0] === 'error', 'expected error')
33
37
  const e = /** @type {ValidationError} */ (r[1])
34
- if (e.path.length !== expected.length) { throw `path length ${e.path.length} != ${expected.length}` }
35
- for (let i = 0; i < expected.length; i++) {
36
- if (e.path[i] !== expected[i]) { throw `path[${i}] ${e.path[i]} != ${expected[i]}` }
37
- }
38
+ assertStructurallySame(e.path, expected, 'unexpected error path')
38
39
  }
39
40
 
40
- /** @type {(a: unknown, b: unknown) => void} */
41
- const assertDeepEqual = (a, b) => {
42
- if (a === b) { return }
43
- if (a instanceof Array && b instanceof Array) {
44
- if (a.length !== b.length) { throw `array length ${a.length} != ${b.length}` }
45
- for (let i = 0; i < a.length; i++) { assertDeepEqual(a[i], b[i]) }
46
- return
47
- }
48
- if (typeof a === 'object' && a !== null && typeof b === 'object' && b !== null) {
49
- const ka = Object.keys(a).sort()
50
- const kb = Object.keys(b).sort()
51
- if (ka.length !== kb.length) { throw `key count ${ka.length} != ${kb.length}` }
52
- for (let i = 0; i < ka.length; i++) {
53
- if (ka[i] !== kb[i]) { throw `key ${ka[i]} != ${kb[i]}` }
54
- assertDeepEqual((/** @type {any} */ (a))[ka[i]], (/** @type {any} */ (b))[kb[i]])
55
- }
56
- return
57
- }
58
- throw `not deep-equal: ${String(a)} vs ${String(b)}`
59
- }
60
-
61
41
  export const proof = {
62
42
  boolean: {
63
43
  ok: () => {
@@ -173,12 +153,12 @@ export const proof = {
173
153
  ok: () => {
174
154
  const t = /** @type {const} */ ([42, 'hello'])
175
155
  const r = parse(t)([42, 'hello'])
176
- assertDeepEqual(unwrap(r), [42, 'hello'])
156
+ assertStructurallySame(unwrap(r), [42, 'hello'])
177
157
  },
178
158
  // The key behavior change vs `validate`: extra tuple elements are dropped.
179
159
  extraItemsDropped: () => {
180
160
  const r = parse(/** @type {const} */ ([42]))([42, 'extra'])
181
- assertDeepEqual(unwrap(r), [42])
161
+ assertStructurallySame(unwrap(r), [42])
182
162
  },
183
163
  error: () => {
184
164
  assertError(parse(/** @type {const} */ ([42]))([99]))
@@ -189,12 +169,12 @@ export const proof = {
189
169
  ok: () => {
190
170
  const t = /** @type {const} */ ({ a: 42, b: 'hello' })
191
171
  const r = parse(t)({ a: 42, b: 'hello' })
192
- assertDeepEqual(unwrap(r), { a: 42, b: 'hello' })
172
+ assertStructurallySame(unwrap(r), { a: 42, b: 'hello' })
193
173
  },
194
174
  // Undeclared properties are dropped from the constructed value.
195
175
  extraKeysDropped: () => {
196
176
  const r = parse(/** @type {const} */ ({ a: /** @type {const} */ (42) }))({ a: 42, b: 'extra' })
197
- assertDeepEqual(unwrap(r), { a: 42 })
177
+ assertStructurallySame(unwrap(r), { a: 42 })
198
178
  },
199
179
  error: () => {
200
180
  assertError(parse(/** @type {const} */ ({ a: 42 }))({ a: 99 }))
@@ -205,11 +185,11 @@ export const proof = {
205
185
  array: {
206
186
  empty: () => {
207
187
  const r = parse(array(number))([])
208
- assertDeepEqual(unwrap(r), [])
188
+ assertStructurallySame(unwrap(r), [])
209
189
  },
210
190
  ok: () => {
211
191
  const r = parse(array(number))([1, 2, 3])
212
- assertDeepEqual(unwrap(r), [1, 2, 3])
192
+ assertStructurallySame(unwrap(r), [1, 2, 3])
213
193
  },
214
194
  // `parse` always constructs a new array, even when the inner type is a primitive.
215
195
  freshArray: () => {
@@ -217,7 +197,7 @@ export const proof = {
217
197
  /** @type {readonly number[]} */
218
198
  const out = unwrap(parse(array(number))(input))
219
199
  assert(out !== /** @type {unknown} */ (input), 'expected a fresh array')
220
- assertDeepEqual(out, [1, 2, 3])
200
+ assertStructurallySame(out, [1, 2, 3])
221
201
  },
222
202
  error: () => {
223
203
  assertError(parse(array(number))([1, 'two', 3]))
@@ -226,18 +206,18 @@ export const proof = {
226
206
  },
227
207
  nested: () => {
228
208
  const r = parse(array(array(boolean)))([[true, false], [false]])
229
- assertDeepEqual(unwrap(r), [[true, false], [false]])
209
+ assertStructurallySame(unwrap(r), [[true, false], [false]])
230
210
  assertError(parse(array(array(boolean)))([[true, 42]]))
231
211
  },
232
212
  },
233
213
  record: {
234
214
  empty: () => {
235
215
  const r = parse(record(number))({})
236
- assertDeepEqual(unwrap(r), {})
216
+ assertStructurallySame(unwrap(r), {})
237
217
  },
238
218
  ok: () => {
239
219
  const r = parse(record(string))({ a: 'hello', b: 'world' })
240
- assertDeepEqual(unwrap(r), { a: 'hello', b: 'world' })
220
+ assertStructurallySame(unwrap(r), { a: 'hello', b: 'world' })
241
221
  },
242
222
  // `parse` always constructs a new record.
243
223
  freshRecord: () => {
@@ -245,7 +225,7 @@ export const proof = {
245
225
  /** @type {Record<string, number>} */
246
226
  const out = unwrap(parse(record(number))(input))
247
227
  assert(out !== /** @type {unknown} */ (input), 'expected a fresh record')
248
- assertDeepEqual(out, { a: 1, b: 2 })
228
+ assertStructurallySame(out, { a: 1, b: 2 })
249
229
  },
250
230
  error: () => {
251
231
  assertError(parse(record(number))({ a: 1, b: 'two' }))
@@ -294,7 +274,7 @@ export const proof = {
294
274
  /** @type {readonly number[]} */
295
275
  const out = unwrap(parse(t)([1, 2, 3]))
296
276
  // The const tuple `[number]` matches first and returns a length-1 result.
297
- assertDeepEqual(out, [1])
277
+ assertStructurallySame(out, [1])
298
278
  },
299
279
  },
300
280
  option: {
@@ -1,4 +1,6 @@
1
- /** @import { StringMap } from '../object/types.ts' */
1
+ /**
2
+ * @import { StringMap } from '../object/types.ts'
3
+ */
2
4
  import type { StringMap } from '../object/types.ts';
3
5
  export type _Tests = StringMap<readonly unknown[]>;
4
6
  export declare const proof: {
@@ -1,4 +1,6 @@
1
- /** @import { StringMap } from '../object/types.ts' */
1
+ /**
2
+ * @import { StringMap } from '../object/types.ts'
3
+ */
2
4
 
3
5
  /** @typedef {StringMap<readonly unknown[]>} _Tests */
4
6
 
@@ -1,16 +1,72 @@
1
+ /**
2
+ * Runtime printer mirroring the `Ts<T>` type transformer for RTTI schemas.
3
+ * See `./types.ts` for `Ts<T>` and the `*Ts` transformer types.
4
+ *
5
+ * The printer routes through the serializable RTTI data form
6
+ * (`fjs/types/rtti/data`): `thunk RTTI → toData → dataToTs`. The data form
7
+ * is a finite graph, so recursive schemas — which the thunk graph represents
8
+ * as self-referencing functions with no leaves — terminate: every named rule
9
+ * becomes a TypeScript type-alias definition and every graph edge prints as
10
+ * that alias's identifier. Output is canonical: union members follow the
11
+ * data form's kind order and object keys its sorted order, so structurally
12
+ * different but equivalent schemas print identically.
13
+ *
14
+ * @module
15
+ *
16
+ * @import { Printer, StructField } from '../../ts/types.ts'
17
+ * @import { Type } from '../types.ts'
18
+ * @import { ArraySet, Data, KindSet, Node, ObjectSet, RuleSet, UnionSet } from '../data/types.ts'
19
+ */
20
+ import type { Printer } from '../../ts/types.ts';
1
21
  import type { Type } from '../types.ts';
2
- /** @import { Const, Type } from '../types.ts' */
22
+ import type { Data, RuleSet } from '../data/types.ts';
23
+ export type _Ctx = {
24
+ readonly ts: Printer;
25
+ readonly ids: readonly (readonly [string, string])[];
26
+ readonly rules: RuleSet;
27
+ };
28
+ /**
29
+ * Renders a serializable RTTI {@link Data} (from `toData`) as TypeScript:
30
+ * the rule definitions as sorted `[identifier, expression]` pairs — render
31
+ * each as `type <identifier> = <expression>` — plus the entry expression,
32
+ * which references those identifiers. A schema with no reference cycles has
33
+ * no definitions and the entry expression stands alone.
34
+ *
35
+ * Rule names come from the data form; one that cannot name a type alias —
36
+ * not an identifier, a predefined type name, an ECMAScript reserved word,
37
+ * or a type-operator keyword — gets a deterministic generated identifier
38
+ * (`T0`, `T1`, …). A reference naming a missing definition panics.
39
+ *
40
+ * @example
41
+ * ```js
42
+ * const list = () => ['array', list]
43
+ * dataToTs()(toData(list))
44
+ * // [[['list', 'readonly(list)[]']], 'list']
45
+ * // i.e. `type list = readonly(list)[]` and the entry expression `list`
46
+ * ```
47
+ *
48
+ * @type {(mut?: true) => (data: Data) => readonly [readonly (readonly [string, string])[], string]}
49
+ */
50
+ export declare const dataToTs: (mut?: true) => (data: Data) => readonly [readonly (readonly [string, string])[], string];
3
51
  /**
4
- * Creates a printer that converts an RTTI schema `Type` to its TypeScript type expression as a string.
52
+ * Creates a printer that converts an RTTI schema `Type` to its TypeScript
53
+ * type expression as a string, through the canonical data form: `toData`
54
+ * first, then {@link dataToTs}.
5
55
  *
6
- * Mirrors the compile-time `Ts<T>` mapped type at runtime.
7
- * Pass `true` to emit mutable (non-`readonly`) types.
56
+ * Mirrors the compile-time `Ts<T>` mapped type at runtime, in the data
57
+ * form's canonical order union members follow its kind order (e.g.
58
+ * `option(number)` prints `'undefined|number'`) and structurally different
59
+ * but equivalent schemas print identically (`or(true, false)` prints
60
+ * `'boolean'`). Pass `true` to emit mutable (non-`readonly`) types.
8
61
  *
9
- * **Note:** recursive schemas (e.g. `const list = () => ['array', list] as const`)
10
- * will cause infinite recursion. Only acyclic schemas are supported.
62
+ * A recursive schema prints as the identifier of its definition use
63
+ * {@link dataToTs} to also obtain the `type <identifier> = <expression>`
64
+ * definitions the expression references; a schema with no reference cycles
65
+ * needs none.
11
66
  *
12
- * **Note:** the `unknown` schema produces the string `'unknown'` (TypeScript's built-in),
13
- * whereas `Ts<>` maps it to `DjsUnknown` from `djs/module.f.ts`.
67
+ * **Note:** the `unknown` schema produces the string `'unknown'`
68
+ * (TypeScript's built-in), whereas `Ts<>` maps it to `DjsUnknown` from
69
+ * `djs/module.f.ts`.
14
70
  *
15
71
  * @example
16
72
  * ```js
@@ -18,12 +74,15 @@ import type { Type } from '../types.ts';
18
74
  * toTs(boolean) // 'boolean'
19
75
  * toTs(array(number)) // 'readonly(number)[]'
20
76
  * toTs(record(string)) // '{readonly[k in string]?:string}'
21
- * toTs(or(string, number)) // 'string|number'
77
+ * toTs(or(string, number)) // 'number|string'
22
78
  * toTs(42) // '42'
23
79
  * toTs('hello') // '"hello"'
24
80
  * toTs([boolean, number]) // 'readonly[boolean,number]'
25
81
  * toTs({ x: string }) // '{readonly"x":string}'
26
82
  *
83
+ * const list = () => ['array', list]
84
+ * toTs(list) // 'list' — see `dataToTs` for the definition
85
+ *
27
86
  * const toTsMut = printer(true)
28
87
  * toTsMut(array(number)) // '(number)[]'
29
88
  * toTsMut(record(string)) // '{[k in string]?:string}'