functionalscript 0.45.0 → 0.46.1

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 (296) 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 +10 -0
  4. package/fjs/asn.1/proof.f.mjs +16 -0
  5. package/fjs/basen/base128/module.f.mjs +22 -5
  6. package/fjs/bnf/data/module.f.d.mts +32 -6
  7. package/fjs/bnf/data/module.f.mjs +112 -7
  8. package/fjs/bnf/data/proof.f.d.mts +2 -0
  9. package/fjs/bnf/data/proof.f.mjs +74 -3
  10. package/fjs/bnf/data/types.d.ts +20 -2
  11. package/fjs/bnf/descent/module.f.d.mts +28 -14
  12. package/fjs/bnf/descent/module.f.mjs +122 -77
  13. package/fjs/bnf/descent/proof.f.d.mts +2 -0
  14. package/fjs/bnf/descent/proof.f.mjs +117 -31
  15. package/fjs/bnf/descent/types.d.ts +12 -14
  16. package/fjs/bnf/ll1/module.f.d.mts +64 -22
  17. package/fjs/bnf/ll1/module.f.mjs +214 -154
  18. package/fjs/bnf/ll1/proof.f.d.mts +15 -2
  19. package/fjs/bnf/ll1/proof.f.mjs +323 -149
  20. package/fjs/bnf/ll1/types.d.ts +16 -24
  21. package/fjs/bnf/matcher/module.f.d.mts +66 -0
  22. package/fjs/bnf/matcher/module.f.mjs +81 -0
  23. package/fjs/bnf/matcher/proof.f.d.mts +10 -0
  24. package/fjs/bnf/matcher/proof.f.mjs +79 -0
  25. package/fjs/bnf/matcher/types.d.ts +54 -0
  26. package/fjs/bnf/testlib.f.d.mts +31 -0
  27. package/fjs/bnf/testlib.f.mjs +80 -0
  28. package/fjs/cas/cli/module.f.d.mts +1 -1
  29. package/fjs/cas/cli/module.f.mjs +14 -20
  30. package/fjs/cas/cli/proof.f.d.mts +1 -3
  31. package/fjs/cas/cli/proof.f.mjs +44 -33
  32. package/fjs/cas/evo/module.f.d.mts +64 -18
  33. package/fjs/cas/evo/module.f.mjs +148 -70
  34. package/fjs/cas/evo/proof.f.d.mts +10 -1
  35. package/fjs/cas/evo/proof.f.mjs +305 -223
  36. package/fjs/cas/evo/types.d.ts +45 -9
  37. package/fjs/cas/module.f.d.mts +18 -32
  38. package/fjs/cas/module.f.mjs +129 -128
  39. package/fjs/cas/proof.f.d.mts +11 -8
  40. package/fjs/cas/proof.f.mjs +259 -147
  41. package/fjs/cas/types.d.ts +24 -10
  42. package/fjs/ci/config/module.f.d.mts +2 -2
  43. package/fjs/ci/config/module.f.mjs +2 -2
  44. package/fjs/ci/module.f.d.mts +5 -5
  45. package/fjs/ci/module.f.mjs +8 -7
  46. package/fjs/ci/nix/module.f.d.mts +7 -5
  47. package/fjs/ci/nix/module.f.mjs +13 -12
  48. package/fjs/ci/nix/proof.f.mjs +2 -2
  49. package/fjs/ci/proof.f.mjs +9 -5
  50. package/fjs/cli/module.f.d.mts +4 -6
  51. package/fjs/cli/module.f.mjs +4 -8
  52. package/fjs/cli/proof.f.mjs +17 -16
  53. package/fjs/cli/types.d.ts +2 -3
  54. package/fjs/common/monoid/types.d.ts +1 -1
  55. package/fjs/crypto/hmac/module.f.mjs +2 -2
  56. package/fjs/crypto/sha2/module.f.mjs +3 -1
  57. package/fjs/crypto/sha2/proof.f.d.mts +1 -0
  58. package/fjs/crypto/sha2/proof.f.mjs +24 -0
  59. package/fjs/crypto/sha2/types.d.ts +11 -0
  60. package/fjs/crypto/sign/module.f.mjs +2 -2
  61. package/fjs/dev/module.f.d.mts +13 -4
  62. package/fjs/dev/module.f.mjs +56 -27
  63. package/fjs/dev/update/module.f.d.mts +9 -4
  64. package/fjs/dev/update/module.f.mjs +14 -10
  65. package/fjs/dev/update/proof.f.d.mts +1 -3
  66. package/fjs/dev/update/proof.f.mjs +10 -5
  67. package/fjs/djs/module.f.d.mts +13 -5
  68. package/fjs/djs/module.f.mjs +31 -16
  69. package/fjs/djs/parser/module.f.d.mts +13 -3
  70. package/fjs/djs/parser/module.f.mjs +117 -16
  71. package/fjs/djs/parser/proof.f.d.mts +5 -1
  72. package/fjs/djs/parser/proof.f.mjs +274 -12
  73. package/fjs/djs/parser/types.d.ts +7 -1
  74. package/fjs/djs/proof.f.d.mts +18 -2
  75. package/fjs/djs/proof.f.mjs +187 -12
  76. package/fjs/djs/serializer/module.f.d.mts +25 -8
  77. package/fjs/djs/serializer/module.f.mjs +61 -15
  78. package/fjs/djs/serializer/proof.f.d.mts +5 -0
  79. package/fjs/djs/serializer/proof.f.mjs +23 -1
  80. package/fjs/djs/tokenizer/module.f.d.mts +17 -5
  81. package/fjs/djs/tokenizer/module.f.mjs +99 -60
  82. package/fjs/djs/tokenizer/proof.f.d.mts +1 -1
  83. package/fjs/djs/tokenizer/proof.f.mjs +74 -67
  84. package/fjs/djs/transpiler/module.f.d.mts +12 -7
  85. package/fjs/djs/transpiler/module.f.mjs +82 -56
  86. package/fjs/djs/transpiler/types.d.ts +7 -3
  87. package/fjs/djs/types.d.ts +7 -1
  88. package/fjs/effects/list/module.f.d.mts +14 -11
  89. package/fjs/effects/list/module.f.mjs +13 -11
  90. package/fjs/effects/list/types.d.ts +27 -7
  91. package/fjs/effects/memory/module.f.d.mts +2 -1
  92. package/fjs/effects/memory/module.f.mjs +3 -4
  93. package/fjs/effects/memory/proof.f.mjs +13 -7
  94. package/fjs/effects/memory/types.d.ts +4 -3
  95. package/fjs/effects/mock/module.f.d.mts +20 -4
  96. package/fjs/effects/mock/module.f.mjs +37 -5
  97. package/fjs/effects/mock/types.d.ts +10 -1
  98. package/fjs/effects/module.d.mts +4 -2
  99. package/fjs/effects/module.f.d.mts +466 -280
  100. package/fjs/effects/module.f.mjs +537 -299
  101. package/fjs/effects/module.mjs +2 -1
  102. package/fjs/effects/node/memory/module.d.mts +4 -2
  103. package/fjs/effects/node/memory/module.mjs +6 -3
  104. package/fjs/effects/node/memory/proof.mjs +10 -4
  105. package/fjs/effects/node/module.d.mts +4 -3
  106. package/fjs/effects/node/module.f.d.mts +168 -33
  107. package/fjs/effects/node/module.f.mjs +256 -52
  108. package/fjs/effects/node/module.mjs +57 -34
  109. package/fjs/effects/node/proof.f.d.mts +28 -2
  110. package/fjs/effects/node/proof.f.mjs +161 -42
  111. package/fjs/effects/node/types.d.ts +106 -18
  112. package/fjs/effects/node/virtual/module.f.d.mts +18 -4
  113. package/fjs/effects/node/virtual/module.f.mjs +110 -68
  114. package/fjs/effects/node/virtual/proof.f.d.mts +28 -2
  115. package/fjs/effects/node/virtual/proof.f.mjs +190 -9
  116. package/fjs/effects/proof.f.d.mts +69 -37
  117. package/fjs/effects/proof.f.mjs +410 -130
  118. package/fjs/effects/types.d.ts +161 -33
  119. package/fjs/emergent_testing/module.f.d.mts +19 -12
  120. package/fjs/emergent_testing/module.f.mjs +93 -33
  121. package/fjs/emergent_testing/proof.f.d.mts +21 -7
  122. package/fjs/emergent_testing/proof.f.mjs +166 -32
  123. package/fjs/emergent_testing/types.d.ts +22 -4
  124. package/fjs/fsm/module.f.d.mts +14 -4
  125. package/fjs/fsm/module.f.mjs +54 -37
  126. package/fjs/fsm/proof.f.d.mts +2 -0
  127. package/fjs/fsm/proof.f.mjs +83 -114
  128. package/fjs/js/keywords/module.f.d.mts +52 -0
  129. package/fjs/js/keywords/module.f.mjs +72 -0
  130. package/fjs/js/keywords/proof.f.d.mts +3 -0
  131. package/fjs/js/keywords/proof.f.mjs +13 -0
  132. package/fjs/js/tokenizer/module.f.d.mts +26 -6
  133. package/fjs/js/tokenizer/module.f.mjs +145 -159
  134. package/fjs/js/tokenizer/proof.f.d.mts +1 -0
  135. package/fjs/js/tokenizer/proof.f.mjs +54 -24
  136. package/fjs/js/tokenizer/types.d.ts +33 -24
  137. package/fjs/mcp/cas/module.f.d.mts +1 -6
  138. package/fjs/mcp/cas/module.f.mjs +55 -51
  139. package/fjs/mcp/cas/proof.f.d.mts +15 -0
  140. package/fjs/mcp/cas/proof.f.mjs +174 -0
  141. package/fjs/mcp/evo/module.f.d.mts +19 -10
  142. package/fjs/mcp/evo/module.f.mjs +48 -27
  143. package/fjs/mcp/evo/proof.f.d.mts +6 -1
  144. package/fjs/mcp/evo/proof.f.mjs +115 -31
  145. package/fjs/mcp/module.f.d.mts +4 -4
  146. package/fjs/mcp/module.f.mjs +6 -6
  147. package/fjs/mcp/proof.f.d.mts +5 -3
  148. package/fjs/mcp/proof.f.mjs +112 -46
  149. package/fjs/media/html/module.f.mjs +1 -1
  150. package/fjs/media/json/extended/module.f.d.mts +82 -0
  151. package/fjs/media/json/extended/module.f.mjs +153 -0
  152. package/fjs/media/json/extended/proof.f.d.mts +42 -0
  153. package/fjs/media/json/extended/proof.f.mjs +127 -0
  154. package/fjs/media/json/extended/types.d.ts +23 -0
  155. package/fjs/media/json/module.f.d.mts +8 -2
  156. package/fjs/media/json/module.f.mjs +43 -41
  157. package/fjs/media/json/number/module.f.d.mts +59 -0
  158. package/fjs/media/json/number/module.f.mjs +136 -0
  159. package/fjs/media/json/number/proof.f.d.mts +24 -0
  160. package/fjs/media/json/number/proof.f.mjs +86 -0
  161. package/fjs/media/json/number/types.d.ts +28 -0
  162. package/fjs/media/json/parser/module.f.d.mts +25 -13
  163. package/fjs/media/json/parser/module.f.mjs +114 -70
  164. package/fjs/media/json/parser/proof.f.d.mts +5 -0
  165. package/fjs/media/json/parser/proof.f.mjs +31 -1
  166. package/fjs/media/json/parser/types.d.ts +33 -14
  167. package/fjs/media/json/rtti/module.f.d.mts +1 -1
  168. package/fjs/media/json/rtti/module.f.mjs +1 -1
  169. package/fjs/media/json/rtti/proof.f.mjs +9 -9
  170. package/fjs/media/json/schema/module.f.mjs +3 -13
  171. package/fjs/media/json/schema/proof.f.d.mts +0 -1
  172. package/fjs/media/json/schema/proof.f.mjs +1 -2
  173. package/fjs/media/json/serializer/module.f.d.mts +32 -1
  174. package/fjs/media/json/serializer/module.f.mjs +64 -2
  175. package/fjs/media/json/tokenizer/module.f.mjs +7 -3
  176. package/fjs/media/json/tokenizer/proof.f.d.mts +6 -0
  177. package/fjs/media/json/tokenizer/proof.f.mjs +62 -21
  178. package/fjs/media/json/types.d.ts +36 -10
  179. package/fjs/media/lock/module.f.d.mts +100 -0
  180. package/fjs/media/lock/module.f.mjs +125 -0
  181. package/fjs/media/lock/proof.f.d.mts +33 -0
  182. package/fjs/media/lock/proof.f.mjs +196 -0
  183. package/fjs/media/lock/types.d.ts +15 -0
  184. package/fjs/media/module.f.d.mts +6 -5
  185. package/fjs/media/module.f.mjs +8 -7
  186. package/fjs/media/note/module.f.d.mts +121 -0
  187. package/fjs/media/note/module.f.mjs +131 -0
  188. package/fjs/media/note/proof.f.d.mts +29 -0
  189. package/fjs/media/note/proof.f.mjs +150 -0
  190. package/fjs/media/note/types.d.ts +10 -0
  191. package/fjs/media/proof.f.d.mts +4 -1
  192. package/fjs/media/proof.f.mjs +40 -21
  193. package/fjs/media/revision/module.f.d.mts +78 -7
  194. package/fjs/media/revision/module.f.mjs +119 -12
  195. package/fjs/media/revision/proof.f.d.mts +10 -0
  196. package/fjs/media/revision/proof.f.mjs +88 -0
  197. package/fjs/media/revision/types.d.ts +34 -5
  198. package/fjs/media/type/module.f.d.mts +33 -15
  199. package/fjs/media/type/module.f.mjs +35 -29
  200. package/fjs/media/type/proof.f.d.mts +2 -1
  201. package/fjs/media/type/proof.f.mjs +30 -10
  202. package/fjs/module.f.mjs +29 -8
  203. package/fjs/nanvm/proof.f.mjs +3 -3
  204. package/fjs/nanvm/rust/module.f.mjs +1 -1
  205. package/fjs/nanvm/update/module.f.d.mts +4 -4
  206. package/fjs/nanvm/update/module.f.mjs +8 -9
  207. package/fjs/nanvm/update/proof.f.mjs +4 -3
  208. package/fjs/proof.f.d.mts +3 -3
  209. package/fjs/proof.f.mjs +36 -10
  210. package/fjs/protocol/json_rpc/module.f.d.mts +2 -2
  211. package/fjs/protocol/json_rpc/module.f.mjs +3 -3
  212. package/fjs/protocol/json_rpc/proof.f.mjs +4 -4
  213. package/fjs/protocol/mcp/module.f.d.mts +10 -13
  214. package/fjs/protocol/mcp/module.f.mjs +74 -58
  215. package/fjs/protocol/mcp/proof.f.d.mts +13 -4
  216. package/fjs/protocol/mcp/proof.f.mjs +193 -61
  217. package/fjs/protocol/mcp/stdio/module.f.d.mts +15 -7
  218. package/fjs/protocol/mcp/stdio/module.f.mjs +38 -25
  219. package/fjs/protocol/mcp/stdio/proof.f.d.mts +4 -2
  220. package/fjs/protocol/mcp/stdio/proof.f.mjs +45 -12
  221. package/fjs/protocol/mcp/stdio/types.d.ts +1 -1
  222. package/fjs/protocol/mcp/types.d.ts +17 -6
  223. package/fjs/sul/id/module.f.d.mts +0 -1
  224. package/fjs/sul/id/module.f.mjs +2 -3
  225. package/fjs/sul/level/hash/module.f.mjs +2 -1
  226. package/fjs/sul/level/hash/proof.f.mjs +2 -2
  227. package/fjs/sul/module.f.mjs +18 -13
  228. package/fjs/text/code_point/module.f.d.mts +8 -0
  229. package/fjs/text/code_point/module.f.mjs +8 -1
  230. package/fjs/text/code_point/proof.f.d.mts +1 -0
  231. package/fjs/text/code_point/proof.f.mjs +11 -0
  232. package/fjs/text/sgr/module.f.d.mts +4 -6
  233. package/fjs/text/sgr/module.f.mjs +6 -7
  234. package/fjs/text/utf16/module.f.mjs +7 -2
  235. package/fjs/text/utf16/proof.f.mjs +3 -3
  236. package/fjs/text/utf8/module.f.mjs +4 -2
  237. package/fjs/types/array/module.f.mjs +14 -2
  238. package/fjs/types/bit_vec/module.f.d.mts +0 -2
  239. package/fjs/types/bit_vec/module.f.mjs +46 -32
  240. package/fjs/types/bit_vec/proof.f.mjs +2 -2
  241. package/fjs/types/btree/remove/module.f.mjs +1 -1
  242. package/fjs/types/btree/set/module.f.mjs +9 -11
  243. package/fjs/types/btree/set/proof.f.mjs +12 -0
  244. package/fjs/types/byte_set/module.f.d.mts +11 -4
  245. package/fjs/types/byte_set/module.f.mjs +14 -6
  246. package/fjs/types/byte_set/proof.f.mjs +7 -7
  247. package/fjs/types/function/compare/module.f.mjs +10 -3
  248. package/fjs/types/list/module.f.d.mts +1 -1
  249. package/fjs/types/list/module.f.mjs +1 -1
  250. package/fjs/types/nullable/module.f.d.mts +18 -4
  251. package/fjs/types/nullable/module.f.mjs +21 -4
  252. package/fjs/types/nullable/proof.f.d.mts +4 -0
  253. package/fjs/types/nullable/proof.f.mjs +15 -0
  254. package/fjs/types/object/module.f.d.mts +12 -2
  255. package/fjs/types/object/module.f.mjs +11 -1
  256. package/fjs/types/patricia_trie/module.f.mjs +26 -11
  257. package/fjs/types/result/module.f.d.mts +3 -3
  258. package/fjs/types/result/module.f.mjs +3 -3
  259. package/fjs/types/rtti/common/module.f.d.mts +25 -28
  260. package/fjs/types/rtti/common/module.f.mjs +36 -32
  261. package/fjs/types/rtti/common/proof.f.mjs +5 -5
  262. package/fjs/types/rtti/data/module.f.d.mts +14 -0
  263. package/fjs/types/rtti/data/module.f.mjs +25 -2
  264. package/fjs/types/rtti/data/proof.f.d.mts +1 -0
  265. package/fjs/types/rtti/data/proof.f.mjs +25 -2
  266. package/fjs/types/rtti/parse/module.f.d.mts +24 -14
  267. package/fjs/types/rtti/parse/module.f.mjs +37 -28
  268. package/fjs/types/rtti/parse/proof.f.d.mts +3 -2
  269. package/fjs/types/rtti/parse/proof.f.mjs +33 -14
  270. package/fjs/types/rtti/proof.f.mjs +3 -1
  271. package/fjs/types/rtti/ts/module.f.mjs +13 -17
  272. package/fjs/types/rtti/ts/types.d.ts +14 -1
  273. package/fjs/types/rtti/validate/module.f.d.mts +81 -19
  274. package/fjs/types/rtti/validate/module.f.mjs +107 -61
  275. package/fjs/types/rtti/validate/proof.f.d.mts +13 -10
  276. package/fjs/types/rtti/validate/proof.f.mjs +186 -197
  277. package/fjs/types/sorted_set/module.f.d.mts +18 -0
  278. package/fjs/types/sorted_set/module.f.mjs +22 -0
  279. package/fjs/types/sorted_set/proof.f.d.mts +1 -0
  280. package/fjs/types/sorted_set/proof.f.mjs +16 -1
  281. package/fjs/types/uint8array/module.f.d.mts +1 -1
  282. package/fjs/types/uint8array/module.f.mjs +1 -1
  283. package/fjs/website/module.f.d.mts +3 -3
  284. package/fjs/website/module.f.mjs +4 -7
  285. package/fjs/website/proof.f.mjs +2 -1
  286. package/package.json +2 -2
  287. package/fjs/dev/package_json/module.f.d.mts +0 -39
  288. package/fjs/dev/package_json/module.f.mjs +0 -40
  289. package/fjs/dev/package_json/proof.f.d.mts +0 -6
  290. package/fjs/dev/package_json/proof.f.mjs +0 -32
  291. package/fjs/effects/eff/module.f.d.mts +0 -20
  292. package/fjs/effects/eff/module.f.mjs +0 -70
  293. package/fjs/effects/eff/proof.f.d.mts +0 -15
  294. package/fjs/effects/eff/proof.f.mjs +0 -69
  295. package/fjs/effects/eff/types.d.ts +0 -71
  296. package/fjs/types/rtti/validate/types.d.ts +0 -6
@@ -1,17 +1,26 @@
1
1
  /**
2
2
  * @import { Grammar } from './module.f.mjs'
3
+ * @import { ByteSet } from '../types/byte_set/types.ts'
3
4
  */
4
5
 
5
- import { dfa, run, toRange, toUnion } from './module.f.mjs'
6
- import { union } from '../types/byte_set/module.f.mjs'
7
- import { sort, fromEntries } from '../types/object/module.f.mjs'
8
- import { stringify } from '../media/json/module.f.mjs'
9
- import { identity } from '../types/function/module.f.mjs'
10
- import { toArray } from '../types/list/module.f.mjs'
6
+ import { dfa, run, toRange } from './module.f.mjs'
7
+ import { one, union, empty, range as byteSetRange } from '../types/byte_set/module.f.mjs'
8
+ import { toKey } from '../types/sorted_set/module.f.mjs'
9
+ import { fold, toArray } from '../types/list/module.f.mjs'
11
10
  import { stringToList } from '../text/utf16/module.f.mjs'
12
- import { assertEq } from '../asserts/module.f.mjs'
11
+ import { assertEq, assertStructurallySame } from '../asserts/module.f.mjs'
13
12
 
14
- const stringifyIdentity = stringify(identity)
13
+
14
+ /**
15
+ * The byte set of a string's characters, used to spell a grammar's punctuation
16
+ * alphabets below. It lives here rather than in `fjs/fsm` or `types/byte_set`:
17
+ * `fjs/fsm` has no use for it, and a `types` leaf taking a *string* would have
18
+ * to depend on `fjs/text` to read one.
19
+ *
20
+ * @type {(s: string) => ByteSet}
21
+ */
22
+ const toUnion = s =>
23
+ fold((/** @type {number} */i) => (/** @type {ByteSet} */bs) => union(bs)(one(i)))(empty)(stringToList(s))
15
24
 
16
25
  const buildDfa = () => {
17
26
  const lowercaseAlpha = toRange('az')
@@ -39,111 +48,71 @@ const buildDfa = () => {
39
48
  }
40
49
 
41
50
  export const proof = {
42
- dfa: () => {
43
- const dfa = buildDfa()
44
- const entries = Object.entries(dfa)
45
- const sortedEntries = sort(entries)
46
- const obj = fromEntries(sortedEntries)
47
- const result = stringifyIdentity(obj)
48
-
49
- const expectedObj = {
50
- '[""]': [
51
- [ '[]', 35 ],
52
- [ '["id"]', 36 ],
53
- [ '[]', 47 ],
54
- [ '["floatBegin","int"]', 57 ],
55
- [ '[]', 64 ],
56
- [ '["id"]', 90 ],
57
- [ '[]', 94 ],
58
- [ '["id"]', 95 ],
59
- [ '[]', 96 ],
60
- [ '["id"]', 122 ]
61
- ],
62
- '["float"]': [ [ '[]', 47 ], [ '["float"]', 57 ] ],
63
- '["floatBegin","int"]': [
64
- [ '[]', 45 ],
65
- [ '["floatDot"]', 46 ],
66
- [ '[]', 47 ],
67
- [ '["floatBegin","int"]', 57 ]
68
- ],
69
- '["floatDot"]': [ [ '[]', 47 ], [ '["float"]', 57 ] ],
70
- '["id"]': [
71
- [ '[]', 35 ],
72
- [ '["id"]', 36 ],
73
- [ '[]', 47 ],
74
- [ '["id"]', 57 ],
75
- [ '[]', 64 ],
76
- [ '["id"]', 90 ],
77
- [ '[]', 94 ],
78
- [ '["id"]', 95 ],
79
- [ '[]', 96 ],
80
- [ '["id"]', 122 ]
81
- ],
82
- '[]': []
83
- };
84
- const expectedResult = stringifyIdentity(expectedObj)
85
-
86
- if (result !== expectedResult) {throw result }
87
- },
51
+ toRange: [
52
+ // Two characters name the inclusive range's endpoints.
53
+ () => assertEq(toRange('az'), byteSetRange([0x61, 0x7a])),
54
+ // One character is the singleton range. This threw `RangeError: The
55
+ // number NaN cannot be converted to a BigInt` while `toRange` read a
56
+ // second character that was not there.
57
+ () => assertEq(toRange('a'), byteSetRange([0x61, 0x61])),
58
+ () => assertEq(toRange('a'), one(0x61)),
59
+ () => assertEq(toRange('\0'), one(0)),
60
+ ],
61
+ // The expected states are written as the sets they are, keyed through
62
+ // `toKey`, so this proof asserts the automaton and not the key encoding.
63
+ dfa: () => assertStructurallySame(buildDfa(), {
64
+ [toKey([''])]: [
65
+ [toKey([]), 35],
66
+ [toKey(['id']), 36],
67
+ [toKey([]), 47],
68
+ [toKey(['floatBegin', 'int']), 57],
69
+ [toKey([]), 64],
70
+ [toKey(['id']), 90],
71
+ [toKey([]), 94],
72
+ [toKey(['id']), 95],
73
+ [toKey([]), 96],
74
+ [toKey(['id']), 122],
75
+ ],
76
+ [toKey(['float'])]: [[toKey([]), 47], [toKey(['float']), 57]],
77
+ [toKey(['floatBegin', 'int'])]: [
78
+ [toKey([]), 45],
79
+ [toKey(['floatDot']), 46],
80
+ [toKey([]), 47],
81
+ [toKey(['floatBegin', 'int']), 57],
82
+ ],
83
+ [toKey(['floatDot'])]: [[toKey([]), 47], [toKey(['float']), 57]],
84
+ [toKey(['id'])]: [
85
+ [toKey([]), 35],
86
+ [toKey(['id']), 36],
87
+ [toKey([]), 47],
88
+ [toKey(['id']), 57],
89
+ [toKey([]), 64],
90
+ [toKey(['id']), 90],
91
+ [toKey([]), 94],
92
+ [toKey(['id']), 95],
93
+ [toKey([]), 96],
94
+ [toKey(['id']), 122],
95
+ ],
96
+ [toKey([])]: [],
97
+ }),
88
98
  run: [
89
- () => {
90
- const dfa = buildDfa()
91
- const input = stringToList('a1')
92
- const result = stringifyIdentity(toArray(run(dfa)(input)))
93
-
94
- const expectedOutput = [
95
- '["id"]',
96
- '["id"]'
97
- ]
98
- const expectedResult = stringifyIdentity(expectedOutput)
99
- assertEq(result, expectedResult)
100
- },
101
- () => {
102
- const dfa = buildDfa()
103
- const input = stringToList('0.1')
104
- const result = stringifyIdentity(toArray(run(dfa)(input)))
105
-
106
- const expectedOutput = [
107
- '["floatBegin","int"]',
108
- '["floatDot"]',
109
- '["float"]'
110
- ]
111
- const expectedResult = stringifyIdentity(expectedOutput)
112
- assertEq(result, expectedResult)
113
- },
114
- () => {
115
- const dfa = buildDfa()
116
- const input = stringToList('//')
117
- const result = stringifyIdentity(toArray(run(dfa)(input)))
118
-
119
- const expectedOutput = [
120
- '[]',
121
- '[]'
122
- ]
123
- const expectedResult = stringifyIdentity(expectedOutput)
124
- assertEq(result, expectedResult)
125
- },
126
- () => {
127
- const dfa = buildDfa()
128
- const input = stringToList('::')
129
- const result = stringifyIdentity(toArray(run(dfa)(input)))
130
-
131
- const expectedOutput = [
132
- '[]',
133
- '[]'
134
- ]
135
- const expectedResult = stringifyIdentity(expectedOutput)
136
- assertEq(result, expectedResult)
137
- },
138
- () => {
139
- // `run` accepts any `Dfa` (a `StringMap`, so entries may be
140
- // missing), not only one built by `dfa()`. A state absent from
141
- // the map falls back to the empty transition table.
142
- const result = stringifyIdentity(toArray(run({})(stringToList('a'))))
143
-
144
- const expectedOutput = ['[]']
145
- const expectedResult = stringifyIdentity(expectedOutput)
146
- assertEq(result, expectedResult)
147
- }
148
- ]
99
+ () => assertStructurallySame(
100
+ toArray(run(buildDfa())(stringToList('a1'))),
101
+ [toKey(['id']), toKey(['id'])]),
102
+ () => assertStructurallySame(
103
+ toArray(run(buildDfa())(stringToList('0.1'))),
104
+ [toKey(['floatBegin', 'int']), toKey(['floatDot']), toKey(['float'])]),
105
+ () => assertStructurallySame(
106
+ toArray(run(buildDfa())(stringToList('//'))),
107
+ [toKey([]), toKey([])]),
108
+ () => assertStructurallySame(
109
+ toArray(run(buildDfa())(stringToList('::'))),
110
+ [toKey([]), toKey([])]),
111
+ // `run` accepts any `Dfa` (a `StringMap`, so entries may be missing),
112
+ // not only one built by `dfa()`. A state absent from the map falls
113
+ // back to the empty transition table.
114
+ () => assertStructurallySame(
115
+ toArray(run({})(stringToList('a'))),
116
+ [toKey([])]),
117
+ ],
149
118
  }
@@ -0,0 +1,52 @@
1
+ /**
2
+ * The JavaScript keywords — one source of truth.
3
+ *
4
+ * FunctionalScript is a strict subset of JavaScript: any FunctionalScript
5
+ * program must run the same on JavaScript. Every consumer that decides
6
+ * whether a name is a keyword — the JavaScript and DJS tokenizers, printers
7
+ * that emit identifiers — derives its set from this module instead of
8
+ * keeping a copy, so the sets cannot drift apart.
9
+ *
10
+ * @module
11
+ *
12
+ * @import { Assert } from '../../asserts/types.ts'
13
+ * @import { Equal } from '../../types/ts/types.ts'
14
+ */
15
+ import type { Assert } from '../../asserts/types.ts';
16
+ import type { Equal } from '../../types/ts/types.ts';
17
+ /**
18
+ * The ECMAScript `ReservedWord` production
19
+ * ([ECMA-262 §12.7.2](https://tc39.es/ecma262/#prod-ReservedWord)) — never
20
+ * usable as identifiers.
21
+ */
22
+ export declare const reservedWords: readonly ['await', 'break', 'case', 'catch', 'class', 'const', 'continue', 'debugger', 'default', 'delete', 'do', 'else', 'enum', 'export', 'extends', 'false', 'finally', 'for', 'function', 'if', 'import', 'in', 'instanceof', 'new', 'null', 'return', 'super', 'switch', 'this', 'throw', 'true', 'try', 'typeof', 'var', 'void', 'while', 'with', 'yield'];
23
+ /**
24
+ * Reserved only in strict-mode code — and every module is strict-mode code,
25
+ * so FunctionalScript treats them exactly like {@link reservedWords}.
26
+ */
27
+ export declare const strictModeReservedWords: readonly ['implements', 'interface', 'let', 'package', 'private', 'protected', 'public', 'static'];
28
+ /**
29
+ * Not reserved words, but strict-mode code cannot bind, assign, or shadow
30
+ * them.
31
+ */
32
+ export declare const restrictedNames: readonly ['arguments', 'eval'];
33
+ /**
34
+ * Every name FunctionalScript treats as a keyword, alphabetically: the
35
+ * {@link reservedWords}, the {@link strictModeReservedWords}, the
36
+ * {@link restrictedNames}, and `undefined` — an ordinary global in
37
+ * JavaScript that FunctionalScript keeps as a literal keyword.
38
+ *
39
+ * The proof verifies this list is exactly the sorted union of the groups,
40
+ * and `_KeywordsPinned` ties the two type-level unions together.
41
+ */
42
+ export declare const keywords: readonly ['arguments', 'await', 'break', 'case', 'catch', 'class', 'const', 'continue', 'debugger', 'default', 'delete', 'do', 'else', 'enum', 'eval', 'export', 'extends', 'false', 'finally', 'for', 'function', 'if', 'implements', 'import', 'in', 'instanceof', 'interface', 'let', 'new', 'null', 'package', 'private', 'protected', 'public', 'return', 'static', 'super', 'switch', 'this', 'throw', 'true', 'try', 'typeof', 'undefined', 'var', 'void', 'while', 'with', 'yield'];
43
+ export type _KeywordsPinned = Assert<Equal<typeof keywords[number], typeof reservedWords[number] | typeof strictModeReservedWords[number] | typeof restrictedNames[number] | 'undefined'>>;
44
+ /**
45
+ * @typedef {Assert<Equal<
46
+ * typeof keywords[number],
47
+ * | typeof reservedWords[number]
48
+ * | typeof strictModeReservedWords[number]
49
+ * | typeof restrictedNames[number]
50
+ * | 'undefined'
51
+ * >>} _KeywordsPinned
52
+ */
@@ -0,0 +1,72 @@
1
+ /**
2
+ * The JavaScript keywords — one source of truth.
3
+ *
4
+ * FunctionalScript is a strict subset of JavaScript: any FunctionalScript
5
+ * program must run the same on JavaScript. Every consumer that decides
6
+ * whether a name is a keyword — the JavaScript and DJS tokenizers, printers
7
+ * that emit identifiers — derives its set from this module instead of
8
+ * keeping a copy, so the sets cannot drift apart.
9
+ *
10
+ * @module
11
+ *
12
+ * @import { Assert } from '../../asserts/types.ts'
13
+ * @import { Equal } from '../../types/ts/types.ts'
14
+ */
15
+
16
+ /**
17
+ * The ECMAScript `ReservedWord` production
18
+ * ([ECMA-262 §12.7.2](https://tc39.es/ecma262/#prod-ReservedWord)) — never
19
+ * usable as identifiers.
20
+ */
21
+ export const reservedWords = /** @type {const} */ ([
22
+ 'await', 'break', 'case', 'catch', 'class', 'const', 'continue',
23
+ 'debugger', 'default', 'delete', 'do', 'else', 'enum', 'export',
24
+ 'extends', 'false', 'finally', 'for', 'function', 'if', 'import', 'in',
25
+ 'instanceof', 'new', 'null', 'return', 'super', 'switch', 'this',
26
+ 'throw', 'true', 'try', 'typeof', 'var', 'void', 'while', 'with',
27
+ 'yield',
28
+ ])
29
+
30
+ /**
31
+ * Reserved only in strict-mode code — and every module is strict-mode code,
32
+ * so FunctionalScript treats them exactly like {@link reservedWords}.
33
+ */
34
+ export const strictModeReservedWords = /** @type {const} */ ([
35
+ 'implements', 'interface', 'let', 'package', 'private', 'protected',
36
+ 'public', 'static',
37
+ ])
38
+
39
+ /**
40
+ * Not reserved words, but strict-mode code cannot bind, assign, or shadow
41
+ * them.
42
+ */
43
+ export const restrictedNames = /** @type {const} */ (['arguments', 'eval'])
44
+
45
+ /**
46
+ * Every name FunctionalScript treats as a keyword, alphabetically: the
47
+ * {@link reservedWords}, the {@link strictModeReservedWords}, the
48
+ * {@link restrictedNames}, and `undefined` — an ordinary global in
49
+ * JavaScript that FunctionalScript keeps as a literal keyword.
50
+ *
51
+ * The proof verifies this list is exactly the sorted union of the groups,
52
+ * and `_KeywordsPinned` ties the two type-level unions together.
53
+ */
54
+ export const keywords = /** @type {const} */ ([
55
+ 'arguments', 'await', 'break', 'case', 'catch', 'class', 'const',
56
+ 'continue', 'debugger', 'default', 'delete', 'do', 'else', 'enum',
57
+ 'eval', 'export', 'extends', 'false', 'finally', 'for', 'function',
58
+ 'if', 'implements', 'import', 'in', 'instanceof', 'interface', 'let',
59
+ 'new', 'null', 'package', 'private', 'protected', 'public', 'return',
60
+ 'static', 'super', 'switch', 'this', 'throw', 'true', 'try', 'typeof',
61
+ 'undefined', 'var', 'void', 'while', 'with', 'yield',
62
+ ])
63
+
64
+ /**
65
+ * @typedef {Assert<Equal<
66
+ * typeof keywords[number],
67
+ * | typeof reservedWords[number]
68
+ * | typeof strictModeReservedWords[number]
69
+ * | typeof restrictedNames[number]
70
+ * | 'undefined'
71
+ * >>} _KeywordsPinned
72
+ */
@@ -0,0 +1,3 @@
1
+ export declare const proof: {
2
+ aggregate: () => void;
3
+ };
@@ -0,0 +1,13 @@
1
+ import { assertEq } from '../../asserts/module.f.mjs'
2
+ import { keywords, reservedWords, restrictedNames, strictModeReservedWords } from './module.f.mjs'
3
+
4
+ export const proof = {
5
+ // `keywords` is exactly the sorted union of the groups plus `undefined`
6
+ aggregate: () => {
7
+ /** @type {readonly string[]} */
8
+ const union = [...reservedWords, ...strictModeReservedWords, ...restrictedNames, 'undefined']
9
+ // the names are unique, so the comparator never sees an equal pair
10
+ assertEq(keywords.join(), union.toSorted((a, b) => a < b ? -1 : 1).join())
11
+ assertEq(keywords.length, new Set(keywords).size)
12
+ },
13
+ }
@@ -1,26 +1,46 @@
1
1
  /**
2
2
  * JavaScript tokenizer built as a range-map state machine over code points,
3
3
  * producing tokens for keywords, identifiers, punctuators, comments, strings,
4
- * and numeric literals (including `BigFloat`).
4
+ * and numeric literals.
5
+ *
6
+ * Numeric scanning is lexeme-first: a `number` token carries the exact source
7
+ * text and no derived numeric value, so tokenization stays bounded by the
8
+ * input and never fails because a coefficient or exponent is too large for a
9
+ * runtime numeric type.
5
10
  *
6
11
  * @module
7
12
  *
8
- * @import { Scan, StateScan } from '../../types/function/operator/types.ts'
9
- * @import { RangeMapArray, RangeMerge } from '../../types/range_map/types.ts'
13
+ * @import { Reduce, Scan, StateScan } from '../../types/function/operator/types.ts'
14
+ * @import { RangeMerge } from '../../types/range_map/types.ts'
10
15
  * @import { List } from '../../types/list/types.ts'
11
16
  * @import { Entry } from '../../types/ordered_map/types.ts'
12
17
  * @import { Range as NumberRange } from '../../types/range/types.ts'
13
- * @import { StringToken, NumberToken, BigIntToken, ErrorToken, WhitespaceToken, NewLineToken, IdToken, CommentToken, EofToken, JsToken, TokenMetadata, JsTokenWithMetadata, _TokenizerStateWithMetadata, _TokenizerState, _ErrorMessage, _InitialState, _ParseIdState, _ParseWhitespaceState, _ParseNewLineState, _ParseStringState, _ParseEscapeCharState, _ParseOperatorState, _ParseCommentState, _ParseUnicodeCharState, _ParseNumberState, _ParseNumberBuffer, _InvalidNumberState, _EofState, _CharCodeOrEof, _ToToken, _CreateToToken, _RangeFunc, _RangeMapToToken, } from './types.ts'
18
+ * @import { JsToken, TokenMetadata, JsTokenWithMetadata, _TokenizerStateWithMetadata, _TokenizerState, _ErrorMessage, _InitialState, _ParseIdState, _ParseWhitespaceState, _ParseNewLineState, _ParseStringState, _ParseEscapeCharState, _ParseOperatorState, _ParseCommentState, _ParseUnicodeCharState, _ParseNumberState, _InvalidNumberState, _EofState, _CharCodeOrEof, _ToToken, _CreateToToken, _RangeFunc, _RangeMapToToken, TriviaKind, } from './types.ts'
14
19
  */
15
20
  import type { List } from '../../types/list/types.ts';
16
- import type { JsToken, JsTokenWithMetadata } from './types.ts';
21
+ import type { JsToken, JsTokenWithMetadata, TriviaKind } from './types.ts';
17
22
  /** @type {(token: JsToken) => boolean} */
18
23
  export declare const isKeywordToken: (token: JsToken) => boolean;
24
+ /**
25
+ * The coalescing rule for whitespace/newline trivia: a maximal run collapses
26
+ * to a single token, and a run containing any newline is an `nl`. Equal kinds
27
+ * coalesce; `nl` absorbs `ws`.
28
+ *
29
+ * Exported because `fjs/djs/tokenizer` produces the same token stream and must
30
+ * agree byte for byte — its scanner reaches the same four decisions from
31
+ * grammar tags. This module defines `JsToken`, so the rule is stated here once
32
+ * rather than re-derived on each side with only the proofs to catch a drift.
33
+ *
34
+ * @type {(a: TriviaKind, b: TriviaKind) => TriviaKind}
35
+ */
36
+ export declare const mergeTrivia: (a: TriviaKind, b: TriviaKind) => TriviaKind;
19
37
  /** @type {(input: List<number>) => (path: string) => List<JsTokenWithMetadata>} */
20
38
  export declare const tokenize: (input: List<number>) => (path: string) => List<JsTokenWithMetadata>;
21
39
  export declare const proof: {
22
40
  getOperatorTokenInvalid: () => void;
41
+ tokenizeCharCodeOpAfterEof: () => void;
42
+ tokenizeEofOpAfterEof: () => void;
23
43
  throw: {
24
- unionConflict: () => void;
44
+ unionConflict: () => number;
25
45
  };
26
46
  };