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
@@ -10,7 +10,7 @@
10
10
  * @import { OrderedMap } from '../../types/ordered_map/types.ts'
11
11
  * @import { AstArray, AstConst, AstModule, AstModuleRef } from '../ast/types.ts'
12
12
  * @import { TokenMetadata } from '../../js/tokenizer/types.ts'
13
- * @import { ParseError } from './types.ts'
13
+ * @import { ParseError, _ValueToken } from './types.ts'
14
14
  */
15
15
 
16
16
  import { error, ok } from '../../types/result/module.f.mjs'
@@ -60,10 +60,22 @@ import { assertEq } from '../../asserts/module.f.mjs'
60
60
  * readonly module: _ModuleState
61
61
  * }} _ExportState */
62
62
 
63
+ /**
64
+ * Where the value parser stands inside the value it is reading.
65
+ *
66
+ * The object states spell a property out left to right: `'{'` expects a key,
67
+ * `'{k'` the `:` after one, `'{:'` the value, `'{v'` the `,` or `}` after it,
68
+ * and `'{,'` the next key. A computed key `["a"]` takes the two extra steps
69
+ * `'{['` (the string inside the brackets) and `'{[k'` (the closing `]`), then
70
+ * rejoins the plain path at `'{k'`.
71
+ *
72
+ * @typedef {'' | '[' | '[v' | '[,' | '{' | '{[' | '{[k' | '{k' | '{:' | '{v' | '{,'} _ValueState
73
+ */
74
+
63
75
  /** @typedef {{
64
76
  * readonly state: 'constValue' | 'exportValue'
65
77
  * readonly module: _ModuleState
66
- * readonly valueState: '' | '[' | '[v' | '[,' | '{' | '{k' | '{:' | '{v' | '{,'
78
+ * readonly valueState: _ValueState
67
79
  * readonly top: _DjsStackElement | null
68
80
  * readonly stack: _DjsStack
69
81
  * }} _ParseValueState */
@@ -78,7 +90,21 @@ import { assertEq } from '../../asserts/module.f.mjs'
78
90
  * readonly error: ParseError
79
91
  * }} _ErrorState */
80
92
 
81
- /** @type {(token: DjsTokenWithMetadata) => (state: _InitialState) => _ParserState} */
93
+ /**
94
+ * A statement begins with `import`, `const`, or `export` and with nothing
95
+ * else. The three are a whitelist that grows as the language does, not a
96
+ * closed set; what a statement may never begin with is a **value**. A text
97
+ * that does — `42`, `[1,2]`, `{"a":1}` — is a JSON document, and reading it
98
+ * as a module would give it a value no JavaScript engine gives it: as
99
+ * JavaScript `{"a":1}` does not parse at all, and `[1,2]` is an expression
100
+ * statement exporting nothing.
101
+ *
102
+ * The statements are also ordered: every `import` precedes every `const`, and
103
+ * `export default` ends the module. `eof` here is a module with no
104
+ * `export default`, which is what "unexpected end" reports.
105
+ *
106
+ * @type {(token: DjsTokenWithMetadata) => (state: _InitialState) => _ParserState}
107
+ */
82
108
  const parseInitialOp = ({ token, metadata }) => state => {
83
109
  switch (token.kind)
84
110
  {
@@ -88,13 +114,17 @@ const parseInitialOp = ({ token, metadata }) => state => {
88
114
  case '/*': return state
89
115
  case 'id': {
90
116
  switch (token.value) {
91
- case 'import': return { ...state, state: 'import' }
117
+ case 'import': return length(state.module.consts) === 0
118
+ ? { ...state, state: 'import' }
119
+ : { state: 'error', error: { message: 'import must come before const', metadata } }
92
120
  case 'const': return { ...state, state: 'const' }
93
121
  case 'export': return { ...state, state: 'export' }
94
122
  }
123
+ break
95
124
  }
125
+ case 'eof': return { state: 'error', error: { message: 'unexpected end', metadata } }
96
126
  }
97
- return foldOp({ token, metadata })({ ...state, state: 'exportValue', valueState: '', top: null, stack: null })
127
+ return { state: 'error', error: { message: 'unexpected token', metadata } }
98
128
  }
99
129
 
100
130
  /** @type {(token: DjsTokenWithMetadata) => (state: _NewLineRequiredState) => _ParserState} */
@@ -230,12 +260,34 @@ const addValueToObject = obj => value => (['object', setReplace(obj[2])(value)(o
230
260
  /** @type {(array: _DjsStackArray) => (value: AstConst) => _DjsStackArray} */
231
261
  const addToArray = array => value => (['array', concat(array[1])([value])])
232
262
 
233
- /** @type {(state: _ParseValueState) => (key: string) => (metadata: TokenMetadata) => _ParserState} */
234
- const pushKey = state => key => metadata => {
235
- if (state.top?.[0] === 'object') { return { ...state, valueState: '{k', top: addKeyToObject(state.top)(key), stack: state.stack } }
263
+ /**
264
+ * The key of `{ __proto__: v }` and `{ "__proto__": v }`. JavaScript reads
265
+ * both as an instruction to replace the object's prototype instead of as a
266
+ * property, so FunctionalScript rejects them and accepts only the computed
267
+ * spelling `{ ["__proto__"]: v }`, which denotes an ordinary property.
268
+ * See [spec: the `__proto__` key](../../../spec/README.md#the-__proto__-key).
269
+ */
270
+ const protoKey = '__proto__'
271
+
272
+ /** @type {(valueState: _ValueState) => (state: _ParseValueState) => (key: string) => (metadata: TokenMetadata) => _ParserState} */
273
+ const pushKey = valueState => state => key => metadata => {
274
+ if (state.top?.[0] === 'object') { return { ...state, valueState, top: addKeyToObject(state.top)(key), stack: state.stack } }
236
275
  return { state: 'error', error: { message: 'error', metadata } }
237
276
  }
238
277
 
278
+ /**
279
+ * A key written as an identifier or a string literal, which is every key but
280
+ * the computed one — so this is where `__proto__` is refused. A JSON document
281
+ * spells that key the same way and means an ordinary property by it, but a
282
+ * JSON document is not a module and this parser does not read one
283
+ * ([spec: the `__proto__` key](../../../spec/README.md#the-__proto__-key)).
284
+ *
285
+ * @type {(state: _ParseValueState) => (key: string) => (metadata: TokenMetadata) => _ParserState}
286
+ */
287
+ const pushPlainKey = state => key => metadata => key === protoKey
288
+ ? { state: 'error', error: { message: '__proto__ requires the computed key form', metadata } }
289
+ : pushKey('{k')(state)(key)(metadata)
290
+
239
291
  /** @type {(state: _ParseValueState) => (value: AstConst) => _ParserState} */
240
292
  const pushValue = state => value => {
241
293
  if (state.top === null) {
@@ -302,7 +354,12 @@ const endObject = state => {
302
354
  return pushValue(newState)(obj)
303
355
  }
304
356
 
305
- /** @type {(token: DjsToken) => AstConst} */
357
+ /**
358
+ * Only ever called on a token `isValueToken` has already confirmed carries a
359
+ * value, so the switch covers every `_ValueToken` case with no fallback arm.
360
+ *
361
+ * @type {(token: _ValueToken) => AstConst}
362
+ */
306
363
  const tokenToValue = token => {
307
364
  switch (token.kind) {
308
365
  case 'null': return null
@@ -312,11 +369,13 @@ const tokenToValue = token => {
312
369
  case 'string': return token.value
313
370
  case 'bigint': return token.value
314
371
  case 'undefined': return undefined
315
- default: return null
316
372
  }
317
373
  }
318
374
 
319
- /** @type {(token: DjsToken) => boolean} */
375
+ /**
376
+ * @param {DjsToken} token
377
+ * @returns {token is _ValueToken}
378
+ */
320
379
  const isValueToken = token => {
321
380
  switch (token.kind) {
322
381
  case 'null':
@@ -391,7 +450,8 @@ const parseObjectStartOp = ({ token, metadata }) => state => {
391
450
  {
392
451
  case 'string':
393
452
  case 'id':
394
- return pushKey(state)(String(token.value))(metadata)
453
+ return pushPlainKey(state)(token.value)(metadata)
454
+ case '[': return { ...state, valueState: '{[' }
395
455
  case '}': return endObject(state)
396
456
  case 'ws':
397
457
  case 'nl':
@@ -402,6 +462,35 @@ const parseObjectStartOp = ({ token, metadata }) => state => {
402
462
  }
403
463
  }
404
464
 
465
+ // computed property keys with a constant string key (#2470)
466
+ /** @type {(token: DjsTokenWithMetadata) => (state: _ParseValueState) => _ParserState} */
467
+ const parseObjectComputedKeyOp = ({ token, metadata }) => state => {
468
+ switch (token.kind)
469
+ {
470
+ case 'string': return pushKey('{[k')(state)(token.value)(metadata)
471
+ case 'ws':
472
+ case 'nl':
473
+ case '//':
474
+ case '/*': return state
475
+ case 'eof': return { state: 'error', error: { message: 'unexpected end', metadata } }
476
+ default: return { state: 'error', error: { message: 'unexpected token', metadata } }
477
+ }
478
+ }
479
+
480
+ /** @type {(token: DjsTokenWithMetadata) => (state: _ParseValueState) => _ParserState} */
481
+ const parseObjectComputedKeyEndOp = ({ token, metadata }) => state => {
482
+ switch (token.kind)
483
+ {
484
+ case ']': return { ...state, valueState: '{k' }
485
+ case 'ws':
486
+ case 'nl':
487
+ case '//':
488
+ case '/*': return state
489
+ case 'eof': return { state: 'error', error: { message: 'unexpected end', metadata } }
490
+ default: return { state: 'error', error: { message: 'unexpected token', metadata } }
491
+ }
492
+ }
493
+
405
494
  /** @type {(token: DjsTokenWithMetadata) => (state: _ParseValueState) => _ParserState} */
406
495
  const parseObjectKeyOp = ({ token, metadata }) => state => {
407
496
  switch (token.kind)
@@ -455,7 +544,8 @@ const parseObjectCommaOp = ({ token, metadata }) => state => {
455
544
  case '}': return endObject(state)
456
545
  case 'string':
457
546
  case 'id':
458
- return pushKey(state)(String(token.value))(metadata)
547
+ return pushPlainKey(state)(token.value)(metadata)
548
+ case '[': return { ...state, valueState: '{[' }
459
549
  case 'ws':
460
550
  case 'nl':
461
551
  case '//':
@@ -488,6 +578,8 @@ const foldOp = token => state => {
488
578
  case '[v': return parseArrayValueOp(token)(state)
489
579
  case '[,': return parseValueOp(token)(state)
490
580
  case '{': return parseObjectStartOp(token)(state)
581
+ case '{[': return parseObjectComputedKeyOp(token)(state)
582
+ case '{[k': return parseObjectComputedKeyEndOp(token)(state)
491
583
  case '{k': return parseObjectKeyOp(token)(state)
492
584
  case '{:': return parseObjectColonOp(token)(state)
493
585
  case '{v': return parseObjectNextOp(token)(state)
@@ -497,11 +589,20 @@ const foldOp = token => state => {
497
589
  }
498
590
  }
499
591
 
500
- /** @type {(tokenList: List<DjsTokenWithMetadata>) => Result<AstModule, ParseError>} */
592
+ /**
593
+ * Reads the token list as a FunctionalScript module: `import` statements, then
594
+ * `const` statements, then one `export default`.
595
+ *
596
+ * This is the only language the parser reads. A JSON document is data, not a
597
+ * module, and `fjs/media/json` is its reader
598
+ * ([spec: JSON input](../../../spec/README.md#json-input)).
599
+ *
600
+ * @type {(tokenList: List<DjsTokenWithMetadata>) => Result<AstModule, ParseError>}
601
+ */
501
602
  export const parseFromTokens = tokenList => {
502
603
  const state = fold(foldOp)({ state: '', module: { refs: null, modules: null, consts: null } })(tokenList)
503
604
  switch (state.state) {
504
- case 'result': return ok(/** @type {AstModule} */ ([toArray(state.module.modules), toArray(state.module.consts)]))
605
+ case 'result': return ok(/** @satisfies {AstModule} */ ([toArray(state.module.modules), toArray(state.module.consts)]))
505
606
  case 'error': return error(state.error)
506
607
  default: return error({ message: 'unexpected end', metadata: null })
507
608
  }
@@ -522,7 +623,7 @@ export const proof = {
522
623
  top: null,
523
624
  stack: null,
524
625
  }
525
- const result = pushKey(state)('key')({ path: 'test', line: 0, column: 0 })
626
+ const result = pushKey('{k')(state)('key')({ path: 'test', line: 0, column: 0 })
526
627
  assertEq(result.state, 'error')
527
628
  },
528
629
  },
@@ -544,4 +645,22 @@ export const proof = {
544
645
  assertEq(result.state, 'result')
545
646
  },
546
647
  },
648
+ endObject: {
649
+ // `endObject` is only ever invoked while `state.top` is an object
650
+ // (the `'{'`/`'{k'`/`'{:'`/`'{v'`/`'{,'` value-states guarantee it),
651
+ // so its non-object guard is a defensive branch unreachable through
652
+ // `parseFromTokens`. Call it directly to cover that branch.
653
+ nonObjectTop: () => {
654
+ /** @type {_ParseValueState} */
655
+ const state = {
656
+ state: 'exportValue',
657
+ module: { refs: null, modules: null, consts: null },
658
+ valueState: '{,',
659
+ top: null,
660
+ stack: null,
661
+ }
662
+ const result = endObject(state)
663
+ assertEq(result.state, 'result')
664
+ },
665
+ },
547
666
  }
@@ -1,9 +1,16 @@
1
+ /**
2
+ * @import { DjsTokenWithMetadata } from '../tokenizer/types.ts'
3
+ */
1
4
  export declare const proof: {
2
5
  valid: (() => void)[];
6
+ computedKey: (() => void)[];
7
+ invalidComputedKey: (() => void)[];
8
+ protoKey: (() => void)[];
3
9
  invalid: (() => void)[];
4
10
  errorMetadata: (() => void)[];
5
11
  validWhiteSpaces: (() => void)[];
6
- validJson: (() => void)[];
12
+ jsonDocumentIsNotAModule: (() => void)[];
13
+ statementOrder: (() => void)[];
7
14
  invalidModule: (() => void)[];
8
15
  validWithConst: (() => void)[];
9
16
  invalidWithConst: (() => void)[];
@@ -1,6 +1,9 @@
1
+ /**
2
+ * @import { DjsTokenWithMetadata } from '../tokenizer/types.ts'
3
+ */
4
+
1
5
  import { parseFromTokens } from './module.f.mjs'
2
6
  import { tokenize } from '../tokenizer/module.f.mjs'
3
- /** @import { DjsTokenWithMetadata } from '../tokenizer/types.ts' */
4
7
  import { toArray } from '../../types/list/module.f.mjs'
5
8
  import { sort } from '../../types/object/module.f.mjs'
6
9
  import { stringToList } from '../../text/utf16/module.f.mjs'
@@ -156,6 +159,108 @@ export const proof = {
156
159
  if (result !== '[[],[{"a":1}]]') { throw result }
157
160
  }
158
161
  ],
162
+ // A computed key `["a"]` is a third spelling of an ordinary key, next to
163
+ // the identifier and the string literal (#2470).
164
+ computedKey: [
165
+ () => {
166
+ const tokenList = tokenizeString('export default {["a"]:1}')
167
+ const obj = parseFromTokens(tokenList)
168
+ assert(obj[0] === 'ok', obj)
169
+ const result = stringifyDjsModule(obj[1])
170
+ assertEq(result, '[[],[{"a":1}]]')
171
+ },
172
+ () => {
173
+ // all three spellings in one object, plus a trailing comma
174
+ const tokenList = tokenizeString('export default {a:1,"b":2,["c"]:3,}')
175
+ const obj = parseFromTokens(tokenList)
176
+ assert(obj[0] === 'ok', obj)
177
+ const result = stringifyDjsModule(obj[1])
178
+ assertEq(result, '[[],[{"a":1,"b":2,"c":3}]]')
179
+ },
180
+ () => {
181
+ // trivia is trivia inside the brackets too
182
+ const tokenList = tokenizeString('export default { [ /* c */ \n // c \n "a" /* c */ \n // c \n ] : 1 }')
183
+ const obj = parseFromTokens(tokenList)
184
+ assert(obj[0] === 'ok', obj)
185
+ const result = stringifyDjsModule(obj[1])
186
+ assertEq(result, '[[],[{"a":1}]]')
187
+ },
188
+ () => {
189
+ // the key that has no other spelling
190
+ const tokenList = tokenizeString('export default {["__proto__"]:{"a":42}}')
191
+ const obj = parseFromTokens(tokenList)
192
+ assert(obj[0] === 'ok', obj)
193
+ const result = stringifyDjsModule(obj[1])
194
+ assertEq(result, '[[],[{"__proto__":{"a":42}}]]')
195
+ },
196
+ ],
197
+ invalidComputedKey: [
198
+ () => {
199
+ // the brackets hold a string literal, not a number
200
+ const tokenList = tokenizeString('export default {[1]:2}')
201
+ const obj = parseFromTokens(tokenList)
202
+ assert(obj[0] === 'error', obj)
203
+ assertEq(obj[1].message, 'unexpected token')
204
+ },
205
+ () => {
206
+ // eof inside the brackets, before the key
207
+ const tokenList = tokenizeString('export default {[')
208
+ const obj = parseFromTokens(tokenList)
209
+ assert(obj[0] === 'error', obj)
210
+ assertEq(obj[1].message, 'unexpected end')
211
+ },
212
+ () => {
213
+ // the brackets are not closed
214
+ const tokenList = tokenizeString('export default {["a"}')
215
+ const obj = parseFromTokens(tokenList)
216
+ assert(obj[0] === 'error', obj)
217
+ assertEq(obj[1].message, 'unexpected token')
218
+ },
219
+ () => {
220
+ // eof after the key, before ']'
221
+ const tokenList = tokenizeString('export default {["a"')
222
+ const obj = parseFromTokens(tokenList)
223
+ assert(obj[0] === 'error', obj)
224
+ assertEq(obj[1].message, 'unexpected end')
225
+ },
226
+ () => {
227
+ // a computed key still needs its ':'
228
+ const tokenList = tokenizeString('export default {["a"]}')
229
+ const obj = parseFromTokens(tokenList)
230
+ assert(obj[0] === 'error', obj)
231
+ assertEq(obj[1].message, 'unexpected token')
232
+ },
233
+ ],
234
+ // `{__proto__: v}` and `{"__proto__": v}` assign a prototype in JavaScript
235
+ // instead of adding a property, so FunctionalScript rejects both spellings
236
+ // and accepts only the computed one (#2480).
237
+ protoKey: [
238
+ () => {
239
+ const tokenList = tokenizeString('export default {__proto__:1}')
240
+ const obj = parseFromTokens(tokenList)
241
+ assert(obj[0] === 'error', obj)
242
+ assertEq(obj[1].message, '__proto__ requires the computed key form')
243
+ },
244
+ () => {
245
+ const tokenList = tokenizeString('export default {"__proto__":1}')
246
+ const obj = parseFromTokens(tokenList)
247
+ assert(obj[0] === 'error', obj)
248
+ assertEq(obj[1].message, '__proto__ requires the computed key form')
249
+ },
250
+ () => {
251
+ // the same two spellings after a ',', the parser's other key state
252
+ const tokenList = tokenizeString('export default {"a":1,__proto__:2}')
253
+ const obj = parseFromTokens(tokenList)
254
+ assert(obj[0] === 'error', obj)
255
+ assertEq(obj[1].message, '__proto__ requires the computed key form')
256
+ },
257
+ () => {
258
+ const tokenList = tokenizeString('export default {"a":1,"__proto__":2}')
259
+ const obj = parseFromTokens(tokenList)
260
+ assert(obj[0] === 'error', obj)
261
+ assertEq(obj[1].message, '__proto__ requires the computed key form')
262
+ },
263
+ ],
159
264
  invalid: [
160
265
  () => {
161
266
  const tokenList = tokenizeString('export default')
@@ -297,6 +402,115 @@ export const proof = {
297
402
  assert(obj[0] === 'error', obj)
298
403
  assertEq(obj[1].message, 'unexpected token')
299
404
  },
405
+ () => {
406
+ // 'export' with no 'default' before eof.
407
+ const tokenList = tokenizeString('export')
408
+ const obj = parseFromTokens(tokenList)
409
+ assert(obj[0] === 'error', obj)
410
+ assertEq(obj[1].message, 'unexpected end')
411
+ },
412
+ () => {
413
+ // 'const' with no name before eof.
414
+ const tokenList = tokenizeString('const')
415
+ const obj = parseFromTokens(tokenList)
416
+ assert(obj[0] === 'error', obj)
417
+ assertEq(obj[1].message, 'unexpected end')
418
+ },
419
+ () => {
420
+ // 'const <name>' with no '=' before eof.
421
+ const tokenList = tokenizeString('const x')
422
+ const obj = parseFromTokens(tokenList)
423
+ assert(obj[0] === 'error', obj)
424
+ assertEq(obj[1].message, 'unexpected end')
425
+ },
426
+ () => {
427
+ // 'const <name>' followed by a token that isn't '='.
428
+ const tokenList = tokenizeString('const x 5')
429
+ const obj = parseFromTokens(tokenList)
430
+ assert(obj[0] === 'error', obj)
431
+ assertEq(obj[1].message, 'unexpected token')
432
+ },
433
+ () => {
434
+ // 'import' with no name before eof.
435
+ const tokenList = tokenizeString('import')
436
+ const obj = parseFromTokens(tokenList)
437
+ assert(obj[0] === 'error', obj)
438
+ assertEq(obj[1].message, 'unexpected end')
439
+ },
440
+ () => {
441
+ // 'import' followed by a token that isn't an id.
442
+ const tokenList = tokenizeString('import 5')
443
+ const obj = parseFromTokens(tokenList)
444
+ assert(obj[0] === 'error', obj)
445
+ assertEq(obj[1].message, 'unexpected token')
446
+ },
447
+ () => {
448
+ // 'import <name>' with no 'from' before eof.
449
+ const tokenList = tokenizeString('import a')
450
+ const obj = parseFromTokens(tokenList)
451
+ assert(obj[0] === 'error', obj)
452
+ assertEq(obj[1].message, 'unexpected end')
453
+ },
454
+ () => {
455
+ // 'import <name> from' with no module string before eof.
456
+ const tokenList = tokenizeString('import a from')
457
+ const obj = parseFromTokens(tokenList)
458
+ assert(obj[0] === 'error', obj)
459
+ assertEq(obj[1].message, 'unexpected end')
460
+ },
461
+ () => {
462
+ // Array opened but eof arrives before any value/']'.
463
+ const tokenList = tokenizeString('export default [')
464
+ const obj = parseFromTokens(tokenList)
465
+ assert(obj[0] === 'error', obj)
466
+ assertEq(obj[1].message, 'unexpected end')
467
+ },
468
+ () => {
469
+ // Object opened but eof arrives before any key/'}'.
470
+ const tokenList = tokenizeString('export default {')
471
+ const obj = parseFromTokens(tokenList)
472
+ assert(obj[0] === 'error', obj)
473
+ assertEq(obj[1].message, 'unexpected end')
474
+ },
475
+ () => {
476
+ // Object key given but eof arrives before ':'.
477
+ const tokenList = tokenizeString('export default {"a"')
478
+ const obj = parseFromTokens(tokenList)
479
+ assert(obj[0] === 'error', obj)
480
+ assertEq(obj[1].message, 'unexpected end')
481
+ },
482
+ () => {
483
+ // Object ':' given but eof arrives before the value.
484
+ const tokenList = tokenizeString('export default {"a":')
485
+ const obj = parseFromTokens(tokenList)
486
+ assert(obj[0] === 'error', obj)
487
+ assertEq(obj[1].message, 'unexpected end')
488
+ },
489
+ () => {
490
+ // Object value given, followed by a token that's neither ',' nor '}'.
491
+ const tokenList = tokenizeString('export default {"a":1 2}')
492
+ const obj = parseFromTokens(tokenList)
493
+ assert(obj[0] === 'error', obj)
494
+ assertEq(obj[1].message, 'unexpected token')
495
+ },
496
+ () => {
497
+ // Object ',' given but eof arrives before the next key/'}'.
498
+ const tokenList = tokenizeString('export default {"a":1,')
499
+ const obj = parseFromTokens(tokenList)
500
+ assert(obj[0] === 'error', obj)
501
+ assertEq(obj[1].message, 'unexpected end')
502
+ },
503
+ () => {
504
+ // `parseFromTokens` itself, called with no tokens at all (the
505
+ // tokenizer never produces this — it always emits at least an
506
+ // `eof` token — but the exported function's own contract must
507
+ // still handle it: the initial state is neither 'result' nor
508
+ // 'error', so it falls through to the same "unexpected end".
509
+ const obj = parseFromTokens(null)
510
+ assert(obj[0] === 'error', obj)
511
+ assertEq(obj[1].message, 'unexpected end')
512
+ assertEq(obj[1].metadata, null)
513
+ },
300
514
  ],
301
515
  errorMetadata: [
302
516
  () => {
@@ -340,41 +554,92 @@ export const proof = {
340
554
  if (result !== '[[],[{"a":0,"b":1}]]') { throw result }
341
555
  },
342
556
  ],
343
- validJson:[
557
+ // A JSON document is not a module: a statement begins with `import`,
558
+ // `const`, or `export` and never with a value. `fjs/media/json` is the
559
+ // reader for these texts.
560
+ jsonDocumentIsNotAModule: [
344
561
  () => {
345
562
  const tokenList = tokenizeString('null')
346
563
  const obj = parseFromTokens(tokenList)
347
- assert(obj[0] === 'ok', obj)
348
- const result = stringifyDjsModule(obj[1])
349
- assertEq(result, '[[],[null]]')
564
+ assert(obj[0] === 'error', obj)
565
+ assertEq(obj[1].message, 'unexpected token')
350
566
  },
351
567
  () => {
352
568
  const tokenList = tokenizeString('1')
353
569
  const obj = parseFromTokens(tokenList)
354
- assert(obj[0] === 'ok', obj)
355
- const result = stringifyDjsModule(obj[1])
356
- assertEq(result, '[[],[1]]')
570
+ assert(obj[0] === 'error', obj)
571
+ assertEq(obj[1].message, 'unexpected token')
357
572
  },
358
573
  () => {
359
574
  const tokenList = tokenizeString('[]')
360
575
  const obj = parseFromTokens(tokenList)
361
- assert(obj[0] === 'ok', obj)
362
- const result = stringifyDjsModule(obj[1])
363
- assertEq(result, '[[],[["array",[]]]]')
576
+ assert(obj[0] === 'error', obj)
577
+ assertEq(obj[1].message, 'unexpected token')
364
578
  },
365
579
  () => {
366
580
  const tokenList = tokenizeString('{"valid":"json"}')
367
581
  const obj = parseFromTokens(tokenList)
582
+ assert(obj[0] === 'error', obj)
583
+ assertEq(obj[1].message, 'unexpected token')
584
+ },
585
+ () => {
586
+ // an identifier that is not a statement keyword is no better
587
+ const tokenList = tokenizeString('a')
588
+ const obj = parseFromTokens(tokenList)
589
+ assert(obj[0] === 'error', obj)
590
+ assertEq(obj[1].message, 'unexpected token')
591
+ },
592
+ () => {
593
+ // an empty module has no `export default`
594
+ const tokenList = tokenizeString('')
595
+ const obj = parseFromTokens(tokenList)
596
+ assert(obj[0] === 'error', obj)
597
+ assertEq(obj[1].message, 'unexpected end')
598
+ },
599
+ () => {
600
+ // …and neither has one that only declares constants
601
+ const tokenList = tokenizeString('const a = 1\n')
602
+ const obj = parseFromTokens(tokenList)
603
+ assert(obj[0] === 'error', obj)
604
+ assertEq(obj[1].message, 'unexpected end')
605
+ },
606
+ ],
607
+ // Statements are ordered: imports, then constants, then `export default`.
608
+ statementOrder: [
609
+ () => {
610
+ const tokenList = tokenizeString('import a from "a.f.js" \n const b = 1 \n export default [a,b]')
611
+ const obj = parseFromTokens(tokenList)
368
612
  assert(obj[0] === 'ok', obj)
369
613
  const result = stringifyDjsModule(obj[1])
370
- if (result !== '[[],[{"valid":"json"}]]') { throw result }
371
- }
614
+ assertEq(result, '[["a.f.js"],[1,["array",[["aref",0],["cref",0]]]]]')
615
+ },
616
+ () => {
617
+ const tokenList = tokenizeString('const b = 1 \n import a from "a.f.js" \n export default [a,b]')
618
+ const obj = parseFromTokens(tokenList)
619
+ assert(obj[0] === 'error', obj)
620
+ assertEq(obj[1].message, 'import must come before const')
621
+ },
622
+ () => {
623
+ // nothing follows `export default` but trivia
624
+ const tokenList = tokenizeString('export default 1 \n const a = 2')
625
+ const obj = parseFromTokens(tokenList)
626
+ assert(obj[0] === 'error', obj)
627
+ assertEq(obj[1].message, 'unexpected token')
628
+ },
372
629
  ],
373
630
  invalidModule:[
374
631
  () => {
632
+ // `module` is not one of the statement keywords
375
633
  const tokenList = tokenizeString('module=null')
376
634
  const obj = parseFromTokens(tokenList)
377
635
  assert(obj[0] === 'error', obj)
636
+ assertEq(obj[1].message, 'unexpected token', obj)
637
+ },
638
+ () => {
639
+ // a reference the module never declared, in a value position
640
+ const tokenList = tokenizeString('export default a')
641
+ const obj = parseFromTokens(tokenList)
642
+ assert(obj[0] === 'error', obj)
378
643
  assertEq(obj[1].message, 'const not found', obj)
379
644
  },
380
645
  () => {
@@ -439,6 +704,15 @@ export const proof = {
439
704
  assert(obj[0] === 'error', obj)
440
705
  assertEq(obj[1].message, 'duplicate id', obj)
441
706
  },
707
+ () => {
708
+ // No newline after the const's value: the parser hits `eof` while
709
+ // still in the newline-required state, instead of the following
710
+ // `nl` token every other `const` test provides.
711
+ const tokenList = tokenizeString('const a = 1')
712
+ const obj = parseFromTokens(tokenList)
713
+ assert(obj[0] === 'error', obj)
714
+ assertEq(obj[1].message, 'unexpected end', obj)
715
+ },
442
716
  ],
443
717
  validWithArgs:[
444
718
  () => {
@@ -1,11 +1,17 @@
1
1
  /**
2
2
  * Type-level API for `fjs/djs/parser/module.f.mjs`: the `ParseError` shape
3
- * `parseFromTokens` reports.
3
+ * `parseFromTokens` reports, and the `_ValueToken` subset `tokenToValue`
4
+ * accepts.
4
5
  *
5
6
  * @module
6
7
  */
7
8
  import type { TokenMetadata } from '../../js/tokenizer/types.ts';
9
+ import type { DjsToken } from '../tokenizer/types.ts';
8
10
  export type ParseError = {
9
11
  readonly message: string;
10
12
  readonly metadata: TokenMetadata | null;
11
13
  };
14
+ /** DJS tokens that carry a directly-usable value. */
15
+ export type _ValueToken = Extract<DjsToken, {
16
+ readonly kind: 'null' | 'false' | 'true' | 'undefined' | 'string' | 'number' | 'bigint';
17
+ }>;