functionalscript 0.37.0 → 0.39.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/fjs/bnf/token_symbol/module.f.d.ts +38 -0
- package/fjs/bnf/token_symbol/module.f.js +48 -0
- package/fjs/bnf/token_symbol/proof.f.d.ts +10 -0
- package/fjs/bnf/token_symbol/proof.f.js +37 -0
- package/{fs → fjs}/cas/cli/module.f.js +6 -9
- 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 +27 -0
- package/fjs/cas/evo/mcp/module.f.js +94 -0
- package/fjs/cas/evo/mcp/proof.f.d.ts +11 -0
- package/fjs/cas/evo/mcp/proof.f.js +126 -0
- package/fjs/cas/evo/module.f.d.ts +202 -0
- package/fjs/cas/evo/module.f.js +421 -0
- package/fjs/cas/evo/proof.f.d.ts +39 -0
- package/fjs/cas/evo/proof.f.js +572 -0
- package/fjs/cas/mcp/module.f.d.ts +49 -0
- package/{fs → fjs}/cas/mcp/module.f.js +61 -81
- package/{fs → fjs}/cas/mcp/proof.f.d.ts +4 -1
- package/{fs → fjs}/cas/mcp/proof.f.js +45 -17
- package/{fs → fjs}/cas/module.f.d.ts +10 -0
- package/{fs → fjs}/cas/module.f.js +89 -36
- package/fjs/cas/proof.f.d.ts +18 -0
- package/fjs/cas/proof.f.js +305 -0
- package/{fs → fjs}/ci/bun/module.f.js +3 -3
- package/{fs → fjs}/ci/common/module.f.d.ts +1 -2
- package/{fs → fjs}/ci/common/module.f.js +1 -5
- package/{fs → fjs}/ci/config/module.f.d.ts +8 -8
- package/{fs → fjs}/ci/config/module.f.js +8 -8
- package/{fs → fjs}/ci/deno/module.f.js +3 -3
- package/{fs → fjs}/ci/module.f.js +3 -4
- package/{fs → fjs}/ci/node/module.f.js +11 -9
- package/{fs → fjs}/ci/proof.f.js +16 -9
- package/{fs → fjs}/ci/rust/module.f.js +9 -1
- package/{fs → fjs}/cli/module.f.js +2 -2
- package/{fs → fjs}/cli/proof.f.js +22 -63
- package/{fs → fjs}/common/monoid/module.f.d.ts +46 -2
- package/fjs/common/monoid/module.f.js +88 -0
- package/fjs/common/monoid/proof.f.d.ts +9 -0
- package/fjs/common/monoid/proof.f.js +48 -0
- 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/module.f.js +25 -25
- 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/module.f.js +5 -8
- package/{fs → fjs}/djs/parser/module.f.d.ts +8 -0
- package/{fs → fjs}/djs/parser/module.f.js +37 -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/module.f.js +6 -6
- package/{fs → fjs}/djs/transpiler/proof.f.d.ts +3 -0
- package/{fs → fjs}/djs/transpiler/proof.f.js +29 -30
- package/fjs/effects/eff/module.f.d.ts +72 -0
- package/fjs/effects/eff/module.f.js +46 -0
- package/fjs/effects/eff/proof.f.d.ts +11 -0
- package/fjs/effects/eff/proof.f.js +58 -0
- package/{fs → fjs}/effects/list/module.f.d.ts +11 -5
- package/{fs → fjs}/effects/list/module.f.js +2 -1
- package/{fs → fjs}/effects/memory/proof.f.js +15 -29
- package/fjs/effects/module.f.d.ts +388 -0
- package/fjs/effects/module.f.js +288 -0
- package/{fs → fjs}/effects/node/memory/proof.js +7 -13
- package/{fs → fjs}/effects/node/module.d.ts +1 -1
- package/{fs → fjs}/effects/node/module.f.d.ts +2 -2
- package/{fs → fjs}/effects/node/module.f.js +9 -11
- 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 +121 -299
- package/{fs → fjs}/effects/node/virtual/proof.f.d.ts +1 -0
- package/{fs → fjs}/effects/node/virtual/proof.f.js +36 -29
- package/fjs/effects/proof.f.d.ts +51 -0
- package/fjs/effects/proof.f.js +178 -0
- package/{fs → fjs}/emergent_testing/module.f.js +55 -39
- package/{fs → fjs}/emergent_testing/proof.f.d.ts +4 -0
- package/{fs → fjs}/emergent_testing/proof.f.js +60 -27
- 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 +17 -10
- package/{fs → fjs}/mcp/proof.f.js +17 -16
- package/{fs → fjs}/mcp/stdio/module.f.d.ts +4 -4
- package/{fs → fjs}/mcp/stdio/module.f.js +14 -14
- 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/module.f.js +2 -2
- package/{fs → fjs}/media/type/proof.f.js +8 -15
- package/{fs → fjs}/module.f.js +5 -9
- 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/module.f.js +4 -3
- package/{fs → fjs}/types/bigint/proof.f.js +49 -145
- package/{fs → fjs}/types/bit_vec/module.f.js +5 -15
- 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/module.f.d.ts +5 -0
- package/{fs → fjs}/types/btree/remove/module.f.js +12 -0
- 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/module.f.d.ts +21 -0
- package/{fs → fjs}/types/list/module.f.js +17 -0
- package/{fs → fjs}/types/list/proof.f.d.ts +1 -0
- package/{fs → fjs}/types/list/proof.f.js +79 -164
- 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/module.f.js +2 -1
- 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/{fs → fjs}/types/string/module.f.js +10 -2
- 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/module.f.js +2 -3
- package/{fs → fjs}/website/proof.f.js +3 -6
- package/package.json +8 -8
- 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/cas/proof.f.d.ts +0 -20
- package/fs/cas/proof.f.js +0 -294
- package/fs/common/monoid/module.f.js +0 -44
- package/fs/common/monoid/proof.f.d.ts +0 -4
- package/fs/common/monoid/proof.f.js +0 -27
- 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/effects/module.f.d.ts +0 -106
- package/fs/effects/module.f.js +0 -80
- package/fs/effects/proof.f.d.ts +0 -25
- package/fs/effects/proof.f.js +0 -115
- 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}/ci/bun/module.f.d.ts +0 -0
- /package/{fs → fjs}/ci/deno/module.f.d.ts +0 -0
- /package/{fs → fjs}/ci/module.f.d.ts +0 -0
- /package/{fs → fjs}/ci/node/module.f.d.ts +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/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/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/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}/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.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/virtual/module.f.d.ts +0 -0
- /package/{fs → fjs}/effects/node/virtual/module.f.js +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/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/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/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/bit_vec/module.f.d.ts +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/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/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/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/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/proof.f.d.ts +0 -0
|
@@ -24,13 +24,13 @@ 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.38.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.4';
|
|
32
32
|
// https://www.npmjs.com/package/playwright
|
|
33
|
-
export const playwright = '1.
|
|
33
|
+
export const playwright = '1.62.0';
|
|
34
34
|
// https://nodejs.org/en/download
|
|
35
35
|
export const node = {
|
|
36
36
|
default: '26.5.0',
|
|
@@ -38,18 +38,18 @@ 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
|
-
export const wasmer = '7.2.
|
|
43
|
+
export const wasmer = '7.2.1';
|
|
44
44
|
// GitHub Action versions used by CI step builders. The key is the action
|
|
45
45
|
// `owner/name`; call sites compose the full ref as
|
|
46
46
|
// `` `${name}@${actions[name]}` ``.
|
|
47
47
|
// Note: dtolnay/rust-toolchain value is a Rust version, not an action version.
|
|
48
48
|
export const actions = {
|
|
49
49
|
// https://github.com/marketplace/actions/checkout
|
|
50
|
-
'actions/checkout': 'v7',
|
|
50
|
+
'actions/checkout': 'v7.0.1',
|
|
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
|
};
|
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
* @module
|
|
6
6
|
*/
|
|
7
7
|
import { deno } from '../config/module.f.js';
|
|
8
|
-
import {
|
|
8
|
+
import { install, test, uses } from '../common/module.f.js';
|
|
9
9
|
const denoTest = 'deno test --allow-read --allow-env --allow-sys';
|
|
10
|
-
export const denoSteps = (version) =>
|
|
10
|
+
export const denoSteps = (version) => [
|
|
11
11
|
install(uses('denoland/setup-deno', { 'deno-version': deno })),
|
|
12
12
|
// We need --minimum-dependency-age=0 for functionalscript because we would like to use
|
|
13
13
|
// the latest version of the package even if it is not yet 24 hours old,
|
|
@@ -17,4 +17,4 @@ export const denoSteps = (version) => clean([
|
|
|
17
17
|
test({ run: `deno run -A --minimum-dependency-age=0 npm:functionalscript@${version} t` }),
|
|
18
18
|
test({ run: 'deno install --frozen' }),
|
|
19
19
|
test({ run: `${denoTest} --coverage && deno coverage --include='.*module\\.f\\.ts'` }),
|
|
20
|
-
]
|
|
20
|
+
];
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* @module
|
|
5
5
|
*/
|
|
6
|
-
import { pure } from '../effects/module.f.js';
|
|
6
|
+
import { pure, step } from '../effects/module.f.js';
|
|
7
7
|
import { access, writeUtf8File } from '../effects/node/module.f.js';
|
|
8
8
|
import { functionalscript, images } from './config/module.f.js';
|
|
9
9
|
import { architecture, os, toSteps, ubuntuArm } from './common/module.f.js';
|
|
@@ -29,7 +29,7 @@ const canonicalJobs = (rust) => ({
|
|
|
29
29
|
...nodeVersionJobs(functionalscript),
|
|
30
30
|
playwright: playwrightJob,
|
|
31
31
|
});
|
|
32
|
-
export const ci = ({ nodeExtra }) => access('Cargo.toml')
|
|
32
|
+
export const ci = ({ nodeExtra }) => step(access('Cargo.toml'), result => {
|
|
33
33
|
const rust = result[0] === 'ok';
|
|
34
34
|
const jobs = {
|
|
35
35
|
...Object.fromEntries(os.flatMap(o => architecture.map(job(rust, nodeExtra(o))(o)))),
|
|
@@ -46,7 +46,6 @@ export const ci = ({ nodeExtra }) => access('Cargo.toml').step(result => {
|
|
|
46
46
|
},
|
|
47
47
|
jobs,
|
|
48
48
|
};
|
|
49
|
-
return writeUtf8File('.github/workflows/ci.yml', JSON.stringify(gha, null, ' '))
|
|
50
|
-
.step(() => pure(0));
|
|
49
|
+
return step(writeUtf8File('.github/workflows/ci.yml', JSON.stringify(gha, null, ' ')), () => pure(0));
|
|
51
50
|
});
|
|
52
51
|
export const main = () => ci({ nodeExtra: () => [] });
|
|
@@ -5,38 +5,40 @@
|
|
|
5
5
|
* @module
|
|
6
6
|
*/
|
|
7
7
|
import { node } from '../config/module.f.js';
|
|
8
|
-
import {
|
|
8
|
+
import { install, test, ubuntuArm, uses } from '../common/module.f.js';
|
|
9
9
|
export const major = (v) => v.split('.')[0];
|
|
10
10
|
const installNode = (version) => uses('actions/setup-node', { 'node-version': version });
|
|
11
11
|
const nodeInstall = (v) => [
|
|
12
12
|
install(installNode(v)),
|
|
13
13
|
test({ run: 'npm ci' }),
|
|
14
14
|
];
|
|
15
|
-
export const basicNode = (version) => (extra) =>
|
|
15
|
+
export const basicNode = (version) => (extra) => [
|
|
16
16
|
...nodeInstall(version),
|
|
17
17
|
...extra,
|
|
18
|
-
]
|
|
18
|
+
];
|
|
19
19
|
const fjsGlobalInstall = (version) => install({ run: `npm install -g functionalscript@${version}` });
|
|
20
20
|
export const platformNodeSteps = (version) => [
|
|
21
21
|
...nodeInstall(node.default),
|
|
22
22
|
fjsGlobalInstall(version),
|
|
23
23
|
test({ run: 'fjs t' }),
|
|
24
24
|
];
|
|
25
|
-
const node22Steps = (version) =>
|
|
25
|
+
const node22Steps = (version) => [
|
|
26
26
|
...nodeInstall(node.node22),
|
|
27
27
|
fjsGlobalInstall(version),
|
|
28
28
|
test({ run: 'fjs t' }),
|
|
29
|
-
]
|
|
30
|
-
const node24Steps =
|
|
29
|
+
];
|
|
30
|
+
const node24Steps = [
|
|
31
31
|
...nodeInstall(node.node24),
|
|
32
32
|
test({ run: 'node --test' }),
|
|
33
|
-
]
|
|
34
|
-
const node26Steps =
|
|
33
|
+
];
|
|
34
|
+
const node26Steps = [
|
|
35
35
|
...nodeInstall(node.default),
|
|
36
|
+
test({ run: 'npm run ci-update' }),
|
|
37
|
+
test({ run: 'git add -A && git diff --cached --exit-code' }),
|
|
36
38
|
test({ run: 'npx tsc' }),
|
|
37
39
|
test({ run: 'npm run cov' }),
|
|
38
40
|
test({ run: 'npm pack' }),
|
|
39
|
-
]
|
|
41
|
+
];
|
|
40
42
|
const nodeJob = (steps) => ubuntuArm(steps);
|
|
41
43
|
export const nodeVersionJobs = (version) => ({
|
|
42
44
|
[`node${major(node.node22)}`]: nodeJob(node22Steps(version)),
|
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,8 +54,16 @@ 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');
|
|
65
|
+
assert(hasRunInJob('node26', 'npm run ci-update')(gha), 'expected Node 26 workflow regeneration');
|
|
66
|
+
assert(hasRunInJob('node26', 'git add -A && git diff --cached --exit-code')(gha), 'expected Node 26 generated-file drift check');
|
|
60
67
|
assert(!hasRun('npm publish --dry-run')(gha), 'unexpected npm publish dry-run');
|
|
61
68
|
for (const id of [
|
|
62
69
|
'ubuntu-intel',
|
|
@@ -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,5 +1,5 @@
|
|
|
1
1
|
import { errorExit, log } from '../effects/node/module.f.js';
|
|
2
|
-
import { pure } from '../effects/module.f.js';
|
|
2
|
+
import { pure, step } from '../effects/module.f.js';
|
|
3
3
|
import { at, fromEntries } from '../types/object/module.f.js';
|
|
4
4
|
const helpMeta = { names: ['help', 'h', '?'], description: 'Print this help message' };
|
|
5
5
|
export const dispatch = (commands) => (options) => {
|
|
@@ -23,7 +23,7 @@ export const dispatch = (commands) => (options) => {
|
|
|
23
23
|
return dispatch(targetCmd.handler)({ ...options, args: ['help'] });
|
|
24
24
|
}
|
|
25
25
|
}
|
|
26
|
-
return log(helpText)
|
|
26
|
+
return step(log(helpText), () => pure(0));
|
|
27
27
|
}
|
|
28
28
|
const found = at(cmd)(map);
|
|
29
29
|
if (found === null) {
|
|
@@ -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,11 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Monoids: the `Monoid<T>` algebraic structure (identity plus associative
|
|
3
|
-
* binary operation)
|
|
4
|
-
* exponentiation by squaring
|
|
3
|
+
* binary operation), `repeat`, which applies the operation `n` times using
|
|
4
|
+
* exponentiation by squaring, and `fold`, which applies it across every element
|
|
5
|
+
* of a list.
|
|
5
6
|
*
|
|
6
7
|
* @module
|
|
7
8
|
*/
|
|
8
9
|
import type { Fold, Reduce } from '../../types/function/operator/module.f.ts';
|
|
10
|
+
import { type List } from '../../types/list/module.f.ts';
|
|
9
11
|
/**
|
|
10
12
|
* Represents a monoid, an algebraic structure with a binary operation
|
|
11
13
|
* and an identity (neutral) element.
|
|
@@ -80,3 +82,45 @@ export type Monoid<T> = {
|
|
|
80
82
|
* ```
|
|
81
83
|
*/
|
|
82
84
|
export declare const repeat: <T>({ identity, operation }: Monoid<T>) => Fold<bigint, T>;
|
|
85
|
+
/**
|
|
86
|
+
* Reduces a `List<T>` with the monoid's associative `operation`, seeded at its
|
|
87
|
+
* `identity`. An empty list folds to `identity`.
|
|
88
|
+
*
|
|
89
|
+
* `fold` is the reduction companion of {@link repeat}: where `repeat` applies
|
|
90
|
+
* the operation a fixed number of times to a single element, `fold` applies it
|
|
91
|
+
* across every element of a list. Together they let list reductions such as
|
|
92
|
+
* `sum`, `product`, and string `concat` be expressed directly as monoid folds,
|
|
93
|
+
* so the identity paired with each operation is stated once at the call site
|
|
94
|
+
* instead of hand-seeding a raw `reduce`.
|
|
95
|
+
*
|
|
96
|
+
* Like `repeat`, `fold` applies the operation **accumulator-first**:
|
|
97
|
+
* `operation(accumulator)(element)`, seeded at `identity`, so
|
|
98
|
+
* `[a, b, c]` folds to `((identity op a) op b) op c`. Left-to-right order is
|
|
99
|
+
* therefore preserved and `fold` is correct for non-commutative monoids (e.g.
|
|
100
|
+
* string concatenation as `a => b => a + b`). `list.reduce` calls its reducer
|
|
101
|
+
* element-first, so the operation is `flip`ped before it is handed over.
|
|
102
|
+
*
|
|
103
|
+
* @template T The type of the elements in the monoid.
|
|
104
|
+
* @param monoid The monoid structure, including the identity and binary operation.
|
|
105
|
+
* @returns A function that reduces a `List<T>` to a single `T`.
|
|
106
|
+
*
|
|
107
|
+
* @example
|
|
108
|
+
*
|
|
109
|
+
* ```ts
|
|
110
|
+
* const add: Monoid<number> = {
|
|
111
|
+
* identity: 0,
|
|
112
|
+
* operation: a => b => a + b,
|
|
113
|
+
* };
|
|
114
|
+
*
|
|
115
|
+
* fold(add)([1, 2, 3, 4]) // 10
|
|
116
|
+
* fold(add)([]) // 0
|
|
117
|
+
*
|
|
118
|
+
* const concat: Monoid<string> = {
|
|
119
|
+
* identity: '',
|
|
120
|
+
* operation: a => b => a + b,
|
|
121
|
+
* };
|
|
122
|
+
*
|
|
123
|
+
* fold(concat)(['a', 'b', 'c']) // 'abc' — order preserved
|
|
124
|
+
* ```
|
|
125
|
+
*/
|
|
126
|
+
export declare const fold: <T>({ identity, operation }: Monoid<T>) => (list: List<T>) => T;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { reduce } from '../../types/list/module.f.js';
|
|
2
|
+
import { flip } from '../../types/function/module.f.js';
|
|
3
|
+
/**
|
|
4
|
+
* Repeats a monoid operation `n` times on the given element `a`.
|
|
5
|
+
* This function efficiently performs the operation using exponentiation by squaring.
|
|
6
|
+
*
|
|
7
|
+
* @template T The type of the elements in the monoid.
|
|
8
|
+
* @param monoid The monoid structure, including the identity and binary operation.
|
|
9
|
+
* @returns A function that takes an element `a` and a repetition count `n`,
|
|
10
|
+
* and returns the result of applying the operation `n` times.
|
|
11
|
+
*
|
|
12
|
+
* See also {@link https://en.wikipedia.org/wiki/Exponentiation_by_squaring}.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
*
|
|
16
|
+
* ```ts
|
|
17
|
+
* const add: Monoid<number> = {
|
|
18
|
+
* identity: 0,
|
|
19
|
+
* operation: a => b => a + b,
|
|
20
|
+
* };
|
|
21
|
+
*
|
|
22
|
+
* const resultAdd = repeat(add)(10n)(2) // 20
|
|
23
|
+
*
|
|
24
|
+
* const concat: Monoid<string> = {
|
|
25
|
+
* identity: '',
|
|
26
|
+
* operation: a => b => a + b,
|
|
27
|
+
* };
|
|
28
|
+
*
|
|
29
|
+
* const resultConcat = repeat(concat)(3n)('ha') // 'hahaha'
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export const repeat = ({ identity, operation }) => n => a => {
|
|
33
|
+
let ai = a;
|
|
34
|
+
let ni = n;
|
|
35
|
+
let result = identity;
|
|
36
|
+
while (true) {
|
|
37
|
+
if ((ni & 1n) !== 0n) {
|
|
38
|
+
result = operation(result)(ai);
|
|
39
|
+
}
|
|
40
|
+
ni >>= 1n;
|
|
41
|
+
if (ni === 0n) {
|
|
42
|
+
return result;
|
|
43
|
+
}
|
|
44
|
+
ai = operation(ai)(ai);
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Reduces a `List<T>` with the monoid's associative `operation`, seeded at its
|
|
49
|
+
* `identity`. An empty list folds to `identity`.
|
|
50
|
+
*
|
|
51
|
+
* `fold` is the reduction companion of {@link repeat}: where `repeat` applies
|
|
52
|
+
* the operation a fixed number of times to a single element, `fold` applies it
|
|
53
|
+
* across every element of a list. Together they let list reductions such as
|
|
54
|
+
* `sum`, `product`, and string `concat` be expressed directly as monoid folds,
|
|
55
|
+
* so the identity paired with each operation is stated once at the call site
|
|
56
|
+
* instead of hand-seeding a raw `reduce`.
|
|
57
|
+
*
|
|
58
|
+
* Like `repeat`, `fold` applies the operation **accumulator-first**:
|
|
59
|
+
* `operation(accumulator)(element)`, seeded at `identity`, so
|
|
60
|
+
* `[a, b, c]` folds to `((identity op a) op b) op c`. Left-to-right order is
|
|
61
|
+
* therefore preserved and `fold` is correct for non-commutative monoids (e.g.
|
|
62
|
+
* string concatenation as `a => b => a + b`). `list.reduce` calls its reducer
|
|
63
|
+
* element-first, so the operation is `flip`ped before it is handed over.
|
|
64
|
+
*
|
|
65
|
+
* @template T The type of the elements in the monoid.
|
|
66
|
+
* @param monoid The monoid structure, including the identity and binary operation.
|
|
67
|
+
* @returns A function that reduces a `List<T>` to a single `T`.
|
|
68
|
+
*
|
|
69
|
+
* @example
|
|
70
|
+
*
|
|
71
|
+
* ```ts
|
|
72
|
+
* const add: Monoid<number> = {
|
|
73
|
+
* identity: 0,
|
|
74
|
+
* operation: a => b => a + b,
|
|
75
|
+
* };
|
|
76
|
+
*
|
|
77
|
+
* fold(add)([1, 2, 3, 4]) // 10
|
|
78
|
+
* fold(add)([]) // 0
|
|
79
|
+
*
|
|
80
|
+
* const concat: Monoid<string> = {
|
|
81
|
+
* identity: '',
|
|
82
|
+
* operation: a => b => a + b,
|
|
83
|
+
* };
|
|
84
|
+
*
|
|
85
|
+
* fold(concat)(['a', 'b', 'c']) // 'abc' — order preserved
|
|
86
|
+
* ```
|
|
87
|
+
*/
|
|
88
|
+
export const fold = ({ identity, operation }) => reduce(flip(operation))(identity);
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { repeat, fold } from "./module.f.js";
|
|
2
|
+
import { assertEq } from '../../asserts/module.f.js';
|
|
3
|
+
export const proof = {
|
|
4
|
+
numberAdd: () => {
|
|
5
|
+
const add = {
|
|
6
|
+
identity: 0,
|
|
7
|
+
operation: a => b => a + b,
|
|
8
|
+
};
|
|
9
|
+
const resultAdd = repeat(add)(10n)(2); // 20
|
|
10
|
+
assertEq(resultAdd, 20);
|
|
11
|
+
const id = repeat(add)(0n)(42);
|
|
12
|
+
assertEq(id, 0);
|
|
13
|
+
},
|
|
14
|
+
stringConcat: () => {
|
|
15
|
+
const concat = {
|
|
16
|
+
identity: '',
|
|
17
|
+
operation: a => b => a + b,
|
|
18
|
+
};
|
|
19
|
+
const resultConcat = repeat(concat)(3n)('ha'); // 'hahaha'
|
|
20
|
+
assertEq(resultConcat, 'hahaha');
|
|
21
|
+
},
|
|
22
|
+
fold: {
|
|
23
|
+
nonEmpty: () => {
|
|
24
|
+
const add = {
|
|
25
|
+
identity: 0,
|
|
26
|
+
operation: a => b => a + b,
|
|
27
|
+
};
|
|
28
|
+
assertEq(fold(add)([1, 2, 3, 4]), 10);
|
|
29
|
+
},
|
|
30
|
+
order: () => {
|
|
31
|
+
// a non-commutative monoid: `fold` must preserve left-to-right order
|
|
32
|
+
// (`((('' + 'a') + 'b') + 'c')`), not reverse it to `'cba'`.
|
|
33
|
+
const concat = {
|
|
34
|
+
identity: '',
|
|
35
|
+
operation: a => b => a + b,
|
|
36
|
+
};
|
|
37
|
+
assertEq(fold(concat)(['a', 'b', 'c']), 'abc');
|
|
38
|
+
},
|
|
39
|
+
empty: () => {
|
|
40
|
+
const concat = {
|
|
41
|
+
identity: '',
|
|
42
|
+
operation: a => b => a + b,
|
|
43
|
+
};
|
|
44
|
+
// an empty list folds to the identity
|
|
45
|
+
assertEq(fold(concat)([]), '');
|
|
46
|
+
},
|
|
47
|
+
}
|
|
48
|
+
};
|
|
@@ -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.
|