functionalscript 0.44.0 → 0.46.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 (571) hide show
  1. package/README.md +5 -3
  2. package/fjs/asn.1/module.f.mjs +8 -1
  3. package/fjs/asn.1/proof.f.d.mts +15 -0
  4. package/fjs/asn.1/proof.f.mjs +31 -3
  5. package/fjs/asserts/module.f.d.mts +14 -0
  6. package/fjs/asserts/module.f.mjs +20 -0
  7. package/fjs/asserts/proof.f.d.mts +3 -0
  8. package/fjs/asserts/proof.f.mjs +15 -1
  9. package/fjs/basen/base128/module.f.mjs +22 -5
  10. package/fjs/basen/base128/proof.f.d.mts +3 -1
  11. package/fjs/basen/base128/proof.f.mjs +3 -1
  12. package/fjs/basen/base64/module.f.mjs +7 -3
  13. package/fjs/basen/base64/proof.f.d.mts +3 -1
  14. package/fjs/basen/base64/proof.f.mjs +7 -4
  15. package/fjs/basen/cbase32/proof.f.d.mts +3 -1
  16. package/fjs/basen/cbase32/proof.f.mjs +3 -1
  17. package/fjs/bnf/data/module.f.d.mts +32 -6
  18. package/fjs/bnf/data/module.f.mjs +112 -7
  19. package/fjs/bnf/data/proof.f.d.mts +2 -0
  20. package/fjs/bnf/data/proof.f.mjs +74 -4
  21. package/fjs/bnf/data/types.d.ts +20 -2
  22. package/fjs/bnf/descent/module.f.d.mts +34 -5
  23. package/fjs/bnf/descent/module.f.mjs +176 -54
  24. package/fjs/bnf/descent/proof.f.d.mts +3 -0
  25. package/fjs/bnf/descent/proof.f.mjs +189 -27
  26. package/fjs/bnf/descent/types.d.ts +24 -18
  27. package/fjs/bnf/ll1/module.f.d.mts +74 -6
  28. package/fjs/bnf/ll1/module.f.mjs +297 -95
  29. package/fjs/bnf/ll1/proof.f.d.mts +17 -2
  30. package/fjs/bnf/ll1/proof.f.mjs +372 -137
  31. package/fjs/bnf/ll1/types.d.ts +25 -27
  32. package/fjs/bnf/matcher/module.f.d.mts +66 -0
  33. package/fjs/bnf/matcher/module.f.mjs +81 -0
  34. package/fjs/bnf/matcher/proof.f.d.mts +10 -0
  35. package/fjs/bnf/matcher/proof.f.mjs +79 -0
  36. package/fjs/bnf/matcher/types.d.ts +54 -0
  37. package/fjs/bnf/module.f.d.mts +15 -6
  38. package/fjs/bnf/module.f.mjs +52 -11
  39. package/fjs/bnf/proof.f.d.mts +2 -0
  40. package/fjs/bnf/proof.f.mjs +79 -3
  41. package/fjs/bnf/testlib.f.d.mts +31 -0
  42. package/fjs/bnf/testlib.f.mjs +80 -0
  43. package/fjs/bnf/token_symbol/module.f.d.mts +4 -3
  44. package/fjs/bnf/token_symbol/module.f.mjs +7 -6
  45. package/fjs/bnf/token_symbol/proof.f.mjs +5 -2
  46. package/fjs/bnf/token_symbol/types.d.ts +2 -2
  47. package/fjs/bnf/types.d.ts +10 -3
  48. package/fjs/cas/cli/module.f.d.mts +1 -1
  49. package/fjs/cas/cli/module.f.mjs +14 -20
  50. package/fjs/cas/cli/proof.f.d.mts +4 -4
  51. package/fjs/cas/cli/proof.f.mjs +47 -34
  52. package/fjs/cas/evo/module.f.d.mts +71 -31
  53. package/fjs/cas/evo/module.f.mjs +223 -138
  54. package/fjs/cas/evo/proof.f.d.mts +10 -1
  55. package/fjs/cas/evo/proof.f.mjs +311 -226
  56. package/fjs/cas/evo/types.d.ts +45 -9
  57. package/fjs/cas/module.f.d.mts +18 -32
  58. package/fjs/cas/module.f.mjs +164 -176
  59. package/fjs/cas/proof.f.d.mts +11 -8
  60. package/fjs/cas/proof.f.mjs +259 -147
  61. package/fjs/cas/types.d.ts +24 -10
  62. package/fjs/ci/common/module.f.d.mts +1 -1
  63. package/fjs/ci/common/module.f.mjs +1 -0
  64. package/fjs/ci/config/module.f.d.mts +3 -3
  65. package/fjs/ci/config/module.f.mjs +3 -3
  66. package/fjs/ci/module.f.d.mts +5 -5
  67. package/fjs/ci/module.f.mjs +8 -7
  68. package/fjs/ci/nix/module.f.d.mts +7 -5
  69. package/fjs/ci/nix/module.f.mjs +13 -12
  70. package/fjs/ci/nix/proof.f.d.mts +2 -0
  71. package/fjs/ci/nix/proof.f.mjs +4 -4
  72. package/fjs/ci/proof.f.d.mts +4 -2
  73. package/fjs/ci/proof.f.mjs +13 -8
  74. package/fjs/cli/module.f.d.mts +4 -6
  75. package/fjs/cli/module.f.mjs +4 -8
  76. package/fjs/cli/proof.f.d.mts +4 -2
  77. package/fjs/cli/proof.f.mjs +21 -18
  78. package/fjs/cli/types.d.ts +2 -3
  79. package/fjs/common/monoid/module.f.d.mts +70 -12
  80. package/fjs/common/monoid/module.f.mjs +177 -14
  81. package/fjs/common/monoid/proof.f.d.mts +12 -1
  82. package/fjs/common/monoid/proof.f.mjs +88 -4
  83. package/fjs/common/monoid/types.d.ts +23 -0
  84. package/fjs/crypto/hmac/module.f.mjs +2 -2
  85. package/fjs/crypto/secp/proof.f.d.mts +3 -1
  86. package/fjs/crypto/secp/proof.f.mjs +3 -1
  87. package/fjs/crypto/sha2/module.f.mjs +3 -1
  88. package/fjs/crypto/sha2/proof.f.d.mts +4 -1
  89. package/fjs/crypto/sha2/proof.f.mjs +27 -1
  90. package/fjs/crypto/sha2/types.d.ts +11 -0
  91. package/fjs/crypto/sign/module.f.mjs +2 -2
  92. package/fjs/crypto/vdf/module.f.d.mts +23 -4
  93. package/fjs/crypto/vdf/module.f.mjs +6 -4
  94. package/fjs/dev/module.f.d.mts +17 -5
  95. package/fjs/dev/module.f.mjs +60 -30
  96. package/fjs/dev/update/module.f.d.mts +11 -3
  97. package/fjs/dev/update/module.f.mjs +16 -11
  98. package/fjs/dev/update/proof.f.d.mts +4 -3
  99. package/fjs/dev/update/proof.f.mjs +11 -7
  100. package/fjs/djs/module.f.d.mts +13 -5
  101. package/fjs/djs/module.f.mjs +31 -16
  102. package/fjs/djs/parser/module.f.d.mts +16 -3
  103. package/fjs/djs/parser/module.f.mjs +135 -16
  104. package/fjs/djs/parser/proof.f.d.mts +8 -1
  105. package/fjs/djs/parser/proof.f.mjs +287 -13
  106. package/fjs/djs/parser/types.d.ts +7 -1
  107. package/fjs/djs/proof.f.d.mts +20 -1
  108. package/fjs/djs/proof.f.mjs +190 -12
  109. package/fjs/djs/serializer/module.f.d.mts +25 -8
  110. package/fjs/djs/serializer/module.f.mjs +66 -19
  111. package/fjs/djs/serializer/proof.f.d.mts +5 -0
  112. package/fjs/djs/serializer/proof.f.mjs +23 -1
  113. package/fjs/djs/tokenizer/module.f.d.mts +17 -5
  114. package/fjs/djs/tokenizer/module.f.mjs +120 -73
  115. package/fjs/djs/tokenizer/proof.f.d.mts +3 -0
  116. package/fjs/djs/tokenizer/proof.f.mjs +86 -67
  117. package/fjs/djs/transpiler/module.f.d.mts +13 -19
  118. package/fjs/djs/transpiler/module.f.mjs +79 -72
  119. package/fjs/djs/transpiler/types.d.ts +29 -0
  120. package/fjs/djs/types.d.ts +7 -1
  121. package/fjs/effects/list/module.f.d.mts +23 -12
  122. package/fjs/effects/list/module.f.mjs +16 -12
  123. package/fjs/effects/list/types.d.ts +27 -7
  124. package/fjs/effects/memory/module.f.d.mts +6 -3
  125. package/fjs/effects/memory/module.f.mjs +7 -7
  126. package/fjs/effects/memory/proof.f.d.mts +4 -0
  127. package/fjs/effects/memory/proof.f.mjs +18 -9
  128. package/fjs/effects/memory/types.d.ts +4 -3
  129. package/fjs/effects/mock/module.f.d.mts +28 -4
  130. package/fjs/effects/mock/module.f.mjs +39 -5
  131. package/fjs/effects/mock/types.d.ts +10 -1
  132. package/fjs/effects/module.d.mts +12 -2
  133. package/fjs/effects/module.f.d.mts +469 -281
  134. package/fjs/effects/module.f.mjs +538 -299
  135. package/fjs/effects/module.mjs +11 -2
  136. package/fjs/effects/node/memory/module.d.mts +7 -2
  137. package/fjs/effects/node/memory/module.mjs +9 -5
  138. package/fjs/effects/node/memory/proof.d.mts +2 -0
  139. package/fjs/effects/node/memory/proof.mjs +12 -5
  140. package/fjs/effects/node/module.d.mts +8 -2
  141. package/fjs/effects/node/module.f.d.mts +183 -43
  142. package/fjs/effects/node/module.f.mjs +260 -62
  143. package/fjs/effects/node/module.mjs +61 -50
  144. package/fjs/effects/node/proof.f.d.mts +28 -2
  145. package/fjs/effects/node/proof.f.mjs +161 -42
  146. package/fjs/effects/node/types.d.ts +106 -18
  147. package/fjs/effects/node/virtual/module.f.d.mts +21 -4
  148. package/fjs/effects/node/virtual/module.f.mjs +113 -70
  149. package/fjs/effects/node/virtual/proof.f.d.mts +31 -2
  150. package/fjs/effects/node/virtual/proof.f.mjs +201 -8
  151. package/fjs/effects/proof.f.d.mts +69 -34
  152. package/fjs/effects/proof.f.mjs +413 -130
  153. package/fjs/effects/types.d.ts +161 -33
  154. package/fjs/emergent_testing/all.test.d.mts +8 -0
  155. package/fjs/emergent_testing/all.test.mjs +14 -0
  156. package/fjs/emergent_testing/module.f.d.mts +22 -10
  157. package/fjs/emergent_testing/module.f.mjs +119 -85
  158. package/fjs/emergent_testing/proof.f.d.mts +21 -7
  159. package/fjs/emergent_testing/proof.f.mjs +169 -35
  160. package/fjs/emergent_testing/types.d.ts +22 -4
  161. package/fjs/fsc/bnf.f.d.mts +3 -0
  162. package/fjs/fsc/bnf.f.mjs +4 -1
  163. package/fjs/fsc/json.f.d.mts +3 -0
  164. package/fjs/fsc/json.f.mjs +4 -1
  165. package/fjs/fsc/module.f.d.mts +9 -0
  166. package/fjs/fsc/module.f.mjs +5 -3
  167. package/fjs/fsm/module.f.d.mts +14 -4
  168. package/fjs/fsm/module.f.mjs +54 -37
  169. package/fjs/fsm/proof.f.d.mts +5 -0
  170. package/fjs/fsm/proof.f.mjs +87 -115
  171. package/fjs/js/keywords/module.f.d.mts +52 -0
  172. package/fjs/js/keywords/module.f.mjs +72 -0
  173. package/fjs/{emergent_testing/scenarios/return-value.pass.d.ts → js/keywords/proof.f.d.mts} +1 -1
  174. package/fjs/js/keywords/proof.f.mjs +13 -0
  175. package/fjs/js/tokenizer/module.f.d.mts +30 -3
  176. package/fjs/js/tokenizer/module.f.mjs +161 -211
  177. package/fjs/js/tokenizer/proof.f.d.mts +1 -0
  178. package/fjs/js/tokenizer/proof.f.mjs +54 -24
  179. package/fjs/js/tokenizer/types.d.ts +33 -24
  180. package/fjs/mcp/cas/module.f.d.mts +1 -6
  181. package/fjs/mcp/cas/module.f.mjs +55 -51
  182. package/fjs/mcp/cas/proof.f.d.mts +15 -0
  183. package/fjs/mcp/cas/proof.f.mjs +174 -0
  184. package/fjs/mcp/evo/module.f.d.mts +19 -10
  185. package/fjs/mcp/evo/module.f.mjs +48 -27
  186. package/fjs/mcp/evo/proof.f.d.mts +6 -1
  187. package/fjs/mcp/evo/proof.f.mjs +115 -31
  188. package/fjs/mcp/module.f.d.mts +39 -4
  189. package/fjs/mcp/module.f.mjs +14 -12
  190. package/fjs/mcp/proof.f.d.mts +13 -1
  191. package/fjs/mcp/proof.f.mjs +120 -61
  192. package/fjs/media/html/module.f.d.mts +12 -0
  193. package/fjs/media/html/module.f.mjs +7 -5
  194. package/fjs/media/html/proof.f.d.mts +3 -0
  195. package/fjs/media/html/proof.f.mjs +4 -1
  196. package/fjs/media/json/extended/module.f.d.mts +82 -0
  197. package/fjs/media/json/extended/module.f.mjs +153 -0
  198. package/fjs/media/json/extended/proof.f.d.mts +42 -0
  199. package/fjs/media/json/extended/proof.f.mjs +127 -0
  200. package/fjs/media/json/extended/types.d.ts +23 -0
  201. package/fjs/media/json/module.f.d.mts +8 -2
  202. package/fjs/media/json/module.f.mjs +43 -41
  203. package/fjs/media/json/number/module.f.d.mts +59 -0
  204. package/fjs/media/json/number/module.f.mjs +136 -0
  205. package/fjs/media/json/number/proof.f.d.mts +24 -0
  206. package/fjs/media/json/number/proof.f.mjs +86 -0
  207. package/fjs/media/json/number/types.d.ts +28 -0
  208. package/fjs/media/json/parser/module.f.d.mts +25 -13
  209. package/fjs/media/json/parser/module.f.mjs +133 -72
  210. package/fjs/media/json/parser/proof.f.d.mts +5 -0
  211. package/fjs/media/json/parser/proof.f.mjs +31 -1
  212. package/fjs/media/json/parser/types.d.ts +38 -14
  213. package/fjs/media/json/rtti/module.f.d.mts +1 -1
  214. package/fjs/media/json/rtti/module.f.mjs +1 -1
  215. package/fjs/media/json/rtti/proof.f.d.mts +3 -0
  216. package/fjs/media/json/rtti/proof.f.mjs +12 -12
  217. package/fjs/media/json/schema/module.f.d.mts +61 -27
  218. package/fjs/media/json/schema/module.f.mjs +218 -63
  219. package/fjs/media/json/schema/proof.f.d.mts +41 -1
  220. package/fjs/media/json/schema/proof.f.mjs +220 -9
  221. package/fjs/media/json/serializer/module.f.d.mts +44 -0
  222. package/fjs/media/json/serializer/module.f.mjs +71 -9
  223. package/fjs/media/json/tokenizer/module.f.d.mts +8 -0
  224. package/fjs/media/json/tokenizer/module.f.mjs +31 -8
  225. package/fjs/media/json/tokenizer/proof.f.d.mts +6 -0
  226. package/fjs/media/json/tokenizer/proof.f.mjs +62 -21
  227. package/fjs/media/json/types.d.ts +36 -10
  228. package/fjs/media/lock/module.f.d.mts +100 -0
  229. package/fjs/media/lock/module.f.mjs +125 -0
  230. package/fjs/media/lock/proof.f.d.mts +33 -0
  231. package/fjs/media/lock/proof.f.mjs +196 -0
  232. package/fjs/media/lock/types.d.ts +15 -0
  233. package/fjs/media/module.f.d.mts +6 -5
  234. package/fjs/media/module.f.mjs +8 -7
  235. package/fjs/media/nix/module.f.d.mts +13 -0
  236. package/fjs/media/nix/module.f.mjs +4 -2
  237. package/fjs/media/nix/proof.f.d.mts +3 -0
  238. package/fjs/media/nix/proof.f.mjs +4 -1
  239. package/fjs/media/note/module.f.d.mts +121 -0
  240. package/fjs/media/note/module.f.mjs +131 -0
  241. package/fjs/media/note/proof.f.d.mts +29 -0
  242. package/fjs/media/note/proof.f.mjs +150 -0
  243. package/fjs/media/note/types.d.ts +10 -0
  244. package/fjs/media/proof.f.d.mts +4 -1
  245. package/fjs/media/proof.f.mjs +40 -21
  246. package/fjs/media/revision/module.f.d.mts +83 -7
  247. package/fjs/media/revision/module.f.mjs +127 -23
  248. package/fjs/media/revision/proof.f.d.mts +14 -0
  249. package/fjs/media/revision/proof.f.mjs +93 -2
  250. package/fjs/media/revision/types.d.ts +34 -5
  251. package/fjs/media/type/module.f.d.mts +53 -18
  252. package/fjs/media/type/module.f.mjs +87 -97
  253. package/fjs/media/type/proof.f.d.mts +17 -0
  254. package/fjs/media/type/proof.f.mjs +73 -13
  255. package/fjs/module.d.mts +5 -0
  256. package/fjs/module.f.d.mts +8 -0
  257. package/fjs/module.f.mjs +33 -10
  258. package/fjs/module.mjs +6 -0
  259. package/fjs/nanvm/proof.f.mjs +3 -3
  260. package/fjs/nanvm/rust/module.f.mjs +1 -1
  261. package/fjs/nanvm/update/module.f.d.mts +4 -4
  262. package/fjs/nanvm/update/module.f.mjs +8 -9
  263. package/fjs/nanvm/update/proof.f.mjs +4 -3
  264. package/fjs/path/module.f.d.mts +8 -0
  265. package/fjs/path/module.f.mjs +4 -2
  266. package/fjs/proof.f.d.mts +7 -3
  267. package/fjs/proof.f.mjs +41 -12
  268. package/fjs/protocol/json_rpc/module.f.d.mts +3 -3
  269. package/fjs/protocol/json_rpc/module.f.mjs +10 -7
  270. package/fjs/protocol/json_rpc/proof.f.d.mts +6 -0
  271. package/fjs/protocol/json_rpc/proof.f.mjs +26 -5
  272. package/fjs/protocol/mcp/module.f.d.mts +10 -13
  273. package/fjs/protocol/mcp/module.f.mjs +74 -58
  274. package/fjs/protocol/mcp/proof.f.d.mts +16 -3
  275. package/fjs/protocol/mcp/proof.f.mjs +224 -69
  276. package/fjs/protocol/mcp/stdio/module.f.d.mts +17 -11
  277. package/fjs/protocol/mcp/stdio/module.f.mjs +39 -33
  278. package/fjs/protocol/mcp/stdio/proof.f.d.mts +5 -3
  279. package/fjs/protocol/mcp/stdio/proof.f.mjs +46 -13
  280. package/fjs/protocol/mcp/stdio/types.d.ts +14 -0
  281. package/fjs/protocol/mcp/types.d.ts +17 -6
  282. package/fjs/sul/id/module.f.d.mts +4 -0
  283. package/fjs/sul/id/module.f.mjs +6 -6
  284. package/fjs/sul/level/hash/module.f.d.mts +4 -1
  285. package/fjs/sul/level/hash/module.f.mjs +6 -4
  286. package/fjs/sul/level/hash/proof.f.d.mts +4 -0
  287. package/fjs/sul/level/hash/proof.f.mjs +7 -4
  288. package/fjs/sul/level/literal/module.f.d.mts +4 -1
  289. package/fjs/sul/level/literal/module.f.mjs +4 -3
  290. package/fjs/sul/level/literal/proof.f.d.mts +3 -0
  291. package/fjs/sul/level/literal/proof.f.mjs +4 -1
  292. package/fjs/sul/module.f.d.mts +5 -3
  293. package/fjs/sul/module.f.mjs +23 -17
  294. package/fjs/sul/proof.f.d.mts +4 -0
  295. package/fjs/sul/proof.f.mjs +5 -2
  296. package/fjs/text/ascii/module.f.d.mts +26 -0
  297. package/fjs/text/ascii/module.f.mjs +49 -1
  298. package/fjs/text/ascii/proof.f.d.mts +10 -0
  299. package/fjs/text/ascii/proof.f.mjs +33 -1
  300. package/fjs/text/code_point/module.f.d.mts +29 -3
  301. package/fjs/text/code_point/module.f.mjs +32 -9
  302. package/fjs/text/code_point/proof.f.d.mts +2 -0
  303. package/fjs/text/code_point/proof.f.mjs +39 -0
  304. package/fjs/text/module.f.d.mts +4 -2
  305. package/fjs/text/module.f.mjs +4 -3
  306. package/fjs/text/proof.f.d.mts +3 -0
  307. package/fjs/text/proof.f.mjs +4 -1
  308. package/fjs/text/sgr/module.f.d.mts +6 -5
  309. package/fjs/text/sgr/module.f.mjs +8 -8
  310. package/fjs/text/sgr/proof.f.d.mts +3 -0
  311. package/fjs/text/sgr/proof.f.mjs +4 -1
  312. package/fjs/text/utf16/module.f.d.mts +5 -1
  313. package/fjs/text/utf16/module.f.mjs +38 -35
  314. package/fjs/text/utf16/proof.f.d.mts +3 -1
  315. package/fjs/text/utf16/proof.f.mjs +19 -2
  316. package/fjs/text/utf8/module.f.d.mts +9 -5
  317. package/fjs/text/utf8/module.f.mjs +20 -20
  318. package/fjs/types/array/module.f.d.mts +2 -1
  319. package/fjs/types/array/module.f.mjs +16 -4
  320. package/fjs/types/bigfloat/module.f.d.mts +21 -1
  321. package/fjs/types/bigfloat/module.f.mjs +33 -7
  322. package/fjs/types/bigfloat/proof.f.d.mts +1 -0
  323. package/fjs/types/bigfloat/proof.f.mjs +46 -0
  324. package/fjs/types/bigint/module.f.d.mts +4 -0
  325. package/fjs/types/bigint/module.f.mjs +4 -3
  326. package/fjs/types/bit_vec/module.f.d.mts +10 -16
  327. package/fjs/types/bit_vec/module.f.mjs +99 -95
  328. package/fjs/types/bit_vec/proof.f.d.mts +6 -0
  329. package/fjs/types/bit_vec/proof.f.mjs +31 -5
  330. package/fjs/types/btree/find/module.f.d.mts +5 -1
  331. package/fjs/types/btree/find/module.f.mjs +5 -5
  332. package/fjs/types/btree/find/proof.f.d.mts +5 -1
  333. package/fjs/types/btree/find/proof.f.mjs +5 -3
  334. package/fjs/types/btree/module.f.d.mts +3 -0
  335. package/fjs/types/btree/module.f.mjs +3 -2
  336. package/fjs/types/btree/proof.f.d.mts +5 -1
  337. package/fjs/types/btree/proof.f.mjs +5 -3
  338. package/fjs/types/btree/remove/module.f.d.mts +11 -0
  339. package/fjs/types/btree/remove/module.f.mjs +10 -10
  340. package/fjs/types/btree/remove/proof.f.d.mts +3 -0
  341. package/fjs/types/btree/remove/proof.f.mjs +4 -1
  342. package/fjs/types/btree/set/module.f.d.mts +9 -0
  343. package/fjs/types/btree/set/module.f.mjs +14 -17
  344. package/fjs/types/btree/set/proof.f.d.mts +3 -0
  345. package/fjs/types/btree/set/proof.f.mjs +16 -1
  346. package/fjs/types/btree/types/module.f.d.mts +2 -1
  347. package/fjs/types/btree/types/module.f.mjs +2 -1
  348. package/fjs/types/byte_set/module.f.d.mts +20 -4
  349. package/fjs/types/byte_set/module.f.mjs +18 -8
  350. package/fjs/types/byte_set/proof.f.d.mts +3 -1
  351. package/fjs/types/byte_set/proof.f.mjs +10 -8
  352. package/fjs/types/function/compare/module.f.d.mts +3 -2
  353. package/fjs/types/function/compare/module.f.mjs +13 -5
  354. package/fjs/types/function/module.f.d.mts +8 -1
  355. package/fjs/types/function/module.f.mjs +8 -1
  356. package/fjs/types/function/operator/module.f.d.mts +2 -1
  357. package/fjs/types/function/operator/module.f.mjs +2 -2
  358. package/fjs/types/list/module.f.d.mts +10 -3
  359. package/fjs/types/list/module.f.mjs +6 -4
  360. package/fjs/types/list/proof.f.d.mts +4 -1
  361. package/fjs/types/list/proof.f.mjs +4 -2
  362. package/fjs/types/nibble_set/module.f.d.mts +2 -1
  363. package/fjs/types/nibble_set/module.f.mjs +2 -2
  364. package/fjs/types/nominal/module.f.d.mts +2 -1
  365. package/fjs/types/nominal/module.f.mjs +2 -1
  366. package/fjs/types/nullable/module.f.d.mts +26 -6
  367. package/fjs/types/nullable/module.f.mjs +25 -6
  368. package/fjs/types/nullable/proof.f.d.mts +4 -0
  369. package/fjs/types/nullable/proof.f.mjs +15 -0
  370. package/fjs/types/number/module.f.d.mts +4 -0
  371. package/fjs/types/number/module.f.mjs +4 -3
  372. package/fjs/types/object/module.f.d.mts +26 -4
  373. package/fjs/types/object/module.f.mjs +26 -7
  374. package/fjs/types/object/proof.f.d.mts +5 -2
  375. package/fjs/types/object/proof.f.mjs +6 -3
  376. package/fjs/types/object/structurally_same/module.f.d.mts +39 -0
  377. package/fjs/types/object/structurally_same/module.f.mjs +59 -0
  378. package/fjs/types/object/structurally_same/proof.f.d.mts +6 -0
  379. package/fjs/types/object/structurally_same/proof.f.mjs +73 -0
  380. package/fjs/types/ordered_map/module.f.d.mts +5 -0
  381. package/fjs/types/ordered_map/module.f.mjs +5 -4
  382. package/fjs/types/ordered_map/proof.f.d.mts +3 -0
  383. package/fjs/types/ordered_map/proof.f.mjs +4 -1
  384. package/fjs/types/patricia_trie/module.f.d.mts +2 -1
  385. package/fjs/types/patricia_trie/module.f.mjs +27 -12
  386. package/fjs/types/patricia_trie/proof.f.d.mts +3 -0
  387. package/fjs/types/patricia_trie/proof.f.mjs +4 -1
  388. package/fjs/types/prime_field/module.f.d.mts +3 -1
  389. package/fjs/types/prime_field/module.f.mjs +3 -2
  390. package/fjs/types/range/module.f.d.mts +2 -1
  391. package/fjs/types/range/module.f.mjs +2 -2
  392. package/fjs/types/range_map/module.f.d.mts +6 -0
  393. package/fjs/types/range_map/module.f.mjs +6 -9
  394. package/fjs/types/range_map/proof.f.d.mts +5 -1
  395. package/fjs/types/range_map/proof.f.mjs +5 -3
  396. package/fjs/types/range_set/module.f.d.mts +5 -0
  397. package/fjs/types/range_set/module.f.mjs +1 -0
  398. package/fjs/types/range_set/proof.f.d.mts +3 -0
  399. package/fjs/types/range_set/proof.f.mjs +4 -1
  400. package/fjs/types/result/module.d.mts +8 -0
  401. package/fjs/types/result/module.f.d.mts +37 -7
  402. package/fjs/types/result/module.f.mjs +38 -8
  403. package/fjs/types/result/module.mjs +9 -1
  404. package/fjs/types/result/proof.f.d.mts +5 -0
  405. package/fjs/types/result/proof.f.mjs +22 -2
  406. package/fjs/types/rtti/common/module.f.d.mts +44 -14
  407. package/fjs/types/rtti/common/module.f.mjs +42 -36
  408. package/fjs/types/rtti/common/proof.f.d.mts +4 -0
  409. package/fjs/types/rtti/common/proof.f.mjs +10 -7
  410. package/fjs/types/rtti/data/module.f.d.mts +134 -0
  411. package/fjs/types/rtti/data/module.f.mjs +1053 -0
  412. package/fjs/types/rtti/data/proof.f.d.mts +76 -0
  413. package/fjs/types/rtti/data/proof.f.mjs +589 -0
  414. package/fjs/types/rtti/data/types.d.ts +83 -0
  415. package/fjs/types/rtti/module.f.d.mts +12 -5
  416. package/fjs/types/rtti/module.f.mjs +7 -5
  417. package/fjs/types/rtti/parse/module.f.d.mts +48 -0
  418. package/fjs/types/rtti/parse/module.f.mjs +45 -34
  419. package/fjs/types/rtti/parse/proof.f.d.mts +3 -2
  420. package/fjs/types/rtti/parse/proof.f.mjs +51 -52
  421. package/fjs/types/rtti/proof.f.d.mts +3 -1
  422. package/fjs/types/rtti/proof.f.mjs +6 -2
  423. package/fjs/types/rtti/ts/module.f.d.mts +68 -9
  424. package/fjs/types/rtti/ts/module.f.mjs +258 -30
  425. package/fjs/types/rtti/ts/proof.f.d.mts +44 -0
  426. package/fjs/types/rtti/ts/proof.f.mjs +152 -4
  427. package/fjs/types/rtti/ts/types.d.ts +25 -1
  428. package/fjs/types/rtti/types.d.ts +40 -0
  429. package/fjs/types/sorted_list/module.f.d.mts +4 -1
  430. package/fjs/types/sorted_list/module.f.mjs +21 -12
  431. package/fjs/types/sorted_list/proof.f.d.mts +3 -1
  432. package/fjs/types/sorted_list/proof.f.mjs +3 -1
  433. package/fjs/types/sorted_set/module.f.d.mts +49 -1
  434. package/fjs/types/sorted_set/module.f.mjs +26 -2
  435. package/fjs/types/sorted_set/proof.f.d.mts +4 -1
  436. package/fjs/types/sorted_set/proof.f.mjs +19 -2
  437. package/fjs/types/string/module.f.d.mts +4 -0
  438. package/fjs/types/string/module.f.mjs +4 -3
  439. package/fjs/types/string_set/module.f.d.mts +3 -1
  440. package/fjs/types/string_set/module.f.mjs +3 -2
  441. package/fjs/types/ts/module.f.d.mts +2 -0
  442. package/fjs/types/ts/module.f.mjs +3 -3
  443. package/fjs/types/ts/proof.f.d.mts +1 -0
  444. package/fjs/types/ts/proof.f.mjs +5 -0
  445. package/fjs/types/ts/types.d.ts +6 -1
  446. package/fjs/types/uint8array/module.f.d.mts +13 -2
  447. package/fjs/types/uint8array/module.f.mjs +20 -15
  448. package/fjs/website/module.f.d.mts +5 -2
  449. package/fjs/website/module.f.mjs +6 -8
  450. package/fjs/website/proof.f.mjs +2 -1
  451. package/package.json +3 -3
  452. package/fjs/asn.1/types.js +0 -6
  453. package/fjs/asserts/types.js +0 -6
  454. package/fjs/basen/types.js +0 -6
  455. package/fjs/bnf/data/types.js +0 -6
  456. package/fjs/bnf/descent/types.js +0 -6
  457. package/fjs/bnf/ll1/types.js +0 -6
  458. package/fjs/bnf/token_symbol/types.js +0 -6
  459. package/fjs/bnf/types.js +0 -6
  460. package/fjs/cas/evo/types.js +0 -7
  461. package/fjs/cas/types.js +0 -6
  462. package/fjs/ci/common/types.js +0 -1
  463. package/fjs/ci/nix/types.js +0 -6
  464. package/fjs/ci/types.js +0 -6
  465. package/fjs/cli/types.js +0 -6
  466. package/fjs/common/monoid/types.js +0 -6
  467. package/fjs/crypto/pow/types.js +0 -6
  468. package/fjs/crypto/secp/types.js +0 -6
  469. package/fjs/crypto/sha2/types.js +0 -6
  470. package/fjs/crypto/sign/types.js +0 -6
  471. package/fjs/crypto/vdf/types.js +0 -6
  472. package/fjs/dev/package_json/module.f.d.mts +0 -32
  473. package/fjs/dev/package_json/module.f.mjs +0 -37
  474. package/fjs/dev/package_json/proof.f.d.mts +0 -6
  475. package/fjs/dev/package_json/proof.f.mjs +0 -32
  476. package/fjs/dev/types.js +0 -6
  477. package/fjs/djs/ast/types.js +0 -8
  478. package/fjs/djs/parser/types.js +0 -7
  479. package/fjs/djs/tokenizer/types.js +0 -7
  480. package/fjs/djs/types.js +0 -7
  481. package/fjs/effects/eff/module.f.d.mts +0 -10
  482. package/fjs/effects/eff/module.f.mjs +0 -68
  483. package/fjs/effects/eff/proof.f.d.mts +0 -12
  484. package/fjs/effects/eff/proof.f.mjs +0 -66
  485. package/fjs/effects/eff/types.d.ts +0 -71
  486. package/fjs/effects/eff/types.js +0 -6
  487. package/fjs/effects/list/types.js +0 -6
  488. package/fjs/effects/memory/types.js +0 -6
  489. package/fjs/effects/mock/types.js +0 -6
  490. package/fjs/effects/node/types.js +0 -6
  491. package/fjs/effects/node/virtual/types.js +0 -7
  492. package/fjs/effects/types.js +0 -6
  493. package/fjs/emergent_testing/all.test.d.ts +0 -1
  494. package/fjs/emergent_testing/all.test.js +0 -5
  495. package/fjs/emergent_testing/scenarios/all.d.ts +0 -1
  496. package/fjs/emergent_testing/scenarios/all.js +0 -1
  497. package/fjs/emergent_testing/scenarios/async-subtests.fail.d.ts +0 -6
  498. package/fjs/emergent_testing/scenarios/async-subtests.fail.js +0 -9
  499. package/fjs/emergent_testing/scenarios/async-subtests.pass.d.ts +0 -6
  500. package/fjs/emergent_testing/scenarios/async-subtests.pass.js +0 -9
  501. package/fjs/emergent_testing/scenarios/async.fail.d.ts +0 -3
  502. package/fjs/emergent_testing/scenarios/async.fail.js +0 -6
  503. package/fjs/emergent_testing/scenarios/async.pass.d.ts +0 -3
  504. package/fjs/emergent_testing/scenarios/async.pass.js +0 -5
  505. package/fjs/emergent_testing/scenarios/fail.fail.d.ts +0 -3
  506. package/fjs/emergent_testing/scenarios/fail.fail.js +0 -3
  507. package/fjs/emergent_testing/scenarios/return-value.pass.js +0 -4
  508. package/fjs/emergent_testing/scenarios/thenable.pass.d.ts +0 -5
  509. package/fjs/emergent_testing/scenarios/thenable.pass.js +0 -11
  510. package/fjs/emergent_testing/scenarios/thenable2.pass.d.ts +0 -5
  511. package/fjs/emergent_testing/scenarios/thenable2.pass.js +0 -3
  512. package/fjs/emergent_testing/scenarios/throw.pass.d.ts +0 -5
  513. package/fjs/emergent_testing/scenarios/throw.pass.js +0 -3
  514. package/fjs/emergent_testing/types.js +0 -6
  515. package/fjs/js/tokenizer/types.js +0 -6
  516. package/fjs/media/html/types.js +0 -6
  517. package/fjs/media/json/parser/types.js +0 -6
  518. package/fjs/media/json/tokenizer/types.js +0 -6
  519. package/fjs/media/json/types.js +0 -13
  520. package/fjs/media/nix/types.js +0 -6
  521. package/fjs/media/revision/types.js +0 -8
  522. package/fjs/media/type/types.js +0 -6
  523. package/fjs/media/types.js +0 -7
  524. package/fjs/nanvm/types.js +0 -11
  525. package/fjs/protocol/json_rpc/types.js +0 -8
  526. package/fjs/protocol/mcp/types.js +0 -8
  527. package/fjs/sul/id/types.js +0 -6
  528. package/fjs/sul/level/hash/types.js +0 -6
  529. package/fjs/sul/level/literal/types.js +0 -6
  530. package/fjs/sul/types.js +0 -6
  531. package/fjs/text/sgr/types.js +0 -6
  532. package/fjs/text/types.js +0 -6
  533. package/fjs/text/utf16/types.js +0 -6
  534. package/fjs/text/utf8/types.js +0 -6
  535. package/fjs/types/array/types.js +0 -6
  536. package/fjs/types/bigfloat/types.js +0 -6
  537. package/fjs/types/bigint/types.js +0 -6
  538. package/fjs/types/bit_vec/types.js +0 -6
  539. package/fjs/types/btree/find/types.js +0 -6
  540. package/fjs/types/btree/types/types.js +0 -6
  541. package/fjs/types/byte_set/types.js +0 -6
  542. package/fjs/types/function/compare/types.js +0 -6
  543. package/fjs/types/function/operator/types.js +0 -6
  544. package/fjs/types/function/types.js +0 -6
  545. package/fjs/types/list/types.js +0 -6
  546. package/fjs/types/nibble_set/types.js +0 -6
  547. package/fjs/types/nominal/types.js +0 -6
  548. package/fjs/types/nullable/types.js +0 -6
  549. package/fjs/types/object/types.js +0 -8
  550. package/fjs/types/option/types.js +0 -6
  551. package/fjs/types/ordered_map/types.js +0 -6
  552. package/fjs/types/patricia_trie/types.js +0 -6
  553. package/fjs/types/phantom/types.js +0 -11
  554. package/fjs/types/prime_field/types.js +0 -6
  555. package/fjs/types/range/types.js +0 -6
  556. package/fjs/types/range_map/types.js +0 -6
  557. package/fjs/types/result/types.js +0 -6
  558. package/fjs/types/rtti/common/types.js +0 -1
  559. package/fjs/types/rtti/parse/types.js +0 -1
  560. package/fjs/types/rtti/ts/types.js +0 -1
  561. package/fjs/types/rtti/types.js +0 -1
  562. package/fjs/types/rtti/validate/module.f.d.mts +0 -6
  563. package/fjs/types/rtti/validate/module.f.mjs +0 -169
  564. package/fjs/types/rtti/validate/proof.f.d.mts +0 -125
  565. package/fjs/types/rtti/validate/proof.f.mjs +0 -437
  566. package/fjs/types/rtti/validate/types.d.ts +0 -6
  567. package/fjs/types/rtti/validate/types.js +0 -1
  568. package/fjs/types/sorted_list/types.js +0 -6
  569. package/fjs/types/sorted_set/types.js +0 -6
  570. package/fjs/types/string_set/types.js +0 -6
  571. 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,51 @@
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
+ * **Structs and tuples are open.** A value carrying more than the schema
9
+ * declares is accepted; `parse` then returns a freshly constructed value that
10
+ * contains only the declared fields/elements, so the extras are accepted on
11
+ * the way in and absent on the way out:
12
+ *
13
+ * - Tuples: a longer array is accepted; the result has the schema's length.
14
+ * - Structs: undeclared properties are accepted; the result has only the
15
+ * schema's keys.
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
+ * A member is required exactly when its set excludes `undefined` — an absent
20
+ * member reads as `undefined`, on both kinds — so a shorter array whose
21
+ * trailing position admits `undefined` is accepted and the gap is filled.
22
+ *
23
+ * Openness is what makes this forward-compatible with extended serialization
24
+ * formats: a schema-based parser keeps working when newer versions of the
25
+ * format add extra fields or tuple elements.
26
+ *
27
+ * **Do not read "the result has the schema's length" as "tuples are closed"
28
+ * and add a length check here.** The set a tuple schema describes includes
29
+ * longer arrays; `Ts<T>` renders the closed approximation only because
30
+ * TypeScript cannot express the open one (see `../ts/types.ts` `TupleTs`), and
31
+ * taking that rendering for the model is what produced #1622. A schema that
32
+ * wants exact members says so — see `../todo/close-type.md`.
33
+ *
34
+ * The error shape, path bookkeeping, primitive checks, and schema
35
+ * recognition (`visit`) come from `../common/module.f.mjs`.
36
+ *
37
+ * See `./types.ts` for the `Result`/`Parse` type-level API.
38
+ *
39
+ * @module
40
+ *
41
+ * @import { Info1, Struct, Tag1, Tuple, Type } from '../types.ts'
42
+ * @import { Result as CommonResult } from '../../result/types.ts'
43
+ * @import { StringMap } from '../../object/types.ts'
44
+ * @import { List } from '../../list/types.ts'
45
+ * @import { Container, IsContainer, ValidationError, Visitor } from '../common/types.ts'
46
+ * @import { Unknown } from '../ts/types.ts'
47
+ * @import { Parse } from './types.ts'
48
+ */
1
49
  import type { Type } from '../types.ts';
2
50
  import type { Result as CommonResult } from '../../result/types.ts';
3
51
  import type { ValidationError } from '../common/types.ts';
@@ -5,34 +5,49 @@
5
5
  * a `Parse<T>` function. When called with an unknown value, it returns a `Result`
6
6
  * that is either `['ok', newValue]` or `['error', { path, message }]`.
7
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>`:
8
+ * **Structs and tuples are open.** A value carrying more than the schema
9
+ * declares is accepted; `parse` then returns a freshly constructed value that
10
+ * contains only the declared fields/elements, so the extras are accepted on
11
+ * the way in and absent on the way out:
13
12
  *
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.
13
+ * - Tuples: a longer array is accepted; the result has the schema's length.
14
+ * - Structs: undeclared properties are accepted; the result has only the
15
+ * schema's keys.
16
16
  * - Arrays/records: every element/value is itself parsed, so a fresh container is
17
17
  * always returned even if the inner type is a primitive.
18
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.
19
+ * A member is required exactly when its set excludes `undefined` — an absent
20
+ * member reads as `undefined`, on both kinds so a shorter array whose
21
+ * trailing position admits `undefined` is accepted and the gap is filled.
22
+ *
23
+ * Openness is what makes this forward-compatible with extended serialization
24
+ * formats: a schema-based parser keeps working when newer versions of the
25
+ * format add extra fields or tuple elements.
26
+ *
27
+ * **Do not read "the result has the schema's length" as "tuples are closed"
28
+ * and add a length check here.** The set a tuple schema describes includes
29
+ * longer arrays; `Ts<T>` renders the closed approximation only because
30
+ * TypeScript cannot express the open one (see `../ts/types.ts` `TupleTs`), and
31
+ * taking that rendering for the model is what produced #1622. A schema that
32
+ * wants exact members says so — see `../todo/close-type.md`.
22
33
  *
23
34
  * 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.
35
+ * recognition (`visit`) come from `../common/module.f.mjs`.
26
36
  *
27
37
  * See `./types.ts` for the `Result`/`Parse` type-level API.
28
38
  *
29
39
  * @module
40
+ *
41
+ * @import { Info1, Struct, Tag1, Tuple, Type } from '../types.ts'
42
+ * @import { Result as CommonResult } from '../../result/types.ts'
43
+ * @import { StringMap } from '../../object/types.ts'
44
+ * @import { List } from '../../list/types.ts'
45
+ * @import { Container, IsContainer, ValidationError, Visitor } from '../common/types.ts'
46
+ * @import { Unknown } from '../ts/types.ts'
47
+ * @import { Parse } from './types.ts'
30
48
  */
31
- /** @import { Info1, Struct, Tag1, Tuple, Type } from '../types.ts' */
32
- /** @import { Result as CommonResult } from '../../result/types.ts' */
49
+
33
50
  import { ok } from '../../result/module.f.mjs'
34
- /** @import { StringMap } from '../../object/types.ts' */
35
- /** @import { List } from '../../list/types.ts' */
36
51
  import { reverse, toArray } from '../../list/module.f.mjs'
37
52
  import {
38
53
  constPrimitiveValidate,
@@ -44,9 +59,6 @@ import {
44
59
  verror,
45
60
  visit,
46
61
  } 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
62
 
51
63
  const { entries } = Object
52
64
 
@@ -76,11 +88,10 @@ const orderedEntries = list =>
76
88
  toArray(reverse(list))
77
89
 
78
90
  /**
79
- * Builds a parser for `array` or `record` schemas. Mirrors `validate`'s
80
- * `containerValidate`, but rebuilds a fresh container from each item's parsed
81
- * result instead of returning the value unchanged. The inner item parser is
82
- * instantiated lazily (only when the container is non-empty) so recursive
83
- * schemas don't recurse forever on empty containers.
91
+ * Builds a parser for `array` or `record` schemas: rebuilds a fresh container
92
+ * from each item's parsed result. The inner item parser is instantiated lazily
93
+ * (only when the container is non-empty) so recursive schemas don't recurse
94
+ * forever on empty containers.
84
95
  */
85
96
  const containerParse =
86
97
  /**
@@ -98,7 +109,7 @@ const containerParse =
98
109
  if (e.length === 0) {
99
110
  return /** @type {any} */ (ok(rebuild([])))
100
111
  }
101
- const itemParse = /** @type {(v: Unknown) => _ItemResult} */ (/** @type {any} */ (parse(item)))
112
+ const itemParse = /** @type {any} */ (parse(item))
102
113
  const r = eachEntry(e, (_k, v) => itemParse(v), emptyEntries, consEntry)
103
114
  return r[0] === 'error' ? r : /** @type {any} */ (ok(rebuild(orderedEntries(r[1]))))
104
115
  }
@@ -108,10 +119,10 @@ const arrayParse = containerParse(isArray, arrayRebuild)
108
119
  const recordParse = containerParse(isObject, recordRebuild)
109
120
 
110
121
  /**
111
- * Builds a parser for `Tuple` or `Struct` const schemas. Mirrors `validate`'s
112
- * `constContainerValidate`: it iterates the schema's entries (so extra tuple
113
- * elements and undeclared struct keys are dropped) and rebuilds the result
114
- * from each parsed item.
122
+ * Builds a parser for `Tuple` or `Struct` const schemas. It iterates the
123
+ * *schema's* entries, which is what makes both kinds open: a longer array or
124
+ * an undeclared key is never visited, so it is accepted and left out of the
125
+ * rebuilt result.
115
126
  */
116
127
  const constContainerParse =
117
128
  /**
@@ -128,7 +139,7 @@ const constContainerParse =
128
139
  }
129
140
  const r = eachEntry(
130
141
  entries(rtti),
131
- (k, t) => /** @type {_ItemResult} */ (/** @type {any} */ (parse(t))(getItem(value, k))),
142
+ (k, t) => (/** @type {any} */ (parse(t))(getItem(value, k))),
132
143
  emptyEntries,
133
144
  consEntry,
134
145
  )
@@ -154,7 +165,7 @@ const orParse =
154
165
  * @returns {Parse<() => readonly ['or', ...T]>}
155
166
  */
156
167
  rtti =>
157
- /** @type {any} */ (orVisit(/** @type {(t: Type) => ValidateE} */ (/** @type {any} */ (parse)))(rtti))
168
+ /** @type {any} */ (orVisit(/** @type {any} */ (parse))(rtti))
158
169
 
159
170
  /**
160
171
  * Creates a parser function for the given RTTI schema.
@@ -173,10 +184,10 @@ const orParse =
173
184
  * p([1, 2, 3]) // ['ok', [1, 2, 3]] (a new array)
174
185
  * p([1, 'two']) // ['error', { path: ['1'], message: 'unexpected value' }]
175
186
  *
176
- * // tuples are closed: extra elements are dropped
187
+ * // open: a longer array is accepted, and the extra is not carried over
177
188
  * parse([number, number])([1, 2, 3]) // ['ok', [1, 2]]
178
189
  *
179
- * // structs drop undeclared keys
190
+ * // open: an undeclared key is accepted, and not carried over
180
191
  * parse({ a: number })({ a: 1, b: 2 }) // ['ok', { a: 1 }]
181
192
  * ```
182
193
  */
@@ -193,4 +204,4 @@ const parseVisitor = /** @type {any} */ ({
193
204
 
194
205
  /** @type {<T extends Type>(rtti: T) => Parse<T>} */
195
206
  export const parse = rtti =>
196
- /** @type {any} */ (visit(parseVisitor)(rtti))
207
+ (visit(parseVisitor)(rtti))
@@ -64,12 +64,13 @@ export declare const proof: {
64
64
  };
65
65
  tuple: {
66
66
  ok: () => void;
67
- extraItemsDropped: () => void;
67
+ extraItemsAcceptedAndDropped: () => void;
68
+ shortArrayFillsAnOptionalPosition: () => void;
68
69
  error: () => void;
69
70
  };
70
71
  struct: {
71
72
  ok: () => void;
72
- extraKeysDropped: () => void;
73
+ extraKeysAcceptedAndDropped: () => void;
73
74
  error: () => void;
74
75
  };
75
76
  };
@@ -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: () => {
@@ -129,32 +109,32 @@ export const proof = {
129
109
  error: () => assertError(parse(/** @type {const} */ (42))(43)),
130
110
  },
131
111
  nan: {
132
- ok: () => assertOk(parse(/** @type {number} */ (NaN))(NaN)),
112
+ ok: () => assertOk(parse(NaN)(NaN)),
133
113
  error: () => {
134
- assertError(parse(/** @type {number} */ (NaN))(0))
114
+ assertError(parse(NaN)(0))
135
115
  assertError(parse(/** @type {const} */ (0))(NaN))
136
116
  assertError(parse(/** @type {const} */ (42))(NaN))
137
117
  },
138
118
  },
139
119
  infinity: {
140
120
  ok: () => {
141
- assertOk(parse(/** @type {number} */ (Infinity))(Infinity))
142
- assertOk(parse(/** @type {number} */ (-Infinity))(-Infinity))
121
+ assertOk(parse(Infinity)(Infinity))
122
+ assertOk(parse(-Infinity)(-Infinity))
143
123
  },
144
124
  error: () => {
145
- assertError(parse(/** @type {number} */ (Infinity))(-Infinity))
146
- assertError(parse(/** @type {number} */ (Infinity))(0))
125
+ assertError(parse(Infinity)(-Infinity))
126
+ assertError(parse(Infinity)(0))
147
127
  },
148
128
  },
149
129
  signedZero: {
150
130
  // `Object.is` distinguishes +0 and -0; `===` treats them equal.
151
131
  distinct: () => {
152
132
  assertError(parse(/** @type {const} */ (0))(-0))
153
- assertError(parse(/** @type {number} */ (-0))(0))
133
+ assertError(parse(-0)(0))
154
134
  },
155
135
  self: () => {
156
136
  assertOk(parse(/** @type {const} */ (0))(0))
157
- assertOk(parse(/** @type {number} */ (-0))(-0))
137
+ assertOk(parse(-0)(-0))
158
138
  },
159
139
  },
160
140
  string: {
@@ -173,28 +153,47 @@ 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
- // The key behavior change vs `validate`: extra tuple elements are dropped.
179
- extraItemsDropped: () => {
158
+ // A tuple is OPEN: a longer array is accepted, and the extras are
159
+ // absent from what `parse` builds. This is deliberate — see
160
+ // "Structs and tuples are open" in ../README.md. Do not add a
161
+ // length check here on the strength of `Ts<readonly [42]>` being
162
+ // an exact tuple; that mapping is exact only because TypeScript
163
+ // could not express the open one (see ../ts/types.ts `TupleTs`),
164
+ // and reading it as a design decision is what produced #1622.
165
+ extraItemsAcceptedAndDropped: () => {
180
166
  const r = parse(/** @type {const} */ ([42]))([42, 'extra'])
181
- assertDeepEqual(unwrap(r), [42])
167
+ assertStructurallySame(unwrap(r), [42])
168
+ const long = parse(/** @type {const} */ ([42]))([42, 1, 2, 3])
169
+ assertStructurallySame(unwrap(long), [42])
170
+ },
171
+ // An absent member reads as `undefined`, so a position is required
172
+ // exactly when its set excludes `undefined` — the same rule the
173
+ // data form states for object keys, applied to arrays.
174
+ shortArrayFillsAnOptionalPosition: () => {
175
+ const r = parse([number, option(string)])([42])
176
+ assertStructurallySame(unwrap(r), [42, undefined])
182
177
  },
183
178
  error: () => {
184
179
  assertError(parse(/** @type {const} */ ([42]))([99]))
185
180
  assertError(parse(/** @type {const} */ ([42]))({}))
181
+ // `42` excludes `undefined`, so position 0 is required.
182
+ assertError(parse(/** @type {const} */ ([42]))([]))
186
183
  },
187
184
  },
188
185
  struct: {
189
186
  ok: () => {
190
187
  const t = /** @type {const} */ ({ a: 42, b: 'hello' })
191
188
  const r = parse(t)({ a: 42, b: 'hello' })
192
- assertDeepEqual(unwrap(r), { a: 42, b: 'hello' })
189
+ assertStructurallySame(unwrap(r), { a: 42, b: 'hello' })
193
190
  },
194
- // Undeclared properties are dropped from the constructed value.
195
- extraKeysDropped: () => {
191
+ // A struct is OPEN, on the same terms as a tuple: undeclared
192
+ // properties are accepted and absent from what `parse` builds.
193
+ // See "Structs and tuples are open" in ../README.md.
194
+ extraKeysAcceptedAndDropped: () => {
196
195
  const r = parse(/** @type {const} */ ({ a: /** @type {const} */ (42) }))({ a: 42, b: 'extra' })
197
- assertDeepEqual(unwrap(r), { a: 42 })
196
+ assertStructurallySame(unwrap(r), { a: 42 })
198
197
  },
199
198
  error: () => {
200
199
  assertError(parse(/** @type {const} */ ({ a: 42 }))({ a: 99 }))
@@ -205,19 +204,19 @@ export const proof = {
205
204
  array: {
206
205
  empty: () => {
207
206
  const r = parse(array(number))([])
208
- assertDeepEqual(unwrap(r), [])
207
+ assertStructurallySame(unwrap(r), [])
209
208
  },
210
209
  ok: () => {
211
210
  const r = parse(array(number))([1, 2, 3])
212
- assertDeepEqual(unwrap(r), [1, 2, 3])
211
+ assertStructurallySame(unwrap(r), [1, 2, 3])
213
212
  },
214
213
  // `parse` always constructs a new array, even when the inner type is a primitive.
215
214
  freshArray: () => {
216
215
  const input = [1, 2, 3]
217
216
  /** @type {readonly number[]} */
218
217
  const out = unwrap(parse(array(number))(input))
219
- assert(out !== /** @type {unknown} */ (input), 'expected a fresh array')
220
- assertDeepEqual(out, [1, 2, 3])
218
+ assert(out !== input, 'expected a fresh array')
219
+ assertStructurallySame(out, [1, 2, 3])
221
220
  },
222
221
  error: () => {
223
222
  assertError(parse(array(number))([1, 'two', 3]))
@@ -226,26 +225,26 @@ export const proof = {
226
225
  },
227
226
  nested: () => {
228
227
  const r = parse(array(array(boolean)))([[true, false], [false]])
229
- assertDeepEqual(unwrap(r), [[true, false], [false]])
228
+ assertStructurallySame(unwrap(r), [[true, false], [false]])
230
229
  assertError(parse(array(array(boolean)))([[true, 42]]))
231
230
  },
232
231
  },
233
232
  record: {
234
233
  empty: () => {
235
234
  const r = parse(record(number))({})
236
- assertDeepEqual(unwrap(r), {})
235
+ assertStructurallySame(unwrap(r), {})
237
236
  },
238
237
  ok: () => {
239
238
  const r = parse(record(string))({ a: 'hello', b: 'world' })
240
- assertDeepEqual(unwrap(r), { a: 'hello', b: 'world' })
239
+ assertStructurallySame(unwrap(r), { a: 'hello', b: 'world' })
241
240
  },
242
241
  // `parse` always constructs a new record.
243
242
  freshRecord: () => {
244
243
  const input = { a: 1, b: 2 }
245
244
  /** @type {Record<string, number>} */
246
245
  const out = unwrap(parse(record(number))(input))
247
- assert(out !== /** @type {unknown} */ (input), 'expected a fresh record')
248
- assertDeepEqual(out, { a: 1, b: 2 })
246
+ assert(out !== input, 'expected a fresh record')
247
+ assertStructurallySame(out, { a: 1, b: 2 })
249
248
  },
250
249
  error: () => {
251
250
  assertError(parse(record(number))({ a: 1, b: 'two' }))
@@ -294,7 +293,7 @@ export const proof = {
294
293
  /** @type {readonly number[]} */
295
294
  const out = unwrap(parse(t)([1, 2, 3]))
296
295
  // The const tuple `[number]` matches first and returns a length-1 result.
297
- assertDeepEqual(out, [1])
296
+ assertStructurallySame(out, [1])
298
297
  },
299
298
  },
300
299
  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,8 @@
1
- /** @import { StringMap } from '../object/types.ts' */
1
+ /**
2
+ * @import { StringMap } from '../object/types.ts'
3
+ */
4
+
5
+ import { assertNotNullish } from '../../asserts/module.f.mjs'
2
6
 
3
7
  /** @typedef {StringMap<readonly unknown[]>} _Tests */
4
8
 
@@ -14,7 +18,7 @@ const tests = {
14
18
  }
15
19
 
16
20
  export const proof = {
17
- typeof: Object.fromEntries(Object.entries(tests).map(([k, a]) => [k, /** @type {readonly unknown[]} */ (a).map(v => () => {
21
+ typeof: Object.fromEntries(Object.entries(tests).map(([k, a]) => [k, assertNotNullish(a).map(v => () => {
18
22
  if (typeof v !== k) { throw `typeof ${v} !== ${k}` }
19
23
  })])),
20
24
  }