functionalscript 0.36.0 → 0.37.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 (255) hide show
  1. package/fs/asn.1/module.f.js +1 -1
  2. package/fs/asserts/proof.f.js +1 -1
  3. package/fs/base_n/module.f.js +3 -3
  4. package/fs/base_n/proof.f.js +3 -3
  5. package/fs/{base128 → basen/base128}/module.f.d.ts +1 -1
  6. package/fs/{base128 → basen/base128}/module.f.js +1 -1
  7. package/fs/{base128 → basen/base128}/proof.f.js +3 -3
  8. package/fs/{base64 → basen/base64}/module.f.d.ts +2 -2
  9. package/fs/{base64 → basen/base64}/module.f.js +25 -15
  10. package/fs/{base64 → basen/base64}/proof.f.d.ts +1 -0
  11. package/fs/{base64 → basen/base64}/proof.f.js +11 -5
  12. package/fs/{cbase32 → basen/cbase32}/module.f.d.ts +2 -2
  13. package/fs/{cbase32 → basen/cbase32}/module.f.js +2 -2
  14. package/fs/{cbase32 → basen/cbase32}/proof.f.js +1 -1
  15. package/fs/bnf/data/module.f.js +4 -4
  16. package/fs/bnf/data/proof.f.js +6 -6
  17. package/fs/bnf/descent/module.f.js +6 -6
  18. package/fs/bnf/descent/proof.f.js +6 -6
  19. package/fs/bnf/ll1/module.f.js +9 -9
  20. package/fs/bnf/ll1/proof.f.js +6 -6
  21. package/fs/bnf/module.f.js +4 -4
  22. package/fs/bnf/proof.f.js +2 -2
  23. package/fs/bnf/testlib.f.js +1 -1
  24. package/fs/cas/cli/module.f.js +7 -7
  25. package/fs/cas/cli/proof.f.js +8 -8
  26. package/fs/cas/mcp/module.f.js +95 -55
  27. package/fs/cas/mcp/proof.f.d.ts +3 -1
  28. package/fs/cas/mcp/proof.f.js +79 -51
  29. package/fs/cas/module.f.js +10 -10
  30. package/fs/cas/proof.f.d.ts +4 -2
  31. package/fs/cas/proof.f.js +10 -10
  32. package/fs/ci/bun/module.f.js +2 -2
  33. package/fs/ci/common/module.f.d.ts +2 -2
  34. package/fs/ci/common/module.f.js +4 -4
  35. package/fs/ci/config/module.f.d.ts +19 -20
  36. package/fs/ci/config/module.f.js +3 -5
  37. package/fs/ci/deno/module.f.js +8 -4
  38. package/fs/ci/module.f.js +9 -9
  39. package/fs/ci/node/module.f.d.ts +1 -1
  40. package/fs/ci/node/module.f.js +3 -5
  41. package/fs/ci/playwright/module.f.js +3 -3
  42. package/fs/ci/proof.f.js +14 -14
  43. package/fs/ci/rust/module.f.js +2 -2
  44. package/fs/cli/module.f.js +3 -3
  45. package/fs/cli/proof.f.js +3 -3
  46. package/fs/{types → common}/monoid/module.f.d.ts +1 -1
  47. package/fs/crypto/hmac/module.f.js +2 -2
  48. package/fs/crypto/hmac/proof.f.js +5 -5
  49. package/fs/crypto/pow/module.f.js +3 -3
  50. package/fs/crypto/pow/proof.f.js +4 -4
  51. package/fs/crypto/secp/module.f.js +2 -2
  52. package/fs/crypto/secp/proof.f.js +3 -3
  53. package/fs/crypto/sha2/module.f.js +2 -2
  54. package/fs/crypto/sha2/proof.f.js +6 -6
  55. package/fs/crypto/sign/module.f.js +4 -4
  56. package/fs/crypto/vdf/module.f.js +1 -1
  57. package/fs/crypto/vdf/proof.f.js +1 -1
  58. package/fs/dev/module.f.js +6 -6
  59. package/fs/dev/package_json/module.f.js +6 -6
  60. package/fs/dev/package_json/proof.f.js +3 -3
  61. package/fs/dev/proof.f.js +2 -2
  62. package/fs/djs/ast/module.f.js +2 -2
  63. package/fs/djs/ast/proof.f.js +4 -4
  64. package/fs/djs/examples/m.f.d.ts +1 -1
  65. package/fs/djs/module.f.d.ts +1 -1
  66. package/fs/djs/module.f.js +5 -5
  67. package/fs/djs/parser/module.f.js +4 -4
  68. package/fs/djs/parser/proof.f.js +7 -7
  69. package/fs/djs/proof.f.js +3 -3
  70. package/fs/djs/serializer/module.f.js +6 -6
  71. package/fs/djs/serializer/proof.f.js +4 -4
  72. package/fs/djs/tokenizer/module.f.js +3 -3
  73. package/fs/djs/tokenizer/proof.f.js +5 -5
  74. package/fs/djs/tokenizer-new/proof.f.js +6 -6
  75. package/fs/djs/transpiler/module.f.d.ts +5 -0
  76. package/fs/djs/transpiler/module.f.js +21 -11
  77. package/fs/djs/transpiler/proof.f.js +5 -5
  78. package/fs/effects/memory/module.f.js +4 -4
  79. package/fs/effects/memory/proof.f.js +3 -3
  80. package/fs/effects/module.f.js +1 -1
  81. package/fs/effects/node/memory/module.js +2 -2
  82. package/fs/effects/node/memory/proof.js +3 -3
  83. package/fs/effects/node/module.f.js +7 -7
  84. package/fs/effects/node/module.js +10 -10
  85. package/fs/effects/node/virtual/module.f.js +7 -7
  86. package/fs/effects/node/virtual/proof.f.d.ts +1 -0
  87. package/fs/effects/node/virtual/proof.f.js +11 -4
  88. package/fs/effects/proof.f.js +2 -2
  89. package/fs/emergent_testing/all.test.js +2 -2
  90. package/fs/emergent_testing/example.f.d.ts +1 -1
  91. package/fs/emergent_testing/module.f.js +6 -6
  92. package/fs/emergent_testing/proof.f.d.ts +19 -17
  93. package/fs/emergent_testing/proof.f.js +7 -7
  94. package/fs/emergent_testing/scenarios/all.js +1 -1
  95. package/fs/fsc/bnf.f.js +2 -2
  96. package/fs/fsc/json.f.js +1 -1
  97. package/fs/fsc/module.f.js +7 -7
  98. package/fs/fsc/proof.f.js +4 -4
  99. package/fs/fsm/module.f.js +9 -9
  100. package/fs/fsm/proof.f.js +7 -7
  101. package/fs/js/tokenizer/module.f.js +7 -7
  102. package/fs/js/tokenizer/proof.f.js +5 -5
  103. package/fs/mcp/module.f.d.ts +13 -13
  104. package/fs/mcp/module.f.js +8 -8
  105. package/fs/mcp/proof.f.js +5 -5
  106. package/fs/mcp/stdio/module.f.d.ts +2 -2
  107. package/fs/mcp/stdio/module.f.js +10 -10
  108. package/fs/mcp/stdio/proof.f.js +10 -10
  109. package/fs/{html → media/html}/module.f.d.ts +3 -3
  110. package/fs/{html → media/html}/module.f.js +9 -9
  111. package/fs/media/json/module.f.d.ts +50 -0
  112. package/fs/{json → media/json}/module.f.js +7 -7
  113. package/fs/{json → media/json}/parser/module.f.d.ts +2 -2
  114. package/fs/{json → media/json}/parser/module.f.js +7 -7
  115. package/fs/{json → media/json}/parser/proof.f.js +6 -6
  116. package/fs/{json → media/json}/proof.f.js +4 -4
  117. package/fs/media/json/rpc/module.f.d.ts +114 -0
  118. package/fs/{json → media/json}/rpc/module.f.js +3 -3
  119. package/fs/{json → media/json}/rpc/proof.f.js +4 -4
  120. package/fs/media/json/schema/module.f.d.ts +78 -0
  121. package/fs/{json → media/json}/schema/module.f.js +2 -2
  122. package/fs/{json → media/json}/schema/proof.f.js +3 -3
  123. package/fs/{json → media/json}/serializer/module.f.d.ts +1 -1
  124. package/fs/{json → media/json}/serializer/module.f.js +2 -2
  125. package/fs/{json → media/json}/serializer/proof.f.js +2 -2
  126. package/fs/{json → media/json}/tokenizer/module.f.d.ts +2 -2
  127. package/fs/{json → media/json}/tokenizer/module.f.js +4 -4
  128. package/fs/{json → media/json}/tokenizer/proof.f.js +5 -5
  129. package/fs/media/module.f.d.ts +37 -0
  130. package/fs/media/module.f.js +24 -0
  131. package/fs/media/proof.f.d.ts +9 -0
  132. package/fs/media/proof.f.js +57 -0
  133. package/fs/media/revision/module.f.d.ts +51 -0
  134. package/fs/media/revision/module.f.js +110 -0
  135. package/fs/media/revision/proof.f.d.ts +29 -0
  136. package/fs/media/revision/proof.f.js +119 -0
  137. package/fs/{mime → media/type}/module.f.d.ts +6 -6
  138. package/fs/{mime → media/type}/module.f.js +6 -6
  139. package/fs/{mime → media/type}/proof.f.js +6 -6
  140. package/fs/module.f.d.ts +2 -0
  141. package/fs/{fjs/module.f.js → module.f.js} +8 -8
  142. package/fs/module.js +4 -0
  143. package/fs/path/module.f.js +2 -2
  144. package/fs/{fjs/proof.f.js → proof.f.js} +4 -4
  145. package/fs/sul/id/module.f.js +9 -9
  146. package/fs/sul/id/proof.f.js +5 -5
  147. package/fs/sul/level/hash/module.f.js +3 -3
  148. package/fs/sul/level/hash/proof.f.js +3 -3
  149. package/fs/sul/level/literal/module.f.js +5 -5
  150. package/fs/sul/level/literal/proof.f.js +3 -3
  151. package/fs/sul/module.f.js +3 -3
  152. package/fs/sul/proof.f.js +3 -3
  153. package/fs/text/ascii/proof.f.js +3 -3
  154. package/fs/text/code_point/module.f.js +2 -2
  155. package/fs/text/code_point/proof.f.js +1 -1
  156. package/fs/text/module.f.js +5 -5
  157. package/fs/text/proof.f.js +4 -4
  158. package/fs/text/sgr/module.f.js +2 -2
  159. package/fs/text/sgr/proof.f.js +2 -2
  160. package/fs/text/utf16/module.f.js +5 -5
  161. package/fs/text/utf16/proof.f.js +4 -4
  162. package/fs/text/utf8/module.f.js +22 -17
  163. package/fs/text/utf8/proof.f.js +5 -5
  164. package/fs/types/array/module.f.js +1 -1
  165. package/fs/types/array/proof.f.js +3 -3
  166. package/fs/types/bigfloat/module.f.js +1 -1
  167. package/fs/types/bigfloat/proof.f.js +1 -1
  168. package/fs/types/bigint/module.f.js +2 -2
  169. package/fs/types/bigint/proof.f.js +3 -3
  170. package/fs/types/bit_vec/module.f.js +8 -8
  171. package/fs/types/bit_vec/proof.f.js +5 -5
  172. package/fs/types/btree/find/module.f.js +1 -1
  173. package/fs/types/btree/find/proof.f.d.ts +3 -1
  174. package/fs/types/btree/find/proof.f.js +7 -7
  175. package/fs/types/btree/module.f.js +2 -2
  176. package/fs/types/btree/proof.f.d.ts +11 -5
  177. package/fs/types/btree/proof.f.js +7 -7
  178. package/fs/types/btree/remove/module.f.js +4 -4
  179. package/fs/types/btree/remove/proof.f.d.ts +5 -2
  180. package/fs/types/btree/remove/proof.f.js +5 -5
  181. package/fs/types/btree/set/module.f.js +3 -3
  182. package/fs/types/btree/set/proof.f.js +4 -4
  183. package/fs/types/byte_set/module.f.js +2 -2
  184. package/fs/types/byte_set/proof.f.js +4 -4
  185. package/fs/types/function/compare/proof.f.js +1 -1
  186. package/fs/types/function/operator/proof.f.d.ts +21 -10
  187. package/fs/types/function/operator/proof.f.js +1 -1
  188. package/fs/types/function/proof.f.js +1 -1
  189. package/fs/types/list/module.f.js +2 -2
  190. package/fs/types/list/proof.f.d.ts +15 -7
  191. package/fs/types/list/proof.f.js +4 -4
  192. package/fs/types/map/proof.f.js +2 -2
  193. package/fs/types/nibble_set/proof.f.js +2 -2
  194. package/fs/types/nullable/module.f.js +2 -2
  195. package/fs/types/nullable/proof.f.js +1 -1
  196. package/fs/types/number/module.f.js +5 -5
  197. package/fs/types/number/proof.f.js +1 -1
  198. package/fs/types/object/module.f.js +4 -4
  199. package/fs/types/object/proof.f.js +1 -1
  200. package/fs/types/ordered_map/module.f.js +6 -6
  201. package/fs/types/ordered_map/proof.f.js +3 -3
  202. package/fs/types/patricia_trie/proof.f.d.ts +11 -5
  203. package/fs/types/patricia_trie/proof.f.js +2 -2
  204. package/fs/types/prime_field/module.f.js +2 -2
  205. package/fs/types/prime_field/proof.f.js +2 -2
  206. package/fs/types/range/proof.f.js +1 -1
  207. package/fs/types/range_map/module.f.js +4 -4
  208. package/fs/types/range_map/proof.f.js +7 -7
  209. package/fs/types/result/module.js +1 -1
  210. package/fs/types/result/proof.f.d.ts +9 -4
  211. package/fs/types/rtti/common/module.f.js +4 -4
  212. package/fs/types/rtti/module.f.d.ts +2 -2
  213. package/fs/types/rtti/module.f.js +1 -1
  214. package/fs/types/rtti/parse/module.f.js +5 -5
  215. package/fs/types/rtti/parse/proof.f.js +2 -2
  216. package/fs/types/rtti/ts/module.f.js +1 -1
  217. package/fs/types/rtti/ts/proof.f.js +2 -2
  218. package/fs/types/rtti/validate/module.f.js +4 -4
  219. package/fs/types/rtti/validate/proof.f.js +2 -2
  220. package/fs/types/sorted_list/module.f.js +3 -3
  221. package/fs/types/sorted_list/proof.f.js +6 -6
  222. package/fs/types/sorted_set/module.f.js +1 -1
  223. package/fs/types/sorted_set/proof.f.js +6 -6
  224. package/fs/types/string/module.f.js +4 -4
  225. package/fs/types/string/proof.f.js +2 -2
  226. package/fs/types/string_set/module.f.js +6 -6
  227. package/fs/types/string_set/proof.f.js +1 -1
  228. package/fs/types/ts/proof.f.d.ts +18 -18
  229. package/fs/types/ts/proof.f.js +1 -1
  230. package/fs/types/uint8array/module.f.js +4 -4
  231. package/fs/types/uint8array/proof.f.js +4 -4
  232. package/fs/website/module.f.js +3 -3
  233. package/fs/website/proof.f.js +3 -3
  234. package/package.json +8 -8
  235. package/fs/fjs/module.f.d.ts +0 -2
  236. package/fs/fjs/module.js +0 -4
  237. package/fs/json/module.f.d.ts +0 -50
  238. package/fs/json/rpc/module.f.d.ts +0 -114
  239. package/fs/json/schema/module.f.d.ts +0 -77
  240. /package/fs/{base128 → basen/base128}/proof.f.d.ts +0 -0
  241. /package/fs/{cbase32 → basen/cbase32}/proof.f.d.ts +0 -0
  242. /package/fs/{types → common}/monoid/module.f.js +0 -0
  243. /package/fs/{types → common}/monoid/proof.f.d.ts +0 -0
  244. /package/fs/{types → common}/monoid/proof.f.js +0 -0
  245. /package/fs/{html → media/html}/proof.f.d.ts +0 -0
  246. /package/fs/{html → media/html}/proof.f.js +0 -0
  247. /package/fs/{json → media/json}/parser/proof.f.d.ts +0 -0
  248. /package/fs/{json → media/json}/proof.f.d.ts +0 -0
  249. /package/fs/{json → media/json}/rpc/proof.f.d.ts +0 -0
  250. /package/fs/{json → media/json}/schema/proof.f.d.ts +0 -0
  251. /package/fs/{json → media/json}/serializer/proof.f.d.ts +0 -0
  252. /package/fs/{json → media/json}/tokenizer/proof.f.d.ts +0 -0
  253. /package/fs/{mime → media/type}/proof.f.d.ts +0 -0
  254. /package/fs/{fjs/module.d.ts → module.d.ts} +0 -0
  255. /package/fs/{fjs/proof.f.d.ts → proof.f.d.ts} +0 -0
@@ -8,7 +8,7 @@ import { bitLength, divUp8 } from "../types/bigint/module.f.js";
8
8
  import { empty, isVec, length, msb, uint, unpack, vec, vec8 } from "../types/bit_vec/module.f.js";
9
9
  import { identity } from "../types/function/module.f.js";
10
10
  import { max } from "../types/function/compare/module.f.js";
11
- import { encode as b128encode, decode as b128decode } from "../base128/module.f.js";
11
+ import { encode as b128encode, decode as b128decode } from "../basen/base128/module.f.js";
12
12
  const { popFront: pop, listToVec } = msb;
13
13
  const pop8 = pop(8n);
14
14
  const classPcMask = 224n;
@@ -1,4 +1,4 @@
1
- import { assert, assertEq, todo } from "./module.f.js";
1
+ import { assert, assertEq, todo } from './module.f.js';
2
2
  const throws = (f, expected) => {
3
3
  let caught = false;
4
4
  try {
@@ -11,9 +11,9 @@
11
11
  *
12
12
  * @module
13
13
  */
14
- import { msb, lsb, vec, chunkList, unpack } from "../types/bit_vec/module.f.js";
15
- import { fold } from "../types/list/module.f.js";
16
- import { compose } from "../types/function/module.f.js";
14
+ import { msb, lsb, vec, chunkList, unpack } from '../types/bit_vec/module.f.js';
15
+ import { fold } from '../types/list/module.f.js';
16
+ import { compose } from '../types/function/module.f.js';
17
17
  const { unpackSplit } = msb;
18
18
  const { tryListToVec: reversedListToVec } = lsb;
19
19
  // `chunkList(msb)` doesn't depend on `bits` or `v` — shared across every
@@ -1,6 +1,6 @@
1
- import { assertEq } from "../asserts/module.f.js";
2
- import { empty, maxLength, vec, length } from "../types/bit_vec/module.f.js";
3
- import { baseN } from "./module.f.js";
1
+ import { assertEq } from '../asserts/module.f.js';
2
+ import { empty, maxLength, vec, length } from '../types/bit_vec/module.f.js';
3
+ import { baseN } from './module.f.js';
4
4
  const hex = baseN(4n, '0123456789abcdef');
5
5
  const cb32 = baseN(5n, '0123456789abcdefghjkmnpqrstvwxyz', c => {
6
6
  const lower = c.toLowerCase();
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * @module
5
5
  */
6
- import { type Vec } from '../types/bit_vec/module.f.ts';
6
+ import { type Vec } from '../../types/bit_vec/module.f.ts';
7
7
  /**
8
8
  * Encodes a bigint into an MSB Base128 vector.
9
9
  *
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * @module
5
5
  */
6
- import { vec8, msb, empty } from "../types/bit_vec/module.f.js";
6
+ import { vec8, msb, empty } from '../../types/bit_vec/module.f.js';
7
7
  const { concat, popFront } = msb;
8
8
  const pop8 = popFront(8n);
9
9
  /**
@@ -1,6 +1,6 @@
1
- import { empty, vec, vec8 } from "../types/bit_vec/module.f.js";
2
- import { asBase } from "../types/nominal/module.f.js";
3
- import { encode, decode } from "./module.f.js";
1
+ import { empty, vec, vec8 } from '../../types/bit_vec/module.f.js';
2
+ import { asBase } from '../../types/nominal/module.f.js';
3
+ import { encode, decode } from './module.f.js';
4
4
  const test = (a, b) => {
5
5
  const encoded = encode(a);
6
6
  if (encoded !== b) {
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * @module
5
5
  */
6
- import { type Vec } from "../types/bit_vec/module.f.ts";
7
- import type { Nullable } from "../types/nullable/module.f.ts";
6
+ import { type Vec } from "../../types/bit_vec/module.f.ts";
7
+ import type { Nullable } from "../../types/nullable/module.f.ts";
8
8
  export declare const encode: (input: Vec) => Nullable<string>;
9
9
  export declare const decode: (input: string) => Nullable<Vec>;
@@ -3,8 +3,8 @@
3
3
  *
4
4
  * @module
5
5
  */
6
- import { msb, length, vec, empty } from "../types/bit_vec/module.f.js";
7
- import { baseN } from "../base_n/module.f.js";
6
+ import { msb, length, vec, maxLength } from "../../types/bit_vec/module.f.js";
7
+ import { baseN } from "../../base_n/module.f.js";
8
8
  const alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
9
9
  const { popFront } = msb;
10
10
  const { vecToString, stringToVec } = baseN(6n, alphabet);
@@ -39,23 +39,33 @@ export const decode = (input) => {
39
39
  if ((body.length + padChars) % 4 !== 0) {
40
40
  return null;
41
41
  }
42
- // Decode each character to 6 bits.
43
- const result = stringToVec(body);
44
- if (result === null) {
45
- return null;
42
+ if (padChars === 0) {
43
+ return stringToVec(body);
46
44
  }
47
- // Remove the zero-padding bits introduced during encode.
48
- // padChars=1 2 padding bits removed, padChars=2 4 padding bits removed.
45
+ // `encode`'s zero-padding bits (added to reach a 6-bit boundary) live
46
+ // entirely inside the *last* character's chunk RFC 4648 padding never
47
+ // spans more than one base64 character. Decode every character but the
48
+ // last through `stringToVec` as usual, then decode and trim the last
49
+ // character on its own, so no intermediate `Vec` built here is ever
50
+ // wider than the final, post-trim result — even for input whose decoded
51
+ // payload lands exactly at `maxLength`.
49
52
  const removeBits = BigInt(padChars * 2);
50
- const totalBits = length(result);
51
- const targetLen = totalBits - removeBits;
52
- if (targetLen === 0n) {
53
- return empty;
53
+ const realBits = 6n - removeBits;
54
+ const head = stringToVec(body.slice(0, body.length - 1));
55
+ if (head === null) {
56
+ return null;
57
+ }
58
+ const lastChunk = stringToVec(body.slice(body.length - 1));
59
+ if (lastChunk === null) {
60
+ return null;
61
+ }
62
+ if (length(head) + realBits > maxLength) {
63
+ return null;
54
64
  }
55
- const [kept, padVec] = popFront(targetLen)(result);
65
+ const [kept, pad] = popFront(realBits)(lastChunk);
56
66
  // Padding bits must be zero (RFC 4648 §3.5).
57
- if (removeBits > 0n && padVec !== vec(removeBits)(0n)) {
67
+ if (pad !== vec(removeBits)(0n)) {
58
68
  return null;
59
69
  }
60
- return vec(targetLen)(kept);
70
+ return msb.concat(head)(vec(realBits)(kept));
61
71
  };
@@ -10,5 +10,6 @@ export declare const proof: {
10
10
  knownVectors: () => void;
11
11
  decodeOverflow: () => void;
12
12
  encodeAtMaxLengthSucceeds: () => void;
13
+ decodeAtMaxLengthSucceeds: () => void;
13
14
  encodeLargeVecIsSlow: () => void;
14
15
  };
@@ -1,5 +1,5 @@
1
- import { assertEq } from "../asserts/module.f.js";
2
- import { empty, vec, repeat, vec8, maxLength } from "../types/bit_vec/module.f.js";
1
+ import { assertEq } from '../../asserts/module.f.js';
2
+ import { empty, vec, repeat, vec8, maxLength } from "../../types/bit_vec/module.f.js";
3
3
  import { encode, decode } from "./module.f.js";
4
4
  const check = (s, v) => {
5
5
  assertEq(encode(v), s);
@@ -87,11 +87,17 @@ export const proof = {
87
87
  // A `maxLength`-sized vector's trailing partial 6-bit chunk is
88
88
  // left-padded by `vecToString` itself (see `baseN`), so `encode`
89
89
  // never needs to build an over-`maxLength` intermediate and must not
90
- // reject this boundary input. (`decode` of the resulting string
91
- // still fails on this exact boundary — a separate, still-open bug;
92
- // see `fs/base64/todo/decode-rejects-max-size-input.md`.)
90
+ // reject this boundary input.
93
91
  assertEq(encode(vec(maxLength)(0n)), 'A'.repeat(174_763) + '=');
94
92
  },
93
+ decodeAtMaxLengthSucceeds: () => {
94
+ // Companion to `encodeAtMaxLengthSucceeds`: the encoded string's raw,
95
+ // pre-trim bit count (1_048_578) is 2 over `maxLength` even though
96
+ // the payload it decodes to is exactly `maxLength`. `decode` must
97
+ // trim the last character's 2 zero-padding bits before — not after —
98
+ // measuring the result against `maxLength`.
99
+ check('A'.repeat(174_763) + '=', vec(maxLength)(0n));
100
+ },
95
101
  // Regression guard: `encode` used to be quadratic in the input size, not
96
102
  // linear. `baseN`'s `vecToString` (`fs/base_n/module.f.ts`) popped one
97
103
  // 6-bit chunk off the front at a time via `popFront`, and each `popFront`
@@ -3,8 +3,8 @@
3
3
  *
4
4
  * @module
5
5
  */
6
- import { type Vec } from "../types/bit_vec/module.f.ts";
7
- import type { Nullable } from "../types/nullable/module.f.ts";
6
+ import { type Vec } from "../../types/bit_vec/module.f.ts";
7
+ import type { Nullable } from "../../types/nullable/module.f.ts";
8
8
  export declare const vec5xToCBase32: (v: Vec) => string;
9
9
  export declare const cBase32ToVec5x: (s: string) => Nullable<Vec>;
10
10
  export declare const vecToCBase32: (v: Vec) => string;
@@ -3,8 +3,8 @@
3
3
  *
4
4
  * @module
5
5
  */
6
- import { msb, lsb, length, vec, empty } from "../types/bit_vec/module.f.js";
7
- import { baseN } from "../base_n/module.f.js";
6
+ import { msb, lsb, length, vec, empty } from "../../types/bit_vec/module.f.js";
7
+ import { baseN } from "../../base_n/module.f.js";
8
8
  // 0123456789abcdef
9
9
  const m = '0123456789abcdefghjkmnpqrstvwxyz';
10
10
  const { concat } = msb;
@@ -1,4 +1,4 @@
1
- import { empty, vec } from "../types/bit_vec/module.f.js";
1
+ import { empty, vec } from "../../types/bit_vec/module.f.js";
2
2
  import { cBase32ToVec, cBase32ToVec5x, vec5xToCBase32, vecToCBase32 } from "./module.f.js";
3
3
  const check5x = (s, v) => {
4
4
  const sr = vec5xToCBase32(v);
@@ -10,10 +10,10 @@
10
10
  *
11
11
  * @module
12
12
  */
13
- import { stringToCodePointList } from "../../text/utf16/module.f.js";
14
- import { map, toArray } from "../../types/list/module.f.js";
15
- import { oneEncode, } from "../module.f.js";
16
- import {} from "../../types/object/module.f.js";
13
+ import { stringToCodePointList } from '../../text/utf16/module.f.js';
14
+ import { map, toArray } from '../../types/list/module.f.js';
15
+ import { oneEncode, } from '../module.f.js';
16
+ import {} from '../../types/object/module.f.js';
17
17
  const { entries } = Object;
18
18
  const find = (map) => (fr) => {
19
19
  for (const [k, v] of entries(map)) {
@@ -1,9 +1,9 @@
1
- import { stringify } from "../../json/module.f.js";
2
- import { identity } from "../../types/function/module.f.js";
3
- import { sort } from "../../types/object/module.f.js";
4
- import { oneEncode, option, range, rangeDecode, repeat0Plus, set } from "../module.f.js";
5
- import { classic, deterministic } from "../testlib.f.js";
6
- import { toData } from "./module.f.js";
1
+ import { stringify } from '../../media/json/module.f.js';
2
+ import { identity } from '../../types/function/module.f.js';
3
+ import { sort } from '../../types/object/module.f.js';
4
+ import { oneEncode, option, range, rangeDecode, repeat0Plus, set } from '../module.f.js';
5
+ import { classic, deterministic } from '../testlib.f.js';
6
+ import { toData } from './module.f.js';
7
7
  export const proof = {
8
8
  rangeDecode: () => {
9
9
  const decoded1 = stringify(sort)(rangeDecode(0x000079_000087));
@@ -9,12 +9,12 @@
9
9
  *
10
10
  * @module
11
11
  */
12
- import {} from "../../text/utf16/module.f.js";
13
- import { rangeDecode } from "../module.f.js";
14
- import { contains as rangeContains } from "../../types/range/module.f.js";
15
- import { definedEntries } from "../../types/object/module.f.js";
16
- import { toData } from "../data/module.f.js";
17
- import {} from "../module.f.js";
12
+ import {} from '../../text/utf16/module.f.js';
13
+ import { rangeDecode } from '../module.f.js';
14
+ import { contains as rangeContains } from '../../types/range/module.f.js';
15
+ import { definedEntries } from '../../types/object/module.f.js';
16
+ import { toData } from '../data/module.f.js';
17
+ import {} from '../module.f.js';
18
18
  const emptyTagMapAdd = (ruleSet) => (map) => (name) => {
19
19
  if (name in map) {
20
20
  return [ruleSet, map, map[name]];
@@ -1,9 +1,9 @@
1
- import { stringToCodePointList } from "../../text/utf16/module.f.js";
2
- import { map, toArray } from "../../types/list/module.f.js";
3
- import { commaJoin0Plus, option, range, repeat0Plus, set } from "../module.f.js";
4
- import { deterministic } from "../testlib.f.js";
5
- import { toData } from "../data/module.f.js";
6
- import { createEmptyTagMap, descentParser } from "./module.f.js";
1
+ import { stringToCodePointList } from '../../text/utf16/module.f.js';
2
+ import { map, toArray } from '../../types/list/module.f.js';
3
+ import { commaJoin0Plus, option, range, repeat0Plus, set } from '../module.f.js';
4
+ import { deterministic } from '../testlib.f.js';
5
+ import { toData } from '../data/module.f.js';
6
+ import { createEmptyTagMap, descentParser } from './module.f.js';
7
7
  const mapCodePoint = (cp) => [cp, undefined];
8
8
  const descentParserCpOnly = (m, name, cp) => {
9
9
  const cpm = toArray(map(mapCodePoint)(cp));
@@ -9,15 +9,15 @@
9
9
  *
10
10
  * @module
11
11
  */
12
- import {} from "../../text/utf16/module.f.js";
13
- import { strictEqual } from "../../types/function/operator/module.f.js";
14
- import { toArray } from "../../types/list/module.f.js";
15
- import { rangeMap } from "../../types/range_map/module.f.js";
16
- import { contains, set } from "../../types/string_set/module.f.js";
17
- import { rangeDecode } from "../module.f.js";
18
- import { definedEntries } from "../../types/object/module.f.js";
19
- import { toData } from "../data/module.f.js";
20
- import {} from "../module.f.js";
12
+ import {} from '../../text/utf16/module.f.js';
13
+ import { strictEqual } from '../../types/function/operator/module.f.js';
14
+ import { toArray } from '../../types/list/module.f.js';
15
+ import { rangeMap } from '../../types/range_map/module.f.js';
16
+ import { contains, set } from '../../types/string_set/module.f.js';
17
+ import { rangeDecode } from '../module.f.js';
18
+ import { definedEntries } from '../../types/object/module.f.js';
19
+ import { toData } from '../data/module.f.js';
20
+ import {} from '../module.f.js';
21
21
  const dispatchOp = rangeMap({
22
22
  union: a => b => {
23
23
  if (a === null) {
@@ -1,9 +1,9 @@
1
- import { stringToCodePointList } from "../../text/utf16/module.f.js";
2
- import { toArray } from "../../types/list/module.f.js";
3
- import { commaJoin0Plus, option, range, repeat0Plus, set } from "../module.f.js";
4
- import { deterministic } from "../testlib.f.js";
5
- import { toData } from "../data/module.f.js";
6
- import { dispatchMap, parser, parserRuleSet } from "./module.f.js";
1
+ import { stringToCodePointList } from '../../text/utf16/module.f.js';
2
+ import { toArray } from '../../types/list/module.f.js';
3
+ import { commaJoin0Plus, option, range, repeat0Plus, set } from '../module.f.js';
4
+ import { deterministic } from '../testlib.f.js';
5
+ import { toData } from '../data/module.f.js';
6
+ import { dispatchMap, parser, parserRuleSet } from './module.f.js';
7
7
  export const proof = {
8
8
  dispatch: [
9
9
  () => {
@@ -6,10 +6,10 @@
6
6
  *
7
7
  * @module
8
8
  */
9
- import { codePointListToString, stringToCodePointList } from "../text/utf16/module.f.js";
10
- import { definedValues } from "../types/object/module.f.js";
11
- import { isArray2 } from "../types/array/module.f.js";
12
- import { map, toArray, repeat as listRepeat } from "../types/list/module.f.js";
9
+ import { codePointListToString, stringToCodePointList } from '../text/utf16/module.f.js';
10
+ import { definedValues } from '../types/object/module.f.js';
11
+ import { isArray2 } from '../types/array/module.f.js';
12
+ import { map, toArray, repeat as listRepeat } from '../types/list/module.f.js';
13
13
  /**
14
14
  * Full 24-bit symbol range packed into a single {@link TerminalRange}.
15
15
  */
package/fs/bnf/proof.f.js CHANGED
@@ -1,5 +1,5 @@
1
- import { classic, deterministic } from "./testlib.f.js";
2
- import { rangeEncode, str, set, range, commaJoin0Plus, isEmpty, oneEncode, repeat1Plus, } from "./module.f.js";
1
+ import { classic, deterministic } from './testlib.f.js';
2
+ import { rangeEncode, str, set, range, commaJoin0Plus, isEmpty, oneEncode, repeat1Plus, } from './module.f.js';
3
3
  export const proof = {
4
4
  test: () => {
5
5
  classic();
@@ -1,4 +1,4 @@
1
- import { commaJoin0Plus, max, none, option, range, remove, repeat, repeat0Plus, set } from "./module.f.js";
1
+ import { commaJoin0Plus, max, none, option, range, remove, repeat, repeat0Plus, set } from './module.f.js';
2
2
  export const classic = () => {
3
3
  // https://www.json.org/json-en.html
4
4
  const json = () => [element];
@@ -3,13 +3,13 @@
3
3
  *
4
4
  * @module
5
5
  */
6
- import { sha256 } from "../../crypto/sha2/module.f.js";
7
- import { cBase32ToVec, vecToCBase32 } from "../../cbase32/module.f.js";
8
- import { forEachStep, pure } from "../../effects/module.f.js";
9
- import { errorExit, log, writeFromStream } from "../../effects/node/module.f.js";
10
- import { dispatch } from "../../cli/module.f.js";
11
- import {} from "../../effects/memory/module.f.js";
12
- import { casAddFile, fileCas } from "../module.f.js";
6
+ import { sha256 } from '../../crypto/sha2/module.f.js';
7
+ import { cBase32ToVec, vecToCBase32 } from '../../basen/cbase32/module.f.js';
8
+ import { forEachStep, pure } from '../../effects/module.f.js';
9
+ import { errorExit, log, writeFromStream } from '../../effects/node/module.f.js';
10
+ import { dispatch } from '../../cli/module.f.js';
11
+ import {} from '../../effects/memory/module.f.js';
12
+ import { casAddFile, fileCas } from '../module.f.js';
13
13
  export const commands = [
14
14
  {
15
15
  names: ['add'],
@@ -1,11 +1,11 @@
1
- import { commands } from "./module.f.js";
2
- import { computeSync, sha256 } from "../../crypto/sha2/module.f.js";
3
- import { maxLength, vec, vec8 } from "../../types/bit_vec/module.f.js";
4
- import { defaultNodeProgramOptions, emptyState, virtual } from "../../effects/node/virtual/module.f.js";
5
- import {} from "../../effects/node/module.f.js";
6
- import { dispatch } from "../../cli/module.f.js";
7
- import { vecToCBase32 } from "../../cbase32/module.f.js";
8
- import { assert, assertEq } from "../../asserts/module.f.js";
1
+ import { commands } from './module.f.js';
2
+ import { computeSync, sha256 } from '../../crypto/sha2/module.f.js';
3
+ import { maxLength, vec, vec8 } from '../../types/bit_vec/module.f.js';
4
+ import { defaultNodeProgramOptions, emptyState, virtual } from '../../effects/node/virtual/module.f.js';
5
+ import {} from '../../effects/node/module.f.js';
6
+ import { dispatch } from '../../cli/module.f.js';
7
+ import { vecToCBase32 } from '../../basen/cbase32/module.f.js';
8
+ import { assert, assertEq } from '../../asserts/module.f.js';
9
9
  const makeOptions = (args) => ({ ...defaultNodeProgramOptions, args });
10
10
  const main = dispatch(commands);
11
11
  export const proof = {