functionalscript 0.44.0 → 0.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (571) hide show
  1. package/README.md +5 -3
  2. package/fjs/asn.1/module.f.mjs +8 -1
  3. package/fjs/asn.1/proof.f.d.mts +15 -0
  4. package/fjs/asn.1/proof.f.mjs +31 -3
  5. package/fjs/asserts/module.f.d.mts +14 -0
  6. package/fjs/asserts/module.f.mjs +20 -0
  7. package/fjs/asserts/proof.f.d.mts +3 -0
  8. package/fjs/asserts/proof.f.mjs +15 -1
  9. package/fjs/basen/base128/module.f.mjs +22 -5
  10. package/fjs/basen/base128/proof.f.d.mts +3 -1
  11. package/fjs/basen/base128/proof.f.mjs +3 -1
  12. package/fjs/basen/base64/module.f.mjs +7 -3
  13. package/fjs/basen/base64/proof.f.d.mts +3 -1
  14. package/fjs/basen/base64/proof.f.mjs +7 -4
  15. package/fjs/basen/cbase32/proof.f.d.mts +3 -1
  16. package/fjs/basen/cbase32/proof.f.mjs +3 -1
  17. package/fjs/bnf/data/module.f.d.mts +32 -6
  18. package/fjs/bnf/data/module.f.mjs +112 -7
  19. package/fjs/bnf/data/proof.f.d.mts +2 -0
  20. package/fjs/bnf/data/proof.f.mjs +74 -4
  21. package/fjs/bnf/data/types.d.ts +20 -2
  22. package/fjs/bnf/descent/module.f.d.mts +34 -5
  23. package/fjs/bnf/descent/module.f.mjs +176 -54
  24. package/fjs/bnf/descent/proof.f.d.mts +3 -0
  25. package/fjs/bnf/descent/proof.f.mjs +189 -27
  26. package/fjs/bnf/descent/types.d.ts +24 -18
  27. package/fjs/bnf/ll1/module.f.d.mts +74 -6
  28. package/fjs/bnf/ll1/module.f.mjs +297 -95
  29. package/fjs/bnf/ll1/proof.f.d.mts +17 -2
  30. package/fjs/bnf/ll1/proof.f.mjs +372 -137
  31. package/fjs/bnf/ll1/types.d.ts +25 -27
  32. package/fjs/bnf/matcher/module.f.d.mts +66 -0
  33. package/fjs/bnf/matcher/module.f.mjs +81 -0
  34. package/fjs/bnf/matcher/proof.f.d.mts +10 -0
  35. package/fjs/bnf/matcher/proof.f.mjs +79 -0
  36. package/fjs/bnf/matcher/types.d.ts +54 -0
  37. package/fjs/bnf/module.f.d.mts +15 -6
  38. package/fjs/bnf/module.f.mjs +52 -11
  39. package/fjs/bnf/proof.f.d.mts +2 -0
  40. package/fjs/bnf/proof.f.mjs +79 -3
  41. package/fjs/bnf/testlib.f.d.mts +31 -0
  42. package/fjs/bnf/testlib.f.mjs +80 -0
  43. package/fjs/bnf/token_symbol/module.f.d.mts +4 -3
  44. package/fjs/bnf/token_symbol/module.f.mjs +7 -6
  45. package/fjs/bnf/token_symbol/proof.f.mjs +5 -2
  46. package/fjs/bnf/token_symbol/types.d.ts +2 -2
  47. package/fjs/bnf/types.d.ts +10 -3
  48. package/fjs/cas/cli/module.f.d.mts +1 -1
  49. package/fjs/cas/cli/module.f.mjs +14 -20
  50. package/fjs/cas/cli/proof.f.d.mts +4 -4
  51. package/fjs/cas/cli/proof.f.mjs +47 -34
  52. package/fjs/cas/evo/module.f.d.mts +71 -31
  53. package/fjs/cas/evo/module.f.mjs +223 -138
  54. package/fjs/cas/evo/proof.f.d.mts +10 -1
  55. package/fjs/cas/evo/proof.f.mjs +311 -226
  56. package/fjs/cas/evo/types.d.ts +45 -9
  57. package/fjs/cas/module.f.d.mts +18 -32
  58. package/fjs/cas/module.f.mjs +164 -176
  59. package/fjs/cas/proof.f.d.mts +11 -8
  60. package/fjs/cas/proof.f.mjs +259 -147
  61. package/fjs/cas/types.d.ts +24 -10
  62. package/fjs/ci/common/module.f.d.mts +1 -1
  63. package/fjs/ci/common/module.f.mjs +1 -0
  64. package/fjs/ci/config/module.f.d.mts +3 -3
  65. package/fjs/ci/config/module.f.mjs +3 -3
  66. package/fjs/ci/module.f.d.mts +5 -5
  67. package/fjs/ci/module.f.mjs +8 -7
  68. package/fjs/ci/nix/module.f.d.mts +7 -5
  69. package/fjs/ci/nix/module.f.mjs +13 -12
  70. package/fjs/ci/nix/proof.f.d.mts +2 -0
  71. package/fjs/ci/nix/proof.f.mjs +4 -4
  72. package/fjs/ci/proof.f.d.mts +4 -2
  73. package/fjs/ci/proof.f.mjs +13 -8
  74. package/fjs/cli/module.f.d.mts +4 -6
  75. package/fjs/cli/module.f.mjs +4 -8
  76. package/fjs/cli/proof.f.d.mts +4 -2
  77. package/fjs/cli/proof.f.mjs +21 -18
  78. package/fjs/cli/types.d.ts +2 -3
  79. package/fjs/common/monoid/module.f.d.mts +70 -12
  80. package/fjs/common/monoid/module.f.mjs +177 -14
  81. package/fjs/common/monoid/proof.f.d.mts +12 -1
  82. package/fjs/common/monoid/proof.f.mjs +88 -4
  83. package/fjs/common/monoid/types.d.ts +23 -0
  84. package/fjs/crypto/hmac/module.f.mjs +2 -2
  85. package/fjs/crypto/secp/proof.f.d.mts +3 -1
  86. package/fjs/crypto/secp/proof.f.mjs +3 -1
  87. package/fjs/crypto/sha2/module.f.mjs +3 -1
  88. package/fjs/crypto/sha2/proof.f.d.mts +4 -1
  89. package/fjs/crypto/sha2/proof.f.mjs +27 -1
  90. package/fjs/crypto/sha2/types.d.ts +11 -0
  91. package/fjs/crypto/sign/module.f.mjs +2 -2
  92. package/fjs/crypto/vdf/module.f.d.mts +23 -4
  93. package/fjs/crypto/vdf/module.f.mjs +6 -4
  94. package/fjs/dev/module.f.d.mts +17 -5
  95. package/fjs/dev/module.f.mjs +60 -30
  96. package/fjs/dev/update/module.f.d.mts +11 -3
  97. package/fjs/dev/update/module.f.mjs +16 -11
  98. package/fjs/dev/update/proof.f.d.mts +4 -3
  99. package/fjs/dev/update/proof.f.mjs +11 -7
  100. package/fjs/djs/module.f.d.mts +13 -5
  101. package/fjs/djs/module.f.mjs +31 -16
  102. package/fjs/djs/parser/module.f.d.mts +16 -3
  103. package/fjs/djs/parser/module.f.mjs +135 -16
  104. package/fjs/djs/parser/proof.f.d.mts +8 -1
  105. package/fjs/djs/parser/proof.f.mjs +287 -13
  106. package/fjs/djs/parser/types.d.ts +7 -1
  107. package/fjs/djs/proof.f.d.mts +20 -1
  108. package/fjs/djs/proof.f.mjs +190 -12
  109. package/fjs/djs/serializer/module.f.d.mts +25 -8
  110. package/fjs/djs/serializer/module.f.mjs +66 -19
  111. package/fjs/djs/serializer/proof.f.d.mts +5 -0
  112. package/fjs/djs/serializer/proof.f.mjs +23 -1
  113. package/fjs/djs/tokenizer/module.f.d.mts +17 -5
  114. package/fjs/djs/tokenizer/module.f.mjs +120 -73
  115. package/fjs/djs/tokenizer/proof.f.d.mts +3 -0
  116. package/fjs/djs/tokenizer/proof.f.mjs +86 -67
  117. package/fjs/djs/transpiler/module.f.d.mts +13 -19
  118. package/fjs/djs/transpiler/module.f.mjs +79 -72
  119. package/fjs/djs/transpiler/types.d.ts +29 -0
  120. package/fjs/djs/types.d.ts +7 -1
  121. package/fjs/effects/list/module.f.d.mts +23 -12
  122. package/fjs/effects/list/module.f.mjs +16 -12
  123. package/fjs/effects/list/types.d.ts +27 -7
  124. package/fjs/effects/memory/module.f.d.mts +6 -3
  125. package/fjs/effects/memory/module.f.mjs +7 -7
  126. package/fjs/effects/memory/proof.f.d.mts +4 -0
  127. package/fjs/effects/memory/proof.f.mjs +18 -9
  128. package/fjs/effects/memory/types.d.ts +4 -3
  129. package/fjs/effects/mock/module.f.d.mts +28 -4
  130. package/fjs/effects/mock/module.f.mjs +39 -5
  131. package/fjs/effects/mock/types.d.ts +10 -1
  132. package/fjs/effects/module.d.mts +12 -2
  133. package/fjs/effects/module.f.d.mts +469 -281
  134. package/fjs/effects/module.f.mjs +538 -299
  135. package/fjs/effects/module.mjs +11 -2
  136. package/fjs/effects/node/memory/module.d.mts +7 -2
  137. package/fjs/effects/node/memory/module.mjs +9 -5
  138. package/fjs/effects/node/memory/proof.d.mts +2 -0
  139. package/fjs/effects/node/memory/proof.mjs +12 -5
  140. package/fjs/effects/node/module.d.mts +8 -2
  141. package/fjs/effects/node/module.f.d.mts +183 -43
  142. package/fjs/effects/node/module.f.mjs +260 -62
  143. package/fjs/effects/node/module.mjs +61 -50
  144. package/fjs/effects/node/proof.f.d.mts +28 -2
  145. package/fjs/effects/node/proof.f.mjs +161 -42
  146. package/fjs/effects/node/types.d.ts +106 -18
  147. package/fjs/effects/node/virtual/module.f.d.mts +21 -4
  148. package/fjs/effects/node/virtual/module.f.mjs +113 -70
  149. package/fjs/effects/node/virtual/proof.f.d.mts +31 -2
  150. package/fjs/effects/node/virtual/proof.f.mjs +201 -8
  151. package/fjs/effects/proof.f.d.mts +69 -34
  152. package/fjs/effects/proof.f.mjs +413 -130
  153. package/fjs/effects/types.d.ts +161 -33
  154. package/fjs/emergent_testing/all.test.d.mts +8 -0
  155. package/fjs/emergent_testing/all.test.mjs +14 -0
  156. package/fjs/emergent_testing/module.f.d.mts +22 -10
  157. package/fjs/emergent_testing/module.f.mjs +119 -85
  158. package/fjs/emergent_testing/proof.f.d.mts +21 -7
  159. package/fjs/emergent_testing/proof.f.mjs +169 -35
  160. package/fjs/emergent_testing/types.d.ts +22 -4
  161. package/fjs/fsc/bnf.f.d.mts +3 -0
  162. package/fjs/fsc/bnf.f.mjs +4 -1
  163. package/fjs/fsc/json.f.d.mts +3 -0
  164. package/fjs/fsc/json.f.mjs +4 -1
  165. package/fjs/fsc/module.f.d.mts +9 -0
  166. package/fjs/fsc/module.f.mjs +5 -3
  167. package/fjs/fsm/module.f.d.mts +14 -4
  168. package/fjs/fsm/module.f.mjs +54 -37
  169. package/fjs/fsm/proof.f.d.mts +5 -0
  170. package/fjs/fsm/proof.f.mjs +87 -115
  171. package/fjs/js/keywords/module.f.d.mts +52 -0
  172. package/fjs/js/keywords/module.f.mjs +72 -0
  173. package/fjs/{emergent_testing/scenarios/return-value.pass.d.ts → js/keywords/proof.f.d.mts} +1 -1
  174. package/fjs/js/keywords/proof.f.mjs +13 -0
  175. package/fjs/js/tokenizer/module.f.d.mts +30 -3
  176. package/fjs/js/tokenizer/module.f.mjs +161 -211
  177. package/fjs/js/tokenizer/proof.f.d.mts +1 -0
  178. package/fjs/js/tokenizer/proof.f.mjs +54 -24
  179. package/fjs/js/tokenizer/types.d.ts +33 -24
  180. package/fjs/mcp/cas/module.f.d.mts +1 -6
  181. package/fjs/mcp/cas/module.f.mjs +55 -51
  182. package/fjs/mcp/cas/proof.f.d.mts +15 -0
  183. package/fjs/mcp/cas/proof.f.mjs +174 -0
  184. package/fjs/mcp/evo/module.f.d.mts +19 -10
  185. package/fjs/mcp/evo/module.f.mjs +48 -27
  186. package/fjs/mcp/evo/proof.f.d.mts +6 -1
  187. package/fjs/mcp/evo/proof.f.mjs +115 -31
  188. package/fjs/mcp/module.f.d.mts +39 -4
  189. package/fjs/mcp/module.f.mjs +14 -12
  190. package/fjs/mcp/proof.f.d.mts +13 -1
  191. package/fjs/mcp/proof.f.mjs +120 -61
  192. package/fjs/media/html/module.f.d.mts +12 -0
  193. package/fjs/media/html/module.f.mjs +7 -5
  194. package/fjs/media/html/proof.f.d.mts +3 -0
  195. package/fjs/media/html/proof.f.mjs +4 -1
  196. package/fjs/media/json/extended/module.f.d.mts +82 -0
  197. package/fjs/media/json/extended/module.f.mjs +153 -0
  198. package/fjs/media/json/extended/proof.f.d.mts +42 -0
  199. package/fjs/media/json/extended/proof.f.mjs +127 -0
  200. package/fjs/media/json/extended/types.d.ts +23 -0
  201. package/fjs/media/json/module.f.d.mts +8 -2
  202. package/fjs/media/json/module.f.mjs +43 -41
  203. package/fjs/media/json/number/module.f.d.mts +59 -0
  204. package/fjs/media/json/number/module.f.mjs +136 -0
  205. package/fjs/media/json/number/proof.f.d.mts +24 -0
  206. package/fjs/media/json/number/proof.f.mjs +86 -0
  207. package/fjs/media/json/number/types.d.ts +28 -0
  208. package/fjs/media/json/parser/module.f.d.mts +25 -13
  209. package/fjs/media/json/parser/module.f.mjs +133 -72
  210. package/fjs/media/json/parser/proof.f.d.mts +5 -0
  211. package/fjs/media/json/parser/proof.f.mjs +31 -1
  212. package/fjs/media/json/parser/types.d.ts +38 -14
  213. package/fjs/media/json/rtti/module.f.d.mts +1 -1
  214. package/fjs/media/json/rtti/module.f.mjs +1 -1
  215. package/fjs/media/json/rtti/proof.f.d.mts +3 -0
  216. package/fjs/media/json/rtti/proof.f.mjs +12 -12
  217. package/fjs/media/json/schema/module.f.d.mts +61 -27
  218. package/fjs/media/json/schema/module.f.mjs +218 -63
  219. package/fjs/media/json/schema/proof.f.d.mts +41 -1
  220. package/fjs/media/json/schema/proof.f.mjs +220 -9
  221. package/fjs/media/json/serializer/module.f.d.mts +44 -0
  222. package/fjs/media/json/serializer/module.f.mjs +71 -9
  223. package/fjs/media/json/tokenizer/module.f.d.mts +8 -0
  224. package/fjs/media/json/tokenizer/module.f.mjs +31 -8
  225. package/fjs/media/json/tokenizer/proof.f.d.mts +6 -0
  226. package/fjs/media/json/tokenizer/proof.f.mjs +62 -21
  227. package/fjs/media/json/types.d.ts +36 -10
  228. package/fjs/media/lock/module.f.d.mts +100 -0
  229. package/fjs/media/lock/module.f.mjs +125 -0
  230. package/fjs/media/lock/proof.f.d.mts +33 -0
  231. package/fjs/media/lock/proof.f.mjs +196 -0
  232. package/fjs/media/lock/types.d.ts +15 -0
  233. package/fjs/media/module.f.d.mts +6 -5
  234. package/fjs/media/module.f.mjs +8 -7
  235. package/fjs/media/nix/module.f.d.mts +13 -0
  236. package/fjs/media/nix/module.f.mjs +4 -2
  237. package/fjs/media/nix/proof.f.d.mts +3 -0
  238. package/fjs/media/nix/proof.f.mjs +4 -1
  239. package/fjs/media/note/module.f.d.mts +121 -0
  240. package/fjs/media/note/module.f.mjs +131 -0
  241. package/fjs/media/note/proof.f.d.mts +29 -0
  242. package/fjs/media/note/proof.f.mjs +150 -0
  243. package/fjs/media/note/types.d.ts +10 -0
  244. package/fjs/media/proof.f.d.mts +4 -1
  245. package/fjs/media/proof.f.mjs +40 -21
  246. package/fjs/media/revision/module.f.d.mts +83 -7
  247. package/fjs/media/revision/module.f.mjs +127 -23
  248. package/fjs/media/revision/proof.f.d.mts +14 -0
  249. package/fjs/media/revision/proof.f.mjs +93 -2
  250. package/fjs/media/revision/types.d.ts +34 -5
  251. package/fjs/media/type/module.f.d.mts +53 -18
  252. package/fjs/media/type/module.f.mjs +87 -97
  253. package/fjs/media/type/proof.f.d.mts +17 -0
  254. package/fjs/media/type/proof.f.mjs +73 -13
  255. package/fjs/module.d.mts +5 -0
  256. package/fjs/module.f.d.mts +8 -0
  257. package/fjs/module.f.mjs +33 -10
  258. package/fjs/module.mjs +6 -0
  259. package/fjs/nanvm/proof.f.mjs +3 -3
  260. package/fjs/nanvm/rust/module.f.mjs +1 -1
  261. package/fjs/nanvm/update/module.f.d.mts +4 -4
  262. package/fjs/nanvm/update/module.f.mjs +8 -9
  263. package/fjs/nanvm/update/proof.f.mjs +4 -3
  264. package/fjs/path/module.f.d.mts +8 -0
  265. package/fjs/path/module.f.mjs +4 -2
  266. package/fjs/proof.f.d.mts +7 -3
  267. package/fjs/proof.f.mjs +41 -12
  268. package/fjs/protocol/json_rpc/module.f.d.mts +3 -3
  269. package/fjs/protocol/json_rpc/module.f.mjs +10 -7
  270. package/fjs/protocol/json_rpc/proof.f.d.mts +6 -0
  271. package/fjs/protocol/json_rpc/proof.f.mjs +26 -5
  272. package/fjs/protocol/mcp/module.f.d.mts +10 -13
  273. package/fjs/protocol/mcp/module.f.mjs +74 -58
  274. package/fjs/protocol/mcp/proof.f.d.mts +16 -3
  275. package/fjs/protocol/mcp/proof.f.mjs +224 -69
  276. package/fjs/protocol/mcp/stdio/module.f.d.mts +17 -11
  277. package/fjs/protocol/mcp/stdio/module.f.mjs +39 -33
  278. package/fjs/protocol/mcp/stdio/proof.f.d.mts +5 -3
  279. package/fjs/protocol/mcp/stdio/proof.f.mjs +46 -13
  280. package/fjs/protocol/mcp/stdio/types.d.ts +14 -0
  281. package/fjs/protocol/mcp/types.d.ts +17 -6
  282. package/fjs/sul/id/module.f.d.mts +4 -0
  283. package/fjs/sul/id/module.f.mjs +6 -6
  284. package/fjs/sul/level/hash/module.f.d.mts +4 -1
  285. package/fjs/sul/level/hash/module.f.mjs +6 -4
  286. package/fjs/sul/level/hash/proof.f.d.mts +4 -0
  287. package/fjs/sul/level/hash/proof.f.mjs +7 -4
  288. package/fjs/sul/level/literal/module.f.d.mts +4 -1
  289. package/fjs/sul/level/literal/module.f.mjs +4 -3
  290. package/fjs/sul/level/literal/proof.f.d.mts +3 -0
  291. package/fjs/sul/level/literal/proof.f.mjs +4 -1
  292. package/fjs/sul/module.f.d.mts +5 -3
  293. package/fjs/sul/module.f.mjs +23 -17
  294. package/fjs/sul/proof.f.d.mts +4 -0
  295. package/fjs/sul/proof.f.mjs +5 -2
  296. package/fjs/text/ascii/module.f.d.mts +26 -0
  297. package/fjs/text/ascii/module.f.mjs +49 -1
  298. package/fjs/text/ascii/proof.f.d.mts +10 -0
  299. package/fjs/text/ascii/proof.f.mjs +33 -1
  300. package/fjs/text/code_point/module.f.d.mts +29 -3
  301. package/fjs/text/code_point/module.f.mjs +32 -9
  302. package/fjs/text/code_point/proof.f.d.mts +2 -0
  303. package/fjs/text/code_point/proof.f.mjs +39 -0
  304. package/fjs/text/module.f.d.mts +4 -2
  305. package/fjs/text/module.f.mjs +4 -3
  306. package/fjs/text/proof.f.d.mts +3 -0
  307. package/fjs/text/proof.f.mjs +4 -1
  308. package/fjs/text/sgr/module.f.d.mts +6 -5
  309. package/fjs/text/sgr/module.f.mjs +8 -8
  310. package/fjs/text/sgr/proof.f.d.mts +3 -0
  311. package/fjs/text/sgr/proof.f.mjs +4 -1
  312. package/fjs/text/utf16/module.f.d.mts +5 -1
  313. package/fjs/text/utf16/module.f.mjs +38 -35
  314. package/fjs/text/utf16/proof.f.d.mts +3 -1
  315. package/fjs/text/utf16/proof.f.mjs +19 -2
  316. package/fjs/text/utf8/module.f.d.mts +9 -5
  317. package/fjs/text/utf8/module.f.mjs +20 -20
  318. package/fjs/types/array/module.f.d.mts +2 -1
  319. package/fjs/types/array/module.f.mjs +16 -4
  320. package/fjs/types/bigfloat/module.f.d.mts +21 -1
  321. package/fjs/types/bigfloat/module.f.mjs +33 -7
  322. package/fjs/types/bigfloat/proof.f.d.mts +1 -0
  323. package/fjs/types/bigfloat/proof.f.mjs +46 -0
  324. package/fjs/types/bigint/module.f.d.mts +4 -0
  325. package/fjs/types/bigint/module.f.mjs +4 -3
  326. package/fjs/types/bit_vec/module.f.d.mts +10 -16
  327. package/fjs/types/bit_vec/module.f.mjs +99 -95
  328. package/fjs/types/bit_vec/proof.f.d.mts +6 -0
  329. package/fjs/types/bit_vec/proof.f.mjs +31 -5
  330. package/fjs/types/btree/find/module.f.d.mts +5 -1
  331. package/fjs/types/btree/find/module.f.mjs +5 -5
  332. package/fjs/types/btree/find/proof.f.d.mts +5 -1
  333. package/fjs/types/btree/find/proof.f.mjs +5 -3
  334. package/fjs/types/btree/module.f.d.mts +3 -0
  335. package/fjs/types/btree/module.f.mjs +3 -2
  336. package/fjs/types/btree/proof.f.d.mts +5 -1
  337. package/fjs/types/btree/proof.f.mjs +5 -3
  338. package/fjs/types/btree/remove/module.f.d.mts +11 -0
  339. package/fjs/types/btree/remove/module.f.mjs +10 -10
  340. package/fjs/types/btree/remove/proof.f.d.mts +3 -0
  341. package/fjs/types/btree/remove/proof.f.mjs +4 -1
  342. package/fjs/types/btree/set/module.f.d.mts +9 -0
  343. package/fjs/types/btree/set/module.f.mjs +14 -17
  344. package/fjs/types/btree/set/proof.f.d.mts +3 -0
  345. package/fjs/types/btree/set/proof.f.mjs +16 -1
  346. package/fjs/types/btree/types/module.f.d.mts +2 -1
  347. package/fjs/types/btree/types/module.f.mjs +2 -1
  348. package/fjs/types/byte_set/module.f.d.mts +20 -4
  349. package/fjs/types/byte_set/module.f.mjs +18 -8
  350. package/fjs/types/byte_set/proof.f.d.mts +3 -1
  351. package/fjs/types/byte_set/proof.f.mjs +10 -8
  352. package/fjs/types/function/compare/module.f.d.mts +3 -2
  353. package/fjs/types/function/compare/module.f.mjs +13 -5
  354. package/fjs/types/function/module.f.d.mts +8 -1
  355. package/fjs/types/function/module.f.mjs +8 -1
  356. package/fjs/types/function/operator/module.f.d.mts +2 -1
  357. package/fjs/types/function/operator/module.f.mjs +2 -2
  358. package/fjs/types/list/module.f.d.mts +10 -3
  359. package/fjs/types/list/module.f.mjs +6 -4
  360. package/fjs/types/list/proof.f.d.mts +4 -1
  361. package/fjs/types/list/proof.f.mjs +4 -2
  362. package/fjs/types/nibble_set/module.f.d.mts +2 -1
  363. package/fjs/types/nibble_set/module.f.mjs +2 -2
  364. package/fjs/types/nominal/module.f.d.mts +2 -1
  365. package/fjs/types/nominal/module.f.mjs +2 -1
  366. package/fjs/types/nullable/module.f.d.mts +26 -6
  367. package/fjs/types/nullable/module.f.mjs +25 -6
  368. package/fjs/types/nullable/proof.f.d.mts +4 -0
  369. package/fjs/types/nullable/proof.f.mjs +15 -0
  370. package/fjs/types/number/module.f.d.mts +4 -0
  371. package/fjs/types/number/module.f.mjs +4 -3
  372. package/fjs/types/object/module.f.d.mts +26 -4
  373. package/fjs/types/object/module.f.mjs +26 -7
  374. package/fjs/types/object/proof.f.d.mts +5 -2
  375. package/fjs/types/object/proof.f.mjs +6 -3
  376. package/fjs/types/object/structurally_same/module.f.d.mts +39 -0
  377. package/fjs/types/object/structurally_same/module.f.mjs +59 -0
  378. package/fjs/types/object/structurally_same/proof.f.d.mts +6 -0
  379. package/fjs/types/object/structurally_same/proof.f.mjs +73 -0
  380. package/fjs/types/ordered_map/module.f.d.mts +5 -0
  381. package/fjs/types/ordered_map/module.f.mjs +5 -4
  382. package/fjs/types/ordered_map/proof.f.d.mts +3 -0
  383. package/fjs/types/ordered_map/proof.f.mjs +4 -1
  384. package/fjs/types/patricia_trie/module.f.d.mts +2 -1
  385. package/fjs/types/patricia_trie/module.f.mjs +27 -12
  386. package/fjs/types/patricia_trie/proof.f.d.mts +3 -0
  387. package/fjs/types/patricia_trie/proof.f.mjs +4 -1
  388. package/fjs/types/prime_field/module.f.d.mts +3 -1
  389. package/fjs/types/prime_field/module.f.mjs +3 -2
  390. package/fjs/types/range/module.f.d.mts +2 -1
  391. package/fjs/types/range/module.f.mjs +2 -2
  392. package/fjs/types/range_map/module.f.d.mts +6 -0
  393. package/fjs/types/range_map/module.f.mjs +6 -9
  394. package/fjs/types/range_map/proof.f.d.mts +5 -1
  395. package/fjs/types/range_map/proof.f.mjs +5 -3
  396. package/fjs/types/range_set/module.f.d.mts +5 -0
  397. package/fjs/types/range_set/module.f.mjs +1 -0
  398. package/fjs/types/range_set/proof.f.d.mts +3 -0
  399. package/fjs/types/range_set/proof.f.mjs +4 -1
  400. package/fjs/types/result/module.d.mts +8 -0
  401. package/fjs/types/result/module.f.d.mts +37 -7
  402. package/fjs/types/result/module.f.mjs +38 -8
  403. package/fjs/types/result/module.mjs +9 -1
  404. package/fjs/types/result/proof.f.d.mts +5 -0
  405. package/fjs/types/result/proof.f.mjs +22 -2
  406. package/fjs/types/rtti/common/module.f.d.mts +44 -14
  407. package/fjs/types/rtti/common/module.f.mjs +42 -36
  408. package/fjs/types/rtti/common/proof.f.d.mts +4 -0
  409. package/fjs/types/rtti/common/proof.f.mjs +10 -7
  410. package/fjs/types/rtti/data/module.f.d.mts +134 -0
  411. package/fjs/types/rtti/data/module.f.mjs +1053 -0
  412. package/fjs/types/rtti/data/proof.f.d.mts +76 -0
  413. package/fjs/types/rtti/data/proof.f.mjs +589 -0
  414. package/fjs/types/rtti/data/types.d.ts +83 -0
  415. package/fjs/types/rtti/module.f.d.mts +12 -5
  416. package/fjs/types/rtti/module.f.mjs +7 -5
  417. package/fjs/types/rtti/parse/module.f.d.mts +48 -0
  418. package/fjs/types/rtti/parse/module.f.mjs +45 -34
  419. package/fjs/types/rtti/parse/proof.f.d.mts +3 -2
  420. package/fjs/types/rtti/parse/proof.f.mjs +51 -52
  421. package/fjs/types/rtti/proof.f.d.mts +3 -1
  422. package/fjs/types/rtti/proof.f.mjs +6 -2
  423. package/fjs/types/rtti/ts/module.f.d.mts +68 -9
  424. package/fjs/types/rtti/ts/module.f.mjs +258 -30
  425. package/fjs/types/rtti/ts/proof.f.d.mts +44 -0
  426. package/fjs/types/rtti/ts/proof.f.mjs +152 -4
  427. package/fjs/types/rtti/ts/types.d.ts +25 -1
  428. package/fjs/types/rtti/types.d.ts +40 -0
  429. package/fjs/types/sorted_list/module.f.d.mts +4 -1
  430. package/fjs/types/sorted_list/module.f.mjs +21 -12
  431. package/fjs/types/sorted_list/proof.f.d.mts +3 -1
  432. package/fjs/types/sorted_list/proof.f.mjs +3 -1
  433. package/fjs/types/sorted_set/module.f.d.mts +49 -1
  434. package/fjs/types/sorted_set/module.f.mjs +26 -2
  435. package/fjs/types/sorted_set/proof.f.d.mts +4 -1
  436. package/fjs/types/sorted_set/proof.f.mjs +19 -2
  437. package/fjs/types/string/module.f.d.mts +4 -0
  438. package/fjs/types/string/module.f.mjs +4 -3
  439. package/fjs/types/string_set/module.f.d.mts +3 -1
  440. package/fjs/types/string_set/module.f.mjs +3 -2
  441. package/fjs/types/ts/module.f.d.mts +2 -0
  442. package/fjs/types/ts/module.f.mjs +3 -3
  443. package/fjs/types/ts/proof.f.d.mts +1 -0
  444. package/fjs/types/ts/proof.f.mjs +5 -0
  445. package/fjs/types/ts/types.d.ts +6 -1
  446. package/fjs/types/uint8array/module.f.d.mts +13 -2
  447. package/fjs/types/uint8array/module.f.mjs +20 -15
  448. package/fjs/website/module.f.d.mts +5 -2
  449. package/fjs/website/module.f.mjs +6 -8
  450. package/fjs/website/proof.f.mjs +2 -1
  451. package/package.json +3 -3
  452. package/fjs/asn.1/types.js +0 -6
  453. package/fjs/asserts/types.js +0 -6
  454. package/fjs/basen/types.js +0 -6
  455. package/fjs/bnf/data/types.js +0 -6
  456. package/fjs/bnf/descent/types.js +0 -6
  457. package/fjs/bnf/ll1/types.js +0 -6
  458. package/fjs/bnf/token_symbol/types.js +0 -6
  459. package/fjs/bnf/types.js +0 -6
  460. package/fjs/cas/evo/types.js +0 -7
  461. package/fjs/cas/types.js +0 -6
  462. package/fjs/ci/common/types.js +0 -1
  463. package/fjs/ci/nix/types.js +0 -6
  464. package/fjs/ci/types.js +0 -6
  465. package/fjs/cli/types.js +0 -6
  466. package/fjs/common/monoid/types.js +0 -6
  467. package/fjs/crypto/pow/types.js +0 -6
  468. package/fjs/crypto/secp/types.js +0 -6
  469. package/fjs/crypto/sha2/types.js +0 -6
  470. package/fjs/crypto/sign/types.js +0 -6
  471. package/fjs/crypto/vdf/types.js +0 -6
  472. package/fjs/dev/package_json/module.f.d.mts +0 -32
  473. package/fjs/dev/package_json/module.f.mjs +0 -37
  474. package/fjs/dev/package_json/proof.f.d.mts +0 -6
  475. package/fjs/dev/package_json/proof.f.mjs +0 -32
  476. package/fjs/dev/types.js +0 -6
  477. package/fjs/djs/ast/types.js +0 -8
  478. package/fjs/djs/parser/types.js +0 -7
  479. package/fjs/djs/tokenizer/types.js +0 -7
  480. package/fjs/djs/types.js +0 -7
  481. package/fjs/effects/eff/module.f.d.mts +0 -10
  482. package/fjs/effects/eff/module.f.mjs +0 -68
  483. package/fjs/effects/eff/proof.f.d.mts +0 -12
  484. package/fjs/effects/eff/proof.f.mjs +0 -66
  485. package/fjs/effects/eff/types.d.ts +0 -71
  486. package/fjs/effects/eff/types.js +0 -6
  487. package/fjs/effects/list/types.js +0 -6
  488. package/fjs/effects/memory/types.js +0 -6
  489. package/fjs/effects/mock/types.js +0 -6
  490. package/fjs/effects/node/types.js +0 -6
  491. package/fjs/effects/node/virtual/types.js +0 -7
  492. package/fjs/effects/types.js +0 -6
  493. package/fjs/emergent_testing/all.test.d.ts +0 -1
  494. package/fjs/emergent_testing/all.test.js +0 -5
  495. package/fjs/emergent_testing/scenarios/all.d.ts +0 -1
  496. package/fjs/emergent_testing/scenarios/all.js +0 -1
  497. package/fjs/emergent_testing/scenarios/async-subtests.fail.d.ts +0 -6
  498. package/fjs/emergent_testing/scenarios/async-subtests.fail.js +0 -9
  499. package/fjs/emergent_testing/scenarios/async-subtests.pass.d.ts +0 -6
  500. package/fjs/emergent_testing/scenarios/async-subtests.pass.js +0 -9
  501. package/fjs/emergent_testing/scenarios/async.fail.d.ts +0 -3
  502. package/fjs/emergent_testing/scenarios/async.fail.js +0 -6
  503. package/fjs/emergent_testing/scenarios/async.pass.d.ts +0 -3
  504. package/fjs/emergent_testing/scenarios/async.pass.js +0 -5
  505. package/fjs/emergent_testing/scenarios/fail.fail.d.ts +0 -3
  506. package/fjs/emergent_testing/scenarios/fail.fail.js +0 -3
  507. package/fjs/emergent_testing/scenarios/return-value.pass.js +0 -4
  508. package/fjs/emergent_testing/scenarios/thenable.pass.d.ts +0 -5
  509. package/fjs/emergent_testing/scenarios/thenable.pass.js +0 -11
  510. package/fjs/emergent_testing/scenarios/thenable2.pass.d.ts +0 -5
  511. package/fjs/emergent_testing/scenarios/thenable2.pass.js +0 -3
  512. package/fjs/emergent_testing/scenarios/throw.pass.d.ts +0 -5
  513. package/fjs/emergent_testing/scenarios/throw.pass.js +0 -3
  514. package/fjs/emergent_testing/types.js +0 -6
  515. package/fjs/js/tokenizer/types.js +0 -6
  516. package/fjs/media/html/types.js +0 -6
  517. package/fjs/media/json/parser/types.js +0 -6
  518. package/fjs/media/json/tokenizer/types.js +0 -6
  519. package/fjs/media/json/types.js +0 -13
  520. package/fjs/media/nix/types.js +0 -6
  521. package/fjs/media/revision/types.js +0 -8
  522. package/fjs/media/type/types.js +0 -6
  523. package/fjs/media/types.js +0 -7
  524. package/fjs/nanvm/types.js +0 -11
  525. package/fjs/protocol/json_rpc/types.js +0 -8
  526. package/fjs/protocol/mcp/types.js +0 -8
  527. package/fjs/sul/id/types.js +0 -6
  528. package/fjs/sul/level/hash/types.js +0 -6
  529. package/fjs/sul/level/literal/types.js +0 -6
  530. package/fjs/sul/types.js +0 -6
  531. package/fjs/text/sgr/types.js +0 -6
  532. package/fjs/text/types.js +0 -6
  533. package/fjs/text/utf16/types.js +0 -6
  534. package/fjs/text/utf8/types.js +0 -6
  535. package/fjs/types/array/types.js +0 -6
  536. package/fjs/types/bigfloat/types.js +0 -6
  537. package/fjs/types/bigint/types.js +0 -6
  538. package/fjs/types/bit_vec/types.js +0 -6
  539. package/fjs/types/btree/find/types.js +0 -6
  540. package/fjs/types/btree/types/types.js +0 -6
  541. package/fjs/types/byte_set/types.js +0 -6
  542. package/fjs/types/function/compare/types.js +0 -6
  543. package/fjs/types/function/operator/types.js +0 -6
  544. package/fjs/types/function/types.js +0 -6
  545. package/fjs/types/list/types.js +0 -6
  546. package/fjs/types/nibble_set/types.js +0 -6
  547. package/fjs/types/nominal/types.js +0 -6
  548. package/fjs/types/nullable/types.js +0 -6
  549. package/fjs/types/object/types.js +0 -8
  550. package/fjs/types/option/types.js +0 -6
  551. package/fjs/types/ordered_map/types.js +0 -6
  552. package/fjs/types/patricia_trie/types.js +0 -6
  553. package/fjs/types/phantom/types.js +0 -11
  554. package/fjs/types/prime_field/types.js +0 -6
  555. package/fjs/types/range/types.js +0 -6
  556. package/fjs/types/range_map/types.js +0 -6
  557. package/fjs/types/result/types.js +0 -6
  558. package/fjs/types/rtti/common/types.js +0 -1
  559. package/fjs/types/rtti/parse/types.js +0 -1
  560. package/fjs/types/rtti/ts/types.js +0 -1
  561. package/fjs/types/rtti/types.js +0 -1
  562. package/fjs/types/rtti/validate/module.f.d.mts +0 -6
  563. package/fjs/types/rtti/validate/module.f.mjs +0 -169
  564. package/fjs/types/rtti/validate/proof.f.d.mts +0 -125
  565. package/fjs/types/rtti/validate/proof.f.mjs +0 -437
  566. package/fjs/types/rtti/validate/types.d.ts +0 -6
  567. package/fjs/types/rtti/validate/types.js +0 -1
  568. package/fjs/types/sorted_list/types.js +0 -6
  569. package/fjs/types/sorted_set/types.js +0 -6
  570. package/fjs/types/string_set/types.js +0 -6
  571. package/fjs/types/ts/types.js +0 -8
@@ -1,3 +1,6 @@
1
+ /**
2
+ * @import { Unknown } from './types.ts'
3
+ */
1
4
  export declare const proof: {
2
5
  tooFewArgs: {
3
6
  noArgs: () => void;
@@ -5,6 +8,22 @@ export declare const proof: {
5
8
  };
6
9
  success: () => void;
7
10
  jsonOutput: () => void;
8
- fileNotFound: () => void;
11
+ fileNotFound: {
12
+ module: () => void;
13
+ json: () => void;
14
+ };
9
15
  parseError: () => void;
16
+ roundTrip: (() => void)[];
17
+ protoKey: {
18
+ moduleRoundTrip: () => void;
19
+ jsonOutput: () => void;
20
+ jsonInput: () => void;
21
+ jsonInputRoundTrip: () => void;
22
+ jsonImportRejected: () => void;
23
+ jsonInputIdKeyRejected: () => void;
24
+ jsonInputRejectsDjsExtensions: () => void;
25
+ value: () => void;
26
+ idKeyRejected: () => void;
27
+ stringKeyRejected: () => void;
28
+ };
10
29
  };
@@ -1,52 +1,230 @@
1
- /** @import { Vec } from '../types/bit_vec/types.ts' */
1
+ /**
2
+ * @import { Unknown } from './types.ts'
3
+ */
4
+
5
+ import { exitCode } from '../effects/node/module.f.mjs'
2
6
  import { compile } from './module.f.mjs'
7
+ import { transpile } from './transpiler/module.f.mjs'
8
+ import { stringify } from './serializer/module.f.mjs'
3
9
  import { virtual, emptyState } from '../effects/node/virtual/module.f.mjs'
4
10
  import { utf8, utf8ToString } from '../text/module.f.mjs'
5
- import { assert, assertEq } from '../asserts/module.f.mjs'
11
+ import { fromEntries, isObject, sort } from '../types/object/module.f.mjs'
12
+ import { assert, assertEq, assertStructurallySame } from '../asserts/module.f.mjs'
6
13
 
7
14
  /** @type {(root: typeof emptyState.root, path: string) => string} */
8
15
  const readOutput = (root, path) => {
9
16
  const file = root[path]
10
17
  if (!Array.isArray(file) || file.length === 0) { throw `${path} is not a file` }
11
- return utf8ToString(/** @type {readonly Vec[]} */ (file)[0])
18
+ return utf8ToString(file[0])
19
+ }
20
+
21
+ /** @type {(source: string) => (outputFileName: string) => string} */
22
+ const compileSource = source => outputFileName => {
23
+ const root = { 'input.f.js': [utf8(source)] }
24
+ const [state, code] = virtual({ ...emptyState, root })(compile(['input.f.js', outputFileName]))
25
+ assertEq(exitCode(code), 0, state.stderr)
26
+ return readOutput(state.root, outputFileName)
12
27
  }
13
28
 
29
+ const { getPrototypeOf, prototype: objectPrototype } = Object
30
+
31
+ /** The value every `protoKey` test below denotes. */
32
+ const protoValue = fromEntries([['__proto__', { a: 42 }]])
33
+
34
+ const sharedArray = [1, 2]
35
+
36
+ /**
37
+ * Values the module emitter must be able to write as source that evaluates
38
+ * back to them. It covers every leaf type, both containers, the shared values
39
+ * that become a `const`, and the `__proto__` key in both positions — the key
40
+ * whose obvious spelling evaluates to something else entirely.
41
+ *
42
+ * @type {readonly Unknown[]}
43
+ */
44
+ const roundTripCorpus = [
45
+ null,
46
+ true,
47
+ false,
48
+ undefined,
49
+ 0,
50
+ -1.5,
51
+ 42n,
52
+ 'a"b\n\\',
53
+ [],
54
+ {},
55
+ [1, [2, [3, []]]],
56
+ { a: 1, 'b c': [true, undefined, 3n], d: {} },
57
+ [sharedArray, sharedArray],
58
+ { a: 'dup', b: 'dup' },
59
+ protoValue,
60
+ fromEntries([['__proto__', 3]]),
61
+ [protoValue, protoValue],
62
+ { a: protoValue },
63
+ ]
64
+
14
65
  export const proof = {
15
66
  tooFewArgs: {
16
67
  noArgs: () => {
17
68
  const [state, code] = virtual(emptyState)(compile([]))
18
- assertEq(code, 1)
69
+ assertEq(exitCode(code), 1)
19
70
  assert(state.stderr.includes('Requires 2 or more arguments'), state.stderr)
20
71
  },
21
72
  oneArg: () => {
22
73
  const [state, code] = virtual(emptyState)(compile(['input.f.js']))
23
- assertEq(code, 1)
74
+ assertEq(exitCode(code), 1)
24
75
  assert(state.stderr.includes('Requires 2 or more arguments'), state.stderr)
25
76
  },
26
77
  },
27
78
  success: () => {
28
79
  const root = { 'input.f.js': [utf8('export default 42')] }
29
80
  const [state, code] = virtual({ ...emptyState, root })(compile(['input.f.js', 'output.f.js']))
30
- assertEq(code, 0)
81
+ assertEq(exitCode(code), 0)
31
82
  const content = readOutput(state.root, 'output.f.js')
32
83
  assertEq(content, 'export default 42')
33
84
  },
34
85
  jsonOutput: () => {
35
86
  const root = { 'input.f.js': [utf8('export default 42')] }
36
87
  const [state, code] = virtual({ ...emptyState, root })(compile(['input.f.js', 'output.json']))
37
- assertEq(code, 0)
88
+ assertEq(exitCode(code), 0)
38
89
  const content = readOutput(state.root, 'output.json')
39
90
  assertEq(content, '42')
40
91
  },
41
- fileNotFound: () => {
42
- const [state, code] = virtual(emptyState)(compile(['missing.f.js', 'output.f.js']))
43
- assertEq(code, 0)
44
- assert(state.stderr.includes('file not found'), state.stderr)
92
+ // An error with no token to point at names the file being compiled, not
93
+ // `undefined:undefined:undefined`. Each language reports its own missing
94
+ // file: the module reader and the JSON reader read their inputs
95
+ // separately.
96
+ fileNotFound: {
97
+ module: () => {
98
+ const [state, code] = virtual(emptyState)(compile(['missing.f.js', 'output.f.js']))
99
+ assertEq(exitCode(code), 1)
100
+ assertEq(state.stderr.trim(), 'missing.f.js - error: file not found')
101
+ assertEq(state.root['output.f.js'], undefined)
102
+ },
103
+ json: () => {
104
+ const [state, code] = virtual(emptyState)(compile(['missing.json', 'output.f.js']))
105
+ assertEq(exitCode(code), 1)
106
+ assertEq(state.stderr.trim(), 'missing.json - error: file not found')
107
+ assertEq(state.root['output.f.js'], undefined)
108
+ },
45
109
  },
46
110
  parseError: () => {
47
111
  const root = { 'bad.f.js': [utf8('export default @')] }
48
112
  const [state, code] = virtual({ ...emptyState, root })(compile(['bad.f.js', 'output.f.js']))
49
- assertEq(code, 0)
113
+ assertEq(exitCode(code), 1)
50
114
  assert(state.stderr !== '', 'expected error output')
115
+ assertEq(state.root['output.f.js'], undefined)
116
+ },
117
+ // serialize → evaluate → structurally the same, one test per corpus value.
118
+ // The emitter is only correct if its output is an input denoting the value
119
+ // it was given, which no assertion on the text alone can state.
120
+ roundTrip: roundTripCorpus.map(value => () => {
121
+ const source = stringify(sort)(value)
122
+ const root = { 'input.f.js': [utf8(source)] }
123
+ const [, result] = virtual({ ...emptyState, root })(transpile('input.f.js'))
124
+ assert(result[0] === 'ok', result[1])
125
+ assertStructurallySame(result[1], value, source)
126
+ }),
127
+ // The `__proto__` key end to end: one value, two output languages, and one
128
+ // spelling of the key in each (#2480).
129
+ protoKey: {
130
+ // The module output uses the computed form, which is also the only
131
+ // input spelling — so the emitter's output is an input that means the
132
+ // same value, and compiling it again is the identity.
133
+ moduleRoundTrip: () => {
134
+ const source = 'export default {["__proto__"]:{"a":42}}'
135
+ const output = compileSource(source)('output.f.js')
136
+ assertEq(output, source)
137
+ assertEq(compileSource(output)('output.f.js'), source)
138
+ },
139
+ // The JSON output keeps the plain key: the computed form is a
140
+ // JavaScript spelling that no JSON parser accepts.
141
+ jsonOutput: () => {
142
+ assertEq(
143
+ compileSource('export default {["__proto__"]:{"a":42}}')('output.json'),
144
+ '{"__proto__":{"a":42}}')
145
+ },
146
+ // `fjs compile proto.json a.js` — the two languages meeting. The input
147
+ // is a JSON document, where `"__proto__"` is an ordinary data key, and
148
+ // the output is a JavaScript module, where only the computed form
149
+ // denotes one. Each hop uses its own language's spelling of the key.
150
+ jsonInput: () => {
151
+ const root = { 'proto.json': [utf8('{"__proto__":5}')] }
152
+ const [state, code] = virtual({ ...emptyState, root })(compile(['proto.json', 'a.js']))
153
+ assertEq(exitCode(code), 0, state.stderr)
154
+ assertEq(readOutput(state.root, 'a.js'), 'export default {["__proto__"]:5}')
155
+ },
156
+ // …and back, byte for byte: a JSON document survives the loop
157
+ // `proto.json → a.js → out.json` with no `["__proto__"]:` artifact,
158
+ // which no JSON parser would accept.
159
+ jsonInputRoundTrip: () => {
160
+ const document = '{"__proto__":{"a":42}}'
161
+ const root = { 'proto.json': [utf8(document)] }
162
+ const [state, code] = virtual({ ...emptyState, root })(compile(['proto.json', 'a.js']))
163
+ assertEq(exitCode(code), 0, state.stderr)
164
+ const module = readOutput(state.root, 'a.js')
165
+ assertEq(module, 'export default {["__proto__"]:{"a":42}}')
166
+ assertEq(compileSource(module)('out.json'), document)
167
+ },
168
+ // The extension speaks for the file named on the command line and for
169
+ // no other: an import is resolved as a FunctionalScript module, and a
170
+ // JSON document is not one — a statement never begins with a value —
171
+ // so importing JSON fails until an import can say
172
+ // `with { type: "json" }` (spec/todo/2140).
173
+ jsonImportRejected: () => {
174
+ const root = {
175
+ 'main.f.js': [utf8('import a from "./a.json"\nexport default [a]')],
176
+ 'a.json': [utf8('{"a":42}')],
177
+ }
178
+ const [state, code] = virtual({ ...emptyState, root })(compile(['main.f.js', 'out.json']))
179
+ assertEq(exitCode(code), 1)
180
+ assert(state.stderr.includes('a.json:1:1 - error: unexpected token'), state.stderr)
181
+ assertEq(state.root['out.json'], undefined)
182
+ },
183
+ // A `.json` input is read as JSON, and an identifier key is no JSON
184
+ // document's key — so this one fails in the JSON reader, which has no
185
+ // position to report and is named by its file instead.
186
+ jsonInputIdKeyRejected: () => {
187
+ const root = { 'proto.json': [utf8('{__proto__:5}')] }
188
+ const [state, code] = virtual({ ...emptyState, root })(compile(['proto.json', 'a.js']))
189
+ assertEq(exitCode(code), 1)
190
+ assertEq(state.stderr.trim(), 'proto.json - error: unexpected token')
191
+ assertEq(state.root['a.js'], undefined)
192
+ },
193
+ // The `.json` reader is JSON, not DJS with a JSON flag: a bigint is
194
+ // not JSON, whatever DJS makes of it.
195
+ jsonInputRejectsDjsExtensions: () => {
196
+ const root = { 'a.json': [utf8('{"a":1n}')] }
197
+ const [state, code] = virtual({ ...emptyState, root })(compile(['a.json', 'a.js']))
198
+ assertEq(exitCode(code), 1)
199
+ assertEq(state.root['a.js'], undefined)
200
+ },
201
+ // The statement behind the textual assertions: the property is an
202
+ // ordinary own property and the prototype is untouched. A textual test
203
+ // alone would also pass for a spelling that merely looks right.
204
+ value: () => {
205
+ const root = { 'input.f.js': [utf8('export default {["__proto__"]:{"a":42}}')] }
206
+ const [, result] = virtual({ ...emptyState, root })(transpile('input.f.js'))
207
+ assert(result[0] === 'ok', result[1])
208
+ const value = result[1]
209
+ assert(isObject(value), value)
210
+ assertStructurallySame(value, protoValue)
211
+ assertEq(getPrototypeOf(value), objectPrototype)
212
+ },
213
+ // The two spellings JavaScript reads as a prototype assignment are
214
+ // compilation errors, not silently accepted properties.
215
+ idKeyRejected: () => {
216
+ const root = { 'input.f.js': [utf8('export default {__proto__:{"a":42}}')] }
217
+ const [state, code] = virtual({ ...emptyState, root })(compile(['input.f.js', 'output.f.js']))
218
+ assertEq(exitCode(code), 1)
219
+ assert(state.stderr.includes('__proto__ requires the computed key form'), state.stderr)
220
+ assertEq(state.root['output.f.js'], undefined)
221
+ },
222
+ stringKeyRejected: () => {
223
+ const root = { 'input.f.js': [utf8('export default {"__proto__":{"a":42}}')] }
224
+ const [state, code] = virtual({ ...emptyState, root })(compile(['input.f.js', 'output.f.js']))
225
+ assertEq(exitCode(code), 1)
226
+ assert(state.stderr.includes('__proto__ requires the computed key form'), state.stderr)
227
+ assertEq(state.root['output.f.js'], undefined)
228
+ },
51
229
  },
52
230
  }
@@ -1,30 +1,47 @@
1
1
  /**
2
2
  * DJS serializer for formatting AST values back to source text.
3
3
  *
4
+ * Two output formats share this one walk over the value: `stringify` emits a
5
+ * JavaScript module and `stringifyAsTree` a JSON tree. They differ in `const`
6
+ * hoisting and in how a property key is spelled — see `_KeySerialize`.
7
+ *
4
8
  * @module
5
9
  *
6
- * @import { Unknown, Object } from '../types.ts'
10
+ * @import { Unknown, Object, _MapEntries } from '../types.ts'
7
11
  * @import { Fold } from '../../types/function/operator/types.ts'
8
- * @import { Entry as ObjectEntry } from '../../types/object/types.ts'
9
12
  * @import { List } from '../../types/list/types.ts'
10
13
  */
11
- import type { Unknown } from '../types.ts';
12
- import type { Entry as ObjectEntry } from '../../types/object/types.ts';
14
+ import type { Unknown, _MapEntries } from '../types.ts';
13
15
  import type { List } from '../../types/list/types.ts';
14
16
  export declare const undefinedSerialize: string[];
15
17
  export type _RefCounter = readonly [number, number];
16
- export type _MapEntries = (entries: List<ObjectEntry<Unknown>>) => List<ObjectEntry<Unknown>>;
17
18
  export type _Refs = ReadonlyMap<Unknown, _RefCounter>;
18
19
  export type _GetConstsState = {
19
20
  readonly added: ReadonlySet<Unknown>;
20
21
  readonly consts: List<Unknown>;
21
22
  };
22
23
  export type _RefLookup = (value: Unknown) => List<string> | null;
23
- /** @type {(mapEntries: _MapEntries) => (value: Unknown) => List<string>} */
24
+ export type _KeySerialize = (key: string) => List<string>;
25
+ /**
26
+ * Serializes a value as a JSON tree — no `const` hoisting, and JSON's key
27
+ * spelling.
28
+ *
29
+ * @type {(mapEntries: _MapEntries) => (value: Unknown) => List<string>}
30
+ */
24
31
  export declare const serializeWithoutConst: (mapEntries: _MapEntries) => (value: Unknown) => List<string>;
25
- /** @type {(sort: _MapEntries) => (djs: Unknown) => string} */
32
+ /**
33
+ * Serializes a value as a JavaScript module: a shared value becomes a `const`,
34
+ * and a `__proto__` key is written in the computed form the language requires.
35
+ *
36
+ * @type {(sort: _MapEntries) => (djs: Unknown) => string}
37
+ */
26
38
  export declare const stringify: (sort: _MapEntries) => (djs: Unknown) => string;
27
- /** @type {(mapEntries: _MapEntries) => (value: Unknown) => string} */
39
+ /**
40
+ * Serializes a value as a JSON tree: shared values are expanded, and keys keep
41
+ * JSON's plain spelling.
42
+ *
43
+ * @type {(mapEntries: _MapEntries) => (value: Unknown) => string}
44
+ */
28
45
  export declare const stringifyAsTree: (mapEntries: _MapEntries) => (value: Unknown) => string;
29
46
  /** @type {(djs: Unknown) => _Refs} */
30
47
  export declare const countRefs: (djs: Unknown) => _Refs;
@@ -1,11 +1,14 @@
1
1
  /**
2
2
  * DJS serializer for formatting AST values back to source text.
3
3
  *
4
+ * Two output formats share this one walk over the value: `stringify` emits a
5
+ * JavaScript module and `stringifyAsTree` a JSON tree. They differ in `const`
6
+ * hoisting and in how a property key is spelled — see `_KeySerialize`.
7
+ *
4
8
  * @module
5
9
  *
6
- * @import { Unknown, Object } from '../types.ts'
10
+ * @import { Unknown, Object, _MapEntries } from '../types.ts'
7
11
  * @import { Fold } from '../../types/function/operator/types.ts'
8
- * @import { Entry as ObjectEntry } from '../../types/object/types.ts'
9
12
  * @import { List } from '../../types/list/types.ts'
10
13
  */
11
14
 
@@ -15,16 +18,13 @@ import { flat, flatMap, map, concat as listConcat } from '../../types/list/modul
15
18
  const { entries } = Object
16
19
  import { compose, fn } from '../../types/function/module.f.mjs'
17
20
  import { serialize as bigintSerialize } from '../../types/bigint/module.f.mjs'
18
- import { objectWrap, arrayWrap, stringSerialize, numberSerialize, nullSerialize, boolSerialize } from '../../media/json/serializer/module.f.mjs'
19
-
20
- const colon = [':']
21
+ import { objectWrap, arrayWrap, colon, stringSerialize, numberSerialize, nullSerialize, boolSerialize } from '../../media/json/serializer/module.f.mjs'
22
+ import { assertNotNullish } from '../../asserts/module.f.mjs'
21
23
 
22
24
  export const undefinedSerialize = ['undefined']
23
25
 
24
26
  /** @typedef {readonly [number, number]} _RefCounter */
25
27
 
26
- /** @typedef {(entries: List<ObjectEntry<Unknown>>) => List<ObjectEntry<Unknown>>} _MapEntries */
27
-
28
28
  /** @typedef {ReadonlyMap<Unknown, _RefCounter>} _Refs */
29
29
 
30
30
  /**
@@ -92,11 +92,43 @@ const entryValue = kv => kv[1]
92
92
  /** @type {_RefLookup} */
93
93
  const noRef = () => null
94
94
 
95
- /** @type {(refLookup: _RefLookup) => (sort: _MapEntries) => (value: Unknown) => List<string>} */
96
- const buildSerialize = refLookup => sort => {
95
+ /**
96
+ * How one output format spells a property key. The two formats disagree about
97
+ * exactly one key, `__proto__`, so the spelling is a parameter of
98
+ * `buildSerialize` rather than a property of the shared JSON helper.
99
+ *
100
+ * @typedef {(key: string) => List<string>} _KeySerialize
101
+ */
102
+
103
+ const protoKey = '__proto__'
104
+
105
+ /**
106
+ * JSON spells every key as a quoted string. `"__proto__"` included: `JSON.parse`
107
+ * has no prototype special case, so the plain spelling already round-trips, and
108
+ * the computed form below is not JSON at all.
109
+ *
110
+ * @type {_KeySerialize}
111
+ */
112
+ const jsonKeySerialize = stringSerialize
113
+
114
+ /**
115
+ * JavaScript reads `{"__proto__": v}` as a prototype assignment, so a module
116
+ * emitting that spelling would not read back the value it was given. The
117
+ * computed form is the only spelling whose evaluation reproduces the property,
118
+ * which makes it a requirement of round-tripping rather than a style choice.
119
+ * See [spec: the `__proto__` key](../../../spec/README.md#the-__proto__-key).
120
+ *
121
+ * @type {_KeySerialize}
122
+ */
123
+ const jsKeySerialize = key => key === protoKey
124
+ ? flat([['['], stringSerialize(key), [']']])
125
+ : stringSerialize(key)
126
+
127
+ /** @type {(keySerialize: _KeySerialize) => (refLookup: _RefLookup) => (sort: _MapEntries) => (value: Unknown) => List<string>} */
128
+ const buildSerialize = keySerialize => refLookup => sort => {
97
129
  /** @type {(kv: readonly [string, Unknown]) => List<string>} */
98
130
  const propertySerialize = ([k, v]) => flat([
99
- stringSerialize(k),
131
+ keySerialize(k),
100
132
  colon,
101
133
  f(v)
102
134
  ])
@@ -128,13 +160,18 @@ const buildSerialize = refLookup => sort => {
128
160
  return f
129
161
  }
130
162
 
131
- /** @type {(mapEntries: _MapEntries) => (value: Unknown) => List<string>} */
132
- export const serializeWithoutConst = buildSerialize(noRef)
163
+ /**
164
+ * Serializes a value as a JSON tree — no `const` hoisting, and JSON's key
165
+ * spelling.
166
+ *
167
+ * @type {(mapEntries: _MapEntries) => (value: Unknown) => List<string>}
168
+ */
169
+ export const serializeWithoutConst = buildSerialize(jsonKeySerialize)(noRef)
133
170
 
134
171
  /** @type {(sort: _MapEntries) => (refs: _Refs) => (root: Unknown) => (djs: Unknown) => List<string>} */
135
172
  const serializeWithConst = sort => refs => {
136
173
  const shared = sharedRef(refs)
137
- return root => buildSerialize(value => {
174
+ return root => buildSerialize(jsKeySerialize)(value => {
138
175
  if (value === root) { return null }
139
176
  const rc = shared(value)
140
177
  if (rc !== undefined) { return [`c${rc[0]}`] }
@@ -179,16 +216,21 @@ const addRef = djs => refs => {
179
216
  return new Map([...refs, [djs, newCounter]])
180
217
  }
181
218
 
182
- /** @type {(sort: _MapEntries) => (djs: Unknown) => string} */
219
+ /**
220
+ * Serializes a value as a JavaScript module: a shared value becomes a `const`,
221
+ * and a `__proto__` key is written in the computed form the language requires.
222
+ *
223
+ * @type {(sort: _MapEntries) => (djs: Unknown) => string}
224
+ */
183
225
  export const stringify = sort => djs => {
184
226
  const refs = countRefs(djs)
185
227
  const consts = getConstants(refs)(djs)
228
+ // `consts` only ever holds values `getConstants` found `shared` for, i.e.
229
+ // values with an entry already in `refs` — so `refs.get(entry)` here is
230
+ // always defined.
186
231
  /** @type {(entry: Unknown) => List<string>} */
187
232
  const constSerialize = entry => {
188
- const refCounter = refs.get(entry)
189
- if (refCounter === undefined) {
190
- throw 'unexpected behavior'
191
- }
233
+ const refCounter = assertNotNullish(refs.get(entry))
192
234
  return flat([['const c'], numberSerialize(refCounter[0]), [' = '], serializeWithConst(sort)(refs)(entry)(entry), ['\n']])
193
235
  }
194
236
  const constStrings = flatMap(constSerialize)(consts)
@@ -196,7 +238,12 @@ export const stringify = sort => djs => {
196
238
  return concat(listConcat(constStrings)(rootStrings))
197
239
  }
198
240
 
199
- /** @type {(mapEntries: _MapEntries) => (value: Unknown) => string} */
241
+ /**
242
+ * Serializes a value as a JSON tree: shared values are expanded, and keys keep
243
+ * JSON's plain spelling.
244
+ *
245
+ * @type {(mapEntries: _MapEntries) => (value: Unknown) => string}
246
+ */
200
247
  export const stringifyAsTree = sort => compose(serializeWithoutConst(sort))(concat)
201
248
 
202
249
 
@@ -12,6 +12,11 @@ export declare const proof: {
12
12
  testSort: () => void;
13
13
  testIdentity: () => void;
14
14
  })[];
15
+ protoKey: {
16
+ module: () => void;
17
+ moduleShared: () => void;
18
+ json: () => void;
19
+ };
15
20
  stringifyAsTree: ({
16
21
  sort: () => void;
17
22
  identity: () => void;
@@ -1,5 +1,5 @@
1
1
  import { countRefs, stringify, stringifyAsTree } from './module.f.mjs'
2
- import { sort } from '../../types/object/module.f.mjs'
2
+ import { fromEntries, sort } from '../../types/object/module.f.mjs'
3
3
  import { identity } from '../../types/function/module.f.mjs'
4
4
  import { setProperty } from '../../media/json/module.f.mjs'
5
5
  import { assertEq } from '../../asserts/module.f.mjs'
@@ -55,6 +55,28 @@ export const proof = {
55
55
  },
56
56
  }
57
57
  ],
58
+ // The one key the two output formats spell differently. A `__proto__`
59
+ // property is built with `fromEntries` because an object literal cannot
60
+ // hold one: `{__proto__: 3}` assigns a prototype instead (#2480).
61
+ protoKey: {
62
+ // JavaScript output: only the computed form evaluates back to the
63
+ // property, so the module emitter must use it.
64
+ module: () => {
65
+ const res = stringify(sort)(fromEntries([['__proto__', 3]]))
66
+ assertEq(res, 'export default {["__proto__"]:3}')
67
+ },
68
+ moduleShared: () => {
69
+ const shared = fromEntries([['__proto__', 3]])
70
+ const res = stringify(sort)([shared, shared])
71
+ assertEq(res, 'const c0 = {["__proto__"]:3}\nexport default [c0,c0]')
72
+ },
73
+ // JSON output: `JSON.parse` has no prototype special case, so the plain
74
+ // spelling already round-trips — and the computed form is not JSON.
75
+ json: () => {
76
+ const res = stringifyAsTree(sort)(fromEntries([['__proto__', 3]]))
77
+ assertEq(res, '{"__proto__":3}')
78
+ },
79
+ },
58
80
  stringifyAsTree: [
59
81
  {
60
82
  sort: () => {
@@ -3,13 +3,11 @@
3
3
  *
4
4
  * @module
5
5
  *
6
+ * @import { Ast, AstSequence, AstTag } from '../../bnf/matcher/types.ts'
6
7
  * @import {
7
- * AstRuleMeta,
8
- * AstSequenceMeta,
9
- * AstTag,
10
8
  * CodePointMeta,
11
9
  * DescentMatch,
12
- * DescentMatchResult
10
+ * DescentMatchResult,
13
11
  * } from '../../bnf/descent/types.ts'
14
12
  * @import { DataRule, Rule } from '../../bnf/types.ts'
15
13
  * @import {
@@ -29,8 +27,9 @@
29
27
  * @import { CodePoint } from '../../text/utf16/types.ts'
30
28
  * @import { StateScan } from '../../types/function/operator/types.ts'
31
29
  * @import { List } from '../../types/list/types.ts'
32
- * @import { Unknown } from '../types.ts'
33
30
  * @import { DjsToken, DjsTokenWithMetadata } from './types.ts'
31
+ * @import { TriviaKind } from '../../js/tokenizer/types.ts'
32
+ * @import { Nullable } from '../../types/nullable/types.ts'
34
33
  */
35
34
  import type { CodePointMeta, DescentMatch, DescentMatchResult } from '../../bnf/descent/types.ts';
36
35
  import type { Rule } from '../../bnf/types.ts';
@@ -40,6 +39,16 @@ import type { List } from '../../types/list/types.ts';
40
39
  import type { DjsTokenWithMetadata } from './types.ts';
41
40
  /** @type {() => Rule} */
42
41
  export declare const jsGrammar: () => Rule;
42
+ /**
43
+ * The whole-file matcher together with the name of the rule to start it at.
44
+ *
45
+ * `toData` generates rule names, so the entry name belongs to the conversion
46
+ * rather than to the grammar's spelling and is read back from it here. Building
47
+ * both from one conversion also keeps the grammar built once per matcher.
48
+ *
49
+ * @type {<T>() => readonly [DescentMatch<T>, string]}
50
+ */
51
+ export declare const jsMatcher: <T>() => readonly [DescentMatch<T>, string];
43
52
  /** @type {(m: DescentMatch<unknown>, name: string, cp: readonly CodePoint[]) => DescentMatchResult<unknown>} */
44
53
  export declare const descentParserCpOnly: (m: DescentMatch<unknown>, name: string, cp: readonly CodePoint[]) => DescentMatchResult<unknown>;
45
54
  export type _Token = [string, TokenMetadata, readonly number[]];
@@ -63,3 +72,6 @@ export type _DjsScanState = {
63
72
  };
64
73
  /** @type {(input: List<number>) => (path: string) => List<DjsTokenWithMetadata>} */
65
74
  export declare const tokenize: (input: List<number>) => (path: string) => List<DjsTokenWithMetadata>;
75
+ export declare const proof: {
76
+ tagToTokenTrueTag: () => void;
77
+ };