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
@@ -1,10 +1,41 @@
1
1
  /**
2
2
  * @module
3
3
  *
4
+ * @import { Ast, AstTag } from './matcher/types.ts'
4
5
  * @import { Rule } from './types.ts'
5
6
  */
7
+ import type { Ast } from './matcher/types.ts';
6
8
  import type { Rule } from './types.ts';
7
9
  /** @type {() => Rule} */
8
10
  export declare const classic: () => Rule;
9
11
  /** @type {() => Rule} */
10
12
  export declare const deterministic: () => Rule;
13
+ export type _Leaf = number | readonly [number, unknown];
14
+ export type _AstNode = Ast<_Leaf>;
15
+ export type _AstChild = _AstNode | _Leaf;
16
+ export type _Parts = {
17
+ readonly parts: readonly string[];
18
+ readonly text: string;
19
+ };
20
+ /**
21
+ * Renders a matcher AST as one line of `tag(children)`, with the code points a
22
+ * node consumed directly written as one quoted string.
23
+ *
24
+ * A proof that pins a whole AST is checking its *shape*, and raw JSON buries
25
+ * that under `{"tag":…,"sequence":[…]}` and a `[32,null]` per space — several
26
+ * kilobytes for an input a reader can hold in their head. This keeps the two
27
+ * things a repetition changes legible: how deep the nesting goes, and which
28
+ * tags survive. Repeated items are siblings under one node, whereas the
29
+ * right-recursive encoding puts each item one level deeper than the last.
30
+ *
31
+ * @type {(node: _AstNode) => string}
32
+ *
33
+ * @example
34
+ *
35
+ * ```ts
36
+ * // three spaces matched by a flat `repeat`, then by right-recursion
37
+ * '(" "(" ") " "(" ") " "(" "))'
38
+ * '" "(" " " "(" " " "(" " *())'
39
+ * ```
40
+ */
41
+ export declare const showAst: (node: _AstNode) => string;
@@ -1,9 +1,11 @@
1
1
  /**
2
2
  * @module
3
3
  *
4
+ * @import { Ast, AstTag } from './matcher/types.ts'
4
5
  * @import { Rule } from './types.ts'
5
6
  */
6
7
 
8
+ import { codePointToString } from '../text/utf16/module.f.mjs'
7
9
  import {
8
10
  commaJoin0Plus,
9
11
  none,
@@ -194,3 +196,81 @@ export const deterministic = () => {
194
196
 
195
197
  return json
196
198
  }
199
+
200
+ //
201
+
202
+ /**
203
+ * The leaf of either backend's AST: `bnf/ll1` keeps the code point alone and
204
+ * `bnf/descent` pairs it with metadata, so a renderer that takes both is
205
+ * generic over exactly this.
206
+ *
207
+ * @typedef {number | readonly [number, unknown]} _Leaf
208
+ */
209
+
210
+ /** @typedef {Ast<_Leaf>} _AstNode */
211
+
212
+ /** @typedef {_AstNode | _Leaf} _AstChild */
213
+
214
+ /**
215
+ * @param {_AstChild} child
216
+ * @returns {child is _AstNode}
217
+ */
218
+ const isAstNode = child => typeof child !== 'number' && !(child instanceof Array)
219
+
220
+ /** @type {(child: _Leaf) => number} */
221
+ const codePointOf = child => typeof child === 'number' ? child : child[0]
222
+
223
+ /**
224
+ * A tag as `showAst` writes it: a quoted string, `*` for the tagless empty
225
+ * match, and nothing at all for an untagged node. `*` rather than `true`
226
+ * because a branch may itself be named `true` — the JSON grammars have one.
227
+ *
228
+ * @type {(tag: AstTag) => string}
229
+ */
230
+ const showTag = tag =>
231
+ tag === undefined ? '' : tag === true ? '*' : JSON.stringify(tag)
232
+
233
+ /** @typedef {{ readonly parts: readonly string[], readonly text: string }} _Parts */
234
+
235
+ /**
236
+ * Ends the run of consumed code points being accumulated, if there is one, so
237
+ * that a node's text appears as one quoted string rather than one part per
238
+ * symbol.
239
+ *
240
+ * @type {(acc: _Parts) => readonly string[]}
241
+ */
242
+ const flushText = acc =>
243
+ acc.text === '' ? acc.parts : [...acc.parts, JSON.stringify(acc.text)]
244
+
245
+ /** @type {(acc: _Parts, child: _AstChild) => _Parts} */
246
+ const addChild = (acc, child) =>
247
+ isAstNode(child)
248
+ ? { parts: [...flushText(acc), showAst(child)], text: '' }
249
+ : { parts: acc.parts, text: acc.text + codePointToString(codePointOf(child)) }
250
+
251
+ /** @type {_Parts} */
252
+ const noParts = { parts: [], text: '' }
253
+
254
+ /**
255
+ * Renders a matcher AST as one line of `tag(children)`, with the code points a
256
+ * node consumed directly written as one quoted string.
257
+ *
258
+ * A proof that pins a whole AST is checking its *shape*, and raw JSON buries
259
+ * that under `{"tag":…,"sequence":[…]}` and a `[32,null]` per space — several
260
+ * kilobytes for an input a reader can hold in their head. This keeps the two
261
+ * things a repetition changes legible: how deep the nesting goes, and which
262
+ * tags survive. Repeated items are siblings under one node, whereas the
263
+ * right-recursive encoding puts each item one level deeper than the last.
264
+ *
265
+ * @type {(node: _AstNode) => string}
266
+ *
267
+ * @example
268
+ *
269
+ * ```ts
270
+ * // three spaces matched by a flat `repeat`, then by right-recursion
271
+ * '(" "(" ") " "(" ") " "(" "))'
272
+ * '" "(" " " "(" " " "(" " *())'
273
+ * ```
274
+ */
275
+ export const showAst = node =>
276
+ `${showTag(node.tag)}(${flushText(node.sequence.reduce(addChild, noParts)).join(' ')})`
@@ -4,7 +4,8 @@
4
4
  * A parser built on top of a tokenizer consumes one input symbol per token, so
5
5
  * multi-character operators (`>>>=`) and keywords (`instanceof`) each need a
6
6
  * symbol of their own. Names are registered as one fixed alphabet and get a
7
- * symbol from their position in it, above the Unicode range and below `eof`.
7
+ * symbol from their position in it, above the Unicode range and up to the last
8
+ * ordinary symbol.
8
9
  *
9
10
  * See `./types.ts` for the `Encoding<T>` type-level API.
10
11
  *
@@ -14,8 +15,8 @@
14
15
  */
15
16
  import type { Encoding } from './types.ts';
16
17
  /**
17
- * How many names one encoding holds: every symbol from {@link start} up to but
18
- * not including `eof` (`0xFFFFFF`, the top of the 24-bit symbol space).
18
+ * How many names one encoding holds: every symbol from {@link start} up to and
19
+ * including the last ordinary symbol (`0xFFFFFE`, the top of `fullRange`).
19
20
  *
20
21
  * @type {number}
21
22
  */
@@ -4,7 +4,8 @@
4
4
  * A parser built on top of a tokenizer consumes one input symbol per token, so
5
5
  * multi-character operators (`>>>=`) and keywords (`instanceof`) each need a
6
6
  * symbol of their own. Names are registered as one fixed alphabet and get a
7
- * symbol from their position in it, above the Unicode range and below `eof`.
7
+ * symbol from their position in it, above the Unicode range and up to the last
8
+ * ordinary symbol.
8
9
  *
9
10
  * See `./types.ts` for the `Encoding<T>` type-level API.
10
11
  *
@@ -15,11 +16,11 @@
15
16
 
16
17
  import { assert } from '../../asserts/module.f.mjs'
17
18
  import { fromUndefined } from '../../types/nullable/module.f.mjs'
18
- import { eof, rangeDecode, unicodeRange } from '../module.f.mjs'
19
+ import { fullRange, rangeDecode, unicodeRange } from '../module.f.mjs'
19
20
 
20
21
  const [, unicodeLast] = rangeDecode(unicodeRange)
21
22
 
22
- const [eofSymbol] = rangeDecode(eof)
23
+ const [, lastOrdinary] = rangeDecode(fullRange)
23
24
 
24
25
  /**
25
26
  * The symbol of the first registered name: `0x110000`, one past the last
@@ -29,12 +30,12 @@ const [eofSymbol] = rangeDecode(eof)
29
30
  const start = unicodeLast + 1
30
31
 
31
32
  /**
32
- * How many names one encoding holds: every symbol from {@link start} up to but
33
- * not including `eof` (`0xFFFFFF`, the top of the 24-bit symbol space).
33
+ * How many names one encoding holds: every symbol from {@link start} up to and
34
+ * including the last ordinary symbol (`0xFFFFFE`, the top of `fullRange`).
34
35
  *
35
36
  * @type {number}
36
37
  */
37
- export const capacity = eofSymbol - start
38
+ export const capacity = lastOrdinary - start + 1
38
39
 
39
40
  /**
40
41
  * Builds an encoding over the complete list of token names.
@@ -1,4 +1,5 @@
1
1
  import { assertEq } from '../../asserts/module.f.mjs'
2
+ import { eofSymbol } from '../module.f.mjs'
2
3
  import { capacity, encoding } from './module.f.mjs'
3
4
 
4
5
  const names = /** @type {const} */ (['>>', '>>>=', 'instanceof'])
@@ -17,10 +18,12 @@ export const proof = {
17
18
  },
18
19
  () => {
19
20
  const { decode } = encoding(names)
20
- // past the end of the alphabet, a code point, and `eof`
21
+ // past the end of the alphabet, a code point, the last ordinary
22
+ // symbol, and `eof`
21
23
  assertEq(decode(0x110003), null)
22
24
  assertEq(decode(0x10FFFF), null)
23
- assertEq(decode(0xFFFFFF), null)
25
+ assertEq(decode(0xFFFFFE), null)
26
+ assertEq(decode(eofSymbol), null)
24
27
  },
25
28
  ],
26
29
  roundTrip: () => {
@@ -20,8 +20,8 @@ export type Encoding<T extends string> = {
20
20
  readonly encode: (name: T) => number;
21
21
  /**
22
22
  * The name a symbol stands for, or `null` when the symbol belongs to no
23
- * registered name — a code point, `eof`, or a symbol past the end of the
24
- * alphabet.
23
+ * registered name — a code point, the `eof` symbol, or a symbol past the
24
+ * end of the alphabet.
25
25
  */
26
26
  readonly decode: (symbol: number) => Nullable<T>;
27
27
  };
@@ -5,11 +5,18 @@
5
5
  */
6
6
  import type { StringMap } from '../types/object/types.ts';
7
7
  /**
8
- * A range of symbols. Two 24-bit numbers are stored in one JS number (48 bits).
8
+ * A range of symbols. Two 24-bit endpoint codes are stored in one JS number
9
+ * (48 bits).
9
10
  *
10
11
  * For example: 0xBBBBBB_EEEEEE
11
- * - 0xBBBBBB is the first symbol (24 bits)
12
- * - 0xEEEEEE is the last symbol (24 bits)
12
+ * - 0xBBBBBB is the first endpoint's stored code (24 bits)
13
+ * - 0xEEEEEE is the last endpoint's stored code (24 bits)
14
+ *
15
+ * A stored code is not the semantic terminal value: the semantic domain is
16
+ * `[-1] | [0, 2 ** 24 - 2]` — EOF plus every ordinary symbol — and EOF's code
17
+ * is `0xFFFFFF`, the top of the stored space. `rangeEncode` / `rangeDecode` in
18
+ * `./module.f.mjs` convert between the two, and everything that compares
19
+ * terminals compares decoded values.
13
20
  *
14
21
  * 24 bits per half, not 26 (the most `float64`'s 52-bit safe-integer mantissa
15
22
  * could fit two of): 24 is divisible by 4, so each half is exactly 6 hex
@@ -14,4 +14,4 @@ import type { MemOp } from '../../effects/memory/types.ts';
14
14
  import type { FileCasOperation } from '../types.ts';
15
15
  /** @type {Commands<FileCasOperation | WriteFile | Write | All | MemOp | Read>} */
16
16
  export declare const commands: Commands<FileCasOperation | WriteFile | Write | All | MemOp | Read>;
17
- export declare const main: (options: import("../../effects/node/types.ts").NodeProgramOptions) => import("../../effects/types.ts").Effect<All | Read | Write | WriteFile | FileCasOperation | MemOp, number>;
17
+ export declare const main: import("../../effects/node/types.ts").Program<All | Read | Write | WriteFile | FileCasOperation | MemOp>;
@@ -11,8 +11,9 @@
11
11
 
12
12
  import { sha256 } from '../../crypto/sha2/module.f.mjs'
13
13
  import { cBase32ToVec, vecToCBase32 } from '../../basen/cbase32/module.f.mjs'
14
- import { forEachStep, pure, step } from '../../effects/module.f.mjs'
15
- import { errorExit, log, writeFromStream } from '../../effects/node/module.f.mjs'
14
+
15
+ import { errorExit, exitStep, log, writeFromStream } from '../../effects/node/module.f.mjs'
16
+ import { forEachStep, step as ioStep } from '../../effects/module.f.mjs'
16
17
  import { dispatch } from '../../cli/module.f.mjs'
17
18
  import { casAddFile, fileCas } from '../module.f.mjs'
18
19
 
@@ -26,15 +27,9 @@ export const commands = [
26
27
  return errorExit("'cas add' expects one parameter")
27
28
  }
28
29
  const c = fileCas(sha256)(home)
29
- return step(
30
- casAddFile(c)(path),
31
- hashResult => hashResult[0] === 'error'
32
- ? pure(1)
33
- : step(
34
- log(vecToCBase32(hashResult[1])),
35
- () => pure(0)
36
- )
37
- )
30
+ const added = casAddFile(c)(path)
31
+ const logged = ioStep(added, hash => log(vecToCBase32(hash)))
32
+ return exitStep(logged)
38
33
  },
39
34
  },
40
35
  {
@@ -50,10 +45,7 @@ export const commands = [
50
45
  }
51
46
  const c = fileCas(sha256)(home)
52
47
  const x = c.read(hash)
53
- return step(
54
- writeFromStream(path, x),
55
- ([r, v]) => r === 'error' ? errorExit(`e: ` + String(v)) : pure(0),
56
- )
48
+ return exitStep(writeFromStream(path, x))
57
49
  },
58
50
  },
59
51
  {
@@ -61,11 +53,13 @@ export const commands = [
61
53
  description: 'List all stored content hashes',
62
54
  handler: ({ home }) => {
63
55
  const c = fileCas(sha256)(home)
64
- const x0 = forEachStep(c.list(), j => log(vecToCBase32(j)))
65
- return step(
66
- x0,
67
- () => pure(0)
68
- )
56
+ // The fold's `items` is deliberately a raw effect, so a fallible
57
+ // producer composes with `step` ahead of it rather than the fold
58
+ // growing an error channel of its own.
59
+ // `c.list()` feeds the fold directly: the step that used to sit
60
+ // here existed only to unwrap the list so `pure` could wrap it
61
+ // again.
62
+ return exitStep(forEachStep(c.list(), j => log(vecToCBase32(j))))
69
63
  },
70
64
  },
71
65
  ]
@@ -1,4 +1,6 @@
1
- /** @import { NodeProgramOptions } from '../../effects/node/types.ts' */
1
+ /**
2
+ * @import { NodeProgramOptions } from '../../effects/node/types.ts'
3
+ */
2
4
  export declare const proof: {
3
5
  mainAdd: () => void;
4
6
  mainAddGetBig: () => void;
@@ -12,7 +14,5 @@ export declare const proof: {
12
14
  mainListEmptyStore: () => void;
13
15
  mainNoCmd: () => void;
14
16
  mainUnknownCmd: () => void;
15
- throw: {
16
- mainListCorruptStore: () => readonly [import("../../effects/node/virtual/types.ts").State, number];
17
- };
17
+ mainListCorruptStore: () => void;
18
18
  };
@@ -1,5 +1,8 @@
1
- /** @import { NodeProgramOptions } from '../../effects/node/types.ts' */
1
+ /**
2
+ * @import { NodeProgramOptions } from '../../effects/node/types.ts'
3
+ */
2
4
 
5
+ import { exitCode } from '../../effects/node/module.f.mjs'
3
6
  import { commands } from './module.f.mjs'
4
7
  import { computeSync, sha256 } from '../../crypto/sha2/module.f.mjs'
5
8
  import { maxLength, vec, vec8 } from '../../types/bit_vec/module.f.mjs'
@@ -18,8 +21,8 @@ export const proof = {
18
21
  mainAdd: () => {
19
22
  const content = vec8(0x2An)
20
23
  const state = { ...emptyState, root: { myfile: [content] } }
21
- const [finalState, exitCode] = virtual(state)(main(makeOptions(['add', 'myfile'])))
22
- assertEq(exitCode, 0, ['expected exit 0', exitCode])
24
+ const [finalState, code] = virtual(state)(main(makeOptions(['add', 'myfile'])))
25
+ assertEq(exitCode(code), 0, ['expected exit 0', code])
23
26
  assert(finalState.stdout.length !== 0, 'expected hash in stdout')
24
27
  },
25
28
  mainAddGetBig: () => {
@@ -27,8 +30,8 @@ export const proof = {
27
30
  const content = [chunk, chunk]
28
31
  const state = { ...emptyState, root: { myfile: content } }
29
32
  //
30
- const [finalState, exitCode] = virtual(state)(main(makeOptions(['add', 'myfile'])))
31
- assertEq(exitCode, 0)
33
+ const [finalState, code] = virtual(state)(main(makeOptions(['add', 'myfile'])))
34
+ assertEq(exitCode(code), 0)
32
35
  const stdout = finalState.stdout
33
36
  assert(stdout.length !== 0)
34
37
  //
@@ -38,32 +41,33 @@ export const proof = {
38
41
  //
39
42
  const [finalState2, exitCode2] = virtual(finalState)(main(makeOptions(['get', hs, 'myfile2'])))
40
43
  // console.log(finalState2.stderr)
41
- assertEq(exitCode2, 0, 'e2')
44
+ assertEq(exitCode(exitCode2), 0, 'e2')
42
45
  const { myfile2 } = finalState2.root
43
46
  assert(myfile2 instanceof Array)
44
47
  const h2 = computeSync(sha256)(myfile2)
45
48
  assertEq(h, h2, 'h')
46
49
  },
47
50
  mainAddWrongArgs: () => {
48
- const [finalState, exitCode] = virtual(emptyState)(main(makeOptions(['add'])))
49
- assertEq(exitCode, 1)
51
+ const [finalState, code] = virtual(emptyState)(main(makeOptions(['add'])))
52
+ assertEq(exitCode(code), 1)
50
53
  assert(finalState.stderr.length !== 0)
51
54
  },
52
55
  mainAddMissingFile: () => {
53
- // The source path doesn't exist, so `streamFile`'s first read comes back as an
54
- // error item; `write` fails closed with that error and the handler exits 1
55
- // without ever calling `log` — covers the `hashResult[0] === 'error'` branch.
56
- const [, exitCode] = virtual(emptyState)(main(makeOptions(['add', 'missing'])))
57
- assertEq(exitCode, 1)
56
+ // The source path doesn't exist, so `streamFile`'s first read comes back as a
57
+ // stream failure; `write` fails closed with that error and the handler exits 1
58
+ // without ever calling `log` — covers `exitStep`'s error branch.
59
+ const [finalState, code] = virtual(emptyState)(main(makeOptions(['add', 'missing'])))
60
+ assertEq(exitCode(code), 1)
61
+ assertEq(finalState.stderr, 'no such file or directory\n', finalState.stderr)
58
62
  },
59
63
  mainGetFound: () => {
60
64
  const content = vec8(0x2An)
61
65
  const state = { ...emptyState, root: { myfile: [content] } }
62
66
  const [state1, exitCode1] = virtual(state)(main(makeOptions(['add', 'myfile'])))
63
- assertEq(exitCode1, 0, ['expected add exit 0', exitCode1])
67
+ assertEq(exitCode(exitCode1), 0, ['expected add exit 0', exitCode1])
64
68
  const hashStr = state1.stdout.trim()
65
69
  const [, exitCode2] = virtual(state1)(main(makeOptions(['get', hashStr, 'output'])))
66
- assertEq(exitCode2, 0, ['expected get exit 0', exitCode2])
70
+ assertEq(exitCode(exitCode2), 0, ['expected get exit 0', exitCode2])
67
71
  },
68
72
  mainGetNotFound: () => {
69
73
  // valid cBase32 hash that has not been stored
@@ -72,47 +76,56 @@ export const proof = {
72
76
  const [state1] = virtual(state)(main(makeOptions(['add', 'myfile'])))
73
77
  const hashStr = state1.stdout.trim()
74
78
  // use an empty store so the hash is not found
75
- const [finalState, exitCode] = virtual(emptyState)(main(makeOptions(['get', hashStr, 'output'])))
76
- assertEq(exitCode, 1, ['expected exit 1', exitCode])
77
- assert(finalState.stderr.length !== 0, 'expected error in stderr')
79
+ const [finalState, code] = virtual(emptyState)(main(makeOptions(['get', hashStr, 'output'])))
80
+ assertEq(exitCode(code), 1, ['expected exit 1', code])
81
+ // The *message*, not just a non-empty line: the failure reaches the user
82
+ // as the host's own words. Asserting only that something was written is
83
+ // what let a stringified error tuple (`ioError,[object Object]`) pass.
84
+ assertEq(finalState.stderr, 'no such file or directory\n', finalState.stderr)
78
85
  },
79
86
  mainGetWrongArgs: () => {
80
- const [finalState, exitCode] = virtual(emptyState)(main(makeOptions(['get'])))
81
- assertEq(exitCode, 1, ['expected exit 1', exitCode])
87
+ const [finalState, code] = virtual(emptyState)(main(makeOptions(['get'])))
88
+ assertEq(exitCode(code), 1, ['expected exit 1', code])
82
89
  assert(finalState.stderr.length !== 0, 'expected error in stderr')
83
90
  },
84
91
  mainGetInvalidHash: () => {
85
- const [finalState, exitCode] = virtual(emptyState)(main(makeOptions(['get', 'not-a-valid-hash', 'output'])))
86
- assertEq(exitCode, 1, ['expected exit 1', exitCode])
92
+ const [finalState, code] = virtual(emptyState)(main(makeOptions(['get', 'not-a-valid-hash', 'output'])))
93
+ assertEq(exitCode(code), 1, ['expected exit 1', code])
87
94
  assert(finalState.stderr.length !== 0, 'expected error in stderr')
88
95
  },
89
96
  mainList: () => {
90
97
  const content = vec8(0x2An)
91
98
  const state = { ...emptyState, root: { myfile: [content] } }
92
99
  const [state1] = virtual(state)(main(makeOptions(['add', 'myfile'])))
93
- const [, exitCode] = virtual(state1)(main(makeOptions(['list'])))
94
- assertEq(exitCode, 0, ['expected exit 0', exitCode])
100
+ const [, code] = virtual(state1)(main(makeOptions(['list'])))
101
+ assertEq(exitCode(code), 0, ['expected exit 0', code])
95
102
  },
96
103
  mainListEmptyStore: () => {
97
104
  // A fresh directory has no `.cas` yet; listing must succeed (empty),
98
105
  // not crash unwrapping a readdir ENOENT.
99
- const [finalState, exitCode] = virtual(emptyState)(main(makeOptions(['list'])))
100
- assertEq(exitCode, 0, ['expected exit 0', exitCode])
106
+ const [finalState, code] = virtual(emptyState)(main(makeOptions(['list'])))
107
+ assertEq(exitCode(code), 0, ['expected exit 0', code])
101
108
  assertEq(finalState.stdout, '', ['expected empty stdout', finalState.stdout])
102
109
  },
103
110
  mainNoCmd: () => {
104
- const [finalState, exitCode] = virtual(emptyState)(main(makeOptions([])))
105
- assertEq(exitCode, 1, ['expected exit 1', exitCode])
111
+ const [finalState, code] = virtual(emptyState)(main(makeOptions([])))
112
+ assertEq(exitCode(code), 1, ['expected exit 1', code])
106
113
  assert(finalState.stderr.length !== 0, 'expected error in stderr')
107
114
  },
108
115
  mainUnknownCmd: () => {
109
- const [finalState, exitCode] = virtual(emptyState)(main(makeOptions(['bogus'])))
110
- assertEq(exitCode, 1, ['expected exit 1', exitCode])
116
+ const [finalState, code] = virtual(emptyState)(main(makeOptions(['bogus'])))
117
+ assertEq(exitCode(code), 1, ['expected exit 1', code])
111
118
  assert(finalState.stderr.length !== 0, 'expected error in stderr')
112
119
  },
113
- throw: {
114
- // `.cas` exists but is a file, not a directory: a real storage error
115
- // that must surface, not be masked as an empty list.
116
- mainListCorruptStore: () => virtual({ ...emptyState, root: { '.cas': [vec8(0x2An)] } })(main(makeOptions(['list']))),
120
+ // `.cas` exists but is a file, not a directory: a real storage error that
121
+ // must surface, not be masked as an empty list. It is no longer a panic
122
+ // either `list` answers with the error and the CLI reports it on stderr
123
+ // and exits 1, which is why this is an ordinary proof rather than a
124
+ // `throw` one.
125
+ mainListCorruptStore: () => {
126
+ const [state, code] = virtual({ ...emptyState, root: { '.cas': [vec8(0x2An)] } })(main(makeOptions(['list'])))
127
+ assertEq(exitCode(code), 1)
128
+ assert(state.stderr !== '', ['expected the storage error reported on stderr', state.stderr])
129
+ assertEq(state.stdout, '')
117
130
  },
118
131
  }