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
@@ -0,0 +1,76 @@
1
+ /**
2
+ * @import { Or } from '../types.ts'
3
+ * @import { Data } from './types.ts'
4
+ */
5
+ import type { Or } from '../types.ts';
6
+ import { number, string, unknown as unknownRtti } from '../module.f.mjs';
7
+ export type _List = () => readonly ['array', _List];
8
+ export type _Tree = () => readonly ['or', typeof number, _Forest];
9
+ export type _Forest = () => readonly ['array', _Tree];
10
+ export type _SelfOr = () => readonly ['or', typeof number, _SelfOr];
11
+ export type _OrA = () => readonly ['or', _OrB, typeof number];
12
+ export type _OrB = () => readonly ['or', _OrA, typeof string];
13
+ export type _Outer = () => readonly ['or', typeof string, _Inner];
14
+ export type _Inner = () => readonly ['or', _Outer, _T2];
15
+ export type _T2 = () => readonly ['array', _Inner];
16
+ export type _X = () => readonly ['array', _Y];
17
+ export type _Y = () => readonly ['array', _W];
18
+ export type _W = () => readonly ['or', _X, _Y, typeof number];
19
+ export type _TopOr = () => readonly ['or', typeof unknownRtti, _TopArr];
20
+ export type _TopArr = () => readonly ['array', _TopOr];
21
+ export type _B2 = () => readonly ['array', _B2];
22
+ export type _A2 = () => readonly ['array', readonly [_A2, _B2]];
23
+ export type _RecordSelf = () => readonly ['record', _RecordSelf];
24
+ export type _Even = () => readonly ['const', {
25
+ readonly value: typeof number;
26
+ readonly next: Or<readonly [_Odd, undefined]>;
27
+ }];
28
+ export type _Odd = () => readonly ['const', {
29
+ readonly value: typeof number;
30
+ readonly next: Or<readonly [_Even, undefined]>;
31
+ }];
32
+ export type _Rec = () => readonly ['array', _Rec];
33
+ export declare const proof: {
34
+ withoutUnits: (() => void)[];
35
+ unitBits: () => void;
36
+ toData: {
37
+ primitives: () => void;
38
+ tag0: () => void;
39
+ containers: () => void;
40
+ constSchemas: () => void;
41
+ or: () => void;
42
+ orCanonicalIdentity: () => void;
43
+ recursion: () => void;
44
+ orCycles: () => void;
45
+ intern: () => void;
46
+ alphaEquivalence: () => void;
47
+ names: () => void;
48
+ collapse: () => void;
49
+ serializable: () => void;
50
+ };
51
+ cmp: {
52
+ totalOrder: () => void;
53
+ restOrder: () => void;
54
+ rules: () => void;
55
+ };
56
+ subset: {
57
+ literals: () => void;
58
+ arrays: () => void;
59
+ arrayRest: () => void;
60
+ objects: () => void;
61
+ recursion: () => void;
62
+ mixedObjectRecursion: () => void;
63
+ assumed: () => void;
64
+ };
65
+ validate: {
66
+ literals: () => void;
67
+ kinds: () => void;
68
+ arrays: () => void;
69
+ objects: () => void;
70
+ recursion: () => void;
71
+ throw: {
72
+ danglingReference: () => import("../common/types.ts").ResultE;
73
+ danglingPrototypeReference: () => import("../common/types.ts").ResultE;
74
+ };
75
+ };
76
+ };
@@ -0,0 +1,589 @@
1
+ /**
2
+ * @import { Or } from '../types.ts'
3
+ * @import { Data } from './types.ts'
4
+ */
5
+
6
+ import { assert, assertEq, assertStructurallySame } from '../../../asserts/module.f.mjs'
7
+ import {
8
+ array,
9
+ bigint,
10
+ boolean,
11
+ never as neverRtti,
12
+ number,
13
+ option,
14
+ or,
15
+ record,
16
+ string,
17
+ unknown as unknownRtti,
18
+ } from '../module.f.mjs'
19
+ import { cmp, equal, never, subset, toData, unitBit, unitList, unknown, validate, withoutUnits } from './module.f.mjs'
20
+
21
+ /** @type {(actual: Data) => (expected: Data) => void} */
22
+ const assertData = actual => expected =>
23
+ assert(equal(actual)(expected), [actual, expected])
24
+
25
+ /** A recursive list: `type _List = readonly _List[]`. */
26
+ /** @typedef {() => readonly ['array', _List]} _List */
27
+ /** @type {_List} */
28
+ const list = () => ['array', list]
29
+
30
+ /** Mutual recursion through a container: `_Tree = number | _Forest`, `_Forest = readonly _Tree[]`. */
31
+ /** @typedef {() => readonly ['or', typeof number, _Forest]} _Tree */
32
+ /** @typedef {() => readonly ['array', _Tree]} _Forest */
33
+ /** @type {_Tree} */
34
+ const tree = () => ['or', number, forest]
35
+ /** @type {_Forest} */
36
+ const forest = () => ['array', tree]
37
+
38
+ /** A pure `or` self-cycle: `_SelfOr = number | _SelfOr`. */
39
+ /** @typedef {() => readonly ['or', typeof number, _SelfOr]} _SelfOr */
40
+ /** @type {_SelfOr} */
41
+ const selfOr = () => ['or', number, selfOr]
42
+
43
+ /** A mutual `or` cycle: `_OrA = _OrB | number`, `_OrB = _OrA | string`. */
44
+ /** @typedef {() => readonly ['or', _OrB, typeof number]} _OrA */
45
+ /** @typedef {() => readonly ['or', _OrA, typeof string]} _OrB */
46
+ /** @type {_OrA} */
47
+ const orA = () => ['or', orB, number]
48
+ /** @type {_OrB} */
49
+ const orB = () => ['or', orA, string]
50
+
51
+ /** An `or` over a rule that still has pending merges when it is consumed. */
52
+ /** @typedef {() => readonly ['or', typeof string, _Inner]} _Outer */
53
+ /** @typedef {() => readonly ['or', _Outer, _T2]} _Inner */
54
+ /** @typedef {() => readonly ['array', _Inner]} _T2 */
55
+ /** @type {_Outer} */
56
+ const outer = () => ['or', string, inner]
57
+ /** @type {_Inner} */
58
+ const inner = () => ['or', outer, t2]
59
+ /** @type {_T2} */
60
+ const t2 = () => ['array', inner]
61
+
62
+ /** Two `or` operands deferred onto the same target rule. */
63
+ /** @typedef {() => readonly ['array', _Y]} _X */
64
+ /** @typedef {() => readonly ['array', _W]} _Y */
65
+ /** @typedef {() => readonly ['or', _X, _Y, typeof number]} _W */
66
+ /** @type {_X} */
67
+ const x = () => ['array', y]
68
+ /** @type {_Y} */
69
+ const y = () => ['array', w]
70
+ /** @type {_W} */
71
+ const w = () => ['or', x, y, number]
72
+
73
+ /** A cycle whose union is the whole value domain. */
74
+ /** @typedef {() => readonly ['or', typeof unknownRtti, _TopArr]} _TopOr */
75
+ /** @typedef {() => readonly ['array', _TopOr]} _TopArr */
76
+ /** @type {_TopOr} */
77
+ const topOr = () => ['or', unknownRtti, topArr]
78
+ /** @type {_TopArr} */
79
+ const topArr = () => ['array', topOr]
80
+
81
+ /** Two named rules where only one is referenced by the entry. */
82
+ /** @typedef {() => readonly ['array', _B2]} _B2 */
83
+ /** @typedef {() => readonly ['array', readonly [_A2, _B2]]} _A2 */
84
+ /** @type {_A2} */
85
+ const a2 = () => ['array', [a2, b2]]
86
+ /** @type {_B2} */
87
+ const b2 = () => ['array', b2]
88
+
89
+ /** A self-recursive record: rest-based object recursion. */
90
+ /** @typedef {() => readonly ['record', _RecordSelf]} _RecordSelf */
91
+ /** @type {_RecordSelf} */
92
+ const recordSelf = () => ['record', recordSelf]
93
+
94
+ /** Mutual recursion through object *properties* rather than containers. */
95
+ /** @typedef {() => readonly ['const', { readonly value: typeof number, readonly next: Or<readonly [_Odd, undefined]> }]} _Even */
96
+ /** @typedef {() => readonly ['const', { readonly value: typeof number, readonly next: Or<readonly [_Even, undefined]> }]} _Odd */
97
+ /** @type {_Even} */
98
+ const even = () => ['const', { value: number, next: option(odd) }]
99
+ /** @type {_Odd} */
100
+ const odd = () => ['const', { value: number, next: option(even) }]
101
+
102
+ /** @typedef {() => readonly ['array', _Rec]} _Rec */
103
+ /** Every call returns a fresh recursive thunk whose function name is `f`. */
104
+ /** @type {() => _Rec} */
105
+ const mkRec = () => {
106
+ /** @type {_Rec} */
107
+ const f = () => ['array', f]
108
+ return f
109
+ }
110
+
111
+ /** @type {(f: _Rec) => _Rec} */
112
+ const identityRec = f => f
113
+ /** A recursive thunk whose function name is the empty string. */
114
+ /** @type {_Rec} */
115
+ const anon = identityRec(() => ['array', anon])
116
+
117
+ const tupleNumber = /** @type {const} */ ([number])
118
+ const tupleString = /** @type {const} */ ([string])
119
+ const emptyTuple = /** @type {const} */ ([])
120
+
121
+ export const proof = {
122
+ withoutUnits: [
123
+ // Removing the last unit bit removes the key: an empty kind is an
124
+ // absent property here, never a zero.
125
+ () => assertStructurallySame(
126
+ withoutUnits(unitBit(undefined))({ unit: unitBit(undefined) }),
127
+ never),
128
+ () => assertStructurallySame(
129
+ withoutUnits(unitBit(undefined))({ unit: unitBit(undefined) | unitBit(null) }),
130
+ { unit: unitBit(null) }),
131
+ // Bits that are not set are a no-op.
132
+ () => assertStructurallySame(
133
+ withoutUnits(unitBit(undefined))({ unit: unitBit(null) }),
134
+ { unit: unitBit(null) }),
135
+ () => assertStructurallySame(withoutUnits(unitBit(undefined))(never), never),
136
+ // The other five kinds are carried through untouched — this is what
137
+ // enumerating `UnionSet`'s members by hand would silently drop.
138
+ () => assertStructurallySame(
139
+ withoutUnits(unitBit(undefined))(unknown),
140
+ { ...unknown, unit: unitBit(null) | unitBit(false) | unitBit(true) }),
141
+ () => assertStructurallySame(
142
+ withoutUnits(unitBit(undefined))({ unit: unitBit(undefined), string: true }),
143
+ { string: true }),
144
+ ],
145
+ unitBits: () => {
146
+ // the literal bits are the encoding under test
147
+ assertEq(unitList.join(), 'null,undefined,false,true')
148
+ assertEq(unitBit(null), 1)
149
+ assertEq(unitBit(undefined), 2)
150
+ assertEq(unitBit(false), 4)
151
+ assertEq(unitBit(true), 8)
152
+ },
153
+ toData: {
154
+ primitives: () => {
155
+ assertData(toData(null))([{}, { unit: unitBit(null) }])
156
+ assertData(toData(undefined))([{}, { unit: unitBit(undefined) }])
157
+ assertData(toData(false))([{}, { unit: unitBit(false) }])
158
+ assertData(toData(true))([{}, { unit: unitBit(true) }])
159
+ assertData(toData(42))([{}, { number: [42] }])
160
+ assertData(toData('hi'))([{}, { string: ['hi'] }])
161
+ assertData(toData(7n))([{}, { bigint: [7n] }])
162
+ assert(!equal(toData(0))(toData(-0)))
163
+ },
164
+ tag0: () => {
165
+ assertData(toData(boolean))([{}, { unit: unitBit(false) | unitBit(true) }])
166
+ assertData(toData(number))([{}, { number: true }])
167
+ assertData(toData(string))([{}, { string: true }])
168
+ assertData(toData(bigint))([{}, { bigint: true }])
169
+ assertData(toData(unknownRtti))([{}, unknown])
170
+ assertData(toData(neverRtti))([{}, never])
171
+ },
172
+ containers: () => {
173
+ assertData(toData(array(number)))([{}, { array: [{ prefix: [], rest: { number: true } }] }])
174
+ assertData(toData(record(string)))([{}, { object: [{ props: {}, rest: { string: true } }] }])
175
+ assertData(toData(array(unknownRtti)))([{}, { array: true }])
176
+ assertData(toData(record(unknownRtti)))([{}, { object: true }])
177
+ assertData(toData(array(neverRtti)))([{}, { array: [{ prefix: [] }] }])
178
+ assertData(toData(record(neverRtti)))([{}, { object: [{ props: {}, rest: {} }] }])
179
+ assertData(toData(emptyTuple))([{}, { array: [{ prefix: [] }] }])
180
+ assertData(toData(/** @type {const} */ ([number, 42])))(
181
+ [{}, { array: [{ prefix: [{ number: true }, { number: [42] }] }] }])
182
+ assertData(toData({}))([{}, { object: true }])
183
+ assertData(toData({ b: string, a: number }))(
184
+ [{}, { object: [{ props: { a: { number: true }, b: { string: true } } }] }])
185
+ assertData(toData({ a: unknownRtti }))([{}, { object: true }])
186
+ assertData(toData(/** @type {const} */ ([neverRtti])))([{}, never])
187
+ assertData(toData({ a: neverRtti }))([{}, never])
188
+ },
189
+ constSchemas: () => {
190
+ assertData(toData(() => /** @type {const} */ (['const', 42])))([{}, { number: [42] }])
191
+ assertData(toData(() => /** @type {const} */ (['const', null])))([{}, { unit: unitBit(null) }])
192
+ assertData(toData(() => /** @type {const} */ (['const', { a: 42 }])))(toData({ a: 42 }))
193
+ // a shared container converts once and is inlined at each use
194
+ assertData(toData(/** @type {const} */ ([tupleNumber, tupleNumber])))([{}, {
195
+ array: [{
196
+ prefix: [
197
+ { array: [{ prefix: [{ number: true }] }] },
198
+ { array: [{ prefix: [{ number: true }] }] },
199
+ ],
200
+ }],
201
+ }])
202
+ },
203
+ or: () => {
204
+ assertData(toData(or()))([{}, never])
205
+ assertData(toData(or(true, false)))([{}, { unit: unitBit(false) | unitBit(true) }])
206
+ assertData(toData(or(boolean, null, undefined)))(
207
+ [{}, { unit: unitBit(null) | unitBit(undefined) | unitBit(false) | unitBit(true) }])
208
+ assertData(toData(or(42, number)))([{}, { number: true }])
209
+ assertData(toData(or(1, 1)))([{}, { number: [1] }])
210
+ assertData(toData(or(2, 1)))([{}, { number: [1, 2] }])
211
+ assertData(toData(or(NaN, NaN)))([{}, { number: [NaN] }])
212
+ assertData(toData(or(NaN, 1)))([{}, { number: [1, NaN] }])
213
+ assertData(toData(or(1, NaN)))([{}, { number: [1, NaN] }])
214
+ assertData(toData(or(-0, 0)))([{}, { number: [-0, 0] }])
215
+ assertData(toData(or(0, -0)))([{}, { number: [-0, 0] }])
216
+ assertData(toData(or('b', 'a')))([{}, { string: ['a', 'b'] }])
217
+ assertData(toData(or(2n, 1n)))([{}, { bigint: [1n, 2n] }])
218
+ assertData(toData(option(string)))([{}, { unit: unitBit(undefined), string: true }])
219
+ assertData(toData(or(unknownRtti, number)))([{}, unknown])
220
+ assertData(toData(or(number, or(string, boolean))))(
221
+ [{}, { unit: unitBit(false) | unitBit(true), number: true, string: true }])
222
+ assertData(toData(or(1, or(1, 2))))([{}, { number: [1, 2] }])
223
+ },
224
+ orCanonicalIdentity: () => {
225
+ assertData(toData(or(number, string)))(toData(or(string, number)))
226
+ const a = array(number)
227
+ const b = array(string)
228
+ assertData(toData(or(a, b)))(toData(or(b, a)))
229
+ assertData(toData(or(tupleNumber, tupleString)))(toData(or(tupleString, tupleNumber)))
230
+ },
231
+ recursion: () => {
232
+ assertData(toData(list))([{ list: { array: [{ prefix: [], rest: 'list' }] } }, 'list'])
233
+ assertData(toData(tree))(
234
+ [{ tree: { number: true, array: [{ prefix: [], rest: 'tree' }] } }, 'tree'])
235
+ assertData(toData(forest))([
236
+ { tree: { number: true, array: [{ prefix: [], rest: 'tree' }] } },
237
+ { array: [{ prefix: [], rest: 'tree' }] },
238
+ ])
239
+ assertData(toData(record(list)))([
240
+ { list: { array: [{ prefix: [], rest: 'list' }] } },
241
+ { object: [{ props: {}, rest: 'list' }] },
242
+ ])
243
+ assertData(toData({ p: list }))([
244
+ { list: { array: [{ prefix: [], rest: 'list' }] } },
245
+ { object: [{ props: { p: 'list' } }] },
246
+ ])
247
+ assertData(toData(a2))([
248
+ {
249
+ a2: { array: [{ prefix: [], rest: { array: [{ prefix: ['a2', 'b2'] }] } }] },
250
+ b2: { array: [{ prefix: [], rest: 'b2' }] },
251
+ },
252
+ 'a2',
253
+ ])
254
+ },
255
+ orCycles: () => {
256
+ // a pure `or` self-cycle contributes nothing: _X = number | _X is number
257
+ assertData(toData(selfOr))(toData(number))
258
+ // a mutual `or` cycle is the union of the non-cyclic content
259
+ assertData(toData(orA))(toData(or(number, string)))
260
+ // `outer` and `inner` denote the same set; the interning step
261
+ // recognizes the inlined entry as `inner`'s body
262
+ assertData(toData(outer))([
263
+ { inner: { string: true, array: [{ prefix: [], rest: 'inner' }] } },
264
+ 'inner',
265
+ ])
266
+ assertData(toData(outer))(toData(inner))
267
+ assertData(toData(x))([
268
+ { w: { number: true, array: [{ prefix: [], rest: 'w' }] } },
269
+ { array: [{ prefix: [], rest: { array: [{ prefix: [], rest: 'w' }] } }] },
270
+ ])
271
+ assertData(toData(topArr))([{ topOr: unknown }, { array: [{ prefix: [], rest: 'topOr' }] }])
272
+ },
273
+ intern: () => {
274
+ // a union equal to a rule's body reads back as a reference,
275
+ // so `or` is idempotent on recursive schemas
276
+ assertData(toData(or(list)))(toData(list))
277
+ assertData(toData(or(list, list)))(toData(list))
278
+ assertData(toData(or(tree, tree)))(toData(tree))
279
+ // a re-stated fixpoint collapses: `list = readonly list[]`,
280
+ // so `array(list)` is `list` itself
281
+ assertData(toData(array(list)))(toData(list))
282
+ assertData(toData(array(or(list))))(toData(list))
283
+ // in nested positions too
284
+ assertData(toData({ p: or(list) }))(toData({ p: list }))
285
+ },
286
+ alphaEquivalence: () => {
287
+ // two α-equivalent recursive rules under different names spell
288
+ // the same set two ways; their union keeps the spelling that
289
+ // sorts first instead of dropping the mutually-subsumed pair
290
+ const listB = mkRec()
291
+ assertData(toData(or(list, listB)))(toData(listB))
292
+ assertData(toData(or(listB, list)))(toData(listB))
293
+ assert(subset(toData(list))(toData(or(list, listB))))
294
+ assert(subset(toData(listB))(toData(or(list, listB))))
295
+ assertEq(validate(toData(or(list, listB)))([[]])[0], 'ok')
296
+ // the pair is a mutual subset, yet `equal` stays structural
297
+ assert(subset(toData(list))(toData(listB)))
298
+ assert(subset(toData(listB))(toData(list)))
299
+ assert(!equal(toData(list))(toData(listB)))
300
+ // bisimilar mixed-kind recursions collapse the same way
301
+ assertData(toData(or(tree, y)))(toData(tree))
302
+ },
303
+ names: () => {
304
+ // colliding function names are disambiguated with a counter
305
+ assertData(toData(/** @type {const} */ ([mkRec(), mkRec()])))([
306
+ {
307
+ f: { array: [{ prefix: [], rest: 'f' }] },
308
+ f0: { array: [{ prefix: [], rest: 'f0' }] },
309
+ },
310
+ { array: [{ prefix: ['f', 'f0'] }] },
311
+ ])
312
+ assertData(toData(anon))([{ '': { array: [{ prefix: [], rest: '' }] } }, ''])
313
+ },
314
+ collapse: () => {
315
+ // readonly [number] ⊂ readonly number[] — the tuple pattern is dropped
316
+ assertData(toData(or(tupleNumber, array(number))))(toData(array(number)))
317
+ // the empty tuple is a member of every uniform array set
318
+ assertData(toData(or(emptyTuple, array(number))))(toData(array(number)))
319
+ assertData(toData(or(array(number), emptyTuple)))(toData(array(number)))
320
+ // kept when neither pattern subsumes the other
321
+ assertData(toData(or(tupleNumber, tupleString)))(
322
+ [{}, { array: [{ prefix: [{ string: true }] }, { prefix: [{ number: true }] }] }])
323
+ // the collapse recurses into inline positions
324
+ assertData(toData(array(or(tupleNumber, array(number)))))(toData(array(array(number))))
325
+ assertData(toData(record(or(tupleNumber, array(number)))))(toData(record(array(number))))
326
+ assertData(toData({ a: or(tupleNumber, array(number)) }))(toData({ a: array(number) }))
327
+ // collapsing innards can make two patterns identical — deduplicated
328
+ assertData(toData(or(array(or(tupleNumber, array(number))), array(array(number)))))(
329
+ toData(array(array(number))))
330
+ // subsumed object patterns are dropped, `true` absorbs patterns
331
+ assertData(toData(or({ a: 42 }, { a: number })))(toData({ a: number }))
332
+ assertData(toData(or({ a: number }, {})))(toData({}))
333
+ },
334
+ serializable: () => {
335
+ const d = toData(or(string, array(number), null))
336
+ assertEq(
337
+ JSON.stringify(d),
338
+ '[{},{"unit":1,"string":true,"array":[{"prefix":[],"rest":{"number":true}}]}]')
339
+ assertEq(
340
+ JSON.stringify(toData(list)),
341
+ '[{"list":{"array":[{"prefix":[],"rest":"list"}]}},"list"]')
342
+ },
343
+ },
344
+ cmp: {
345
+ totalOrder: () => {
346
+ assertEq(cmp(toData(number))(toData(number)), 0)
347
+ assertEq(cmp(toData(list))(toData(list)), 0)
348
+ assert(cmp(toData(null))(toData(true)) < 0)
349
+ assert(cmp(toData(1))(toData(2)) < 0)
350
+ assert(cmp(toData(or(1, 2)))(toData(or(1, 2, 3))) < 0)
351
+ assert(cmp(toData(1))(toData(number)) < 0)
352
+ assert(cmp(toData(number))(toData(1)) > 0)
353
+ assert(cmp(toData(neverRtti))(toData(number)) < 0)
354
+ assert(cmp(toData(number))(toData(neverRtti)) > 0)
355
+ assert(cmp(toData('a'))(toData('b')) < 0)
356
+ assert(cmp(toData(1n))(toData(2n)) < 0)
357
+ assert(cmp(toData(2n))(toData(1n)) > 0)
358
+ assert(cmp(toData(string))(toData(bigint)) !== 0)
359
+ assert(cmp(toData(array(number)))(toData(array(string))) !== 0)
360
+ assert(cmp(toData({ a: number }))(toData({ a: string })) !== 0)
361
+ assert(cmp(toData({ a: number }))(toData({ b: number })) !== 0)
362
+ // an inline union sorts before a reference
363
+ assert(cmp(toData(number))(toData(list)) < 0)
364
+ assert(cmp(toData(list))(toData(number)) > 0)
365
+ },
366
+ restOrder: () => {
367
+ // a pattern without a rest sorts before one with a rest
368
+ /** @type {Data} */
369
+ const arrayNoRest = [{}, { array: [{ prefix: [{ number: true }] }] }]
370
+ /** @type {Data} */
371
+ const arrayRest = [{}, { array: [{ prefix: [{ number: true }], rest: { number: true } }] }]
372
+ assert(cmp(arrayNoRest)(arrayRest) < 0)
373
+ assert(cmp(arrayRest)(arrayNoRest) > 0)
374
+ /** @type {Data} */
375
+ const structNoRest = [{}, { object: [{ props: { a: { number: true } } }] }]
376
+ /** @type {Data} */
377
+ const structRest = [{}, { object: [{ props: { a: { number: true } }, rest: { number: true } }] }]
378
+ assert(cmp(structNoRest)(structRest) < 0)
379
+ assert(cmp(structRest)(structNoRest) > 0)
380
+ // rests compared when the prefixes and props tie
381
+ assertData(toData(or(array(number), array(string))))(
382
+ [{}, { array: [{ prefix: [], rest: { string: true } }, { prefix: [], rest: { number: true } }] }])
383
+ assertData(toData(or(record(number), record(string))))(
384
+ [{}, { object: [{ props: {}, rest: { string: true } }, { props: {}, rest: { number: true } }] }])
385
+ // fewer props sort before more props
386
+ assertData(toData(or({ a: number }, record(number))))(
387
+ [{}, { object: [{ props: {}, rest: { number: true } }, { props: { a: { number: true } } }] }])
388
+ },
389
+ rules: () => {
390
+ /** @type {Data} */
391
+ const ra = [{ r: { number: true } }, 'r']
392
+ /** @type {Data} */
393
+ const rb = [{ r: { string: true } }, 'r']
394
+ assert(cmp(ra)(rb) !== 0)
395
+ assert(!equal(ra)(rb))
396
+ },
397
+ },
398
+ subset: {
399
+ literals: () => {
400
+ assert(subset(toData(true))(toData(boolean)))
401
+ assert(!subset(toData(boolean))(toData(true)))
402
+ assert(!subset(toData(null))(toData(number)))
403
+ assert(subset(toData(42))(toData(number)))
404
+ assert(!subset(toData(number))(toData(42)))
405
+ assert(subset(toData(or(1, 2)))(toData(or(1, 2, 3))))
406
+ assert(!subset(toData(or(1, 4)))(toData(or(1, 2, 3))))
407
+ assert(subset(toData('a'))(toData(string)))
408
+ assert(subset(toData(1n))(toData(or(1n, 2n))))
409
+ assert(!subset(toData(1n))(toData(2n)))
410
+ assert(!subset(toData(42))(toData(string)))
411
+ assert(subset(toData(neverRtti))(toData(42)))
412
+ assert(subset(toData(or(number, string)))(toData(unknownRtti)))
413
+ },
414
+ arrays: () => {
415
+ assert(subset(toData(tupleNumber))(toData(array(number))))
416
+ assert(!subset(toData(array(number)))(toData(tupleNumber)))
417
+ assert(subset(toData(array(number)))(toData(unknownRtti)))
418
+ assert(!subset(toData(array(unknownRtti)))(toData(array(number))))
419
+ assert(subset(toData(array(number)))(toData(array(or(number, string)))))
420
+ assert(!subset(toData(tupleNumber))(toData(tupleString)))
421
+ assert(!subset(toData(tupleNumber))(toData(/** @type {const} */ ([number, number]))))
422
+ },
423
+ arrayRest: () => {
424
+ /** @type {Data} */
425
+ const oneOrMoreNumbers = [{}, { array: [{ prefix: [{ number: true }], rest: { number: true } }] }]
426
+ assert(subset(oneOrMoreNumbers)(toData(array(number))))
427
+ assert(!subset(toData(array(number)))(oneOrMoreNumbers))
428
+ assert(subset(toData(/** @type {const} */ ([number, number])))(oneOrMoreNumbers))
429
+ assert(!subset(toData(emptyTuple))(oneOrMoreNumbers))
430
+ /** @type {Data} */
431
+ const oneNumberThenStrings = [{}, { array: [{ prefix: [{ number: true }], rest: { string: true } }] }]
432
+ assert(!subset(oneOrMoreNumbers)(oneNumberThenStrings))
433
+ },
434
+ objects: () => {
435
+ assert(subset(toData({ a: number }))(toData({})))
436
+ assert(subset(toData({ a: 42 }))(toData({ a: number })))
437
+ assert(!subset(toData({ a: number }))(toData({ a: 42 })))
438
+ assert(subset(toData({ a: number, b: string }))(toData({ a: number })))
439
+ assert(subset(toData(record(number)))(toData(record(or(number, string)))))
440
+ assert(!subset(toData(record(or(number, string))))(toData(record(number))))
441
+ // a record's keys may be absent, a required key excludes that
442
+ assert(!subset(toData(record(number)))(toData({ a: number })))
443
+ assert(subset(toData(record(number)))(toData({ a: option(number) })))
444
+ // a struct leaves undeclared keys unconstrained, a record does not
445
+ assert(!subset(toData({ a: number }))(toData(record(number))))
446
+ // a key inherited from Object.prototype is not a declared prop
447
+ assert(!subset(toData({ a: number }))(toData({ toString: number })))
448
+ assert(subset(toData({ toString: /** @type {const} */ (42) }))(toData({ toString: number })))
449
+ },
450
+ recursion: () => {
451
+ assert(subset(toData(list))(toData(list)))
452
+ assert(subset(toData(forest))(toData(tree)))
453
+ assert(!subset(toData(tree))(toData(forest)))
454
+ assert(!subset(toData(list))(toData(array(number))))
455
+ assert(subset(toData(array(neverRtti)))(toData(list)))
456
+ },
457
+ mixedObjectRecursion: () => {
458
+ // rest-based and property-based object recursion compared in one
459
+ // union used to overflow the stack: the synthesized `rest ∪
460
+ // undefined` read-sets never reached the coinductive memo
461
+ const v = validate(toData(or(recordSelf, even)))
462
+ assertEq(v({})[0], 'ok')
463
+ assertEq(v({ value: 1 })[0], 'ok')
464
+ assertEq(v({ value: 'x' })[0], 'error')
465
+ assert(!subset(toData(recordSelf))(toData(even)))
466
+ assert(!subset(toData(even))(toData(recordSelf)))
467
+ assert(subset(toData(recordSelf))(toData(or(recordSelf, even))))
468
+ assert(subset(toData(even))(toData(or(recordSelf, even))))
469
+ assert(subset(toData(even))(toData(odd)))
470
+ },
471
+ assumed: () => {
472
+ // one left rule checked against two right rules on one path
473
+ /** @type {Data} */
474
+ const left = [{ A: { array: [{ prefix: [], rest: 'A' }] } }, 'A']
475
+ /** @type {Data} */
476
+ const right = [
477
+ {
478
+ B: { array: [{ prefix: [], rest: 'C' }] },
479
+ C: { array: [{ prefix: [], rest: 'C' }] },
480
+ },
481
+ 'B',
482
+ ]
483
+ assert(subset(left)(right))
484
+ },
485
+ },
486
+ validate: {
487
+ literals: () => {
488
+ const v = validate(toData(or(1, 'a', 2n, null, true)))
489
+ assertEq(v(1)[0], 'ok')
490
+ assertEq(v('a')[0], 'ok')
491
+ assertEq(v(2n)[0], 'ok')
492
+ assertEq(v(null)[0], 'ok')
493
+ assertEq(v(true)[0], 'ok')
494
+ assertEq(v(2)[0], 'error')
495
+ assertEq(v('b')[0], 'error')
496
+ assertEq(v(3n)[0], 'error')
497
+ assertEq(v(undefined)[0], 'error')
498
+ assertEq(v(false)[0], 'error')
499
+ },
500
+ kinds: () => {
501
+ assertEq(validate(toData(number))(NaN)[0], 'ok')
502
+ assertEq(validate(toData(string))('x')[0], 'ok')
503
+ assertEq(validate(toData(bigint))(1n)[0], 'ok')
504
+ assertEq(validate(toData(boolean))(false)[0], 'ok')
505
+ assertEq(validate(toData(NaN))(NaN)[0], 'ok')
506
+ assertEq(validate(toData(-0))(0)[0], 'error')
507
+ assertEq(validate(toData(unknownRtti))([1])[0], 'ok')
508
+ assertEq(validate(toData(unknownRtti))({ a: 1 })[0], 'ok')
509
+ assertEq(validate(toData(neverRtti))(1)[0], 'error')
510
+ assertEq(validate(toData(number))([])[0], 'error')
511
+ assertEq(validate(toData(number))({})[0], 'error')
512
+ },
513
+ arrays: () => {
514
+ const v = validate(toData(array(number)))
515
+ assertEq(v([])[0], 'ok')
516
+ assertEq(v([1, 2])[0], 'ok')
517
+ assertEq(
518
+ JSON.stringify(v([1, 'x'])),
519
+ '["error",{"path":["1"],"message":"unexpected value"}]')
520
+ const vt = validate(toData(/** @type {const} */ ([number, string])))
521
+ assertEq(vt([1, 'a'])[0], 'ok')
522
+ assertEq(vt([1])[0], 'error')
523
+ assertEq(vt([1, 'a', 2])[0], 'error')
524
+ /** @type {Data} */
525
+ const onePlus = [{}, { array: [{ prefix: [{ number: true }], rest: { string: true } }] }]
526
+ const vp = validate(onePlus)
527
+ assertEq(vp([])[0], 'error')
528
+ assertEq(vp([1])[0], 'ok')
529
+ assertEq(vp([1, 'a', 'b'])[0], 'ok')
530
+ assertEq(vp([1, 2])[0], 'error')
531
+ const vm = validate(toData(or(tupleNumber, tupleString)))
532
+ assertEq(vm([1])[0], 'ok')
533
+ assertEq(vm(['a'])[0], 'ok')
534
+ assertEq(
535
+ JSON.stringify(vm([true])),
536
+ '["error",{"path":[],"message":"no match"}]')
537
+ },
538
+ objects: () => {
539
+ const v = validate(toData({ a: number, b: option(string) }))
540
+ assertEq(v({ a: 1 })[0], 'ok')
541
+ assertEq(v({ a: 1, b: 's' })[0], 'ok')
542
+ assertEq(v({ a: 1, extra: true })[0], 'ok')
543
+ assertEq(
544
+ JSON.stringify(v({ b: 's' })),
545
+ '["error",{"path":["a"],"message":"unexpected value"}]')
546
+ assertEq(v({ a: 1, b: 1 })[0], 'error')
547
+ const vr = validate(toData(record(number)))
548
+ assertEq(vr({})[0], 'ok')
549
+ assertEq(vr({ p: 1 })[0], 'ok')
550
+ // a key inherited from Object.prototype is still an extra key
551
+ assertEq(vr({ toString: 1 })[0], 'ok')
552
+ assertEq(vr({ toString: 'x' })[0], 'error')
553
+ assertEq(
554
+ JSON.stringify(vr({ p: 'a' })),
555
+ '["error",{"path":["p"],"message":"unexpected value"}]')
556
+ // declared keys are not re-checked against the rest
557
+ /** @type {Data} */
558
+ const structRest = [{}, { object: [{ props: { a: { number: true } }, rest: { string: true } }] }]
559
+ const vs = validate(structRest)
560
+ assertEq(vs({ a: 1, b: 's' })[0], 'ok')
561
+ assertEq(vs({ a: 1, b: 2 })[0], 'error')
562
+ },
563
+ recursion: () => {
564
+ const v = validate(toData(list))
565
+ assertEq(v([])[0], 'ok')
566
+ assertEq(v([[], [[]]])[0], 'ok')
567
+ assertEq(v([[], [1]])[0], 'error')
568
+ const vt = validate(toData(tree))
569
+ assertEq(vt(5)[0], 'ok')
570
+ assertEq(vt([5, [6]])[0], 'ok')
571
+ assertEq(vt('x')[0], 'error')
572
+ const vp = validate(toData({ p: list }))
573
+ assertEq(vp({ p: [] })[0], 'ok')
574
+ assertEq(vp({ p: 0 })[0], 'error')
575
+ // the thunk-direct validator cannot terminate on a pure `or`
576
+ // cycle for a non-matching value; the data form dissolves the
577
+ // cycle to its least fixpoint and answers
578
+ const vs = validate(toData(selfOr))
579
+ assertEq(vs(5)[0], 'ok')
580
+ assertEq(vs('x')[0], 'error')
581
+ },
582
+ throw: {
583
+ // a dangling reference is malformed data — even one naming an
584
+ // `Object.prototype` member, which own-property lookup rejects
585
+ danglingReference: () => validate([{}, 'nope'])(1),
586
+ danglingPrototypeReference: () => validate([{}, 'toString'])(1),
587
+ },
588
+ },
589
+ }