functionalscript 0.36.0 → 0.38.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 (523) hide show
  1. package/README.md +1 -1
  2. package/{fs → fjs}/asn.1/module.f.js +1 -1
  3. package/{fs → fjs}/asn.1/proof.f.js +32 -94
  4. package/fjs/asserts/module.f.d.ts +36 -0
  5. package/fjs/asserts/module.f.js +39 -0
  6. package/fjs/asserts/proof.f.d.ts +11 -0
  7. package/fjs/asserts/proof.f.js +18 -0
  8. package/{fs → fjs}/base_n/module.f.js +3 -3
  9. package/{fs → fjs}/base_n/proof.f.js +15 -39
  10. package/{fs → fjs/basen}/base128/module.f.d.ts +1 -1
  11. package/{fs → fjs/basen}/base128/module.f.js +1 -1
  12. package/{fs → fjs/basen}/base128/proof.f.js +3 -3
  13. package/{fs → fjs/basen}/base64/module.f.d.ts +2 -2
  14. package/{fs → fjs/basen}/base64/module.f.js +25 -15
  15. package/{fs → fjs/basen}/base64/proof.f.d.ts +2 -0
  16. package/{fs → fjs/basen}/base64/proof.f.js +26 -6
  17. package/{fs → fjs/basen}/cbase32/module.f.d.ts +2 -2
  18. package/{fs → fjs/basen}/cbase32/module.f.js +2 -2
  19. package/{fs → fjs/basen}/cbase32/proof.f.js +16 -43
  20. package/fjs/bnf/data/module.f.d.ts +52 -0
  21. package/{fs → fjs}/bnf/data/module.f.js +56 -6
  22. package/{fs → fjs}/bnf/data/proof.f.d.ts +1 -0
  23. package/{fs → fjs}/bnf/data/proof.f.js +59 -24
  24. package/{fs → fjs}/bnf/descent/module.f.d.ts +4 -14
  25. package/fjs/bnf/descent/module.f.js +124 -0
  26. package/{fs → fjs}/bnf/descent/proof.f.d.ts +1 -0
  27. package/{fs → fjs}/bnf/descent/proof.f.js +59 -28
  28. package/{fs → fjs}/bnf/ll1/module.f.d.ts +4 -4
  29. package/{fs → fjs}/bnf/ll1/module.f.js +15 -13
  30. package/{fs → fjs}/bnf/ll1/proof.f.d.ts +1 -0
  31. package/{fs → fjs}/bnf/ll1/proof.f.js +33 -16
  32. package/{fs → fjs}/bnf/module.f.d.ts +19 -5
  33. package/{fs → fjs}/bnf/module.f.js +14 -15
  34. package/fjs/bnf/proof.f.js +69 -0
  35. package/{fs → fjs}/bnf/testlib.f.js +2 -2
  36. package/{fs → fjs}/cas/cli/module.f.js +7 -7
  37. package/{fs → fjs}/cas/cli/proof.f.d.ts +4 -1
  38. package/{fs → fjs}/cas/cli/proof.f.js +37 -74
  39. package/fjs/cas/evo/mcp/module.f.d.ts +19 -0
  40. package/fjs/cas/evo/mcp/module.f.js +56 -0
  41. package/fjs/cas/evo/mcp/proof.f.d.ts +9 -0
  42. package/fjs/cas/evo/mcp/proof.f.js +95 -0
  43. package/fjs/cas/evo/module.f.d.ts +138 -0
  44. package/fjs/cas/evo/module.f.js +309 -0
  45. package/fjs/cas/evo/proof.f.d.ts +32 -0
  46. package/fjs/cas/evo/proof.f.js +453 -0
  47. package/fjs/cas/mcp/module.f.d.ts +49 -0
  48. package/fjs/cas/mcp/module.f.js +267 -0
  49. package/{fs → fjs}/cas/mcp/proof.f.d.ts +7 -2
  50. package/{fs → fjs}/cas/mcp/proof.f.js +116 -60
  51. package/{fs → fjs}/cas/module.f.d.ts +10 -0
  52. package/{fs → fjs}/cas/module.f.js +36 -10
  53. package/{fs → fjs}/cas/proof.f.d.ts +8 -2
  54. package/{fs → fjs}/cas/proof.f.js +85 -94
  55. package/{fs → fjs}/ci/bun/module.f.js +2 -2
  56. package/{fs → fjs}/ci/common/module.f.d.ts +2 -2
  57. package/{fs → fjs}/ci/common/module.f.js +4 -4
  58. package/fjs/ci/config/module.f.d.ts +42 -0
  59. package/{fs → fjs}/ci/config/module.f.js +6 -8
  60. package/fjs/ci/deno/module.f.js +20 -0
  61. package/{fs → fjs}/ci/module.f.js +9 -9
  62. package/{fs → fjs}/ci/node/module.f.d.ts +1 -1
  63. package/{fs → fjs}/ci/node/module.f.js +3 -5
  64. package/{fs → fjs}/ci/playwright/module.f.js +3 -3
  65. package/{fs → fjs}/ci/proof.f.js +27 -22
  66. package/{fs → fjs}/ci/rust/module.f.js +11 -3
  67. package/{fs → fjs}/cli/module.f.js +3 -3
  68. package/{fs → fjs}/cli/proof.f.js +25 -66
  69. package/{fs/types → fjs/common}/monoid/module.f.d.ts +1 -1
  70. package/{fs/types → fjs/common}/monoid/proof.f.js +4 -9
  71. package/{fs → fjs}/crypto/hmac/module.f.js +2 -2
  72. package/{fs → fjs}/crypto/hmac/proof.f.js +9 -17
  73. package/{fs → fjs}/crypto/pow/module.f.js +3 -3
  74. package/fjs/crypto/pow/proof.f.js +111 -0
  75. package/{fs → fjs}/crypto/secp/module.f.js +2 -2
  76. package/{fs → fjs}/crypto/secp/proof.f.js +14 -35
  77. package/{fs → fjs}/crypto/sha2/module.f.js +2 -2
  78. package/{fs → fjs}/crypto/sha2/proof.f.js +23 -54
  79. package/{fs → fjs}/crypto/sign/module.f.d.ts +0 -5
  80. package/{fs → fjs}/crypto/sign/module.f.js +11 -8
  81. package/{fs → fjs}/crypto/sign/proof.f.js +36 -105
  82. package/{fs → fjs}/crypto/vdf/module.f.js +1 -1
  83. package/{fs → fjs}/crypto/vdf/proof.f.js +23 -64
  84. package/{fs → fjs}/dev/module.f.js +6 -6
  85. package/{fs → fjs}/dev/package_json/module.f.js +6 -6
  86. package/{fs → fjs}/dev/package_json/proof.f.js +9 -9
  87. package/{fs → fjs}/dev/proof.f.js +3 -5
  88. package/{fs → fjs}/djs/ast/module.f.js +2 -2
  89. package/{fs → fjs}/djs/ast/proof.f.js +8 -16
  90. package/fjs/djs/examples/m.f.d.ts +2 -0
  91. package/{fs → fjs}/djs/module.f.d.ts +1 -1
  92. package/{fs → fjs}/djs/module.f.js +5 -5
  93. package/{fs → fjs}/djs/parser/module.f.d.ts +5 -0
  94. package/{fs → fjs}/djs/parser/module.f.js +24 -4
  95. package/{fs → fjs}/djs/parser/proof.f.js +145 -407
  96. package/{fs → fjs}/djs/proof.f.js +16 -39
  97. package/{fs → fjs}/djs/serializer/module.f.js +6 -6
  98. package/{fs → fjs}/djs/serializer/proof.f.js +18 -43
  99. package/fjs/djs/tokenizer/module.f.d.ts +24 -0
  100. package/fjs/djs/tokenizer/module.f.js +472 -0
  101. package/{fs/djs/tokenizer-new → fjs/djs/tokenizer}/proof.f.d.ts +4 -3
  102. package/{fs/djs/tokenizer-new → fjs/djs/tokenizer}/proof.f.js +447 -446
  103. package/{fs → fjs}/djs/transpiler/module.f.d.ts +5 -0
  104. package/{fs → fjs}/djs/transpiler/module.f.js +21 -11
  105. package/{fs → fjs}/djs/transpiler/proof.f.d.ts +3 -0
  106. package/fjs/djs/transpiler/proof.f.js +67 -0
  107. package/{fs → fjs}/effects/memory/module.f.js +4 -4
  108. package/{fs → fjs}/effects/memory/proof.f.js +11 -24
  109. package/{fs → fjs}/effects/module.f.js +1 -1
  110. package/{fs → fjs}/effects/node/memory/module.js +2 -2
  111. package/{fs → fjs}/effects/node/memory/proof.js +8 -15
  112. package/{fs → fjs}/effects/node/module.d.ts +1 -1
  113. package/{fs → fjs}/effects/node/module.f.d.ts +1 -1
  114. package/{fs → fjs}/effects/node/module.f.js +7 -7
  115. package/{fs → fjs}/effects/node/module.js +13 -13
  116. package/{fs → fjs}/effects/node/proof.f.d.ts +1 -0
  117. package/{fs → fjs}/effects/node/proof.f.js +106 -292
  118. package/{fs → fjs}/effects/node/virtual/module.f.js +7 -7
  119. package/{fs → fjs}/effects/node/virtual/proof.f.d.ts +2 -0
  120. package/{fs → fjs}/effects/node/virtual/proof.f.js +44 -30
  121. package/{fs → fjs}/effects/proof.f.js +18 -47
  122. package/fjs/emergent_testing/all.test.js +4 -0
  123. package/{fs → fjs}/emergent_testing/example.f.d.ts +1 -1
  124. package/{fs → fjs}/emergent_testing/module.f.js +6 -6
  125. package/{fs → fjs}/emergent_testing/proof.f.d.ts +19 -17
  126. package/{fs → fjs}/emergent_testing/proof.f.js +14 -14
  127. package/fjs/emergent_testing/scenarios/all.js +1 -0
  128. package/{fs → fjs}/fsc/bnf.f.js +2 -2
  129. package/{fs → fjs}/fsc/json.f.js +1 -1
  130. package/{fs → fjs}/fsc/module.f.js +7 -7
  131. package/{fs → fjs}/fsc/proof.f.js +16 -38
  132. package/{fs → fjs}/fsm/module.f.js +9 -9
  133. package/{fs → fjs}/fsm/proof.f.js +12 -19
  134. package/{fs → fjs}/js/tokenizer/module.f.js +7 -7
  135. package/{fs → fjs}/js/tokenizer/proof.f.js +5 -5
  136. package/{fs → fjs}/mcp/module.f.d.ts +20 -13
  137. package/{fs → fjs}/mcp/module.f.js +16 -9
  138. package/{fs → fjs}/mcp/proof.f.js +17 -17
  139. package/{fs → fjs}/mcp/stdio/module.f.d.ts +4 -4
  140. package/{fs → fjs}/mcp/stdio/module.f.js +12 -12
  141. package/{fs → fjs}/mcp/stdio/proof.f.js +10 -10
  142. package/{fs → fjs/media}/html/module.f.d.ts +3 -3
  143. package/{fs → fjs/media}/html/module.f.js +9 -9
  144. package/{fs → fjs/media}/html/proof.f.js +12 -33
  145. package/fjs/media/json/module.f.d.ts +50 -0
  146. package/{fs → fjs/media}/json/module.f.js +7 -7
  147. package/{fs → fjs/media}/json/parser/module.f.d.ts +7 -2
  148. package/{fs → fjs/media}/json/parser/module.f.js +21 -7
  149. package/{fs → fjs/media}/json/parser/proof.f.js +45 -120
  150. package/{fs → fjs/media}/json/proof.f.js +4 -4
  151. package/fjs/media/json/rpc/module.f.d.ts +114 -0
  152. package/{fs → fjs/media}/json/rpc/module.f.js +4 -4
  153. package/{fs → fjs/media}/json/rpc/proof.f.js +4 -4
  154. package/fjs/media/json/schema/module.f.d.ts +78 -0
  155. package/{fs → fjs/media}/json/schema/module.f.js +25 -41
  156. package/{fs → fjs/media}/json/schema/proof.f.js +6 -9
  157. package/{fs → fjs/media}/json/serializer/module.f.d.ts +1 -1
  158. package/{fs → fjs/media}/json/serializer/module.f.js +2 -2
  159. package/{fs → fjs/media}/json/serializer/proof.f.js +12 -29
  160. package/{fs → fjs/media}/json/tokenizer/module.f.d.ts +2 -2
  161. package/{fs → fjs/media}/json/tokenizer/module.f.js +4 -4
  162. package/{fs → fjs/media}/json/tokenizer/proof.f.js +5 -5
  163. package/fjs/media/module.f.d.ts +37 -0
  164. package/fjs/media/module.f.js +23 -0
  165. package/fjs/media/proof.f.d.ts +9 -0
  166. package/fjs/media/proof.f.js +58 -0
  167. package/fjs/media/revision/module.f.d.ts +78 -0
  168. package/fjs/media/revision/module.f.js +122 -0
  169. package/fjs/media/revision/proof.f.d.ts +31 -0
  170. package/fjs/media/revision/proof.f.js +140 -0
  171. package/{fs/mime → fjs/media/type}/module.f.d.ts +6 -6
  172. package/{fs/mime → fjs/media/type}/module.f.js +6 -6
  173. package/{fs/mime → fjs/media/type}/proof.f.js +8 -12
  174. package/fjs/module.f.d.ts +2 -0
  175. package/{fs/fjs → fjs}/module.f.js +9 -9
  176. package/fjs/module.js +4 -0
  177. package/{fs → fjs}/path/module.f.js +2 -2
  178. package/{fs → fjs}/path/proof.f.js +27 -78
  179. package/{fs/fjs → fjs}/proof.f.js +6 -4
  180. package/{fs → fjs}/sul/id/module.f.js +9 -9
  181. package/{fs → fjs}/sul/id/proof.f.js +12 -26
  182. package/{fs → fjs}/sul/level/hash/module.f.js +3 -3
  183. package/{fs → fjs}/sul/level/hash/proof.f.js +8 -8
  184. package/{fs → fjs}/sul/level/literal/module.f.js +5 -5
  185. package/{fs → fjs}/sul/level/literal/proof.f.js +15 -29
  186. package/{fs → fjs}/sul/module.f.js +3 -3
  187. package/{fs → fjs}/sul/proof.f.js +3 -3
  188. package/fjs/text/ascii/proof.f.d.ts +6 -0
  189. package/fjs/text/ascii/proof.f.js +14 -0
  190. package/{fs → fjs}/text/code_point/module.f.js +12 -12
  191. package/{fs → fjs}/text/code_point/proof.f.js +1 -1
  192. package/{fs → fjs}/text/module.f.js +5 -5
  193. package/{fs → fjs}/text/proof.f.js +7 -12
  194. package/{fs → fjs}/text/sgr/module.f.js +2 -2
  195. package/{fs → fjs}/text/sgr/proof.f.js +8 -17
  196. package/{fs → fjs}/text/utf16/module.f.js +6 -6
  197. package/{fs → fjs}/text/utf16/proof.f.js +27 -70
  198. package/{fs → fjs}/text/utf8/module.f.js +22 -17
  199. package/{fs → fjs}/text/utf8/proof.f.js +59 -128
  200. package/{fs → fjs}/types/array/module.f.js +1 -1
  201. package/{fs → fjs}/types/array/proof.f.js +21 -55
  202. package/{fs → fjs}/types/bigfloat/module.f.js +1 -1
  203. package/fjs/types/bigfloat/proof.f.js +217 -0
  204. package/{fs → fjs}/types/bigint/module.f.js +2 -2
  205. package/{fs → fjs}/types/bigint/proof.f.js +51 -147
  206. package/{fs → fjs}/types/bit_vec/module.f.js +8 -8
  207. package/{fs → fjs}/types/bit_vec/proof.f.js +76 -218
  208. package/{fs → fjs}/types/btree/find/module.f.js +1 -1
  209. package/fjs/types/btree/find/proof.f.d.ts +3 -0
  210. package/fjs/types/btree/find/proof.f.js +108 -0
  211. package/{fs → fjs}/types/btree/module.f.js +2 -2
  212. package/fjs/types/btree/proof.f.d.ts +13 -0
  213. package/{fs → fjs}/types/btree/proof.f.js +12 -19
  214. package/{fs → fjs}/types/btree/remove/module.f.js +4 -4
  215. package/fjs/types/btree/remove/proof.f.d.ts +9 -0
  216. package/{fs → fjs}/types/btree/remove/proof.f.js +88 -235
  217. package/{fs → fjs}/types/btree/set/module.f.js +8 -5
  218. package/{fs → fjs}/types/btree/set/proof.f.js +39 -28
  219. package/{fs → fjs}/types/byte_set/module.f.js +2 -2
  220. package/fjs/types/byte_set/proof.f.js +79 -0
  221. package/{fs → fjs}/types/function/compare/proof.f.js +14 -37
  222. package/fjs/types/function/operator/proof.f.d.ts +23 -0
  223. package/{fs → fjs}/types/function/operator/proof.f.js +18 -49
  224. package/{fs → fjs}/types/function/proof.f.js +3 -4
  225. package/{fs → fjs}/types/list/module.f.js +2 -2
  226. package/fjs/types/list/proof.f.d.ts +30 -0
  227. package/{fs → fjs}/types/list/proof.f.js +59 -167
  228. package/{fs → fjs}/types/map/proof.f.js +6 -14
  229. package/fjs/types/nibble_set/proof.f.js +60 -0
  230. package/{fs → fjs}/types/nominal/proof.f.js +5 -10
  231. package/{fs → fjs}/types/nullable/module.f.js +2 -2
  232. package/fjs/types/nullable/proof.f.js +29 -0
  233. package/{fs → fjs}/types/number/module.f.js +5 -5
  234. package/{fs → fjs}/types/number/proof.f.js +10 -25
  235. package/{fs → fjs}/types/object/module.f.js +4 -4
  236. package/{fs → fjs}/types/object/proof.f.js +4 -7
  237. package/{fs → fjs}/types/ordered_map/module.f.js +6 -6
  238. package/{fs → fjs}/types/ordered_map/proof.f.js +3 -3
  239. package/fjs/types/patricia_trie/proof.f.d.ts +13 -0
  240. package/{fs → fjs}/types/patricia_trie/proof.f.js +22 -22
  241. package/{fs → fjs}/types/prime_field/module.f.js +3 -8
  242. package/{fs → fjs}/types/prime_field/proof.f.js +2 -2
  243. package/{fs → fjs}/types/range/module.f.d.ts +1 -1
  244. package/fjs/types/range/module.f.js +2 -0
  245. package/fjs/types/range/proof.f.js +9 -0
  246. package/{fs → fjs}/types/range_map/module.f.js +4 -4
  247. package/{fs → fjs}/types/range_map/proof.f.js +35 -88
  248. package/{fs → fjs}/types/result/module.js +1 -1
  249. package/fjs/types/result/proof.f.d.ts +12 -0
  250. package/fjs/types/result/proof.f.js +31 -0
  251. package/{fs → fjs}/types/rtti/common/module.f.d.ts +36 -1
  252. package/{fs → fjs}/types/rtti/common/module.f.js +48 -4
  253. package/fjs/types/rtti/common/proof.f.d.ts +8 -0
  254. package/fjs/types/rtti/common/proof.f.js +51 -0
  255. package/{fs → fjs}/types/rtti/module.f.d.ts +2 -2
  256. package/{fs → fjs}/types/rtti/module.f.js +1 -1
  257. package/{fs → fjs}/types/rtti/parse/module.f.js +16 -25
  258. package/{fs → fjs}/types/rtti/parse/proof.f.js +9 -20
  259. package/{fs → fjs}/types/rtti/ts/module.f.d.ts +10 -4
  260. package/{fs → fjs}/types/rtti/ts/module.f.js +1 -1
  261. package/{fs → fjs}/types/rtti/ts/proof.f.js +2 -2
  262. package/{fs → fjs}/types/rtti/validate/module.f.js +11 -32
  263. package/{fs → fjs}/types/rtti/validate/proof.f.js +6 -11
  264. package/{fs → fjs}/types/sorted_list/module.f.js +3 -3
  265. package/{fs → fjs}/types/sorted_list/proof.f.js +14 -27
  266. package/{fs → fjs}/types/sorted_set/module.f.js +1 -1
  267. package/{fs → fjs}/types/sorted_set/proof.f.js +20 -45
  268. package/{fs → fjs}/types/string/module.f.js +4 -4
  269. package/fjs/types/string/proof.f.js +77 -0
  270. package/{fs → fjs}/types/string_set/module.f.js +6 -6
  271. package/fjs/types/string_set/proof.f.js +43 -0
  272. package/{fs → fjs}/types/ts/proof.f.d.ts +18 -18
  273. package/{fs → fjs}/types/ts/proof.f.js +16 -43
  274. package/{fs → fjs}/types/uint8array/module.f.js +10 -10
  275. package/{fs → fjs}/types/uint8array/proof.f.d.ts +4 -1
  276. package/{fs → fjs}/types/uint8array/proof.f.js +11 -11
  277. package/{fs → fjs}/website/module.f.js +3 -3
  278. package/fjs/website/proof.f.js +13 -0
  279. package/package.json +8 -8
  280. package/fs/asserts/module.f.d.ts +0 -4
  281. package/fs/asserts/module.f.js +0 -9
  282. package/fs/asserts/proof.f.d.ts +0 -8
  283. package/fs/asserts/proof.f.js +0 -51
  284. package/fs/bnf/data/module.f.d.ts +0 -30
  285. package/fs/bnf/descent/module.f.js +0 -119
  286. package/fs/bnf/proof.f.js +0 -104
  287. package/fs/cas/mcp/module.f.d.ts +0 -36
  288. package/fs/cas/mcp/module.f.js +0 -249
  289. package/fs/ci/config/module.f.d.ts +0 -43
  290. package/fs/ci/deno/module.f.js +0 -16
  291. package/fs/crypto/pow/proof.f.js +0 -161
  292. package/fs/djs/examples/m.f.d.ts +0 -2
  293. package/fs/djs/tokenizer/module.f.d.ts +0 -12
  294. package/fs/djs/tokenizer/module.f.js +0 -62
  295. package/fs/djs/tokenizer/proof.f.d.ts +0 -7
  296. package/fs/djs/tokenizer/proof.f.js +0 -543
  297. package/fs/djs/tokenizer-new/module.f.d.ts +0 -3
  298. package/fs/djs/tokenizer-new/module.f.js +0 -155
  299. package/fs/djs/transpiler/proof.f.js +0 -68
  300. package/fs/emergent_testing/all.test.js +0 -4
  301. package/fs/emergent_testing/scenarios/all.js +0 -1
  302. package/fs/fjs/module.f.d.ts +0 -2
  303. package/fs/fjs/module.js +0 -4
  304. package/fs/json/module.f.d.ts +0 -50
  305. package/fs/json/rpc/module.f.d.ts +0 -114
  306. package/fs/json/schema/module.f.d.ts +0 -77
  307. package/fs/text/ascii/proof.f.d.ts +0 -4
  308. package/fs/text/ascii/proof.f.js +0 -24
  309. package/fs/types/bigfloat/proof.f.js +0 -348
  310. package/fs/types/btree/find/proof.f.js +0 -151
  311. package/fs/types/btree/proof.f.d.ts +0 -7
  312. package/fs/types/btree/remove/proof.f.d.ts +0 -4
  313. package/fs/types/byte_set/proof.f.js +0 -120
  314. package/fs/types/function/operator/proof.f.d.ts +0 -12
  315. package/fs/types/list/proof.f.d.ts +0 -22
  316. package/fs/types/nibble_set/proof.f.js +0 -89
  317. package/fs/types/nullable/proof.f.js +0 -50
  318. package/fs/types/patricia_trie/proof.f.d.ts +0 -7
  319. package/fs/types/range/module.f.js +0 -2
  320. package/fs/types/range/proof.f.d.ts +0 -1
  321. package/fs/types/range/proof.f.js +0 -18
  322. package/fs/types/result/proof.f.d.ts +0 -6
  323. package/fs/types/result/proof.f.js +0 -52
  324. package/fs/types/string/proof.f.js +0 -118
  325. package/fs/types/string_set/proof.f.js +0 -82
  326. package/fs/website/proof.f.js +0 -16
  327. /package/{fs → fjs}/asn.1/module.f.d.ts +0 -0
  328. /package/{fs → fjs}/asn.1/proof.f.d.ts +0 -0
  329. /package/{fs → fjs}/base_n/module.f.d.ts +0 -0
  330. /package/{fs → fjs}/base_n/proof.f.d.ts +0 -0
  331. /package/{fs → fjs/basen}/base128/proof.f.d.ts +0 -0
  332. /package/{fs → fjs/basen}/cbase32/proof.f.d.ts +0 -0
  333. /package/{fs → fjs}/bnf/proof.f.d.ts +0 -0
  334. /package/{fs → fjs}/bnf/testlib.f.d.ts +0 -0
  335. /package/{fs → fjs}/cas/cli/module.f.d.ts +0 -0
  336. /package/{fs → fjs}/ci/bun/module.f.d.ts +0 -0
  337. /package/{fs → fjs}/ci/deno/module.f.d.ts +0 -0
  338. /package/{fs → fjs}/ci/module.f.d.ts +0 -0
  339. /package/{fs → fjs}/ci/playwright/module.f.d.ts +0 -0
  340. /package/{fs → fjs}/ci/proof.f.d.ts +0 -0
  341. /package/{fs → fjs}/ci/rust/module.f.d.ts +0 -0
  342. /package/{fs → fjs}/cli/module.f.d.ts +0 -0
  343. /package/{fs → fjs}/cli/proof.f.d.ts +0 -0
  344. /package/{fs/types → fjs/common}/monoid/module.f.js +0 -0
  345. /package/{fs/types → fjs/common}/monoid/proof.f.d.ts +0 -0
  346. /package/{fs → fjs}/crypto/hmac/module.f.d.ts +0 -0
  347. /package/{fs → fjs}/crypto/hmac/proof.f.d.ts +0 -0
  348. /package/{fs → fjs}/crypto/pow/module.f.d.ts +0 -0
  349. /package/{fs → fjs}/crypto/pow/proof.f.d.ts +0 -0
  350. /package/{fs → fjs}/crypto/secp/module.f.d.ts +0 -0
  351. /package/{fs → fjs}/crypto/secp/proof.f.d.ts +0 -0
  352. /package/{fs → fjs}/crypto/sha2/module.f.d.ts +0 -0
  353. /package/{fs → fjs}/crypto/sha2/proof.f.d.ts +0 -0
  354. /package/{fs → fjs}/crypto/sign/proof.f.d.ts +0 -0
  355. /package/{fs → fjs}/crypto/vdf/module.f.d.ts +0 -0
  356. /package/{fs → fjs}/crypto/vdf/proof.f.d.ts +0 -0
  357. /package/{fs → fjs}/dev/module.f.d.ts +0 -0
  358. /package/{fs → fjs}/dev/package_json/module.f.d.ts +0 -0
  359. /package/{fs → fjs}/dev/package_json/proof.f.d.ts +0 -0
  360. /package/{fs → fjs}/dev/proof.f.d.ts +0 -0
  361. /package/{fs → fjs}/djs/ast/module.f.d.ts +0 -0
  362. /package/{fs → fjs}/djs/ast/proof.f.d.ts +0 -0
  363. /package/{fs → fjs}/djs/examples/input.f.d.ts +0 -0
  364. /package/{fs → fjs}/djs/examples/input.f.js +0 -0
  365. /package/{fs → fjs}/djs/examples/m.f.js +0 -0
  366. /package/{fs → fjs}/djs/parser/proof.f.d.ts +0 -0
  367. /package/{fs → fjs}/djs/proof.f.d.ts +0 -0
  368. /package/{fs → fjs}/djs/serializer/module.f.d.ts +0 -0
  369. /package/{fs → fjs}/djs/serializer/proof.f.d.ts +0 -0
  370. /package/{fs → fjs}/effects/list/module.f.d.ts +0 -0
  371. /package/{fs → fjs}/effects/list/module.f.js +0 -0
  372. /package/{fs → fjs}/effects/memory/module.f.d.ts +0 -0
  373. /package/{fs → fjs}/effects/memory/proof.f.d.ts +0 -0
  374. /package/{fs → fjs}/effects/mock/module.f.d.ts +0 -0
  375. /package/{fs → fjs}/effects/mock/module.f.js +0 -0
  376. /package/{fs → fjs}/effects/module.d.ts +0 -0
  377. /package/{fs → fjs}/effects/module.f.d.ts +0 -0
  378. /package/{fs → fjs}/effects/module.js +0 -0
  379. /package/{fs → fjs}/effects/node/memory/module.d.ts +0 -0
  380. /package/{fs → fjs}/effects/node/memory/proof.d.ts +0 -0
  381. /package/{fs → fjs}/effects/node/virtual/module.f.d.ts +0 -0
  382. /package/{fs → fjs}/effects/proof.f.d.ts +0 -0
  383. /package/{fs → fjs}/emergent_testing/all.test.d.ts +0 -0
  384. /package/{fs → fjs}/emergent_testing/example.f.js +0 -0
  385. /package/{fs → fjs}/emergent_testing/module.f.d.ts +0 -0
  386. /package/{fs → fjs}/emergent_testing/scenarios/all.d.ts +0 -0
  387. /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.fail.d.ts +0 -0
  388. /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.fail.js +0 -0
  389. /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.pass.d.ts +0 -0
  390. /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.pass.js +0 -0
  391. /package/{fs → fjs}/emergent_testing/scenarios/async.fail.d.ts +0 -0
  392. /package/{fs → fjs}/emergent_testing/scenarios/async.fail.js +0 -0
  393. /package/{fs → fjs}/emergent_testing/scenarios/async.pass.d.ts +0 -0
  394. /package/{fs → fjs}/emergent_testing/scenarios/async.pass.js +0 -0
  395. /package/{fs → fjs}/emergent_testing/scenarios/fail.fail.d.ts +0 -0
  396. /package/{fs → fjs}/emergent_testing/scenarios/fail.fail.js +0 -0
  397. /package/{fs → fjs}/emergent_testing/scenarios/return-value.pass.d.ts +0 -0
  398. /package/{fs → fjs}/emergent_testing/scenarios/return-value.pass.js +0 -0
  399. /package/{fs → fjs}/emergent_testing/scenarios/thenable.pass.d.ts +0 -0
  400. /package/{fs → fjs}/emergent_testing/scenarios/thenable.pass.js +0 -0
  401. /package/{fs → fjs}/emergent_testing/scenarios/thenable2.pass.d.ts +0 -0
  402. /package/{fs → fjs}/emergent_testing/scenarios/thenable2.pass.js +0 -0
  403. /package/{fs → fjs}/emergent_testing/scenarios/throw.pass.d.ts +0 -0
  404. /package/{fs → fjs}/emergent_testing/scenarios/throw.pass.js +0 -0
  405. /package/{fs → fjs}/fsc/bnf.f.d.ts +0 -0
  406. /package/{fs → fjs}/fsc/json.f.d.ts +0 -0
  407. /package/{fs → fjs}/fsc/module.f.d.ts +0 -0
  408. /package/{fs → fjs}/fsc/proof.f.d.ts +0 -0
  409. /package/{fs → fjs}/fsm/module.f.d.ts +0 -0
  410. /package/{fs → fjs}/fsm/proof.f.d.ts +0 -0
  411. /package/{fs → fjs}/js/tokenizer/module.f.d.ts +0 -0
  412. /package/{fs → fjs}/js/tokenizer/proof.f.d.ts +0 -0
  413. /package/{fs → fjs}/mcp/proof.f.d.ts +0 -0
  414. /package/{fs → fjs}/mcp/stdio/proof.f.d.ts +0 -0
  415. /package/{fs → fjs/media}/html/proof.f.d.ts +0 -0
  416. /package/{fs → fjs/media}/json/parser/proof.f.d.ts +0 -0
  417. /package/{fs → fjs/media}/json/proof.f.d.ts +0 -0
  418. /package/{fs → fjs/media}/json/rpc/proof.f.d.ts +0 -0
  419. /package/{fs → fjs/media}/json/schema/proof.f.d.ts +0 -0
  420. /package/{fs → fjs/media}/json/serializer/proof.f.d.ts +0 -0
  421. /package/{fs → fjs/media}/json/tokenizer/proof.f.d.ts +0 -0
  422. /package/{fs/mime → fjs/media/type}/proof.f.d.ts +0 -0
  423. /package/{fs/fjs → fjs}/module.d.ts +0 -0
  424. /package/{fs → fjs}/path/module.f.d.ts +0 -0
  425. /package/{fs → fjs}/path/proof.f.d.ts +0 -0
  426. /package/{fs/fjs → fjs}/proof.f.d.ts +0 -0
  427. /package/{fs → fjs}/sul/id/module.f.d.ts +0 -0
  428. /package/{fs → fjs}/sul/id/proof.f.d.ts +0 -0
  429. /package/{fs → fjs}/sul/level/hash/module.f.d.ts +0 -0
  430. /package/{fs → fjs}/sul/level/hash/proof.f.d.ts +0 -0
  431. /package/{fs → fjs}/sul/level/literal/module.f.d.ts +0 -0
  432. /package/{fs → fjs}/sul/level/literal/proof.f.d.ts +0 -0
  433. /package/{fs → fjs}/sul/module.f.d.ts +0 -0
  434. /package/{fs → fjs}/sul/proof.f.d.ts +0 -0
  435. /package/{fs → fjs}/text/ascii/module.f.d.ts +0 -0
  436. /package/{fs → fjs}/text/ascii/module.f.js +0 -0
  437. /package/{fs → fjs}/text/code_point/module.f.d.ts +0 -0
  438. /package/{fs → fjs}/text/code_point/proof.f.d.ts +0 -0
  439. /package/{fs → fjs}/text/module.f.d.ts +0 -0
  440. /package/{fs → fjs}/text/proof.f.d.ts +0 -0
  441. /package/{fs → fjs}/text/sgr/module.f.d.ts +0 -0
  442. /package/{fs → fjs}/text/sgr/proof.f.d.ts +0 -0
  443. /package/{fs → fjs}/text/utf16/module.f.d.ts +0 -0
  444. /package/{fs → fjs}/text/utf16/proof.f.d.ts +0 -0
  445. /package/{fs → fjs}/text/utf8/module.f.d.ts +0 -0
  446. /package/{fs → fjs}/text/utf8/proof.f.d.ts +0 -0
  447. /package/{fs → fjs}/types/array/module.f.d.ts +0 -0
  448. /package/{fs → fjs}/types/array/proof.f.d.ts +0 -0
  449. /package/{fs → fjs}/types/bigfloat/module.f.d.ts +0 -0
  450. /package/{fs → fjs}/types/bigfloat/proof.f.d.ts +0 -0
  451. /package/{fs → fjs}/types/bigint/module.f.d.ts +0 -0
  452. /package/{fs → fjs}/types/bigint/proof.f.d.ts +0 -0
  453. /package/{fs → fjs}/types/bit_vec/module.f.d.ts +0 -0
  454. /package/{fs → fjs}/types/bit_vec/proof.f.d.ts +0 -0
  455. /package/{fs → fjs}/types/btree/find/module.f.d.ts +0 -0
  456. /package/{fs → fjs}/types/btree/module.f.d.ts +0 -0
  457. /package/{fs → fjs}/types/btree/remove/module.f.d.ts +0 -0
  458. /package/{fs → fjs}/types/btree/set/module.f.d.ts +0 -0
  459. /package/{fs → fjs}/types/btree/set/proof.f.d.ts +0 -0
  460. /package/{fs → fjs}/types/btree/types/module.f.d.ts +0 -0
  461. /package/{fs → fjs}/types/btree/types/module.f.js +0 -0
  462. /package/{fs → fjs}/types/byte_set/module.f.d.ts +0 -0
  463. /package/{fs → fjs}/types/byte_set/proof.f.d.ts +0 -0
  464. /package/{fs → fjs}/types/function/compare/module.f.d.ts +0 -0
  465. /package/{fs → fjs}/types/function/compare/module.f.js +0 -0
  466. /package/{fs/types/btree/find → fjs/types/function/compare}/proof.f.d.ts +0 -0
  467. /package/{fs → fjs}/types/function/module.f.d.ts +0 -0
  468. /package/{fs → fjs}/types/function/module.f.js +0 -0
  469. /package/{fs → fjs}/types/function/operator/module.f.d.ts +0 -0
  470. /package/{fs → fjs}/types/function/operator/module.f.js +0 -0
  471. /package/{fs/types/function/compare → fjs/types/function}/proof.f.d.ts +0 -0
  472. /package/{fs → fjs}/types/list/module.f.d.ts +0 -0
  473. /package/{fs → fjs}/types/map/module.f.d.ts +0 -0
  474. /package/{fs → fjs}/types/map/module.f.js +0 -0
  475. /package/{fs → fjs}/types/map/proof.f.d.ts +0 -0
  476. /package/{fs → fjs}/types/nibble_set/module.f.d.ts +0 -0
  477. /package/{fs → fjs}/types/nibble_set/module.f.js +0 -0
  478. /package/{fs → fjs}/types/nibble_set/proof.f.d.ts +0 -0
  479. /package/{fs → fjs}/types/nominal/module.f.d.ts +0 -0
  480. /package/{fs → fjs}/types/nominal/module.f.js +0 -0
  481. /package/{fs → fjs}/types/nominal/proof.f.d.ts +0 -0
  482. /package/{fs → fjs}/types/nullable/module.f.d.ts +0 -0
  483. /package/{fs → fjs}/types/nullable/proof.f.d.ts +0 -0
  484. /package/{fs → fjs}/types/number/module.f.d.ts +0 -0
  485. /package/{fs → fjs}/types/number/proof.f.d.ts +0 -0
  486. /package/{fs → fjs}/types/object/module.f.d.ts +0 -0
  487. /package/{fs → fjs}/types/object/proof.f.d.ts +0 -0
  488. /package/{fs → fjs}/types/option/module.f.d.ts +0 -0
  489. /package/{fs → fjs}/types/option/module.f.js +0 -0
  490. /package/{fs → fjs}/types/ordered_map/module.f.d.ts +0 -0
  491. /package/{fs → fjs}/types/ordered_map/proof.f.d.ts +0 -0
  492. /package/{fs → fjs}/types/patricia_trie/module.f.d.ts +0 -0
  493. /package/{fs → fjs}/types/patricia_trie/module.f.js +0 -0
  494. /package/{fs → fjs}/types/phantom/module.f.d.ts +0 -0
  495. /package/{fs → fjs}/types/phantom/module.f.js +0 -0
  496. /package/{fs → fjs}/types/prime_field/module.f.d.ts +0 -0
  497. /package/{fs → fjs}/types/prime_field/proof.f.d.ts +0 -0
  498. /package/{fs/types/function → fjs/types/range}/proof.f.d.ts +0 -0
  499. /package/{fs → fjs}/types/range_map/module.f.d.ts +0 -0
  500. /package/{fs → fjs}/types/range_map/proof.f.d.ts +0 -0
  501. /package/{fs → fjs}/types/result/module.d.ts +0 -0
  502. /package/{fs → fjs}/types/result/module.f.d.ts +0 -0
  503. /package/{fs → fjs}/types/result/module.f.js +0 -0
  504. /package/{fs → fjs}/types/rtti/parse/module.f.d.ts +0 -0
  505. /package/{fs → fjs}/types/rtti/parse/proof.f.d.ts +0 -0
  506. /package/{fs → fjs}/types/rtti/proof.f.d.ts +0 -0
  507. /package/{fs → fjs}/types/rtti/proof.f.js +0 -0
  508. /package/{fs → fjs}/types/rtti/ts/proof.f.d.ts +0 -0
  509. /package/{fs → fjs}/types/rtti/validate/module.f.d.ts +0 -0
  510. /package/{fs → fjs}/types/rtti/validate/proof.f.d.ts +0 -0
  511. /package/{fs → fjs}/types/sorted_list/module.f.d.ts +0 -0
  512. /package/{fs → fjs}/types/sorted_list/proof.f.d.ts +0 -0
  513. /package/{fs → fjs}/types/sorted_set/module.f.d.ts +0 -0
  514. /package/{fs → fjs}/types/sorted_set/proof.f.d.ts +0 -0
  515. /package/{fs → fjs}/types/string/module.f.d.ts +0 -0
  516. /package/{fs → fjs}/types/string/proof.f.d.ts +0 -0
  517. /package/{fs → fjs}/types/string_set/module.f.d.ts +0 -0
  518. /package/{fs → fjs}/types/string_set/proof.f.d.ts +0 -0
  519. /package/{fs → fjs}/types/ts/module.f.d.ts +0 -0
  520. /package/{fs → fjs}/types/ts/module.f.js +0 -0
  521. /package/{fs → fjs}/types/uint8array/module.f.d.ts +0 -0
  522. /package/{fs → fjs}/website/module.f.d.ts +0 -0
  523. /package/{fs → fjs}/website/proof.f.d.ts +0 -0
@@ -33,6 +33,16 @@ export type Cas<O extends Operation> = {
33
33
  /** Lists all stored content hashes. */
34
34
  readonly list: () => Effect<O, readonly Vec[]>;
35
35
  };
36
+ /**
37
+ * Drains a `Cas<O>.read` chunk stream into a single `Vec`. Used by any caller
38
+ * that needs the whole blob at once (an MCP `content: true` fetch, an Evo
39
+ * revision decode): the chunk stream is concatenated and an error item is
40
+ * surfaced as the result. A single `Vec` cannot exceed `maxLength` bits;
41
+ * concatenating past it would overflow the runtime's `bigint` constraint, so
42
+ * that case is surfaced as an error item too, rather than crashing the
43
+ * process.
44
+ */
45
+ export declare const collectRead: <O extends Operation>(stream: List<O, IoResult<Vec>>) => Effect<O, IoResult<Vec>>;
36
46
  export type FileCas = Cas<FileCasOperation> & {
37
47
  url: (v: Vec) => string;
38
48
  };
@@ -3,16 +3,16 @@
3
3
  *
4
4
  * @module
5
5
  */
6
- import { sha256 } from "../crypto/sha2/module.f.js";
7
- import { join, normalize, parse } from "../path/module.f.js";
8
- import { empty, length, maxLengthBytes, msb, vec } from "../types/bit_vec/module.f.js";
9
- import { cBase32ToVec, vecToCBase32 } from "../cbase32/module.f.js";
10
- import { foldStep, forEachStep, okStep, pure } from "../effects/module.f.js";
11
- import { access, createExclusive, isNotFound, mkdir, now, randomInt, readBytes, readdir, rename, rm, stat, writeBytes, } from "../effects/node/module.f.js";
12
- import { toOption } from "../types/nullable/module.f.js";
13
- import { error, ok, unwrap } from "../types/result/module.f.js";
14
- import { splitAt } from "../types/string/module.f.js";
15
- import { nonEmpty, empty as elEmpty } from "../effects/list/module.f.js";
6
+ import { sha256 } from '../crypto/sha2/module.f.js';
7
+ import { join, normalize, parse } from '../path/module.f.js';
8
+ import { empty, length, maxLength, maxLengthBytes, msb, vec } from '../types/bit_vec/module.f.js';
9
+ import { cBase32ToVec, vecToCBase32 } from '../basen/cbase32/module.f.js';
10
+ import { foldStep, forEachStep, okStep, pure } from '../effects/module.f.js';
11
+ import { access, createExclusive, isNotFound, mkdir, now, randomInt, readBytes, readdir, rename, rm, stat, writeBytes, } from '../effects/node/module.f.js';
12
+ import { toOption } from '../types/nullable/module.f.js';
13
+ import { error, ok, unwrap } from '../types/result/module.f.js';
14
+ import { splitAt } from '../types/string/module.f.js';
15
+ import { nonEmpty, empty as elEmpty } from '../effects/list/module.f.js';
16
16
  const split2 = splitAt(2);
17
17
  const prefix = '.cas';
18
18
  /** Converts a content key to its sharded relative CAS file path. */
@@ -22,6 +22,32 @@ export const toPath = (key) => {
22
22
  const [b, c] = split2(bc);
23
23
  return join(prefix, a, b, c);
24
24
  };
25
+ /**
26
+ * Drains a `Cas<O>.read` chunk stream into a single `Vec`. Used by any caller
27
+ * that needs the whole blob at once (an MCP `content: true` fetch, an Evo
28
+ * revision decode): the chunk stream is concatenated and an error item is
29
+ * surfaced as the result. A single `Vec` cannot exceed `maxLength` bits;
30
+ * concatenating past it would overflow the runtime's `bigint` constraint, so
31
+ * that case is surfaced as an error item too, rather than crashing the
32
+ * process.
33
+ */
34
+ export const collectRead = (stream) => {
35
+ const loop = (acc) => (s) => s.step((node) => {
36
+ if (node === undefined) {
37
+ return pure(ok(acc));
38
+ }
39
+ const { first, tail } = node;
40
+ const [t, v] = first;
41
+ if (t === 'error') {
42
+ return pure(first);
43
+ }
44
+ if (length(acc) + length(v) > maxLength) {
45
+ return pure(error(`cas blob exceeds maximum vector length of ${maxLength} bits`));
46
+ }
47
+ return loop(msb.concat(acc)(v))(tail);
48
+ });
49
+ return loop(empty)(stream);
50
+ };
25
51
  /** Maximum chunk size for streaming reads: the largest `Vec` the runtime allows. */
26
52
  const chunkBytes = Number(maxLengthBytes);
27
53
  /** Staging directory under the store root; GC and every uploader share it. */
@@ -2,9 +2,11 @@ import { type FileCasOperation } from './module.f.ts';
2
2
  import { type Effect } from '../effects/module.f.ts';
3
3
  import { type ReadFile, type WriteFile, type Rm, type Mkdir } from '../effects/node/module.f.ts';
4
4
  type TestOp = FileCasOperation | WriteFile | ReadFile | Rm | Mkdir;
5
+ declare const testAddBigFile: () => Effect<TestOp, void>;
6
+ declare const testAddAndGetBigFile: () => Effect<TestOp, void>;
5
7
  export declare const proof: {
6
- addBigFile: () => Effect<TestOp, void>;
7
- addAndGetBigFile: () => Effect<TestOp, void>;
8
+ addBigFile: typeof testAddBigFile;
9
+ addAndGetBigFile: typeof testAddAndGetBigFile;
8
10
  casWriteRead: () => void;
9
11
  casReadMissingShard: () => void;
10
12
  casWriteMultiChunk: () => void;
@@ -14,5 +16,9 @@ export declare const proof: {
14
16
  casWriteGcReclaimsExpired: () => void;
15
17
  casUploadSuccess: () => void;
16
18
  casUploadFailureKeepsSource: () => void;
19
+ collectReadDrainsChunks: () => void;
20
+ collectReadPropagatesErrorItem: () => void;
21
+ collectReadOverflow: () => void;
22
+ casListPropagatesNonNotFoundAccessError: () => void;
17
23
  };
18
24
  export {};
@@ -1,13 +1,14 @@
1
- import { length, maxLength, msb, vec, vec8 } from "../types/bit_vec/module.f.js";
2
- import { cBase32ToVec, vecToCBase32 } from "../cbase32/module.f.js";
3
- import { computeSync, sha256 } from "../crypto/sha2/module.f.js";
4
- import { fileCas, casAddFile, casUpload } from "./module.f.js";
5
- import { pure } from "../effects/module.f.js";
6
- import { mkdir, writeFile, rm, readFile, access } from "../effects/node/module.f.js";
7
- import { error, ok } from "../types/result/module.f.js";
8
- import { emptyState, virtual } from "../effects/node/virtual/module.f.js";
9
- import { join } from "../path/module.f.js";
10
- import { nonEmpty, empty } from "../effects/list/module.f.js";
1
+ import { length, maxLength, msb, vec, vec8 } from '../types/bit_vec/module.f.js';
2
+ import { cBase32ToVec, vecToCBase32 } from '../basen/cbase32/module.f.js';
3
+ import { computeSync, sha256 } from '../crypto/sha2/module.f.js';
4
+ import { fileCas, casAddFile, collectRead, casUpload } from './module.f.js';
5
+ import { decode, pure } from '../effects/module.f.js';
6
+ import { mkdir, writeFile, rm, readFile, access } from '../effects/node/module.f.js';
7
+ import { error, ok } from '../types/result/module.f.js';
8
+ import { emptyState, virtual } from '../effects/node/virtual/module.f.js';
9
+ import { join } from '../path/module.f.js';
10
+ import { nonEmpty, empty } from '../effects/list/module.f.js';
11
+ import { assert, assertEq, assertNotNullish } from '../asserts/module.f.js';
11
12
  const testDir = './test-cas-cli';
12
13
  // Create a 128 KiB big file content (at the max Vec size limit)
13
14
  // This tests the boundary where files are at the chunk size limit
@@ -36,10 +37,7 @@ const testAddBigFile = () => mkdir(testDir, { recursive: true }).step(() => {
36
37
  }
37
38
  // Verify hash can be encoded/decoded
38
39
  const hashCBase32 = vecToCBase32(hash);
39
- const decodedHash = cBase32ToVec(hashCBase32);
40
- if (decodedHash === null) {
41
- throw new Error('Failed to decode hash from base32');
42
- }
40
+ assertNotNullish(cBase32ToVec(hashCBase32), new Error('Failed to decode hash from base32'));
43
41
  return rm(testDir).step(() => pure(undefined));
44
42
  });
45
43
  });
@@ -90,16 +88,10 @@ export const proof = {
90
88
  const c = fileCas(sha256)('.');
91
89
  const payload = nonEmpty(ok(content), empty());
92
90
  const [state1, writeResult] = virtual(emptyState)(c.write(payload));
93
- if (writeResult[0] !== 'ok') {
94
- throw ['expected write ok', writeResult];
95
- }
91
+ assert(writeResult[0] === 'ok', ['expected write ok', writeResult]);
96
92
  const hash = writeResult[1];
97
- if (length(hash) !== 256n) {
98
- throw ['expected 256-bit hash', length(hash)];
99
- }
100
- if (msb.cmp(hash)(computeSync(sha256)([content])) !== 0) {
101
- throw 'write hash mismatch';
102
- }
93
+ assertEq(length(hash), 256n, ['expected 256-bit hash', length(hash)]);
94
+ assertEq(msb.cmp(hash)(computeSync(sha256)([content])), 0, 'write hash mismatch');
103
95
  const drain = (acc) => (stream) => stream.step((node) => {
104
96
  if (node === undefined) {
105
97
  return pure(ok(acc));
@@ -111,24 +103,16 @@ export const proof = {
111
103
  return drain([...acc, first[1]])(tail);
112
104
  });
113
105
  const [, readResult] = virtual(state1)(drain([])(c.read(hash)));
114
- if (readResult[0] !== 'ok') {
115
- throw ['expected read ok', readResult];
116
- }
117
- if (msb.cmp(msb.listToVec(readResult[1]))(content) !== 0) {
118
- throw 'read content mismatch';
119
- }
106
+ assert(readResult[0] === 'ok', ['expected read ok', readResult]);
107
+ assertEq(msb.cmp(msb.listToVec(readResult[1]))(content), 0, 'read content mismatch');
120
108
  },
121
109
  casReadMissingShard: () => {
122
110
  // A missing shard surfaces as an explicit error *item*, never as end-of-stream.
123
111
  const c = fileCas(sha256)('.');
124
112
  const hash = computeSync(sha256)([vec8(0x2an)]);
125
113
  const node = virtual(emptyState)(c.read(hash))[1];
126
- if (node === undefined) {
127
- throw 'missing shard must not be EOF';
128
- }
129
- if (node.first[0] !== 'error') {
130
- throw ['expected error item', node.tail];
131
- }
114
+ assert(node !== undefined, 'missing shard must not be EOF');
115
+ assert(node.first[0] === 'error', ['expected error item', node.tail]);
132
116
  },
133
117
  casWriteMultiChunk: () => {
134
118
  // A multi-chunk payload streams through `writeBytes` chunk-by-chunk (the lease is
@@ -138,13 +122,9 @@ export const proof = {
138
122
  const c = fileCas(sha256)('.');
139
123
  const payload = chunks.reduceRight((tail, chunk) => nonEmpty(ok(chunk), tail), empty());
140
124
  const [state1, writeResult] = virtual(emptyState)(c.write(payload));
141
- if (writeResult[0] !== 'ok') {
142
- throw ['expected write ok', writeResult];
143
- }
125
+ assert(writeResult[0] === 'ok', ['expected write ok', writeResult]);
144
126
  const hash = writeResult[1];
145
- if (msb.cmp(hash)(computeSync(sha256)(chunks)) !== 0) {
146
- throw 'multi-chunk write hash mismatch';
147
- }
127
+ assertEq(msb.cmp(hash)(computeSync(sha256)(chunks)), 0, 'multi-chunk write hash mismatch');
148
128
  const drain = (acc) => (stream) => stream.step((node) => {
149
129
  if (node === undefined) {
150
130
  return pure(ok(acc));
@@ -156,13 +136,9 @@ export const proof = {
156
136
  return drain([...acc, first[1]])(tail);
157
137
  });
158
138
  const [, readResult] = virtual(state1)(drain([])(c.read(hash)));
159
- if (readResult[0] !== 'ok') {
160
- throw ['expected read ok', readResult];
161
- }
139
+ assert(readResult[0] === 'ok', ['expected read ok', readResult]);
162
140
  const expected = msb.concat(msb.concat(chunks[0])(chunks[1]))(chunks[2]);
163
- if (msb.cmp(msb.listToVec(readResult[1]))(expected) !== 0) {
164
- throw 'multi-chunk read content mismatch';
165
- }
141
+ assertEq(msb.cmp(msb.listToVec(readResult[1]))(expected), 0, 'multi-chunk read content mismatch');
166
142
  },
167
143
  casWriteDedup: () => {
168
144
  // Same content ⇒ same hash; the second upload's replace-`rename` publishes over the
@@ -172,16 +148,10 @@ export const proof = {
172
148
  const payload = () => nonEmpty(ok(content), empty());
173
149
  const [state1, w1] = virtual(emptyState)(c.write(payload()));
174
150
  const [state2, w2] = virtual(state1)(c.write(payload()));
175
- if (w1[0] !== 'ok' || w2[0] !== 'ok') {
176
- throw ['expected both writes ok', w1, w2];
177
- }
178
- if (msb.cmp(w1[1])(w2[1]) !== 0) {
179
- throw 'dedup hash mismatch';
180
- }
151
+ assert(!(w1[0] !== 'ok' || w2[0] !== 'ok'), ['expected both writes ok', w1, w2]);
152
+ assertEq(msb.cmp(w1[1])(w2[1]), 0, 'dedup hash mismatch');
181
153
  const [, hashes] = virtual(state2)(c.list());
182
- if (hashes.length !== 1) {
183
- throw ['expected one shard after dedup', hashes.length];
184
- }
154
+ assertEq(hashes.length, 1, ['expected one shard after dedup', hashes.length]);
185
155
  },
186
156
  casWriteErrorItemAborts: () => {
187
157
  // An error item mid-stream deletes the partial staging file and fails; nothing is
@@ -191,13 +161,9 @@ export const proof = {
191
161
  const errItem = error({ code: 'BOOM' });
192
162
  const payload = nonEmpty(okItem, nonEmpty(errItem, empty()));
193
163
  const [state1, result] = virtual(emptyState)(c.write(payload));
194
- if (result[0] !== 'error') {
195
- throw ['expected write error', result];
196
- }
164
+ assert(result[0] === 'error', ['expected write error', result]);
197
165
  const [, hashes] = virtual(state1)(c.list());
198
- if (hashes.length !== 0) {
199
- throw ['expected nothing published on abort', hashes];
200
- }
166
+ assertEq(hashes.length, 0, ['expected nothing published on abort', hashes]);
201
167
  },
202
168
  casWriteReadExceedsMaxLength: () => {
203
169
  // The point of streaming: a payload larger than a single `Vec`'s `maxLength`
@@ -211,13 +177,9 @@ export const proof = {
211
177
  const c = fileCas(sha256)('.');
212
178
  const payload = chunks.reduceRight((tl, chunk) => nonEmpty(ok(chunk), tl), empty());
213
179
  const [state1, w] = virtual(emptyState)(c.write(payload));
214
- if (w[0] !== 'ok') {
215
- throw ['expected write ok', w];
216
- }
180
+ assert(w[0] === 'ok', ['expected write ok', w]);
217
181
  const hash = w[1];
218
- if (msb.cmp(hash)(computeSync(sha256)(chunks)) !== 0) {
219
- throw 'oversized write hash mismatch';
220
- }
182
+ assertEq(msb.cmp(hash)(computeSync(sha256)(chunks)), 0, 'oversized write hash mismatch');
221
183
  // Fold the read stream straight into a fresh SHA-2 state — never one `Vec`.
222
184
  const rehash = (state) => (stream) => stream.step((node) => {
223
185
  if (node === undefined) {
@@ -230,12 +192,8 @@ export const proof = {
230
192
  return rehash(sha256.append(first[1])(state))(tail);
231
193
  });
232
194
  const [, readBack] = virtual(state1)(rehash(sha256.init)(c.read(hash)));
233
- if (readBack[0] !== 'ok') {
234
- throw ['expected read ok', readBack];
235
- }
236
- if (msb.cmp(readBack[1])(hash) !== 0) {
237
- throw 'oversized read-back hash mismatch';
238
- }
195
+ assert(readBack[0] === 'ok', ['expected read ok', readBack]);
196
+ assertEq(msb.cmp(readBack[1])(hash), 0, 'oversized read-back hash mismatch');
239
197
  },
240
198
  casWriteGcReclaimsExpired: () => {
241
199
  // A staging file whose deadline is in the past is reclaimed by the GC that `write`
@@ -250,45 +208,78 @@ export const proof = {
250
208
  const c = fileCas(sha256)('.');
251
209
  const x = c.write(nonEmpty(ok(content), empty()));
252
210
  const [state1, w] = virtual(state0)(x);
253
- if (w[0] !== 'ok') {
254
- throw ['expected write ok', w];
255
- }
211
+ assert(w[0] === 'ok', ['expected write ok', w]);
256
212
  const [, present] = virtual(state1)(access(stalePath));
257
- if (present[0] !== 'error') {
258
- throw 'expected GC to reclaim the expired staging file';
259
- }
213
+ assert(present[0] === 'error', 'expected GC to reclaim the expired staging file');
260
214
  },
261
215
  casUploadSuccess: () => {
262
216
  // A successful upload returns the hash and deletes the source file from cas_upload/.
263
217
  const content = vec8(0x2an);
264
218
  const state0 = { ...emptyState, root: { 'cas_upload': { 'myfile': [content] } } };
265
219
  const [state1, result] = virtual(state0)(casUpload('.')('myfile'));
266
- if (result[0] !== 'ok') {
267
- throw ['expected casUpload ok', result];
268
- }
269
- if (length(result[1]) !== 256n) {
270
- throw ['expected 256-bit hash', length(result[1])];
271
- }
220
+ assert(result[0] === 'ok', ['expected casUpload ok', result]);
221
+ assertEq(length(result[1]), 256n, ['expected 256-bit hash', length(result[1])]);
272
222
  // Source must be deleted after successful publish.
273
223
  const srcPath = join('.', 'cas_upload', 'myfile');
274
224
  const [, srcAccess] = virtual(state1)(access(srcPath));
275
- if (srcAccess[0] !== 'error') {
276
- throw 'expected source to be deleted after successful upload';
277
- }
225
+ assert(srcAccess[0] === 'error', 'expected source to be deleted after successful upload');
278
226
  },
279
227
  casUploadFailureKeepsSource: () => {
280
228
  // A missing source file causes write to fail; casUpload returns error and the
281
229
  // source is left in place (trivially: it was never there, but the upload is not published).
282
230
  const state0 = { ...emptyState, root: {} };
283
231
  const [state1, result] = virtual(state0)(casUpload('.')('nonexistent'));
284
- if (result[0] !== 'error') {
285
- throw ['expected casUpload to fail on missing source', result];
286
- }
232
+ assert(result[0] === 'error', ['expected casUpload to fail on missing source', result]);
287
233
  // Nothing published to the store.
288
234
  const c = fileCas(sha256)('.');
289
235
  const [, hashes] = virtual(state1)(c.list());
290
- if (hashes.length !== 0) {
291
- throw ['expected nothing published on failed upload', hashes];
236
+ assertEq(hashes.length, 0, ['expected nothing published on failed upload', hashes]);
237
+ },
238
+ collectReadDrainsChunks: () => {
239
+ // The common path: every chunk is `ok`, so collectRead concatenates them all
240
+ // and returns the whole blob as one `Vec`.
241
+ const stream = nonEmpty(ok(vec8(0x11n)), nonEmpty(ok(vec8(0x22n)), empty()));
242
+ const d = decode(collectRead(stream));
243
+ assert(d.done, 'expected collectRead to finish without issuing a command');
244
+ assertEq(d.result[0], 'ok');
245
+ },
246
+ collectReadPropagatesErrorItem: () => {
247
+ // An error item mid-stream short-circuits collectRead with that same error.
248
+ const boom = error('boom');
249
+ const stream = nonEmpty(ok(vec8(0x11n)), nonEmpty(boom, empty()));
250
+ const d = decode(collectRead(stream));
251
+ assert(d.done, 'expected collectRead to finish without issuing a command');
252
+ assertEq(d.result[0], 'error');
253
+ assertEq(d.result[1], 'boom');
254
+ },
255
+ // A single `Vec` cannot exceed `maxLength` bits — feed a pure stream whose second
256
+ // chunk pushes the running total just over the limit so the overflow guard fires
257
+ // without any real I/O.
258
+ collectReadOverflow: () => {
259
+ const half = maxLength / 2n;
260
+ const v1 = vec(half)(0n);
261
+ const v2 = vec(half + 1n)(0n);
262
+ const stream = nonEmpty(ok(v1), nonEmpty(ok(v2), empty()));
263
+ const d = decode(collectRead(stream));
264
+ assert(d.done, 'expected collectRead to finish without issuing a command');
265
+ assertEq(d.result[0], 'error');
266
+ },
267
+ casListPropagatesNonNotFoundAccessError: () => {
268
+ // A non-ENOENT `access` failure (permissions, corruption) is a genuine storage
269
+ // error and must propagate out of `list`, not be swallowed as an empty store.
270
+ const c = fileCas(sha256)('.');
271
+ const boom = { code: 'EACCES' };
272
+ const d = decode(c.list());
273
+ assert(!d.done, 'expected list() to issue an access command first');
274
+ assertEq(d.command, 'access');
275
+ const continuation = d.continuation;
276
+ let threw;
277
+ try {
278
+ continuation(error(boom));
279
+ }
280
+ catch (e) {
281
+ threw = e;
292
282
  }
283
+ assertEq(threw, boom);
293
284
  },
294
285
  };
@@ -4,8 +4,8 @@
4
4
  *
5
5
  * @module
6
6
  */
7
- import { bun } from "../config/module.f.js";
8
- import { clean, install, test, uses } from "../common/module.f.js";
7
+ import { bun } from '../config/module.f.js';
8
+ import { clean, install, test, uses } from '../common/module.f.js';
9
9
  export const bunSteps = (version) => clean([
10
10
  install(uses('oven-sh/setup-bun', { 'bun-version': bun })),
11
11
  install({ run: `bun install -g functionalscript@${version}` }),
@@ -7,9 +7,9 @@
7
7
  */
8
8
  import { actions, images } from '../config/module.f.ts';
9
9
  import { type Ts } from '../../types/rtti/ts/module.f.ts';
10
- export declare const os: readonly ["ubuntu", "macos", "windows"];
10
+ export declare const os: readonly ['ubuntu', 'macos', 'windows'];
11
11
  export type Os = typeof os[number];
12
- export declare const architecture: readonly ["intel", "arm"];
12
+ export declare const architecture: readonly ['intel', 'arm'];
13
13
  export type Architecture = typeof architecture[number];
14
14
  export type Image = typeof images[Os][Architecture];
15
15
  export declare const stepSchema: {
@@ -5,10 +5,10 @@
5
5
  *
6
6
  * @module
7
7
  */
8
- import { actions, images } from "../config/module.f.js";
9
- import { option, array, record, string } from "../../types/rtti/module.f.js";
10
- import {} from "../../types/rtti/ts/module.f.js";
11
- import { parse as rttiParse } from "../../types/rtti/parse/module.f.js";
8
+ import { actions, images } from '../config/module.f.js';
9
+ import { option, array, record, string } from '../../types/rtti/module.f.js';
10
+ import {} from '../../types/rtti/ts/module.f.js';
11
+ import { parse as rttiParse } from '../../types/rtti/parse/module.f.js';
12
12
  export const os = ['ubuntu', 'macos', 'windows'];
13
13
  export const architecture = ['intel', 'arm'];
14
14
  export const stepSchema = {
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Centralized version pins and OS images used by the CI generator: runner
3
+ * images, tool versions (Bun, Deno, Playwright, Rust, Node, Wasmtime, Wasmer,
4
+ * TSGO).
5
+ *
6
+ * @module
7
+ */
8
+ export declare const images: {
9
+ readonly ubuntu: {
10
+ readonly intel: 'ubuntu-26.04';
11
+ readonly arm: 'ubuntu-26.04-arm';
12
+ };
13
+ readonly macos: {
14
+ readonly intel: 'macos-26-intel';
15
+ readonly arm: 'macos-26';
16
+ };
17
+ readonly windows: {
18
+ readonly intel: 'windows-2025';
19
+ readonly arm: 'windows-11-arm';
20
+ };
21
+ };
22
+ export declare const functionalscript: '0.37.0';
23
+ export declare const bun = "1.3.14";
24
+ export declare const deno = "2.9.3";
25
+ export declare const playwright = "1.61.1";
26
+ export declare const node: {
27
+ readonly default: '26.5.0';
28
+ readonly node22: '22.23.1';
29
+ readonly node24: '24.18.0';
30
+ };
31
+ export declare const wasmtime = "47.0.2";
32
+ export declare const wasmer = "7.2.0";
33
+ export declare const actions: {
34
+ readonly 'actions/checkout': 'v7';
35
+ readonly 'actions/setup-node': 'v7.0.0';
36
+ readonly 'actions/cache': 'v6.1.0';
37
+ readonly 'denoland/setup-deno': 'v2.0.5';
38
+ readonly 'oven-sh/setup-bun': 'v2.2.0';
39
+ readonly 'bytecodealliance/actions/wasmtime/setup': 'v1.1.3';
40
+ readonly 'wasmerio/setup-wasmer': 'v3.1';
41
+ readonly 'dtolnay/rust-toolchain': '1.97.1';
42
+ };
@@ -24,25 +24,23 @@ export const images = {
24
24
  // published FunctionalScript release; do not tie it to package.json's current
25
25
  // in-repo version.
26
26
  // https://www.npmjs.com/package/functionalscript
27
- export const functionalscript = '0.35.2';
27
+ export const functionalscript = '0.37.0';
28
28
  // https://bun.sh/
29
29
  export const bun = '1.3.14';
30
30
  // https://deno.com/
31
- export const deno = '2.9.1';
31
+ export const deno = '2.9.3';
32
32
  // https://www.npmjs.com/package/playwright
33
33
  export const playwright = '1.61.1';
34
34
  // https://nodejs.org/en/download
35
35
  export const node = {
36
- default: '26.4.0',
36
+ default: '26.5.0',
37
37
  node22: '22.23.1',
38
38
  node24: '24.18.0',
39
39
  };
40
40
  // https://github.com/bytecodealliance/wasmtime/releases
41
- export const wasmtime = '46.0.1';
41
+ export const wasmtime = '47.0.2';
42
42
  // https://github.com/wasmerio/wasmer/releases
43
43
  export const wasmer = '7.2.0';
44
- // https://www.npmjs.com/package/@typescript/native-preview?activeTab=versions
45
- export const tsgo = '7.0.0-dev.20260707.2';
46
44
  // GitHub Action versions used by CI step builders. The key is the action
47
45
  // `owner/name`; call sites compose the full ref as
48
46
  // `` `${name}@${actions[name]}` ``.
@@ -51,7 +49,7 @@ export const actions = {
51
49
  // https://github.com/marketplace/actions/checkout
52
50
  'actions/checkout': 'v7',
53
51
  // https://github.com/marketplace/actions/setup-node-js-environment
54
- 'actions/setup-node': 'v6.4.0',
52
+ 'actions/setup-node': 'v7.0.0',
55
53
  // https://github.com/marketplace/actions/cache
56
54
  'actions/cache': 'v6.1.0',
57
55
  // https://github.com/marketplace/actions/setup-deno
@@ -63,5 +61,5 @@ export const actions = {
63
61
  // https://github.com/wasmerio/setup-wasmer
64
62
  'wasmerio/setup-wasmer': 'v3.1',
65
63
  // https://rust-lang.org/ - value is Rust version, not action version
66
- 'dtolnay/rust-toolchain': '1.96.1',
64
+ 'dtolnay/rust-toolchain': '1.97.1',
67
65
  };
@@ -0,0 +1,20 @@
1
+ /**
2
+ * CI step builder for Deno: installs the pinned Deno version and runs the
3
+ * FunctionalScript package smoke test plus Deno coverage in one canonical job.
4
+ *
5
+ * @module
6
+ */
7
+ import { deno } from '../config/module.f.js';
8
+ import { clean, install, test, uses } from '../common/module.f.js';
9
+ const denoTest = 'deno test --allow-read --allow-env --allow-sys';
10
+ export const denoSteps = (version) => clean([
11
+ install(uses('denoland/setup-deno', { 'deno-version': deno })),
12
+ // We need --minimum-dependency-age=0 for functionalscript because we would like to use
13
+ // the latest version of the package even if it is not yet 24 hours old,
14
+ // which is the default minimum dependency age for Deno installs.
15
+ // This way we can test the latest version of the package in CI without waiting for 24 hours.
16
+ install({ run: `deno install -g -A --minimum-dependency-age=0 npm:functionalscript@${version}` }),
17
+ test({ run: `deno run -A --minimum-dependency-age=0 npm:functionalscript@${version} t` }),
18
+ test({ run: 'deno install --frozen' }),
19
+ test({ run: `${denoTest} --coverage && deno coverage --include='.*module\\.f\\.ts'` }),
20
+ ]);
@@ -3,15 +3,15 @@
3
3
  *
4
4
  * @module
5
5
  */
6
- import { pure } from "../effects/module.f.js";
7
- import { access, writeUtf8File } from "../effects/node/module.f.js";
8
- import { functionalscript, images } from "./config/module.f.js";
9
- import { architecture, os, toSteps, ubuntuArm } from "./common/module.f.js";
10
- import { rustPlatformSteps, rustWasmSteps } from "./rust/module.f.js";
11
- import { nodeMainSteps, nodeVersionJobs } from "./node/module.f.js";
12
- import { playwrightJob } from "./playwright/module.f.js";
13
- import { bunSteps } from "./bun/module.f.js";
14
- import { denoSteps } from "./deno/module.f.js";
6
+ import { pure } from '../effects/module.f.js';
7
+ import { access, writeUtf8File } from '../effects/node/module.f.js';
8
+ import { functionalscript, images } from './config/module.f.js';
9
+ import { architecture, os, toSteps, ubuntuArm } from './common/module.f.js';
10
+ import { rustPlatformSteps, rustWasmSteps } from './rust/module.f.js';
11
+ import { nodeMainSteps, nodeVersionJobs } from './node/module.f.js';
12
+ import { playwrightJob } from './playwright/module.f.js';
13
+ import { bunSteps } from './bun/module.f.js';
14
+ import { denoSteps } from './deno/module.f.js';
15
15
  const job = (rust, nodeExtra) => (o) => (a) => {
16
16
  const id = `${o}-${a}`;
17
17
  const image = images[o][a];
@@ -3,4 +3,4 @@ export declare const major: (v: string) => string;
3
3
  export declare const basicNode: (version: string) => (extra: readonly MetaStep[]) => readonly MetaStep[];
4
4
  export declare const platformNodeSteps: (version: string) => readonly MetaStep[];
5
5
  export declare const nodeVersionJobs: (version: string) => Jobs;
6
- export declare const nodeMainSteps: (version: string) => readonly MetaStep[];
6
+ export declare const nodeMainSteps: typeof platformNodeSteps;
@@ -1,11 +1,11 @@
1
1
  /**
2
2
  * CI step builders for Node.js: setup-node installation, platform smoke tests,
3
- * per-version canonical jobs, and the main TSGO step.
3
+ * per-version canonical jobs.
4
4
  *
5
5
  * @module
6
6
  */
7
- import { node, tsgo } from "../config/module.f.js";
8
- import { clean, install, test, ubuntuArm, uses } from "../common/module.f.js";
7
+ import { node } from '../config/module.f.js';
8
+ import { clean, install, test, ubuntuArm, uses } from '../common/module.f.js';
9
9
  export const major = (v) => v.split('.')[0];
10
10
  const installNode = (version) => uses('actions/setup-node', { 'node-version': version });
11
11
  const nodeInstall = (v) => [
@@ -33,9 +33,7 @@ const node24Steps = clean([
33
33
  ]);
34
34
  const node26Steps = clean([
35
35
  ...nodeInstall(node.default),
36
- install({ run: `npm install -g @typescript/native-preview@${tsgo}` }),
37
36
  test({ run: 'npx tsc' }),
38
- test({ run: 'tsgo' }),
39
37
  test({ run: 'npm run cov' }),
40
38
  test({ run: 'npm pack' }),
41
39
  ]);
@@ -4,9 +4,9 @@
4
4
  *
5
5
  * @module
6
6
  */
7
- import { images, node, playwright } from "../config/module.f.js";
8
- import { install, test, toSteps, uses } from "../common/module.f.js";
9
- import { basicNode } from "../node/module.f.js";
7
+ import { images, node, playwright } from '../config/module.f.js';
8
+ import { install, test, toSteps, uses } from '../common/module.f.js';
9
+ import { basicNode } from '../node/module.f.js';
10
10
  const playwrightImage = images.ubuntu.arm;
11
11
  export const playwrightJob = {
12
12
  'runs-on': playwrightImage,