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,196 @@
1
+ /**
2
+ * @import { Object as JsonObject } from '../json/types.ts'
3
+ * @import { LockMap } from './types.ts'
4
+ */
5
+
6
+ import { assert, assertEq } from '../../asserts/module.f.mjs'
7
+ import { dialect, mediaType, checkReferences, validate, decodeText, encodeText } from './module.f.mjs'
8
+ import {
9
+ dialect as revisionDialect,
10
+ encodeText as revisionEncodeText,
11
+ validate as revisionValidate,
12
+ } from '../revision/module.f.mjs'
13
+ import { stringify } from '../json/module.f.mjs'
14
+ import { sort } from '../../types/object/module.f.mjs'
15
+
16
+ // Valid cbase32 hashes (round-tripped in fjs/basen/cbase32/proof.f.mjs): single
17
+ // cbase32 symbols, cheap to write inline here.
18
+ const h1 = '8'
19
+ const h2 = 'r'
20
+
21
+ /** A shape-valid lock blob holding `lock`.
22
+ * @type {(lock: JsonObject) => JsonObject}
23
+ */
24
+ const lockOf = lock => ({ dialect, lock })
25
+
26
+ /**
27
+ * The one map both forms are asked to carry — nested, so the claim covers
28
+ * every depth rather than just the top level.
29
+ * @type {LockMap}
30
+ */
31
+ const sharedMap = { C: { D: h2, C: h1 }, B: { D: h1 } }
32
+
33
+ /** The canonical rendering of a lock map on its own, independent of either blob. */
34
+ const canonicalMap = stringify(sort)
35
+
36
+ export const proof = {
37
+ dialectAndMediaType: () => {
38
+ assertEq(dialect, 'vnd.fjs.lock')
39
+ assertEq(mediaType, 'application/vnd.fjs.lock+json')
40
+ },
41
+
42
+ validate: {
43
+ // The ordinary case: a flat map of subject-to-content bindings.
44
+ flatMapAccepted: () => {
45
+ const r = validate(lockOf({ dependency: h1 }))
46
+ assert(r[0] === 'ok', ['expected ok', r])
47
+ assertEq(r[1].lock.dependency, h1)
48
+ },
49
+
50
+ // An empty map is a lock blob that records no bindings — distinct from
51
+ // a revision omitting `lock`, and the reason the field is required.
52
+ emptyMapAccepted: () => {
53
+ const r = validate(lockOf({}))
54
+ assert(r[0] === 'ok', ['expected ok', r])
55
+ assertEq(Object.keys(r[1].lock).length, 0)
56
+ },
57
+
58
+ // Nesting is the revision dialect's, unchanged: scopes to any depth.
59
+ nestedMapAccepted: () => {
60
+ const [t] = validate(lockOf({ B: { C: { D: { E: h1 } } }, empty: {} }))
61
+ assertEq(t, 'ok')
62
+ },
63
+
64
+ // `lock` is required: a blob carrying only the tag is not one.
65
+ missingLockRejected: () => {
66
+ const [t] = validate({ dialect })
67
+ assertEq(t, 'error')
68
+ },
69
+
70
+ // The field is a map, never a hash — a lock blob does not reference
71
+ // further lock blobs, so following a reference terminates in one step.
72
+ referenceLockRejected: () => {
73
+ const [t] = validate({ dialect, lock: h1 })
74
+ assertEq(t, 'error')
75
+ },
76
+
77
+ // A value must be a string or a map: a number fails structurally.
78
+ malformedMapRejected: () => {
79
+ const [t] = validate(lockOf({ dependency: 1 }))
80
+ assertEq(t, 'error')
81
+ },
82
+
83
+ // The semantic check is the revision dialect's own, so a non-hash
84
+ // string is rejected here with the same path-naming message.
85
+ invalidHashRejected: () => {
86
+ const r = validate(lockOf({ B: { D: 'https://example.com/x' } }))
87
+ assert(r[0] === 'error', ['expected error', r])
88
+ assertEq(r[1], 'lock value for B/D is not a valid hash: https://example.com/x')
89
+ },
90
+
91
+ // No `subject`, `parents`, `generation` or `archived`: this dialect is
92
+ // a value, not a step. rtti structs are open, so such fields are
93
+ // ignored rather than rejected — the additive forward-compatibility
94
+ // path, the same one the revision dialect relies on.
95
+ revisionFieldsIgnored: () => {
96
+ const [t] = validate({ dialect, lock: {}, subject: h1, parents: [], generation: 0 })
97
+ assertEq(t, 'ok')
98
+ },
99
+
100
+ // A revision blob is not a lock blob: the tag is matched as an exact
101
+ // literal, so the two dialects never validate each other's content.
102
+ revisionBlobRejected: () => {
103
+ const [t] = validate({
104
+ dialect: revisionDialect,
105
+ subject: h1,
106
+ parents: [],
107
+ snapshot: h2,
108
+ generation: 0,
109
+ lock: {},
110
+ })
111
+ assertEq(t, 'error')
112
+ },
113
+ },
114
+
115
+ // The already-typed entry point, for callers that assembled a `Lock`
116
+ // themselves and need only the semantic half.
117
+ checkReferences: {
118
+ valid: () => {
119
+ const [t] = checkReferences({ dialect, lock: { dependency: h1 } })
120
+ assertEq(t, 'ok')
121
+ },
122
+ invalid: () => {
123
+ const [t] = checkReferences({ dialect, lock: { dependency: 'not a hash!' } })
124
+ assertEq(t, 'error')
125
+ },
126
+ },
127
+
128
+ decodeText: {
129
+ validJson: () => {
130
+ const r = decodeText(JSON.stringify(lockOf({ dependency: h1 })))
131
+ assert(r[0] === 'ok', ['expected ok', r])
132
+ assertEq(r[1].lock.dependency, h1)
133
+ },
134
+
135
+ // Key order carries no meaning: the JSON is parsed and the parsed
136
+ // value validated, so `dialect` need not come first.
137
+ keyOrderIndependent: () => {
138
+ const [t] = decodeText(`{"lock":{"dependency":"${h1}"},"dialect":"${dialect}"}`)
139
+ assertEq(t, 'ok')
140
+ },
141
+
142
+ malformedJsonRejected: () => {
143
+ const [t] = decodeText('{not json')
144
+ assertEq(t, 'error')
145
+ },
146
+
147
+ ordinaryJsonRejected: () => {
148
+ const [t] = decodeText('{"hello":"world"}')
149
+ assertEq(t, 'error')
150
+ },
151
+ },
152
+
153
+ encodeText: {
154
+ recursivelySortsObjectsLexicographically: () => {
155
+ const decoded = validate(lockOf({ scope: { '2': h2, '10': h1 }, '2': h2, '10': h1 }))
156
+ assert(decoded[0] === 'ok', ['expected ok', decoded])
157
+ assertEq(
158
+ encodeText(decoded[1]),
159
+ `{"dialect":"${dialect}","lock":{"10":"${h1}","2":"${h2}","scope":{"10":"${h1}","2":"${h2}"}}}`,
160
+ )
161
+ },
162
+
163
+ // Two blobs differing only in property order converge on one byte
164
+ // sequence, so they address the same CAS blob — which is the whole
165
+ // point of sharing one.
166
+ equivalentOrdersConverge: () => {
167
+ const a = validate(lockOf({ B: { B: h1, D: h2 }, C: { D: h1 } }))
168
+ const b = validate(lockOf({ C: { D: h1 }, B: { D: h2, B: h1 } }))
169
+ assert(a[0] === 'ok', ['expected ok', a])
170
+ assert(b[0] === 'ok', ['expected ok', b])
171
+ assertEq(encodeText(a[1]), encodeText(b[1]))
172
+ },
173
+ },
174
+
175
+ // The point of importing `lock` rather than restating it: one map, one
176
+ // canonical rendering, whether it is held inline by a revision or shared
177
+ // as a blob of its own. The two dialects have different field sets, so the
178
+ // surrounding bytes differ — the map's do not, and a resolver reading
179
+ // either form sees the identical bytes under `lock`.
180
+ inlineAndSharedSerializeIdentically: () => {
181
+ const fragment = `"lock":${canonicalMap(sharedMap)}`
182
+ const shared = validate(lockOf(sharedMap))
183
+ assert(shared[0] === 'ok', ['expected ok', shared])
184
+ const inline = revisionValidate({
185
+ dialect: revisionDialect,
186
+ subject: h1,
187
+ parents: [],
188
+ snapshot: h2,
189
+ generation: 0,
190
+ lock: sharedMap,
191
+ })
192
+ assert(inline[0] === 'ok', ['expected ok', inline])
193
+ assert(encodeText(shared[1]).includes(fragment), encodeText(shared[1]))
194
+ assert(revisionEncodeText(inline[1]).includes(fragment), revisionEncodeText(inline[1]))
195
+ },
196
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Type-level API for `fjs/media/lock/module.f.mjs`: `Lock` and `LockError`.
3
+ *
4
+ * The map type itself is not restated here — it is `fjs/media/revision`'s
5
+ * `LockMap`, re-exported so a consumer of the shared form needs only one
6
+ * import, and so nothing can define a second, drifting spelling of it.
7
+ */
8
+ import type { ValidationError } from '../../types/rtti/common/types.ts';
9
+ import type { Ts } from '../../types/rtti/ts/types.ts';
10
+ import type { lockSchema } from './module.f.mjs';
11
+ export type { LockMap } from '../revision/types.ts';
12
+ /** The TypeScript type derived from `lockSchema` — the single source of truth. */
13
+ export type Lock = Ts<typeof lockSchema>;
14
+ /** Either a structural validation error or a semantic (hash) error message. */
15
+ export type LockError = ValidationError | string;
@@ -12,11 +12,12 @@
12
12
  * `fjs/media/type` verdict unchanged.
13
13
  *
14
14
  * The dialect set is a **parameter**, not an import: `detect(dialects)(bytes)`.
15
- * This module therefore knows no dialect of its own — `fjs/media/revision`
16
- * exports its own {@link DialectEntry} (`revisionDialect`), and a caller passes
17
- * the list it wants recognized. Any format following the `vnd.fjs.<name>`
18
- * convention (see `fjs/media/revision/README.md`), in this repo or downstream,
19
- * is registerable the same way.
15
+ * This module therefore knows no dialect of its own — `fjs/media/revision`,
16
+ * `fjs/media/lock`, and `fjs/media/note` each export their own
17
+ * {@link DialectEntry} (`revisionDialect`, `lockDialect`, `noteDialect`), and
18
+ * a caller passes the list it wants recognized. Any format following the `vnd.fjs.<name>` convention (see
19
+ * `fjs/media/revision/README.md`), in this repo or downstream, is registerable
20
+ * the same way.
20
21
  *
21
22
  * Detection is semantic, not syntactic: any JSON that satisfies a dialect's
22
23
  * schema is recognized regardless of key order, whitespace, or any other
@@ -12,11 +12,12 @@
12
12
  * `fjs/media/type` verdict unchanged.
13
13
  *
14
14
  * The dialect set is a **parameter**, not an import: `detect(dialects)(bytes)`.
15
- * This module therefore knows no dialect of its own — `fjs/media/revision`
16
- * exports its own {@link DialectEntry} (`revisionDialect`), and a caller passes
17
- * the list it wants recognized. Any format following the `vnd.fjs.<name>`
18
- * convention (see `fjs/media/revision/README.md`), in this repo or downstream,
19
- * is registerable the same way.
15
+ * This module therefore knows no dialect of its own — `fjs/media/revision`,
16
+ * `fjs/media/lock`, and `fjs/media/note` each export their own
17
+ * {@link DialectEntry} (`revisionDialect`, `lockDialect`, `noteDialect`), and
18
+ * a caller passes the list it wants recognized. Any format following the `vnd.fjs.<name>` convention (see
19
+ * `fjs/media/revision/README.md`), in this repo or downstream, is registerable
20
+ * the same way.
20
21
  *
21
22
  * Detection is semantic, not syntactic: any JSON that satisfies a dialect's
22
23
  * schema is recognized regardless of key order, whitespace, or any other
@@ -53,7 +54,7 @@ import { fromVec } from '../text/utf8/module.f.mjs'
53
54
  import { detectVec } from './type/module.f.mjs'
54
55
  import { parse } from './json/module.f.mjs'
55
56
  import { assert, assertNotNullish } from '../asserts/module.f.mjs'
56
- import { validate } from '../types/rtti/validate/module.f.mjs'
57
+ import { parse as rttiParse } from '../types/rtti/parse/module.f.mjs'
57
58
 
58
59
  /** The default refinement: structural validation alone decides the match. */
59
60
  const always = () => true
@@ -119,7 +120,7 @@ const matchWith = v => extraValidate => u => {
119
120
  export const dialectEntry = (type, extraValidate = always) => {
120
121
  const { dialect } = type
121
122
  assert(typeof dialect === 'string', 'dialectEntry: schema has no direct string `dialect` member')
122
- return { dialect, match: matchWith(validate(type))(extraValidate) }
123
+ return { dialect, match: matchWith(rttiParse(type))(extraValidate) }
123
124
  }
124
125
 
125
126
  /**
@@ -1,3 +1,16 @@
1
+ /**
2
+ * A minimal, checked eDSL for constructing and serializing Nix expressions.
3
+ *
4
+ * The tree deliberately models syntax rather than evaluated Nix values. String
5
+ * expressions are escaped double-quoted strings; the other supported forms are
6
+ * represented by tagged tuples. See `./types.ts` for the `Expression`
7
+ * type-level API.
8
+ *
9
+ * @module
10
+ *
11
+ * @import { List as ChunkList } from '../../types/list/types.ts'
12
+ * @import { Expression, _AttributePath, _Binding, _Reference, _AttributeSet, _NixList, _Application, _OpenSetPattern, _Lambda, _Let, _Chunks } from './types.ts'
13
+ */
1
14
  import type { List as ChunkList } from '../../types/list/types.ts';
2
15
  import type { Expression } from './types.ts';
3
16
  /**
@@ -7,8 +7,11 @@
7
7
  * type-level API.
8
8
  *
9
9
  * @module
10
+ *
11
+ * @import { List as ChunkList } from '../../types/list/types.ts'
12
+ * @import { Expression, _AttributePath, _Binding, _Reference, _AttributeSet, _NixList, _Application, _OpenSetPattern, _Lambda, _Let, _Chunks } from './types.ts'
10
13
  */
11
- /** @import { List as ChunkList } from '../../types/list/types.ts' */
14
+
12
15
  import { toArray } from '../../types/list/module.f.mjs'
13
16
  import { concat } from '../../types/string/module.f.mjs'
14
17
  import { includes } from '../../types/array/module.f.mjs'
@@ -19,7 +22,6 @@ import {
19
22
  range,
20
23
  } from '../../text/ascii/module.f.mjs'
21
24
  import { fromRange, get, merge } from '../../types/range_set/module.f.mjs'
22
- /** @import { Expression, _AttributePath, _Binding, _Reference, _AttributeSet, _NixList, _Application, _OpenSetPattern, _Lambda, _Let, _Chunks } from './types.ts' */
23
25
 
24
26
  const reservedWords = /** @type {const} */ ([
25
27
  'assert',
@@ -1,3 +1,6 @@
1
+ /**
2
+ * @import { Expression } from './types.ts'
3
+ */
1
4
  export declare const proof: {
2
5
  strings: () => void;
3
6
  reference: () => void;
@@ -1,7 +1,10 @@
1
+ /**
2
+ * @import { Expression } from './types.ts'
3
+ */
4
+
1
5
  import { assert, assertEq } from '../../asserts/module.f.mjs'
2
6
  import { toArray } from '../../types/list/module.f.mjs'
3
7
  import { nix, nixToString } from './module.f.mjs'
4
- /** @import { Expression } from './types.ts' */
5
8
 
6
9
  /** @type {(nodePackage: string, shellHook: boolean) => Expression} */
7
10
  const nodeFlake = (nodePackage, shellHook) => ['set',
@@ -0,0 +1,121 @@
1
+ /**
2
+ * `vnd.fjs.note` — a human-authored text item (a note, todo, issue, calendar
3
+ * event, …) as a BLOB of its own.
4
+ *
5
+ * The format is deliberately minimal: the dialect tag, the text, and
6
+ * optionally the subjects the item depends on and a priority. Everything
7
+ * else a richer item needs — a title, tags, dates, a status — is a future
8
+ * **optional** field:
9
+ * rtti structs are open, so additive extension keeps the tag (see the
10
+ * versioning rule in `fjs/media/revision/README.md`), and starting minimal is
11
+ * what keeps every extension additive.
12
+ *
13
+ * Like `vnd.fjs.lock`, a note is a **value**, not a step: no timestamps, no
14
+ * author, no history of its own. Edits over time are ordinary
15
+ * `vnd.fjs.revision` steps whose `subject` identifies the note and whose
16
+ * `snapshot` is one of these blobs, so no second history mechanism appears
17
+ * and `revision` stays the only one.
18
+ *
19
+ * This module is the pure format only: the rtti schema, the `dialect` tag,
20
+ * and decode/validate. Unlike its CAS siblings it has no hash fields, so
21
+ * there is no semantic refinement stage — structural validation is the whole
22
+ * check.
23
+ *
24
+ * See `README.md` for the full spec.
25
+ *
26
+ * @module
27
+ *
28
+ * @import { Unknown } from '../json/types.ts'
29
+ * @import { Result } from '../../types/result/types.ts'
30
+ * @import { ValidationError } from '../../types/rtti/common/types.ts'
31
+ * @import { DialectEntry } from '../types.ts'
32
+ * @import { Note, NoteError } from './types.ts'
33
+ */
34
+ import type { Unknown } from '../json/types.ts';
35
+ import type { Result } from '../../types/result/types.ts';
36
+ import type { ValidationError } from '../../types/rtti/common/types.ts';
37
+ import type { DialectEntry } from '../types.ts';
38
+ import type { Note, NoteError } from './types.ts';
39
+ /**
40
+ * Format tag: names the dialect of this BLOB. The media type it is served
41
+ * with is derived mechanically: `application/` + `dialect` + `+json`.
42
+ */
43
+ export declare const dialect: 'vnd.fjs.note';
44
+ /** The media type derived from {@link dialect}: `application/vnd.fjs.note+json`. */
45
+ export declare const mediaType: "application/vnd.fjs.note+json";
46
+ /**
47
+ * rtti schema for a `note` BLOB: the dialect tag, the text, and optionally
48
+ * the subjects the item depends on.
49
+ *
50
+ * `text` is **required** and may be `''`: an absent text and an empty one
51
+ * would otherwise be two spellings of one blob, and a blob whose only purpose
52
+ * is to hold text has nothing to say when it does not. Any string is valid —
53
+ * the format records the text and defines no markup for it; how a reader
54
+ * renders it (e.g. as Markdown) is the reader's decision.
55
+ *
56
+ * `dependencies` entries are **subject identity strings** — the vocabulary of
57
+ * `vnd.fjs.revision`'s `subject` and of lock-map keys — naming the mutable
58
+ * items this one depends on (a blocked-by todo, an issue's prerequisite).
59
+ * They are never content hashes: a dependency tracks the live item, and
60
+ * pinning it to immutable content is the revision layer's `lock`. Like
61
+ * `subject`, an identity string is unconstrained, so no semantic check
62
+ * applies. The field is optional because its absent value is the constant
63
+ * "depends on nothing"; an explicit `[]` says the same thing, and the format
64
+ * does not distinguish the two.
65
+ *
66
+ * `text` may reference an entry by its zero-based index in square brackets —
67
+ * `[0]` names `dependencies[0]` — so the entry order is **significant**:
68
+ * reordering or removing entries renumbers references. A bracketed integer
69
+ * that indexes no entry is ordinary text, not a broken reference, so the
70
+ * convention adds no validation stage (see the README).
71
+ *
72
+ * `priority` is the author's decision about the item's urgency, on the
73
+ * {@link priorities} scale — a closed literal union, so it too is enforced
74
+ * entirely structurally (a number would invite scale and range questions
75
+ * only a semantic check could answer). Absent means **unprioritized** — the
76
+ * author has not decided — which is the constant default that makes the
77
+ * field optional, and is deliberately distinct from any rank.
78
+ */
79
+ /**
80
+ * The priority scale, most urgent first: `P1` is "drop everything", `P5` is
81
+ * "someday". The vocabulary of `todo/README.md`'s issue format, reused
82
+ * rather than invented, so one scale ranks the repository's own issues and a
83
+ * note blob alike. Widening it later (e.g. a `P0`) follows the fail-closed
84
+ * path the versioning rule allows: an older reader rejects the new rank
85
+ * rather than misreading it.
86
+ */
87
+ export declare const priorities: readonly ['P1', 'P2', 'P3', 'P4', 'P5'];
88
+ export declare const noteSchema: {
89
+ readonly dialect: "vnd.fjs.note";
90
+ readonly text: import("../../types/rtti/types.ts")._Type0<"string">;
91
+ readonly dependencies: import("../../types/rtti/types.ts").Or<readonly [import("../../types/rtti/types.ts").Type1<"array", import("../../types/rtti/types.ts")._Type0<"string">>, undefined]>;
92
+ readonly priority: import("../../types/rtti/types.ts").Or<readonly [import("../../types/rtti/types.ts").Or<["P1", "P2", "P3", "P4", "P5"]>, undefined]>;
93
+ };
94
+ /** Serializes a note canonically, sorting every object's property names.
95
+ * @type {(note: Note) => string}
96
+ */
97
+ export declare const encodeText: (note: Note) => string;
98
+ /**
99
+ * Validates an already-parsed JSON value as a `note` BLOB. Structural (rtti)
100
+ * validation is the whole check: a note has no hash fields, so there is no
101
+ * semantic refinement stage and no `checkReferences` half.
102
+ *
103
+ * @type {(value: Unknown) => Result<Note, ValidationError>}
104
+ */
105
+ export declare const validate: (value: Unknown) => Result<Note, ValidationError>;
106
+ /**
107
+ * Decodes `text` as a `note` BLOB: JSON-parses it, then validates it per
108
+ * {@link validate}. Detection is semantic, not syntactic — any JSON that
109
+ * satisfies the schema is a note, regardless of key order or whitespace.
110
+ *
111
+ * @type {(text: string) => Result<Note, NoteError>}
112
+ */
113
+ export declare const decodeText: (text: string) => Result<Note, NoteError>;
114
+ /**
115
+ * This dialect as a registry entry for `fjs/media`'s `detect`. Registered
116
+ * with no refinement — structure alone decides the match — so a blob is
117
+ * detected as `vnd.fjs.note` exactly when {@link decodeText} would accept it.
118
+ *
119
+ * @type {DialectEntry}
120
+ */
121
+ export declare const noteDialect: DialectEntry;
@@ -0,0 +1,131 @@
1
+ /**
2
+ * `vnd.fjs.note` — a human-authored text item (a note, todo, issue, calendar
3
+ * event, …) as a BLOB of its own.
4
+ *
5
+ * The format is deliberately minimal: the dialect tag, the text, and
6
+ * optionally the subjects the item depends on and a priority. Everything
7
+ * else a richer item needs — a title, tags, dates, a status — is a future
8
+ * **optional** field:
9
+ * rtti structs are open, so additive extension keeps the tag (see the
10
+ * versioning rule in `fjs/media/revision/README.md`), and starting minimal is
11
+ * what keeps every extension additive.
12
+ *
13
+ * Like `vnd.fjs.lock`, a note is a **value**, not a step: no timestamps, no
14
+ * author, no history of its own. Edits over time are ordinary
15
+ * `vnd.fjs.revision` steps whose `subject` identifies the note and whose
16
+ * `snapshot` is one of these blobs, so no second history mechanism appears
17
+ * and `revision` stays the only one.
18
+ *
19
+ * This module is the pure format only: the rtti schema, the `dialect` tag,
20
+ * and decode/validate. Unlike its CAS siblings it has no hash fields, so
21
+ * there is no semantic refinement stage — structural validation is the whole
22
+ * check.
23
+ *
24
+ * See `README.md` for the full spec.
25
+ *
26
+ * @module
27
+ *
28
+ * @import { Unknown } from '../json/types.ts'
29
+ * @import { Result } from '../../types/result/types.ts'
30
+ * @import { ValidationError } from '../../types/rtti/common/types.ts'
31
+ * @import { DialectEntry } from '../types.ts'
32
+ * @import { Note, NoteError } from './types.ts'
33
+ */
34
+
35
+ import { array, option, or, string } from '../../types/rtti/module.f.mjs'
36
+ import { parse as rttiParse } from '../../types/rtti/parse/module.f.mjs'
37
+ import { parse as parseJson, stringify } from '../json/module.f.mjs'
38
+ import { okThen } from '../../types/result/module.f.mjs'
39
+ import { dialectEntry } from '../module.f.mjs'
40
+ import { sort } from '../../types/object/module.f.mjs'
41
+
42
+ /**
43
+ * Format tag: names the dialect of this BLOB. The media type it is served
44
+ * with is derived mechanically: `application/` + `dialect` + `+json`.
45
+ */
46
+ export const dialect = /** @type {const} */ ('vnd.fjs.note')
47
+
48
+ /** The media type derived from {@link dialect}: `application/vnd.fjs.note+json`. */
49
+ export const mediaType = /** @type {const} */ (`application/${dialect}+json`)
50
+
51
+ /**
52
+ * rtti schema for a `note` BLOB: the dialect tag, the text, and optionally
53
+ * the subjects the item depends on.
54
+ *
55
+ * `text` is **required** and may be `''`: an absent text and an empty one
56
+ * would otherwise be two spellings of one blob, and a blob whose only purpose
57
+ * is to hold text has nothing to say when it does not. Any string is valid —
58
+ * the format records the text and defines no markup for it; how a reader
59
+ * renders it (e.g. as Markdown) is the reader's decision.
60
+ *
61
+ * `dependencies` entries are **subject identity strings** — the vocabulary of
62
+ * `vnd.fjs.revision`'s `subject` and of lock-map keys — naming the mutable
63
+ * items this one depends on (a blocked-by todo, an issue's prerequisite).
64
+ * They are never content hashes: a dependency tracks the live item, and
65
+ * pinning it to immutable content is the revision layer's `lock`. Like
66
+ * `subject`, an identity string is unconstrained, so no semantic check
67
+ * applies. The field is optional because its absent value is the constant
68
+ * "depends on nothing"; an explicit `[]` says the same thing, and the format
69
+ * does not distinguish the two.
70
+ *
71
+ * `text` may reference an entry by its zero-based index in square brackets —
72
+ * `[0]` names `dependencies[0]` — so the entry order is **significant**:
73
+ * reordering or removing entries renumbers references. A bracketed integer
74
+ * that indexes no entry is ordinary text, not a broken reference, so the
75
+ * convention adds no validation stage (see the README).
76
+ *
77
+ * `priority` is the author's decision about the item's urgency, on the
78
+ * {@link priorities} scale — a closed literal union, so it too is enforced
79
+ * entirely structurally (a number would invite scale and range questions
80
+ * only a semantic check could answer). Absent means **unprioritized** — the
81
+ * author has not decided — which is the constant default that makes the
82
+ * field optional, and is deliberately distinct from any rank.
83
+ */
84
+ /**
85
+ * The priority scale, most urgent first: `P1` is "drop everything", `P5` is
86
+ * "someday". The vocabulary of `todo/README.md`'s issue format, reused
87
+ * rather than invented, so one scale ranks the repository's own issues and a
88
+ * note blob alike. Widening it later (e.g. a `P0`) follows the fail-closed
89
+ * path the versioning rule allows: an older reader rejects the new rank
90
+ * rather than misreading it.
91
+ */
92
+ export const priorities = /** @type {const} */ (['P1', 'P2', 'P3', 'P4', 'P5'])
93
+
94
+ export const noteSchema = /** @type {const} */ ({
95
+ dialect,
96
+ text: string,
97
+ dependencies: option(array(string)),
98
+ priority: option(or(...priorities)),
99
+ })
100
+
101
+ /** Serializes a note canonically, sorting every object's property names.
102
+ * @type {(note: Note) => string}
103
+ */
104
+ export const encodeText = stringify(sort)
105
+
106
+ /**
107
+ * Validates an already-parsed JSON value as a `note` BLOB. Structural (rtti)
108
+ * validation is the whole check: a note has no hash fields, so there is no
109
+ * semantic refinement stage and no `checkReferences` half.
110
+ *
111
+ * @type {(value: Unknown) => Result<Note, ValidationError>}
112
+ */
113
+ export const validate = rttiParse(noteSchema)
114
+
115
+ /**
116
+ * Decodes `text` as a `note` BLOB: JSON-parses it, then validates it per
117
+ * {@link validate}. Detection is semantic, not syntactic — any JSON that
118
+ * satisfies the schema is a note, regardless of key order or whitespace.
119
+ *
120
+ * @type {(text: string) => Result<Note, NoteError>}
121
+ */
122
+ export const decodeText = text => okThen(validate)(parseJson(text))
123
+
124
+ /**
125
+ * This dialect as a registry entry for `fjs/media`'s `detect`. Registered
126
+ * with no refinement — structure alone decides the match — so a blob is
127
+ * detected as `vnd.fjs.note` exactly when {@link decodeText} would accept it.
128
+ *
129
+ * @type {DialectEntry}
130
+ */
131
+ export const noteDialect = dialectEntry(noteSchema)
@@ -0,0 +1,29 @@
1
+ export declare const proof: {
2
+ dialectAndMediaType: () => void;
3
+ priorityScale: () => void;
4
+ validate: {
5
+ minimalNoteAccepted: () => void;
6
+ emptyTextAccepted: () => void;
7
+ missingTextRejected: () => void;
8
+ nonStringTextRejected: () => void;
9
+ dependenciesAccepted: () => void;
10
+ emptyDependenciesAccepted: () => void;
11
+ nonArrayDependenciesRejected: () => void;
12
+ nonStringDependencyRejected: () => void;
13
+ priorityAccepted: () => void;
14
+ unknownPriorityRejected: () => void;
15
+ numericPriorityRejected: () => void;
16
+ unknownFieldsIgnored: () => void;
17
+ otherDialectRejected: () => void;
18
+ };
19
+ decodeText: {
20
+ validJson: () => void;
21
+ keyOrderIndependent: () => void;
22
+ malformedJsonRejected: () => void;
23
+ ordinaryJsonRejected: () => void;
24
+ };
25
+ encodeText: {
26
+ sortsPropertiesLexicographically: () => void;
27
+ };
28
+ noteDialectTag: () => void;
29
+ };