functionalscript 0.45.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 (296) hide show
  1. package/README.md +5 -3
  2. package/fjs/asn.1/module.f.mjs +8 -1
  3. package/fjs/asn.1/proof.f.d.mts +10 -0
  4. package/fjs/asn.1/proof.f.mjs +16 -0
  5. package/fjs/basen/base128/module.f.mjs +22 -5
  6. package/fjs/bnf/data/module.f.d.mts +32 -6
  7. package/fjs/bnf/data/module.f.mjs +112 -7
  8. package/fjs/bnf/data/proof.f.d.mts +2 -0
  9. package/fjs/bnf/data/proof.f.mjs +74 -3
  10. package/fjs/bnf/data/types.d.ts +20 -2
  11. package/fjs/bnf/descent/module.f.d.mts +28 -14
  12. package/fjs/bnf/descent/module.f.mjs +122 -77
  13. package/fjs/bnf/descent/proof.f.d.mts +2 -0
  14. package/fjs/bnf/descent/proof.f.mjs +117 -31
  15. package/fjs/bnf/descent/types.d.ts +12 -14
  16. package/fjs/bnf/ll1/module.f.d.mts +64 -22
  17. package/fjs/bnf/ll1/module.f.mjs +214 -154
  18. package/fjs/bnf/ll1/proof.f.d.mts +15 -2
  19. package/fjs/bnf/ll1/proof.f.mjs +323 -149
  20. package/fjs/bnf/ll1/types.d.ts +16 -24
  21. package/fjs/bnf/matcher/module.f.d.mts +66 -0
  22. package/fjs/bnf/matcher/module.f.mjs +81 -0
  23. package/fjs/bnf/matcher/proof.f.d.mts +10 -0
  24. package/fjs/bnf/matcher/proof.f.mjs +79 -0
  25. package/fjs/bnf/matcher/types.d.ts +54 -0
  26. package/fjs/bnf/testlib.f.d.mts +31 -0
  27. package/fjs/bnf/testlib.f.mjs +80 -0
  28. package/fjs/cas/cli/module.f.d.mts +1 -1
  29. package/fjs/cas/cli/module.f.mjs +14 -20
  30. package/fjs/cas/cli/proof.f.d.mts +1 -3
  31. package/fjs/cas/cli/proof.f.mjs +44 -33
  32. package/fjs/cas/evo/module.f.d.mts +64 -18
  33. package/fjs/cas/evo/module.f.mjs +148 -70
  34. package/fjs/cas/evo/proof.f.d.mts +10 -1
  35. package/fjs/cas/evo/proof.f.mjs +305 -223
  36. package/fjs/cas/evo/types.d.ts +45 -9
  37. package/fjs/cas/module.f.d.mts +18 -32
  38. package/fjs/cas/module.f.mjs +129 -128
  39. package/fjs/cas/proof.f.d.mts +11 -8
  40. package/fjs/cas/proof.f.mjs +259 -147
  41. package/fjs/cas/types.d.ts +24 -10
  42. package/fjs/ci/config/module.f.d.mts +2 -2
  43. package/fjs/ci/config/module.f.mjs +2 -2
  44. package/fjs/ci/module.f.d.mts +5 -5
  45. package/fjs/ci/module.f.mjs +8 -7
  46. package/fjs/ci/nix/module.f.d.mts +7 -5
  47. package/fjs/ci/nix/module.f.mjs +13 -12
  48. package/fjs/ci/nix/proof.f.mjs +2 -2
  49. package/fjs/ci/proof.f.mjs +9 -5
  50. package/fjs/cli/module.f.d.mts +4 -6
  51. package/fjs/cli/module.f.mjs +4 -8
  52. package/fjs/cli/proof.f.mjs +17 -16
  53. package/fjs/cli/types.d.ts +2 -3
  54. package/fjs/common/monoid/types.d.ts +1 -1
  55. package/fjs/crypto/hmac/module.f.mjs +2 -2
  56. package/fjs/crypto/sha2/module.f.mjs +3 -1
  57. package/fjs/crypto/sha2/proof.f.d.mts +1 -0
  58. package/fjs/crypto/sha2/proof.f.mjs +24 -0
  59. package/fjs/crypto/sha2/types.d.ts +11 -0
  60. package/fjs/crypto/sign/module.f.mjs +2 -2
  61. package/fjs/dev/module.f.d.mts +13 -4
  62. package/fjs/dev/module.f.mjs +56 -27
  63. package/fjs/dev/update/module.f.d.mts +9 -4
  64. package/fjs/dev/update/module.f.mjs +14 -10
  65. package/fjs/dev/update/proof.f.d.mts +1 -3
  66. package/fjs/dev/update/proof.f.mjs +10 -5
  67. package/fjs/djs/module.f.d.mts +13 -5
  68. package/fjs/djs/module.f.mjs +31 -16
  69. package/fjs/djs/parser/module.f.d.mts +13 -3
  70. package/fjs/djs/parser/module.f.mjs +117 -16
  71. package/fjs/djs/parser/proof.f.d.mts +5 -1
  72. package/fjs/djs/parser/proof.f.mjs +274 -12
  73. package/fjs/djs/parser/types.d.ts +7 -1
  74. package/fjs/djs/proof.f.d.mts +18 -2
  75. package/fjs/djs/proof.f.mjs +187 -12
  76. package/fjs/djs/serializer/module.f.d.mts +25 -8
  77. package/fjs/djs/serializer/module.f.mjs +61 -15
  78. package/fjs/djs/serializer/proof.f.d.mts +5 -0
  79. package/fjs/djs/serializer/proof.f.mjs +23 -1
  80. package/fjs/djs/tokenizer/module.f.d.mts +17 -5
  81. package/fjs/djs/tokenizer/module.f.mjs +99 -60
  82. package/fjs/djs/tokenizer/proof.f.d.mts +1 -1
  83. package/fjs/djs/tokenizer/proof.f.mjs +74 -67
  84. package/fjs/djs/transpiler/module.f.d.mts +12 -7
  85. package/fjs/djs/transpiler/module.f.mjs +82 -56
  86. package/fjs/djs/transpiler/types.d.ts +7 -3
  87. package/fjs/djs/types.d.ts +7 -1
  88. package/fjs/effects/list/module.f.d.mts +14 -11
  89. package/fjs/effects/list/module.f.mjs +13 -11
  90. package/fjs/effects/list/types.d.ts +27 -7
  91. package/fjs/effects/memory/module.f.d.mts +2 -1
  92. package/fjs/effects/memory/module.f.mjs +3 -4
  93. package/fjs/effects/memory/proof.f.mjs +13 -7
  94. package/fjs/effects/memory/types.d.ts +4 -3
  95. package/fjs/effects/mock/module.f.d.mts +20 -4
  96. package/fjs/effects/mock/module.f.mjs +37 -5
  97. package/fjs/effects/mock/types.d.ts +10 -1
  98. package/fjs/effects/module.d.mts +4 -2
  99. package/fjs/effects/module.f.d.mts +466 -280
  100. package/fjs/effects/module.f.mjs +537 -299
  101. package/fjs/effects/module.mjs +2 -1
  102. package/fjs/effects/node/memory/module.d.mts +4 -2
  103. package/fjs/effects/node/memory/module.mjs +6 -3
  104. package/fjs/effects/node/memory/proof.mjs +10 -4
  105. package/fjs/effects/node/module.d.mts +4 -3
  106. package/fjs/effects/node/module.f.d.mts +168 -33
  107. package/fjs/effects/node/module.f.mjs +256 -52
  108. package/fjs/effects/node/module.mjs +57 -34
  109. package/fjs/effects/node/proof.f.d.mts +28 -2
  110. package/fjs/effects/node/proof.f.mjs +161 -42
  111. package/fjs/effects/node/types.d.ts +106 -18
  112. package/fjs/effects/node/virtual/module.f.d.mts +18 -4
  113. package/fjs/effects/node/virtual/module.f.mjs +110 -68
  114. package/fjs/effects/node/virtual/proof.f.d.mts +28 -2
  115. package/fjs/effects/node/virtual/proof.f.mjs +190 -9
  116. package/fjs/effects/proof.f.d.mts +69 -37
  117. package/fjs/effects/proof.f.mjs +410 -130
  118. package/fjs/effects/types.d.ts +161 -33
  119. package/fjs/emergent_testing/module.f.d.mts +19 -12
  120. package/fjs/emergent_testing/module.f.mjs +93 -33
  121. package/fjs/emergent_testing/proof.f.d.mts +21 -7
  122. package/fjs/emergent_testing/proof.f.mjs +166 -32
  123. package/fjs/emergent_testing/types.d.ts +22 -4
  124. package/fjs/fsm/module.f.d.mts +14 -4
  125. package/fjs/fsm/module.f.mjs +54 -37
  126. package/fjs/fsm/proof.f.d.mts +2 -0
  127. package/fjs/fsm/proof.f.mjs +83 -114
  128. package/fjs/js/keywords/module.f.d.mts +52 -0
  129. package/fjs/js/keywords/module.f.mjs +72 -0
  130. package/fjs/js/keywords/proof.f.d.mts +3 -0
  131. package/fjs/js/keywords/proof.f.mjs +13 -0
  132. package/fjs/js/tokenizer/module.f.d.mts +26 -6
  133. package/fjs/js/tokenizer/module.f.mjs +145 -159
  134. package/fjs/js/tokenizer/proof.f.d.mts +1 -0
  135. package/fjs/js/tokenizer/proof.f.mjs +54 -24
  136. package/fjs/js/tokenizer/types.d.ts +33 -24
  137. package/fjs/mcp/cas/module.f.d.mts +1 -6
  138. package/fjs/mcp/cas/module.f.mjs +55 -51
  139. package/fjs/mcp/cas/proof.f.d.mts +15 -0
  140. package/fjs/mcp/cas/proof.f.mjs +174 -0
  141. package/fjs/mcp/evo/module.f.d.mts +19 -10
  142. package/fjs/mcp/evo/module.f.mjs +48 -27
  143. package/fjs/mcp/evo/proof.f.d.mts +6 -1
  144. package/fjs/mcp/evo/proof.f.mjs +115 -31
  145. package/fjs/mcp/module.f.d.mts +4 -4
  146. package/fjs/mcp/module.f.mjs +6 -6
  147. package/fjs/mcp/proof.f.d.mts +5 -3
  148. package/fjs/mcp/proof.f.mjs +112 -46
  149. package/fjs/media/html/module.f.mjs +1 -1
  150. package/fjs/media/json/extended/module.f.d.mts +82 -0
  151. package/fjs/media/json/extended/module.f.mjs +153 -0
  152. package/fjs/media/json/extended/proof.f.d.mts +42 -0
  153. package/fjs/media/json/extended/proof.f.mjs +127 -0
  154. package/fjs/media/json/extended/types.d.ts +23 -0
  155. package/fjs/media/json/module.f.d.mts +8 -2
  156. package/fjs/media/json/module.f.mjs +43 -41
  157. package/fjs/media/json/number/module.f.d.mts +59 -0
  158. package/fjs/media/json/number/module.f.mjs +136 -0
  159. package/fjs/media/json/number/proof.f.d.mts +24 -0
  160. package/fjs/media/json/number/proof.f.mjs +86 -0
  161. package/fjs/media/json/number/types.d.ts +28 -0
  162. package/fjs/media/json/parser/module.f.d.mts +25 -13
  163. package/fjs/media/json/parser/module.f.mjs +114 -70
  164. package/fjs/media/json/parser/proof.f.d.mts +5 -0
  165. package/fjs/media/json/parser/proof.f.mjs +31 -1
  166. package/fjs/media/json/parser/types.d.ts +33 -14
  167. package/fjs/media/json/rtti/module.f.d.mts +1 -1
  168. package/fjs/media/json/rtti/module.f.mjs +1 -1
  169. package/fjs/media/json/rtti/proof.f.mjs +9 -9
  170. package/fjs/media/json/schema/module.f.mjs +3 -13
  171. package/fjs/media/json/schema/proof.f.d.mts +0 -1
  172. package/fjs/media/json/schema/proof.f.mjs +1 -2
  173. package/fjs/media/json/serializer/module.f.d.mts +32 -1
  174. package/fjs/media/json/serializer/module.f.mjs +64 -2
  175. package/fjs/media/json/tokenizer/module.f.mjs +7 -3
  176. package/fjs/media/json/tokenizer/proof.f.d.mts +6 -0
  177. package/fjs/media/json/tokenizer/proof.f.mjs +62 -21
  178. package/fjs/media/json/types.d.ts +36 -10
  179. package/fjs/media/lock/module.f.d.mts +100 -0
  180. package/fjs/media/lock/module.f.mjs +125 -0
  181. package/fjs/media/lock/proof.f.d.mts +33 -0
  182. package/fjs/media/lock/proof.f.mjs +196 -0
  183. package/fjs/media/lock/types.d.ts +15 -0
  184. package/fjs/media/module.f.d.mts +6 -5
  185. package/fjs/media/module.f.mjs +8 -7
  186. package/fjs/media/note/module.f.d.mts +121 -0
  187. package/fjs/media/note/module.f.mjs +131 -0
  188. package/fjs/media/note/proof.f.d.mts +29 -0
  189. package/fjs/media/note/proof.f.mjs +150 -0
  190. package/fjs/media/note/types.d.ts +10 -0
  191. package/fjs/media/proof.f.d.mts +4 -1
  192. package/fjs/media/proof.f.mjs +40 -21
  193. package/fjs/media/revision/module.f.d.mts +78 -7
  194. package/fjs/media/revision/module.f.mjs +119 -12
  195. package/fjs/media/revision/proof.f.d.mts +10 -0
  196. package/fjs/media/revision/proof.f.mjs +88 -0
  197. package/fjs/media/revision/types.d.ts +34 -5
  198. package/fjs/media/type/module.f.d.mts +33 -15
  199. package/fjs/media/type/module.f.mjs +35 -29
  200. package/fjs/media/type/proof.f.d.mts +2 -1
  201. package/fjs/media/type/proof.f.mjs +30 -10
  202. package/fjs/module.f.mjs +29 -8
  203. package/fjs/nanvm/proof.f.mjs +3 -3
  204. package/fjs/nanvm/rust/module.f.mjs +1 -1
  205. package/fjs/nanvm/update/module.f.d.mts +4 -4
  206. package/fjs/nanvm/update/module.f.mjs +8 -9
  207. package/fjs/nanvm/update/proof.f.mjs +4 -3
  208. package/fjs/proof.f.d.mts +3 -3
  209. package/fjs/proof.f.mjs +36 -10
  210. package/fjs/protocol/json_rpc/module.f.d.mts +2 -2
  211. package/fjs/protocol/json_rpc/module.f.mjs +3 -3
  212. package/fjs/protocol/json_rpc/proof.f.mjs +4 -4
  213. package/fjs/protocol/mcp/module.f.d.mts +10 -13
  214. package/fjs/protocol/mcp/module.f.mjs +74 -58
  215. package/fjs/protocol/mcp/proof.f.d.mts +13 -4
  216. package/fjs/protocol/mcp/proof.f.mjs +193 -61
  217. package/fjs/protocol/mcp/stdio/module.f.d.mts +15 -7
  218. package/fjs/protocol/mcp/stdio/module.f.mjs +38 -25
  219. package/fjs/protocol/mcp/stdio/proof.f.d.mts +4 -2
  220. package/fjs/protocol/mcp/stdio/proof.f.mjs +45 -12
  221. package/fjs/protocol/mcp/stdio/types.d.ts +1 -1
  222. package/fjs/protocol/mcp/types.d.ts +17 -6
  223. package/fjs/sul/id/module.f.d.mts +0 -1
  224. package/fjs/sul/id/module.f.mjs +2 -3
  225. package/fjs/sul/level/hash/module.f.mjs +2 -1
  226. package/fjs/sul/level/hash/proof.f.mjs +2 -2
  227. package/fjs/sul/module.f.mjs +18 -13
  228. package/fjs/text/code_point/module.f.d.mts +8 -0
  229. package/fjs/text/code_point/module.f.mjs +8 -1
  230. package/fjs/text/code_point/proof.f.d.mts +1 -0
  231. package/fjs/text/code_point/proof.f.mjs +11 -0
  232. package/fjs/text/sgr/module.f.d.mts +4 -6
  233. package/fjs/text/sgr/module.f.mjs +6 -7
  234. package/fjs/text/utf16/module.f.mjs +7 -2
  235. package/fjs/text/utf16/proof.f.mjs +3 -3
  236. package/fjs/text/utf8/module.f.mjs +4 -2
  237. package/fjs/types/array/module.f.mjs +14 -2
  238. package/fjs/types/bit_vec/module.f.d.mts +0 -2
  239. package/fjs/types/bit_vec/module.f.mjs +46 -32
  240. package/fjs/types/bit_vec/proof.f.mjs +2 -2
  241. package/fjs/types/btree/remove/module.f.mjs +1 -1
  242. package/fjs/types/btree/set/module.f.mjs +9 -11
  243. package/fjs/types/btree/set/proof.f.mjs +12 -0
  244. package/fjs/types/byte_set/module.f.d.mts +11 -4
  245. package/fjs/types/byte_set/module.f.mjs +14 -6
  246. package/fjs/types/byte_set/proof.f.mjs +7 -7
  247. package/fjs/types/function/compare/module.f.mjs +10 -3
  248. package/fjs/types/list/module.f.d.mts +1 -1
  249. package/fjs/types/list/module.f.mjs +1 -1
  250. package/fjs/types/nullable/module.f.d.mts +18 -4
  251. package/fjs/types/nullable/module.f.mjs +21 -4
  252. package/fjs/types/nullable/proof.f.d.mts +4 -0
  253. package/fjs/types/nullable/proof.f.mjs +15 -0
  254. package/fjs/types/object/module.f.d.mts +12 -2
  255. package/fjs/types/object/module.f.mjs +11 -1
  256. package/fjs/types/patricia_trie/module.f.mjs +26 -11
  257. package/fjs/types/result/module.f.d.mts +3 -3
  258. package/fjs/types/result/module.f.mjs +3 -3
  259. package/fjs/types/rtti/common/module.f.d.mts +25 -28
  260. package/fjs/types/rtti/common/module.f.mjs +36 -32
  261. package/fjs/types/rtti/common/proof.f.mjs +5 -5
  262. package/fjs/types/rtti/data/module.f.d.mts +14 -0
  263. package/fjs/types/rtti/data/module.f.mjs +25 -2
  264. package/fjs/types/rtti/data/proof.f.d.mts +1 -0
  265. package/fjs/types/rtti/data/proof.f.mjs +25 -2
  266. package/fjs/types/rtti/parse/module.f.d.mts +24 -14
  267. package/fjs/types/rtti/parse/module.f.mjs +37 -28
  268. package/fjs/types/rtti/parse/proof.f.d.mts +3 -2
  269. package/fjs/types/rtti/parse/proof.f.mjs +33 -14
  270. package/fjs/types/rtti/proof.f.mjs +3 -1
  271. package/fjs/types/rtti/ts/module.f.mjs +13 -17
  272. package/fjs/types/rtti/ts/types.d.ts +14 -1
  273. package/fjs/types/sorted_set/module.f.d.mts +18 -0
  274. package/fjs/types/sorted_set/module.f.mjs +22 -0
  275. package/fjs/types/sorted_set/proof.f.d.mts +1 -0
  276. package/fjs/types/sorted_set/proof.f.mjs +16 -1
  277. package/fjs/types/uint8array/module.f.d.mts +1 -1
  278. package/fjs/types/uint8array/module.f.mjs +1 -1
  279. package/fjs/website/module.f.d.mts +3 -3
  280. package/fjs/website/module.f.mjs +4 -7
  281. package/fjs/website/proof.f.mjs +2 -1
  282. package/package.json +2 -2
  283. package/fjs/dev/package_json/module.f.d.mts +0 -39
  284. package/fjs/dev/package_json/module.f.mjs +0 -40
  285. package/fjs/dev/package_json/proof.f.d.mts +0 -6
  286. package/fjs/dev/package_json/proof.f.mjs +0 -32
  287. package/fjs/effects/eff/module.f.d.mts +0 -20
  288. package/fjs/effects/eff/module.f.mjs +0 -70
  289. package/fjs/effects/eff/proof.f.d.mts +0 -15
  290. package/fjs/effects/eff/proof.f.mjs +0 -69
  291. package/fjs/effects/eff/types.d.ts +0 -71
  292. package/fjs/types/rtti/validate/module.f.d.mts +0 -41
  293. package/fjs/types/rtti/validate/module.f.mjs +0 -171
  294. package/fjs/types/rtti/validate/proof.f.d.mts +0 -125
  295. package/fjs/types/rtti/validate/proof.f.mjs +0 -437
  296. package/fjs/types/rtti/validate/types.d.ts +0 -6
@@ -1,437 +0,0 @@
1
- /**
2
- * @import { ValidationError } from '../common/types.ts'
3
- * @import { Equal } from '../../ts/types.ts'
4
- * @import { Ts } from '../ts/types.ts'
5
- * @import { Unknown as DjsUnknown } from '../../../djs/types.ts'
6
- * @import { Assert } from '../../../asserts/types.ts'
7
- */
8
-
9
- import { validate } from './module.f.mjs'
10
- import { boolean, number, string, bigint, unknown, array, record, or, option } from '../module.f.mjs'
11
- import { assert, assertEq } from '../../../asserts/module.f.mjs'
12
-
13
- /** @type {(r: readonly [string, unknown]) => void} */
14
- const assertOk = ([k]) => { assertEq(k, 'ok', 'expected ok') }
15
-
16
- /** @type {(r: readonly [string, unknown]) => void} */
17
- const assertError = ([k]) => { assertEq(k, 'error', 'expected error') }
18
-
19
- /** @type {(expected: readonly string[]) => (r: readonly [string, unknown]) => void} */
20
- const assertErrorPath = expected =>
21
- r => {
22
- assert(r[0] === 'error', 'expected error')
23
- const e = /** @type {ValidationError} */ (r[1])
24
- if (e.path.length !== expected.length) { throw `path length ${e.path.length} != ${expected.length}` }
25
- for (let i = 0; i < expected.length; i++) {
26
- if (e.path[i] !== expected[i]) { throw `path[${i}] ${e.path[i]} != ${expected[i]}` }
27
- }
28
- }
29
-
30
- export const proof = {
31
- boolean: {
32
- ok: () => {
33
- /** @typedef {Assert<Equal<Ts<typeof boolean>, boolean>>} _RoundTrip */
34
- assertOk(validate(boolean)(true))
35
- assertOk(validate(boolean)(false))
36
- },
37
- error: () => {
38
- assertError(validate(boolean)(0))
39
- assertError(validate(boolean)('true'))
40
- assertError(validate(boolean)(null))
41
- },
42
- },
43
- number: {
44
- ok: () => {
45
- /** @typedef {Assert<Equal<Ts<typeof number>, number>>} _RoundTrip */
46
- assertOk(validate(number)(42))
47
- },
48
- error: () => {
49
- assertError(validate(number)('42'))
50
- assertError(validate(number)(42n))
51
- },
52
- },
53
- string: {
54
- ok: () => {
55
- /** @typedef {Assert<Equal<Ts<typeof string>, string>>} _RoundTrip */
56
- assertOk(validate(string)('hello'))
57
- },
58
- error: () => {
59
- assertError(validate(string)(42))
60
- assertError(validate(string)(null))
61
- },
62
- },
63
- bigint: {
64
- ok: () => {
65
- /** @typedef {Assert<Equal<Ts<typeof bigint>, bigint>>} _RoundTrip */
66
- assertOk(validate(bigint)(4n))
67
- },
68
- error: () => {
69
- assertError(validate(bigint)(4))
70
- assertError(validate(bigint)('4'))
71
- },
72
- },
73
- unknown: {
74
- ok: () => {
75
- /** @typedef {Assert<Equal<Ts<typeof unknown>, DjsUnknown>>} _RoundTrip */
76
- assertOk(validate(unknown)(null))
77
- assertOk(validate(unknown)(42))
78
- assertOk(validate(unknown)('hello'))
79
- assertOk(validate(unknown)(true))
80
- assertOk(validate(unknown)({}))
81
- assertOk(validate(unknown)([]))
82
- },
83
- },
84
- const: {
85
- null: {
86
- ok: () => {
87
- /** @typedef {Assert<Equal<Ts<null>, null>>} _RoundTrip */
88
- assertOk(validate(null)(null))
89
- },
90
- error: () => {
91
- assertError(validate(null)(undefined))
92
- assertError(validate(null)(0))
93
- },
94
- },
95
- undefined: {
96
- ok: () => {
97
- /** @typedef {Assert<Equal<Ts<undefined>, undefined>>} _RoundTrip */
98
- assertOk(validate(undefined)(undefined))
99
- },
100
- error: () => assertError(validate(undefined)(null)),
101
- },
102
- number: {
103
- ok: () => {
104
- /** @typedef {Assert<Equal<Ts<42>, 42>>} _RoundTrip */
105
- assertOk(validate(/** @type {const} */ (42))(42))
106
- },
107
- error: () => assertError(validate(/** @type {const} */ (42))(43)),
108
- },
109
- nan: {
110
- ok: () => assertOk(validate(/** @type {number} */ (NaN))(NaN)),
111
- error: () => {
112
- assertError(validate(/** @type {number} */ (NaN))(0))
113
- assertError(validate(/** @type {const} */ (0))(NaN))
114
- assertError(validate(/** @type {const} */ (42))(NaN))
115
- },
116
- },
117
- infinity: {
118
- ok: () => {
119
- assertOk(validate(/** @type {number} */ (Infinity))(Infinity))
120
- assertOk(validate(/** @type {number} */ (-Infinity))(-Infinity))
121
- },
122
- error: () => {
123
- assertError(validate(/** @type {number} */ (Infinity))(-Infinity))
124
- assertError(validate(/** @type {number} */ (Infinity))(0))
125
- },
126
- },
127
- signedZero: {
128
- // `Object.is` distinguishes +0 and -0; `===` treats them equal.
129
- distinct: () => {
130
- assertError(validate(/** @type {const} */ (0))(-0))
131
- assertError(validate(/** @type {number} */ (-0))(0))
132
- },
133
- self: () => {
134
- assertOk(validate(/** @type {const} */ (0))(0))
135
- assertOk(validate(/** @type {number} */ (-0))(-0))
136
- },
137
- },
138
- string: {
139
- ok: () => {
140
- /** @typedef {Assert<Equal<Ts<'hello'>, 'hello'>>} _RoundTrip */
141
- assertOk(validate(/** @type {const} */ ('hello'))('hello'))
142
- },
143
- error: () => assertError(validate(/** @type {const} */ ('hello'))('world')),
144
- },
145
- bigint: {
146
- ok: () => {
147
- /** @typedef {Assert<Equal<Ts<7n>, 7n>>} _RoundTrip */
148
- assertOk(validate(/** @type {const} */ (7n))(7n))
149
- },
150
- error: () => assertError(validate(/** @type {const} */ (7n))(8n)),
151
- },
152
- boolean: {
153
- ok: () => {
154
- /** @typedef {Assert<Equal<Ts<true>, true>>} _RoundTrip */
155
- assertOk(validate(/** @type {const} */ (true))(true))
156
- },
157
- error: () => assertError(validate(/** @type {const} */ (true))(false)),
158
- },
159
- tuple: {
160
- ok: () => {
161
- const t = /** @type {const} */ ([42, 'hello'])
162
- /** @typedef {Assert<Equal<Ts<typeof t>, readonly[42, 'hello']>>} _RoundTrip */
163
- assertOk(validate(t)([42, 'hello']))
164
- },
165
- extraItems: () => assertOk(validate(/** @type {const} */ ([42]))([42, 'extra'])),
166
- error: () => {
167
- assertError(validate(/** @type {const} */ ([42]))([99]))
168
- assertError(validate(/** @type {const} */ ([42]))({}))
169
- },
170
- },
171
- struct: {
172
- ok: () => {
173
- const t = /** @type {const} */ ({ a: 42, b: 'hello' })
174
- /** @typedef {Assert<Equal<Ts<typeof t>, { readonly a: 42, readonly b: 'hello' }>>} _RoundTrip */
175
- assertOk(validate(t)({ a: 42, b: 'hello' }))
176
- },
177
- extraKeys: () => assertOk(validate(/** @type {const} */ ({ a: /** @type {const} */ (42) }))({ a: 42, b: 'extra' })),
178
- error: () => {
179
- assertError(validate(/** @type {const} */ ({ a: 42 }))({ a: 99 }))
180
- assertError(validate(/** @type {const} */ ({ a: 42 }))([]))
181
- },
182
- },
183
- },
184
- array: {
185
- empty: () => assertOk(validate(array(number))([])),
186
- ok: () => {
187
- const t = array(number)
188
- /** @typedef {Assert<Equal<Ts<typeof t>, readonly number[]>>} _RoundTrip */
189
- assertOk(validate(array(number))([1, 2, 3]))
190
- },
191
- error: () => {
192
- assertError(validate(array(number))([1, 'two', 3]))
193
- assertError(validate(array(number))({}))
194
- assertError(validate(array(number))(null))
195
- },
196
- nested: () => {
197
- const t = array(array(boolean))
198
- /** @typedef {Assert<Equal<Ts<typeof t>, readonly (readonly boolean[])[]>>} _RoundTrip */
199
- assertOk(validate(array(array(boolean)))([[true, false], [false]]))
200
- assertError(validate(array(array(boolean)))([[true, 42]]))
201
- },
202
- },
203
- record: {
204
- empty: () => assertOk(validate(record(number))({})),
205
- ok: () => {
206
- const t = record(string)
207
- /** @typedef {Assert<Equal<Ts<typeof t>, { readonly[K in string]?: string }>>} _RoundTrip */
208
- assertOk(validate(t)({ a: 'hello', b: 'world' }))
209
- },
210
- error: () => {
211
- assertError(validate(record(number))({ a: 1, b: 'two' }))
212
- assertError(validate(record(number))(null))
213
- assertError(validate(record(number))([]))
214
- },
215
- },
216
- constThunk: {
217
- primitive: () => {
218
- const t = () => /** @type {const} */ (['const', 7n])
219
- /** @typedef {Assert<Equal<Ts<typeof t>, 7n>>} _RoundTrip */
220
- assertOk(validate(t)(7n))
221
- assertError(validate(t)(8n))
222
- },
223
- },
224
- or: {
225
- consts: {
226
- ok: () => {
227
- const t = or(.../** @type {const} */ ([false,42, 'hello']))
228
- /** @typedef {Assert<Equal<Ts<typeof t>, false | 42 | 'hello'>>} _RoundTrip */
229
- assertOk(validate(t)(false))
230
- assertOk(validate(t)(42))
231
- assertOk(validate(t)('hello'))
232
- },
233
- error: () => {
234
- const t = or(.../** @type {const} */ ([false, 42, 'hello']))
235
- assertError(validate(t)(true))
236
- assertError(validate(t)(43))
237
- assertError(validate(t)('world'))
238
- assertError(validate(t)(null))
239
- },
240
- },
241
- thunks: {
242
- ok: () => {
243
- const t = or(number, string)
244
- /** @typedef {Assert<Equal<Ts<typeof t>, number | string>>} _RoundTrip */
245
- assertOk(validate(t)(42))
246
- assertOk(validate(t)('hello'))
247
- },
248
- error: () => {
249
- const t = or(number, string)
250
- assertError(validate(t)(true))
251
- assertError(validate(t)(null))
252
- },
253
- },
254
- mixed: {
255
- ok: () => {
256
- const t = or(/** @type {const} */ (42), string)
257
- /** @typedef {Assert<Equal<Ts<typeof t>, 42 | string>>} _RoundTrip */
258
- assertOk(validate(t)(42))
259
- assertOk(validate(t)('hello'))
260
- },
261
- error: () => {
262
- const t = or(/** @type {const} */ (42), string)
263
- assertError(validate(t)(43))
264
- assertError(validate(t)(null))
265
- },
266
- },
267
- },
268
- option: {
269
- ok: () => {
270
- const t = option(number)
271
- /** @typedef {Assert<Equal<Ts<typeof t>, number | undefined>>} _RoundTrip */
272
- assertOk(validate(t)(42))
273
- assertOk(validate(t)(undefined))
274
- },
275
- error: () => {
276
- const t = option(number)
277
- assertError(validate(t)(null))
278
- assertError(validate(t)('42'))
279
- },
280
- },
281
- path: {
282
- rootMismatch: () => assertErrorPath([])(validate(number)('not a number')),
283
- arrayIndex: () => assertErrorPath(['1'])(validate(array(number))([1, 'two', 3])),
284
- recordKey: () => {
285
- const r = validate(record(number))({ a: 1, b: 'two', c: 3 })
286
- // record iteration order matches Object.entries; 'b' is the failing key
287
- assertErrorPath(['b'])(r)
288
- },
289
- nestedArray: () => assertErrorPath(['0', '1'])(
290
- validate(array(array(number)))([[1, 'x'], [2, 3]])
291
- ),
292
- tupleIndex: () => assertErrorPath(['1'])(
293
- validate(/** @type {const} */ ([number, number]))([1, 'two'])
294
- ),
295
- structKey: () => assertErrorPath(['b'])(
296
- validate(/** @type {const} */ ({ a: number, b: number }))({ a: 1, b: 'two' })
297
- ),
298
- deepStruct: () => {
299
- const schema = /** @type {const} */ ({ user: { name: string, age: number } })
300
- const r = validate(schema)({ user: { name: 'A', age: 'old' } })
301
- assertErrorPath(['user', 'age'])(r)
302
- },
303
- recursiveSchema: () => {
304
- /** @typedef {readonly _A[]} _A */
305
- const list = () => /** @type {const} */ (['array', list])
306
- // [[[42]]] — innermost element 42 is a number, not an array
307
- const r = validate(list)([/** @type {_A} */ (/** @type {unknown} */ ([[42]]))])
308
- assertErrorPath(['0', '0', '0'])(r)
309
- },
310
- orRoot: () => assertErrorPath([])(validate(or(number, string))(true)),
311
- },
312
- recursive: {
313
- arrayOfArrays: () => {
314
- /** @typedef {readonly _A[]} _A */
315
- // self-referential schema: an array whose elements are also arrays of the same type
316
- const list = () => /** @type {const} */ (['array', list])
317
- /** @typedef {Assert<Equal<_A, Ts<typeof list>>>} _RoundTripA */
318
- const v = validate(list)
319
- assertOk(v([]))
320
- assertOk(v([[], []]))
321
- assertOk(v([[[], []], []]))
322
- assertError(v([42]))
323
- assertError(v(null))
324
- },
325
- recordOfRecords: () => {
326
- const tree = () => /** @type {const} */ (['record', tree])
327
- /** @typedef {{ readonly[K in string]?: _A }} _A */
328
- /** @typedef {Assert<Equal<_A, Ts<typeof tree>>>} _RoundTrip */
329
- const v = validate(tree)
330
- assertOk(v({}))
331
- assertOk(v({ a: {}, b: { c: {} } }))
332
- assertError(v({ a: 42 }))
333
- },
334
- },
335
- funcParam: () => {
336
- const paramSet0 = /** @type {const} */ (['hello', bigint])
337
- const paramSet1 = /** @type {const} */ (['goodbye', string, 43])
338
-
339
- const paramSet01 = or(paramSet0, paramSet1)
340
-
341
- /** @typedef {Ts<typeof paramSet0>} _Param0 */
342
- /** @typedef {Ts<typeof paramSet1>} _Param1 */
343
- /** @typedef {Ts<typeof paramSet01>} _Param01 */
344
-
345
- const v0 = validate(paramSet0)
346
- const v1 = validate(paramSet1)
347
-
348
- /** @template T @typedef {(...args: _Param0) => T} _F0 */
349
- /** @template T @typedef {(...args: _Param1) => T} _F1 */
350
-
351
- /**
352
- * @template T
353
- * @param {_F0<T>} f0
354
- * @param {_F1<T>} f1
355
- * @returns {(...args: _Param01) => T}
356
- */
357
- const func = (f0, f1) => (...args) => {
358
- {
359
- const [t, r] = v0(args)
360
- if (t === 'ok') {
361
- return f0(...r)
362
- }
363
- }
364
- {
365
- const [t, r] = v1(args)
366
- if (t === 'ok') {
367
- return f1(...r)
368
- }
369
- }
370
- throw 'unreachable: args did not match any parameter set'
371
- }
372
-
373
- /** @type {(a: 'hello', b: bigint) => number} */
374
- const f0 = (a, b) => 42
375
- /** @type {(a: 'goodbye', b: string, c: 43) => number} */
376
- const f1 = (a, b, c) => 13
377
-
378
- /** @type {(...args: _Param01) => number} */
379
- const x = func(f0, f1)
380
-
381
- return () => {
382
- assertEq(x('hello', 42n), 42)
383
- assertEq(x('goodbye', 'world', 43), 13)
384
- }
385
- },
386
- funcObj: () => {
387
- const param0 = { a: 'hello', b: bigint }
388
- const param1 = { a: 'goodbye', b: string, c: 43 }
389
-
390
- const param01 = or(param0, param1)
391
-
392
- /** @typedef {Ts<typeof param0>} _Param0 */
393
- /** @typedef {Ts<typeof param1>} _Param1 */
394
- /** @typedef {Ts<typeof param01>} _Param01 */
395
-
396
- const v0 = validate(param0)
397
- const v1 = validate(param1)
398
-
399
- /** @template T @typedef {(args: _Param0) => T} _F0 */
400
- /** @template T @typedef {(args: _Param1) => T} _F1 */
401
-
402
- /**
403
- * @template T
404
- * @param {_F0<T>} f0
405
- * @param {_F1<T>} f1
406
- * @returns {(args: _Param01) => T}
407
- */
408
- const func = (f0, f1) => args => {
409
- {
410
- const [t, r] = v0(args)
411
- if (t === 'ok') {
412
- return f0(r)
413
- }
414
- }
415
- {
416
- const [t, r] = v1(args)
417
- if (t === 'ok') {
418
- return f1(r)
419
- }
420
- }
421
- throw 'unreachable: args did not match any parameter set'
422
- }
423
-
424
- /** @type {(args: _Param0) => number} */
425
- const f0 = args => Number(args.b) + args.a.length
426
- /** @type {(args: _Param1) => number} */
427
- const f1 = args => args.c
428
-
429
- /** @type {(args: _Param01) => number} */
430
- const x = func(f0, f1)
431
-
432
- return () => {
433
- assertEq(x({ a: 'hello', b: 42n }), 47)
434
- assertEq(x({ a: 'goodbye', b: 'world', c: 43 }), 43)
435
- }
436
- }
437
- }
@@ -1,6 +0,0 @@
1
- /**
2
- * Type-level API for RTTI validation.
3
- *
4
- * @module
5
- */
6
- export type { Path, Result, Validate, ValidationError } from '../common/types.ts';