functionalscript 0.37.0 → 0.38.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/{fs → fjs}/asn.1/proof.f.js +32 -94
- package/fjs/asserts/module.f.d.ts +36 -0
- package/fjs/asserts/module.f.js +39 -0
- package/fjs/asserts/proof.f.d.ts +11 -0
- package/fjs/asserts/proof.f.js +18 -0
- package/{fs → fjs}/base_n/proof.f.js +12 -36
- package/{fs → fjs}/basen/base64/proof.f.d.ts +1 -0
- package/{fs → fjs}/basen/base64/proof.f.js +15 -1
- package/{fs → fjs}/basen/cbase32/proof.f.js +15 -42
- package/fjs/bnf/data/module.f.d.ts +52 -0
- package/{fs → fjs}/bnf/data/module.f.js +53 -3
- package/{fs → fjs}/bnf/data/proof.f.d.ts +1 -0
- package/{fs → fjs}/bnf/data/proof.f.js +54 -19
- package/{fs → fjs}/bnf/descent/module.f.d.ts +4 -14
- package/fjs/bnf/descent/module.f.js +124 -0
- package/{fs → fjs}/bnf/descent/proof.f.d.ts +1 -0
- package/{fs → fjs}/bnf/descent/proof.f.js +55 -24
- package/{fs → fjs}/bnf/ll1/module.f.d.ts +4 -4
- package/{fs → fjs}/bnf/ll1/module.f.js +7 -5
- package/{fs → fjs}/bnf/ll1/proof.f.d.ts +1 -0
- package/{fs → fjs}/bnf/ll1/proof.f.js +27 -10
- package/{fs → fjs}/bnf/module.f.d.ts +19 -5
- package/{fs → fjs}/bnf/module.f.js +10 -11
- package/fjs/bnf/proof.f.js +69 -0
- package/{fs → fjs}/bnf/testlib.f.js +2 -2
- package/{fs → fjs}/cas/cli/proof.f.d.ts +4 -1
- package/{fs → fjs}/cas/cli/proof.f.js +29 -66
- package/fjs/cas/evo/mcp/module.f.d.ts +19 -0
- package/fjs/cas/evo/mcp/module.f.js +56 -0
- package/fjs/cas/evo/mcp/proof.f.d.ts +9 -0
- package/fjs/cas/evo/mcp/proof.f.js +95 -0
- package/fjs/cas/evo/module.f.d.ts +138 -0
- package/fjs/cas/evo/module.f.js +309 -0
- package/fjs/cas/evo/proof.f.d.ts +32 -0
- package/fjs/cas/evo/proof.f.js +453 -0
- package/fjs/cas/mcp/module.f.d.ts +49 -0
- package/{fs → fjs}/cas/mcp/module.f.js +54 -76
- package/{fs → fjs}/cas/mcp/proof.f.d.ts +4 -1
- package/{fs → fjs}/cas/mcp/proof.f.js +41 -13
- package/{fs → fjs}/cas/module.f.d.ts +10 -0
- package/{fs → fjs}/cas/module.f.js +27 -1
- package/{fs → fjs}/cas/proof.f.d.ts +4 -0
- package/{fs → fjs}/cas/proof.f.js +77 -86
- package/{fs → fjs}/ci/config/module.f.d.ts +5 -5
- package/{fs → fjs}/ci/config/module.f.js +5 -5
- package/{fs → fjs}/ci/proof.f.js +14 -9
- package/{fs → fjs}/ci/rust/module.f.js +9 -1
- package/{fs → fjs}/cli/proof.f.js +22 -63
- package/{fs → fjs}/common/monoid/proof.f.js +4 -9
- package/{fs → fjs}/crypto/hmac/proof.f.js +4 -12
- package/fjs/crypto/pow/proof.f.js +111 -0
- package/{fs → fjs}/crypto/secp/proof.f.js +12 -33
- package/{fs → fjs}/crypto/sha2/proof.f.js +18 -49
- package/{fs → fjs}/crypto/sign/module.f.d.ts +0 -5
- package/{fs → fjs}/crypto/sign/module.f.js +7 -4
- package/{fs → fjs}/crypto/sign/proof.f.js +36 -105
- package/{fs → fjs}/crypto/vdf/proof.f.js +22 -63
- package/{fs → fjs}/dev/package_json/proof.f.js +7 -7
- package/{fs → fjs}/dev/proof.f.js +2 -4
- package/{fs → fjs}/djs/ast/proof.f.js +4 -12
- package/{fs → fjs}/djs/parser/module.f.d.ts +5 -0
- package/{fs → fjs}/djs/parser/module.f.js +20 -0
- package/{fs → fjs}/djs/parser/proof.f.js +138 -400
- package/{fs → fjs}/djs/proof.f.js +13 -36
- package/{fs → fjs}/djs/serializer/proof.f.js +14 -39
- package/fjs/djs/tokenizer/module.f.d.ts +24 -0
- package/fjs/djs/tokenizer/module.f.js +472 -0
- package/{fs/djs/tokenizer-new → fjs/djs/tokenizer}/proof.f.d.ts +4 -3
- package/{fs/djs/tokenizer-new → fjs/djs/tokenizer}/proof.f.js +446 -445
- package/{fs → fjs}/djs/transpiler/proof.f.d.ts +3 -0
- package/{fs → fjs}/djs/transpiler/proof.f.js +29 -30
- package/{fs → fjs}/effects/memory/proof.f.js +8 -21
- package/{fs → fjs}/effects/node/memory/proof.js +5 -12
- package/{fs → fjs}/effects/node/module.d.ts +1 -1
- package/{fs → fjs}/effects/node/module.f.d.ts +1 -1
- package/{fs → fjs}/effects/node/module.js +3 -3
- package/{fs → fjs}/effects/node/proof.f.d.ts +1 -0
- package/{fs → fjs}/effects/node/proof.f.js +106 -292
- package/{fs → fjs}/effects/node/virtual/proof.f.d.ts +1 -0
- package/{fs → fjs}/effects/node/virtual/proof.f.js +36 -29
- package/{fs → fjs}/effects/proof.f.js +16 -45
- package/{fs → fjs}/emergent_testing/proof.f.js +7 -7
- package/{fs → fjs}/fsc/proof.f.js +12 -34
- package/{fs → fjs}/fsm/proof.f.js +5 -12
- package/{fs → fjs}/mcp/module.f.d.ts +7 -0
- package/{fs → fjs}/mcp/module.f.js +9 -2
- package/{fs → fjs}/mcp/proof.f.js +12 -12
- package/{fs → fjs}/mcp/stdio/module.f.d.ts +2 -2
- package/{fs → fjs}/mcp/stdio/module.f.js +2 -2
- package/{fs → fjs}/media/html/proof.f.js +12 -33
- package/{fs → fjs}/media/json/parser/module.f.d.ts +5 -0
- package/{fs → fjs}/media/json/parser/module.f.js +14 -0
- package/{fs → fjs}/media/json/parser/proof.f.js +39 -114
- package/{fs → fjs}/media/json/rpc/module.f.js +1 -1
- package/{fs → fjs}/media/json/schema/module.f.d.ts +2 -2
- package/{fs → fjs}/media/json/schema/module.f.js +23 -39
- package/{fs → fjs}/media/json/schema/proof.f.js +3 -6
- package/{fs → fjs}/media/json/serializer/proof.f.js +10 -27
- package/{fs → fjs}/media/module.f.d.ts +6 -6
- package/{fs → fjs}/media/module.f.js +3 -4
- package/{fs → fjs}/media/proof.f.js +5 -4
- package/{fs → fjs}/media/revision/module.f.d.ts +31 -4
- package/{fs → fjs}/media/revision/module.f.js +35 -23
- package/{fs → fjs}/media/revision/proof.f.d.ts +10 -8
- package/fjs/media/revision/proof.f.js +140 -0
- package/{fs → fjs}/media/type/proof.f.js +2 -6
- package/{fs → fjs}/module.f.js +1 -1
- package/{fs → fjs}/path/proof.f.js +27 -78
- package/{fs → fjs}/proof.f.js +2 -0
- package/{fs → fjs}/sul/id/proof.f.js +7 -21
- package/{fs → fjs}/sul/level/hash/proof.f.js +5 -5
- package/{fs → fjs}/sul/level/literal/proof.f.js +12 -26
- package/fjs/text/ascii/proof.f.d.ts +6 -0
- package/{fs → fjs}/text/ascii/proof.f.js +4 -14
- package/{fs → fjs}/text/code_point/module.f.js +10 -10
- package/{fs → fjs}/text/proof.f.js +4 -9
- package/{fs → fjs}/text/sgr/proof.f.js +6 -15
- package/{fs → fjs}/text/utf16/module.f.js +1 -1
- package/{fs → fjs}/text/utf16/proof.f.js +23 -66
- package/{fs → fjs}/text/utf8/proof.f.js +56 -125
- package/{fs → fjs}/types/array/proof.f.js +18 -52
- package/fjs/types/bigfloat/proof.f.js +217 -0
- package/{fs → fjs}/types/bigint/proof.f.js +49 -145
- package/{fs → fjs}/types/bit_vec/proof.f.js +72 -214
- package/{fs → fjs}/types/btree/find/proof.f.js +23 -66
- package/{fs → fjs}/types/btree/proof.f.js +5 -12
- package/{fs → fjs}/types/btree/remove/proof.f.d.ts +2 -0
- package/{fs → fjs}/types/btree/remove/proof.f.js +83 -230
- package/{fs → fjs}/types/btree/set/module.f.js +5 -2
- package/{fs → fjs}/types/btree/set/proof.f.js +35 -24
- package/{fs → fjs}/types/byte_set/proof.f.js +22 -63
- package/{fs → fjs}/types/function/compare/proof.f.js +13 -36
- package/{fs → fjs}/types/function/operator/proof.f.js +17 -48
- package/{fs → fjs}/types/function/proof.f.js +2 -3
- package/{fs → fjs}/types/list/proof.f.js +55 -163
- package/{fs → fjs}/types/map/proof.f.js +4 -12
- package/{fs → fjs}/types/nibble_set/proof.f.js +16 -45
- package/{fs → fjs}/types/nominal/proof.f.js +5 -10
- package/fjs/types/nullable/proof.f.js +29 -0
- package/{fs → fjs}/types/number/proof.f.js +9 -24
- package/{fs → fjs}/types/object/proof.f.js +3 -6
- package/{fs → fjs}/types/patricia_trie/proof.f.js +21 -21
- package/{fs → fjs}/types/prime_field/module.f.js +2 -7
- package/{fs → fjs}/types/range/module.f.d.ts +1 -1
- package/fjs/types/range/module.f.js +2 -0
- package/fjs/types/range/proof.f.js +9 -0
- package/{fs → fjs}/types/range_map/proof.f.js +28 -81
- package/{fs → fjs}/types/result/proof.f.d.ts +3 -2
- package/fjs/types/result/proof.f.js +31 -0
- package/{fs → fjs}/types/rtti/common/module.f.d.ts +36 -1
- package/{fs → fjs}/types/rtti/common/module.f.js +44 -0
- package/fjs/types/rtti/common/proof.f.d.ts +8 -0
- package/fjs/types/rtti/common/proof.f.js +51 -0
- package/{fs → fjs}/types/rtti/parse/module.f.js +13 -22
- package/{fs → fjs}/types/rtti/parse/proof.f.js +7 -18
- package/{fs → fjs}/types/rtti/ts/module.f.d.ts +10 -4
- package/{fs → fjs}/types/rtti/validate/module.f.js +8 -29
- package/{fs → fjs}/types/rtti/validate/proof.f.js +4 -9
- package/{fs → fjs}/types/sorted_list/proof.f.js +8 -21
- package/{fs → fjs}/types/sorted_set/proof.f.js +14 -39
- package/fjs/types/string/proof.f.js +77 -0
- package/fjs/types/string_set/proof.f.js +43 -0
- package/{fs → fjs}/types/ts/proof.f.js +15 -42
- package/{fs → fjs}/types/uint8array/module.f.js +7 -7
- package/{fs → fjs}/types/uint8array/proof.f.d.ts +4 -1
- package/{fs → fjs}/types/uint8array/proof.f.js +7 -7
- package/{fs → fjs}/website/proof.f.js +3 -6
- package/package.json +6 -6
- package/fs/asserts/module.f.d.ts +0 -4
- package/fs/asserts/module.f.js +0 -9
- package/fs/asserts/proof.f.d.ts +0 -8
- package/fs/asserts/proof.f.js +0 -51
- package/fs/bnf/data/module.f.d.ts +0 -30
- package/fs/bnf/descent/module.f.js +0 -119
- package/fs/bnf/proof.f.js +0 -104
- package/fs/cas/mcp/module.f.d.ts +0 -36
- package/fs/crypto/pow/proof.f.js +0 -161
- package/fs/djs/tokenizer/module.f.d.ts +0 -12
- package/fs/djs/tokenizer/module.f.js +0 -62
- package/fs/djs/tokenizer/proof.f.d.ts +0 -7
- package/fs/djs/tokenizer/proof.f.js +0 -543
- package/fs/djs/tokenizer-new/module.f.d.ts +0 -3
- package/fs/djs/tokenizer-new/module.f.js +0 -155
- package/fs/media/revision/proof.f.js +0 -119
- package/fs/text/ascii/proof.f.d.ts +0 -4
- package/fs/types/bigfloat/proof.f.js +0 -348
- package/fs/types/nullable/proof.f.js +0 -50
- package/fs/types/range/module.f.js +0 -2
- package/fs/types/range/proof.f.js +0 -18
- package/fs/types/result/proof.f.js +0 -52
- package/fs/types/string/proof.f.js +0 -118
- package/fs/types/string_set/proof.f.js +0 -82
- /package/{fs → fjs}/asn.1/module.f.d.ts +0 -0
- /package/{fs → fjs}/asn.1/module.f.js +0 -0
- /package/{fs → fjs}/asn.1/proof.f.d.ts +0 -0
- /package/{fs → fjs}/base_n/module.f.d.ts +0 -0
- /package/{fs → fjs}/base_n/module.f.js +0 -0
- /package/{fs → fjs}/base_n/proof.f.d.ts +0 -0
- /package/{fs → fjs}/basen/base128/module.f.d.ts +0 -0
- /package/{fs → fjs}/basen/base128/module.f.js +0 -0
- /package/{fs → fjs}/basen/base128/proof.f.d.ts +0 -0
- /package/{fs → fjs}/basen/base128/proof.f.js +0 -0
- /package/{fs → fjs}/basen/base64/module.f.d.ts +0 -0
- /package/{fs → fjs}/basen/base64/module.f.js +0 -0
- /package/{fs → fjs}/basen/cbase32/module.f.d.ts +0 -0
- /package/{fs → fjs}/basen/cbase32/module.f.js +0 -0
- /package/{fs → fjs}/basen/cbase32/proof.f.d.ts +0 -0
- /package/{fs → fjs}/bnf/proof.f.d.ts +0 -0
- /package/{fs → fjs}/bnf/testlib.f.d.ts +0 -0
- /package/{fs → fjs}/cas/cli/module.f.d.ts +0 -0
- /package/{fs → fjs}/cas/cli/module.f.js +0 -0
- /package/{fs → fjs}/ci/bun/module.f.d.ts +0 -0
- /package/{fs → fjs}/ci/bun/module.f.js +0 -0
- /package/{fs → fjs}/ci/common/module.f.d.ts +0 -0
- /package/{fs → fjs}/ci/common/module.f.js +0 -0
- /package/{fs → fjs}/ci/deno/module.f.d.ts +0 -0
- /package/{fs → fjs}/ci/deno/module.f.js +0 -0
- /package/{fs → fjs}/ci/module.f.d.ts +0 -0
- /package/{fs → fjs}/ci/module.f.js +0 -0
- /package/{fs → fjs}/ci/node/module.f.d.ts +0 -0
- /package/{fs → fjs}/ci/node/module.f.js +0 -0
- /package/{fs → fjs}/ci/playwright/module.f.d.ts +0 -0
- /package/{fs → fjs}/ci/playwright/module.f.js +0 -0
- /package/{fs → fjs}/ci/proof.f.d.ts +0 -0
- /package/{fs → fjs}/ci/rust/module.f.d.ts +0 -0
- /package/{fs → fjs}/cli/module.f.d.ts +0 -0
- /package/{fs → fjs}/cli/module.f.js +0 -0
- /package/{fs → fjs}/cli/proof.f.d.ts +0 -0
- /package/{fs → fjs}/common/monoid/module.f.d.ts +0 -0
- /package/{fs → fjs}/common/monoid/module.f.js +0 -0
- /package/{fs → fjs}/common/monoid/proof.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/hmac/module.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/hmac/module.f.js +0 -0
- /package/{fs → fjs}/crypto/hmac/proof.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/pow/module.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/pow/module.f.js +0 -0
- /package/{fs → fjs}/crypto/pow/proof.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/secp/module.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/secp/module.f.js +0 -0
- /package/{fs → fjs}/crypto/secp/proof.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/sha2/module.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/sha2/module.f.js +0 -0
- /package/{fs → fjs}/crypto/sha2/proof.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/sign/proof.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/vdf/module.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/vdf/module.f.js +0 -0
- /package/{fs → fjs}/crypto/vdf/proof.f.d.ts +0 -0
- /package/{fs → fjs}/dev/module.f.d.ts +0 -0
- /package/{fs → fjs}/dev/module.f.js +0 -0
- /package/{fs → fjs}/dev/package_json/module.f.d.ts +0 -0
- /package/{fs → fjs}/dev/package_json/module.f.js +0 -0
- /package/{fs → fjs}/dev/package_json/proof.f.d.ts +0 -0
- /package/{fs → fjs}/dev/proof.f.d.ts +0 -0
- /package/{fs → fjs}/djs/ast/module.f.d.ts +0 -0
- /package/{fs → fjs}/djs/ast/module.f.js +0 -0
- /package/{fs → fjs}/djs/ast/proof.f.d.ts +0 -0
- /package/{fs → fjs}/djs/examples/input.f.d.ts +0 -0
- /package/{fs → fjs}/djs/examples/input.f.js +0 -0
- /package/{fs → fjs}/djs/examples/m.f.d.ts +0 -0
- /package/{fs → fjs}/djs/examples/m.f.js +0 -0
- /package/{fs → fjs}/djs/module.f.d.ts +0 -0
- /package/{fs → fjs}/djs/module.f.js +0 -0
- /package/{fs → fjs}/djs/parser/proof.f.d.ts +0 -0
- /package/{fs → fjs}/djs/proof.f.d.ts +0 -0
- /package/{fs → fjs}/djs/serializer/module.f.d.ts +0 -0
- /package/{fs → fjs}/djs/serializer/module.f.js +0 -0
- /package/{fs → fjs}/djs/serializer/proof.f.d.ts +0 -0
- /package/{fs → fjs}/djs/transpiler/module.f.d.ts +0 -0
- /package/{fs → fjs}/djs/transpiler/module.f.js +0 -0
- /package/{fs → fjs}/effects/list/module.f.d.ts +0 -0
- /package/{fs → fjs}/effects/list/module.f.js +0 -0
- /package/{fs → fjs}/effects/memory/module.f.d.ts +0 -0
- /package/{fs → fjs}/effects/memory/module.f.js +0 -0
- /package/{fs → fjs}/effects/memory/proof.f.d.ts +0 -0
- /package/{fs → fjs}/effects/mock/module.f.d.ts +0 -0
- /package/{fs → fjs}/effects/mock/module.f.js +0 -0
- /package/{fs → fjs}/effects/module.d.ts +0 -0
- /package/{fs → fjs}/effects/module.f.d.ts +0 -0
- /package/{fs → fjs}/effects/module.f.js +0 -0
- /package/{fs → fjs}/effects/module.js +0 -0
- /package/{fs → fjs}/effects/node/memory/module.d.ts +0 -0
- /package/{fs → fjs}/effects/node/memory/module.js +0 -0
- /package/{fs → fjs}/effects/node/memory/proof.d.ts +0 -0
- /package/{fs → fjs}/effects/node/module.f.js +0 -0
- /package/{fs → fjs}/effects/node/virtual/module.f.d.ts +0 -0
- /package/{fs → fjs}/effects/node/virtual/module.f.js +0 -0
- /package/{fs → fjs}/effects/proof.f.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/all.test.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/all.test.js +0 -0
- /package/{fs → fjs}/emergent_testing/example.f.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/example.f.js +0 -0
- /package/{fs → fjs}/emergent_testing/module.f.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/module.f.js +0 -0
- /package/{fs → fjs}/emergent_testing/proof.f.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/all.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/all.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.fail.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.fail.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.pass.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.pass.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async.fail.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async.fail.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async.pass.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async.pass.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/fail.fail.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/fail.fail.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/return-value.pass.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/return-value.pass.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/thenable.pass.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/thenable.pass.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/thenable2.pass.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/thenable2.pass.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/throw.pass.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/throw.pass.js +0 -0
- /package/{fs → fjs}/fsc/bnf.f.d.ts +0 -0
- /package/{fs → fjs}/fsc/bnf.f.js +0 -0
- /package/{fs → fjs}/fsc/json.f.d.ts +0 -0
- /package/{fs → fjs}/fsc/json.f.js +0 -0
- /package/{fs → fjs}/fsc/module.f.d.ts +0 -0
- /package/{fs → fjs}/fsc/module.f.js +0 -0
- /package/{fs → fjs}/fsc/proof.f.d.ts +0 -0
- /package/{fs → fjs}/fsm/module.f.d.ts +0 -0
- /package/{fs → fjs}/fsm/module.f.js +0 -0
- /package/{fs → fjs}/fsm/proof.f.d.ts +0 -0
- /package/{fs → fjs}/js/tokenizer/module.f.d.ts +0 -0
- /package/{fs → fjs}/js/tokenizer/module.f.js +0 -0
- /package/{fs → fjs}/js/tokenizer/proof.f.d.ts +0 -0
- /package/{fs → fjs}/js/tokenizer/proof.f.js +0 -0
- /package/{fs → fjs}/mcp/proof.f.d.ts +0 -0
- /package/{fs → fjs}/mcp/stdio/proof.f.d.ts +0 -0
- /package/{fs → fjs}/mcp/stdio/proof.f.js +0 -0
- /package/{fs → fjs}/media/html/module.f.d.ts +0 -0
- /package/{fs → fjs}/media/html/module.f.js +0 -0
- /package/{fs → fjs}/media/html/proof.f.d.ts +0 -0
- /package/{fs → fjs}/media/json/module.f.d.ts +0 -0
- /package/{fs → fjs}/media/json/module.f.js +0 -0
- /package/{fs → fjs}/media/json/parser/proof.f.d.ts +0 -0
- /package/{fs → fjs}/media/json/proof.f.d.ts +0 -0
- /package/{fs → fjs}/media/json/proof.f.js +0 -0
- /package/{fs → fjs}/media/json/rpc/module.f.d.ts +0 -0
- /package/{fs → fjs}/media/json/rpc/proof.f.d.ts +0 -0
- /package/{fs → fjs}/media/json/rpc/proof.f.js +0 -0
- /package/{fs → fjs}/media/json/schema/proof.f.d.ts +0 -0
- /package/{fs → fjs}/media/json/serializer/module.f.d.ts +0 -0
- /package/{fs → fjs}/media/json/serializer/module.f.js +0 -0
- /package/{fs → fjs}/media/json/serializer/proof.f.d.ts +0 -0
- /package/{fs → fjs}/media/json/tokenizer/module.f.d.ts +0 -0
- /package/{fs → fjs}/media/json/tokenizer/module.f.js +0 -0
- /package/{fs → fjs}/media/json/tokenizer/proof.f.d.ts +0 -0
- /package/{fs → fjs}/media/json/tokenizer/proof.f.js +0 -0
- /package/{fs → fjs}/media/proof.f.d.ts +0 -0
- /package/{fs → fjs}/media/type/module.f.d.ts +0 -0
- /package/{fs → fjs}/media/type/module.f.js +0 -0
- /package/{fs → fjs}/media/type/proof.f.d.ts +0 -0
- /package/{fs → fjs}/module.d.ts +0 -0
- /package/{fs → fjs}/module.f.d.ts +0 -0
- /package/{fs → fjs}/module.js +0 -0
- /package/{fs → fjs}/path/module.f.d.ts +0 -0
- /package/{fs → fjs}/path/module.f.js +0 -0
- /package/{fs → fjs}/path/proof.f.d.ts +0 -0
- /package/{fs → fjs}/proof.f.d.ts +0 -0
- /package/{fs → fjs}/sul/id/module.f.d.ts +0 -0
- /package/{fs → fjs}/sul/id/module.f.js +0 -0
- /package/{fs → fjs}/sul/id/proof.f.d.ts +0 -0
- /package/{fs → fjs}/sul/level/hash/module.f.d.ts +0 -0
- /package/{fs → fjs}/sul/level/hash/module.f.js +0 -0
- /package/{fs → fjs}/sul/level/hash/proof.f.d.ts +0 -0
- /package/{fs → fjs}/sul/level/literal/module.f.d.ts +0 -0
- /package/{fs → fjs}/sul/level/literal/module.f.js +0 -0
- /package/{fs → fjs}/sul/level/literal/proof.f.d.ts +0 -0
- /package/{fs → fjs}/sul/module.f.d.ts +0 -0
- /package/{fs → fjs}/sul/module.f.js +0 -0
- /package/{fs → fjs}/sul/proof.f.d.ts +0 -0
- /package/{fs → fjs}/sul/proof.f.js +0 -0
- /package/{fs → fjs}/text/ascii/module.f.d.ts +0 -0
- /package/{fs → fjs}/text/ascii/module.f.js +0 -0
- /package/{fs → fjs}/text/code_point/module.f.d.ts +0 -0
- /package/{fs → fjs}/text/code_point/proof.f.d.ts +0 -0
- /package/{fs → fjs}/text/code_point/proof.f.js +0 -0
- /package/{fs → fjs}/text/module.f.d.ts +0 -0
- /package/{fs → fjs}/text/module.f.js +0 -0
- /package/{fs → fjs}/text/proof.f.d.ts +0 -0
- /package/{fs → fjs}/text/sgr/module.f.d.ts +0 -0
- /package/{fs → fjs}/text/sgr/module.f.js +0 -0
- /package/{fs → fjs}/text/sgr/proof.f.d.ts +0 -0
- /package/{fs → fjs}/text/utf16/module.f.d.ts +0 -0
- /package/{fs → fjs}/text/utf16/proof.f.d.ts +0 -0
- /package/{fs → fjs}/text/utf8/module.f.d.ts +0 -0
- /package/{fs → fjs}/text/utf8/module.f.js +0 -0
- /package/{fs → fjs}/text/utf8/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/array/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/array/module.f.js +0 -0
- /package/{fs → fjs}/types/array/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/bigfloat/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/bigfloat/module.f.js +0 -0
- /package/{fs → fjs}/types/bigfloat/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/bigint/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/bigint/module.f.js +0 -0
- /package/{fs → fjs}/types/bigint/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/bit_vec/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/bit_vec/module.f.js +0 -0
- /package/{fs → fjs}/types/bit_vec/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/find/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/find/module.f.js +0 -0
- /package/{fs → fjs}/types/btree/find/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/module.f.js +0 -0
- /package/{fs → fjs}/types/btree/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/remove/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/remove/module.f.js +0 -0
- /package/{fs → fjs}/types/btree/set/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/set/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/types/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/types/module.f.js +0 -0
- /package/{fs → fjs}/types/byte_set/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/byte_set/module.f.js +0 -0
- /package/{fs → fjs}/types/byte_set/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/function/compare/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/function/compare/module.f.js +0 -0
- /package/{fs → fjs}/types/function/compare/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/function/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/function/module.f.js +0 -0
- /package/{fs → fjs}/types/function/operator/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/function/operator/module.f.js +0 -0
- /package/{fs → fjs}/types/function/operator/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/function/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/list/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/list/module.f.js +0 -0
- /package/{fs → fjs}/types/list/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/map/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/map/module.f.js +0 -0
- /package/{fs → fjs}/types/map/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/nibble_set/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/nibble_set/module.f.js +0 -0
- /package/{fs → fjs}/types/nibble_set/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/nominal/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/nominal/module.f.js +0 -0
- /package/{fs → fjs}/types/nominal/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/nullable/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/nullable/module.f.js +0 -0
- /package/{fs → fjs}/types/nullable/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/number/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/number/module.f.js +0 -0
- /package/{fs → fjs}/types/number/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/object/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/object/module.f.js +0 -0
- /package/{fs → fjs}/types/object/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/option/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/option/module.f.js +0 -0
- /package/{fs → fjs}/types/ordered_map/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/ordered_map/module.f.js +0 -0
- /package/{fs → fjs}/types/ordered_map/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/ordered_map/proof.f.js +0 -0
- /package/{fs → fjs}/types/patricia_trie/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/patricia_trie/module.f.js +0 -0
- /package/{fs → fjs}/types/patricia_trie/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/phantom/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/phantom/module.f.js +0 -0
- /package/{fs → fjs}/types/prime_field/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/prime_field/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/prime_field/proof.f.js +0 -0
- /package/{fs → fjs}/types/range/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/range_map/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/range_map/module.f.js +0 -0
- /package/{fs → fjs}/types/range_map/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/result/module.d.ts +0 -0
- /package/{fs → fjs}/types/result/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/result/module.f.js +0 -0
- /package/{fs → fjs}/types/result/module.js +0 -0
- /package/{fs → fjs}/types/rtti/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/rtti/module.f.js +0 -0
- /package/{fs → fjs}/types/rtti/parse/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/rtti/parse/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/rtti/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/rtti/proof.f.js +0 -0
- /package/{fs → fjs}/types/rtti/ts/module.f.js +0 -0
- /package/{fs → fjs}/types/rtti/ts/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/rtti/ts/proof.f.js +0 -0
- /package/{fs → fjs}/types/rtti/validate/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/rtti/validate/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/sorted_list/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/sorted_list/module.f.js +0 -0
- /package/{fs → fjs}/types/sorted_list/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/sorted_set/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/sorted_set/module.f.js +0 -0
- /package/{fs → fjs}/types/sorted_set/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/string/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/string/module.f.js +0 -0
- /package/{fs → fjs}/types/string/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/string_set/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/string_set/module.f.js +0 -0
- /package/{fs → fjs}/types/string_set/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/ts/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/ts/module.f.js +0 -0
- /package/{fs → fjs}/types/ts/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/uint8array/module.f.d.ts +0 -0
- /package/{fs → fjs}/website/module.f.d.ts +0 -0
- /package/{fs → fjs}/website/module.f.js +0 -0
- /package/{fs → fjs}/website/proof.f.d.ts +0 -0
|
@@ -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
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { htmlToString } from "./module.f.js";
|
|
2
|
+
import { assertEq } from '../../asserts/module.f.js';
|
|
2
3
|
export const proof = {
|
|
3
4
|
empty: () => {
|
|
4
5
|
const r = htmlToString(['html']);
|
|
@@ -8,79 +9,57 @@ export const proof = {
|
|
|
8
9
|
},
|
|
9
10
|
empty2: () => {
|
|
10
11
|
const r = htmlToString(['html']);
|
|
11
|
-
|
|
12
|
-
throw r;
|
|
13
|
-
}
|
|
12
|
+
assertEq(r, '<!DOCTYPE html><html></html>');
|
|
14
13
|
},
|
|
15
14
|
void: () => {
|
|
16
15
|
const r = htmlToString(['area']);
|
|
17
|
-
|
|
18
|
-
throw r;
|
|
19
|
-
}
|
|
16
|
+
assertEq(r, '<!DOCTYPE html><area>');
|
|
20
17
|
},
|
|
21
18
|
some: () => {
|
|
22
19
|
const x = ['div', {}, '<div>&</div>', ['a', { href: 'hello"' }]];
|
|
23
20
|
const s = htmlToString(x);
|
|
24
|
-
|
|
25
|
-
throw s;
|
|
26
|
-
}
|
|
21
|
+
assertEq(s, '<!DOCTYPE html><div><div>&amp;</div><a href="hello""></a></div>');
|
|
27
22
|
},
|
|
28
23
|
some2: () => {
|
|
29
24
|
const x = ['div', '<div>&</div>', ['a', { href: 'hello"' }]];
|
|
30
25
|
const s = htmlToString(x);
|
|
31
|
-
|
|
32
|
-
throw s;
|
|
33
|
-
}
|
|
26
|
+
assertEq(s, '<!DOCTYPE html><div><div>&amp;</div><a href="hello""></a></div>');
|
|
34
27
|
},
|
|
35
28
|
someVoid: () => {
|
|
36
29
|
const x = ['div', ['br', { id: '5' }], '<div>&</div>', ['a', { href: 'hello"' }]];
|
|
37
30
|
const s = htmlToString(x);
|
|
38
|
-
|
|
39
|
-
throw s;
|
|
40
|
-
}
|
|
31
|
+
assertEq(s, '<!DOCTYPE html><div><br id="5"><div>&amp;</div><a href="hello""></a></div>');
|
|
41
32
|
},
|
|
42
33
|
raw: {
|
|
43
34
|
script: () => {
|
|
44
35
|
const x = ['script', { id: 'a<' }, 'const a = ', 'a<b>c'];
|
|
45
36
|
const s = htmlToString(x);
|
|
46
|
-
|
|
47
|
-
throw s;
|
|
48
|
-
}
|
|
37
|
+
assertEq(s, '<!DOCTYPE html><script id="a<">const a = a<b>c</script>');
|
|
49
38
|
},
|
|
50
39
|
scriptEsc: () => {
|
|
51
40
|
const x = ['script', { id: 'a<' }, '<', '/script>'];
|
|
52
41
|
const s = htmlToString(x);
|
|
53
|
-
|
|
54
|
-
throw s;
|
|
55
|
-
}
|
|
42
|
+
assertEq(s, '<!DOCTYPE html><script id="a<"><\\/script></script>');
|
|
56
43
|
},
|
|
57
44
|
style: () => {
|
|
58
45
|
const x = ['style', { id: 'a<' }, 'const a = ', 'a<b>c'];
|
|
59
46
|
const s = htmlToString(x);
|
|
60
|
-
|
|
61
|
-
throw s;
|
|
62
|
-
}
|
|
47
|
+
assertEq(s, '<!DOCTYPE html><style id="a<">const a = a<b>c</style>');
|
|
63
48
|
},
|
|
64
49
|
styleEsc: () => {
|
|
65
50
|
const x = ['style', { id: 'a<' }, '</', 'stYle>'];
|
|
66
51
|
const s = htmlToString(x);
|
|
67
|
-
|
|
68
|
-
throw s;
|
|
69
|
-
}
|
|
52
|
+
assertEq(s, '<!DOCTYPE html><style id="a<"><\\/stYle></style>');
|
|
70
53
|
},
|
|
71
54
|
noRaw: () => {
|
|
72
55
|
const x = ['div', { id: 'a<' }, 'const a = ', 'a<b>c'];
|
|
73
56
|
const s = htmlToString(x);
|
|
74
|
-
|
|
75
|
-
throw s;
|
|
76
|
-
}
|
|
57
|
+
assertEq(s, '<!DOCTYPE html><div id="a<">const a = a<b>c</div>');
|
|
77
58
|
},
|
|
78
59
|
elemChild: () => {
|
|
79
60
|
const x = ['script', ['span', 'ignored'], 'visible'];
|
|
80
61
|
const s = htmlToString(x);
|
|
81
|
-
|
|
82
|
-
throw s;
|
|
83
|
-
}
|
|
62
|
+
assertEq(s, '<!DOCTYPE html><script>visible</script>');
|
|
84
63
|
},
|
|
85
64
|
}
|
|
86
65
|
};
|
|
@@ -14,3 +14,8 @@ import { type Unknown } from '../module.f.ts';
|
|
|
14
14
|
* when the token sequence is invalid or incomplete.
|
|
15
15
|
*/
|
|
16
16
|
export declare const parse: (tokenList: List<JsonToken>) => Result<Unknown, string>;
|
|
17
|
+
export declare const proof: {
|
|
18
|
+
pushKey: {
|
|
19
|
+
nonObjectTop: () => void;
|
|
20
|
+
};
|
|
21
|
+
};
|
|
@@ -10,6 +10,7 @@ import {} from '../tokenizer/module.f.js';
|
|
|
10
10
|
import { setReplace } from '../../../types/ordered_map/module.f.js';
|
|
11
11
|
import {} from '../module.f.js';
|
|
12
12
|
import { fromMap } from '../../../types/object/module.f.js';
|
|
13
|
+
import { assertEq } from '../../../asserts/module.f.js';
|
|
13
14
|
const addKeyToObject = obj => key => ({ kind: 'object', values: obj.values, key: key });
|
|
14
15
|
const addValueToObject = obj => value => ({ kind: 'object', values: setReplace(obj.key)(value)(obj.values), key: '' });
|
|
15
16
|
const addToArray = array => value => ({ kind: 'array', values: concat(array.values)([value]) });
|
|
@@ -168,3 +169,16 @@ export const parse = tokenList => {
|
|
|
168
169
|
default: return error('unexpected end');
|
|
169
170
|
}
|
|
170
171
|
};
|
|
172
|
+
export const proof = {
|
|
173
|
+
pushKey: {
|
|
174
|
+
// `pushKey` is only ever invoked while `state.top` is an object (the
|
|
175
|
+
// state machine's `'{'`/`'{,'` statuses guarantee it), so its
|
|
176
|
+
// non-object guard is a defensive branch unreachable through `parse`.
|
|
177
|
+
// Call it directly to cover that branch.
|
|
178
|
+
nonObjectTop: () => {
|
|
179
|
+
const state = { status: '[', top: { kind: 'array', values: null }, stack: null };
|
|
180
|
+
const result = pushKey(state)('key');
|
|
181
|
+
assertEq(result.status, 'error');
|
|
182
|
+
},
|
|
183
|
+
},
|
|
184
|
+
};
|
|
@@ -4,6 +4,7 @@ import { toArray } from '../../../types/list/module.f.js';
|
|
|
4
4
|
import { stringify as jsonStringify } from '../module.f.js';
|
|
5
5
|
import { sort } from '../../../types/object/module.f.js';
|
|
6
6
|
import { stringToList } from '../../../text/utf16/module.f.js';
|
|
7
|
+
import { assertEq } from '../../../asserts/module.f.js';
|
|
7
8
|
const tokenizeString = s => toArray(tokenize(stringToList(s)));
|
|
8
9
|
const stringify = jsonStringify(sort);
|
|
9
10
|
export const proof = {
|
|
@@ -12,81 +13,61 @@ export const proof = {
|
|
|
12
13
|
const tokenList = tokenizeString('null');
|
|
13
14
|
const obj = parse(tokenList);
|
|
14
15
|
const result = stringify(obj);
|
|
15
|
-
|
|
16
|
-
throw result;
|
|
17
|
-
}
|
|
16
|
+
assertEq(result, '["ok",null]');
|
|
18
17
|
},
|
|
19
18
|
() => {
|
|
20
19
|
const tokenList = tokenizeString('true');
|
|
21
20
|
const obj = parse(tokenList);
|
|
22
21
|
const result = stringify(obj);
|
|
23
|
-
|
|
24
|
-
throw result;
|
|
25
|
-
}
|
|
22
|
+
assertEq(result, '["ok",true]');
|
|
26
23
|
},
|
|
27
24
|
() => {
|
|
28
25
|
const tokenList = tokenizeString('false');
|
|
29
26
|
const obj = parse(tokenList);
|
|
30
27
|
const result = stringify(obj);
|
|
31
|
-
|
|
32
|
-
throw result;
|
|
33
|
-
}
|
|
28
|
+
assertEq(result, '["ok",false]');
|
|
34
29
|
},
|
|
35
30
|
() => {
|
|
36
31
|
const tokenList = tokenizeString('0.1');
|
|
37
32
|
const obj = parse(tokenList);
|
|
38
33
|
const result = stringify(obj);
|
|
39
|
-
|
|
40
|
-
throw result;
|
|
41
|
-
}
|
|
34
|
+
assertEq(result, '["ok",0.1]');
|
|
42
35
|
},
|
|
43
36
|
() => {
|
|
44
37
|
const tokenList = tokenizeString('1.1e+2');
|
|
45
38
|
const obj = parse(tokenList);
|
|
46
39
|
const result = stringify(obj);
|
|
47
|
-
|
|
48
|
-
throw result;
|
|
49
|
-
}
|
|
40
|
+
assertEq(result, '["ok",110]');
|
|
50
41
|
},
|
|
51
42
|
() => {
|
|
52
43
|
const tokenList = tokenizeString('"abc"');
|
|
53
44
|
const obj = parse(tokenList);
|
|
54
45
|
const result = stringify(obj);
|
|
55
|
-
|
|
56
|
-
throw result;
|
|
57
|
-
}
|
|
46
|
+
assertEq(result, '["ok","abc"]');
|
|
58
47
|
},
|
|
59
48
|
() => {
|
|
60
49
|
const tokenList = tokenizeString('[]');
|
|
61
50
|
const obj = parse(tokenList);
|
|
62
51
|
const result = stringify(obj);
|
|
63
|
-
|
|
64
|
-
throw result;
|
|
65
|
-
}
|
|
52
|
+
assertEq(result, '["ok",[]]');
|
|
66
53
|
},
|
|
67
54
|
() => {
|
|
68
55
|
const tokenList = tokenizeString('[1]');
|
|
69
56
|
const obj = parse(tokenList);
|
|
70
57
|
const result = stringify(obj);
|
|
71
|
-
|
|
72
|
-
throw result;
|
|
73
|
-
}
|
|
58
|
+
assertEq(result, '["ok",[1]]');
|
|
74
59
|
},
|
|
75
60
|
() => {
|
|
76
61
|
const tokenList = tokenizeString('[[]]');
|
|
77
62
|
const obj = parse(tokenList);
|
|
78
63
|
const result = stringify(obj);
|
|
79
|
-
|
|
80
|
-
throw result;
|
|
81
|
-
}
|
|
64
|
+
assertEq(result, '["ok",[[]]]');
|
|
82
65
|
},
|
|
83
66
|
() => {
|
|
84
67
|
const tokenList = tokenizeString('[0,[1,[2,[]]],3]');
|
|
85
68
|
const obj = parse(tokenList);
|
|
86
69
|
const result = stringify(obj);
|
|
87
|
-
|
|
88
|
-
throw result;
|
|
89
|
-
}
|
|
70
|
+
assertEq(result, '["ok",[0,[1,[2,[]]],3]]');
|
|
90
71
|
},
|
|
91
72
|
() => {
|
|
92
73
|
const tokenList = tokenizeString('{}');
|
|
@@ -126,34 +107,26 @@ export const proof = {
|
|
|
126
107
|
const tokenList = tokenizeString('');
|
|
127
108
|
const obj = parse(tokenList);
|
|
128
109
|
const result = stringify(obj);
|
|
129
|
-
|
|
130
|
-
throw result;
|
|
131
|
-
}
|
|
110
|
+
assertEq(result, '["error","unexpected end"]');
|
|
132
111
|
},
|
|
133
112
|
// Trailing commas are not valid JSON — strict parser rejects them.
|
|
134
113
|
() => {
|
|
135
114
|
const tokenList = tokenizeString('[1,]');
|
|
136
115
|
const obj = parse(tokenList);
|
|
137
116
|
const result = stringify(obj);
|
|
138
|
-
|
|
139
|
-
throw result;
|
|
140
|
-
}
|
|
117
|
+
assertEq(result, '["error","unexpected token"]');
|
|
141
118
|
},
|
|
142
119
|
() => {
|
|
143
120
|
const tokenList = tokenizeString('{"a":1,}');
|
|
144
121
|
const obj = parse(tokenList);
|
|
145
122
|
const result = stringify(obj);
|
|
146
|
-
|
|
147
|
-
throw result;
|
|
148
|
-
}
|
|
123
|
+
assertEq(result, '["error","unexpected token"]');
|
|
149
124
|
},
|
|
150
125
|
() => {
|
|
151
126
|
const tokenList = tokenizeString('"123');
|
|
152
127
|
const obj = parse(tokenList);
|
|
153
128
|
const result = stringify(obj);
|
|
154
|
-
|
|
155
|
-
throw result;
|
|
156
|
-
}
|
|
129
|
+
assertEq(result, '["error","unexpected token"]');
|
|
157
130
|
},
|
|
158
131
|
// A literal control character inside a string is not valid JSON (RFC
|
|
159
132
|
// 8259 §7) even though the shared tokenizer would otherwise accept it.
|
|
@@ -161,193 +134,145 @@ export const proof = {
|
|
|
161
134
|
const tokenList = tokenizeString('"\t"');
|
|
162
135
|
const obj = parse(tokenList);
|
|
163
136
|
const result = stringify(obj);
|
|
164
|
-
|
|
165
|
-
throw result;
|
|
166
|
-
}
|
|
137
|
+
assertEq(result, '["error","unexpected token"]');
|
|
167
138
|
},
|
|
168
139
|
() => {
|
|
169
140
|
const tokenList = tokenizeString('{"a":"\t"}');
|
|
170
141
|
const obj = parse(tokenList);
|
|
171
142
|
const result = stringify(obj);
|
|
172
|
-
|
|
173
|
-
throw result;
|
|
174
|
-
}
|
|
143
|
+
assertEq(result, '["error","unexpected token"]');
|
|
175
144
|
},
|
|
176
145
|
() => {
|
|
177
146
|
const tokenList = tokenizeString('[,]');
|
|
178
147
|
const obj = parse(tokenList);
|
|
179
148
|
const result = stringify(obj);
|
|
180
|
-
|
|
181
|
-
throw result;
|
|
182
|
-
}
|
|
149
|
+
assertEq(result, '["error","unexpected token"]');
|
|
183
150
|
},
|
|
184
151
|
() => {
|
|
185
152
|
const tokenList = tokenizeString('[1 2]');
|
|
186
153
|
const obj = parse(tokenList);
|
|
187
154
|
const result = stringify(obj);
|
|
188
|
-
|
|
189
|
-
throw result;
|
|
190
|
-
}
|
|
155
|
+
assertEq(result, '["error","unexpected token"]');
|
|
191
156
|
},
|
|
192
157
|
() => {
|
|
193
158
|
const tokenList = tokenizeString('[1,,2]');
|
|
194
159
|
const obj = parse(tokenList);
|
|
195
160
|
const result = stringify(obj);
|
|
196
|
-
|
|
197
|
-
throw result;
|
|
198
|
-
}
|
|
161
|
+
assertEq(result, '["error","unexpected token"]');
|
|
199
162
|
},
|
|
200
163
|
() => {
|
|
201
164
|
const tokenList = tokenizeString('[]]');
|
|
202
165
|
const obj = parse(tokenList);
|
|
203
166
|
const result = stringify(obj);
|
|
204
|
-
|
|
205
|
-
throw result;
|
|
206
|
-
}
|
|
167
|
+
assertEq(result, '["error","unexpected token"]');
|
|
207
168
|
},
|
|
208
169
|
() => {
|
|
209
170
|
const tokenList = tokenizeString('["a"');
|
|
210
171
|
const obj = parse(tokenList);
|
|
211
172
|
const result = stringify(obj);
|
|
212
|
-
|
|
213
|
-
throw result;
|
|
214
|
-
}
|
|
173
|
+
assertEq(result, '["error","unexpected end"]');
|
|
215
174
|
},
|
|
216
175
|
() => {
|
|
217
176
|
const tokenList = tokenizeString('[,1]');
|
|
218
177
|
const obj = parse(tokenList);
|
|
219
178
|
const result = stringify(obj);
|
|
220
|
-
|
|
221
|
-
throw result;
|
|
222
|
-
}
|
|
179
|
+
assertEq(result, '["error","unexpected token"]');
|
|
223
180
|
},
|
|
224
181
|
() => {
|
|
225
182
|
const tokenList = tokenizeString('[:]');
|
|
226
183
|
const obj = parse(tokenList);
|
|
227
184
|
const result = stringify(obj);
|
|
228
|
-
|
|
229
|
-
throw result;
|
|
230
|
-
}
|
|
185
|
+
assertEq(result, '["error","unexpected token"]');
|
|
231
186
|
},
|
|
232
187
|
() => {
|
|
233
188
|
const tokenList = tokenizeString(']');
|
|
234
189
|
const obj = parse(tokenList);
|
|
235
190
|
const result = stringify(obj);
|
|
236
|
-
|
|
237
|
-
throw result;
|
|
238
|
-
}
|
|
191
|
+
assertEq(result, '["error","unexpected token"]');
|
|
239
192
|
},
|
|
240
193
|
() => {
|
|
241
194
|
const tokenList = tokenizeString('{,}');
|
|
242
195
|
const obj = parse(tokenList);
|
|
243
196
|
const result = stringify(obj);
|
|
244
|
-
|
|
245
|
-
throw result;
|
|
246
|
-
}
|
|
197
|
+
assertEq(result, '["error","unexpected token"]');
|
|
247
198
|
},
|
|
248
199
|
() => {
|
|
249
200
|
const tokenList = tokenizeString('{1:2}');
|
|
250
201
|
const obj = parse(tokenList);
|
|
251
202
|
const result = stringify(obj);
|
|
252
|
-
|
|
253
|
-
throw result;
|
|
254
|
-
}
|
|
203
|
+
assertEq(result, '["error","unexpected token"]');
|
|
255
204
|
},
|
|
256
205
|
() => {
|
|
257
206
|
const tokenList = tokenizeString('{"1"2}');
|
|
258
207
|
const obj = parse(tokenList);
|
|
259
208
|
const result = stringify(obj);
|
|
260
|
-
|
|
261
|
-
throw result;
|
|
262
|
-
}
|
|
209
|
+
assertEq(result, '["error","unexpected token"]');
|
|
263
210
|
},
|
|
264
211
|
() => {
|
|
265
212
|
const tokenList = tokenizeString('{"1"::2}');
|
|
266
213
|
const obj = parse(tokenList);
|
|
267
214
|
const result = stringify(obj);
|
|
268
|
-
|
|
269
|
-
throw result;
|
|
270
|
-
}
|
|
215
|
+
assertEq(result, '["error","unexpected token"]');
|
|
271
216
|
},
|
|
272
217
|
() => {
|
|
273
218
|
const tokenList = tokenizeString('{"1":2,,"3":4');
|
|
274
219
|
const obj = parse(tokenList);
|
|
275
220
|
const result = stringify(obj);
|
|
276
|
-
|
|
277
|
-
throw result;
|
|
278
|
-
}
|
|
221
|
+
assertEq(result, '["error","unexpected token"]');
|
|
279
222
|
},
|
|
280
223
|
() => {
|
|
281
224
|
const tokenList = tokenizeString('{}}');
|
|
282
225
|
const obj = parse(tokenList);
|
|
283
226
|
const result = stringify(obj);
|
|
284
|
-
|
|
285
|
-
throw result;
|
|
286
|
-
}
|
|
227
|
+
assertEq(result, '["error","unexpected token"]');
|
|
287
228
|
},
|
|
288
229
|
() => {
|
|
289
230
|
const tokenList = tokenizeString('{"1":2');
|
|
290
231
|
const obj = parse(tokenList);
|
|
291
232
|
const result = stringify(obj);
|
|
292
|
-
|
|
293
|
-
throw result;
|
|
294
|
-
}
|
|
233
|
+
assertEq(result, '["error","unexpected end"]');
|
|
295
234
|
},
|
|
296
235
|
() => {
|
|
297
236
|
const tokenList = tokenizeString('{,"1":2}');
|
|
298
237
|
const obj = parse(tokenList);
|
|
299
238
|
const result = stringify(obj);
|
|
300
|
-
|
|
301
|
-
throw result;
|
|
302
|
-
}
|
|
239
|
+
assertEq(result, '["error","unexpected token"]');
|
|
303
240
|
},
|
|
304
241
|
() => {
|
|
305
242
|
const tokenList = tokenizeString('}');
|
|
306
243
|
const obj = parse(tokenList);
|
|
307
244
|
const result = stringify(obj);
|
|
308
|
-
|
|
309
|
-
throw result;
|
|
310
|
-
}
|
|
245
|
+
assertEq(result, '["error","unexpected token"]');
|
|
311
246
|
},
|
|
312
247
|
() => {
|
|
313
248
|
const tokenList = tokenizeString('{"a":1 "b":2}');
|
|
314
249
|
const obj = parse(tokenList);
|
|
315
250
|
const result = stringify(obj);
|
|
316
|
-
|
|
317
|
-
throw result;
|
|
318
|
-
}
|
|
251
|
+
assertEq(result, '["error","unexpected token"]');
|
|
319
252
|
},
|
|
320
253
|
() => {
|
|
321
254
|
const tokenList = tokenizeString('[{]}');
|
|
322
255
|
const obj = parse(tokenList);
|
|
323
256
|
const result = stringify(obj);
|
|
324
|
-
|
|
325
|
-
throw result;
|
|
326
|
-
}
|
|
257
|
+
assertEq(result, '["error","unexpected token"]');
|
|
327
258
|
},
|
|
328
259
|
() => {
|
|
329
260
|
const tokenList = tokenizeString('{[}]');
|
|
330
261
|
const obj = parse(tokenList);
|
|
331
262
|
const result = stringify(obj);
|
|
332
|
-
|
|
333
|
-
throw result;
|
|
334
|
-
}
|
|
263
|
+
assertEq(result, '["error","unexpected token"]');
|
|
335
264
|
},
|
|
336
265
|
() => {
|
|
337
266
|
const tokenList = tokenizeString('10-5');
|
|
338
267
|
const obj = parse(tokenList);
|
|
339
268
|
const result = stringify(obj);
|
|
340
|
-
|
|
341
|
-
throw result;
|
|
342
|
-
}
|
|
269
|
+
assertEq(result, '["error","unexpected token"]');
|
|
343
270
|
},
|
|
344
271
|
() => {
|
|
345
272
|
const tokenList = tokenizeString('undefined');
|
|
346
273
|
const obj = parse(tokenList);
|
|
347
274
|
const result = stringify(obj);
|
|
348
|
-
|
|
349
|
-
throw result;
|
|
350
|
-
}
|
|
275
|
+
assertEq(result, '["error","unexpected token"]');
|
|
351
276
|
},
|
|
352
277
|
]
|
|
353
278
|
};
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* value to a response value (or `null` for a notification) and performs no I/O.
|
|
8
8
|
*
|
|
9
9
|
* Out of scope here (follow-ups): transports — stdio / HTTP framing — over
|
|
10
|
-
* `
|
|
10
|
+
* `fjs/effects/node`, and concrete method sets such as MCP (i665-mcp), which layer
|
|
11
11
|
* on top of `dispatch`.
|
|
12
12
|
*
|
|
13
13
|
* https://www.jsonrpc.org/specification
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Converts an rtti schema to a JSON Schema (draft 2020-12) object.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Driven by `fjs/types/rtti/common/module.f.ts`'s `visit`, the same shared
|
|
5
|
+
* `Type`-ADT walker used by `validate` and `parse`.
|
|
6
6
|
*
|
|
7
7
|
* @module
|
|
8
8
|
*/
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Converts an rtti schema to a JSON Schema (draft 2020-12) object.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Driven by `fjs/types/rtti/common/module.f.ts`'s `visit`, the same shared
|
|
5
|
+
* `Type`-ADT walker used by `validate` and `parse`.
|
|
6
6
|
*
|
|
7
7
|
* @module
|
|
8
8
|
*/
|
|
9
9
|
import { array, option, or, record, string } from '../../../types/rtti/module.f.js';
|
|
10
|
+
import { visit } from '../../../types/rtti/common/module.f.js';
|
|
10
11
|
import { unknown as jsonUnknown } from '../module.f.js';
|
|
11
12
|
const unknownThunk = () => ['const', unknownConst];
|
|
12
13
|
/** rtti schema for a JSON Schema (draft 2020-12) document. */
|
|
@@ -45,24 +46,10 @@ const stripUndefined = (rtti) => {
|
|
|
45
46
|
const rest = r.flatMap(t => t !== undefined ? [t] : []);
|
|
46
47
|
return rest.length === 1 ? rest[0] : or(...rest);
|
|
47
48
|
};
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
if (typeof rtti !== 'object' || rtti === null) {
|
|
53
|
-
// bigint consts are represented as numbers (lossy for |value| > MAX_SAFE_INTEGER)
|
|
54
|
-
return { const: typeof rtti === 'bigint' ? Number(rtti) : rtti };
|
|
55
|
-
}
|
|
56
|
-
if (rtti instanceof Array) {
|
|
57
|
-
return {
|
|
58
|
-
type: 'array',
|
|
59
|
-
prefixItems: rtti.map(toJsonSchema),
|
|
60
|
-
items: false,
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
// Struct: keys not admitting undefined go into `required`; optional keys have
|
|
64
|
-
// undefined stripped from their property schema. additionalProperties is omitted
|
|
65
|
-
// (lenient), matching rtti's open-struct validation semantics.
|
|
49
|
+
// Struct: keys not admitting undefined go into `required`; optional keys have
|
|
50
|
+
// undefined stripped from their property schema. additionalProperties is omitted
|
|
51
|
+
// (lenient), matching rtti's open-struct validation semantics.
|
|
52
|
+
const structSchema = (rtti) => {
|
|
66
53
|
const ents = Object.entries(rtti);
|
|
67
54
|
const properties = Object.fromEntries(ents.map(([k, v]) => [k, toJsonSchema(stripUndefined(v))]));
|
|
68
55
|
const required = ents
|
|
@@ -74,6 +61,21 @@ const constToJsonSchema = (rtti) => {
|
|
|
74
61
|
...(required.length > 0 ? { required } : {}),
|
|
75
62
|
};
|
|
76
63
|
};
|
|
64
|
+
const constPrimitiveSchema = (rtti) => rtti === undefined
|
|
65
|
+
? { not: {} }
|
|
66
|
+
// bigint consts are represented as numbers (lossy for |value| > MAX_SAFE_INTEGER)
|
|
67
|
+
: { const: typeof rtti === 'bigint' ? Number(rtti) : rtti };
|
|
68
|
+
const visitor = {
|
|
69
|
+
tuple: (t) => ({ type: 'array', prefixItems: t.map(toJsonSchema), items: false }),
|
|
70
|
+
struct: structSchema,
|
|
71
|
+
array: item => ({ type: 'array', items: toJsonSchema(item) }),
|
|
72
|
+
record: item => ({ type: 'object', additionalProperties: toJsonSchema(item) }),
|
|
73
|
+
or: variants => ({ anyOf: variants.map(toJsonSchema) }),
|
|
74
|
+
constPrimitive: constPrimitiveSchema,
|
|
75
|
+
// bigint is not representable in JSON Schema; 'integer' is the closest approximation
|
|
76
|
+
primitive0: tag => ({ type: tag === 'bigint' ? 'integer' : tag }),
|
|
77
|
+
unknown: () => ({}),
|
|
78
|
+
};
|
|
77
79
|
/**
|
|
78
80
|
* Converts an rtti `Type` to a JSON Schema (draft 2020-12) object.
|
|
79
81
|
*
|
|
@@ -91,22 +93,4 @@ const constToJsonSchema = (rtti) => {
|
|
|
91
93
|
* | `record(T)` | `{ "type": "object", "additionalProperties": …T… }` |
|
|
92
94
|
* | `or(...types)` | `{ "anyOf": […each…] }` |
|
|
93
95
|
*/
|
|
94
|
-
export const toJsonSchema = (
|
|
95
|
-
if (typeof rtti !== 'function') {
|
|
96
|
-
return constToJsonSchema(rtti);
|
|
97
|
-
}
|
|
98
|
-
const [tag, ...rest] = rtti();
|
|
99
|
-
switch (tag) {
|
|
100
|
-
case 'const': return constToJsonSchema(rest[0]);
|
|
101
|
-
case 'boolean': return { type: 'boolean' };
|
|
102
|
-
case 'number': return { type: 'number' };
|
|
103
|
-
case 'string': return { type: 'string' };
|
|
104
|
-
// bigint is not representable in JSON Schema; 'integer' is the closest approximation
|
|
105
|
-
case 'bigint': return { type: 'integer' };
|
|
106
|
-
case 'unknown': return {};
|
|
107
|
-
case 'array': return { type: 'array', items: toJsonSchema(rest[0]) };
|
|
108
|
-
case 'record': return { type: 'object', additionalProperties: toJsonSchema(rest[0]) };
|
|
109
|
-
case 'or': return { anyOf: rest.map(toJsonSchema) };
|
|
110
|
-
default: return {};
|
|
111
|
-
}
|
|
112
|
-
};
|
|
96
|
+
export const toJsonSchema = visit(visitor);
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import { boolean, number, string, bigint, unknown, array, record, or, option } from '../../../types/rtti/module.f.js';
|
|
2
2
|
import { stringify } from '../module.f.js';
|
|
3
3
|
import { toJsonSchema, unknown as schemaUnknown } from './module.f.js';
|
|
4
|
+
import { assert, assertEq } from '../../../asserts/module.f.js';
|
|
4
5
|
const serialize = (v) => stringify(e => e)(v);
|
|
5
6
|
const eq = (rtti, expected) => () => {
|
|
6
7
|
const result = serialize(toJsonSchema(rtti));
|
|
7
8
|
const exp = serialize(expected);
|
|
8
|
-
|
|
9
|
-
throw [result, exp];
|
|
10
|
-
}
|
|
9
|
+
assertEq(result, exp, [result, exp]);
|
|
11
10
|
};
|
|
12
11
|
export const proof = {
|
|
13
12
|
tag0: {
|
|
@@ -62,9 +61,7 @@ export const proof = {
|
|
|
62
61
|
},
|
|
63
62
|
schemaUnknownTag: () => {
|
|
64
63
|
const r = schemaUnknown();
|
|
65
|
-
|
|
66
|
-
throw r[0];
|
|
67
|
-
}
|
|
64
|
+
assert(r[0] === 'const');
|
|
68
65
|
},
|
|
69
66
|
nested: {
|
|
70
67
|
arrayOfRecords: eq(array(record(boolean)), {
|