functionalscript 0.44.0 → 0.45.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/fjs/asn.1/proof.f.d.mts +5 -0
- package/fjs/asn.1/proof.f.mjs +15 -3
- package/fjs/asserts/module.f.d.mts +14 -0
- package/fjs/asserts/module.f.mjs +20 -0
- package/fjs/asserts/proof.f.d.mts +3 -0
- package/fjs/asserts/proof.f.mjs +15 -1
- package/fjs/basen/base128/proof.f.d.mts +3 -1
- package/fjs/basen/base128/proof.f.mjs +3 -1
- package/fjs/basen/base64/module.f.mjs +7 -3
- package/fjs/basen/base64/proof.f.d.mts +3 -1
- package/fjs/basen/base64/proof.f.mjs +7 -4
- package/fjs/basen/cbase32/proof.f.d.mts +3 -1
- package/fjs/basen/cbase32/proof.f.mjs +3 -1
- package/fjs/bnf/data/proof.f.mjs +0 -1
- package/fjs/bnf/descent/module.f.d.mts +17 -2
- package/fjs/bnf/descent/module.f.mjs +118 -41
- package/fjs/bnf/descent/proof.f.d.mts +1 -0
- package/fjs/bnf/descent/proof.f.mjs +77 -1
- package/fjs/bnf/descent/types.d.ts +12 -4
- package/fjs/bnf/ll1/module.f.d.mts +28 -2
- package/fjs/bnf/ll1/module.f.mjs +180 -38
- package/fjs/bnf/ll1/proof.f.d.mts +2 -0
- package/fjs/bnf/ll1/proof.f.mjs +62 -1
- package/fjs/bnf/ll1/types.d.ts +14 -8
- package/fjs/bnf/module.f.d.mts +15 -6
- package/fjs/bnf/module.f.mjs +52 -11
- package/fjs/bnf/proof.f.d.mts +2 -0
- package/fjs/bnf/proof.f.mjs +79 -3
- package/fjs/bnf/token_symbol/module.f.d.mts +4 -3
- package/fjs/bnf/token_symbol/module.f.mjs +7 -6
- package/fjs/bnf/token_symbol/proof.f.mjs +5 -2
- package/fjs/bnf/token_symbol/types.d.ts +2 -2
- package/fjs/bnf/types.d.ts +10 -3
- package/fjs/cas/cli/proof.f.d.mts +3 -1
- package/fjs/cas/cli/proof.f.mjs +3 -1
- package/fjs/cas/evo/module.f.d.mts +7 -13
- package/fjs/cas/evo/module.f.mjs +103 -96
- package/fjs/cas/evo/proof.f.mjs +6 -3
- package/fjs/cas/module.f.mjs +96 -109
- package/fjs/ci/common/module.f.d.mts +1 -1
- package/fjs/ci/common/module.f.mjs +1 -0
- package/fjs/ci/config/module.f.d.mts +2 -2
- package/fjs/ci/config/module.f.mjs +2 -2
- package/fjs/ci/nix/proof.f.d.mts +2 -0
- package/fjs/ci/nix/proof.f.mjs +2 -2
- package/fjs/ci/proof.f.d.mts +4 -2
- package/fjs/ci/proof.f.mjs +4 -3
- package/fjs/cli/proof.f.d.mts +4 -2
- package/fjs/cli/proof.f.mjs +4 -2
- package/fjs/common/monoid/module.f.d.mts +70 -12
- package/fjs/common/monoid/module.f.mjs +177 -14
- package/fjs/common/monoid/proof.f.d.mts +12 -1
- package/fjs/common/monoid/proof.f.mjs +88 -4
- package/fjs/common/monoid/types.d.ts +23 -0
- package/fjs/crypto/secp/proof.f.d.mts +3 -1
- package/fjs/crypto/secp/proof.f.mjs +3 -1
- package/fjs/crypto/sha2/proof.f.d.mts +3 -1
- package/fjs/crypto/sha2/proof.f.mjs +3 -1
- package/fjs/crypto/vdf/module.f.d.mts +23 -4
- package/fjs/crypto/vdf/module.f.mjs +6 -4
- package/fjs/dev/module.f.d.mts +5 -2
- package/fjs/dev/module.f.mjs +5 -4
- package/fjs/dev/package_json/module.f.d.mts +7 -0
- package/fjs/dev/package_json/module.f.mjs +10 -7
- package/fjs/dev/update/module.f.d.mts +3 -0
- package/fjs/dev/update/module.f.mjs +3 -2
- package/fjs/dev/update/proof.f.d.mts +3 -0
- package/fjs/dev/update/proof.f.mjs +1 -2
- package/fjs/djs/parser/module.f.d.mts +3 -0
- package/fjs/djs/parser/module.f.mjs +18 -0
- package/fjs/djs/parser/proof.f.d.mts +3 -0
- package/fjs/djs/parser/proof.f.mjs +13 -1
- package/fjs/djs/proof.f.d.mts +3 -0
- package/fjs/djs/proof.f.mjs +4 -1
- package/fjs/djs/serializer/module.f.mjs +5 -4
- package/fjs/djs/tokenizer/module.f.mjs +21 -13
- package/fjs/djs/tokenizer/proof.f.d.mts +3 -0
- package/fjs/djs/tokenizer/proof.f.mjs +14 -2
- package/fjs/djs/transpiler/module.f.d.mts +1 -12
- package/fjs/djs/transpiler/module.f.mjs +1 -20
- package/fjs/djs/transpiler/types.d.ts +25 -0
- package/fjs/effects/eff/module.f.d.mts +10 -0
- package/fjs/effects/eff/module.f.mjs +4 -2
- package/fjs/effects/eff/proof.f.d.mts +3 -0
- package/fjs/effects/eff/proof.f.mjs +4 -1
- package/fjs/effects/list/module.f.d.mts +10 -2
- package/fjs/effects/list/module.f.mjs +4 -2
- package/fjs/effects/memory/module.f.d.mts +4 -2
- package/fjs/effects/memory/module.f.mjs +4 -3
- package/fjs/effects/memory/proof.f.d.mts +4 -0
- package/fjs/effects/memory/proof.f.mjs +5 -2
- package/fjs/effects/mock/module.f.d.mts +10 -2
- package/fjs/effects/mock/module.f.mjs +4 -2
- package/fjs/effects/module.d.mts +8 -0
- package/fjs/effects/module.f.d.mts +6 -4
- package/fjs/effects/module.f.mjs +6 -5
- package/fjs/effects/module.mjs +9 -1
- package/fjs/effects/node/memory/module.d.mts +3 -0
- package/fjs/effects/node/memory/module.mjs +3 -2
- package/fjs/effects/node/memory/proof.d.mts +2 -0
- package/fjs/effects/node/memory/proof.mjs +2 -1
- package/fjs/effects/node/module.d.mts +5 -0
- package/fjs/effects/node/module.f.d.mts +17 -12
- package/fjs/effects/node/module.f.mjs +6 -12
- package/fjs/effects/node/module.mjs +5 -17
- package/fjs/effects/node/virtual/module.f.d.mts +6 -3
- package/fjs/effects/node/virtual/module.f.mjs +6 -5
- package/fjs/effects/node/virtual/proof.f.d.mts +4 -1
- package/fjs/effects/node/virtual/proof.f.mjs +13 -1
- package/fjs/effects/proof.f.d.mts +3 -0
- package/fjs/effects/proof.f.mjs +4 -1
- package/fjs/emergent_testing/all.test.d.mts +8 -0
- package/fjs/emergent_testing/all.test.mjs +14 -0
- package/fjs/emergent_testing/module.f.d.mts +6 -1
- package/fjs/emergent_testing/module.f.mjs +40 -66
- package/fjs/emergent_testing/proof.f.mjs +5 -5
- package/fjs/fsc/bnf.f.d.mts +3 -0
- package/fjs/fsc/bnf.f.mjs +4 -1
- package/fjs/fsc/json.f.d.mts +3 -0
- package/fjs/fsc/json.f.mjs +4 -1
- package/fjs/fsc/module.f.d.mts +9 -0
- package/fjs/fsc/module.f.mjs +5 -3
- package/fjs/fsm/proof.f.d.mts +3 -0
- package/fjs/fsm/proof.f.mjs +4 -1
- package/fjs/js/tokenizer/module.f.d.mts +7 -0
- package/fjs/js/tokenizer/module.f.mjs +19 -55
- package/fjs/mcp/module.f.d.mts +36 -1
- package/fjs/mcp/module.f.mjs +9 -7
- package/fjs/mcp/proof.f.d.mts +11 -1
- package/fjs/mcp/proof.f.mjs +11 -18
- package/fjs/media/html/module.f.d.mts +12 -0
- package/fjs/media/html/module.f.mjs +6 -4
- package/fjs/media/html/proof.f.d.mts +3 -0
- package/fjs/media/html/proof.f.mjs +4 -1
- package/fjs/media/json/parser/module.f.d.mts +1 -1
- package/fjs/media/json/parser/module.f.mjs +25 -8
- package/fjs/media/json/parser/types.d.ts +5 -0
- package/fjs/media/json/rtti/proof.f.d.mts +3 -0
- package/fjs/media/json/rtti/proof.f.mjs +3 -3
- package/fjs/media/json/schema/module.f.d.mts +61 -27
- package/fjs/media/json/schema/module.f.mjs +228 -63
- package/fjs/media/json/schema/proof.f.d.mts +41 -0
- package/fjs/media/json/schema/proof.f.mjs +219 -7
- package/fjs/media/json/serializer/module.f.d.mts +13 -0
- package/fjs/media/json/serializer/module.f.mjs +7 -7
- package/fjs/media/json/tokenizer/module.f.d.mts +8 -0
- package/fjs/media/json/tokenizer/module.f.mjs +24 -5
- package/fjs/media/nix/module.f.d.mts +13 -0
- package/fjs/media/nix/module.f.mjs +4 -2
- package/fjs/media/nix/proof.f.d.mts +3 -0
- package/fjs/media/nix/proof.f.mjs +4 -1
- package/fjs/media/revision/module.f.d.mts +5 -0
- package/fjs/media/revision/module.f.mjs +8 -11
- package/fjs/media/revision/proof.f.d.mts +4 -0
- package/fjs/media/revision/proof.f.mjs +5 -2
- package/fjs/media/type/module.f.d.mts +28 -11
- package/fjs/media/type/module.f.mjs +69 -85
- package/fjs/media/type/proof.f.d.mts +16 -0
- package/fjs/media/type/proof.f.mjs +44 -4
- package/fjs/module.d.mts +5 -0
- package/fjs/module.f.d.mts +8 -0
- package/fjs/module.f.mjs +4 -2
- package/fjs/module.mjs +6 -0
- package/fjs/path/module.f.d.mts +8 -0
- package/fjs/path/module.f.mjs +4 -2
- package/fjs/proof.f.d.mts +4 -0
- package/fjs/proof.f.mjs +5 -2
- package/fjs/protocol/json_rpc/module.f.d.mts +1 -1
- package/fjs/protocol/json_rpc/module.f.mjs +7 -4
- package/fjs/protocol/json_rpc/proof.f.d.mts +6 -0
- package/fjs/protocol/json_rpc/proof.f.mjs +22 -1
- package/fjs/protocol/mcp/proof.f.d.mts +4 -0
- package/fjs/protocol/mcp/proof.f.mjs +47 -24
- package/fjs/protocol/mcp/stdio/module.f.d.mts +2 -4
- package/fjs/protocol/mcp/stdio/module.f.mjs +1 -8
- package/fjs/protocol/mcp/stdio/proof.f.d.mts +1 -1
- package/fjs/protocol/mcp/stdio/proof.f.mjs +1 -1
- package/fjs/protocol/mcp/stdio/types.d.ts +14 -0
- package/fjs/sul/id/module.f.d.mts +5 -0
- package/fjs/sul/id/module.f.mjs +5 -4
- package/fjs/sul/level/hash/module.f.d.mts +4 -1
- package/fjs/sul/level/hash/module.f.mjs +4 -3
- package/fjs/sul/level/hash/proof.f.d.mts +4 -0
- package/fjs/sul/level/hash/proof.f.mjs +5 -2
- package/fjs/sul/level/literal/module.f.d.mts +4 -1
- package/fjs/sul/level/literal/module.f.mjs +4 -3
- package/fjs/sul/level/literal/proof.f.d.mts +3 -0
- package/fjs/sul/level/literal/proof.f.mjs +4 -1
- package/fjs/sul/module.f.d.mts +5 -3
- package/fjs/sul/module.f.mjs +5 -4
- package/fjs/sul/proof.f.d.mts +4 -0
- package/fjs/sul/proof.f.mjs +5 -2
- package/fjs/text/ascii/module.f.d.mts +26 -0
- package/fjs/text/ascii/module.f.mjs +49 -1
- package/fjs/text/ascii/proof.f.d.mts +10 -0
- package/fjs/text/ascii/proof.f.mjs +33 -1
- package/fjs/text/code_point/module.f.d.mts +21 -3
- package/fjs/text/code_point/module.f.mjs +24 -8
- package/fjs/text/code_point/proof.f.d.mts +1 -0
- package/fjs/text/code_point/proof.f.mjs +28 -0
- package/fjs/text/module.f.d.mts +4 -2
- package/fjs/text/module.f.mjs +4 -3
- package/fjs/text/proof.f.d.mts +3 -0
- package/fjs/text/proof.f.mjs +4 -1
- package/fjs/text/sgr/module.f.d.mts +4 -1
- package/fjs/text/sgr/module.f.mjs +4 -3
- package/fjs/text/sgr/proof.f.d.mts +3 -0
- package/fjs/text/sgr/proof.f.mjs +4 -1
- package/fjs/text/utf16/module.f.d.mts +5 -1
- package/fjs/text/utf16/module.f.mjs +31 -33
- package/fjs/text/utf16/proof.f.d.mts +3 -1
- package/fjs/text/utf16/proof.f.mjs +18 -1
- package/fjs/text/utf8/module.f.d.mts +9 -5
- package/fjs/text/utf8/module.f.mjs +16 -18
- package/fjs/types/array/module.f.d.mts +2 -1
- package/fjs/types/array/module.f.mjs +2 -2
- package/fjs/types/bigfloat/module.f.d.mts +21 -1
- package/fjs/types/bigfloat/module.f.mjs +33 -7
- package/fjs/types/bigfloat/proof.f.d.mts +1 -0
- package/fjs/types/bigfloat/proof.f.mjs +46 -0
- package/fjs/types/bigint/module.f.d.mts +4 -0
- package/fjs/types/bigint/module.f.mjs +4 -3
- package/fjs/types/bit_vec/module.f.d.mts +10 -14
- package/fjs/types/bit_vec/module.f.mjs +61 -71
- package/fjs/types/bit_vec/proof.f.d.mts +6 -0
- package/fjs/types/bit_vec/proof.f.mjs +29 -3
- package/fjs/types/btree/find/module.f.d.mts +5 -1
- package/fjs/types/btree/find/module.f.mjs +5 -5
- package/fjs/types/btree/find/proof.f.d.mts +5 -1
- package/fjs/types/btree/find/proof.f.mjs +5 -3
- package/fjs/types/btree/module.f.d.mts +3 -0
- package/fjs/types/btree/module.f.mjs +3 -2
- package/fjs/types/btree/proof.f.d.mts +5 -1
- package/fjs/types/btree/proof.f.mjs +5 -3
- package/fjs/types/btree/remove/module.f.d.mts +11 -0
- package/fjs/types/btree/remove/module.f.mjs +9 -9
- package/fjs/types/btree/remove/proof.f.d.mts +3 -0
- package/fjs/types/btree/remove/proof.f.mjs +4 -1
- package/fjs/types/btree/set/module.f.d.mts +9 -0
- package/fjs/types/btree/set/module.f.mjs +5 -6
- package/fjs/types/btree/set/proof.f.d.mts +3 -0
- package/fjs/types/btree/set/proof.f.mjs +4 -1
- package/fjs/types/btree/types/module.f.d.mts +2 -1
- package/fjs/types/btree/types/module.f.mjs +2 -1
- package/fjs/types/byte_set/module.f.d.mts +10 -1
- package/fjs/types/byte_set/module.f.mjs +5 -3
- package/fjs/types/byte_set/proof.f.d.mts +3 -1
- package/fjs/types/byte_set/proof.f.mjs +3 -1
- package/fjs/types/function/compare/module.f.d.mts +3 -2
- package/fjs/types/function/compare/module.f.mjs +3 -2
- package/fjs/types/function/module.f.d.mts +8 -1
- package/fjs/types/function/module.f.mjs +8 -1
- package/fjs/types/function/operator/module.f.d.mts +2 -1
- package/fjs/types/function/operator/module.f.mjs +2 -2
- package/fjs/types/list/module.f.d.mts +9 -2
- package/fjs/types/list/module.f.mjs +5 -3
- package/fjs/types/list/proof.f.d.mts +4 -1
- package/fjs/types/list/proof.f.mjs +4 -2
- package/fjs/types/nibble_set/module.f.d.mts +2 -1
- package/fjs/types/nibble_set/module.f.mjs +2 -2
- package/fjs/types/nominal/module.f.d.mts +2 -1
- package/fjs/types/nominal/module.f.mjs +2 -1
- package/fjs/types/nullable/module.f.d.mts +8 -2
- package/fjs/types/nullable/module.f.mjs +4 -2
- package/fjs/types/number/module.f.d.mts +4 -0
- package/fjs/types/number/module.f.mjs +4 -3
- package/fjs/types/object/module.f.d.mts +14 -2
- package/fjs/types/object/module.f.mjs +15 -6
- package/fjs/types/object/proof.f.d.mts +5 -2
- package/fjs/types/object/proof.f.mjs +6 -3
- package/fjs/types/object/structurally_same/module.f.d.mts +39 -0
- package/fjs/types/object/structurally_same/module.f.mjs +59 -0
- package/fjs/types/object/structurally_same/proof.f.d.mts +6 -0
- package/fjs/types/object/structurally_same/proof.f.mjs +73 -0
- package/fjs/types/ordered_map/module.f.d.mts +5 -0
- package/fjs/types/ordered_map/module.f.mjs +5 -4
- package/fjs/types/ordered_map/proof.f.d.mts +3 -0
- package/fjs/types/ordered_map/proof.f.mjs +4 -1
- package/fjs/types/patricia_trie/module.f.d.mts +2 -1
- package/fjs/types/patricia_trie/module.f.mjs +2 -2
- package/fjs/types/patricia_trie/proof.f.d.mts +3 -0
- package/fjs/types/patricia_trie/proof.f.mjs +4 -1
- package/fjs/types/prime_field/module.f.d.mts +3 -1
- package/fjs/types/prime_field/module.f.mjs +3 -2
- package/fjs/types/range/module.f.d.mts +2 -1
- package/fjs/types/range/module.f.mjs +2 -2
- package/fjs/types/range_map/module.f.d.mts +6 -0
- package/fjs/types/range_map/module.f.mjs +6 -9
- package/fjs/types/range_map/proof.f.d.mts +5 -1
- package/fjs/types/range_map/proof.f.mjs +5 -3
- package/fjs/types/range_set/module.f.d.mts +5 -0
- package/fjs/types/range_set/module.f.mjs +1 -0
- package/fjs/types/range_set/proof.f.d.mts +3 -0
- package/fjs/types/range_set/proof.f.mjs +4 -1
- package/fjs/types/result/module.d.mts +8 -0
- package/fjs/types/result/module.f.d.mts +37 -7
- package/fjs/types/result/module.f.mjs +38 -8
- package/fjs/types/result/module.mjs +9 -1
- package/fjs/types/result/proof.f.d.mts +5 -0
- package/fjs/types/result/proof.f.mjs +22 -2
- package/fjs/types/rtti/common/module.f.d.mts +35 -2
- package/fjs/types/rtti/common/module.f.mjs +9 -7
- package/fjs/types/rtti/common/proof.f.d.mts +4 -0
- package/fjs/types/rtti/common/proof.f.mjs +5 -2
- package/fjs/types/rtti/data/module.f.d.mts +120 -0
- package/fjs/types/rtti/data/module.f.mjs +1030 -0
- package/fjs/types/rtti/data/proof.f.d.mts +75 -0
- package/fjs/types/rtti/data/proof.f.mjs +566 -0
- package/fjs/types/rtti/data/types.d.ts +83 -0
- package/fjs/types/rtti/module.f.d.mts +12 -5
- package/fjs/types/rtti/module.f.mjs +7 -5
- package/fjs/types/rtti/parse/module.f.d.mts +38 -0
- package/fjs/types/rtti/parse/module.f.mjs +9 -7
- package/fjs/types/rtti/parse/proof.f.mjs +18 -38
- package/fjs/types/rtti/proof.f.d.mts +3 -1
- package/fjs/types/rtti/proof.f.mjs +3 -1
- package/fjs/types/rtti/ts/module.f.d.mts +68 -9
- package/fjs/types/rtti/ts/module.f.mjs +262 -30
- package/fjs/types/rtti/ts/proof.f.d.mts +44 -0
- package/fjs/types/rtti/ts/proof.f.mjs +152 -4
- package/fjs/types/rtti/ts/types.d.ts +11 -0
- package/fjs/types/rtti/types.d.ts +40 -0
- package/fjs/types/rtti/validate/module.f.d.mts +36 -1
- package/fjs/types/rtti/validate/module.f.mjs +6 -4
- package/fjs/types/sorted_list/module.f.d.mts +4 -1
- package/fjs/types/sorted_list/module.f.mjs +21 -12
- package/fjs/types/sorted_list/proof.f.d.mts +3 -1
- package/fjs/types/sorted_list/proof.f.mjs +3 -1
- package/fjs/types/sorted_set/module.f.d.mts +31 -1
- package/fjs/types/sorted_set/module.f.mjs +4 -2
- package/fjs/types/sorted_set/proof.f.d.mts +3 -1
- package/fjs/types/sorted_set/proof.f.mjs +3 -1
- package/fjs/types/string/module.f.d.mts +4 -0
- package/fjs/types/string/module.f.mjs +4 -3
- package/fjs/types/string_set/module.f.d.mts +3 -1
- package/fjs/types/string_set/module.f.mjs +3 -2
- package/fjs/types/ts/module.f.d.mts +2 -0
- package/fjs/types/ts/module.f.mjs +3 -3
- package/fjs/types/ts/proof.f.d.mts +1 -0
- package/fjs/types/ts/proof.f.mjs +5 -0
- package/fjs/types/ts/types.d.ts +6 -1
- package/fjs/types/uint8array/module.f.d.mts +13 -2
- package/fjs/types/uint8array/module.f.mjs +20 -15
- package/fjs/website/module.f.d.mts +3 -0
- package/fjs/website/module.f.mjs +3 -2
- package/package.json +3 -3
- package/fjs/asn.1/types.js +0 -6
- package/fjs/asserts/types.js +0 -6
- package/fjs/basen/types.js +0 -6
- package/fjs/bnf/data/types.js +0 -6
- package/fjs/bnf/descent/types.js +0 -6
- package/fjs/bnf/ll1/types.js +0 -6
- package/fjs/bnf/token_symbol/types.js +0 -6
- package/fjs/bnf/types.js +0 -6
- package/fjs/cas/evo/types.js +0 -7
- package/fjs/cas/types.js +0 -6
- package/fjs/ci/common/types.js +0 -1
- package/fjs/ci/nix/types.js +0 -6
- package/fjs/ci/types.js +0 -6
- package/fjs/cli/types.js +0 -6
- package/fjs/common/monoid/types.js +0 -6
- package/fjs/crypto/pow/types.js +0 -6
- package/fjs/crypto/secp/types.js +0 -6
- package/fjs/crypto/sha2/types.js +0 -6
- package/fjs/crypto/sign/types.js +0 -6
- package/fjs/crypto/vdf/types.js +0 -6
- package/fjs/dev/types.js +0 -6
- package/fjs/djs/ast/types.js +0 -8
- package/fjs/djs/parser/types.js +0 -7
- package/fjs/djs/tokenizer/types.js +0 -7
- package/fjs/djs/types.js +0 -7
- package/fjs/effects/eff/types.js +0 -6
- package/fjs/effects/list/types.js +0 -6
- package/fjs/effects/memory/types.js +0 -6
- package/fjs/effects/mock/types.js +0 -6
- package/fjs/effects/node/types.js +0 -6
- package/fjs/effects/node/virtual/types.js +0 -7
- package/fjs/effects/types.js +0 -6
- package/fjs/emergent_testing/all.test.d.ts +0 -1
- package/fjs/emergent_testing/all.test.js +0 -5
- package/fjs/emergent_testing/scenarios/all.d.ts +0 -1
- package/fjs/emergent_testing/scenarios/all.js +0 -1
- package/fjs/emergent_testing/scenarios/async-subtests.fail.d.ts +0 -6
- package/fjs/emergent_testing/scenarios/async-subtests.fail.js +0 -9
- package/fjs/emergent_testing/scenarios/async-subtests.pass.d.ts +0 -6
- package/fjs/emergent_testing/scenarios/async-subtests.pass.js +0 -9
- package/fjs/emergent_testing/scenarios/async.fail.d.ts +0 -3
- package/fjs/emergent_testing/scenarios/async.fail.js +0 -6
- package/fjs/emergent_testing/scenarios/async.pass.d.ts +0 -3
- package/fjs/emergent_testing/scenarios/async.pass.js +0 -5
- package/fjs/emergent_testing/scenarios/fail.fail.d.ts +0 -3
- package/fjs/emergent_testing/scenarios/fail.fail.js +0 -3
- package/fjs/emergent_testing/scenarios/return-value.pass.d.ts +0 -3
- package/fjs/emergent_testing/scenarios/return-value.pass.js +0 -4
- package/fjs/emergent_testing/scenarios/thenable.pass.d.ts +0 -5
- package/fjs/emergent_testing/scenarios/thenable.pass.js +0 -11
- package/fjs/emergent_testing/scenarios/thenable2.pass.d.ts +0 -5
- package/fjs/emergent_testing/scenarios/thenable2.pass.js +0 -3
- package/fjs/emergent_testing/scenarios/throw.pass.d.ts +0 -5
- package/fjs/emergent_testing/scenarios/throw.pass.js +0 -3
- package/fjs/emergent_testing/types.js +0 -6
- package/fjs/js/tokenizer/types.js +0 -6
- package/fjs/media/html/types.js +0 -6
- package/fjs/media/json/parser/types.js +0 -6
- package/fjs/media/json/tokenizer/types.js +0 -6
- package/fjs/media/json/types.js +0 -13
- package/fjs/media/nix/types.js +0 -6
- package/fjs/media/revision/types.js +0 -8
- package/fjs/media/type/types.js +0 -6
- package/fjs/media/types.js +0 -7
- package/fjs/nanvm/types.js +0 -11
- package/fjs/protocol/json_rpc/types.js +0 -8
- package/fjs/protocol/mcp/types.js +0 -8
- package/fjs/sul/id/types.js +0 -6
- package/fjs/sul/level/hash/types.js +0 -6
- package/fjs/sul/level/literal/types.js +0 -6
- package/fjs/sul/types.js +0 -6
- package/fjs/text/sgr/types.js +0 -6
- package/fjs/text/types.js +0 -6
- package/fjs/text/utf16/types.js +0 -6
- package/fjs/text/utf8/types.js +0 -6
- package/fjs/types/array/types.js +0 -6
- package/fjs/types/bigfloat/types.js +0 -6
- package/fjs/types/bigint/types.js +0 -6
- package/fjs/types/bit_vec/types.js +0 -6
- package/fjs/types/btree/find/types.js +0 -6
- package/fjs/types/btree/types/types.js +0 -6
- package/fjs/types/byte_set/types.js +0 -6
- package/fjs/types/function/compare/types.js +0 -6
- package/fjs/types/function/operator/types.js +0 -6
- package/fjs/types/function/types.js +0 -6
- package/fjs/types/list/types.js +0 -6
- package/fjs/types/nibble_set/types.js +0 -6
- package/fjs/types/nominal/types.js +0 -6
- package/fjs/types/nullable/types.js +0 -6
- package/fjs/types/object/types.js +0 -8
- package/fjs/types/option/types.js +0 -6
- package/fjs/types/ordered_map/types.js +0 -6
- package/fjs/types/patricia_trie/types.js +0 -6
- package/fjs/types/phantom/types.js +0 -11
- package/fjs/types/prime_field/types.js +0 -6
- package/fjs/types/range/types.js +0 -6
- package/fjs/types/range_map/types.js +0 -6
- package/fjs/types/result/types.js +0 -6
- package/fjs/types/rtti/common/types.js +0 -1
- package/fjs/types/rtti/parse/types.js +0 -1
- package/fjs/types/rtti/ts/types.js +0 -1
- package/fjs/types/rtti/types.js +0 -1
- package/fjs/types/rtti/validate/types.js +0 -1
- package/fjs/types/sorted_list/types.js +0 -6
- package/fjs/types/sorted_set/types.js +0 -6
- package/fjs/types/string_set/types.js +0 -6
- package/fjs/types/ts/types.js +0 -8
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Magic-byte MIME type detection.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* One list — `signatures` — declares every recognized magic-byte pattern, and
|
|
5
|
+
* both detectors read it through the same eliminator (`magicStep`): `detect`
|
|
6
|
+
* folds a whole `Vec` and returns a MIME type string or `null`, while
|
|
7
|
+
* `detectStream` folds a read stream one chunk at a time.
|
|
7
8
|
*
|
|
8
|
-
* Beside
|
|
9
|
-
* state machine (length × magic-byte eliminator × UTF-8 validity
|
|
10
|
-
* `{ length, mime_type, type }` by folding a CAS read stream in
|
|
11
|
-
* ever buffering the blob into a single `maxLength`-bounded
|
|
12
|
-
* for the factored design.
|
|
9
|
+
* Beside `detect`, `detectStream` is the **streaming counterpart**: a
|
|
10
|
+
* byte-accepting state machine (length × magic-byte eliminator × UTF-8 validity
|
|
11
|
+
* DFA) that derives `{ length, mime_type, type }` by folding a CAS read stream in
|
|
12
|
+
* O(1) space, without ever buffering the blob into a single `maxLength`-bounded
|
|
13
|
+
* `Vec`. See the README for the factored design.
|
|
13
14
|
*
|
|
14
15
|
* The CAS store is type-agnostic and keeps raw bytes only, so type is never
|
|
15
16
|
* stored; it is recovered on read by sniffing the content. Callers decide what
|
|
@@ -27,107 +28,51 @@
|
|
|
27
28
|
* | `application/zip` | `50 4B 03 04` / `05 06` / `07 08` (`"PK"` entry, empty, or spanned) |
|
|
28
29
|
*
|
|
29
30
|
* WebP is the one signature with a gap: the four-byte little-endian file size
|
|
30
|
-
* sits between the `RIFF` and `WEBP` markers, so
|
|
31
|
-
*
|
|
31
|
+
* sits between the `RIFF` and `WEBP` markers, so its pattern carries four
|
|
32
|
+
* wildcard bytes rather than being one contiguous run.
|
|
32
33
|
*
|
|
33
34
|
* See `./types.ts` for the type-level API.
|
|
34
35
|
*
|
|
35
36
|
* @module
|
|
37
|
+
*
|
|
38
|
+
* @import { Vec } from '../../types/bit_vec/types.ts'
|
|
39
|
+
* @import { Nullable } from '../../types/nullable/types.ts'
|
|
40
|
+
* @import { Effect, Operation } from '../../effects/types.ts'
|
|
41
|
+
* @import { List } from '../../effects/list/types.ts'
|
|
42
|
+
* @import { IoResult } from '../../effects/node/types.ts'
|
|
43
|
+
* @import { DetectMeta, DetectState, _MagicState, _Signature, _Utf8Detect } from './types.ts'
|
|
36
44
|
*/
|
|
37
45
|
|
|
38
|
-
import { msb,
|
|
39
|
-
/** @import { Vec } from '../../types/bit_vec/types.ts' */
|
|
46
|
+
import { msb, length, u8List } from '../../types/bit_vec/module.f.mjs'
|
|
40
47
|
import { iterable } from '../../types/list/module.f.mjs'
|
|
41
|
-
/** @import { Nullable } from '../../types/nullable/types.ts' */
|
|
42
48
|
import { pure, step } from '../../effects/module.f.mjs'
|
|
43
|
-
/** @import { Effect, Operation } from '../../effects/types.ts' */
|
|
44
|
-
/** @import { List } from '../../effects/list/types.ts' */
|
|
45
|
-
/** @import { IoResult } from '../../effects/node/types.ts' */
|
|
46
49
|
import { ok, error } from '../../types/result/module.f.mjs'
|
|
47
50
|
import { isValidCodePoint, isTextCodePoint } from '../../text/code_point/module.f.mjs'
|
|
48
51
|
import { utf8ByteToCodePointOp } from '../../text/utf8/module.f.mjs'
|
|
49
|
-
/** @import { DetectMeta, DetectState, _MagicState, _Signature, _Utf8Detect } from './types.ts' */
|
|
50
|
-
|
|
51
|
-
const { startsWith, removeFront } = msb
|
|
52
|
-
|
|
53
|
-
// Each signature is written as a hex literal whose leading `1` nibble is a
|
|
54
|
-
// sentinel marking the start of the byte run (so leading zero bytes survive)
|
|
55
|
-
// and fixing the length — see `bit_vec` `fromSentinel`.
|
|
56
|
-
const sig = fromSentinel
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* Contiguous magic-byte signatures, checked in order; the first prefix match
|
|
60
|
-
* wins. Ordering is irrelevant here — no signature is a prefix of another.
|
|
61
|
-
*
|
|
62
|
-
* @type {readonly (readonly [Vec, string])[]}
|
|
63
|
-
*/
|
|
64
|
-
const table = [
|
|
65
|
-
[sig(0x1_89_50_4e_47_0d_0a_1a_0an), 'image/png'],
|
|
66
|
-
[sig(0x1_ff_d8_ffn), 'image/jpeg'],
|
|
67
|
-
// Match the full GIF version headers ("GIF87a" / "GIF89a"), not just "GIF8",
|
|
68
|
-
// so opaque bytes that merely start with "GIF8" are not mistyped.
|
|
69
|
-
[sig(0x1_47_49_46_38_37_61n), 'image/gif'],
|
|
70
|
-
[sig(0x1_47_49_46_38_39_61n), 'image/gif'],
|
|
71
|
-
[sig(0x1_25_50_44_46_2dn), 'application/pdf'],
|
|
72
|
-
// ZIP has three "PK" local-header variants: a normal entry, an empty
|
|
73
|
-
// archive (end-of-central-directory only), and a spanned archive.
|
|
74
|
-
[sig(0x1_50_4b_03_04n), 'application/zip'],
|
|
75
|
-
[sig(0x1_50_4b_05_06n), 'application/zip'],
|
|
76
|
-
[sig(0x1_50_4b_07_08n), 'application/zip'],
|
|
77
|
-
]
|
|
78
|
-
|
|
79
|
-
// WebP: "RIFF" at offset 0, "WEBP" at offset 8 (the 4 bytes between are the
|
|
80
|
-
// file size). 12 bytes = 96 bits is the minimum to carry both markers.
|
|
81
|
-
const riff = sig(0x1_52_49_46_46n)
|
|
82
|
-
const webp = sig(0x1_57_45_42_50n)
|
|
83
|
-
|
|
84
|
-
/** @type {(bytes: Vec) => boolean} */
|
|
85
|
-
const isWebp = bytes =>
|
|
86
|
-
length(bytes) >= 96n
|
|
87
|
-
&& startsWith(riff)(bytes)
|
|
88
|
-
&& startsWith(webp)(removeFront(64n)(bytes))
|
|
89
|
-
|
|
90
|
-
/**
|
|
91
|
-
* Detects the MIME type of `bytes` from its leading magic-byte signature.
|
|
92
|
-
*
|
|
93
|
-
* @returns the MIME type string for a recognized format, or `null` when the
|
|
94
|
-
* leading bytes match no known signature (including any `Vec` shorter than
|
|
95
|
-
* the signature it might otherwise match).
|
|
96
|
-
*
|
|
97
|
-
* @type {(bytes: Vec) => Nullable<string>}
|
|
98
|
-
*/
|
|
99
|
-
export const detect = bytes => {
|
|
100
|
-
if (isWebp(bytes)) { return 'image/webp' }
|
|
101
|
-
for (const [s, m] of table) {
|
|
102
|
-
if (startsWith(s)(bytes)) { return m }
|
|
103
|
-
}
|
|
104
|
-
return null
|
|
105
|
-
}
|
|
106
52
|
|
|
107
|
-
// ──
|
|
53
|
+
// ── Magic-byte signatures ─────────────────────────────────────────────────────────
|
|
108
54
|
//
|
|
109
|
-
//
|
|
110
|
-
//
|
|
111
|
-
//
|
|
112
|
-
//
|
|
113
|
-
// end-of-stream by `finish`. This lets `cas_get` inspect arbitrarily large blobs
|
|
114
|
-
// (where a single `Vec` would overflow `maxLength`) in O(1) space, since the bulk
|
|
115
|
-
// of a large blob costs only length counting once the verdict is fixed (see
|
|
116
|
-
// `isSettled`: a magic match settles it immediately, a dead magic once utf8 fails).
|
|
55
|
+
// The single declaration of what a signature is: a byte pattern the eliminator can
|
|
56
|
+
// consume one byte at a time, with `null` for a wildcard byte. Both `detect` and
|
|
57
|
+
// the streaming detector below eliminate against this one list, so a signature is
|
|
58
|
+
// added or corrected in exactly one place.
|
|
117
59
|
|
|
118
|
-
// The streaming counterpart of `table`/`isWebp`: the same signatures expressed as
|
|
119
|
-
// byte patterns the eliminator can consume one byte at a time. WebP's gap is the
|
|
120
|
-
// only wildcard run.
|
|
121
60
|
/** @type {readonly _Signature[]} */
|
|
122
61
|
const signatures = [
|
|
123
62
|
{ pattern: [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a], mime: 'image/png' },
|
|
124
63
|
{ pattern: [0xff, 0xd8, 0xff], mime: 'image/jpeg' },
|
|
64
|
+
// Match the full GIF version headers ("GIF87a" / "GIF89a"), not just "GIF8",
|
|
65
|
+
// so opaque bytes that merely start with "GIF8" are not mistyped.
|
|
125
66
|
{ pattern: [0x47, 0x49, 0x46, 0x38, 0x37, 0x61], mime: 'image/gif' },
|
|
126
67
|
{ pattern: [0x47, 0x49, 0x46, 0x38, 0x39, 0x61], mime: 'image/gif' },
|
|
127
68
|
{ pattern: [0x25, 0x50, 0x44, 0x46, 0x2d], mime: 'application/pdf' },
|
|
69
|
+
// ZIP has three "PK" local-header variants: a normal entry, an empty
|
|
70
|
+
// archive (end-of-central-directory only), and a spanned archive.
|
|
128
71
|
{ pattern: [0x50, 0x4b, 0x03, 0x04], mime: 'application/zip' },
|
|
129
72
|
{ pattern: [0x50, 0x4b, 0x05, 0x06], mime: 'application/zip' },
|
|
130
73
|
{ pattern: [0x50, 0x4b, 0x07, 0x08], mime: 'application/zip' },
|
|
74
|
+
// WebP: "RIFF" at offset 0, "WEBP" at offset 8; the four bytes between are
|
|
75
|
+
// the little-endian file size, matched as wildcards.
|
|
131
76
|
{
|
|
132
77
|
pattern: [0x52, 0x49, 0x46, 0x46, null, null, null, null, 0x57, 0x45, 0x42, 0x50],
|
|
133
78
|
mime: 'image/webp',
|
|
@@ -154,6 +99,45 @@ const magicStep = (m, byte) => {
|
|
|
154
99
|
/** @type {(m: _MagicState) => Nullable<string>} */
|
|
155
100
|
const magicMime = m => m.tag === 'matched' ? m.mime : null
|
|
156
101
|
|
|
102
|
+
/**
|
|
103
|
+
* Detects the MIME type of `bytes` from its leading magic-byte signature by
|
|
104
|
+
* folding them through the same eliminator the streaming detector uses. Both
|
|
105
|
+
* absorbing states end the fold: a `matched` signature is the answer, and a
|
|
106
|
+
* `dead` eliminator can no longer produce one. Bytes still in `scan` at the end
|
|
107
|
+
* of the `Vec` — a prefix too short to complete any signature — leave the
|
|
108
|
+
* eliminator unsettled, which reads as `null`.
|
|
109
|
+
*
|
|
110
|
+
* The bytes come from `u8List`, so a `Vec` whose length is not a whole number of
|
|
111
|
+
* bytes has its trailing partial byte zero-padded — the same reading of a ragged
|
|
112
|
+
* `Vec` the streaming detector already uses.
|
|
113
|
+
*
|
|
114
|
+
* @returns the MIME type string for a recognized format, or `null` when the
|
|
115
|
+
* leading bytes match no known signature (including any `Vec` shorter than
|
|
116
|
+
* the signature it might otherwise match).
|
|
117
|
+
*
|
|
118
|
+
* @type {(bytes: Vec) => Nullable<string>}
|
|
119
|
+
*/
|
|
120
|
+
export const detect = bytes => {
|
|
121
|
+
/** @type {_MagicState} */
|
|
122
|
+
let magic = magicInit
|
|
123
|
+
for (const byte of iterable(u8List(msb)(bytes))) {
|
|
124
|
+
magic = magicStep(magic, byte)
|
|
125
|
+
if (magic.tag !== 'scan') { break }
|
|
126
|
+
}
|
|
127
|
+
return magicMime(magic)
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// ── Streaming detector ────────────────────────────────────────────────────────────
|
|
131
|
+
//
|
|
132
|
+
// A byte-accepting state machine that derives the same `{ length, mime_type, type }`
|
|
133
|
+
// metadata as the pure `detect` + UTF-8 path, but **without buffering the blob**.
|
|
134
|
+
// It is the product of three independent folds over the byte stream — length,
|
|
135
|
+
// magic-byte signature elimination, and a UTF-8 validity DFA — read off at
|
|
136
|
+
// end-of-stream by `finish`. This lets `cas_get` inspect arbitrarily large blobs
|
|
137
|
+
// (where a single `Vec` would overflow `maxLength`) in O(1) space, since the bulk
|
|
138
|
+
// of a large blob costs only length counting once the verdict is fixed (see
|
|
139
|
+
// `isSettled`: a magic match settles it immediately, a dead magic once utf8 fails).
|
|
140
|
+
|
|
157
141
|
/** @type {_Utf8Detect} */
|
|
158
142
|
const utf8Init = { st: null, valid: true, text: true }
|
|
159
143
|
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @import { Vec } from '../../types/bit_vec/types.ts'
|
|
3
|
+
* @import { List } from '../../effects/list/types.ts'
|
|
4
|
+
* @import { Result } from '../../types/result/types.ts'
|
|
5
|
+
* @import { DetectMeta } from './types.ts'
|
|
6
|
+
*/
|
|
1
7
|
export declare const proof: {
|
|
2
8
|
png: () => void;
|
|
3
9
|
jpeg: () => void;
|
|
@@ -7,11 +13,21 @@ export declare const proof: {
|
|
|
7
13
|
pdf: () => void;
|
|
8
14
|
zip: () => void;
|
|
9
15
|
emptyZip: () => void;
|
|
16
|
+
spannedZip: () => void;
|
|
10
17
|
webp: () => void;
|
|
11
18
|
riffNotWebp: () => void;
|
|
12
19
|
textIsNull: () => void;
|
|
13
20
|
shortIsNull: () => void;
|
|
14
21
|
emptyIsNull: () => void;
|
|
22
|
+
truncated: {
|
|
23
|
+
png: () => void;
|
|
24
|
+
jpeg: () => void;
|
|
25
|
+
gif87a: () => void;
|
|
26
|
+
gif89a: () => void;
|
|
27
|
+
pdf: () => void;
|
|
28
|
+
zip: () => void;
|
|
29
|
+
webp: () => void;
|
|
30
|
+
};
|
|
15
31
|
stream: {
|
|
16
32
|
text: () => void;
|
|
17
33
|
png: () => void;
|
|
@@ -1,13 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @import { Vec } from '../../types/bit_vec/types.ts'
|
|
3
|
+
* @import { List } from '../../effects/list/types.ts'
|
|
4
|
+
* @import { Result } from '../../types/result/types.ts'
|
|
5
|
+
* @import { DetectMeta } from './types.ts'
|
|
6
|
+
*/
|
|
7
|
+
|
|
1
8
|
import { assert, assertEq } from '../../asserts/module.f.mjs'
|
|
2
9
|
import { msb, u8ListToVec, vec8, repeat, empty } from '../../types/bit_vec/module.f.mjs'
|
|
3
|
-
/** @import { Vec } from '../../types/bit_vec/types.ts' */
|
|
4
10
|
import { runPure } from '../../effects/module.f.mjs'
|
|
5
11
|
import { nonEmpty, empty as emptyList } from '../../effects/list/module.f.mjs'
|
|
6
|
-
/** @import { List } from '../../effects/list/types.ts' */
|
|
7
|
-
/** @import { Result } from '../../types/result/types.ts' */
|
|
8
12
|
import { ok } from '../../types/result/module.f.mjs'
|
|
9
13
|
import { detect, detectStream, detectVec } from './module.f.mjs'
|
|
10
|
-
/** @import { DetectMeta } from './types.ts' */
|
|
11
14
|
|
|
12
15
|
// Builds a big-endian `Vec` from a list of byte values — mirrors how the CAS
|
|
13
16
|
// store would hold the leading bytes of a stored blob.
|
|
@@ -61,6 +64,11 @@ export const proof = {
|
|
|
61
64
|
emptyZip: () =>
|
|
62
65
|
assertEq(detect(bytes(0x50, 0x4b, 0x05, 0x06, 0x00, 0x00)), 'application/zip'),
|
|
63
66
|
|
|
67
|
+
// A spanned ZIP archive — the third "PK" variant, so every entry of the
|
|
68
|
+
// signature list has a case that fails if it is dropped.
|
|
69
|
+
spannedZip: () =>
|
|
70
|
+
assertEq(detect(bytes(0x50, 0x4b, 0x07, 0x08, 0x00, 0x00)), 'application/zip'),
|
|
71
|
+
|
|
64
72
|
webp: () =>
|
|
65
73
|
// "RIFF" + 4-byte size + "WEBP"
|
|
66
74
|
assertEq(
|
|
@@ -86,6 +94,38 @@ export const proof = {
|
|
|
86
94
|
emptyIsNull: () =>
|
|
87
95
|
assertEq(detect(empty), null),
|
|
88
96
|
|
|
97
|
+
// Every signature, one byte short of complete. A signature is only ever
|
|
98
|
+
// recognized on its *last* byte, so each of these must still be null — an
|
|
99
|
+
// off-by-one in the eliminator's terminal-position test would report the
|
|
100
|
+
// format here, and would fire the "GIF8"-prefix trap `gif8NotGif` guards.
|
|
101
|
+
truncated: {
|
|
102
|
+
png: () =>
|
|
103
|
+
assertEq(detect(bytes(0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a)), null),
|
|
104
|
+
|
|
105
|
+
jpeg: () =>
|
|
106
|
+
assertEq(detect(bytes(0xff, 0xd8)), null),
|
|
107
|
+
|
|
108
|
+
gif87a: () =>
|
|
109
|
+
assertEq(detect(bytes(0x47, 0x49, 0x46, 0x38, 0x37)), null),
|
|
110
|
+
|
|
111
|
+
gif89a: () =>
|
|
112
|
+
assertEq(detect(bytes(0x47, 0x49, 0x46, 0x38, 0x39)), null),
|
|
113
|
+
|
|
114
|
+
pdf: () =>
|
|
115
|
+
assertEq(detect(bytes(0x25, 0x50, 0x44, 0x46)), null),
|
|
116
|
+
|
|
117
|
+
zip: () =>
|
|
118
|
+
assertEq(detect(bytes(0x50, 0x4b, 0x03)), null),
|
|
119
|
+
|
|
120
|
+
// 11 bytes: "RIFF", the size wildcards, and all but the last byte of
|
|
121
|
+
// "WEBP" — the wildcard run must not shorten the pattern either.
|
|
122
|
+
webp: () =>
|
|
123
|
+
assertEq(
|
|
124
|
+
detect(bytes(
|
|
125
|
+
0x52, 0x49, 0x46, 0x46, 0x1a, 0x00, 0x00, 0x00, 0x57, 0x45, 0x42)),
|
|
126
|
+
null),
|
|
127
|
+
},
|
|
128
|
+
|
|
89
129
|
// ── Streaming detector (detectStream) ───────────────────────────────────────
|
|
90
130
|
|
|
91
131
|
stream: {
|
package/fjs/module.d.mts
CHANGED
package/fjs/module.f.d.mts
CHANGED
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FunctionalScript compiler entry points and command handlers.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*
|
|
6
|
+
* @import { NodeOp, NodeProgram } from './effects/node/types.ts'
|
|
7
|
+
* @import { Commands } from './cli/types.ts'
|
|
8
|
+
*/
|
|
1
9
|
import type { NodeProgram } from './effects/node/types.ts';
|
|
2
10
|
/** @type {NodeProgram} */
|
|
3
11
|
export declare const main: NodeProgram;
|
package/fjs/module.f.mjs
CHANGED
|
@@ -2,15 +2,17 @@
|
|
|
2
2
|
* FunctionalScript compiler entry points and command handlers.
|
|
3
3
|
*
|
|
4
4
|
* @module
|
|
5
|
+
*
|
|
6
|
+
* @import { NodeOp, NodeProgram } from './effects/node/types.ts'
|
|
7
|
+
* @import { Commands } from './cli/types.ts'
|
|
5
8
|
*/
|
|
9
|
+
|
|
6
10
|
import { compile } from './djs/module.f.mjs'
|
|
7
11
|
import { main as testMain } from './emergent_testing/module.f.mjs'
|
|
8
12
|
import { commands as casCommands } from './cas/cli/module.f.mjs'
|
|
9
13
|
import { main as ciMain } from './ci/module.f.mjs'
|
|
10
14
|
import { import_ } from './effects/node/module.f.mjs'
|
|
11
|
-
/** @import { NodeOp, NodeProgram } from './effects/node/types.ts' */
|
|
12
15
|
import { dispatch } from './cli/module.f.mjs'
|
|
13
|
-
/** @import { Commands } from './cli/types.ts' */
|
|
14
16
|
import { casMcpServer } from './mcp/module.f.mjs'
|
|
15
17
|
import { pure, step } from './effects/module.f.mjs'
|
|
16
18
|
import { unwrap } from './types/result/module.f.mjs'
|
package/fjs/module.mjs
CHANGED
package/fjs/path/module.f.d.mts
CHANGED
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Path parsing and normalization helpers for portable module paths.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*
|
|
6
|
+
* @import { Fold, Reduce, Unary } from '../types/function/operator/types.ts'
|
|
7
|
+
* @import { List } from '../types/list/types.ts'
|
|
8
|
+
*/
|
|
1
9
|
import type { Reduce, Unary } from '../types/function/operator/types.ts';
|
|
2
10
|
/**
|
|
3
11
|
* Converts Windows separators (`\`) to POSIX separators (`/`).
|
package/fjs/path/module.f.mjs
CHANGED
|
@@ -2,9 +2,11 @@
|
|
|
2
2
|
* Path parsing and normalization helpers for portable module paths.
|
|
3
3
|
*
|
|
4
4
|
* @module
|
|
5
|
+
*
|
|
6
|
+
* @import { Fold, Reduce, Unary } from '../types/function/operator/types.ts'
|
|
7
|
+
* @import { List } from '../types/list/types.ts'
|
|
5
8
|
*/
|
|
6
|
-
|
|
7
|
-
/** @import { List } from '../types/list/types.ts' */
|
|
9
|
+
|
|
8
10
|
import { fold, last, take, length, concat as listConcat, toArray } from '../types/list/module.f.mjs'
|
|
9
11
|
import { join as listJoin, concat as stringConcat } from '../types/string/module.f.mjs'
|
|
10
12
|
|
package/fjs/proof.f.d.mts
CHANGED
package/fjs/proof.f.mjs
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @import { NodeProgram, NodeProgramOptions } from './effects/node/types.ts'
|
|
3
|
+
* @import { Dir } from './effects/node/virtual/types.ts'
|
|
4
|
+
*/
|
|
5
|
+
|
|
1
6
|
import { assert, assertEq } from './asserts/module.f.mjs'
|
|
2
7
|
import { pure } from './effects/module.f.mjs'
|
|
3
|
-
/** @import { NodeProgram, NodeProgramOptions } from './effects/node/types.ts' */
|
|
4
8
|
import { defaultNodeProgramOptions, emptyState, virtual } from './effects/node/virtual/module.f.mjs'
|
|
5
|
-
/** @import { Dir } from './effects/node/virtual/types.ts' */
|
|
6
9
|
import { main } from './module.f.mjs'
|
|
7
10
|
|
|
8
11
|
/** @type {(args: readonly string[]) => NodeProgramOptions} */
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
* @module
|
|
16
16
|
*
|
|
17
17
|
* @import { Unknown } from '../../media/json/types.ts'
|
|
18
|
-
* @import { Id, RpcError,
|
|
18
|
+
* @import { Id, RpcError, Handlers, Response } from './types.ts'
|
|
19
19
|
*/
|
|
20
20
|
import type { Unknown } from '../../media/json/types.ts';
|
|
21
21
|
import type { RpcError, Handlers, Response } from './types.ts';
|
|
@@ -15,9 +15,10 @@
|
|
|
15
15
|
* @module
|
|
16
16
|
*
|
|
17
17
|
* @import { Unknown } from '../../media/json/types.ts'
|
|
18
|
-
* @import { Id, RpcError,
|
|
18
|
+
* @import { Id, RpcError, Handlers, Response } from './types.ts'
|
|
19
19
|
*/
|
|
20
20
|
|
|
21
|
+
import { at } from '../../types/object/module.f.mjs'
|
|
21
22
|
import { number, string, or, option } from '../../types/rtti/module.f.mjs'
|
|
22
23
|
import { validate } from '../../types/rtti/validate/module.f.mjs'
|
|
23
24
|
import { unknown } from '../../media/json/rtti/module.f.mjs'
|
|
@@ -100,9 +101,11 @@ export const dispatch = handlers => value => {
|
|
|
100
101
|
if (id === undefined) {
|
|
101
102
|
return null
|
|
102
103
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
104
|
+
// `at`, not `handlers[method]`: `method` is untrusted wire data, and a
|
|
105
|
+
// bracket lookup on a plain object resolves inherited `Object.prototype`
|
|
106
|
+
// names (`constructor`, `toString`, …) to callables.
|
|
107
|
+
const handler = at(method)(handlers)
|
|
108
|
+
if (handler === null) {
|
|
106
109
|
return errorResponseOf(id)(methodNotFound)
|
|
107
110
|
}
|
|
108
111
|
const [t2, result] = handler(params)
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @import { Handlers } from './types.ts'
|
|
3
|
+
*/
|
|
1
4
|
export declare const proof: {
|
|
2
5
|
schema: {
|
|
3
6
|
request: {
|
|
@@ -29,6 +32,9 @@ export declare const proof: {
|
|
|
29
32
|
paramsPassed: () => void;
|
|
30
33
|
handlerError: () => void;
|
|
31
34
|
methodNotFound: () => void;
|
|
35
|
+
inheritedToString: () => void;
|
|
36
|
+
inheritedConstructor: () => void;
|
|
37
|
+
ownPrototypeName: () => void;
|
|
32
38
|
invalidRequest: () => void;
|
|
33
39
|
notification: () => void;
|
|
34
40
|
};
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/**
|
|
2
|
+
* @import { Handlers } from './types.ts'
|
|
3
|
+
*/
|
|
4
|
+
|
|
2
5
|
import { assert, assertEq } from '../../asserts/module.f.mjs'
|
|
3
6
|
import { ok, error } from '../../types/result/module.f.mjs'
|
|
4
7
|
import { validate } from '../../types/rtti/validate/module.f.mjs'
|
|
@@ -25,6 +28,9 @@ const handlers = {
|
|
|
25
28
|
}
|
|
26
29
|
const d = dispatch(handlers)
|
|
27
30
|
|
|
31
|
+
/** A handler table that does own the `Object.prototype` name `toString`. */
|
|
32
|
+
const dOwnPrototypeName = dispatch({ toString: () => ok('own') })
|
|
33
|
+
|
|
28
34
|
export const proof = {
|
|
29
35
|
schema: {
|
|
30
36
|
request: {
|
|
@@ -72,6 +78,21 @@ export const proof = {
|
|
|
72
78
|
const r = d({ jsonrpc: '2.0', method: 'nope', id: 4 })
|
|
73
79
|
assert(r !== null && 'error' in r && r.error.code === -32601)
|
|
74
80
|
},
|
|
81
|
+
// `method` is untrusted wire data: an inherited `Object.prototype`
|
|
82
|
+
// name must not resolve to a callable.
|
|
83
|
+
inheritedToString: () => {
|
|
84
|
+
const r = d({ jsonrpc: '2.0', method: 'toString', id: 4 })
|
|
85
|
+
assert(r !== null && 'error' in r && r.error.code === -32601)
|
|
86
|
+
},
|
|
87
|
+
inheritedConstructor: () => {
|
|
88
|
+
const r = d({ jsonrpc: '2.0', method: 'constructor', id: 4 })
|
|
89
|
+
assert(r !== null && 'error' in r && r.error.code === -32601)
|
|
90
|
+
},
|
|
91
|
+
// ... while an *own* property of that name is an ordinary method.
|
|
92
|
+
ownPrototypeName: () => {
|
|
93
|
+
const r = dOwnPrototypeName({ jsonrpc: '2.0', method: 'toString', id: 4 })
|
|
94
|
+
assert(r !== null && 'result' in r && r.result === 'own')
|
|
95
|
+
},
|
|
75
96
|
invalidRequest: () => {
|
|
76
97
|
const r = d({ jsonrpc: '1.0', method: 'ping', id: 5 })
|
|
77
98
|
assert(r !== null && 'error' in r && r.error.code === -32600 && r.id === null)
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* @import { Effect, Operation } from '../../effects/types.ts'
|
|
4
4
|
* @import { MemOperationMap } from '../../effects/mock/types.ts'
|
|
5
5
|
* @import { Key, MemOp } from '../../effects/memory/types.ts'
|
|
6
|
+
* @import { Ts } from '../../types/rtti/ts/types.ts'
|
|
6
7
|
* @import {
|
|
7
8
|
* ToolsListParams, ToolsListResult, ToolsCallParams, ToolsCallResult,
|
|
8
9
|
* McpHandlers, McpConfig, McpSessionState,
|
|
@@ -50,4 +51,7 @@ export declare const proof: {
|
|
|
50
51
|
toolsCallWithoutCapabilityReturnsMethodNotFound: () => void;
|
|
51
52
|
unknownMethodReturnsMethodNotFound: () => void;
|
|
52
53
|
};
|
|
54
|
+
registry: {
|
|
55
|
+
toolsCallAbsentArgumentsDefaultsToEmptyObject: () => void;
|
|
56
|
+
};
|
|
53
57
|
};
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* @import { Effect, Operation } from '../../effects/types.ts'
|
|
4
4
|
* @import { MemOperationMap } from '../../effects/mock/types.ts'
|
|
5
5
|
* @import { Key, MemOp } from '../../effects/memory/types.ts'
|
|
6
|
+
* @import { Ts } from '../../types/rtti/ts/types.ts'
|
|
6
7
|
* @import {
|
|
7
8
|
* ToolsListParams, ToolsListResult, ToolsCallParams, ToolsCallResult,
|
|
8
9
|
* McpHandlers, McpConfig, McpSessionState,
|
|
@@ -10,12 +11,11 @@
|
|
|
10
11
|
*/
|
|
11
12
|
|
|
12
13
|
import { assert, assertEq } from '../../asserts/module.f.mjs'
|
|
13
|
-
import { pure, step } from '../../effects/module.f.mjs'
|
|
14
|
-
import { eff } from '../../effects/eff/module.f.mjs'
|
|
14
|
+
import { history, historyStep, mapStep, pure, step, runPure } from '../../effects/module.f.mjs'
|
|
15
15
|
import { run } from '../../effects/mock/module.f.mjs'
|
|
16
16
|
import { asBase, asNominal, create, read } from '../../effects/memory/module.f.mjs'
|
|
17
17
|
import {
|
|
18
|
-
uninitializedState, mcpStep, notInitialized,
|
|
18
|
+
uninitializedState, mcpStep, notInitialized, fromRegistry, toolEntry, okResult,
|
|
19
19
|
} from './module.f.mjs'
|
|
20
20
|
|
|
21
21
|
// ── Memory mock ────────────────────────────────────────────────────────────────
|
|
@@ -80,40 +80,44 @@ const runMem = effect =>
|
|
|
80
80
|
/** @type {<T>(e: Effect<Operation, T>) => Effect<MemOp, T>} */
|
|
81
81
|
const asMemEffect = e => /** @type {Effect<MemOp, any>} */ (/** @type {unknown} */ (e))
|
|
82
82
|
|
|
83
|
+
// Pairs the last step's response with the session state read back afterwards.
|
|
84
|
+
// The response is still needed after the read, so it is carried forward in a
|
|
85
|
+
// history rather than closed over by a nested continuation.
|
|
86
|
+
/** @type {(key: Key<McpSessionState>) => (e: Effect<Operation, unknown>) => Effect<Operation, _StepResult>} */
|
|
87
|
+
const withState = key => e => {
|
|
88
|
+
const read0 = historyStep(history(e), () => read(key))
|
|
89
|
+
return mapStep(read0, ([state, resp]) => /** @type {const} */ ([resp, state]))
|
|
90
|
+
}
|
|
91
|
+
|
|
83
92
|
// Run one step from uninitializedState, return [response, newState].
|
|
84
93
|
/** @type {(cfg: McpConfig) => (msg: unknown) => _StepResult} */
|
|
85
94
|
const step1 = cfg => msg =>
|
|
86
95
|
runMem(asMemEffect(step(
|
|
87
96
|
create(/** @type {McpSessionState} */ (uninitializedState)),
|
|
88
|
-
key =>
|
|
89
|
-
mcpStep(cfg)(handlers)(key)(/** @type {Unknown} */ (msg)),
|
|
90
|
-
resp => step(
|
|
91
|
-
read(key),
|
|
92
|
-
state => pure(/** @type {const} */ ([resp, state])),
|
|
93
|
-
),
|
|
94
|
-
),
|
|
95
|
-
)))
|
|
97
|
+
key => withState(key)(mcpStep(cfg)(handlers)(key)(/** @type {Unknown} */ (msg))))))
|
|
96
98
|
|
|
97
99
|
// Run initialize then a second step, return [response, newState] of the second.
|
|
98
100
|
/** @type {(cfg: McpConfig) => (msg1: unknown) => (msg2: unknown) => _StepResult} */
|
|
99
101
|
const step2 = cfg => msg1 => msg2 =>
|
|
100
|
-
runMem(asMemEffect(
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
).value).value).value))
|
|
102
|
+
runMem(asMemEffect(step(
|
|
103
|
+
create(/** @type {McpSessionState} */ (uninitializedState)),
|
|
104
|
+
key => {
|
|
105
|
+
const r1 = mcpStep(cfg)(handlers)(key)(/** @type {Unknown} */ (msg1))
|
|
106
|
+
const r2 = step(r1, () => mcpStep(cfg)(handlers)(key)(/** @type {Unknown} */ (msg2)))
|
|
107
|
+
return withState(key)(r2)
|
|
108
|
+
})))
|
|
108
109
|
|
|
109
110
|
// Run initialize, notifications/initialized, then a third step; return [response, newState] of the third.
|
|
110
111
|
/** @type {(cfg: McpConfig) => (msg1: unknown) => (msg2: unknown) => (msg3: unknown) => _StepResult} */
|
|
111
112
|
const step3 = cfg => msg1 => msg2 => msg3 =>
|
|
112
|
-
runMem(asMemEffect(
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
113
|
+
runMem(asMemEffect(step(
|
|
114
|
+
create(/** @type {McpSessionState} */ (uninitializedState)),
|
|
115
|
+
key => {
|
|
116
|
+
const r1 = mcpStep(cfg)(handlers)(key)(/** @type {Unknown} */ (msg1))
|
|
117
|
+
const r2 = step(r1, () => mcpStep(cfg)(handlers)(key)(/** @type {Unknown} */ (msg2)))
|
|
118
|
+
const r3 = step(r2, () => mcpStep(cfg)(handlers)(key)(/** @type {Unknown} */ (msg3)))
|
|
119
|
+
return withState(key)(r3)
|
|
120
|
+
})))
|
|
117
121
|
|
|
118
122
|
// ── Test messages ─────────────────────────────────────────────────────────────
|
|
119
123
|
|
|
@@ -309,4 +313,23 @@ export const proof = {
|
|
|
309
313
|
assertEq(/** @type {{ error: { code: number } }} */ (resp).error.code, -32601)
|
|
310
314
|
},
|
|
311
315
|
},
|
|
316
|
+
|
|
317
|
+
registry: {
|
|
318
|
+
// `fromRegistry`'s `toolsCall` defaults a missing `arguments` field to
|
|
319
|
+
// `{}` before dispatching to the matched entry's `handle`. Exercised
|
|
320
|
+
// here directly (bypassing `mcpStep`) so the default reaches
|
|
321
|
+
// `toolEntry`'s own validation: if it were left `undefined` instead,
|
|
322
|
+
// validating it against the empty-object schema below would fail and
|
|
323
|
+
// this would observe an error result instead of `ok`.
|
|
324
|
+
toolsCallAbsentArgumentsDefaultsToEmptyObject: () => {
|
|
325
|
+
const echoArgs = /** @type {const} */ ({})
|
|
326
|
+
const entry = toolEntry('echo', 'echoes', echoArgs,
|
|
327
|
+
/** @type {(a: Ts<typeof echoArgs>) => Effect<never, ToolsCallResult>} */
|
|
328
|
+
(() => pure(okResult('ok'))))
|
|
329
|
+
const handlers = fromRegistry([entry])
|
|
330
|
+
const [result] = runPure(handlers.toolsCall({ name: 'echo' }))
|
|
331
|
+
assert(result !== undefined)
|
|
332
|
+
assertEq(/** @type {{ readonly text: string }} */ (result.content[0]).text, 'ok')
|
|
333
|
+
},
|
|
334
|
+
},
|
|
312
335
|
}
|