functionalscript 0.44.0 → 0.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (571) hide show
  1. package/README.md +5 -3
  2. package/fjs/asn.1/module.f.mjs +8 -1
  3. package/fjs/asn.1/proof.f.d.mts +15 -0
  4. package/fjs/asn.1/proof.f.mjs +31 -3
  5. package/fjs/asserts/module.f.d.mts +14 -0
  6. package/fjs/asserts/module.f.mjs +20 -0
  7. package/fjs/asserts/proof.f.d.mts +3 -0
  8. package/fjs/asserts/proof.f.mjs +15 -1
  9. package/fjs/basen/base128/module.f.mjs +22 -5
  10. package/fjs/basen/base128/proof.f.d.mts +3 -1
  11. package/fjs/basen/base128/proof.f.mjs +3 -1
  12. package/fjs/basen/base64/module.f.mjs +7 -3
  13. package/fjs/basen/base64/proof.f.d.mts +3 -1
  14. package/fjs/basen/base64/proof.f.mjs +7 -4
  15. package/fjs/basen/cbase32/proof.f.d.mts +3 -1
  16. package/fjs/basen/cbase32/proof.f.mjs +3 -1
  17. package/fjs/bnf/data/module.f.d.mts +32 -6
  18. package/fjs/bnf/data/module.f.mjs +112 -7
  19. package/fjs/bnf/data/proof.f.d.mts +2 -0
  20. package/fjs/bnf/data/proof.f.mjs +74 -4
  21. package/fjs/bnf/data/types.d.ts +20 -2
  22. package/fjs/bnf/descent/module.f.d.mts +34 -5
  23. package/fjs/bnf/descent/module.f.mjs +176 -54
  24. package/fjs/bnf/descent/proof.f.d.mts +3 -0
  25. package/fjs/bnf/descent/proof.f.mjs +189 -27
  26. package/fjs/bnf/descent/types.d.ts +24 -18
  27. package/fjs/bnf/ll1/module.f.d.mts +74 -6
  28. package/fjs/bnf/ll1/module.f.mjs +297 -95
  29. package/fjs/bnf/ll1/proof.f.d.mts +17 -2
  30. package/fjs/bnf/ll1/proof.f.mjs +372 -137
  31. package/fjs/bnf/ll1/types.d.ts +25 -27
  32. package/fjs/bnf/matcher/module.f.d.mts +66 -0
  33. package/fjs/bnf/matcher/module.f.mjs +81 -0
  34. package/fjs/bnf/matcher/proof.f.d.mts +10 -0
  35. package/fjs/bnf/matcher/proof.f.mjs +79 -0
  36. package/fjs/bnf/matcher/types.d.ts +54 -0
  37. package/fjs/bnf/module.f.d.mts +15 -6
  38. package/fjs/bnf/module.f.mjs +52 -11
  39. package/fjs/bnf/proof.f.d.mts +2 -0
  40. package/fjs/bnf/proof.f.mjs +79 -3
  41. package/fjs/bnf/testlib.f.d.mts +31 -0
  42. package/fjs/bnf/testlib.f.mjs +80 -0
  43. package/fjs/bnf/token_symbol/module.f.d.mts +4 -3
  44. package/fjs/bnf/token_symbol/module.f.mjs +7 -6
  45. package/fjs/bnf/token_symbol/proof.f.mjs +5 -2
  46. package/fjs/bnf/token_symbol/types.d.ts +2 -2
  47. package/fjs/bnf/types.d.ts +10 -3
  48. package/fjs/cas/cli/module.f.d.mts +1 -1
  49. package/fjs/cas/cli/module.f.mjs +14 -20
  50. package/fjs/cas/cli/proof.f.d.mts +4 -4
  51. package/fjs/cas/cli/proof.f.mjs +47 -34
  52. package/fjs/cas/evo/module.f.d.mts +71 -31
  53. package/fjs/cas/evo/module.f.mjs +223 -138
  54. package/fjs/cas/evo/proof.f.d.mts +10 -1
  55. package/fjs/cas/evo/proof.f.mjs +311 -226
  56. package/fjs/cas/evo/types.d.ts +45 -9
  57. package/fjs/cas/module.f.d.mts +18 -32
  58. package/fjs/cas/module.f.mjs +164 -176
  59. package/fjs/cas/proof.f.d.mts +11 -8
  60. package/fjs/cas/proof.f.mjs +259 -147
  61. package/fjs/cas/types.d.ts +24 -10
  62. package/fjs/ci/common/module.f.d.mts +1 -1
  63. package/fjs/ci/common/module.f.mjs +1 -0
  64. package/fjs/ci/config/module.f.d.mts +3 -3
  65. package/fjs/ci/config/module.f.mjs +3 -3
  66. package/fjs/ci/module.f.d.mts +5 -5
  67. package/fjs/ci/module.f.mjs +8 -7
  68. package/fjs/ci/nix/module.f.d.mts +7 -5
  69. package/fjs/ci/nix/module.f.mjs +13 -12
  70. package/fjs/ci/nix/proof.f.d.mts +2 -0
  71. package/fjs/ci/nix/proof.f.mjs +4 -4
  72. package/fjs/ci/proof.f.d.mts +4 -2
  73. package/fjs/ci/proof.f.mjs +13 -8
  74. package/fjs/cli/module.f.d.mts +4 -6
  75. package/fjs/cli/module.f.mjs +4 -8
  76. package/fjs/cli/proof.f.d.mts +4 -2
  77. package/fjs/cli/proof.f.mjs +21 -18
  78. package/fjs/cli/types.d.ts +2 -3
  79. package/fjs/common/monoid/module.f.d.mts +70 -12
  80. package/fjs/common/monoid/module.f.mjs +177 -14
  81. package/fjs/common/monoid/proof.f.d.mts +12 -1
  82. package/fjs/common/monoid/proof.f.mjs +88 -4
  83. package/fjs/common/monoid/types.d.ts +23 -0
  84. package/fjs/crypto/hmac/module.f.mjs +2 -2
  85. package/fjs/crypto/secp/proof.f.d.mts +3 -1
  86. package/fjs/crypto/secp/proof.f.mjs +3 -1
  87. package/fjs/crypto/sha2/module.f.mjs +3 -1
  88. package/fjs/crypto/sha2/proof.f.d.mts +4 -1
  89. package/fjs/crypto/sha2/proof.f.mjs +27 -1
  90. package/fjs/crypto/sha2/types.d.ts +11 -0
  91. package/fjs/crypto/sign/module.f.mjs +2 -2
  92. package/fjs/crypto/vdf/module.f.d.mts +23 -4
  93. package/fjs/crypto/vdf/module.f.mjs +6 -4
  94. package/fjs/dev/module.f.d.mts +17 -5
  95. package/fjs/dev/module.f.mjs +60 -30
  96. package/fjs/dev/update/module.f.d.mts +11 -3
  97. package/fjs/dev/update/module.f.mjs +16 -11
  98. package/fjs/dev/update/proof.f.d.mts +4 -3
  99. package/fjs/dev/update/proof.f.mjs +11 -7
  100. package/fjs/djs/module.f.d.mts +13 -5
  101. package/fjs/djs/module.f.mjs +31 -16
  102. package/fjs/djs/parser/module.f.d.mts +16 -3
  103. package/fjs/djs/parser/module.f.mjs +135 -16
  104. package/fjs/djs/parser/proof.f.d.mts +8 -1
  105. package/fjs/djs/parser/proof.f.mjs +287 -13
  106. package/fjs/djs/parser/types.d.ts +7 -1
  107. package/fjs/djs/proof.f.d.mts +20 -1
  108. package/fjs/djs/proof.f.mjs +190 -12
  109. package/fjs/djs/serializer/module.f.d.mts +25 -8
  110. package/fjs/djs/serializer/module.f.mjs +66 -19
  111. package/fjs/djs/serializer/proof.f.d.mts +5 -0
  112. package/fjs/djs/serializer/proof.f.mjs +23 -1
  113. package/fjs/djs/tokenizer/module.f.d.mts +17 -5
  114. package/fjs/djs/tokenizer/module.f.mjs +120 -73
  115. package/fjs/djs/tokenizer/proof.f.d.mts +3 -0
  116. package/fjs/djs/tokenizer/proof.f.mjs +86 -67
  117. package/fjs/djs/transpiler/module.f.d.mts +13 -19
  118. package/fjs/djs/transpiler/module.f.mjs +79 -72
  119. package/fjs/djs/transpiler/types.d.ts +29 -0
  120. package/fjs/djs/types.d.ts +7 -1
  121. package/fjs/effects/list/module.f.d.mts +23 -12
  122. package/fjs/effects/list/module.f.mjs +16 -12
  123. package/fjs/effects/list/types.d.ts +27 -7
  124. package/fjs/effects/memory/module.f.d.mts +6 -3
  125. package/fjs/effects/memory/module.f.mjs +7 -7
  126. package/fjs/effects/memory/proof.f.d.mts +4 -0
  127. package/fjs/effects/memory/proof.f.mjs +18 -9
  128. package/fjs/effects/memory/types.d.ts +4 -3
  129. package/fjs/effects/mock/module.f.d.mts +28 -4
  130. package/fjs/effects/mock/module.f.mjs +39 -5
  131. package/fjs/effects/mock/types.d.ts +10 -1
  132. package/fjs/effects/module.d.mts +12 -2
  133. package/fjs/effects/module.f.d.mts +469 -281
  134. package/fjs/effects/module.f.mjs +538 -299
  135. package/fjs/effects/module.mjs +11 -2
  136. package/fjs/effects/node/memory/module.d.mts +7 -2
  137. package/fjs/effects/node/memory/module.mjs +9 -5
  138. package/fjs/effects/node/memory/proof.d.mts +2 -0
  139. package/fjs/effects/node/memory/proof.mjs +12 -5
  140. package/fjs/effects/node/module.d.mts +8 -2
  141. package/fjs/effects/node/module.f.d.mts +183 -43
  142. package/fjs/effects/node/module.f.mjs +260 -62
  143. package/fjs/effects/node/module.mjs +61 -50
  144. package/fjs/effects/node/proof.f.d.mts +28 -2
  145. package/fjs/effects/node/proof.f.mjs +161 -42
  146. package/fjs/effects/node/types.d.ts +106 -18
  147. package/fjs/effects/node/virtual/module.f.d.mts +21 -4
  148. package/fjs/effects/node/virtual/module.f.mjs +113 -70
  149. package/fjs/effects/node/virtual/proof.f.d.mts +31 -2
  150. package/fjs/effects/node/virtual/proof.f.mjs +201 -8
  151. package/fjs/effects/proof.f.d.mts +69 -34
  152. package/fjs/effects/proof.f.mjs +413 -130
  153. package/fjs/effects/types.d.ts +161 -33
  154. package/fjs/emergent_testing/all.test.d.mts +8 -0
  155. package/fjs/emergent_testing/all.test.mjs +14 -0
  156. package/fjs/emergent_testing/module.f.d.mts +22 -10
  157. package/fjs/emergent_testing/module.f.mjs +119 -85
  158. package/fjs/emergent_testing/proof.f.d.mts +21 -7
  159. package/fjs/emergent_testing/proof.f.mjs +169 -35
  160. package/fjs/emergent_testing/types.d.ts +22 -4
  161. package/fjs/fsc/bnf.f.d.mts +3 -0
  162. package/fjs/fsc/bnf.f.mjs +4 -1
  163. package/fjs/fsc/json.f.d.mts +3 -0
  164. package/fjs/fsc/json.f.mjs +4 -1
  165. package/fjs/fsc/module.f.d.mts +9 -0
  166. package/fjs/fsc/module.f.mjs +5 -3
  167. package/fjs/fsm/module.f.d.mts +14 -4
  168. package/fjs/fsm/module.f.mjs +54 -37
  169. package/fjs/fsm/proof.f.d.mts +5 -0
  170. package/fjs/fsm/proof.f.mjs +87 -115
  171. package/fjs/js/keywords/module.f.d.mts +52 -0
  172. package/fjs/js/keywords/module.f.mjs +72 -0
  173. package/fjs/{emergent_testing/scenarios/return-value.pass.d.ts → js/keywords/proof.f.d.mts} +1 -1
  174. package/fjs/js/keywords/proof.f.mjs +13 -0
  175. package/fjs/js/tokenizer/module.f.d.mts +30 -3
  176. package/fjs/js/tokenizer/module.f.mjs +161 -211
  177. package/fjs/js/tokenizer/proof.f.d.mts +1 -0
  178. package/fjs/js/tokenizer/proof.f.mjs +54 -24
  179. package/fjs/js/tokenizer/types.d.ts +33 -24
  180. package/fjs/mcp/cas/module.f.d.mts +1 -6
  181. package/fjs/mcp/cas/module.f.mjs +55 -51
  182. package/fjs/mcp/cas/proof.f.d.mts +15 -0
  183. package/fjs/mcp/cas/proof.f.mjs +174 -0
  184. package/fjs/mcp/evo/module.f.d.mts +19 -10
  185. package/fjs/mcp/evo/module.f.mjs +48 -27
  186. package/fjs/mcp/evo/proof.f.d.mts +6 -1
  187. package/fjs/mcp/evo/proof.f.mjs +115 -31
  188. package/fjs/mcp/module.f.d.mts +39 -4
  189. package/fjs/mcp/module.f.mjs +14 -12
  190. package/fjs/mcp/proof.f.d.mts +13 -1
  191. package/fjs/mcp/proof.f.mjs +120 -61
  192. package/fjs/media/html/module.f.d.mts +12 -0
  193. package/fjs/media/html/module.f.mjs +7 -5
  194. package/fjs/media/html/proof.f.d.mts +3 -0
  195. package/fjs/media/html/proof.f.mjs +4 -1
  196. package/fjs/media/json/extended/module.f.d.mts +82 -0
  197. package/fjs/media/json/extended/module.f.mjs +153 -0
  198. package/fjs/media/json/extended/proof.f.d.mts +42 -0
  199. package/fjs/media/json/extended/proof.f.mjs +127 -0
  200. package/fjs/media/json/extended/types.d.ts +23 -0
  201. package/fjs/media/json/module.f.d.mts +8 -2
  202. package/fjs/media/json/module.f.mjs +43 -41
  203. package/fjs/media/json/number/module.f.d.mts +59 -0
  204. package/fjs/media/json/number/module.f.mjs +136 -0
  205. package/fjs/media/json/number/proof.f.d.mts +24 -0
  206. package/fjs/media/json/number/proof.f.mjs +86 -0
  207. package/fjs/media/json/number/types.d.ts +28 -0
  208. package/fjs/media/json/parser/module.f.d.mts +25 -13
  209. package/fjs/media/json/parser/module.f.mjs +133 -72
  210. package/fjs/media/json/parser/proof.f.d.mts +5 -0
  211. package/fjs/media/json/parser/proof.f.mjs +31 -1
  212. package/fjs/media/json/parser/types.d.ts +38 -14
  213. package/fjs/media/json/rtti/module.f.d.mts +1 -1
  214. package/fjs/media/json/rtti/module.f.mjs +1 -1
  215. package/fjs/media/json/rtti/proof.f.d.mts +3 -0
  216. package/fjs/media/json/rtti/proof.f.mjs +12 -12
  217. package/fjs/media/json/schema/module.f.d.mts +61 -27
  218. package/fjs/media/json/schema/module.f.mjs +218 -63
  219. package/fjs/media/json/schema/proof.f.d.mts +41 -1
  220. package/fjs/media/json/schema/proof.f.mjs +220 -9
  221. package/fjs/media/json/serializer/module.f.d.mts +44 -0
  222. package/fjs/media/json/serializer/module.f.mjs +71 -9
  223. package/fjs/media/json/tokenizer/module.f.d.mts +8 -0
  224. package/fjs/media/json/tokenizer/module.f.mjs +31 -8
  225. package/fjs/media/json/tokenizer/proof.f.d.mts +6 -0
  226. package/fjs/media/json/tokenizer/proof.f.mjs +62 -21
  227. package/fjs/media/json/types.d.ts +36 -10
  228. package/fjs/media/lock/module.f.d.mts +100 -0
  229. package/fjs/media/lock/module.f.mjs +125 -0
  230. package/fjs/media/lock/proof.f.d.mts +33 -0
  231. package/fjs/media/lock/proof.f.mjs +196 -0
  232. package/fjs/media/lock/types.d.ts +15 -0
  233. package/fjs/media/module.f.d.mts +6 -5
  234. package/fjs/media/module.f.mjs +8 -7
  235. package/fjs/media/nix/module.f.d.mts +13 -0
  236. package/fjs/media/nix/module.f.mjs +4 -2
  237. package/fjs/media/nix/proof.f.d.mts +3 -0
  238. package/fjs/media/nix/proof.f.mjs +4 -1
  239. package/fjs/media/note/module.f.d.mts +121 -0
  240. package/fjs/media/note/module.f.mjs +131 -0
  241. package/fjs/media/note/proof.f.d.mts +29 -0
  242. package/fjs/media/note/proof.f.mjs +150 -0
  243. package/fjs/media/note/types.d.ts +10 -0
  244. package/fjs/media/proof.f.d.mts +4 -1
  245. package/fjs/media/proof.f.mjs +40 -21
  246. package/fjs/media/revision/module.f.d.mts +83 -7
  247. package/fjs/media/revision/module.f.mjs +127 -23
  248. package/fjs/media/revision/proof.f.d.mts +14 -0
  249. package/fjs/media/revision/proof.f.mjs +93 -2
  250. package/fjs/media/revision/types.d.ts +34 -5
  251. package/fjs/media/type/module.f.d.mts +53 -18
  252. package/fjs/media/type/module.f.mjs +87 -97
  253. package/fjs/media/type/proof.f.d.mts +17 -0
  254. package/fjs/media/type/proof.f.mjs +73 -13
  255. package/fjs/module.d.mts +5 -0
  256. package/fjs/module.f.d.mts +8 -0
  257. package/fjs/module.f.mjs +33 -10
  258. package/fjs/module.mjs +6 -0
  259. package/fjs/nanvm/proof.f.mjs +3 -3
  260. package/fjs/nanvm/rust/module.f.mjs +1 -1
  261. package/fjs/nanvm/update/module.f.d.mts +4 -4
  262. package/fjs/nanvm/update/module.f.mjs +8 -9
  263. package/fjs/nanvm/update/proof.f.mjs +4 -3
  264. package/fjs/path/module.f.d.mts +8 -0
  265. package/fjs/path/module.f.mjs +4 -2
  266. package/fjs/proof.f.d.mts +7 -3
  267. package/fjs/proof.f.mjs +41 -12
  268. package/fjs/protocol/json_rpc/module.f.d.mts +3 -3
  269. package/fjs/protocol/json_rpc/module.f.mjs +10 -7
  270. package/fjs/protocol/json_rpc/proof.f.d.mts +6 -0
  271. package/fjs/protocol/json_rpc/proof.f.mjs +26 -5
  272. package/fjs/protocol/mcp/module.f.d.mts +10 -13
  273. package/fjs/protocol/mcp/module.f.mjs +74 -58
  274. package/fjs/protocol/mcp/proof.f.d.mts +16 -3
  275. package/fjs/protocol/mcp/proof.f.mjs +224 -69
  276. package/fjs/protocol/mcp/stdio/module.f.d.mts +17 -11
  277. package/fjs/protocol/mcp/stdio/module.f.mjs +39 -33
  278. package/fjs/protocol/mcp/stdio/proof.f.d.mts +5 -3
  279. package/fjs/protocol/mcp/stdio/proof.f.mjs +46 -13
  280. package/fjs/protocol/mcp/stdio/types.d.ts +14 -0
  281. package/fjs/protocol/mcp/types.d.ts +17 -6
  282. package/fjs/sul/id/module.f.d.mts +4 -0
  283. package/fjs/sul/id/module.f.mjs +6 -6
  284. package/fjs/sul/level/hash/module.f.d.mts +4 -1
  285. package/fjs/sul/level/hash/module.f.mjs +6 -4
  286. package/fjs/sul/level/hash/proof.f.d.mts +4 -0
  287. package/fjs/sul/level/hash/proof.f.mjs +7 -4
  288. package/fjs/sul/level/literal/module.f.d.mts +4 -1
  289. package/fjs/sul/level/literal/module.f.mjs +4 -3
  290. package/fjs/sul/level/literal/proof.f.d.mts +3 -0
  291. package/fjs/sul/level/literal/proof.f.mjs +4 -1
  292. package/fjs/sul/module.f.d.mts +5 -3
  293. package/fjs/sul/module.f.mjs +23 -17
  294. package/fjs/sul/proof.f.d.mts +4 -0
  295. package/fjs/sul/proof.f.mjs +5 -2
  296. package/fjs/text/ascii/module.f.d.mts +26 -0
  297. package/fjs/text/ascii/module.f.mjs +49 -1
  298. package/fjs/text/ascii/proof.f.d.mts +10 -0
  299. package/fjs/text/ascii/proof.f.mjs +33 -1
  300. package/fjs/text/code_point/module.f.d.mts +29 -3
  301. package/fjs/text/code_point/module.f.mjs +32 -9
  302. package/fjs/text/code_point/proof.f.d.mts +2 -0
  303. package/fjs/text/code_point/proof.f.mjs +39 -0
  304. package/fjs/text/module.f.d.mts +4 -2
  305. package/fjs/text/module.f.mjs +4 -3
  306. package/fjs/text/proof.f.d.mts +3 -0
  307. package/fjs/text/proof.f.mjs +4 -1
  308. package/fjs/text/sgr/module.f.d.mts +6 -5
  309. package/fjs/text/sgr/module.f.mjs +8 -8
  310. package/fjs/text/sgr/proof.f.d.mts +3 -0
  311. package/fjs/text/sgr/proof.f.mjs +4 -1
  312. package/fjs/text/utf16/module.f.d.mts +5 -1
  313. package/fjs/text/utf16/module.f.mjs +38 -35
  314. package/fjs/text/utf16/proof.f.d.mts +3 -1
  315. package/fjs/text/utf16/proof.f.mjs +19 -2
  316. package/fjs/text/utf8/module.f.d.mts +9 -5
  317. package/fjs/text/utf8/module.f.mjs +20 -20
  318. package/fjs/types/array/module.f.d.mts +2 -1
  319. package/fjs/types/array/module.f.mjs +16 -4
  320. package/fjs/types/bigfloat/module.f.d.mts +21 -1
  321. package/fjs/types/bigfloat/module.f.mjs +33 -7
  322. package/fjs/types/bigfloat/proof.f.d.mts +1 -0
  323. package/fjs/types/bigfloat/proof.f.mjs +46 -0
  324. package/fjs/types/bigint/module.f.d.mts +4 -0
  325. package/fjs/types/bigint/module.f.mjs +4 -3
  326. package/fjs/types/bit_vec/module.f.d.mts +10 -16
  327. package/fjs/types/bit_vec/module.f.mjs +99 -95
  328. package/fjs/types/bit_vec/proof.f.d.mts +6 -0
  329. package/fjs/types/bit_vec/proof.f.mjs +31 -5
  330. package/fjs/types/btree/find/module.f.d.mts +5 -1
  331. package/fjs/types/btree/find/module.f.mjs +5 -5
  332. package/fjs/types/btree/find/proof.f.d.mts +5 -1
  333. package/fjs/types/btree/find/proof.f.mjs +5 -3
  334. package/fjs/types/btree/module.f.d.mts +3 -0
  335. package/fjs/types/btree/module.f.mjs +3 -2
  336. package/fjs/types/btree/proof.f.d.mts +5 -1
  337. package/fjs/types/btree/proof.f.mjs +5 -3
  338. package/fjs/types/btree/remove/module.f.d.mts +11 -0
  339. package/fjs/types/btree/remove/module.f.mjs +10 -10
  340. package/fjs/types/btree/remove/proof.f.d.mts +3 -0
  341. package/fjs/types/btree/remove/proof.f.mjs +4 -1
  342. package/fjs/types/btree/set/module.f.d.mts +9 -0
  343. package/fjs/types/btree/set/module.f.mjs +14 -17
  344. package/fjs/types/btree/set/proof.f.d.mts +3 -0
  345. package/fjs/types/btree/set/proof.f.mjs +16 -1
  346. package/fjs/types/btree/types/module.f.d.mts +2 -1
  347. package/fjs/types/btree/types/module.f.mjs +2 -1
  348. package/fjs/types/byte_set/module.f.d.mts +20 -4
  349. package/fjs/types/byte_set/module.f.mjs +18 -8
  350. package/fjs/types/byte_set/proof.f.d.mts +3 -1
  351. package/fjs/types/byte_set/proof.f.mjs +10 -8
  352. package/fjs/types/function/compare/module.f.d.mts +3 -2
  353. package/fjs/types/function/compare/module.f.mjs +13 -5
  354. package/fjs/types/function/module.f.d.mts +8 -1
  355. package/fjs/types/function/module.f.mjs +8 -1
  356. package/fjs/types/function/operator/module.f.d.mts +2 -1
  357. package/fjs/types/function/operator/module.f.mjs +2 -2
  358. package/fjs/types/list/module.f.d.mts +10 -3
  359. package/fjs/types/list/module.f.mjs +6 -4
  360. package/fjs/types/list/proof.f.d.mts +4 -1
  361. package/fjs/types/list/proof.f.mjs +4 -2
  362. package/fjs/types/nibble_set/module.f.d.mts +2 -1
  363. package/fjs/types/nibble_set/module.f.mjs +2 -2
  364. package/fjs/types/nominal/module.f.d.mts +2 -1
  365. package/fjs/types/nominal/module.f.mjs +2 -1
  366. package/fjs/types/nullable/module.f.d.mts +26 -6
  367. package/fjs/types/nullable/module.f.mjs +25 -6
  368. package/fjs/types/nullable/proof.f.d.mts +4 -0
  369. package/fjs/types/nullable/proof.f.mjs +15 -0
  370. package/fjs/types/number/module.f.d.mts +4 -0
  371. package/fjs/types/number/module.f.mjs +4 -3
  372. package/fjs/types/object/module.f.d.mts +26 -4
  373. package/fjs/types/object/module.f.mjs +26 -7
  374. package/fjs/types/object/proof.f.d.mts +5 -2
  375. package/fjs/types/object/proof.f.mjs +6 -3
  376. package/fjs/types/object/structurally_same/module.f.d.mts +39 -0
  377. package/fjs/types/object/structurally_same/module.f.mjs +59 -0
  378. package/fjs/types/object/structurally_same/proof.f.d.mts +6 -0
  379. package/fjs/types/object/structurally_same/proof.f.mjs +73 -0
  380. package/fjs/types/ordered_map/module.f.d.mts +5 -0
  381. package/fjs/types/ordered_map/module.f.mjs +5 -4
  382. package/fjs/types/ordered_map/proof.f.d.mts +3 -0
  383. package/fjs/types/ordered_map/proof.f.mjs +4 -1
  384. package/fjs/types/patricia_trie/module.f.d.mts +2 -1
  385. package/fjs/types/patricia_trie/module.f.mjs +27 -12
  386. package/fjs/types/patricia_trie/proof.f.d.mts +3 -0
  387. package/fjs/types/patricia_trie/proof.f.mjs +4 -1
  388. package/fjs/types/prime_field/module.f.d.mts +3 -1
  389. package/fjs/types/prime_field/module.f.mjs +3 -2
  390. package/fjs/types/range/module.f.d.mts +2 -1
  391. package/fjs/types/range/module.f.mjs +2 -2
  392. package/fjs/types/range_map/module.f.d.mts +6 -0
  393. package/fjs/types/range_map/module.f.mjs +6 -9
  394. package/fjs/types/range_map/proof.f.d.mts +5 -1
  395. package/fjs/types/range_map/proof.f.mjs +5 -3
  396. package/fjs/types/range_set/module.f.d.mts +5 -0
  397. package/fjs/types/range_set/module.f.mjs +1 -0
  398. package/fjs/types/range_set/proof.f.d.mts +3 -0
  399. package/fjs/types/range_set/proof.f.mjs +4 -1
  400. package/fjs/types/result/module.d.mts +8 -0
  401. package/fjs/types/result/module.f.d.mts +37 -7
  402. package/fjs/types/result/module.f.mjs +38 -8
  403. package/fjs/types/result/module.mjs +9 -1
  404. package/fjs/types/result/proof.f.d.mts +5 -0
  405. package/fjs/types/result/proof.f.mjs +22 -2
  406. package/fjs/types/rtti/common/module.f.d.mts +44 -14
  407. package/fjs/types/rtti/common/module.f.mjs +42 -36
  408. package/fjs/types/rtti/common/proof.f.d.mts +4 -0
  409. package/fjs/types/rtti/common/proof.f.mjs +10 -7
  410. package/fjs/types/rtti/data/module.f.d.mts +134 -0
  411. package/fjs/types/rtti/data/module.f.mjs +1053 -0
  412. package/fjs/types/rtti/data/proof.f.d.mts +76 -0
  413. package/fjs/types/rtti/data/proof.f.mjs +589 -0
  414. package/fjs/types/rtti/data/types.d.ts +83 -0
  415. package/fjs/types/rtti/module.f.d.mts +12 -5
  416. package/fjs/types/rtti/module.f.mjs +7 -5
  417. package/fjs/types/rtti/parse/module.f.d.mts +48 -0
  418. package/fjs/types/rtti/parse/module.f.mjs +45 -34
  419. package/fjs/types/rtti/parse/proof.f.d.mts +3 -2
  420. package/fjs/types/rtti/parse/proof.f.mjs +51 -52
  421. package/fjs/types/rtti/proof.f.d.mts +3 -1
  422. package/fjs/types/rtti/proof.f.mjs +6 -2
  423. package/fjs/types/rtti/ts/module.f.d.mts +68 -9
  424. package/fjs/types/rtti/ts/module.f.mjs +258 -30
  425. package/fjs/types/rtti/ts/proof.f.d.mts +44 -0
  426. package/fjs/types/rtti/ts/proof.f.mjs +152 -4
  427. package/fjs/types/rtti/ts/types.d.ts +25 -1
  428. package/fjs/types/rtti/types.d.ts +40 -0
  429. package/fjs/types/sorted_list/module.f.d.mts +4 -1
  430. package/fjs/types/sorted_list/module.f.mjs +21 -12
  431. package/fjs/types/sorted_list/proof.f.d.mts +3 -1
  432. package/fjs/types/sorted_list/proof.f.mjs +3 -1
  433. package/fjs/types/sorted_set/module.f.d.mts +49 -1
  434. package/fjs/types/sorted_set/module.f.mjs +26 -2
  435. package/fjs/types/sorted_set/proof.f.d.mts +4 -1
  436. package/fjs/types/sorted_set/proof.f.mjs +19 -2
  437. package/fjs/types/string/module.f.d.mts +4 -0
  438. package/fjs/types/string/module.f.mjs +4 -3
  439. package/fjs/types/string_set/module.f.d.mts +3 -1
  440. package/fjs/types/string_set/module.f.mjs +3 -2
  441. package/fjs/types/ts/module.f.d.mts +2 -0
  442. package/fjs/types/ts/module.f.mjs +3 -3
  443. package/fjs/types/ts/proof.f.d.mts +1 -0
  444. package/fjs/types/ts/proof.f.mjs +5 -0
  445. package/fjs/types/ts/types.d.ts +6 -1
  446. package/fjs/types/uint8array/module.f.d.mts +13 -2
  447. package/fjs/types/uint8array/module.f.mjs +20 -15
  448. package/fjs/website/module.f.d.mts +5 -2
  449. package/fjs/website/module.f.mjs +6 -8
  450. package/fjs/website/proof.f.mjs +2 -1
  451. package/package.json +3 -3
  452. package/fjs/asn.1/types.js +0 -6
  453. package/fjs/asserts/types.js +0 -6
  454. package/fjs/basen/types.js +0 -6
  455. package/fjs/bnf/data/types.js +0 -6
  456. package/fjs/bnf/descent/types.js +0 -6
  457. package/fjs/bnf/ll1/types.js +0 -6
  458. package/fjs/bnf/token_symbol/types.js +0 -6
  459. package/fjs/bnf/types.js +0 -6
  460. package/fjs/cas/evo/types.js +0 -7
  461. package/fjs/cas/types.js +0 -6
  462. package/fjs/ci/common/types.js +0 -1
  463. package/fjs/ci/nix/types.js +0 -6
  464. package/fjs/ci/types.js +0 -6
  465. package/fjs/cli/types.js +0 -6
  466. package/fjs/common/monoid/types.js +0 -6
  467. package/fjs/crypto/pow/types.js +0 -6
  468. package/fjs/crypto/secp/types.js +0 -6
  469. package/fjs/crypto/sha2/types.js +0 -6
  470. package/fjs/crypto/sign/types.js +0 -6
  471. package/fjs/crypto/vdf/types.js +0 -6
  472. package/fjs/dev/package_json/module.f.d.mts +0 -32
  473. package/fjs/dev/package_json/module.f.mjs +0 -37
  474. package/fjs/dev/package_json/proof.f.d.mts +0 -6
  475. package/fjs/dev/package_json/proof.f.mjs +0 -32
  476. package/fjs/dev/types.js +0 -6
  477. package/fjs/djs/ast/types.js +0 -8
  478. package/fjs/djs/parser/types.js +0 -7
  479. package/fjs/djs/tokenizer/types.js +0 -7
  480. package/fjs/djs/types.js +0 -7
  481. package/fjs/effects/eff/module.f.d.mts +0 -10
  482. package/fjs/effects/eff/module.f.mjs +0 -68
  483. package/fjs/effects/eff/proof.f.d.mts +0 -12
  484. package/fjs/effects/eff/proof.f.mjs +0 -66
  485. package/fjs/effects/eff/types.d.ts +0 -71
  486. package/fjs/effects/eff/types.js +0 -6
  487. package/fjs/effects/list/types.js +0 -6
  488. package/fjs/effects/memory/types.js +0 -6
  489. package/fjs/effects/mock/types.js +0 -6
  490. package/fjs/effects/node/types.js +0 -6
  491. package/fjs/effects/node/virtual/types.js +0 -7
  492. package/fjs/effects/types.js +0 -6
  493. package/fjs/emergent_testing/all.test.d.ts +0 -1
  494. package/fjs/emergent_testing/all.test.js +0 -5
  495. package/fjs/emergent_testing/scenarios/all.d.ts +0 -1
  496. package/fjs/emergent_testing/scenarios/all.js +0 -1
  497. package/fjs/emergent_testing/scenarios/async-subtests.fail.d.ts +0 -6
  498. package/fjs/emergent_testing/scenarios/async-subtests.fail.js +0 -9
  499. package/fjs/emergent_testing/scenarios/async-subtests.pass.d.ts +0 -6
  500. package/fjs/emergent_testing/scenarios/async-subtests.pass.js +0 -9
  501. package/fjs/emergent_testing/scenarios/async.fail.d.ts +0 -3
  502. package/fjs/emergent_testing/scenarios/async.fail.js +0 -6
  503. package/fjs/emergent_testing/scenarios/async.pass.d.ts +0 -3
  504. package/fjs/emergent_testing/scenarios/async.pass.js +0 -5
  505. package/fjs/emergent_testing/scenarios/fail.fail.d.ts +0 -3
  506. package/fjs/emergent_testing/scenarios/fail.fail.js +0 -3
  507. package/fjs/emergent_testing/scenarios/return-value.pass.js +0 -4
  508. package/fjs/emergent_testing/scenarios/thenable.pass.d.ts +0 -5
  509. package/fjs/emergent_testing/scenarios/thenable.pass.js +0 -11
  510. package/fjs/emergent_testing/scenarios/thenable2.pass.d.ts +0 -5
  511. package/fjs/emergent_testing/scenarios/thenable2.pass.js +0 -3
  512. package/fjs/emergent_testing/scenarios/throw.pass.d.ts +0 -5
  513. package/fjs/emergent_testing/scenarios/throw.pass.js +0 -3
  514. package/fjs/emergent_testing/types.js +0 -6
  515. package/fjs/js/tokenizer/types.js +0 -6
  516. package/fjs/media/html/types.js +0 -6
  517. package/fjs/media/json/parser/types.js +0 -6
  518. package/fjs/media/json/tokenizer/types.js +0 -6
  519. package/fjs/media/json/types.js +0 -13
  520. package/fjs/media/nix/types.js +0 -6
  521. package/fjs/media/revision/types.js +0 -8
  522. package/fjs/media/type/types.js +0 -6
  523. package/fjs/media/types.js +0 -7
  524. package/fjs/nanvm/types.js +0 -11
  525. package/fjs/protocol/json_rpc/types.js +0 -8
  526. package/fjs/protocol/mcp/types.js +0 -8
  527. package/fjs/sul/id/types.js +0 -6
  528. package/fjs/sul/level/hash/types.js +0 -6
  529. package/fjs/sul/level/literal/types.js +0 -6
  530. package/fjs/sul/types.js +0 -6
  531. package/fjs/text/sgr/types.js +0 -6
  532. package/fjs/text/types.js +0 -6
  533. package/fjs/text/utf16/types.js +0 -6
  534. package/fjs/text/utf8/types.js +0 -6
  535. package/fjs/types/array/types.js +0 -6
  536. package/fjs/types/bigfloat/types.js +0 -6
  537. package/fjs/types/bigint/types.js +0 -6
  538. package/fjs/types/bit_vec/types.js +0 -6
  539. package/fjs/types/btree/find/types.js +0 -6
  540. package/fjs/types/btree/types/types.js +0 -6
  541. package/fjs/types/byte_set/types.js +0 -6
  542. package/fjs/types/function/compare/types.js +0 -6
  543. package/fjs/types/function/operator/types.js +0 -6
  544. package/fjs/types/function/types.js +0 -6
  545. package/fjs/types/list/types.js +0 -6
  546. package/fjs/types/nibble_set/types.js +0 -6
  547. package/fjs/types/nominal/types.js +0 -6
  548. package/fjs/types/nullable/types.js +0 -6
  549. package/fjs/types/object/types.js +0 -8
  550. package/fjs/types/option/types.js +0 -6
  551. package/fjs/types/ordered_map/types.js +0 -6
  552. package/fjs/types/patricia_trie/types.js +0 -6
  553. package/fjs/types/phantom/types.js +0 -11
  554. package/fjs/types/prime_field/types.js +0 -6
  555. package/fjs/types/range/types.js +0 -6
  556. package/fjs/types/range_map/types.js +0 -6
  557. package/fjs/types/result/types.js +0 -6
  558. package/fjs/types/rtti/common/types.js +0 -1
  559. package/fjs/types/rtti/parse/types.js +0 -1
  560. package/fjs/types/rtti/ts/types.js +0 -1
  561. package/fjs/types/rtti/types.js +0 -1
  562. package/fjs/types/rtti/validate/module.f.d.mts +0 -6
  563. package/fjs/types/rtti/validate/module.f.mjs +0 -169
  564. package/fjs/types/rtti/validate/proof.f.d.mts +0 -125
  565. package/fjs/types/rtti/validate/proof.f.mjs +0 -437
  566. package/fjs/types/rtti/validate/types.d.ts +0 -6
  567. package/fjs/types/rtti/validate/types.js +0 -1
  568. package/fjs/types/sorted_list/types.js +0 -6
  569. package/fjs/types/sorted_set/types.js +0 -6
  570. package/fjs/types/string_set/types.js +0 -6
  571. package/fjs/types/ts/types.js +0 -8
@@ -1,15 +1,16 @@
1
1
  /**
2
- * @import { Unknown as JsonValue } from '../types.ts'
3
2
  * @import { Unknown } from './module.f.mjs'
3
+ * @import { Data } from '../../../types/rtti/data/types.ts'
4
4
  */
5
5
 
6
- import { boolean, number, string, bigint, unknown, array, record, or, option } from '../../../types/rtti/module.f.mjs'
6
+ import { boolean, number, string, bigint, never, unknown, array, record, or, option } from '../../../types/rtti/module.f.mjs'
7
7
  import { stringify } from '../module.f.mjs'
8
- import { toJsonSchema, unknown as schemaUnknown } from './module.f.mjs'
8
+ import { dataToJsonSchema, toJsonSchema, unknown as schemaUnknown } from './module.f.mjs'
9
+ import { unitBit } from '../../../types/rtti/data/module.f.mjs'
9
10
  import { assert, assertEq } from '../../../asserts/module.f.mjs'
10
11
 
11
12
  /** @type {(v: Unknown) => string} */
12
- const serialize = v => stringify(e => e)(/** @type {JsonValue} */ (/** @type {unknown} */ (v)))
13
+ const serialize = v => stringify(e => e)(v)
13
14
 
14
15
  /** @type {(rtti: Parameters<typeof toJsonSchema>[0], expected: Unknown) => () => void} */
15
16
  const eq = (rtti, expected) => () => {
@@ -18,6 +19,46 @@ const eq = (rtti, expected) => () => {
18
19
  assertEq(result, exp, [result, exp])
19
20
  }
20
21
 
22
+ /** @type {(data: Data, expected: Unknown) => () => void} */
23
+ const eqData = (data, expected) => () => {
24
+ const result = serialize(dataToJsonSchema(data))
25
+ const exp = serialize(expected)
26
+ assertEq(result, exp, [result, exp])
27
+ }
28
+
29
+ /** A recursive list: `type _List = readonly _List[]`. */
30
+ /** @typedef {() => readonly ['array', _List]} _List */
31
+ /** @type {_List} */
32
+ const list = () => ['array', list]
33
+
34
+ /** Mutual recursion through a container. */
35
+ /** @typedef {() => readonly ['or', typeof number, _Forest]} _Tree */
36
+ /** @typedef {() => readonly ['array', _Tree]} _Forest */
37
+ /** @type {_Tree} */
38
+ const tree = () => ['or', number, forest]
39
+ /** @type {_Forest} */
40
+ const forest = () => ['array', tree]
41
+
42
+ /** The recursive revision lock schema. Its cycle closes through the
43
+ * anonymous `or` thunk, which becomes the (empty-string-named) rule. */
44
+ /** @typedef {() => readonly ['record', () => readonly ['or', typeof string, _Lock]]} _Lock */
45
+ /** @type {_Lock} */
46
+ const lock = () => ['record', or(string, lock)]
47
+
48
+ /** Self-recursive record. */
49
+ /** @typedef {() => readonly ['record', _Rec]} _Rec */
50
+ /** @type {_Rec} */
51
+ const rec = () => ['record', rec]
52
+
53
+ const listRef = /** @type {const} */ ({ $ref: '#/$defs/list' })
54
+ const treeRef = /** @type {const} */ ({ $ref: '#/$defs/tree' })
55
+
56
+ /** @type {Unknown} */
57
+ const listDef = { type: 'array', items: listRef }
58
+
59
+ /** @type {Unknown} */
60
+ const treeDef = { anyOf: [{ type: 'number' }, { type: 'array', items: treeRef }] }
61
+
21
62
  export const proof = {
22
63
  tag0: {
23
64
  boolean: eq(boolean, { type: 'boolean' }),
@@ -37,10 +78,12 @@ export const proof = {
37
78
  },
38
79
  array: eq(array(number), { type: 'array', items: { type: 'number' } }),
39
80
  record: eq(record(string), { type: 'object', additionalProperties: { type: 'string' } }),
40
- or: eq(or(string, number), { anyOf: [{ type: 'string' }, { type: 'number' }] }),
81
+ // `anyOf` members follow the canonical kind order, not the operand order
82
+ or: eq(or(string, number), { anyOf: [{ type: 'number' }, { type: 'string' }] }),
41
83
  tuple: eq(/** @type {const} */ ([number, string]), {
42
84
  type: 'array',
43
85
  prefixItems: [{ type: 'number' }, { type: 'string' }],
86
+ minItems: 2,
44
87
  items: false,
45
88
  }),
46
89
  struct: {
@@ -58,16 +101,35 @@ export const proof = {
58
101
  type: 'object',
59
102
  properties: { x: { type: 'number' } },
60
103
  }),
61
- empty: eq(/** @type {const} */ ({}), { type: 'object', properties: {} }),
104
+ // an unconstrained struct is the whole object kind
105
+ empty: eq(/** @type {const} */ ({}), { type: 'object' }),
62
106
  orOptional: eq(/** @type {const} */ ({ x: or(string, number, undefined) }), {
63
107
  type: 'object',
64
- properties: { x: { anyOf: [{ type: 'string' }, { type: 'number' }] } },
108
+ properties: { x: { anyOf: [{ type: 'number' }, { type: 'string' }] } },
65
109
  }),
66
110
  withConst: eq(/** @type {const} */ ({ x: null, y: string }), {
67
111
  type: 'object',
68
112
  properties: { x: { const: null }, y: { type: 'string' } },
69
113
  required: ['x', 'y'],
70
114
  }),
115
+ optionalOfEveryKind: eq(/** @type {const} */ ({
116
+ a: option(number),
117
+ b: option(string),
118
+ c: option(bigint),
119
+ d: option(array(number)),
120
+ e: option(record(string)),
121
+ f: or(null, undefined),
122
+ }), {
123
+ type: 'object',
124
+ properties: {
125
+ a: { type: 'number' },
126
+ b: { type: 'string' },
127
+ c: { type: 'integer' },
128
+ d: { type: 'array', items: { type: 'number' } },
129
+ e: { type: 'object', additionalProperties: { type: 'string' } },
130
+ f: { const: null },
131
+ },
132
+ }),
71
133
  },
72
134
  schemaUnknownTag: () => {
73
135
  const r = schemaUnknown()
@@ -79,15 +141,164 @@ export const proof = {
79
141
  items: { type: 'object', additionalProperties: { type: 'boolean' } },
80
142
  }),
81
143
  orWithConst: eq(or(null, string, /** @type {const} */ (42)), {
82
- anyOf: [{ const: null }, { type: 'string' }, { const: 42 }],
144
+ anyOf: [{ const: null }, { const: 42 }, { type: 'string' }],
83
145
  }),
84
146
  structWithOr: eq(/** @type {const} */ ({ id: or(string, number), name: option(string) }), {
85
147
  type: 'object',
86
148
  properties: {
87
- id: { anyOf: [{ type: 'string' }, { type: 'number' }] },
149
+ id: { anyOf: [{ type: 'number' }, { type: 'string' }] },
88
150
  name: { type: 'string' },
89
151
  },
90
152
  required: ['id'],
91
153
  }),
154
+ topInsideTuple: eq(/** @type {const} */ ([unknown, number]), {
155
+ type: 'array',
156
+ prefixItems: [{}, { type: 'number' }],
157
+ minItems: 2,
158
+ items: false,
159
+ }),
160
+ },
161
+ normalization: {
162
+ booleanFromConsts: eq(or(true, false), { type: 'boolean' }),
163
+ unitMembers: eq(or(null, undefined, true), {
164
+ anyOf: [{ const: null }, { not: {} }, { const: true }],
165
+ }),
166
+ literalAbsorbed: eq(or(/** @type {const} */ (42), number), { type: 'number' }),
167
+ duplicateLiteral: eq(or(/** @type {const} */ (1), /** @type {const} */ (1)), { const: 1 }),
168
+ never: eq(never, { not: {} }),
169
+ emptyTuple: eq(/** @type {const} */ ([]), { type: 'array', items: false }),
170
+ // `readonly [number] ⊂ readonly number[]` — the tuple pattern is dropped
171
+ coverageCollapse: eq(or(/** @type {const} */ ([number]), array(number)), {
172
+ type: 'array',
173
+ items: { type: 'number' },
174
+ }),
175
+ commutative: () => {
176
+ const a = serialize(toJsonSchema(or(string, number)))
177
+ const b = serialize(toJsonSchema(or(number, string)))
178
+ assertEq(a, b, [a, b])
179
+ },
180
+ },
181
+ recursion: {
182
+ selfList: eq(list, { ...listRef, $defs: { list: listDef } }),
183
+ mutualEntry: eq(tree, { ...treeRef, $defs: { tree: treeDef } }),
184
+ mutualInline: eq(forest, { type: 'array', items: treeRef, $defs: { tree: treeDef } }),
185
+ recursiveUnion: eq(or(number, list), {
186
+ anyOf: [{ type: 'number' }, { type: 'array', items: listRef }],
187
+ $defs: { list: listDef },
188
+ }),
189
+ recursiveRecord: eq(rec, {
190
+ $ref: '#/$defs/rec',
191
+ $defs: { rec: { type: 'object', additionalProperties: { $ref: '#/$defs/rec' } } },
192
+ }),
193
+ optionalRecursiveProperty: eq(/** @type {const} */ ({ p: option(list) }), {
194
+ type: 'object',
195
+ properties: { p: { type: 'array', items: listRef } },
196
+ $defs: { list: listDef },
197
+ }),
198
+ revisionLock: eq(lock, {
199
+ type: 'object',
200
+ additionalProperties: { $ref: '#/$defs/' },
201
+ $defs: {
202
+ '': {
203
+ anyOf: [
204
+ { type: 'string' },
205
+ { type: 'object', additionalProperties: { $ref: '#/$defs/' } },
206
+ ],
207
+ },
208
+ },
209
+ }),
210
+ sharedNonRecursive: () => {
211
+ // a shared, non-recursive definition is inlined at each use — no `$defs`
212
+ const person = /** @type {const} */ ({ name: string })
213
+ /** @type {Unknown} */
214
+ const personSchema = {
215
+ type: 'object',
216
+ properties: { name: { type: 'string' } },
217
+ required: ['name'],
218
+ }
219
+ eq(/** @type {const} */ ([person, person]), {
220
+ type: 'array',
221
+ prefixItems: [personSchema, personSchema],
222
+ minItems: 2,
223
+ items: false,
224
+ })()
225
+ },
226
+ },
227
+ data: (() => {
228
+ /** @type {Data} */
229
+ const tupleWithRest = [{}, { array: [{ prefix: [{ number: true }], rest: { string: true } }] }]
230
+ /** @type {Data} */
231
+ const structWithRest = [{}, {
232
+ object: [{ props: { a: { number: true } }, rest: { string: true } }],
233
+ }]
234
+ /** @type {Data} */
235
+ const optionalByReference = [
236
+ { r: { unit: unitBit(null) | unitBit(undefined), number: true } },
237
+ { object: [{ props: { p: 'r' } }] },
238
+ ]
239
+ return {
240
+ plain: eqData([{}, { number: true }], { type: 'number' }),
241
+ tupleWithRest: eqData(tupleWithRest, {
242
+ type: 'array',
243
+ prefixItems: [{ type: 'number' }],
244
+ minItems: 1,
245
+ items: { type: 'string' },
246
+ }),
247
+ structWithRest: eqData(structWithRest, {
248
+ type: 'object',
249
+ properties: { a: { type: 'number' } },
250
+ required: ['a'],
251
+ additionalProperties: { type: 'string' },
252
+ }),
253
+ // a referenced definition admitting `undefined` makes the key
254
+ // optional; the reference itself is kept as the property schema
255
+ optionalByReference: eqData(optionalByReference, {
256
+ type: 'object',
257
+ properties: { p: { $ref: '#/$defs/r' } },
258
+ $defs: { r: { anyOf: [{ const: null }, { not: {} }, { type: 'number' }] } },
259
+ }),
260
+ }
261
+ })(),
262
+ refEncoding: (() => {
263
+ /** @type {Data} */
264
+ const d = [
265
+ {
266
+ 'a~b': { number: true },
267
+ 'a/b': { number: true },
268
+ '%2F': { number: true },
269
+ 'a b': { number: true },
270
+ 'é': { number: true },
271
+ },
272
+ { array: [{ prefix: ['a~b', 'a/b', '%2F', 'a b', 'é'] }] },
273
+ ]
274
+ return eqData(d, {
275
+ type: 'array',
276
+ prefixItems: [
277
+ { $ref: '#/$defs/a~0b' },
278
+ { $ref: '#/$defs/a~1b' },
279
+ { $ref: '#/$defs/%252F' },
280
+ { $ref: '#/$defs/a%20b' },
281
+ { $ref: '#/$defs/%C3%A9' },
282
+ ],
283
+ minItems: 5,
284
+ items: false,
285
+ $defs: {
286
+ 'a~b': { type: 'number' },
287
+ 'a/b': { type: 'number' },
288
+ '%2F': { type: 'number' },
289
+ 'a b': { type: 'number' },
290
+ 'é': { type: 'number' },
291
+ },
292
+ })
293
+ })(),
294
+ throw: {
295
+ missingRootDefinition: () => dataToJsonSchema([{}, 'nope']),
296
+ // an `Object.prototype` member name is still a missing definition
297
+ missingPrototypeDefinition: () => dataToJsonSchema([{}, 'toString']),
298
+ missingNestedDefinition: () => {
299
+ /** @type {Data} */
300
+ const d = [{ a: { array: [{ prefix: [], rest: 'missing' }] } }, 'a']
301
+ return dataToJsonSchema(d)
302
+ },
92
303
  },
93
304
  }
@@ -1,4 +1,24 @@
1
+ /**
2
+ * JSON serializer for deterministic string output: the atoms every JSON leaf
3
+ * is spelled with, and the one recursive walk over JSON's containers.
4
+ *
5
+ * `treeSerialize` is that walk. It knows objects and arrays and nothing about
6
+ * leaves, so a codec supplies its own leaf spelling — standard JSON and
7
+ * extended JSON differ only there, not in a second object/array walker.
8
+ *
9
+ * `stringSerialize` is FunctionalScript, not the host's `JSON.stringify`: it
10
+ * escapes over this repository's own UTF-16 decoder and reproduces the
11
+ * ECMAScript `QuoteJSONString` result exactly, lone surrogates included.
12
+ *
13
+ * @module
14
+ *
15
+ * @import { List } from '../../../types/list/types.ts'
16
+ * @import { Reduce } from '../../../types/function/operator/types.ts'
17
+ * @import { CodePoint } from '../../../text/utf16/types.ts'
18
+ * @import { Tree, TreeObject, TreeArray, TreeEntry, TreeEntries, TreeMapEntries } from '../types.ts'
19
+ */
1
20
  import type { List } from '../../../types/list/types.ts';
21
+ import type { Tree, TreeMapEntries } from '../types.ts';
2
22
  /**
3
23
  * Serializes a string as a JSON string literal.
4
24
  *
@@ -25,3 +45,27 @@ export declare const objectWrap: (input: List<List<string>>) => List<string>;
25
45
  * @type {(input: List<List<string>>) => List<string>}
26
46
  */
27
47
  export declare const arrayWrap: (input: List<List<string>>) => List<string>;
48
+ /**
49
+ * The separator between a serialized property key and its value. Shared with
50
+ * the DJS serializer, which builds the same `key : value` fragment.
51
+ *
52
+ * @type {List<string>}
53
+ */
54
+ export declare const colon: List<string>;
55
+ /**
56
+ * The recursive walk over a JSON-shaped tree: objects, arrays, and a leaf
57
+ * spelling supplied by the codec.
58
+ *
59
+ * Every leaf of `Tree<P>` reaches `leafSerialize` — containers are the only
60
+ * thing this function recognizes — so a codec that adds a leaf type (extended
61
+ * JSON's `bigint`) or respells one (extended JSON's `3.0` for a whole-valued
62
+ * `number`) changes `leafSerialize` alone.
63
+ *
64
+ * Object entries whose value is `undefined` are dropped: `undefined` is a
65
+ * missing property, not a leaf of any of these trees.
66
+ *
67
+ * @template P
68
+ * @param {(value: P) => List<string>} leafSerialize
69
+ * @returns {(sort: TreeMapEntries<P>) => (value: Tree<P>) => List<string>}
70
+ */
71
+ export declare const treeSerialize: <P>(leafSerialize: (value: P) => List<string>) => (sort: TreeMapEntries<P>) => (value: Tree<P>) => List<string>;
@@ -1,26 +1,35 @@
1
1
  /**
2
- * JSON serializer for deterministic string output.
2
+ * JSON serializer for deterministic string output: the atoms every JSON leaf
3
+ * is spelled with, and the one recursive walk over JSON's containers.
4
+ *
5
+ * `treeSerialize` is that walk. It knows objects and arrays and nothing about
6
+ * leaves, so a codec supplies its own leaf spelling — standard JSON and
7
+ * extended JSON differ only there, not in a second object/array walker.
3
8
  *
4
9
  * `stringSerialize` is FunctionalScript, not the host's `JSON.stringify`: it
5
10
  * escapes over this repository's own UTF-16 decoder and reproduces the
6
11
  * ECMAScript `QuoteJSONString` result exactly, lone surrogates included.
7
12
  *
8
13
  * @module
14
+ *
15
+ * @import { List } from '../../../types/list/types.ts'
16
+ * @import { Reduce } from '../../../types/function/operator/types.ts'
17
+ * @import { CodePoint } from '../../../text/utf16/types.ts'
18
+ * @import { Tree, TreeObject, TreeArray, TreeEntry, TreeEntries, TreeMapEntries } from '../types.ts'
9
19
  */
10
- /** @import { List } from '../../../types/list/types.ts' */
20
+
11
21
  import { flat, map, reduce, empty } from '../../../types/list/module.f.mjs'
12
- /** @import { Reduce } from '../../../types/function/operator/types.ts' */
13
22
  import { concat } from '../../../types/string/module.f.mjs'
14
- /** @import { CodePoint } from '../../../text/utf16/types.ts' */
15
23
  import { codePointToString, stringToCodePointList } from '../../../text/utf16/module.f.mjs'
16
24
  import { errorMask } from '../../../text/code_point/module.f.mjs'
25
+ import { definedEntries, isObject } from '../../../types/object/module.f.mjs'
26
+ import { compose, fn } from '../../../types/function/module.f.mjs'
17
27
  import {
18
28
  backspace,
19
29
  cr,
20
- digit0,
21
30
  ff,
31
+ hexDigitCodePoint,
22
32
  ht,
23
- latinSmallLetterA,
24
33
  lf,
25
34
  quotationMark,
26
35
  reverseSolidus,
@@ -46,8 +55,7 @@ const escapeTable = /** @type {const} */ ({
46
55
  })
47
56
 
48
57
  /** @type {(value: number) => string} */
49
- const hexDigit = value =>
50
- fromCharCode(value < 10 ? digit0 + value : latinSmallLetterA + value - 10)
58
+ const hexDigit = value => fromCharCode(hexDigitCodePoint(value))
51
59
 
52
60
  /**
53
61
  * `\uXXXX` with lowercase hex digits, matching ECMAScript's `UnicodeEscape`.
@@ -68,7 +76,7 @@ const unicodeEscape = unit =>
68
76
  const escapeCodePoint = codePoint =>
69
77
  (codePoint & errorMask) !== 0
70
78
  ? unicodeEscape(codePoint & 0xffff)
71
- : escapeTable[/** @type {keyof typeof escapeTable} */ (codePoint)]
79
+ : escapeTable[codePoint]
72
80
  ?? (codePoint < space ? unicodeEscape(codePoint) : codePointToString(codePoint))
73
81
 
74
82
  /**
@@ -129,3 +137,57 @@ export const objectWrap
129
137
  */
130
138
  export const arrayWrap
131
139
  = wrap('[')(']')
140
+
141
+ /**
142
+ * The separator between a serialized property key and its value. Shared with
143
+ * the DJS serializer, which builds the same `key : value` fragment.
144
+ *
145
+ * @type {List<string>}
146
+ */
147
+ export const colon = [':']
148
+
149
+ /**
150
+ * The recursive walk over a JSON-shaped tree: objects, arrays, and a leaf
151
+ * spelling supplied by the codec.
152
+ *
153
+ * Every leaf of `Tree<P>` reaches `leafSerialize` — containers are the only
154
+ * thing this function recognizes — so a codec that adds a leaf type (extended
155
+ * JSON's `bigint`) or respells one (extended JSON's `3.0` for a whole-valued
156
+ * `number`) changes `leafSerialize` alone.
157
+ *
158
+ * Object entries whose value is `undefined` are dropped: `undefined` is a
159
+ * missing property, not a leaf of any of these trees.
160
+ *
161
+ * @template P
162
+ * @param {(value: P) => List<string>} leafSerialize
163
+ * @returns {(sort: TreeMapEntries<P>) => (value: Tree<P>) => List<string>}
164
+ */
165
+ export const treeSerialize = leafSerialize => sort => {
166
+ // `definedEntries` is generic; naming it at `P` here is what keeps the leaf
167
+ // type through the `fn(...)` composition below, which would otherwise
168
+ // instantiate it at `unknown`.
169
+ /** @type {(object: TreeObject<P>) => TreeEntries<P>} */
170
+ const objectEntries = definedEntries
171
+ /** @type {(kv: TreeEntry<P>) => List<string>} */
172
+ const propertySerialize = ([k, v]) => flat([
173
+ stringSerialize(k),
174
+ colon,
175
+ f(v)
176
+ ])
177
+ const mapPropertySerialize = map(propertySerialize)
178
+ /** @type {(object: TreeObject<P>) => List<string>} */
179
+ const objectSerialize = fn(objectEntries)
180
+ .map(sort)
181
+ .map(mapPropertySerialize)
182
+ .map(objectWrap)
183
+ .result
184
+ /** @type {(value: Tree<P>) => List<string>} */
185
+ const f = value => {
186
+ if (value instanceof Array) { return arraySerialize(value) }
187
+ if (isObject(value)) { return objectSerialize(value) }
188
+ return leafSerialize(value)
189
+ }
190
+ /** @type {(value: TreeArray<P>) => List<string>} */
191
+ const arraySerialize = compose(map(f))(arrayWrap)
192
+ return f
193
+ }
@@ -2,6 +2,11 @@
2
2
  * Tokenizer for JSON lexical analysis.
3
3
  *
4
4
  * @module
5
+ *
6
+ * @import { StateScan } from '../../../types/function/operator/types.ts'
7
+ * @import { List } from '../../../types/list/types.ts'
8
+ * @import { JsToken } from '../../../js/tokenizer/types.ts'
9
+ * @import { JsonToken, _ScanState, _ScanInput } from './types.ts'
5
10
  */
6
11
  import type { List } from '../../../types/list/types.ts';
7
12
  import type { JsonToken } from './types.ts';
@@ -15,3 +20,6 @@ import type { JsonToken } from './types.ts';
15
20
  * @type {(input: List<number>) => List<JsonToken>}
16
21
  */
17
22
  export declare const tokenize: (input: List<number>) => List<JsonToken>;
23
+ export declare const proof: {
24
+ parseMinusStateEof: () => void;
25
+ };
@@ -2,15 +2,16 @@
2
2
  * Tokenizer for JSON lexical analysis.
3
3
  *
4
4
  * @module
5
+ *
6
+ * @import { StateScan } from '../../../types/function/operator/types.ts'
7
+ * @import { List } from '../../../types/list/types.ts'
8
+ * @import { JsToken } from '../../../js/tokenizer/types.ts'
9
+ * @import { JsonToken, _ScanState, _ScanInput } from './types.ts'
5
10
  */
6
11
 
7
- /** @import { StateScan } from '../../../types/function/operator/types.ts' */
8
- /** @import { List } from '../../../types/list/types.ts' */
9
- import { concat, empty, flat, stateScan } from '../../../types/list/module.f.mjs'
10
- import { multiply } from '../../../types/bigfloat/module.f.mjs'
12
+ import { concat, empty, flat, stateScan, toArray } from '../../../types/list/module.f.mjs'
11
13
  import { tokenize as jsTokenize } from '../../../js/tokenizer/module.f.mjs'
12
- /** @import { JsToken } from '../../../js/tokenizer/types.ts' */
13
- /** @import { JsonToken, _ScanState, _ScanInput } from './types.ts' */
14
+ import { assertEq } from '../../../asserts/module.f.mjs'
14
15
 
15
16
  /** @type {(input: JsToken) => List<JsonToken>} */
16
17
  const mapToken = input => {
@@ -47,8 +48,13 @@ const parseDefaultState = input => {
47
48
  const parseMinusState = input => {
48
49
  if (input === null) return [[{ kind: 'error', message: 'invalid token' }], { kind: 'def' }]
49
50
  switch (input.token.kind) {
50
- case '-': return [[{ kind: 'error', message: 'invalid token' }], { kind: '-' }]
51
- case 'number': return [[{ kind: 'number', bf: multiply(input.token.bf)(-1n), value: `-${input.token.value}` }], { kind: 'def' }]
51
+ // negation is lexical: the minus sign joins the lexeme, so the token
52
+ // stays the exact source text of the JSON number.
53
+ case 'number': return [[{ kind: 'number', value: `-${input.token.value}` }], { kind: 'def' }]
54
+ // No `'-'` case: the underlying JS tokenizer always merges adjacent
55
+ // `-` characters into a single `'--'` token (see `js/tokenizer`), so
56
+ // this state never sees a second `'-'` — a run of `-` past the first
57
+ // always falls through to the `default` arm below instead.
52
58
  default: return [{ first: { kind: 'error', message: 'invalid token' }, tail: mapToken(input.token) }, { kind: 'def' }]
53
59
  }
54
60
  }
@@ -75,3 +81,20 @@ export const tokenize = input => {
75
81
  const jsTokens = jsTokenize(input)('')
76
82
  return flat(stateScan(scanToken)({ kind: 'def' })(concat(jsTokens)([null])))
77
83
  }
84
+
85
+ export const proof = {
86
+ // `parseMinusState` only sees `null` if the JSON tokenizer's own EOF
87
+ // sentinel arrives while still in state '-' — i.e. input ends right after
88
+ // a lone `-`. Unreachable through the public `tokenize`: the underlying
89
+ // JS tokenizer always emits its own `eof` token first, and consuming that
90
+ // (the default branch, any kind other than '-' or 'number') resets state
91
+ // to 'def' before the sentinel `null` is ever seen. Call the private
92
+ // state handler directly to cover the branch anyway.
93
+ parseMinusStateEof: () => {
94
+ const [tokens, state] = parseMinusState(null)
95
+ assertEq(state.kind, 'def')
96
+ const a = toArray(tokens)
97
+ assertEq(a.length, 1)
98
+ assertEq(a[0].kind, 'error')
99
+ },
100
+ }
@@ -5,4 +5,10 @@ export declare const proof: {
5
5
  json: (() => void)[];
6
6
  id: (() => void)[];
7
7
  keywords: (() => void)[];
8
+ lossless: {
9
+ oversizedCoefficient: () => void;
10
+ unboundedExponent: () => void;
11
+ negativeUnboundedExponent: () => void;
12
+ negativeOversized: () => void;
13
+ };
8
14
  };