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
@@ -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,11 +27,14 @@
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
 
36
- import { descentParser } from '../../bnf/descent/module.f.mjs'
35
+ import { assert, assertEq } from '../../asserts/module.f.mjs'
36
+ import { descentParserRuleSet } from '../../bnf/descent/module.f.mjs'
37
+ import { toData } from '../../bnf/data/module.f.mjs'
37
38
  import {
38
39
  eof,
39
40
  none,
@@ -47,19 +48,17 @@ import {
47
48
  unicodeMax,
48
49
  unicodeRange,
49
50
  } from '../../bnf/module.f.mjs'
50
- import { isKeywordToken } from '../../js/tokenizer/module.f.mjs'
51
- import { multiply } from '../../types/bigfloat/module.f.mjs'
51
+ import { keywords } from '../../js/keywords/module.f.mjs'
52
+ import { isKeywordToken, mergeTrivia } from '../../js/tokenizer/module.f.mjs'
52
53
  import {
53
54
  asterisk, backspace, ht, lf, ff, cr,
54
55
  quotationMark, solidus, reverseSolidus,
55
- digitRange, digit0,
56
- latinCapitalLetterA,
57
- latinSmallLetterA, latinSmallLetterB, latinSmallLetterF,
56
+ hexDigitValue,
57
+ latinSmallLetterB, latinSmallLetterF,
58
58
  latinSmallLetterN, latinSmallLetterR, latinSmallLetterT, latinSmallLetterU,
59
- range as asciiRange,
60
59
  } from '../../text/ascii/module.f.mjs'
61
60
  import { codePointListToString, stringToCodePointList } from '../../text/utf16/module.f.mjs'
62
- import { contains } from '../../types/range/module.f.mjs'
61
+ import { mapUnwrap } from '../../types/nullable/module.f.mjs'
63
62
  import { concat, empty, filter, flat, flatMap, fold, map, stateScan, toArray } from '../../types/list/module.f.mjs'
64
63
  import { stringifyAsTree } from '../serializer/module.f.mjs'
65
64
  import { sort } from '../../types/object/module.f.mjs'
@@ -244,6 +243,20 @@ const buildToken = () => {
244
243
  /** @type {() => Rule} */
245
244
  export const jsGrammar = () => repeat0Plus(buildToken())
246
245
 
246
+ /**
247
+ * The whole-file matcher together with the name of the rule to start it at.
248
+ *
249
+ * `toData` generates rule names, so the entry name belongs to the conversion
250
+ * rather than to the grammar's spelling and is read back from it here. Building
251
+ * both from one conversion also keeps the grammar built once per matcher.
252
+ *
253
+ * @type {<T>() => readonly [DescentMatch<T>, string]}
254
+ */
255
+ export const jsMatcher = () => {
256
+ const [ruleSet, entry] = toData(jsGrammar())
257
+ return [descentParserRuleSet(ruleSet), entry]
258
+ }
259
+
247
260
  const stringify = stringifyAsTree(sort)
248
261
 
249
262
  /** @type {(cp: CodePoint) => CodePointMeta<unknown>} */
@@ -275,19 +288,29 @@ const codePointsWithMetadata = path => cp => toArray(flat(stateScan(metadataScan
275
288
 
276
289
  /** @typedef {[string, TokenMetadata | null, List<number>]} _TokenScanState */
277
290
 
278
- /** @type {(tag: string) => boolean} */
279
- const isNlTag = tag => tag === '\n' || tag === '\r'
280
- /** @type {(tag: string) => boolean} */
281
- const isWsTag = tag => tag === ' ' || tag === '\t'
291
+ /**
292
+ * The grammar tag of a trivia code point, as the kind `mergeTrivia` speaks in;
293
+ * `null` for every other tag.
294
+ *
295
+ * @type {(tag: string) => Nullable<TriviaKind>}
296
+ */
297
+ const triviaKind = tag =>
298
+ tag === '\n' || tag === '\r' ? 'nl' :
299
+ tag === ' ' || tag === '\t' ? 'ws' :
300
+ null
282
301
 
283
302
  /** @type {StateScan<_FlatToken, _TokenScanState, List<_Token>>} */
284
303
  const scanFunc = (input, state) => {
285
304
  const [stateTag, stateMetadata, stateCodePoints] = state
286
305
  if (typeof input === 'string') {
287
- if (isNlTag(input) && isNlTag(stateTag)) return [null, state]
288
- if (isWsTag(input) && isWsTag(stateTag)) return [null, state]
289
- if (isNlTag(input) && isWsTag(stateTag)) return [null, [input, null, []]]
290
- if (isWsTag(input) && isNlTag(stateTag)) return [null, state]
306
+ // A trivia run continues: `mergeTrivia` decides the run's kind, and
307
+ // the pending token only has to be restarted under the incoming tag
308
+ // when that kind is not the one it already has (ws followed by nl).
309
+ const inputKind = triviaKind(input)
310
+ const stateKind = triviaKind(stateTag)
311
+ if (inputKind !== null && stateKind !== null) {
312
+ return [null, mergeTrivia(stateKind, inputKind) === stateKind ? state : [input, null, []]]
313
+ }
291
314
  /** @type {_TokenScanState} */
292
315
  const newState = [input, null, []]
293
316
  if (stateTag === '') {
@@ -303,7 +326,7 @@ const scanFunc = (input, state) => {
303
326
  }
304
327
 
305
328
  // All operator tag strings produced by the grammar's operator rule
306
- const operatorTags = /** @type {ReadonlySet<string>} */ (new Set([
329
+ const operatorTags = new Set([
307
330
  '.', '=>', '===', '==', '=', '!==', '!=', '!',
308
331
  '>>>=', '>>>', '>>=', '>>', '>=', '>',
309
332
  '<<=', '<<', '<=', '<',
@@ -312,7 +335,7 @@ const operatorTags = /** @type {ReadonlySet<string>} */ (new Set([
312
335
  '&&=', '&&', '&=', '&', '||=', '||', '|=', '|',
313
336
  '^=', '^', '~', '??=', '??', '?.', '?',
314
337
  '[', ']', '{', '}', '(', ')', ',', ':'
315
- ]))
338
+ ])
316
339
 
317
340
  /** @type {(tk: _FlatToken) => boolean} */
318
341
  const filterFunc = tk => {
@@ -333,7 +356,13 @@ const filterFunc = tk => {
333
356
  }
334
357
  }
335
358
 
336
- const rangeCapitalAF = asciiRange('AF')
359
+ /**
360
+ * A `\uXXXX` escape reaches the `unicode` state only after the grammar has
361
+ * accepted its four hex digits, so a non-hex code point here is a tokenizer
362
+ * bug rather than bad input — assert instead of decoding it to a garbage
363
+ * value, which is what the hand-rolled ternary chain used to do.
364
+ */
365
+ const unwrapHexDigitValue = mapUnwrap(hexDigitValue)
337
366
 
338
367
  /** @typedef {
339
368
  * | { readonly kind: 'normal' }
@@ -344,7 +373,17 @@ const rangeCapitalAF = asciiRange('AF')
344
373
  /** @type {StateScan<number, _StringDecodeState, List<number>>} */
345
374
  const stringDecodeScan = (cp, state) => {
346
375
  switch (state.kind) {
347
- case 'escape':
376
+ case 'escape': {
377
+ // The grammar's own `escape` rule (`buildToken`'s `string`) only ever
378
+ // accepts `"`, `\`, `/`, `b`, `f`, `n`, `r`, `t`, or `u` right after a
379
+ // backslash — any other character fails to parse before a token
380
+ // reaches this scan at all, so narrowing to those nine is provable,
381
+ // not merely assumed.
382
+ assert(
383
+ cp === quotationMark || cp === reverseSolidus || cp === solidus ||
384
+ cp === latinSmallLetterB || cp === latinSmallLetterF || cp === latinSmallLetterN ||
385
+ cp === latinSmallLetterR || cp === latinSmallLetterT || cp === latinSmallLetterU,
386
+ cp)
348
387
  switch (cp) {
349
388
  case quotationMark: return [[quotationMark], { kind: 'normal' }] // \" → "
350
389
  case reverseSolidus: return [[reverseSolidus], { kind: 'normal' }] // \\ → \
@@ -354,15 +393,16 @@ const stringDecodeScan = (cp, state) => {
354
393
  case latinSmallLetterN: return [[lf], { kind: 'normal' }] // \n → line feed (LF)
355
394
  case latinSmallLetterR: return [[cr], { kind: 'normal' }] // \r → carriage return (CR)
356
395
  case latinSmallLetterT: return [[ht], { kind: 'normal' }] // \t → horizontal tab (HT)
357
- case latinSmallLetterU: return [null, { kind: 'unicode', acc: 0, count: 0 }] // \u → start 4 hex digits
358
- default: return [[cp], { kind: 'normal' }]
396
+ // `\u` is the only case the assertion above leaves. It is a
397
+ // `default` rather than a `case latinSmallLetterU` because the
398
+ // ASCII constants are plain `number`s, so the switch can never
399
+ // be exhaustive to TypeScript and the clause would fall through
400
+ // into `unicode` below.
401
+ default: return [null, { kind: 'unicode', acc: 0, count: 0 }] // \u → start 4 hex digits
359
402
  }
403
+ }
360
404
  case 'unicode': {
361
- // convert hex digit char to its numeric value: '0'-'9', 'A'-'F', 'a'-'f'
362
- const digit = contains(...digitRange)(cp) ? cp - digit0
363
- : contains(...rangeCapitalAF)(cp) ? cp - (latinCapitalLetterA - 10)
364
- : cp - (latinSmallLetterA - 10)
365
- const acc = (state.acc << 4) | digit
405
+ const acc = (state.acc << 4) | unwrapHexDigitValue(cp)
366
406
  return state.count === 3 ? [[acc], { kind: 'normal' }] : [null, { kind: 'unicode', acc, count: state.count + 1 }]
367
407
  }
368
408
  default:
@@ -373,31 +413,8 @@ const stringDecodeScan = (cp, state) => {
373
413
  /** @type {(codePoints: readonly number[]) => string} */
374
414
  const decodeJsonString = codePoints => codePointListToString(flat(stateScan(stringDecodeScan)({ kind: 'normal' })(codePoints.slice(1, -1))))
375
415
 
376
- // value is grammar-validated: (0|[1-9][0-9]*)(\.[0-9]+)?([eE][+-]?[0-9]+)? — no need to re-check its shape here.
377
- /** @type {(value: string) => readonly [bigint, number]} */
378
- const decodeNumber = value => {
379
- // at most one of 'e'/'E' can occur, so whichever indexOf finds it (if any) is the exponent marker
380
- const lowerEIndex = value.indexOf('e')
381
- const eIndex = lowerEIndex < 0 ? value.indexOf('E') : lowerEIndex
382
- const mantissaText = eIndex < 0 ? value : value.slice(0, eIndex)
383
- const expText = eIndex < 0 ? '' : value.slice(eIndex + 1)
384
- const dotIndex = mantissaText.indexOf('.')
385
- const intDigits = dotIndex < 0 ? mantissaText : mantissaText.slice(0, dotIndex)
386
- const fracDigits = dotIndex < 0 ? '' : mantissaText.slice(dotIndex + 1)
387
- const mantissa = BigInt(intDigits + fracDigits)
388
- const exp = (expText === '' ? 0 : Number(expText)) - fracDigits.length
389
- return [mantissa, exp]
390
- }
391
-
392
- const keywords = /** @type {ReadonlySet<string>} */ (new Set([
393
- 'true', 'false', 'null', 'undefined',
394
- 'arguments', 'await', 'break', 'case', 'catch', 'class', 'const', 'continue',
395
- 'debugger', 'default', 'delete', 'do', 'else', 'enum', 'eval', 'export',
396
- 'extends', 'finally', 'for', 'function', 'if', 'implements', 'import', 'in',
397
- 'instanceof', 'interface', 'let', 'new', 'package', 'private', 'protected',
398
- 'public', 'return', 'static', 'super', 'switch', 'this', 'throw', 'try',
399
- 'typeof', 'var', 'void', 'while', 'with', 'yield',
400
- ]))
416
+ /** @type {ReadonlySet<string>} */
417
+ const keywordSet = new Set(keywords)
401
418
 
402
419
  /** @type {(tk: _Token) => JsToken} */
403
420
  const toJsToken = tk => {
@@ -413,13 +430,13 @@ const toJsToken = tk => {
413
430
  return { kind: 'string', value: decodeJsonString(codePoints) }
414
431
  case 'id': {
415
432
  const value = codePointListToString(codePoints)
416
- if (keywords.has(value)) return /** @type {JsToken} */ ({ kind: value })
433
+ if (keywordSet.has(value)) return /** @type {JsToken} */ ({ kind: value })
417
434
  return { kind: 'id', value }
418
435
  }
419
436
  case 'number': {
420
437
  const value = codePointListToString(codePoints)
421
438
  if (value.endsWith('n')) return { kind: 'bigint', value: BigInt(value.slice(0, -1)) }
422
- return { kind: 'number', value, bf: decodeNumber(value) }
439
+ return { kind: 'number', value }
423
440
  }
424
441
  case 'comment':
425
442
  if (codePoints[1] === asterisk) // block comment /*...*/
@@ -453,7 +470,7 @@ const toJsTokenWithMetadata = tk => {
453
470
  return [{ token, metadata }]
454
471
  }
455
472
 
456
- /** @type {(value: AstRuleMeta<TokenMetadata>|CodePointMeta<TokenMetadata>) => List<_FlatToken>} */
473
+ /** @type {(value: Ast<CodePointMeta<TokenMetadata>>|CodePointMeta<TokenMetadata>) => List<_FlatToken>} */
457
474
  const getTokensFromAstRuleOrCodePoint = value => {
458
475
  if (value instanceof Array)
459
476
  return [value]
@@ -461,7 +478,7 @@ const getTokensFromAstRuleOrCodePoint = value => {
461
478
  return getTokensFromAstRule(value)
462
479
  }
463
480
 
464
- /** @type {(seq: AstSequenceMeta<TokenMetadata>) => List<_FlatToken>} */
481
+ /** @type {(seq: AstSequence<CodePointMeta<TokenMetadata>>) => List<_FlatToken>} */
465
482
  const getTokensFromAstSequence = seq => {
466
483
  return flatMap(getTokensFromAstRuleOrCodePoint)(seq)
467
484
  }
@@ -475,7 +492,7 @@ const tagToToken = tag => {
475
492
  }
476
493
  }
477
494
 
478
- /** @type {(ast: AstRuleMeta<TokenMetadata>) => List<_FlatToken>} */
495
+ /** @type {(ast: Ast<CodePointMeta<TokenMetadata>>) => List<_FlatToken>} */
479
496
  const getTokensFromAstRule = ast => {
480
497
  const token = tagToToken(ast.tag)
481
498
  if (ast.sequence.length === 0)
@@ -488,11 +505,11 @@ const getTokensFromAstRule = ast => {
488
505
  export const tokenizeString = s => {
489
506
  const cp = toArray(stringToCodePointList(s))
490
507
  if (cp.length === 0) {
491
- return stringify(/** @type {Unknown} */ ([{ kind: 'eof' }]))
508
+ return stringify([{ kind: 'eof' }])
492
509
  }
493
- const m = /** @type {DescentMatch<TokenMetadata>} */ (descentParser(jsGrammar()))
510
+ const [m, entry] = jsMatcher()
494
511
  const cpm = codePointsWithMetadata('')(cp)
495
- const { ast, success: ok, idx: len } = m('', cpm)
512
+ const { ast, success: ok, idx: len } = m(entry, cpm)
496
513
  if (!ok || len !== cp.length)
497
514
  return 'error'
498
515
 
@@ -505,16 +522,19 @@ export const tokenizeString = s => {
505
522
  const tokens = flat(stateScan(scanFunc)(['', null, []])(filterTokens))
506
523
  const jsTokens = concat(flatMap(toJsTokens)(tokens))([{ kind: 'eof' }])
507
524
  const result = toArray(jsTokens)
508
- return stringify(/** @type {Unknown} */ (result))
525
+ return stringify(result)
509
526
  }
510
527
 
511
528
  // Finds `tag` in flatTokens and returns the metadata of the next code point after it.
512
529
  // numError/unterminated tags are followed by the poisoning char / EOF-hitting position
513
530
  // in the flattened AST walk order, so this pinpoints roughly where tokenization failed.
531
+ //
532
+ // The single call site only passes a `tag` it already confirmed via
533
+ // `flatTokens.includes(tag)`, so `indexOf` here is never -1.
514
534
  /** @type {(tag: string, flatTokens: readonly _FlatToken[], fallback: TokenMetadata) => TokenMetadata} */
515
535
  const metadataAfterTag = (tag, flatTokens, fallback) => {
516
536
  const idx = flatTokens.indexOf(tag)
517
- const found = idx < 0 ? undefined : flatTokens.slice(idx + 1).find((/** @type {_FlatToken} */ t) => t instanceof Array)
537
+ const found = flatTokens.slice(idx + 1).find((/** @type {_FlatToken} */ t) => t instanceof Array)
518
538
  return found === undefined ? fallback : found[1]
519
539
  }
520
540
 
@@ -525,14 +545,19 @@ export const tokenizeJs = input => path => {
525
545
  const initial = { path, line: 1, column: 1 }
526
546
  if (cp.length === 0) return [{ token: { kind: 'eof' }, metadata: initial }]
527
547
 
528
- const m = /** @type {DescentMatch<TokenMetadata>} */ (descentParser(jsGrammar()))
548
+ const [m, entry] = jsMatcher()
529
549
  const cpm = codePointsWithMetadata(path)(cp)
530
- const { ast, success: ok, idx: len } = m('', cpm)
550
+ const { ast, success: ok, idx: len } = m(entry, cpm)
531
551
  const finalMetadata = fold(advanceMetadata)(initial)(cp)
532
552
 
533
553
  if (!ok || len !== cp.length) {
534
- const errorMetadata = len < cpm.length ? cpm[len][1] : finalMetadata
535
- return [{ token: { kind: 'error', message: 'invalid token' }, metadata: errorMetadata }]
554
+ // `len` is always `< cpm.length` (`=== cp.length`) here: `ok` false only
555
+ // ever happens with `len === 0` (nothing matched at position 0), and a
556
+ // `len !== cp.length` failure with `ok` true is by definition a partial
557
+ // match (`len < cp.length`) — `repeat0Plus` never fails after
558
+ // successfully consuming the whole input, so there is no way to reach
559
+ // this branch with `len === cp.length`.
560
+ return [{ token: { kind: 'error', message: 'invalid token' }, metadata: cpm[len][1] }]
536
561
  }
537
562
 
538
563
  const flatTokens = toArray(getTokensFromAstRule(ast))
@@ -592,13 +617,20 @@ const parseDjsDefaultState = input => {
592
617
 
593
618
  // Folds a leading '-' into the following number/bigint token, mirroring the old
594
619
  // fjs/djs/tokenizer's minus-state exactly.
620
+ //
621
+ // No `case '-'` here: the underlying `js/tokenizer` always merges two adjacent
622
+ // `-` characters into a single `'--'` token (the decrement operator), so this
623
+ // state — entered only after a single, unmerged `-` — can never itself see
624
+ // another `'-'`-kind input. Such an input falls through to `default`, which
625
+ // handles it exactly like any other non-number/bigint/eof token.
595
626
  /** @type {(input: JsToken) => readonly [List<DjsToken>, _DjsScanState]} */
596
627
  const parseDjsMinusState = input => {
597
628
  switch (input.kind) {
598
629
  case 'eof': return [[{ kind: 'error', message: 'invalid token' }, { kind: 'eof' }], { kind: 'def' }]
599
- case '-': return [[{ kind: 'error', message: 'invalid token' }], { kind: '-' }]
600
630
  case 'bigint': return [[{ kind: 'bigint', value: -1n * input.value }], { kind: 'def' }]
601
- case 'number': return [[{ kind: 'number', bf: multiply(input.bf)(-1n), value: `-${input.value}` }], { kind: 'def' }]
631
+ // negation is lexical: the minus sign joins the lexeme, so the token
632
+ // stays the exact source text of the number.
633
+ case 'number': return [[{ kind: 'number', value: `-${input.value}` }], { kind: 'def' }]
602
634
  default: return [{ first: { kind: 'error', message: 'invalid token' }, tail: mapDjsToken(input) }, { kind: 'def' }]
603
635
  }
604
636
  }
@@ -622,3 +654,18 @@ const scanDjsTokenWithMetadata = (input, state) => {
622
654
 
623
655
  /** @type {(input: List<number>) => (path: string) => List<DjsTokenWithMetadata>} */
624
656
  export const tokenize = input => path => flat(stateScan(scanDjsTokenWithMetadata)({ kind: 'def' })(tokenizeJs(input)(path)))
657
+
658
+ export const proof = {
659
+ // `tagToToken`'s `true` arm fires only for an `AstTag` of literal `true`.
660
+ // `bnf/data`'s `emptyTagOf` is the only source of that value, and
661
+ // `bnf/descent/module.f.mjs` reads it in exactly one place (its variant
662
+ // arm), always wrapped in `mrFail` — a failure. A failed variant only
663
+ // propagates as the overall `result` when nothing in it matches, so it
664
+ // never survives into a successful sequence/AST; a `true` tag therefore
665
+ // can never appear on a successful `descentParser` match for any
666
+ // grammar, `jsGrammar` included, so `tokenizeJs` can't reach this arm.
667
+ // Call it directly to cover that branch.
668
+ tagToTokenTrueTag: () => {
669
+ assertEq(tagToToken(true), 'true')
670
+ },
671
+ }
@@ -1,4 +1,7 @@
1
+ /**
2
+ */
1
3
  export declare const proof: {
4
+ jsGrammar: () => void;
2
5
  isValid: (() => void)[];
3
6
  tokenizer: (() => void)[];
4
7
  djs: (() => void)[];