functionalscript 0.37.0 → 0.38.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.
- package/README.md +1 -1
- package/{fs → fjs}/asn.1/proof.f.js +32 -94
- package/fjs/asserts/module.f.d.ts +36 -0
- package/fjs/asserts/module.f.js +39 -0
- package/fjs/asserts/proof.f.d.ts +11 -0
- package/fjs/asserts/proof.f.js +18 -0
- package/{fs → fjs}/base_n/proof.f.js +12 -36
- package/{fs → fjs}/basen/base64/proof.f.d.ts +1 -0
- package/{fs → fjs}/basen/base64/proof.f.js +15 -1
- package/{fs → fjs}/basen/cbase32/proof.f.js +15 -42
- package/fjs/bnf/data/module.f.d.ts +52 -0
- package/{fs → fjs}/bnf/data/module.f.js +53 -3
- package/{fs → fjs}/bnf/data/proof.f.d.ts +1 -0
- package/{fs → fjs}/bnf/data/proof.f.js +54 -19
- package/{fs → fjs}/bnf/descent/module.f.d.ts +4 -14
- package/fjs/bnf/descent/module.f.js +124 -0
- package/{fs → fjs}/bnf/descent/proof.f.d.ts +1 -0
- package/{fs → fjs}/bnf/descent/proof.f.js +55 -24
- package/{fs → fjs}/bnf/ll1/module.f.d.ts +4 -4
- package/{fs → fjs}/bnf/ll1/module.f.js +7 -5
- package/{fs → fjs}/bnf/ll1/proof.f.d.ts +1 -0
- package/{fs → fjs}/bnf/ll1/proof.f.js +27 -10
- package/{fs → fjs}/bnf/module.f.d.ts +19 -5
- package/{fs → fjs}/bnf/module.f.js +10 -11
- package/fjs/bnf/proof.f.js +69 -0
- package/{fs → fjs}/bnf/testlib.f.js +2 -2
- package/{fs → fjs}/cas/cli/proof.f.d.ts +4 -1
- package/{fs → fjs}/cas/cli/proof.f.js +29 -66
- package/fjs/cas/evo/mcp/module.f.d.ts +19 -0
- package/fjs/cas/evo/mcp/module.f.js +56 -0
- package/fjs/cas/evo/mcp/proof.f.d.ts +9 -0
- package/fjs/cas/evo/mcp/proof.f.js +95 -0
- package/fjs/cas/evo/module.f.d.ts +138 -0
- package/fjs/cas/evo/module.f.js +309 -0
- package/fjs/cas/evo/proof.f.d.ts +32 -0
- package/fjs/cas/evo/proof.f.js +453 -0
- package/fjs/cas/mcp/module.f.d.ts +49 -0
- package/{fs → fjs}/cas/mcp/module.f.js +54 -76
- package/{fs → fjs}/cas/mcp/proof.f.d.ts +4 -1
- package/{fs → fjs}/cas/mcp/proof.f.js +41 -13
- package/{fs → fjs}/cas/module.f.d.ts +10 -0
- package/{fs → fjs}/cas/module.f.js +27 -1
- package/{fs → fjs}/cas/proof.f.d.ts +4 -0
- package/{fs → fjs}/cas/proof.f.js +77 -86
- package/{fs → fjs}/ci/config/module.f.d.ts +5 -5
- package/{fs → fjs}/ci/config/module.f.js +5 -5
- package/{fs → fjs}/ci/proof.f.js +14 -9
- package/{fs → fjs}/ci/rust/module.f.js +9 -1
- package/{fs → fjs}/cli/proof.f.js +22 -63
- package/{fs → fjs}/common/monoid/proof.f.js +4 -9
- package/{fs → fjs}/crypto/hmac/proof.f.js +4 -12
- package/fjs/crypto/pow/proof.f.js +111 -0
- package/{fs → fjs}/crypto/secp/proof.f.js +12 -33
- package/{fs → fjs}/crypto/sha2/proof.f.js +18 -49
- package/{fs → fjs}/crypto/sign/module.f.d.ts +0 -5
- package/{fs → fjs}/crypto/sign/module.f.js +7 -4
- package/{fs → fjs}/crypto/sign/proof.f.js +36 -105
- package/{fs → fjs}/crypto/vdf/proof.f.js +22 -63
- package/{fs → fjs}/dev/package_json/proof.f.js +7 -7
- package/{fs → fjs}/dev/proof.f.js +2 -4
- package/{fs → fjs}/djs/ast/proof.f.js +4 -12
- package/{fs → fjs}/djs/parser/module.f.d.ts +5 -0
- package/{fs → fjs}/djs/parser/module.f.js +20 -0
- package/{fs → fjs}/djs/parser/proof.f.js +138 -400
- package/{fs → fjs}/djs/proof.f.js +13 -36
- package/{fs → fjs}/djs/serializer/proof.f.js +14 -39
- package/fjs/djs/tokenizer/module.f.d.ts +24 -0
- package/fjs/djs/tokenizer/module.f.js +472 -0
- package/{fs/djs/tokenizer-new → fjs/djs/tokenizer}/proof.f.d.ts +4 -3
- package/{fs/djs/tokenizer-new → fjs/djs/tokenizer}/proof.f.js +446 -445
- package/{fs → fjs}/djs/transpiler/proof.f.d.ts +3 -0
- package/{fs → fjs}/djs/transpiler/proof.f.js +29 -30
- package/{fs → fjs}/effects/memory/proof.f.js +8 -21
- package/{fs → fjs}/effects/node/memory/proof.js +5 -12
- package/{fs → fjs}/effects/node/module.d.ts +1 -1
- package/{fs → fjs}/effects/node/module.f.d.ts +1 -1
- package/{fs → fjs}/effects/node/module.js +3 -3
- package/{fs → fjs}/effects/node/proof.f.d.ts +1 -0
- package/{fs → fjs}/effects/node/proof.f.js +106 -292
- package/{fs → fjs}/effects/node/virtual/proof.f.d.ts +1 -0
- package/{fs → fjs}/effects/node/virtual/proof.f.js +36 -29
- package/{fs → fjs}/effects/proof.f.js +16 -45
- package/{fs → fjs}/emergent_testing/proof.f.js +7 -7
- package/{fs → fjs}/fsc/proof.f.js +12 -34
- package/{fs → fjs}/fsm/proof.f.js +5 -12
- package/{fs → fjs}/mcp/module.f.d.ts +7 -0
- package/{fs → fjs}/mcp/module.f.js +9 -2
- package/{fs → fjs}/mcp/proof.f.js +12 -12
- package/{fs → fjs}/mcp/stdio/module.f.d.ts +2 -2
- package/{fs → fjs}/mcp/stdio/module.f.js +2 -2
- package/{fs → fjs}/media/html/proof.f.js +12 -33
- package/{fs → fjs}/media/json/parser/module.f.d.ts +5 -0
- package/{fs → fjs}/media/json/parser/module.f.js +14 -0
- package/{fs → fjs}/media/json/parser/proof.f.js +39 -114
- package/{fs → fjs}/media/json/rpc/module.f.js +1 -1
- package/{fs → fjs}/media/json/schema/module.f.d.ts +2 -2
- package/{fs → fjs}/media/json/schema/module.f.js +23 -39
- package/{fs → fjs}/media/json/schema/proof.f.js +3 -6
- package/{fs → fjs}/media/json/serializer/proof.f.js +10 -27
- package/{fs → fjs}/media/module.f.d.ts +6 -6
- package/{fs → fjs}/media/module.f.js +3 -4
- package/{fs → fjs}/media/proof.f.js +5 -4
- package/{fs → fjs}/media/revision/module.f.d.ts +31 -4
- package/{fs → fjs}/media/revision/module.f.js +35 -23
- package/{fs → fjs}/media/revision/proof.f.d.ts +10 -8
- package/fjs/media/revision/proof.f.js +140 -0
- package/{fs → fjs}/media/type/proof.f.js +2 -6
- package/{fs → fjs}/module.f.js +1 -1
- package/{fs → fjs}/path/proof.f.js +27 -78
- package/{fs → fjs}/proof.f.js +2 -0
- package/{fs → fjs}/sul/id/proof.f.js +7 -21
- package/{fs → fjs}/sul/level/hash/proof.f.js +5 -5
- package/{fs → fjs}/sul/level/literal/proof.f.js +12 -26
- package/fjs/text/ascii/proof.f.d.ts +6 -0
- package/{fs → fjs}/text/ascii/proof.f.js +4 -14
- package/{fs → fjs}/text/code_point/module.f.js +10 -10
- package/{fs → fjs}/text/proof.f.js +4 -9
- package/{fs → fjs}/text/sgr/proof.f.js +6 -15
- package/{fs → fjs}/text/utf16/module.f.js +1 -1
- package/{fs → fjs}/text/utf16/proof.f.js +23 -66
- package/{fs → fjs}/text/utf8/proof.f.js +56 -125
- package/{fs → fjs}/types/array/proof.f.js +18 -52
- package/fjs/types/bigfloat/proof.f.js +217 -0
- package/{fs → fjs}/types/bigint/proof.f.js +49 -145
- package/{fs → fjs}/types/bit_vec/proof.f.js +72 -214
- package/{fs → fjs}/types/btree/find/proof.f.js +23 -66
- package/{fs → fjs}/types/btree/proof.f.js +5 -12
- package/{fs → fjs}/types/btree/remove/proof.f.d.ts +2 -0
- package/{fs → fjs}/types/btree/remove/proof.f.js +83 -230
- package/{fs → fjs}/types/btree/set/module.f.js +5 -2
- package/{fs → fjs}/types/btree/set/proof.f.js +35 -24
- package/{fs → fjs}/types/byte_set/proof.f.js +22 -63
- package/{fs → fjs}/types/function/compare/proof.f.js +13 -36
- package/{fs → fjs}/types/function/operator/proof.f.js +17 -48
- package/{fs → fjs}/types/function/proof.f.js +2 -3
- package/{fs → fjs}/types/list/proof.f.js +55 -163
- package/{fs → fjs}/types/map/proof.f.js +4 -12
- package/{fs → fjs}/types/nibble_set/proof.f.js +16 -45
- package/{fs → fjs}/types/nominal/proof.f.js +5 -10
- package/fjs/types/nullable/proof.f.js +29 -0
- package/{fs → fjs}/types/number/proof.f.js +9 -24
- package/{fs → fjs}/types/object/proof.f.js +3 -6
- package/{fs → fjs}/types/patricia_trie/proof.f.js +21 -21
- package/{fs → fjs}/types/prime_field/module.f.js +2 -7
- package/{fs → fjs}/types/range/module.f.d.ts +1 -1
- package/fjs/types/range/module.f.js +2 -0
- package/fjs/types/range/proof.f.js +9 -0
- package/{fs → fjs}/types/range_map/proof.f.js +28 -81
- package/{fs → fjs}/types/result/proof.f.d.ts +3 -2
- package/fjs/types/result/proof.f.js +31 -0
- package/{fs → fjs}/types/rtti/common/module.f.d.ts +36 -1
- package/{fs → fjs}/types/rtti/common/module.f.js +44 -0
- package/fjs/types/rtti/common/proof.f.d.ts +8 -0
- package/fjs/types/rtti/common/proof.f.js +51 -0
- package/{fs → fjs}/types/rtti/parse/module.f.js +13 -22
- package/{fs → fjs}/types/rtti/parse/proof.f.js +7 -18
- package/{fs → fjs}/types/rtti/ts/module.f.d.ts +10 -4
- package/{fs → fjs}/types/rtti/validate/module.f.js +8 -29
- package/{fs → fjs}/types/rtti/validate/proof.f.js +4 -9
- package/{fs → fjs}/types/sorted_list/proof.f.js +8 -21
- package/{fs → fjs}/types/sorted_set/proof.f.js +14 -39
- package/fjs/types/string/proof.f.js +77 -0
- package/fjs/types/string_set/proof.f.js +43 -0
- package/{fs → fjs}/types/ts/proof.f.js +15 -42
- package/{fs → fjs}/types/uint8array/module.f.js +7 -7
- package/{fs → fjs}/types/uint8array/proof.f.d.ts +4 -1
- package/{fs → fjs}/types/uint8array/proof.f.js +7 -7
- package/{fs → fjs}/website/proof.f.js +3 -6
- package/package.json +6 -6
- package/fs/asserts/module.f.d.ts +0 -4
- package/fs/asserts/module.f.js +0 -9
- package/fs/asserts/proof.f.d.ts +0 -8
- package/fs/asserts/proof.f.js +0 -51
- package/fs/bnf/data/module.f.d.ts +0 -30
- package/fs/bnf/descent/module.f.js +0 -119
- package/fs/bnf/proof.f.js +0 -104
- package/fs/cas/mcp/module.f.d.ts +0 -36
- package/fs/crypto/pow/proof.f.js +0 -161
- package/fs/djs/tokenizer/module.f.d.ts +0 -12
- package/fs/djs/tokenizer/module.f.js +0 -62
- package/fs/djs/tokenizer/proof.f.d.ts +0 -7
- package/fs/djs/tokenizer/proof.f.js +0 -543
- package/fs/djs/tokenizer-new/module.f.d.ts +0 -3
- package/fs/djs/tokenizer-new/module.f.js +0 -155
- package/fs/media/revision/proof.f.js +0 -119
- package/fs/text/ascii/proof.f.d.ts +0 -4
- package/fs/types/bigfloat/proof.f.js +0 -348
- package/fs/types/nullable/proof.f.js +0 -50
- package/fs/types/range/module.f.js +0 -2
- package/fs/types/range/proof.f.js +0 -18
- package/fs/types/result/proof.f.js +0 -52
- package/fs/types/string/proof.f.js +0 -118
- package/fs/types/string_set/proof.f.js +0 -82
- /package/{fs → fjs}/asn.1/module.f.d.ts +0 -0
- /package/{fs → fjs}/asn.1/module.f.js +0 -0
- /package/{fs → fjs}/asn.1/proof.f.d.ts +0 -0
- /package/{fs → fjs}/base_n/module.f.d.ts +0 -0
- /package/{fs → fjs}/base_n/module.f.js +0 -0
- /package/{fs → fjs}/base_n/proof.f.d.ts +0 -0
- /package/{fs → fjs}/basen/base128/module.f.d.ts +0 -0
- /package/{fs → fjs}/basen/base128/module.f.js +0 -0
- /package/{fs → fjs}/basen/base128/proof.f.d.ts +0 -0
- /package/{fs → fjs}/basen/base128/proof.f.js +0 -0
- /package/{fs → fjs}/basen/base64/module.f.d.ts +0 -0
- /package/{fs → fjs}/basen/base64/module.f.js +0 -0
- /package/{fs → fjs}/basen/cbase32/module.f.d.ts +0 -0
- /package/{fs → fjs}/basen/cbase32/module.f.js +0 -0
- /package/{fs → fjs}/basen/cbase32/proof.f.d.ts +0 -0
- /package/{fs → fjs}/bnf/proof.f.d.ts +0 -0
- /package/{fs → fjs}/bnf/testlib.f.d.ts +0 -0
- /package/{fs → fjs}/cas/cli/module.f.d.ts +0 -0
- /package/{fs → fjs}/cas/cli/module.f.js +0 -0
- /package/{fs → fjs}/ci/bun/module.f.d.ts +0 -0
- /package/{fs → fjs}/ci/bun/module.f.js +0 -0
- /package/{fs → fjs}/ci/common/module.f.d.ts +0 -0
- /package/{fs → fjs}/ci/common/module.f.js +0 -0
- /package/{fs → fjs}/ci/deno/module.f.d.ts +0 -0
- /package/{fs → fjs}/ci/deno/module.f.js +0 -0
- /package/{fs → fjs}/ci/module.f.d.ts +0 -0
- /package/{fs → fjs}/ci/module.f.js +0 -0
- /package/{fs → fjs}/ci/node/module.f.d.ts +0 -0
- /package/{fs → fjs}/ci/node/module.f.js +0 -0
- /package/{fs → fjs}/ci/playwright/module.f.d.ts +0 -0
- /package/{fs → fjs}/ci/playwright/module.f.js +0 -0
- /package/{fs → fjs}/ci/proof.f.d.ts +0 -0
- /package/{fs → fjs}/ci/rust/module.f.d.ts +0 -0
- /package/{fs → fjs}/cli/module.f.d.ts +0 -0
- /package/{fs → fjs}/cli/module.f.js +0 -0
- /package/{fs → fjs}/cli/proof.f.d.ts +0 -0
- /package/{fs → fjs}/common/monoid/module.f.d.ts +0 -0
- /package/{fs → fjs}/common/monoid/module.f.js +0 -0
- /package/{fs → fjs}/common/monoid/proof.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/hmac/module.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/hmac/module.f.js +0 -0
- /package/{fs → fjs}/crypto/hmac/proof.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/pow/module.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/pow/module.f.js +0 -0
- /package/{fs → fjs}/crypto/pow/proof.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/secp/module.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/secp/module.f.js +0 -0
- /package/{fs → fjs}/crypto/secp/proof.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/sha2/module.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/sha2/module.f.js +0 -0
- /package/{fs → fjs}/crypto/sha2/proof.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/sign/proof.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/vdf/module.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/vdf/module.f.js +0 -0
- /package/{fs → fjs}/crypto/vdf/proof.f.d.ts +0 -0
- /package/{fs → fjs}/dev/module.f.d.ts +0 -0
- /package/{fs → fjs}/dev/module.f.js +0 -0
- /package/{fs → fjs}/dev/package_json/module.f.d.ts +0 -0
- /package/{fs → fjs}/dev/package_json/module.f.js +0 -0
- /package/{fs → fjs}/dev/package_json/proof.f.d.ts +0 -0
- /package/{fs → fjs}/dev/proof.f.d.ts +0 -0
- /package/{fs → fjs}/djs/ast/module.f.d.ts +0 -0
- /package/{fs → fjs}/djs/ast/module.f.js +0 -0
- /package/{fs → fjs}/djs/ast/proof.f.d.ts +0 -0
- /package/{fs → fjs}/djs/examples/input.f.d.ts +0 -0
- /package/{fs → fjs}/djs/examples/input.f.js +0 -0
- /package/{fs → fjs}/djs/examples/m.f.d.ts +0 -0
- /package/{fs → fjs}/djs/examples/m.f.js +0 -0
- /package/{fs → fjs}/djs/module.f.d.ts +0 -0
- /package/{fs → fjs}/djs/module.f.js +0 -0
- /package/{fs → fjs}/djs/parser/proof.f.d.ts +0 -0
- /package/{fs → fjs}/djs/proof.f.d.ts +0 -0
- /package/{fs → fjs}/djs/serializer/module.f.d.ts +0 -0
- /package/{fs → fjs}/djs/serializer/module.f.js +0 -0
- /package/{fs → fjs}/djs/serializer/proof.f.d.ts +0 -0
- /package/{fs → fjs}/djs/transpiler/module.f.d.ts +0 -0
- /package/{fs → fjs}/djs/transpiler/module.f.js +0 -0
- /package/{fs → fjs}/effects/list/module.f.d.ts +0 -0
- /package/{fs → fjs}/effects/list/module.f.js +0 -0
- /package/{fs → fjs}/effects/memory/module.f.d.ts +0 -0
- /package/{fs → fjs}/effects/memory/module.f.js +0 -0
- /package/{fs → fjs}/effects/memory/proof.f.d.ts +0 -0
- /package/{fs → fjs}/effects/mock/module.f.d.ts +0 -0
- /package/{fs → fjs}/effects/mock/module.f.js +0 -0
- /package/{fs → fjs}/effects/module.d.ts +0 -0
- /package/{fs → fjs}/effects/module.f.d.ts +0 -0
- /package/{fs → fjs}/effects/module.f.js +0 -0
- /package/{fs → fjs}/effects/module.js +0 -0
- /package/{fs → fjs}/effects/node/memory/module.d.ts +0 -0
- /package/{fs → fjs}/effects/node/memory/module.js +0 -0
- /package/{fs → fjs}/effects/node/memory/proof.d.ts +0 -0
- /package/{fs → fjs}/effects/node/module.f.js +0 -0
- /package/{fs → fjs}/effects/node/virtual/module.f.d.ts +0 -0
- /package/{fs → fjs}/effects/node/virtual/module.f.js +0 -0
- /package/{fs → fjs}/effects/proof.f.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/all.test.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/all.test.js +0 -0
- /package/{fs → fjs}/emergent_testing/example.f.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/example.f.js +0 -0
- /package/{fs → fjs}/emergent_testing/module.f.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/module.f.js +0 -0
- /package/{fs → fjs}/emergent_testing/proof.f.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/all.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/all.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.fail.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.fail.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.pass.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.pass.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async.fail.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async.fail.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async.pass.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async.pass.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/fail.fail.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/fail.fail.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/return-value.pass.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/return-value.pass.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/thenable.pass.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/thenable.pass.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/thenable2.pass.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/thenable2.pass.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/throw.pass.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/throw.pass.js +0 -0
- /package/{fs → fjs}/fsc/bnf.f.d.ts +0 -0
- /package/{fs → fjs}/fsc/bnf.f.js +0 -0
- /package/{fs → fjs}/fsc/json.f.d.ts +0 -0
- /package/{fs → fjs}/fsc/json.f.js +0 -0
- /package/{fs → fjs}/fsc/module.f.d.ts +0 -0
- /package/{fs → fjs}/fsc/module.f.js +0 -0
- /package/{fs → fjs}/fsc/proof.f.d.ts +0 -0
- /package/{fs → fjs}/fsm/module.f.d.ts +0 -0
- /package/{fs → fjs}/fsm/module.f.js +0 -0
- /package/{fs → fjs}/fsm/proof.f.d.ts +0 -0
- /package/{fs → fjs}/js/tokenizer/module.f.d.ts +0 -0
- /package/{fs → fjs}/js/tokenizer/module.f.js +0 -0
- /package/{fs → fjs}/js/tokenizer/proof.f.d.ts +0 -0
- /package/{fs → fjs}/js/tokenizer/proof.f.js +0 -0
- /package/{fs → fjs}/mcp/proof.f.d.ts +0 -0
- /package/{fs → fjs}/mcp/stdio/proof.f.d.ts +0 -0
- /package/{fs → fjs}/mcp/stdio/proof.f.js +0 -0
- /package/{fs → fjs}/media/html/module.f.d.ts +0 -0
- /package/{fs → fjs}/media/html/module.f.js +0 -0
- /package/{fs → fjs}/media/html/proof.f.d.ts +0 -0
- /package/{fs → fjs}/media/json/module.f.d.ts +0 -0
- /package/{fs → fjs}/media/json/module.f.js +0 -0
- /package/{fs → fjs}/media/json/parser/proof.f.d.ts +0 -0
- /package/{fs → fjs}/media/json/proof.f.d.ts +0 -0
- /package/{fs → fjs}/media/json/proof.f.js +0 -0
- /package/{fs → fjs}/media/json/rpc/module.f.d.ts +0 -0
- /package/{fs → fjs}/media/json/rpc/proof.f.d.ts +0 -0
- /package/{fs → fjs}/media/json/rpc/proof.f.js +0 -0
- /package/{fs → fjs}/media/json/schema/proof.f.d.ts +0 -0
- /package/{fs → fjs}/media/json/serializer/module.f.d.ts +0 -0
- /package/{fs → fjs}/media/json/serializer/module.f.js +0 -0
- /package/{fs → fjs}/media/json/serializer/proof.f.d.ts +0 -0
- /package/{fs → fjs}/media/json/tokenizer/module.f.d.ts +0 -0
- /package/{fs → fjs}/media/json/tokenizer/module.f.js +0 -0
- /package/{fs → fjs}/media/json/tokenizer/proof.f.d.ts +0 -0
- /package/{fs → fjs}/media/json/tokenizer/proof.f.js +0 -0
- /package/{fs → fjs}/media/proof.f.d.ts +0 -0
- /package/{fs → fjs}/media/type/module.f.d.ts +0 -0
- /package/{fs → fjs}/media/type/module.f.js +0 -0
- /package/{fs → fjs}/media/type/proof.f.d.ts +0 -0
- /package/{fs → fjs}/module.d.ts +0 -0
- /package/{fs → fjs}/module.f.d.ts +0 -0
- /package/{fs → fjs}/module.js +0 -0
- /package/{fs → fjs}/path/module.f.d.ts +0 -0
- /package/{fs → fjs}/path/module.f.js +0 -0
- /package/{fs → fjs}/path/proof.f.d.ts +0 -0
- /package/{fs → fjs}/proof.f.d.ts +0 -0
- /package/{fs → fjs}/sul/id/module.f.d.ts +0 -0
- /package/{fs → fjs}/sul/id/module.f.js +0 -0
- /package/{fs → fjs}/sul/id/proof.f.d.ts +0 -0
- /package/{fs → fjs}/sul/level/hash/module.f.d.ts +0 -0
- /package/{fs → fjs}/sul/level/hash/module.f.js +0 -0
- /package/{fs → fjs}/sul/level/hash/proof.f.d.ts +0 -0
- /package/{fs → fjs}/sul/level/literal/module.f.d.ts +0 -0
- /package/{fs → fjs}/sul/level/literal/module.f.js +0 -0
- /package/{fs → fjs}/sul/level/literal/proof.f.d.ts +0 -0
- /package/{fs → fjs}/sul/module.f.d.ts +0 -0
- /package/{fs → fjs}/sul/module.f.js +0 -0
- /package/{fs → fjs}/sul/proof.f.d.ts +0 -0
- /package/{fs → fjs}/sul/proof.f.js +0 -0
- /package/{fs → fjs}/text/ascii/module.f.d.ts +0 -0
- /package/{fs → fjs}/text/ascii/module.f.js +0 -0
- /package/{fs → fjs}/text/code_point/module.f.d.ts +0 -0
- /package/{fs → fjs}/text/code_point/proof.f.d.ts +0 -0
- /package/{fs → fjs}/text/code_point/proof.f.js +0 -0
- /package/{fs → fjs}/text/module.f.d.ts +0 -0
- /package/{fs → fjs}/text/module.f.js +0 -0
- /package/{fs → fjs}/text/proof.f.d.ts +0 -0
- /package/{fs → fjs}/text/sgr/module.f.d.ts +0 -0
- /package/{fs → fjs}/text/sgr/module.f.js +0 -0
- /package/{fs → fjs}/text/sgr/proof.f.d.ts +0 -0
- /package/{fs → fjs}/text/utf16/module.f.d.ts +0 -0
- /package/{fs → fjs}/text/utf16/proof.f.d.ts +0 -0
- /package/{fs → fjs}/text/utf8/module.f.d.ts +0 -0
- /package/{fs → fjs}/text/utf8/module.f.js +0 -0
- /package/{fs → fjs}/text/utf8/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/array/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/array/module.f.js +0 -0
- /package/{fs → fjs}/types/array/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/bigfloat/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/bigfloat/module.f.js +0 -0
- /package/{fs → fjs}/types/bigfloat/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/bigint/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/bigint/module.f.js +0 -0
- /package/{fs → fjs}/types/bigint/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/bit_vec/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/bit_vec/module.f.js +0 -0
- /package/{fs → fjs}/types/bit_vec/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/find/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/find/module.f.js +0 -0
- /package/{fs → fjs}/types/btree/find/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/module.f.js +0 -0
- /package/{fs → fjs}/types/btree/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/remove/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/remove/module.f.js +0 -0
- /package/{fs → fjs}/types/btree/set/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/set/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/types/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/types/module.f.js +0 -0
- /package/{fs → fjs}/types/byte_set/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/byte_set/module.f.js +0 -0
- /package/{fs → fjs}/types/byte_set/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/function/compare/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/function/compare/module.f.js +0 -0
- /package/{fs → fjs}/types/function/compare/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/function/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/function/module.f.js +0 -0
- /package/{fs → fjs}/types/function/operator/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/function/operator/module.f.js +0 -0
- /package/{fs → fjs}/types/function/operator/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/function/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/list/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/list/module.f.js +0 -0
- /package/{fs → fjs}/types/list/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/map/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/map/module.f.js +0 -0
- /package/{fs → fjs}/types/map/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/nibble_set/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/nibble_set/module.f.js +0 -0
- /package/{fs → fjs}/types/nibble_set/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/nominal/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/nominal/module.f.js +0 -0
- /package/{fs → fjs}/types/nominal/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/nullable/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/nullable/module.f.js +0 -0
- /package/{fs → fjs}/types/nullable/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/number/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/number/module.f.js +0 -0
- /package/{fs → fjs}/types/number/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/object/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/object/module.f.js +0 -0
- /package/{fs → fjs}/types/object/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/option/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/option/module.f.js +0 -0
- /package/{fs → fjs}/types/ordered_map/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/ordered_map/module.f.js +0 -0
- /package/{fs → fjs}/types/ordered_map/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/ordered_map/proof.f.js +0 -0
- /package/{fs → fjs}/types/patricia_trie/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/patricia_trie/module.f.js +0 -0
- /package/{fs → fjs}/types/patricia_trie/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/phantom/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/phantom/module.f.js +0 -0
- /package/{fs → fjs}/types/prime_field/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/prime_field/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/prime_field/proof.f.js +0 -0
- /package/{fs → fjs}/types/range/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/range_map/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/range_map/module.f.js +0 -0
- /package/{fs → fjs}/types/range_map/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/result/module.d.ts +0 -0
- /package/{fs → fjs}/types/result/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/result/module.f.js +0 -0
- /package/{fs → fjs}/types/result/module.js +0 -0
- /package/{fs → fjs}/types/rtti/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/rtti/module.f.js +0 -0
- /package/{fs → fjs}/types/rtti/parse/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/rtti/parse/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/rtti/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/rtti/proof.f.js +0 -0
- /package/{fs → fjs}/types/rtti/ts/module.f.js +0 -0
- /package/{fs → fjs}/types/rtti/ts/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/rtti/ts/proof.f.js +0 -0
- /package/{fs → fjs}/types/rtti/validate/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/rtti/validate/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/sorted_list/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/sorted_list/module.f.js +0 -0
- /package/{fs → fjs}/types/sorted_list/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/sorted_set/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/sorted_set/module.f.js +0 -0
- /package/{fs → fjs}/types/sorted_set/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/string/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/string/module.f.js +0 -0
- /package/{fs → fjs}/types/string/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/string_set/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/string_set/module.f.js +0 -0
- /package/{fs → fjs}/types/string_set/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/ts/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/ts/module.f.js +0 -0
- /package/{fs → fjs}/types/ts/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/uint8array/module.f.d.ts +0 -0
- /package/{fs → fjs}/website/module.f.d.ts +0 -0
- /package/{fs → fjs}/website/module.f.js +0 -0
- /package/{fs → fjs}/website/proof.f.d.ts +0 -0
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { length, maxLength, msb, vec, vec8 } from '../types/bit_vec/module.f.js';
|
|
2
2
|
import { cBase32ToVec, vecToCBase32 } from '../basen/cbase32/module.f.js';
|
|
3
3
|
import { computeSync, sha256 } from '../crypto/sha2/module.f.js';
|
|
4
|
-
import { fileCas, casAddFile, casUpload } from './module.f.js';
|
|
5
|
-
import { pure } from '../effects/module.f.js';
|
|
4
|
+
import { fileCas, casAddFile, collectRead, casUpload } from './module.f.js';
|
|
5
|
+
import { decode, pure } from '../effects/module.f.js';
|
|
6
6
|
import { mkdir, writeFile, rm, readFile, access } from '../effects/node/module.f.js';
|
|
7
7
|
import { error, ok } from '../types/result/module.f.js';
|
|
8
8
|
import { emptyState, virtual } from '../effects/node/virtual/module.f.js';
|
|
9
9
|
import { join } from '../path/module.f.js';
|
|
10
10
|
import { nonEmpty, empty } from '../effects/list/module.f.js';
|
|
11
|
+
import { assert, assertEq, assertNotNullish } from '../asserts/module.f.js';
|
|
11
12
|
const testDir = './test-cas-cli';
|
|
12
13
|
// Create a 128 KiB big file content (at the max Vec size limit)
|
|
13
14
|
// This tests the boundary where files are at the chunk size limit
|
|
@@ -36,10 +37,7 @@ const testAddBigFile = () => mkdir(testDir, { recursive: true }).step(() => {
|
|
|
36
37
|
}
|
|
37
38
|
// Verify hash can be encoded/decoded
|
|
38
39
|
const hashCBase32 = vecToCBase32(hash);
|
|
39
|
-
|
|
40
|
-
if (decodedHash === null) {
|
|
41
|
-
throw new Error('Failed to decode hash from base32');
|
|
42
|
-
}
|
|
40
|
+
assertNotNullish(cBase32ToVec(hashCBase32), new Error('Failed to decode hash from base32'));
|
|
43
41
|
return rm(testDir).step(() => pure(undefined));
|
|
44
42
|
});
|
|
45
43
|
});
|
|
@@ -90,16 +88,10 @@ export const proof = {
|
|
|
90
88
|
const c = fileCas(sha256)('.');
|
|
91
89
|
const payload = nonEmpty(ok(content), empty());
|
|
92
90
|
const [state1, writeResult] = virtual(emptyState)(c.write(payload));
|
|
93
|
-
|
|
94
|
-
throw ['expected write ok', writeResult];
|
|
95
|
-
}
|
|
91
|
+
assert(writeResult[0] === 'ok', ['expected write ok', writeResult]);
|
|
96
92
|
const hash = writeResult[1];
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
}
|
|
100
|
-
if (msb.cmp(hash)(computeSync(sha256)([content])) !== 0) {
|
|
101
|
-
throw 'write hash mismatch';
|
|
102
|
-
}
|
|
93
|
+
assertEq(length(hash), 256n, ['expected 256-bit hash', length(hash)]);
|
|
94
|
+
assertEq(msb.cmp(hash)(computeSync(sha256)([content])), 0, 'write hash mismatch');
|
|
103
95
|
const drain = (acc) => (stream) => stream.step((node) => {
|
|
104
96
|
if (node === undefined) {
|
|
105
97
|
return pure(ok(acc));
|
|
@@ -111,24 +103,16 @@ export const proof = {
|
|
|
111
103
|
return drain([...acc, first[1]])(tail);
|
|
112
104
|
});
|
|
113
105
|
const [, readResult] = virtual(state1)(drain([])(c.read(hash)));
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
}
|
|
117
|
-
if (msb.cmp(msb.listToVec(readResult[1]))(content) !== 0) {
|
|
118
|
-
throw 'read content mismatch';
|
|
119
|
-
}
|
|
106
|
+
assert(readResult[0] === 'ok', ['expected read ok', readResult]);
|
|
107
|
+
assertEq(msb.cmp(msb.listToVec(readResult[1]))(content), 0, 'read content mismatch');
|
|
120
108
|
},
|
|
121
109
|
casReadMissingShard: () => {
|
|
122
110
|
// A missing shard surfaces as an explicit error *item*, never as end-of-stream.
|
|
123
111
|
const c = fileCas(sha256)('.');
|
|
124
112
|
const hash = computeSync(sha256)([vec8(0x2an)]);
|
|
125
113
|
const node = virtual(emptyState)(c.read(hash))[1];
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
}
|
|
129
|
-
if (node.first[0] !== 'error') {
|
|
130
|
-
throw ['expected error item', node.tail];
|
|
131
|
-
}
|
|
114
|
+
assert(node !== undefined, 'missing shard must not be EOF');
|
|
115
|
+
assert(node.first[0] === 'error', ['expected error item', node.tail]);
|
|
132
116
|
},
|
|
133
117
|
casWriteMultiChunk: () => {
|
|
134
118
|
// A multi-chunk payload streams through `writeBytes` chunk-by-chunk (the lease is
|
|
@@ -138,13 +122,9 @@ export const proof = {
|
|
|
138
122
|
const c = fileCas(sha256)('.');
|
|
139
123
|
const payload = chunks.reduceRight((tail, chunk) => nonEmpty(ok(chunk), tail), empty());
|
|
140
124
|
const [state1, writeResult] = virtual(emptyState)(c.write(payload));
|
|
141
|
-
|
|
142
|
-
throw ['expected write ok', writeResult];
|
|
143
|
-
}
|
|
125
|
+
assert(writeResult[0] === 'ok', ['expected write ok', writeResult]);
|
|
144
126
|
const hash = writeResult[1];
|
|
145
|
-
|
|
146
|
-
throw 'multi-chunk write hash mismatch';
|
|
147
|
-
}
|
|
127
|
+
assertEq(msb.cmp(hash)(computeSync(sha256)(chunks)), 0, 'multi-chunk write hash mismatch');
|
|
148
128
|
const drain = (acc) => (stream) => stream.step((node) => {
|
|
149
129
|
if (node === undefined) {
|
|
150
130
|
return pure(ok(acc));
|
|
@@ -156,13 +136,9 @@ export const proof = {
|
|
|
156
136
|
return drain([...acc, first[1]])(tail);
|
|
157
137
|
});
|
|
158
138
|
const [, readResult] = virtual(state1)(drain([])(c.read(hash)));
|
|
159
|
-
|
|
160
|
-
throw ['expected read ok', readResult];
|
|
161
|
-
}
|
|
139
|
+
assert(readResult[0] === 'ok', ['expected read ok', readResult]);
|
|
162
140
|
const expected = msb.concat(msb.concat(chunks[0])(chunks[1]))(chunks[2]);
|
|
163
|
-
|
|
164
|
-
throw 'multi-chunk read content mismatch';
|
|
165
|
-
}
|
|
141
|
+
assertEq(msb.cmp(msb.listToVec(readResult[1]))(expected), 0, 'multi-chunk read content mismatch');
|
|
166
142
|
},
|
|
167
143
|
casWriteDedup: () => {
|
|
168
144
|
// Same content ⇒ same hash; the second upload's replace-`rename` publishes over the
|
|
@@ -172,16 +148,10 @@ export const proof = {
|
|
|
172
148
|
const payload = () => nonEmpty(ok(content), empty());
|
|
173
149
|
const [state1, w1] = virtual(emptyState)(c.write(payload()));
|
|
174
150
|
const [state2, w2] = virtual(state1)(c.write(payload()));
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
}
|
|
178
|
-
if (msb.cmp(w1[1])(w2[1]) !== 0) {
|
|
179
|
-
throw 'dedup hash mismatch';
|
|
180
|
-
}
|
|
151
|
+
assert(!(w1[0] !== 'ok' || w2[0] !== 'ok'), ['expected both writes ok', w1, w2]);
|
|
152
|
+
assertEq(msb.cmp(w1[1])(w2[1]), 0, 'dedup hash mismatch');
|
|
181
153
|
const [, hashes] = virtual(state2)(c.list());
|
|
182
|
-
|
|
183
|
-
throw ['expected one shard after dedup', hashes.length];
|
|
184
|
-
}
|
|
154
|
+
assertEq(hashes.length, 1, ['expected one shard after dedup', hashes.length]);
|
|
185
155
|
},
|
|
186
156
|
casWriteErrorItemAborts: () => {
|
|
187
157
|
// An error item mid-stream deletes the partial staging file and fails; nothing is
|
|
@@ -191,13 +161,9 @@ export const proof = {
|
|
|
191
161
|
const errItem = error({ code: 'BOOM' });
|
|
192
162
|
const payload = nonEmpty(okItem, nonEmpty(errItem, empty()));
|
|
193
163
|
const [state1, result] = virtual(emptyState)(c.write(payload));
|
|
194
|
-
|
|
195
|
-
throw ['expected write error', result];
|
|
196
|
-
}
|
|
164
|
+
assert(result[0] === 'error', ['expected write error', result]);
|
|
197
165
|
const [, hashes] = virtual(state1)(c.list());
|
|
198
|
-
|
|
199
|
-
throw ['expected nothing published on abort', hashes];
|
|
200
|
-
}
|
|
166
|
+
assertEq(hashes.length, 0, ['expected nothing published on abort', hashes]);
|
|
201
167
|
},
|
|
202
168
|
casWriteReadExceedsMaxLength: () => {
|
|
203
169
|
// The point of streaming: a payload larger than a single `Vec`'s `maxLength`
|
|
@@ -211,13 +177,9 @@ export const proof = {
|
|
|
211
177
|
const c = fileCas(sha256)('.');
|
|
212
178
|
const payload = chunks.reduceRight((tl, chunk) => nonEmpty(ok(chunk), tl), empty());
|
|
213
179
|
const [state1, w] = virtual(emptyState)(c.write(payload));
|
|
214
|
-
|
|
215
|
-
throw ['expected write ok', w];
|
|
216
|
-
}
|
|
180
|
+
assert(w[0] === 'ok', ['expected write ok', w]);
|
|
217
181
|
const hash = w[1];
|
|
218
|
-
|
|
219
|
-
throw 'oversized write hash mismatch';
|
|
220
|
-
}
|
|
182
|
+
assertEq(msb.cmp(hash)(computeSync(sha256)(chunks)), 0, 'oversized write hash mismatch');
|
|
221
183
|
// Fold the read stream straight into a fresh SHA-2 state — never one `Vec`.
|
|
222
184
|
const rehash = (state) => (stream) => stream.step((node) => {
|
|
223
185
|
if (node === undefined) {
|
|
@@ -230,12 +192,8 @@ export const proof = {
|
|
|
230
192
|
return rehash(sha256.append(first[1])(state))(tail);
|
|
231
193
|
});
|
|
232
194
|
const [, readBack] = virtual(state1)(rehash(sha256.init)(c.read(hash)));
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
}
|
|
236
|
-
if (msb.cmp(readBack[1])(hash) !== 0) {
|
|
237
|
-
throw 'oversized read-back hash mismatch';
|
|
238
|
-
}
|
|
195
|
+
assert(readBack[0] === 'ok', ['expected read ok', readBack]);
|
|
196
|
+
assertEq(msb.cmp(readBack[1])(hash), 0, 'oversized read-back hash mismatch');
|
|
239
197
|
},
|
|
240
198
|
casWriteGcReclaimsExpired: () => {
|
|
241
199
|
// A staging file whose deadline is in the past is reclaimed by the GC that `write`
|
|
@@ -250,45 +208,78 @@ export const proof = {
|
|
|
250
208
|
const c = fileCas(sha256)('.');
|
|
251
209
|
const x = c.write(nonEmpty(ok(content), empty()));
|
|
252
210
|
const [state1, w] = virtual(state0)(x);
|
|
253
|
-
|
|
254
|
-
throw ['expected write ok', w];
|
|
255
|
-
}
|
|
211
|
+
assert(w[0] === 'ok', ['expected write ok', w]);
|
|
256
212
|
const [, present] = virtual(state1)(access(stalePath));
|
|
257
|
-
|
|
258
|
-
throw 'expected GC to reclaim the expired staging file';
|
|
259
|
-
}
|
|
213
|
+
assert(present[0] === 'error', 'expected GC to reclaim the expired staging file');
|
|
260
214
|
},
|
|
261
215
|
casUploadSuccess: () => {
|
|
262
216
|
// A successful upload returns the hash and deletes the source file from cas_upload/.
|
|
263
217
|
const content = vec8(0x2an);
|
|
264
218
|
const state0 = { ...emptyState, root: { 'cas_upload': { 'myfile': [content] } } };
|
|
265
219
|
const [state1, result] = virtual(state0)(casUpload('.')('myfile'));
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
}
|
|
269
|
-
if (length(result[1]) !== 256n) {
|
|
270
|
-
throw ['expected 256-bit hash', length(result[1])];
|
|
271
|
-
}
|
|
220
|
+
assert(result[0] === 'ok', ['expected casUpload ok', result]);
|
|
221
|
+
assertEq(length(result[1]), 256n, ['expected 256-bit hash', length(result[1])]);
|
|
272
222
|
// Source must be deleted after successful publish.
|
|
273
223
|
const srcPath = join('.', 'cas_upload', 'myfile');
|
|
274
224
|
const [, srcAccess] = virtual(state1)(access(srcPath));
|
|
275
|
-
|
|
276
|
-
throw 'expected source to be deleted after successful upload';
|
|
277
|
-
}
|
|
225
|
+
assert(srcAccess[0] === 'error', 'expected source to be deleted after successful upload');
|
|
278
226
|
},
|
|
279
227
|
casUploadFailureKeepsSource: () => {
|
|
280
228
|
// A missing source file causes write to fail; casUpload returns error and the
|
|
281
229
|
// source is left in place (trivially: it was never there, but the upload is not published).
|
|
282
230
|
const state0 = { ...emptyState, root: {} };
|
|
283
231
|
const [state1, result] = virtual(state0)(casUpload('.')('nonexistent'));
|
|
284
|
-
|
|
285
|
-
throw ['expected casUpload to fail on missing source', result];
|
|
286
|
-
}
|
|
232
|
+
assert(result[0] === 'error', ['expected casUpload to fail on missing source', result]);
|
|
287
233
|
// Nothing published to the store.
|
|
288
234
|
const c = fileCas(sha256)('.');
|
|
289
235
|
const [, hashes] = virtual(state1)(c.list());
|
|
290
|
-
|
|
291
|
-
|
|
236
|
+
assertEq(hashes.length, 0, ['expected nothing published on failed upload', hashes]);
|
|
237
|
+
},
|
|
238
|
+
collectReadDrainsChunks: () => {
|
|
239
|
+
// The common path: every chunk is `ok`, so collectRead concatenates them all
|
|
240
|
+
// and returns the whole blob as one `Vec`.
|
|
241
|
+
const stream = nonEmpty(ok(vec8(0x11n)), nonEmpty(ok(vec8(0x22n)), empty()));
|
|
242
|
+
const d = decode(collectRead(stream));
|
|
243
|
+
assert(d.done, 'expected collectRead to finish without issuing a command');
|
|
244
|
+
assertEq(d.result[0], 'ok');
|
|
245
|
+
},
|
|
246
|
+
collectReadPropagatesErrorItem: () => {
|
|
247
|
+
// An error item mid-stream short-circuits collectRead with that same error.
|
|
248
|
+
const boom = error('boom');
|
|
249
|
+
const stream = nonEmpty(ok(vec8(0x11n)), nonEmpty(boom, empty()));
|
|
250
|
+
const d = decode(collectRead(stream));
|
|
251
|
+
assert(d.done, 'expected collectRead to finish without issuing a command');
|
|
252
|
+
assertEq(d.result[0], 'error');
|
|
253
|
+
assertEq(d.result[1], 'boom');
|
|
254
|
+
},
|
|
255
|
+
// A single `Vec` cannot exceed `maxLength` bits — feed a pure stream whose second
|
|
256
|
+
// chunk pushes the running total just over the limit so the overflow guard fires
|
|
257
|
+
// without any real I/O.
|
|
258
|
+
collectReadOverflow: () => {
|
|
259
|
+
const half = maxLength / 2n;
|
|
260
|
+
const v1 = vec(half)(0n);
|
|
261
|
+
const v2 = vec(half + 1n)(0n);
|
|
262
|
+
const stream = nonEmpty(ok(v1), nonEmpty(ok(v2), empty()));
|
|
263
|
+
const d = decode(collectRead(stream));
|
|
264
|
+
assert(d.done, 'expected collectRead to finish without issuing a command');
|
|
265
|
+
assertEq(d.result[0], 'error');
|
|
266
|
+
},
|
|
267
|
+
casListPropagatesNonNotFoundAccessError: () => {
|
|
268
|
+
// A non-ENOENT `access` failure (permissions, corruption) is a genuine storage
|
|
269
|
+
// error and must propagate out of `list`, not be swallowed as an empty store.
|
|
270
|
+
const c = fileCas(sha256)('.');
|
|
271
|
+
const boom = { code: 'EACCES' };
|
|
272
|
+
const d = decode(c.list());
|
|
273
|
+
assert(!d.done, 'expected list() to issue an access command first');
|
|
274
|
+
assertEq(d.command, 'access');
|
|
275
|
+
const continuation = d.continuation;
|
|
276
|
+
let threw;
|
|
277
|
+
try {
|
|
278
|
+
continuation(error(boom));
|
|
279
|
+
}
|
|
280
|
+
catch (e) {
|
|
281
|
+
threw = e;
|
|
292
282
|
}
|
|
283
|
+
assertEq(threw, boom);
|
|
293
284
|
},
|
|
294
285
|
};
|
|
@@ -19,24 +19,24 @@ export declare const images: {
|
|
|
19
19
|
readonly arm: 'windows-11-arm';
|
|
20
20
|
};
|
|
21
21
|
};
|
|
22
|
-
export declare const functionalscript: '0.
|
|
22
|
+
export declare const functionalscript: '0.37.0';
|
|
23
23
|
export declare const bun = "1.3.14";
|
|
24
|
-
export declare const deno = "2.9.
|
|
24
|
+
export declare const deno = "2.9.3";
|
|
25
25
|
export declare const playwright = "1.61.1";
|
|
26
26
|
export declare const node: {
|
|
27
27
|
readonly default: '26.5.0';
|
|
28
28
|
readonly node22: '22.23.1';
|
|
29
29
|
readonly node24: '24.18.0';
|
|
30
30
|
};
|
|
31
|
-
export declare const wasmtime = "
|
|
31
|
+
export declare const wasmtime = "47.0.2";
|
|
32
32
|
export declare const wasmer = "7.2.0";
|
|
33
33
|
export declare const actions: {
|
|
34
34
|
readonly 'actions/checkout': 'v7';
|
|
35
|
-
readonly 'actions/setup-node': '
|
|
35
|
+
readonly 'actions/setup-node': 'v7.0.0';
|
|
36
36
|
readonly 'actions/cache': 'v6.1.0';
|
|
37
37
|
readonly 'denoland/setup-deno': 'v2.0.5';
|
|
38
38
|
readonly 'oven-sh/setup-bun': 'v2.2.0';
|
|
39
39
|
readonly 'bytecodealliance/actions/wasmtime/setup': 'v1.1.3';
|
|
40
40
|
readonly 'wasmerio/setup-wasmer': 'v3.1';
|
|
41
|
-
readonly 'dtolnay/rust-toolchain': '1.
|
|
41
|
+
readonly 'dtolnay/rust-toolchain': '1.97.1';
|
|
42
42
|
};
|
|
@@ -24,11 +24,11 @@ export const images = {
|
|
|
24
24
|
// published FunctionalScript release; do not tie it to package.json's current
|
|
25
25
|
// in-repo version.
|
|
26
26
|
// https://www.npmjs.com/package/functionalscript
|
|
27
|
-
export const functionalscript = '0.
|
|
27
|
+
export const functionalscript = '0.37.0';
|
|
28
28
|
// https://bun.sh/
|
|
29
29
|
export const bun = '1.3.14';
|
|
30
30
|
// https://deno.com/
|
|
31
|
-
export const deno = '2.9.
|
|
31
|
+
export const deno = '2.9.3';
|
|
32
32
|
// https://www.npmjs.com/package/playwright
|
|
33
33
|
export const playwright = '1.61.1';
|
|
34
34
|
// https://nodejs.org/en/download
|
|
@@ -38,7 +38,7 @@ export const node = {
|
|
|
38
38
|
node24: '24.18.0',
|
|
39
39
|
};
|
|
40
40
|
// https://github.com/bytecodealliance/wasmtime/releases
|
|
41
|
-
export const wasmtime = '
|
|
41
|
+
export const wasmtime = '47.0.2';
|
|
42
42
|
// https://github.com/wasmerio/wasmer/releases
|
|
43
43
|
export const wasmer = '7.2.0';
|
|
44
44
|
// GitHub Action versions used by CI step builders. The key is the action
|
|
@@ -49,7 +49,7 @@ export const actions = {
|
|
|
49
49
|
// https://github.com/marketplace/actions/checkout
|
|
50
50
|
'actions/checkout': 'v7',
|
|
51
51
|
// https://github.com/marketplace/actions/setup-node-js-environment
|
|
52
|
-
'actions/setup-node': '
|
|
52
|
+
'actions/setup-node': 'v7.0.0',
|
|
53
53
|
// https://github.com/marketplace/actions/cache
|
|
54
54
|
'actions/cache': 'v6.1.0',
|
|
55
55
|
// https://github.com/marketplace/actions/setup-deno
|
|
@@ -61,5 +61,5 @@ export const actions = {
|
|
|
61
61
|
// https://github.com/wasmerio/setup-wasmer
|
|
62
62
|
'wasmerio/setup-wasmer': 'v3.1',
|
|
63
63
|
// https://rust-lang.org/ - value is Rust version, not action version
|
|
64
|
-
'dtolnay/rust-toolchain': '1.
|
|
64
|
+
'dtolnay/rust-toolchain': '1.97.1',
|
|
65
65
|
};
|
package/{fs → fjs}/ci/proof.f.js
RENAMED
|
@@ -3,13 +3,14 @@ import { functionalscript } from './config/module.f.js';
|
|
|
3
3
|
import { utf8, utf8ToString } from '../text/module.f.js';
|
|
4
4
|
import { empty as emptyVec, isVec } from '../types/bit_vec/module.f.js';
|
|
5
5
|
import { test, ubuntu, parseGitHubAction } from './common/module.f.js';
|
|
6
|
-
import { assert } from '../asserts/module.f.js';
|
|
6
|
+
import { assert, assertEq } from '../asserts/module.f.js';
|
|
7
7
|
import { emptyState, virtual } from '../effects/node/virtual/module.f.js';
|
|
8
8
|
import { parse as jsonParse } from '../media/json/module.f.js';
|
|
9
9
|
import { unwrap } from '../types/result/module.f.js';
|
|
10
10
|
import { definedValues } from '../types/object/module.f.js';
|
|
11
11
|
const hasRun = (cmd) => (gha) => definedValues(gha.jobs).some(job => job.steps.some(step => step.run?.includes(cmd)));
|
|
12
12
|
const hasRunInJob = (jobId, cmd) => (gha) => gha.jobs[jobId]?.steps.some(step => step.run?.includes(cmd)) ?? false;
|
|
13
|
+
const hasExactRunInJob = (jobId, cmd) => (gha) => gha.jobs[jobId]?.steps.some(step => step.run === cmd) ?? false;
|
|
13
14
|
const makeState = (rust, packageJson) => ({
|
|
14
15
|
...emptyState,
|
|
15
16
|
root: {
|
|
@@ -24,27 +25,25 @@ const workflow = (state) => {
|
|
|
24
25
|
const workflows = dotGithub['workflows'];
|
|
25
26
|
assert(typeof workflows === 'object' && !Array.isArray(workflows), workflows);
|
|
26
27
|
const file = workflows['ci.yml'];
|
|
27
|
-
|
|
28
|
-
throw file;
|
|
29
|
-
}
|
|
28
|
+
assert(!(!Array.isArray(file) || file.length === 0), file);
|
|
30
29
|
return unwrap(parseGitHubAction(jsonParse(utf8ToString(file[0]))));
|
|
31
30
|
};
|
|
32
31
|
const run = (rust, nodeExtra = () => []) => {
|
|
33
32
|
const [state, result] = virtual(makeState(rust))(ci({ nodeExtra }));
|
|
34
|
-
|
|
33
|
+
assertEq(result, 0);
|
|
35
34
|
return workflow(state);
|
|
36
35
|
};
|
|
37
36
|
const runDefault = (packageJson) => {
|
|
38
37
|
const [state, result] = virtual(makeState(false, packageJson))(main());
|
|
39
|
-
|
|
38
|
+
assertEq(result, 0);
|
|
40
39
|
return workflow(state);
|
|
41
40
|
};
|
|
42
41
|
export const proof = {
|
|
43
42
|
matrixShape: () => {
|
|
44
43
|
const gha = run(true);
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
44
|
+
assertEq(Object.keys(gha.jobs).length, 13, 'expected 13 CI jobs');
|
|
45
|
+
assertEq(gha.permissions.contents, 'read', 'expected read-only contents permission');
|
|
46
|
+
assertEq(Object.keys(gha.permissions).length, 1, 'expected least-privilege workflow permissions');
|
|
48
47
|
assert(hasRunInJob('ubuntu-intel', 'cargo test --target i686-unknown-linux-gnu')(gha), 'expected Ubuntu Intel i686 check');
|
|
49
48
|
assert(hasRunInJob('ubuntu-intel', 'cargo test --target i686-unknown-linux-gnu --release')(gha), 'expected Ubuntu Intel i686 release check');
|
|
50
49
|
assert(hasRunInJob('ubuntu-intel', 'cargo clippy --target i686-unknown-linux-gnu -- -D warnings')(gha), 'expected Ubuntu Intel i686 lint');
|
|
@@ -55,6 +54,12 @@ export const proof = {
|
|
|
55
54
|
assert(hasRunInJob('wasm', 'cargo test --target wasm32-wasip1 --release')(gha), 'expected target-specific WASM release check');
|
|
56
55
|
assert(hasRunInJob('wasm', 'cargo clippy --target wasm32-wasip1 -- -D warnings')(gha), 'expected target-specific WASM Rust lint');
|
|
57
56
|
assert(hasRunInJob('wasm', 'cargo clippy --target wasm32-wasip1 --release -- -D warnings')(gha), 'expected target-specific WASM release lint');
|
|
57
|
+
// Wasmtime 47 removed wasi-threads: the threads target must run under
|
|
58
|
+
// Wasmer only, while Clippy (no runner) stays.
|
|
59
|
+
assert(hasRunInJob('wasm', 'cargo test --target wasm32-wasip1-threads --config .cargo/config.wasmer.toml')(gha), 'expected Wasmer WASM threads check');
|
|
60
|
+
assert(hasRunInJob('wasm', 'cargo clippy --target wasm32-wasip1-threads -- -D warnings')(gha), 'expected WASM threads lint');
|
|
61
|
+
assert(!hasExactRunInJob('wasm', 'cargo test --target wasm32-wasip1-threads')(gha), 'unexpected Wasmtime WASM threads check');
|
|
62
|
+
assert(!hasExactRunInJob('wasm', 'cargo test --target wasm32-wasip1-threads --release')(gha), 'unexpected Wasmtime WASM threads release check');
|
|
58
63
|
assert(hasRunInJob('node22', 'fjs t')(gha), 'expected Node 22 FunctionalScript smoke test');
|
|
59
64
|
assert(hasRunInJob('node26', 'npm pack')(gha), 'expected Node 26 package check');
|
|
60
65
|
assert(!hasRun('npm publish --dry-run')(gha), 'unexpected npm publish dry-run');
|
|
@@ -39,6 +39,14 @@ const wasmTarget = (target) => [
|
|
|
39
39
|
...targetChecks(target),
|
|
40
40
|
...cargoTestPair(target, '.cargo/config.wasmer.toml')
|
|
41
41
|
];
|
|
42
|
+
// Wasmtime 47 removed wasi-threads, so the threads target runs under Wasmer
|
|
43
|
+
// only; Clippy needs no runner and stays. See todo/blocked/wasmtime-threads.md.
|
|
44
|
+
const wasmerOnlyTarget = (target) => [
|
|
45
|
+
{ type: 'rust', target },
|
|
46
|
+
cargoClippy(target),
|
|
47
|
+
cargoReleaseClippy(target),
|
|
48
|
+
...cargoTestPair(target, '.cargo/config.wasmer.toml')
|
|
49
|
+
];
|
|
42
50
|
const i686 = (a, v) => {
|
|
43
51
|
if (a === 'intel') {
|
|
44
52
|
switch (v) {
|
|
@@ -63,5 +71,5 @@ export const rustWasmSteps = [
|
|
|
63
71
|
...wasmTarget('wasm32-wasip1'),
|
|
64
72
|
...wasmTarget('wasm32-wasip2'),
|
|
65
73
|
...wasmTarget('wasm32-unknown-unknown'),
|
|
66
|
-
...
|
|
74
|
+
...wasmerOnlyTarget('wasm32-wasip1-threads'),
|
|
67
75
|
];
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { pure } from '../effects/module.f.js';
|
|
2
2
|
import { defaultNodeProgramOptions, emptyState, virtual } from '../effects/node/virtual/module.f.js';
|
|
3
3
|
import { dispatch } from './module.f.js';
|
|
4
|
+
import { assert, assertEq } from '../asserts/module.f.js';
|
|
4
5
|
const makeOptions = (args) => ({ ...defaultNodeProgramOptions, args });
|
|
5
6
|
const echoCommands = [
|
|
6
7
|
{
|
|
@@ -13,51 +14,31 @@ const run = (commands) => (args) => virtual(emptyState)(dispatch(commands)(makeO
|
|
|
13
14
|
export const proof = {
|
|
14
15
|
knownCommand: () => {
|
|
15
16
|
const [, code] = run(echoCommands)(['echo', 'hello']);
|
|
16
|
-
|
|
17
|
-
throw ['expected length 5', code];
|
|
18
|
-
}
|
|
17
|
+
assertEq(code, 5, ['expected length 5', code]);
|
|
19
18
|
},
|
|
20
19
|
alias: () => {
|
|
21
20
|
const [, code] = run(echoCommands)(['e', 'hi']);
|
|
22
|
-
|
|
23
|
-
throw ['expected length 2', code];
|
|
24
|
-
}
|
|
21
|
+
assertEq(code, 2, ['expected length 2', code]);
|
|
25
22
|
},
|
|
26
23
|
noArgs: () => {
|
|
27
24
|
const [state, code] = run(echoCommands)([]);
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
}
|
|
31
|
-
if (state.stderr.length === 0) {
|
|
32
|
-
throw 'expected error in stderr';
|
|
33
|
-
}
|
|
25
|
+
assertEq(code, 1, ['expected exit 1', code]);
|
|
26
|
+
assert(state.stderr.length !== 0, 'expected error in stderr');
|
|
34
27
|
},
|
|
35
28
|
unknownCommand: () => {
|
|
36
29
|
const [state, code] = run(echoCommands)(['bogus']);
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
}
|
|
40
|
-
if (state.stderr.length === 0) {
|
|
41
|
-
throw 'expected error in stderr';
|
|
42
|
-
}
|
|
30
|
+
assertEq(code, 1, ['expected exit 1', code]);
|
|
31
|
+
assert(state.stderr.length !== 0, 'expected error in stderr');
|
|
43
32
|
},
|
|
44
33
|
help: () => {
|
|
45
34
|
const [state, code] = run(echoCommands)(['help']);
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
if (!state.stdout.includes('echo')) {
|
|
50
|
-
throw 'expected command name in stdout';
|
|
51
|
-
}
|
|
52
|
-
if (!state.stdout.includes('help')) {
|
|
53
|
-
throw 'expected help entry in stdout';
|
|
54
|
-
}
|
|
35
|
+
assertEq(code, 0, ['expected exit 0', code]);
|
|
36
|
+
assert(state.stdout.includes('echo'), 'expected command name in stdout');
|
|
37
|
+
assert(state.stdout.includes('help'), 'expected help entry in stdout');
|
|
55
38
|
},
|
|
56
39
|
errorIncludesAvailable: () => {
|
|
57
40
|
const [state] = run(echoCommands)(['bogus']);
|
|
58
|
-
|
|
59
|
-
throw 'expected available commands in error';
|
|
60
|
-
}
|
|
41
|
+
assert(state.stderr.includes('echo'), 'expected available commands in error');
|
|
61
42
|
},
|
|
62
43
|
handlerReceivesRemainingArgs: () => {
|
|
63
44
|
const captured = [];
|
|
@@ -70,9 +51,7 @@ export const proof = {
|
|
|
70
51
|
},
|
|
71
52
|
}];
|
|
72
53
|
run(commands)(['grab', 'a', 'b', 'c']);
|
|
73
|
-
|
|
74
|
-
throw ['unexpected args', captured];
|
|
75
|
-
}
|
|
54
|
+
assertEq(captured.join(','), 'a,b,c', ['unexpected args', captured]);
|
|
76
55
|
},
|
|
77
56
|
nestedCommands: () => {
|
|
78
57
|
const inner = [{
|
|
@@ -86,9 +65,7 @@ export const proof = {
|
|
|
86
65
|
handler: inner,
|
|
87
66
|
}];
|
|
88
67
|
const [, code] = run(outer)(['sub', 'ping']);
|
|
89
|
-
|
|
90
|
-
throw ['expected 42', code];
|
|
91
|
-
}
|
|
68
|
+
assertEq(code, 42, ['expected 42', code]);
|
|
92
69
|
},
|
|
93
70
|
nestedHelp: () => {
|
|
94
71
|
const inner = [{
|
|
@@ -102,30 +79,18 @@ export const proof = {
|
|
|
102
79
|
handler: inner,
|
|
103
80
|
}];
|
|
104
81
|
const [state, code] = run(outer)(['sub', 'help']);
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
}
|
|
108
|
-
if (!state.stdout.includes('ping')) {
|
|
109
|
-
throw 'expected inner command in help';
|
|
110
|
-
}
|
|
82
|
+
assertEq(code, 0, ['expected exit 0', code]);
|
|
83
|
+
assert(state.stdout.includes('ping'), 'expected inner command in help');
|
|
111
84
|
},
|
|
112
85
|
prototypeNameIsUnknownCommand: () => {
|
|
113
86
|
const [state, code] = run(echoCommands)(['toString']);
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
}
|
|
117
|
-
if (!state.stderr.includes('unknown command')) {
|
|
118
|
-
throw 'expected unknown-command error in stderr';
|
|
119
|
-
}
|
|
87
|
+
assertEq(code, 1, ['expected exit 1 for prototype-name command', code]);
|
|
88
|
+
assert(state.stderr.includes('unknown command'), 'expected unknown-command error in stderr');
|
|
120
89
|
},
|
|
121
90
|
helpPrototypeSafe: () => {
|
|
122
91
|
const [state, code] = run(echoCommands)(['help', 'toString']);
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
}
|
|
126
|
-
if (!state.stdout.includes('echo')) {
|
|
127
|
-
throw 'expected top-level help for unknown target';
|
|
128
|
-
}
|
|
92
|
+
assertEq(code, 0, ['expected exit 0, not a throw', code]);
|
|
93
|
+
assert(state.stdout.includes('echo'), 'expected top-level help for unknown target');
|
|
129
94
|
},
|
|
130
95
|
helpWithTarget: () => {
|
|
131
96
|
const inner = [{
|
|
@@ -139,14 +104,8 @@ export const proof = {
|
|
|
139
104
|
handler: inner,
|
|
140
105
|
}];
|
|
141
106
|
const [state, code] = run(outer)(['help', 'sub']);
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
if (!state.stdout.includes('ping')) {
|
|
146
|
-
throw 'expected inner command in help';
|
|
147
|
-
}
|
|
148
|
-
if (state.stdout.includes('Subcommand group')) {
|
|
149
|
-
throw 'expected inner help, not outer';
|
|
150
|
-
}
|
|
107
|
+
assertEq(code, 0, ['expected exit 0', code]);
|
|
108
|
+
assert(state.stdout.includes('ping'), 'expected inner command in help');
|
|
109
|
+
assert(!(state.stdout.includes('Subcommand group')), 'expected inner help, not outer');
|
|
151
110
|
},
|
|
152
111
|
};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { repeat } from "./module.f.js";
|
|
2
|
+
import { assertEq } from '../../asserts/module.f.js';
|
|
2
3
|
export const proof = {
|
|
3
4
|
numberAdd: () => {
|
|
4
5
|
const add = {
|
|
@@ -6,13 +7,9 @@ export const proof = {
|
|
|
6
7
|
operation: a => b => a + b,
|
|
7
8
|
};
|
|
8
9
|
const resultAdd = repeat(add)(10n)(2); // 20
|
|
9
|
-
|
|
10
|
-
throw resultAdd;
|
|
11
|
-
}
|
|
10
|
+
assertEq(resultAdd, 20);
|
|
12
11
|
const id = repeat(add)(0n)(42);
|
|
13
|
-
|
|
14
|
-
throw id;
|
|
15
|
-
}
|
|
12
|
+
assertEq(id, 0);
|
|
16
13
|
},
|
|
17
14
|
stringConcat: () => {
|
|
18
15
|
const concat = {
|
|
@@ -20,8 +17,6 @@ export const proof = {
|
|
|
20
17
|
operation: a => b => a + b,
|
|
21
18
|
};
|
|
22
19
|
const resultConcat = repeat(concat)(3n)('ha'); // 'hahaha'
|
|
23
|
-
|
|
24
|
-
throw resultConcat;
|
|
25
|
-
}
|
|
20
|
+
assertEq(resultConcat, 'hahaha');
|
|
26
21
|
}
|
|
27
22
|
};
|
|
@@ -6,29 +6,21 @@ import { hmac } from './module.f.js';
|
|
|
6
6
|
export const proof = {
|
|
7
7
|
example: () => {
|
|
8
8
|
const r = hmac(sha256)(utf8('key'))(utf8('The quick brown fox jumps over the lazy dog'));
|
|
9
|
-
|
|
10
|
-
throw r;
|
|
11
|
-
}
|
|
9
|
+
assertEq(r, vec(256n)(0xf7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8n));
|
|
12
10
|
},
|
|
13
11
|
sha256: () => {
|
|
14
12
|
const r = hmac(sha256)(utf8('key'))(utf8('The quick brown fox jumps over the lazy dog'));
|
|
15
|
-
|
|
16
|
-
throw r;
|
|
17
|
-
}
|
|
13
|
+
assertEq(uint(r), 0xf7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8n, r);
|
|
18
14
|
},
|
|
19
15
|
sha384: () => {
|
|
20
16
|
const k = vec(384n)(0n);
|
|
21
17
|
const m = vec(904n)(0x0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010069c7548c21d0dfea6b9a51c9ead4e27c33d3b3f180316e5bcab92c933f0e4dbc9a9083505bc92276aec4be312696ef7bf3bf603f4bbd381196a029f340585312n);
|
|
22
18
|
const r = hmac(sha384)(k)(m);
|
|
23
|
-
|
|
24
|
-
throw uint(r).toString(16);
|
|
25
|
-
}
|
|
19
|
+
assertEq(r, vec(384n)(0x8f858157ce005cd52fd8e8f1a46b55e6cfae21c8c183d9c2f7504bedf450609edd7d3c6171dc0bdd2d2444faa28f18ban), uint(r).toString(16));
|
|
26
20
|
},
|
|
27
21
|
sha512: () => {
|
|
28
22
|
const r = hmac(sha512)(utf8('key'))(utf8('The quick brown fox jumps over the lazy dog'));
|
|
29
|
-
|
|
30
|
-
throw r;
|
|
31
|
-
}
|
|
23
|
+
assertEq(r, vec(512n)(0xb42af09057bac1e2d41708e48a902e09b5ff7f12ab428a4fe86653c73dd248fb82f948a549f7b791a5b41915ee4d1ec3935357e4e2317250d0372afa2ebeeb3an));
|
|
32
24
|
},
|
|
33
25
|
// RFC 4231 Test Case 6: key (131 bytes of 0xaa = 1048 bits) exceeds SHA-256 block size (512 bits),
|
|
34
26
|
// so the key is first compressed via the hash function before use.
|