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
@@ -9,32 +9,22 @@
9
9
  * scheduling and pass/fail counting.
10
10
  *
11
11
  * @module
12
+ *
13
+ * @import { Operation } from '../effects/types.ts'
14
+ * @import { Effect, NotImplemented } from '../effects/types.ts'
15
+ * @import { LoadModuleOperations, ModuleMap } from '../dev/types.ts'
16
+ * @import { TestFn, TestEntry, TestSet, Path, Reporter, _TestState, _TestAndPath } from './types.ts'
17
+ * @import { All, Await, Env, IoChannel, NodeProgram, NodeProgramOptions, Program, Sandbox, SandboxResult, Test, TestContext, Write, WriteConsoles } from '../effects/node/types.ts'
12
18
  */
13
19
 
14
20
  import { reset, fgGreen, fgRed, bold, csiWrite } from '../text/sgr/module.f.mjs'
15
- import { all, awaitIfPromise, sandbox, test } from '../effects/node/module.f.mjs'
16
- /** @import {
17
- All,
18
- Await,
19
- Env,
20
- NodeProgram,
21
- NodeProgramOptions,
22
- Program,
23
- Sandbox,
24
- SandboxResult,
25
- Test,
26
- TestContext,
27
- Write,
28
- WriteConsoles
29
- } from '../effects/node/types.ts' */
30
- import { history, historyStep, pure, step } from '../effects/module.f.mjs'
31
- /** @import { Effect, Operation } from '../effects/types.ts' */
32
- import { eff } from '../effects/eff/module.f.mjs'
21
+ import { allOk, awaitIfPromise, errorExit, errorMessage, errorSummary, exitStep, sandbox, test } from '../effects/node/module.f.mjs'
22
+ import {
23
+ catchStep, history, historyStep, mapStep, pureError, pureOk, resultStep, step,
24
+ } from '../effects/module.f.mjs'
33
25
  import { loadModuleMap } from '../dev/module.f.mjs'
34
- /** @import { LoadModuleOperations, ModuleMap } from '../dev/types.ts' */
35
26
  import { invert } from '../types/result/module.f.mjs'
36
27
  import { definedEntries } from '../types/object/module.f.mjs'
37
- /** @import { TestFn, TestEntry, TestSet, Path, Reporter, _TestState, _TestAndPath } from './types.ts' */
38
28
 
39
29
  /** @type {(delta: number) => (ts: _TestState) => _TestState} */
40
30
  const addPass = delta => ts =>
@@ -117,10 +107,10 @@ export const collectTests = (path, throws, v) => {
117
107
  * This is the correct model for Node `--test`, Bun, and Deno, where tests must
118
108
  * be declared upfront and the framework drives execution.
119
109
  *
120
- * @type {(ctx: TestContext, k: string, v: unknown, star: string) => Effect<Test | All | Await, void>}
110
+ * @type {(ctx: TestContext, k: string, v: unknown, star: string) => Effect<Test | All | Await, void, NotImplemented>}
121
111
  */
122
112
  export const registerModule = (ctx, k, v, star) => {
123
- /** @type {(ctx: TestContext, entry: _TestAndPath) => Effect<Test | All | Await, void>} */
113
+ /** @type {(ctx: TestContext, entry: _TestAndPath) => Effect<Test | All | Await, void, NotImplemented>} */
124
114
  const registerOne = (ctx, [path, { fn, throws }]) => {
125
115
  // `star` (non-empty for Bun and for Node below the 26 baseline) signals
126
116
  // that all sub-tests run inline inside this single registration, so an
@@ -130,28 +120,38 @@ export const registerModule = (ctx, k, v, star) => {
130
120
  // extra suffix is needed.
131
121
  const base = fmtImport(k, path)
132
122
  const name = throws ? base : `${base}${star}`
133
- return test(ctx, name, throws, (/** @type {TestContext} */ t) =>
134
- eff(awaitIfPromise(fn()))
135
- .step(resolved => {
136
- if (throws) {
137
- return pure(undefined)
138
- }
139
- const sub = collectTests([...path, null], false, resolved)
140
- if (sub.length === 0) {
141
- return pure(undefined)
142
- }
143
- return eff(all(...sub.map(e => registerOne(t, e))))
144
- .step(() => pure(undefined))
145
- .value
146
- })
147
- .value
148
- )
123
+ // The registered callback panics on failure, deliberately. `Test` hands
124
+ // it to an external framework (node `--test`, Bun, Deno) that takes a
125
+ // body which either returns or throws: there is no channel to answer a
126
+ // failure through, so propagating it here would only discard it one
127
+ // level up.
128
+ // A throw is what that framework *does* understand — it reports the
129
+ // test as failed, which is the outcome a caller wants anyway. The `test`
130
+ // operation's own result is propagated normally, just below.
131
+ //
132
+ // `catchStep` rather than `unwrapStep`, so the absorption is visible in
133
+ // the type: the body answers `Effect<…, void, never>`, and the `never`
134
+ // is *because* this handler panics. `errorSummary` still names what is
135
+ // being panicked on and pins it, so if the body's channel ever widens
136
+ // past the node one, the compiler asks here rather than turning a new
137
+ // recoverable failure into a crash.
138
+ /** @type {(t: TestContext) => Effect<Test | All | Await, void, never>} */
139
+ const body = t =>
140
+ catchStep(step(awaitIfPromise(fn()), resolved => {
141
+ if (throws) {
142
+ return pureOk(undefined)
143
+ }
144
+ const sub = collectTests([...path, null], false, resolved)
145
+ if (sub.length === 0) {
146
+ return pureOk(undefined)
147
+ }
148
+ return mapStep(allOk(...sub.map(e => registerOne(t, e))), () => undefined)
149
+ }), e => { throw errorSummary(e) })
150
+ return test(ctx, name, throws, body)
149
151
  }
150
152
  const tests = collectTests([], false, v)
151
- if (tests.length === 0) { return pure(undefined) }
152
- return eff(all(...tests.map(e => registerOne(ctx, e))))
153
- .step(() => pure(undefined))
154
- .value
153
+ if (tests.length === 0) { return pureOk(undefined) }
154
+ return mapStep(allOk(...tests.map(e => registerOne(ctx, e))), () => undefined)
155
155
  }
156
156
 
157
157
  /** @type {(a: _TestState, b: _TestState) => _TestState} */
@@ -164,10 +164,10 @@ const zero = { time: 0, pass: 0, fail: 0 }
164
164
  /**
165
165
  * @template {Operation} O
166
166
  * @param {Reporter<O>} reporter
167
- * @returns {(k: string, v: unknown) => (ts: _TestState) => Effect<O | All, _TestState>}
167
+ * @returns {(k: string, v: unknown) => (ts: _TestState) => Effect<O | All, _TestState, IoChannel>}
168
168
  */
169
169
  const runModule = ({ result, test }) => (k, v) => ts => {
170
- /** @type {(entry: _TestAndPath) => Effect<O | All, _TestState>} */
170
+ /** @type {(entry: _TestAndPath) => Effect<O | All, _TestState, IoChannel>} */
171
171
  const one = ([testPath, set]) => {
172
172
  // The sandbox result is still needed after it has been reported, so the
173
173
  // reporting call is captured rather than nested inside its own step.
@@ -179,28 +179,24 @@ const runModule = ({ result, test }) => (k, v) => ts => {
179
179
  ([, sr]) => {
180
180
  const { result: [s, r], duration } = sr
181
181
  if (s !== 'ok') {
182
- return pure(addFail(duration)(zero))
182
+ return pureOk(addFail(duration)(zero))
183
183
  }
184
184
  if (set.throws) {
185
- return pure(addPass(duration)(zero))
185
+ return pureOk(addPass(duration)(zero))
186
186
  }
187
187
  // Walk return-value sub-tree; null marks the call boundary so
188
188
  // paths render as e.g. `outer().inner`. throws resets to false.
189
- return step(
189
+ return mapStep(
190
190
  walk([...testPath, null], false, r),
191
- sub => pure(mergeState(addPass(duration)(zero), sub)))
191
+ sub => mergeState(addPass(duration)(zero), sub))
192
192
  })
193
193
  }
194
- /** @type {(path: Path, throws: boolean, v: unknown) => Effect<O | All, _TestState>} */
194
+ /** @type {(path: Path, throws: boolean, v: unknown) => Effect<O | All, _TestState, IoChannel>} */
195
195
  const walk = (path, throws, v) => {
196
196
  const effects = collectTests(path, throws, v).map(one)
197
- return eff(all(...effects))
198
- .step(states => pure(states.reduce(mergeState, zero)))
199
- .value
197
+ return mapStep(allOk(...effects), states => states.reduce(mergeState, zero))
200
198
  }
201
- return eff(walk([], false, v))
202
- .step(delta => pure(mergeState(ts, delta)))
203
- .value
199
+ return mapStep(walk([], false, v), delta => mergeState(ts, delta))
204
200
  }
205
201
 
206
202
  /** @type {(moduleMap: ModuleMap) => readonly (readonly [string, unknown])[]} */
@@ -215,44 +211,74 @@ const proofEntries = moduleMap =>
215
211
  *
216
212
  * @template {Operation} O
217
213
  * @param {Reporter<O>} reporter
218
- * @returns {(moduleMap: ModuleMap) => Effect<O | All, number>}
214
+ * @returns {(moduleMap: ModuleMap) => Effect<O | All, number, IoChannel>}
219
215
  */
220
216
  export const runModuleMap = reporter => moduleMap => {
221
217
  const { summary } = reporter
222
218
  const modules = proofEntries(moduleMap)
223
- return eff(all(...modules.map(([k, v]) => runModule(reporter)(k, v)(zero))))
224
- .step(m => pure(m.reduce(mergeState, zero)))
225
- .step(ts => summary(ts.pass, ts.fail, ts.time))
226
- .step((_, ts) => pure(ts.fail !== 0 ? 1 : 0))
227
- .value
219
+ const total = mapStep(
220
+ allOk(...modules.map(([k, v]) => runModule(reporter)(k, v)(zero))),
221
+ m => m.reduce(mergeState, zero))
222
+ // The totals are still needed after the summary has been printed, so they
223
+ // are carried forward in a history rather than closed over by a nested
224
+ // continuation.
225
+ const reported = historyStep(
226
+ history(total),
227
+ ts => summary(ts.pass, ts.fail, ts.time))
228
+ return mapStep(reported, ([, ts]) => ts.fail !== 0 ? 1 : 0)
228
229
  }
229
230
 
231
+ /**
232
+ * Ends a run with the exit code it computed, reporting a channel failure on
233
+ * `stderr` as exit `1`.
234
+ *
235
+ * Not `exitStep`, which answers `0` for every success: this chain's success
236
+ * value **is** the exit code, `1` when a test failed. The two policies differ
237
+ * only in what an `ok` means, and conflating them would report a failing suite
238
+ * as a passing run.
239
+ *
240
+ * A non-zero code therefore leaves through the *error* branch, which is what it
241
+ * means — a suite with failures is a failed program — and is why a caller
242
+ * cannot chain past it by accident.
243
+ *
244
+ * @type {<O extends Operation>(e: Effect<O, number, IoChannel>) => Effect<O | Write, 0, number>}
245
+ */
246
+ const exitCodeStep = e =>
247
+ resultStep(e, r => {
248
+ /** @type {Effect<Write, 0, number>} */
249
+ const code = r[0] === 'error'
250
+ ? errorExit(errorMessage(r[1]))
251
+ : r[1] === 0 ? pureOk(0) : pureError(r[1])
252
+ return code
253
+ })
254
+
230
255
  /**
231
256
  * Discovers all test modules via `loadModuleMap`, then runs them through
232
257
  * `runModuleMap`. The composed effect is a `NodeProgram` entry point for the
233
258
  * `fjs t` test runner.
234
259
  *
260
+ * The chain leaves the error channel here, because this is where a `Program` ends
261
+ * and a `Program`'s answer is an exit code rather than a `Result`. A run that
262
+ * could not report its own results is a failed run, so it exits `1` with the
263
+ * reason on `stderr` instead of unwinding as a panic.
264
+ *
235
265
  * @template {Operation} O
236
266
  * @param {Reporter<O>} reporter
237
- * @returns {Program<O | All | LoadModuleOperations>}
267
+ * @returns {Program<O | All | LoadModuleOperations | Write>}
238
268
  */
239
269
  export const testAll = reporter => options =>
240
- eff(loadModuleMap(options.env))
241
- .step(runModuleMap(reporter))
242
- .value
270
+ exitCodeStep(step(loadModuleMap(options.env), runModuleMap(reporter)))
243
271
 
244
272
  /**
245
273
  * Registers all modules in `moduleMap` that export a `proof` property with
246
274
  * `ctx`. Delegates to `registerModule` for each matching entry.
247
275
  *
248
- * @type {(ctx: TestContext, star: string) => (moduleMap: ModuleMap) => Effect<Test | All | Await, void>}
276
+ * @type {(ctx: TestContext, star: string) => (moduleMap: ModuleMap) => Effect<Test | All | Await, void, NotImplemented>}
249
277
  */
250
278
  const registerModuleMap = (ctx, star) => moduleMap => {
251
279
  const modules = proofEntries(moduleMap)
252
- if (modules.length === 0) { return pure(undefined) }
253
- return eff(all(...modules.map(([k, v]) => registerModule(ctx, k, v, star))))
254
- .step(() => pure(undefined))
255
- .value
280
+ if (modules.length === 0) { return pureOk(undefined) }
281
+ return mapStep(allOk(...modules.map(([k, v]) => registerModule(ctx, k, v, star))), () => undefined)
256
282
  }
257
283
 
258
284
  /** @type {(c: string) => boolean} */
@@ -338,12 +364,10 @@ export const ghEscape = s =>
338
364
  * Default `Reporter.test` implementation: sandboxes `fn` once and inverts the
339
365
  * result when `throws` is `true` (caught error → pass, clean return → fail).
340
366
  *
341
- * @type {(file: string, path: Path, entry: TestEntry) => Effect<Sandbox, SandboxResult<unknown>>}
367
+ * @type {(file: string, path: Path, entry: TestEntry) => Effect<Sandbox, SandboxResult<unknown>, NotImplemented>}
342
368
  */
343
369
  export const defaultTest = (file, path, { fn, throws }) =>
344
- eff(sandbox(fn))
345
- .step(r => pure(throws ? { ...r, result: invert(r.result) } : r))
346
- .value
370
+ mapStep(sandbox(fn), r => throws ? { ...r, result: invert(r.result) } : r)
347
371
 
348
372
  /** @type {(file: string, path: Path, color: string, label: string, duration: number) => string} */
349
373
  const fmtResultLine = (file, path, color, label, duration) =>
@@ -360,7 +384,12 @@ const fmtResultLine = (file, path, color, label, duration) =>
360
384
  */
361
385
  export const defaultReporter = options => {
362
386
  const write = csiWrite(options)
363
- /** @type {(w: WriteConsoles) => (s: string) => Effect<Write, void>} */
387
+ // A reporter that cannot emit its own output has no fallback to choose —
388
+ // there is nowhere left to report the failure — but it does not have to
389
+ // decide that here: the failure travels to the program's tail, which ends
390
+ // the run with the reason on `stderr` and exit `1`. That is the same
391
+ // outcome a panic produced, minus the stack trace.
392
+ /** @type {(w: WriteConsoles) => (s: string) => Effect<Write, void, NotImplemented>} */
364
393
  const line = w => {
365
394
  const x = write(w)
366
395
  return s => x(s + '\n')
@@ -375,14 +404,17 @@ export const defaultReporter = options => {
375
404
  ? csiLog(fmtResultLine(file, path, fgGreen, 'ok', duration) + (throws ? ' # EXPECTED TO THROW' : ''))
376
405
  : isGitHub
377
406
  ? csiError(`::error file=${file},line=1,title=${ghEscape(fmtImport(file, path))}::${ghEscape(String(v))}`)
378
- : eff(csiError(fmtResultLine(file, path, fgRed, 'error', duration)))
379
- .step(() => csiError(`${fgRed}${v}${reset}`))
380
- .value,
407
+ // `step`, so the detail line is attempted only when the
408
+ // header line was written: two halves of one report, and
409
+ // half of it is worse than none.
410
+ : step(
411
+ csiError(fmtResultLine(file, path, fgRed, 'error', duration)),
412
+ () => csiError(`${fgRed}${v}${reset}`)),
381
413
  summary: (pass, fail, time) => {
382
414
  const fgFail = fail === 0 ? fgGreen : fgRed
383
- return eff(csiLog(`${bold}Number of tests: pass: ${fgGreen}${pass}${reset}${bold}, fail: ${fgFail}${fail}${reset}${bold}, total: ${pass + fail}${reset}`))
384
- .step(() => csiLog(`${bold}Time: ${timeFormat(time)}${reset}`))
385
- .value
415
+ return step(
416
+ csiLog(`${bold}Number of tests: pass: ${fgGreen}${pass}${reset}${bold}, fail: ${fgFail}${fail}${reset}${bold}, total: ${pass + fail}${reset}`),
417
+ () => csiLog(`${bold}Time: ${timeFormat(time)}${reset}`))
386
418
  },
387
419
  test: defaultTest,
388
420
  }
@@ -407,8 +439,10 @@ export const main =
407
439
  export const register = o => {
408
440
  const star = o.inlineTestContext ? ' ...' : ''
409
441
  const ctx = o.engine === 'bun' ? o.bunTestContext : o.testContext
410
- return eff(loadModuleMap(o.env))
411
- .step(registerModuleMap(ctx, star))
412
- .step(() => pure(0))
413
- .value
442
+ const registered = step(loadModuleMap(o.env), registerModuleMap(ctx, star))
443
+ // `exitStep`, not `mapStep(…, () => 0)`: registering is the whole job here,
444
+ // so "registered nothing, exit 0" is the answer this used to give and the
445
+ // one it must not. A success has no code of its own, which is exactly the
446
+ // shape `exitStep` is for.
447
+ return exitStep(registered)
414
448
  }
@@ -1,15 +1,17 @@
1
1
  /**
2
- * @import { Effect } from '../effects/types.ts'
3
- * @import { NodeProgramOptions, Sandbox, Write } from '../effects/node/types.ts'
2
+ * @import { RunInstance } from '../effects/mock/types.ts'
3
+ * @import { Effect, NotImplemented } from '../effects/types.ts'
4
+ * @import { NodeProgramOptions, OpResult, Sandbox, Write } from '../effects/node/types.ts'
4
5
  * @import { JsModule } from '../effects/node/virtual/types.ts'
5
6
  * @import { Reporter } from './types.ts'
6
- * @import { All, Await, Test, TestContext } from '../effects/node/types.ts'
7
+ * @import { All, Await, Import, Readdir, Test, TestContext } from '../effects/node/types.ts'
7
8
  * @import { Ts } from '../types/rtti/ts/types.ts'
8
9
  */
10
+ import type { RunInstance } from '../effects/mock/types.ts';
9
11
  import type { Effect } from '../effects/types.ts';
10
- import type { Sandbox, Write } from '../effects/node/types.ts';
12
+ import type { OpResult, Sandbox, Write } from '../effects/node/types.ts';
11
13
  import type { Reporter } from './types.ts';
12
- import type { All, Await, Test, TestContext } from '../effects/node/types.ts';
14
+ import type { All, Await, Import, Readdir, Test, TestContext } from '../effects/node/types.ts';
13
15
  import type { Ts } from '../types/rtti/ts/types.ts';
14
16
  /**
15
17
  * The mock reporter's stdout lines. A schema rather than a hand-written type:
@@ -39,13 +41,19 @@ export declare const defaultReporterOutput: () => void;
39
41
  export declare const defaultReporterOutputLargeDuration: () => void;
40
42
  export declare const defaultReporterFailOutput: () => void;
41
43
  export declare const githubReporterOutput: () => void;
44
+ export type _FailOps = All | Import | Readdir | Sandbox | Write;
45
+ /** @typedef {All | Import | Readdir | Sandbox | Write} _FailOps */
46
+ export declare const reporterWriteFailure: () => void;
42
47
  export type _RegisterMockState = readonly string[];
43
48
  export type _RegisterMockOps = Test | All | Await;
44
- export type _RegisterRunner = (s: _RegisterMockState) => <T>(e: Effect<_RegisterMockOps, T>) => readonly [_RegisterMockState, T];
45
- export type _RegisterTestOp = (runner: _RegisterRunner, ctx: TestContext, name: string, expectFailure: boolean, fn: (t: TestContext) => Effect<_RegisterMockOps, void>) => (s: _RegisterMockState) => readonly [_RegisterMockState, void];
49
+ export type _RegisterRunner = RunInstance<_RegisterMockOps, _RegisterMockState>;
50
+ export type _RegisterTestOp = (runner: _RegisterRunner, ctx: TestContext, name: string, expectFailure: boolean, fn: (t: TestContext) => Effect<_RegisterMockOps, void, never>) => (s: _RegisterMockState) => readonly [_RegisterMockState, OpResult<void>];
46
51
  export declare const registerSuffixes: () => void;
52
+ declare const registerBodyPanicsOnUndispatchableEffect: () => void;
47
53
  export declare const registerThrowsWithoutThrowing: () => void;
48
54
  export declare const registerEmptyProof: () => void;
55
+ export declare const registerEmptyModuleMap: () => void;
56
+ export declare const registerSelectsContextAndStar: () => void;
49
57
  export declare const helpers: {
50
58
  isInteger: () => void;
51
59
  isIdentifier: () => void;
@@ -61,6 +69,9 @@ export declare const helpers: {
61
69
  };
62
70
  declare const defaultReporterExpectedToThrow: () => void;
63
71
  export declare const proof: {
72
+ throw: {
73
+ registerBodyPanicsOnUndispatchableEffect: typeof registerBodyPanicsOnUndispatchableEffect;
74
+ };
64
75
  flat: typeof flat;
65
76
  nested: typeof nested;
66
77
  throwKey: typeof throwKey;
@@ -76,9 +87,12 @@ export declare const proof: {
76
87
  defaultReporterOutputLargeDuration: typeof defaultReporterOutputLargeDuration;
77
88
  defaultReporterFailOutput: typeof defaultReporterFailOutput;
78
89
  githubReporterOutput: typeof githubReporterOutput;
90
+ reporterWriteFailure: typeof reporterWriteFailure;
79
91
  registerSuffixes: typeof registerSuffixes;
80
92
  registerThrowsWithoutThrowing: typeof registerThrowsWithoutThrowing;
81
93
  registerEmptyProof: typeof registerEmptyProof;
94
+ registerEmptyModuleMap: typeof registerEmptyModuleMap;
95
+ registerSelectsContextAndStar: typeof registerSelectsContextAndStar;
82
96
  defaultReporterExpectedToThrow: typeof defaultReporterExpectedToThrow;
83
97
  helpers: {
84
98
  isInteger: () => void;