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
|
@@ -42,7 +42,7 @@ export const flat = () => {
|
|
|
42
42
|
const [e0, e1, e2] = events;
|
|
43
43
|
assert(e0[0] === 'result' && e0[2][0] === 'a');
|
|
44
44
|
assert(e1[0] === 'result' && e1[2][0] === 'b');
|
|
45
|
-
|
|
45
|
+
assert(e2[0] === 'summary');
|
|
46
46
|
const [, pass, fail] = e2;
|
|
47
47
|
assertEq(pass, 2);
|
|
48
48
|
assertEq(fail, 0);
|
|
@@ -56,7 +56,7 @@ export const nested = () => {
|
|
|
56
56
|
const [e0, e1, e2] = events;
|
|
57
57
|
assert(e0[0] === 'result' && e0[2][1] === 'add');
|
|
58
58
|
assert(e1[0] === 'result' && e1[2][1] === 'sub');
|
|
59
|
-
|
|
59
|
+
assert(e2[0] === 'summary');
|
|
60
60
|
const [, pass, fail] = e2;
|
|
61
61
|
assertEq(pass, 2);
|
|
62
62
|
assertEq(fail, 0);
|
|
@@ -69,7 +69,7 @@ export const throwKey = () => {
|
|
|
69
69
|
assertEq(exit, 0);
|
|
70
70
|
const [e0, e1] = events;
|
|
71
71
|
assert(e0[0] === 'result' && e0[2][0] === 'throw' && e0[2][1] === 'a');
|
|
72
|
-
|
|
72
|
+
assert(e1[0] === 'summary');
|
|
73
73
|
const [, pass, fail] = e1;
|
|
74
74
|
assertEq(pass, 1);
|
|
75
75
|
assertEq(fail, 0);
|
|
@@ -81,7 +81,7 @@ export const throwKeyFail = () => {
|
|
|
81
81
|
});
|
|
82
82
|
assertEq(exit, 1);
|
|
83
83
|
const [e0, e1] = events;
|
|
84
|
-
|
|
84
|
+
assert(e0[0] === 'result');
|
|
85
85
|
const [, pass, fail] = e1;
|
|
86
86
|
assertEq(pass, 0);
|
|
87
87
|
assertEq(fail, 1);
|
|
@@ -93,7 +93,7 @@ export const mixedPassFail = () => {
|
|
|
93
93
|
});
|
|
94
94
|
assertEq(exit, 1);
|
|
95
95
|
const summary = events[events.length - 1];
|
|
96
|
-
|
|
96
|
+
assert(summary[0] === 'summary');
|
|
97
97
|
const [, pass, fail] = summary;
|
|
98
98
|
assertEq(pass, 1);
|
|
99
99
|
assertEq(fail, 1);
|
|
@@ -218,41 +218,72 @@ export const githubReporterOutput = () => {
|
|
|
218
218
|
assertEq(exit, 1);
|
|
219
219
|
assertEq(stderr, '::error file=./s.proof.f.ts,line=1,title=import("./s.proof.f.ts").proof["a%3Ab%2Cc%25d"]()::oops\n');
|
|
220
220
|
};
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
221
|
+
const registerNoopCtx = { test: (_n, _o, _f) => Promise.resolve() };
|
|
222
|
+
/**
|
|
223
|
+
* Builds a synchronous mock runner for `registerModule`'s `Test`/`All`/`Await`
|
|
224
|
+
* effect operations. Only the `test` op varies between call sites (whether it
|
|
225
|
+
* invokes the registered callback), so `all`/`await` are shared here.
|
|
226
|
+
*/
|
|
227
|
+
const makeRegisterRunner = (testOp) => {
|
|
224
228
|
let runner;
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
const [ns, r] = runner(st)(e);
|
|
233
|
-
st = ns;
|
|
234
|
-
rs.push(r);
|
|
235
|
-
}
|
|
236
|
-
return [st, rs];
|
|
237
|
-
},
|
|
238
|
-
await: p => (s) => [s, [p]],
|
|
229
|
+
runner = mockRun({
|
|
230
|
+
test: (ctx, name, xf, fn) => testOp(runner, ctx, name, xf, fn),
|
|
231
|
+
all: (...effects) => (s) => effects.reduce(([st, rs], e) => {
|
|
232
|
+
const [ns, r] = runner(st)(e);
|
|
233
|
+
return [ns, [...rs, r]];
|
|
234
|
+
}, [s, []]),
|
|
235
|
+
await: (p) => (s) => [s, [p]],
|
|
239
236
|
});
|
|
240
|
-
runner
|
|
237
|
+
return runner;
|
|
238
|
+
};
|
|
239
|
+
// registerModule appends ' ...' for inline runners (Bun/Playwright).
|
|
240
|
+
// This mock never invokes the registered callback; it only records names.
|
|
241
|
+
export const registerSuffixes = () => {
|
|
242
|
+
const runner = makeRegisterRunner((_runner, _ctx, name, _xf, _fn) => (s) => [[...s, name], undefined]);
|
|
241
243
|
const proof = {
|
|
242
244
|
ok: () => { },
|
|
243
245
|
throw: { a: () => { throw 'expected'; } },
|
|
244
246
|
};
|
|
245
247
|
// Node (star = ''): no suffixes
|
|
246
|
-
const [nodeNames] = runner([])(registerModule(
|
|
248
|
+
const [nodeNames] = runner([])(registerModule(registerNoopCtx, './a.f.ts', proof, ''));
|
|
247
249
|
assertEq(nodeNames.length, 2);
|
|
248
|
-
|
|
250
|
+
assert(nodeNames[0] === 'import("./a.f.ts").proof.ok()');
|
|
249
251
|
assertEq(nodeNames[1], 'import("./a.f.ts").proof.throw.a()');
|
|
250
252
|
// Bun/Playwright (star = ' ...'): ... on normal tests, path shows throw for throw-tests
|
|
251
|
-
const [inlineNames] = runner([])(registerModule(
|
|
253
|
+
const [inlineNames] = runner([])(registerModule(registerNoopCtx, './a.f.ts', proof, ' ...'));
|
|
252
254
|
assertEq(inlineNames.length, 2);
|
|
253
|
-
|
|
255
|
+
assert(inlineNames[0] === 'import("./a.f.ts").proof.ok() ...');
|
|
254
256
|
assertEq(inlineNames[1], 'import("./a.f.ts").proof.throw.a()');
|
|
255
257
|
};
|
|
258
|
+
// A `throw`-tagged test whose function completes without throwing (the
|
|
259
|
+
// external framework, not this module, is responsible for turning that into
|
|
260
|
+
// a failure via `expectFailure`). registerModule's own callback must still
|
|
261
|
+
// short-circuit before walking the returned value for sub-tests: it invokes
|
|
262
|
+
// the callback and returns without recursing, rather than treating the
|
|
263
|
+
// returned object as a sub-tree.
|
|
264
|
+
export const registerThrowsWithoutThrowing = () => {
|
|
265
|
+
// Unlike registerSuffixes' mock, this one actually invokes the registered
|
|
266
|
+
// callback so registerOne's inner `.step` body runs, and asserts the
|
|
267
|
+
// callback is registered with `expectFailure: true`.
|
|
268
|
+
const runner = makeRegisterRunner((runner, ctx, name, xf, fn) => (s) => {
|
|
269
|
+
assert(xf);
|
|
270
|
+
const [ns] = runner(s)(fn(ctx));
|
|
271
|
+
return [[...ns, name], undefined];
|
|
272
|
+
});
|
|
273
|
+
// Returns a sub-tree that would register more tests if it were walked.
|
|
274
|
+
const proof = { throw: { a: () => ({ sub: () => { } }) } };
|
|
275
|
+
const [names] = runner([])(registerModule(registerNoopCtx, './a.f.ts', proof, ''));
|
|
276
|
+
// Only the throw-test itself is registered; `sub` is never reached.
|
|
277
|
+
assertEq(names.length, 1);
|
|
278
|
+
assertEq(names[0], 'import("./a.f.ts").proof.throw.a()');
|
|
279
|
+
};
|
|
280
|
+
// registerModule with an empty proof object registers zero tests and
|
|
281
|
+
// returns without invoking the mock's `test` op at all.
|
|
282
|
+
export const registerEmptyProof = () => {
|
|
283
|
+
const runner = makeRegisterRunner((_runner, _ctx, name, _xf, _fn) => (s) => [[...s, name], undefined]);
|
|
284
|
+
const [names] = runner([])(registerModule(registerNoopCtx, './a.f.ts', {}, ''));
|
|
285
|
+
assertEq(names.length, 0);
|
|
286
|
+
};
|
|
256
287
|
// direct unit tests for the pure path-format helpers
|
|
257
288
|
export const helpers = {
|
|
258
289
|
isInteger: () => {
|
|
@@ -361,6 +392,8 @@ export const proof = {
|
|
|
361
392
|
defaultReporterFailOutput,
|
|
362
393
|
githubReporterOutput,
|
|
363
394
|
registerSuffixes,
|
|
395
|
+
registerThrowsWithoutThrowing,
|
|
396
|
+
registerEmptyProof,
|
|
364
397
|
defaultReporterExpectedToThrow,
|
|
365
398
|
helpers
|
|
366
399
|
};
|
|
@@ -15,24 +15,18 @@ Object.getOwnPropertyDescriptor({ [name]: () => undefined }, name).value;
|
|
|
15
15
|
export const proof = {
|
|
16
16
|
a: () => {
|
|
17
17
|
const x = f('1');
|
|
18
|
-
|
|
19
|
-
throw x;
|
|
20
|
-
}
|
|
18
|
+
assertEq(x, '["1"]');
|
|
21
19
|
},
|
|
22
20
|
b: () => {
|
|
23
21
|
// exercises toInit: terminal returns empty output and loops back to init
|
|
24
22
|
const result = init(terminal);
|
|
25
|
-
|
|
26
|
-
throw result[0];
|
|
27
|
-
}
|
|
23
|
+
assertEq(result[0].length, 0, result[0]);
|
|
28
24
|
},
|
|
29
25
|
c: () => {
|
|
30
26
|
// exercises unexpectedSymbol: next state after a token returns an error message
|
|
31
27
|
const next = init(one('1'))[1];
|
|
32
28
|
const result = next(42);
|
|
33
|
-
|
|
34
|
-
throw result[0][0];
|
|
35
|
-
}
|
|
29
|
+
assertEq(result[0][0], 'unexpected symbol 42');
|
|
36
30
|
},
|
|
37
31
|
fn: () => {
|
|
38
32
|
const o = {
|
|
@@ -40,58 +34,42 @@ export const proof = {
|
|
|
40
34
|
};
|
|
41
35
|
const f = o["hello world!"];
|
|
42
36
|
const { name } = f;
|
|
43
|
-
|
|
44
|
-
throw name;
|
|
45
|
-
}
|
|
37
|
+
assertEq(name, "hello world!");
|
|
46
38
|
//
|
|
47
39
|
const f1 = { ["boring"]: () => undefined }["boring"];
|
|
48
|
-
|
|
49
|
-
throw f1.name;
|
|
50
|
-
}
|
|
40
|
+
assertEq(f1.name, "boring");
|
|
51
41
|
//
|
|
52
42
|
const x = fn(() => undefined, "hello").name;
|
|
53
|
-
|
|
54
|
-
throw x;
|
|
55
|
-
}
|
|
43
|
+
assertEq(x, "");
|
|
56
44
|
//
|
|
57
45
|
const m = withName("boring2").name;
|
|
58
|
-
|
|
59
|
-
throw m;
|
|
60
|
-
}
|
|
46
|
+
assertEq(m, "boring2");
|
|
61
47
|
//
|
|
62
48
|
const a = function x() { return undefined; };
|
|
63
|
-
|
|
64
|
-
throw a.name;
|
|
65
|
-
}
|
|
49
|
+
assertEq(a.name, "x");
|
|
66
50
|
},
|
|
67
51
|
//
|
|
68
52
|
f1: () => {
|
|
69
53
|
const m1 = () => undefined;
|
|
70
|
-
|
|
71
|
-
throw m1.name;
|
|
72
|
-
}
|
|
54
|
+
assertEq(m1.name, "m1");
|
|
73
55
|
},
|
|
74
56
|
//
|
|
75
57
|
f2: () => {
|
|
76
58
|
const m11 = (() => undefined);
|
|
77
|
-
|
|
78
|
-
throw m11.name;
|
|
79
|
-
}
|
|
59
|
+
assertEq(m11.name, "m11");
|
|
80
60
|
},
|
|
81
61
|
//
|
|
82
62
|
f3: () => {
|
|
83
63
|
const m2 = true ? () => undefined : () => undefined;
|
|
84
64
|
// for `bun` it is `m2`:
|
|
85
|
-
//
|
|
65
|
+
// assertEq(m2.name, "")
|
|
86
66
|
// see also https://github.com/oven-sh/bun/issues/20398
|
|
87
67
|
},
|
|
88
68
|
f4: () => {
|
|
89
69
|
const id = (i) => i;
|
|
90
70
|
const f = id(() => undefined);
|
|
91
71
|
// for `bun` it is `m2`:
|
|
92
|
-
|
|
93
|
-
throw f.name;
|
|
94
|
-
}
|
|
72
|
+
assertEq(f.name, "");
|
|
95
73
|
},
|
|
96
74
|
chars: {
|
|
97
75
|
whitespace: () => {
|
|
@@ -5,6 +5,7 @@ import { stringify } from '../media/json/module.f.js';
|
|
|
5
5
|
import { identity } from '../types/function/module.f.js';
|
|
6
6
|
import { toArray } from '../types/list/module.f.js';
|
|
7
7
|
import { stringToList } from '../text/utf16/module.f.js';
|
|
8
|
+
import { assertEq } from '../asserts/module.f.js';
|
|
8
9
|
const stringifyIdentity = stringify(identity);
|
|
9
10
|
const buildDfa = () => {
|
|
10
11
|
const lowercaseAlpha = toRange('az');
|
|
@@ -85,9 +86,7 @@ export const proof = {
|
|
|
85
86
|
'["id"]'
|
|
86
87
|
];
|
|
87
88
|
const expectedResult = stringifyIdentity(expectedOutput);
|
|
88
|
-
|
|
89
|
-
throw result;
|
|
90
|
-
}
|
|
89
|
+
assertEq(result, expectedResult);
|
|
91
90
|
},
|
|
92
91
|
() => {
|
|
93
92
|
const dfa = buildDfa();
|
|
@@ -99,9 +98,7 @@ export const proof = {
|
|
|
99
98
|
'["float"]'
|
|
100
99
|
];
|
|
101
100
|
const expectedResult = stringifyIdentity(expectedOutput);
|
|
102
|
-
|
|
103
|
-
throw result;
|
|
104
|
-
}
|
|
101
|
+
assertEq(result, expectedResult);
|
|
105
102
|
},
|
|
106
103
|
() => {
|
|
107
104
|
const dfa = buildDfa();
|
|
@@ -112,9 +109,7 @@ export const proof = {
|
|
|
112
109
|
'[]'
|
|
113
110
|
];
|
|
114
111
|
const expectedResult = stringifyIdentity(expectedOutput);
|
|
115
|
-
|
|
116
|
-
throw result;
|
|
117
|
-
}
|
|
112
|
+
assertEq(result, expectedResult);
|
|
118
113
|
},
|
|
119
114
|
() => {
|
|
120
115
|
const dfa = buildDfa();
|
|
@@ -125,9 +120,7 @@ export const proof = {
|
|
|
125
120
|
'[]'
|
|
126
121
|
];
|
|
127
122
|
const expectedResult = stringifyIdentity(expectedOutput);
|
|
128
|
-
|
|
129
|
-
throw result;
|
|
130
|
-
}
|
|
123
|
+
assertEq(result, expectedResult);
|
|
131
124
|
}
|
|
132
125
|
]
|
|
133
126
|
};
|
|
@@ -166,6 +166,13 @@ export type ToolEntry<O extends Operation> = {
|
|
|
166
166
|
* @returns A `ToolEntry` ready to be added to a registry
|
|
167
167
|
*/
|
|
168
168
|
export declare const toolEntry: <T extends Type, O extends Operation>(name: string, description: string, inputRtti: T, handle: (args: Ts<T>) => Effect<O, ToolsCallResult>) => ToolEntry<O>;
|
|
169
|
+
/**
|
|
170
|
+
* Helper to create a successful single-text-block tool result.
|
|
171
|
+
*
|
|
172
|
+
* @param text - The text to return to the client
|
|
173
|
+
* @returns A `ToolsCallResult` with the text content
|
|
174
|
+
*/
|
|
175
|
+
export declare const okResult: (text: string) => ToolsCallResult;
|
|
169
176
|
/**
|
|
170
177
|
* Helper to create a tool-level error result with plain text explanation.
|
|
171
178
|
*
|
|
@@ -9,13 +9,13 @@
|
|
|
9
9
|
*
|
|
10
10
|
* Each schema is both a runtime decoder (`validate(schema)`) and a static
|
|
11
11
|
* TypeScript type (`Ts<typeof schema>`). Transport framing (stdio) and the
|
|
12
|
-
* JSON-RPC dispatcher are in `
|
|
12
|
+
* JSON-RPC dispatcher are in `fjs/media/json/rpc/module.f.ts`.
|
|
13
13
|
*
|
|
14
14
|
* @module
|
|
15
15
|
*/
|
|
16
16
|
import { boolean, string, option, array, record, or } from '../types/rtti/module.f.js';
|
|
17
17
|
import { unknown } from '../media/json/module.f.js';
|
|
18
|
-
import { pure } from '../effects/module.f.js';
|
|
18
|
+
import { pure, step } from '../effects/module.f.js';
|
|
19
19
|
import { read, write } from '../effects/memory/module.f.js';
|
|
20
20
|
import { decodeRequest, rpcError, invalidRequest, invalidParams, methodNotFound, jsonrpc, } from '../media/json/rpc/module.f.js';
|
|
21
21
|
import { validate } from '../types/rtti/validate/module.f.js';
|
|
@@ -125,13 +125,20 @@ export const toolEntry = (name, description, inputRtti, handle) => ({
|
|
|
125
125
|
: handle(r);
|
|
126
126
|
}
|
|
127
127
|
});
|
|
128
|
+
/**
|
|
129
|
+
* Helper to create a successful single-text-block tool result.
|
|
130
|
+
*
|
|
131
|
+
* @param text - The text to return to the client
|
|
132
|
+
* @returns A `ToolsCallResult` with the text content
|
|
133
|
+
*/
|
|
134
|
+
export const okResult = (text) => ({ content: [{ type: 'text', text }] });
|
|
128
135
|
/**
|
|
129
136
|
* Helper to create a tool-level error result with plain text explanation.
|
|
130
137
|
*
|
|
131
138
|
* @param text - The error message to return to the client
|
|
132
139
|
* @returns A `ToolsCallResult` with `isError: true` and the text explanation
|
|
133
140
|
*/
|
|
134
|
-
export const errorResult = (text) => ({
|
|
141
|
+
export const errorResult = (text) => ({ ...okResult(text), isError: true });
|
|
135
142
|
/**
|
|
136
143
|
* Builds `McpHandlers` from a registry of tool entries.
|
|
137
144
|
*
|
|
@@ -204,8 +211,8 @@ export const mcpStep = ({ protocolVersion, capabilities, serverInfo, }) => (hand
|
|
|
204
211
|
// Malformed handshake — ignore it; the session stays gated.
|
|
205
212
|
return pure(null);
|
|
206
213
|
}
|
|
207
|
-
return read(stateKey)
|
|
208
|
-
? write(stateKey, ['initialized', true])
|
|
214
|
+
return step(read(stateKey), ([t]) => t === 'initializing'
|
|
215
|
+
? step(write(stateKey, ['initialized', true]), () => pure(null))
|
|
209
216
|
: pure(null));
|
|
210
217
|
}
|
|
211
218
|
return pure(null);
|
|
@@ -220,7 +227,7 @@ export const mcpStep = ({ protocolVersion, capabilities, serverInfo, }) => (hand
|
|
|
220
227
|
}
|
|
221
228
|
// `initialize` transitions uninitialized → initializing; reject if already done.
|
|
222
229
|
if (method === 'initialize') {
|
|
223
|
-
return read(stateKey)
|
|
230
|
+
return step(read(stateKey), ([t]) => {
|
|
224
231
|
if (t !== 'uninitialized') {
|
|
225
232
|
return pure(_errResponse(id)(invalidRequest));
|
|
226
233
|
}
|
|
@@ -233,11 +240,11 @@ export const mcpStep = ({ protocolVersion, capabilities, serverInfo, }) => (hand
|
|
|
233
240
|
capabilities,
|
|
234
241
|
serverInfo,
|
|
235
242
|
};
|
|
236
|
-
return write(stateKey, ['initializing'])
|
|
243
|
+
return step(write(stateKey, ['initializing']), () => pure(_okResponse(id)(result)));
|
|
237
244
|
});
|
|
238
245
|
}
|
|
239
246
|
// All other methods require fully initialized state — read it first.
|
|
240
|
-
return read(stateKey)
|
|
247
|
+
return step(read(stateKey), ([t]) => {
|
|
241
248
|
if (t !== 'initialized') {
|
|
242
249
|
return pure(_errResponse(id)(notInitialized));
|
|
243
250
|
}
|
|
@@ -249,7 +256,7 @@ export const mcpStep = ({ protocolVersion, capabilities, serverInfo, }) => (hand
|
|
|
249
256
|
const [t, pr] = validate(toolsListParams)(params === undefined ? {} : params);
|
|
250
257
|
return t === 'error'
|
|
251
258
|
? pure(_errResponse(id)(invalidParams))
|
|
252
|
-
: handlers.toolsList(pr)
|
|
259
|
+
: step(handlers.toolsList(pr), r => pure(_okResponse(id)(r)));
|
|
253
260
|
}
|
|
254
261
|
if (method === 'tools/call') {
|
|
255
262
|
if (capabilities.tools === undefined) {
|
|
@@ -258,7 +265,7 @@ export const mcpStep = ({ protocolVersion, capabilities, serverInfo, }) => (hand
|
|
|
258
265
|
const [t, pr] = validate(toolsCallParams)(params);
|
|
259
266
|
return t === 'error'
|
|
260
267
|
? pure(_errResponse(id)(invalidParams))
|
|
261
|
-
: handlers.toolsCall(pr)
|
|
268
|
+
: step(handlers.toolsCall(pr), r => pure(_okResponse(id)(r)));
|
|
262
269
|
}
|
|
263
270
|
return pure(_errResponse(id)(methodNotFound));
|
|
264
271
|
});
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { assert, assertEq } from '../asserts/module.f.js';
|
|
2
|
-
import { pure } from '../effects/module.f.js';
|
|
2
|
+
import { pure, step } from '../effects/module.f.js';
|
|
3
|
+
import { eff } from '../effects/eff/module.f.js';
|
|
3
4
|
import { run } from '../effects/mock/module.f.js';
|
|
4
5
|
import { asBase, asNominal, create, read } from '../effects/memory/module.f.js';
|
|
5
6
|
import { uninitializedState, mcpStep, notInitialized, } from './module.f.js';
|
|
@@ -36,11 +37,11 @@ const runMem = (effect) => run(mock)(initial)(effect)[1];
|
|
|
36
37
|
// O flows through McpHandlers<never>, so we cast the widened type down to MemOp.
|
|
37
38
|
const asMemEffect = (e) => e;
|
|
38
39
|
// Run one step from uninitializedState, return [response, newState].
|
|
39
|
-
const step1 = (cfg) => (msg) => runMem(asMemEffect(create(uninitializedState)
|
|
40
|
+
const step1 = (cfg) => (msg) => runMem(asMemEffect(step(create(uninitializedState), key => step(mcpStep(cfg)(handlers)(key)(msg), resp => step(read(key), state => pure([resp, state]))))));
|
|
40
41
|
// Run initialize then a second step, return [response, newState] of the second.
|
|
41
|
-
const step2 = (cfg) => (msg1) => (msg2) => runMem(asMemEffect(create(uninitializedState).step(key => mcpStep(cfg)(handlers)(key)(msg1).step(() => mcpStep(cfg)(handlers)(key)(msg2).step(resp => read(key)
|
|
42
|
+
const step2 = (cfg) => (msg1) => (msg2) => runMem(asMemEffect(eff(create(uninitializedState)).step(key => eff(mcpStep(cfg)(handlers)(key)(msg1)).step(() => eff(mcpStep(cfg)(handlers)(key)(msg2)).step(resp => step(read(key), state => pure([resp, state]))).value).value).value));
|
|
42
43
|
// Run initialize, notifications/initialized, then a third step; return [response, newState] of the third.
|
|
43
|
-
const step3 = (cfg) => (msg1) => (msg2) => (msg3) => runMem(asMemEffect(create(uninitializedState).step(key => mcpStep(cfg)(handlers)(key)(msg1).step(() => mcpStep(cfg)(handlers)(key)(msg2).step(() => mcpStep(cfg)(handlers)(key)(msg3).step(resp => read(key).step(state => pure([resp, state]))))))));
|
|
44
|
+
const step3 = (cfg) => (msg1) => (msg2) => (msg3) => runMem(asMemEffect(eff(create(uninitializedState)).step(key => eff(mcpStep(cfg)(handlers)(key)(msg1)).step(() => eff(mcpStep(cfg)(handlers)(key)(msg2)).step(() => eff(mcpStep(cfg)(handlers)(key)(msg3)).step(resp => eff(read(key)).step(state => pure([resp, state])).value).value).value).value).value));
|
|
44
45
|
// ── Test messages ─────────────────────────────────────────────────────────────
|
|
45
46
|
const initMsg = { jsonrpc: '2.0', method: 'initialize', id: 1,
|
|
46
47
|
params: { protocolVersion: '2024-11-05', capabilities: {}, clientInfo: { name: 'client', version: '0.0.1' } } };
|
|
@@ -49,16 +50,16 @@ const initNotif = { jsonrpc: '2.0', method: 'notifications/initialized' };
|
|
|
49
50
|
export const proof = {
|
|
50
51
|
lifecycle: {
|
|
51
52
|
initialStateIsUninitialized: () => {
|
|
52
|
-
|
|
53
|
+
assert(uninitializedState[0] === 'uninitialized');
|
|
53
54
|
},
|
|
54
55
|
initializeTransitionsToInitializing: () => {
|
|
55
56
|
const [, newState] = step1(config)(initMsg);
|
|
56
|
-
|
|
57
|
+
assert(newState[0] === 'initializing');
|
|
57
58
|
},
|
|
58
59
|
initializedNotificationTransitionsToInitialized: () => {
|
|
59
60
|
const [resp, newState] = step2(config)(initMsg)(initNotif);
|
|
60
61
|
assertEq(resp, null);
|
|
61
|
-
|
|
62
|
+
assert(newState[0] === 'initialized');
|
|
62
63
|
},
|
|
63
64
|
initializeReturnsResult: () => {
|
|
64
65
|
const [resp] = step1(config)(initMsg);
|
|
@@ -69,12 +70,12 @@ export const proof = {
|
|
|
69
70
|
initializeWithBadParamsReturnsInvalidParams: () => {
|
|
70
71
|
const bad = { jsonrpc: '2.0', method: 'initialize', id: 2, params: { wrong: true } };
|
|
71
72
|
const [resp, newState] = step1(config)(bad);
|
|
72
|
-
|
|
73
|
+
assert(newState[0] === 'uninitialized');
|
|
73
74
|
assertEq(resp.error.code, -32602);
|
|
74
75
|
},
|
|
75
76
|
notificationBeforeInitReturnNull: () => {
|
|
76
77
|
const [resp, newState] = step1(config)(initNotif);
|
|
77
|
-
|
|
78
|
+
assert(newState[0] === 'uninitialized');
|
|
78
79
|
assertEq(resp, null);
|
|
79
80
|
},
|
|
80
81
|
unknownNotificationReturnNull: () => {
|
|
@@ -84,19 +85,19 @@ export const proof = {
|
|
|
84
85
|
},
|
|
85
86
|
doubleInitializeReturnsInvalidRequest: () => {
|
|
86
87
|
const [resp, newState] = step2(config)(initMsg)(initMsg);
|
|
87
|
-
|
|
88
|
+
assert(newState[0] === 'initializing');
|
|
88
89
|
assertEq(resp.error.code, -32600);
|
|
89
90
|
},
|
|
90
91
|
pingBeforeInitSucceeds: () => {
|
|
91
92
|
const msg = { jsonrpc: '2.0', method: 'ping', id: 11 };
|
|
92
93
|
const [resp, newState] = step1(config)(msg);
|
|
93
|
-
|
|
94
|
+
assert(newState[0] === 'uninitialized');
|
|
94
95
|
assert(!('error' in resp));
|
|
95
96
|
},
|
|
96
97
|
pingDuringInitializingSucceeds: () => {
|
|
97
98
|
const msg = { jsonrpc: '2.0', method: 'ping', id: 12 };
|
|
98
99
|
const [resp, newState] = step2(config)(initMsg)(msg);
|
|
99
|
-
|
|
100
|
+
assert(newState[0] === 'initializing');
|
|
100
101
|
assert(!('error' in resp));
|
|
101
102
|
},
|
|
102
103
|
pingAfterInitSucceeds: () => {
|
|
@@ -118,24 +119,24 @@ export const proof = {
|
|
|
118
119
|
const notif = { jsonrpc: '2.0', method: 'notifications/initialized', params: {} };
|
|
119
120
|
const [resp, newState] = step2(config)(initMsg)(notif);
|
|
120
121
|
assertEq(resp, null);
|
|
121
|
-
|
|
122
|
+
assert(newState[0] === 'initialized');
|
|
122
123
|
},
|
|
123
124
|
initializedNotificationBadParamsIgnored: () => {
|
|
124
125
|
const notif = { jsonrpc: '2.0', method: 'notifications/initialized', params: 1 };
|
|
125
126
|
const [resp, newState] = step2(config)(initMsg)(notif);
|
|
126
127
|
assertEq(resp, null);
|
|
127
|
-
|
|
128
|
+
assert(newState[0] === 'initializing');
|
|
128
129
|
},
|
|
129
130
|
methodBeforeInitReturnsNotInitialized: () => {
|
|
130
131
|
const msg = { jsonrpc: '2.0', method: 'tools/list', id: 3 };
|
|
131
132
|
const [resp, newState] = step1(config)(msg);
|
|
132
|
-
|
|
133
|
+
assert(newState[0] === 'uninitialized');
|
|
133
134
|
assertEq(resp.error.code, notInitialized.code);
|
|
134
135
|
},
|
|
135
136
|
methodDuringInitializingReturnsNotInitialized: () => {
|
|
136
137
|
const msg = { jsonrpc: '2.0', method: 'tools/list', id: 16 };
|
|
137
138
|
const [resp, newState] = step2(config)(initMsg)(msg);
|
|
138
|
-
|
|
139
|
+
assert(newState[0] === 'initializing');
|
|
139
140
|
assertEq(resp.error.code, notInitialized.code);
|
|
140
141
|
},
|
|
141
142
|
invalidEnvelopeReturnsInvalidRequest: () => {
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
* stdio transport for JSON-RPC / MCP servers.
|
|
3
3
|
*
|
|
4
4
|
* `stdioTransport` wraps a step function — the `mcpStep`-shaped
|
|
5
|
-
* `(value) => Effect<O, Response | null>` from `
|
|
5
|
+
* `(value) => Effect<O, Response | null>` from `fjs/mcp/module.f.ts` — in the
|
|
6
6
|
* canonical read → parse → dispatch → write loop, expressed as a recursive
|
|
7
7
|
* effect so it stays in the pure effect model and is fully testable against a
|
|
8
|
-
* mock stdin / stdout (see `
|
|
8
|
+
* mock stdin / stdout (see `fjs/effects/node/virtual`) with no real process.
|
|
9
9
|
*
|
|
10
10
|
* The loop only consumes `Read` (stdin, one byte at a time, via the pure
|
|
11
11
|
* `readLine` combinator) and emits `Write` (stdout) on top of whatever `O` the
|
|
@@ -39,9 +39,9 @@ import { type Response } from '../../media/json/rpc/module.f.ts';
|
|
|
39
39
|
*/
|
|
40
40
|
export type Step<O extends Operation> = (value: Unknown) => Effect<O, Response | null>;
|
|
41
41
|
/**
|
|
42
|
-
* Drives the read-parse-dispatch-write loop for `
|
|
42
|
+
* Drives the read-parse-dispatch-write loop for `handler` over stdin/stdout.
|
|
43
43
|
*
|
|
44
44
|
* Recurses after each handled line; terminates (resolving to `void`) when
|
|
45
45
|
* `readLine` reports EOF.
|
|
46
46
|
*/
|
|
47
|
-
export declare const stdioTransport: <O extends Operation>(
|
|
47
|
+
export declare const stdioTransport: <O extends Operation>(handler: Step<O>) => Effect<Read | Write | O, void>;
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
* stdio transport for JSON-RPC / MCP servers.
|
|
3
3
|
*
|
|
4
4
|
* `stdioTransport` wraps a step function — the `mcpStep`-shaped
|
|
5
|
-
* `(value) => Effect<O, Response | null>` from `
|
|
5
|
+
* `(value) => Effect<O, Response | null>` from `fjs/mcp/module.f.ts` — in the
|
|
6
6
|
* canonical read → parse → dispatch → write loop, expressed as a recursive
|
|
7
7
|
* effect so it stays in the pure effect model and is fully testable against a
|
|
8
|
-
* mock stdin / stdout (see `
|
|
8
|
+
* mock stdin / stdout (see `fjs/effects/node/virtual`) with no real process.
|
|
9
9
|
*
|
|
10
10
|
* The loop only consumes `Read` (stdin, one byte at a time, via the pure
|
|
11
11
|
* `readLine` combinator) and emits `Write` (stdout) on top of whatever `O` the
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
*
|
|
30
30
|
* @module
|
|
31
31
|
*/
|
|
32
|
-
import { pure } from '../../effects/module.f.js';
|
|
32
|
+
import { pure, step } from '../../effects/module.f.js';
|
|
33
33
|
import { readLine, write } from '../../effects/node/module.f.js';
|
|
34
34
|
import { tryUtf8 } from '../../text/module.f.js';
|
|
35
35
|
import { stringToList } from '../../text/utf16/module.f.js';
|
|
@@ -49,24 +49,24 @@ const writeResponse = (resp) => {
|
|
|
49
49
|
const v = tryUtf8(stringifyJson(resp) + '\n');
|
|
50
50
|
return v === null
|
|
51
51
|
? pure(error(undefined))
|
|
52
|
-
: write('stdout', v)
|
|
52
|
+
: step(write('stdout', v), () => pure(ok(undefined)));
|
|
53
53
|
};
|
|
54
54
|
/**
|
|
55
|
-
* Drives the read-parse-dispatch-write loop for `
|
|
55
|
+
* Drives the read-parse-dispatch-write loop for `handler` over stdin/stdout.
|
|
56
56
|
*
|
|
57
57
|
* Recurses after each handled line; terminates (resolving to `void`) when
|
|
58
58
|
* `readLine` reports EOF.
|
|
59
59
|
*/
|
|
60
|
-
export const stdioTransport = (
|
|
60
|
+
export const stdioTransport = (handler) => step(readLine('stdin'), line => line === null
|
|
61
61
|
? pure(undefined)
|
|
62
|
-
: handleLine(
|
|
63
|
-
const handleLine = (
|
|
62
|
+
: handleLine(handler)(line));
|
|
63
|
+
const handleLine = (handler) => (line) => {
|
|
64
64
|
const [t, value] = parse(tokenize(stringToList(line)));
|
|
65
|
-
return (t === 'error'
|
|
65
|
+
return step(t === 'error'
|
|
66
66
|
? writeResponse(parseErrorResponse)
|
|
67
|
-
: step(value)
|
|
67
|
+
: step(handler(value), resp => resp === null
|
|
68
68
|
? pure(undefined)
|
|
69
|
-
: writeResponse(resp)
|
|
69
|
+
: step(writeResponse(resp), ([t2]) => t2 === 'error'
|
|
70
70
|
// The real response didn't fit. Retry with a fixed, small
|
|
71
71
|
// internal-error body carrying `resp.id` — but a
|
|
72
72
|
// caller-controlled `id` (e.g. a very large string) can
|
|
@@ -74,8 +74,8 @@ const handleLine = (step) => (line) => {
|
|
|
74
74
|
// that retry is bounded by one more: an `id: null`
|
|
75
75
|
// internal-error, whose fully-constant shape is the only
|
|
76
76
|
// line in this transport guaranteed to always encode.
|
|
77
|
-
? writeResponse(internalErrorResponse(resp.id))
|
|
78
|
-
? writeResponse(internalErrorResponse(null))
|
|
77
|
+
? step(writeResponse(internalErrorResponse(resp.id)), ([t3]) => t3 === 'error'
|
|
78
|
+
? step(writeResponse(internalErrorResponse(null)), () => pure(undefined))
|
|
79
79
|
: pure(undefined))
|
|
80
|
-
: pure(undefined)))
|
|
80
|
+
: pure(undefined))), () => stdioTransport(handler));
|
|
81
81
|
};
|