functionalscript 0.44.0 → 0.46.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 +5 -3
- package/fjs/asn.1/module.f.mjs +8 -1
- package/fjs/asn.1/proof.f.d.mts +15 -0
- package/fjs/asn.1/proof.f.mjs +31 -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/module.f.mjs +22 -5
- 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/module.f.d.mts +32 -6
- package/fjs/bnf/data/module.f.mjs +112 -7
- package/fjs/bnf/data/proof.f.d.mts +2 -0
- package/fjs/bnf/data/proof.f.mjs +74 -4
- package/fjs/bnf/data/types.d.ts +20 -2
- package/fjs/bnf/descent/module.f.d.mts +34 -5
- package/fjs/bnf/descent/module.f.mjs +176 -54
- package/fjs/bnf/descent/proof.f.d.mts +3 -0
- package/fjs/bnf/descent/proof.f.mjs +189 -27
- package/fjs/bnf/descent/types.d.ts +24 -18
- package/fjs/bnf/ll1/module.f.d.mts +74 -6
- package/fjs/bnf/ll1/module.f.mjs +297 -95
- package/fjs/bnf/ll1/proof.f.d.mts +17 -2
- package/fjs/bnf/ll1/proof.f.mjs +372 -137
- package/fjs/bnf/ll1/types.d.ts +25 -27
- package/fjs/bnf/matcher/module.f.d.mts +66 -0
- package/fjs/bnf/matcher/module.f.mjs +81 -0
- package/fjs/bnf/matcher/proof.f.d.mts +10 -0
- package/fjs/bnf/matcher/proof.f.mjs +79 -0
- package/fjs/bnf/matcher/types.d.ts +54 -0
- 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/testlib.f.d.mts +31 -0
- package/fjs/bnf/testlib.f.mjs +80 -0
- 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/module.f.d.mts +1 -1
- package/fjs/cas/cli/module.f.mjs +14 -20
- package/fjs/cas/cli/proof.f.d.mts +4 -4
- package/fjs/cas/cli/proof.f.mjs +47 -34
- package/fjs/cas/evo/module.f.d.mts +71 -31
- package/fjs/cas/evo/module.f.mjs +223 -138
- package/fjs/cas/evo/proof.f.d.mts +10 -1
- package/fjs/cas/evo/proof.f.mjs +311 -226
- package/fjs/cas/evo/types.d.ts +45 -9
- package/fjs/cas/module.f.d.mts +18 -32
- package/fjs/cas/module.f.mjs +164 -176
- package/fjs/cas/proof.f.d.mts +11 -8
- package/fjs/cas/proof.f.mjs +259 -147
- package/fjs/cas/types.d.ts +24 -10
- 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 +3 -3
- package/fjs/ci/config/module.f.mjs +3 -3
- package/fjs/ci/module.f.d.mts +5 -5
- package/fjs/ci/module.f.mjs +8 -7
- package/fjs/ci/nix/module.f.d.mts +7 -5
- package/fjs/ci/nix/module.f.mjs +13 -12
- package/fjs/ci/nix/proof.f.d.mts +2 -0
- package/fjs/ci/nix/proof.f.mjs +4 -4
- package/fjs/ci/proof.f.d.mts +4 -2
- package/fjs/ci/proof.f.mjs +13 -8
- package/fjs/cli/module.f.d.mts +4 -6
- package/fjs/cli/module.f.mjs +4 -8
- package/fjs/cli/proof.f.d.mts +4 -2
- package/fjs/cli/proof.f.mjs +21 -18
- package/fjs/cli/types.d.ts +2 -3
- 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/hmac/module.f.mjs +2 -2
- package/fjs/crypto/secp/proof.f.d.mts +3 -1
- package/fjs/crypto/secp/proof.f.mjs +3 -1
- package/fjs/crypto/sha2/module.f.mjs +3 -1
- package/fjs/crypto/sha2/proof.f.d.mts +4 -1
- package/fjs/crypto/sha2/proof.f.mjs +27 -1
- package/fjs/crypto/sha2/types.d.ts +11 -0
- package/fjs/crypto/sign/module.f.mjs +2 -2
- 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 +17 -5
- package/fjs/dev/module.f.mjs +60 -30
- package/fjs/dev/update/module.f.d.mts +11 -3
- package/fjs/dev/update/module.f.mjs +16 -11
- package/fjs/dev/update/proof.f.d.mts +4 -3
- package/fjs/dev/update/proof.f.mjs +11 -7
- package/fjs/djs/module.f.d.mts +13 -5
- package/fjs/djs/module.f.mjs +31 -16
- package/fjs/djs/parser/module.f.d.mts +16 -3
- package/fjs/djs/parser/module.f.mjs +135 -16
- package/fjs/djs/parser/proof.f.d.mts +8 -1
- package/fjs/djs/parser/proof.f.mjs +287 -13
- package/fjs/djs/parser/types.d.ts +7 -1
- package/fjs/djs/proof.f.d.mts +20 -1
- package/fjs/djs/proof.f.mjs +190 -12
- package/fjs/djs/serializer/module.f.d.mts +25 -8
- package/fjs/djs/serializer/module.f.mjs +66 -19
- package/fjs/djs/serializer/proof.f.d.mts +5 -0
- package/fjs/djs/serializer/proof.f.mjs +23 -1
- package/fjs/djs/tokenizer/module.f.d.mts +17 -5
- package/fjs/djs/tokenizer/module.f.mjs +120 -73
- package/fjs/djs/tokenizer/proof.f.d.mts +3 -0
- package/fjs/djs/tokenizer/proof.f.mjs +86 -67
- package/fjs/djs/transpiler/module.f.d.mts +13 -19
- package/fjs/djs/transpiler/module.f.mjs +79 -72
- package/fjs/djs/transpiler/types.d.ts +29 -0
- package/fjs/djs/types.d.ts +7 -1
- package/fjs/effects/list/module.f.d.mts +23 -12
- package/fjs/effects/list/module.f.mjs +16 -12
- package/fjs/effects/list/types.d.ts +27 -7
- package/fjs/effects/memory/module.f.d.mts +6 -3
- package/fjs/effects/memory/module.f.mjs +7 -7
- package/fjs/effects/memory/proof.f.d.mts +4 -0
- package/fjs/effects/memory/proof.f.mjs +18 -9
- package/fjs/effects/memory/types.d.ts +4 -3
- package/fjs/effects/mock/module.f.d.mts +28 -4
- package/fjs/effects/mock/module.f.mjs +39 -5
- package/fjs/effects/mock/types.d.ts +10 -1
- package/fjs/effects/module.d.mts +12 -2
- package/fjs/effects/module.f.d.mts +469 -281
- package/fjs/effects/module.f.mjs +538 -299
- package/fjs/effects/module.mjs +11 -2
- package/fjs/effects/node/memory/module.d.mts +7 -2
- package/fjs/effects/node/memory/module.mjs +9 -5
- package/fjs/effects/node/memory/proof.d.mts +2 -0
- package/fjs/effects/node/memory/proof.mjs +12 -5
- package/fjs/effects/node/module.d.mts +8 -2
- package/fjs/effects/node/module.f.d.mts +183 -43
- package/fjs/effects/node/module.f.mjs +260 -62
- package/fjs/effects/node/module.mjs +61 -50
- package/fjs/effects/node/proof.f.d.mts +28 -2
- package/fjs/effects/node/proof.f.mjs +161 -42
- package/fjs/effects/node/types.d.ts +106 -18
- package/fjs/effects/node/virtual/module.f.d.mts +21 -4
- package/fjs/effects/node/virtual/module.f.mjs +113 -70
- package/fjs/effects/node/virtual/proof.f.d.mts +31 -2
- package/fjs/effects/node/virtual/proof.f.mjs +201 -8
- package/fjs/effects/proof.f.d.mts +69 -34
- package/fjs/effects/proof.f.mjs +413 -130
- package/fjs/effects/types.d.ts +161 -33
- 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 +22 -10
- package/fjs/emergent_testing/module.f.mjs +119 -85
- package/fjs/emergent_testing/proof.f.d.mts +21 -7
- package/fjs/emergent_testing/proof.f.mjs +169 -35
- package/fjs/emergent_testing/types.d.ts +22 -4
- 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/module.f.d.mts +14 -4
- package/fjs/fsm/module.f.mjs +54 -37
- package/fjs/fsm/proof.f.d.mts +5 -0
- package/fjs/fsm/proof.f.mjs +87 -115
- package/fjs/js/keywords/module.f.d.mts +52 -0
- package/fjs/js/keywords/module.f.mjs +72 -0
- package/fjs/{emergent_testing/scenarios/return-value.pass.d.ts → js/keywords/proof.f.d.mts} +1 -1
- package/fjs/js/keywords/proof.f.mjs +13 -0
- package/fjs/js/tokenizer/module.f.d.mts +30 -3
- package/fjs/js/tokenizer/module.f.mjs +161 -211
- package/fjs/js/tokenizer/proof.f.d.mts +1 -0
- package/fjs/js/tokenizer/proof.f.mjs +54 -24
- package/fjs/js/tokenizer/types.d.ts +33 -24
- package/fjs/mcp/cas/module.f.d.mts +1 -6
- package/fjs/mcp/cas/module.f.mjs +55 -51
- package/fjs/mcp/cas/proof.f.d.mts +15 -0
- package/fjs/mcp/cas/proof.f.mjs +174 -0
- package/fjs/mcp/evo/module.f.d.mts +19 -10
- package/fjs/mcp/evo/module.f.mjs +48 -27
- package/fjs/mcp/evo/proof.f.d.mts +6 -1
- package/fjs/mcp/evo/proof.f.mjs +115 -31
- package/fjs/mcp/module.f.d.mts +39 -4
- package/fjs/mcp/module.f.mjs +14 -12
- package/fjs/mcp/proof.f.d.mts +13 -1
- package/fjs/mcp/proof.f.mjs +120 -61
- package/fjs/media/html/module.f.d.mts +12 -0
- package/fjs/media/html/module.f.mjs +7 -5
- package/fjs/media/html/proof.f.d.mts +3 -0
- package/fjs/media/html/proof.f.mjs +4 -1
- package/fjs/media/json/extended/module.f.d.mts +82 -0
- package/fjs/media/json/extended/module.f.mjs +153 -0
- package/fjs/media/json/extended/proof.f.d.mts +42 -0
- package/fjs/media/json/extended/proof.f.mjs +127 -0
- package/fjs/media/json/extended/types.d.ts +23 -0
- package/fjs/media/json/module.f.d.mts +8 -2
- package/fjs/media/json/module.f.mjs +43 -41
- package/fjs/media/json/number/module.f.d.mts +59 -0
- package/fjs/media/json/number/module.f.mjs +136 -0
- package/fjs/media/json/number/proof.f.d.mts +24 -0
- package/fjs/media/json/number/proof.f.mjs +86 -0
- package/fjs/media/json/number/types.d.ts +28 -0
- package/fjs/media/json/parser/module.f.d.mts +25 -13
- package/fjs/media/json/parser/module.f.mjs +133 -72
- package/fjs/media/json/parser/proof.f.d.mts +5 -0
- package/fjs/media/json/parser/proof.f.mjs +31 -1
- package/fjs/media/json/parser/types.d.ts +38 -14
- package/fjs/media/json/rtti/module.f.d.mts +1 -1
- package/fjs/media/json/rtti/module.f.mjs +1 -1
- package/fjs/media/json/rtti/proof.f.d.mts +3 -0
- package/fjs/media/json/rtti/proof.f.mjs +12 -12
- package/fjs/media/json/schema/module.f.d.mts +61 -27
- package/fjs/media/json/schema/module.f.mjs +218 -63
- package/fjs/media/json/schema/proof.f.d.mts +41 -1
- package/fjs/media/json/schema/proof.f.mjs +220 -9
- package/fjs/media/json/serializer/module.f.d.mts +44 -0
- package/fjs/media/json/serializer/module.f.mjs +71 -9
- package/fjs/media/json/tokenizer/module.f.d.mts +8 -0
- package/fjs/media/json/tokenizer/module.f.mjs +31 -8
- package/fjs/media/json/tokenizer/proof.f.d.mts +6 -0
- package/fjs/media/json/tokenizer/proof.f.mjs +62 -21
- package/fjs/media/json/types.d.ts +36 -10
- package/fjs/media/lock/module.f.d.mts +100 -0
- package/fjs/media/lock/module.f.mjs +125 -0
- package/fjs/media/lock/proof.f.d.mts +33 -0
- package/fjs/media/lock/proof.f.mjs +196 -0
- package/fjs/media/lock/types.d.ts +15 -0
- package/fjs/media/module.f.d.mts +6 -5
- package/fjs/media/module.f.mjs +8 -7
- 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/note/module.f.d.mts +121 -0
- package/fjs/media/note/module.f.mjs +131 -0
- package/fjs/media/note/proof.f.d.mts +29 -0
- package/fjs/media/note/proof.f.mjs +150 -0
- package/fjs/media/note/types.d.ts +10 -0
- package/fjs/media/proof.f.d.mts +4 -1
- package/fjs/media/proof.f.mjs +40 -21
- package/fjs/media/revision/module.f.d.mts +83 -7
- package/fjs/media/revision/module.f.mjs +127 -23
- package/fjs/media/revision/proof.f.d.mts +14 -0
- package/fjs/media/revision/proof.f.mjs +93 -2
- package/fjs/media/revision/types.d.ts +34 -5
- package/fjs/media/type/module.f.d.mts +53 -18
- package/fjs/media/type/module.f.mjs +87 -97
- package/fjs/media/type/proof.f.d.mts +17 -0
- package/fjs/media/type/proof.f.mjs +73 -13
- package/fjs/module.d.mts +5 -0
- package/fjs/module.f.d.mts +8 -0
- package/fjs/module.f.mjs +33 -10
- package/fjs/module.mjs +6 -0
- package/fjs/nanvm/proof.f.mjs +3 -3
- package/fjs/nanvm/rust/module.f.mjs +1 -1
- package/fjs/nanvm/update/module.f.d.mts +4 -4
- package/fjs/nanvm/update/module.f.mjs +8 -9
- package/fjs/nanvm/update/proof.f.mjs +4 -3
- package/fjs/path/module.f.d.mts +8 -0
- package/fjs/path/module.f.mjs +4 -2
- package/fjs/proof.f.d.mts +7 -3
- package/fjs/proof.f.mjs +41 -12
- package/fjs/protocol/json_rpc/module.f.d.mts +3 -3
- package/fjs/protocol/json_rpc/module.f.mjs +10 -7
- package/fjs/protocol/json_rpc/proof.f.d.mts +6 -0
- package/fjs/protocol/json_rpc/proof.f.mjs +26 -5
- package/fjs/protocol/mcp/module.f.d.mts +10 -13
- package/fjs/protocol/mcp/module.f.mjs +74 -58
- package/fjs/protocol/mcp/proof.f.d.mts +16 -3
- package/fjs/protocol/mcp/proof.f.mjs +224 -69
- package/fjs/protocol/mcp/stdio/module.f.d.mts +17 -11
- package/fjs/protocol/mcp/stdio/module.f.mjs +39 -33
- package/fjs/protocol/mcp/stdio/proof.f.d.mts +5 -3
- package/fjs/protocol/mcp/stdio/proof.f.mjs +46 -13
- package/fjs/protocol/mcp/stdio/types.d.ts +14 -0
- package/fjs/protocol/mcp/types.d.ts +17 -6
- package/fjs/sul/id/module.f.d.mts +4 -0
- package/fjs/sul/id/module.f.mjs +6 -6
- package/fjs/sul/level/hash/module.f.d.mts +4 -1
- package/fjs/sul/level/hash/module.f.mjs +6 -4
- package/fjs/sul/level/hash/proof.f.d.mts +4 -0
- package/fjs/sul/level/hash/proof.f.mjs +7 -4
- 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 +23 -17
- 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 +29 -3
- package/fjs/text/code_point/module.f.mjs +32 -9
- package/fjs/text/code_point/proof.f.d.mts +2 -0
- package/fjs/text/code_point/proof.f.mjs +39 -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 +6 -5
- package/fjs/text/sgr/module.f.mjs +8 -8
- 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 +38 -35
- package/fjs/text/utf16/proof.f.d.mts +3 -1
- package/fjs/text/utf16/proof.f.mjs +19 -2
- package/fjs/text/utf8/module.f.d.mts +9 -5
- package/fjs/text/utf8/module.f.mjs +20 -20
- package/fjs/types/array/module.f.d.mts +2 -1
- package/fjs/types/array/module.f.mjs +16 -4
- 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 -16
- package/fjs/types/bit_vec/module.f.mjs +99 -95
- package/fjs/types/bit_vec/proof.f.d.mts +6 -0
- package/fjs/types/bit_vec/proof.f.mjs +31 -5
- 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 +10 -10
- 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 +14 -17
- package/fjs/types/btree/set/proof.f.d.mts +3 -0
- package/fjs/types/btree/set/proof.f.mjs +16 -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 +20 -4
- package/fjs/types/byte_set/module.f.mjs +18 -8
- package/fjs/types/byte_set/proof.f.d.mts +3 -1
- package/fjs/types/byte_set/proof.f.mjs +10 -8
- package/fjs/types/function/compare/module.f.d.mts +3 -2
- package/fjs/types/function/compare/module.f.mjs +13 -5
- 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 +10 -3
- package/fjs/types/list/module.f.mjs +6 -4
- 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 +26 -6
- package/fjs/types/nullable/module.f.mjs +25 -6
- package/fjs/types/nullable/proof.f.d.mts +4 -0
- package/fjs/types/nullable/proof.f.mjs +15 -0
- 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 +26 -4
- package/fjs/types/object/module.f.mjs +26 -7
- 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 +27 -12
- 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 +44 -14
- package/fjs/types/rtti/common/module.f.mjs +42 -36
- package/fjs/types/rtti/common/proof.f.d.mts +4 -0
- package/fjs/types/rtti/common/proof.f.mjs +10 -7
- package/fjs/types/rtti/data/module.f.d.mts +134 -0
- package/fjs/types/rtti/data/module.f.mjs +1053 -0
- package/fjs/types/rtti/data/proof.f.d.mts +76 -0
- package/fjs/types/rtti/data/proof.f.mjs +589 -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 +48 -0
- package/fjs/types/rtti/parse/module.f.mjs +45 -34
- package/fjs/types/rtti/parse/proof.f.d.mts +3 -2
- package/fjs/types/rtti/parse/proof.f.mjs +51 -52
- package/fjs/types/rtti/proof.f.d.mts +3 -1
- package/fjs/types/rtti/proof.f.mjs +6 -2
- package/fjs/types/rtti/ts/module.f.d.mts +68 -9
- package/fjs/types/rtti/ts/module.f.mjs +258 -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 +25 -1
- package/fjs/types/rtti/types.d.ts +40 -0
- 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 +49 -1
- package/fjs/types/sorted_set/module.f.mjs +26 -2
- package/fjs/types/sorted_set/proof.f.d.mts +4 -1
- package/fjs/types/sorted_set/proof.f.mjs +19 -2
- 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 +5 -2
- package/fjs/website/module.f.mjs +6 -8
- package/fjs/website/proof.f.mjs +2 -1
- 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/package_json/module.f.d.mts +0 -32
- package/fjs/dev/package_json/module.f.mjs +0 -37
- package/fjs/dev/package_json/proof.f.d.mts +0 -6
- package/fjs/dev/package_json/proof.f.mjs +0 -32
- 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/module.f.d.mts +0 -10
- package/fjs/effects/eff/module.f.mjs +0 -68
- package/fjs/effects/eff/proof.f.d.mts +0 -12
- package/fjs/effects/eff/proof.f.mjs +0 -66
- package/fjs/effects/eff/types.d.ts +0 -71
- 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.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/module.f.d.mts +0 -6
- package/fjs/types/rtti/validate/module.f.mjs +0 -169
- package/fjs/types/rtti/validate/proof.f.d.mts +0 -125
- package/fjs/types/rtti/validate/proof.f.mjs +0 -437
- package/fjs/types/rtti/validate/types.d.ts +0 -6
- 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,13 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @import { Vec } from '../../types/bit_vec/types.ts'
|
|
3
|
+
* @import { List } from '../../effects/list/types.ts'
|
|
4
|
+
* @import { IoChannel } from '../../effects/node/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
|
-
|
|
7
|
-
|
|
8
|
-
import {
|
|
12
|
+
import { pureError } from '../../effects/module.f.mjs'
|
|
13
|
+
import { error, ok } from '../../types/result/module.f.mjs'
|
|
14
|
+
import { ioError } from '../../effects/node/module.f.mjs'
|
|
9
15
|
import { detect, detectStream, detectVec } from './module.f.mjs'
|
|
10
|
-
/** @import { DetectMeta } from './types.ts' */
|
|
11
16
|
|
|
12
17
|
// Builds a big-endian `Vec` from a list of byte values — mirrors how the CAS
|
|
13
18
|
// store would hold the leading bytes of a stored blob.
|
|
@@ -16,12 +21,12 @@ const bytes = (...b) => u8ListToVec(msb)(b)
|
|
|
16
21
|
|
|
17
22
|
// ── Streaming detector helpers ──────────────────────────────────────────────────
|
|
18
23
|
|
|
19
|
-
// Builds a CAS-style read stream from a sequence of
|
|
20
|
-
/** @type {(...chunks: readonly Vec[]) => List<never,
|
|
24
|
+
// Builds a CAS-style read stream from a sequence of chunks.
|
|
25
|
+
/** @type {(...chunks: readonly Vec[]) => List<never, Vec, IoChannel>} */
|
|
21
26
|
const stream = (...chunks) =>
|
|
22
27
|
chunks.reduceRight(
|
|
23
|
-
(tail, c) => nonEmpty(
|
|
24
|
-
/** @
|
|
28
|
+
(tail, c) => nonEmpty(c, tail),
|
|
29
|
+
/** @satisfies {List<never, Vec, IoChannel>} */ (emptyList()))
|
|
25
30
|
|
|
26
31
|
// Runs the streaming detector over the given chunks and unwraps the metadata.
|
|
27
32
|
/** @type {(...chunks: readonly Vec[]) => DetectMeta} */
|
|
@@ -61,6 +66,11 @@ export const proof = {
|
|
|
61
66
|
emptyZip: () =>
|
|
62
67
|
assertEq(detect(bytes(0x50, 0x4b, 0x05, 0x06, 0x00, 0x00)), 'application/zip'),
|
|
63
68
|
|
|
69
|
+
// A spanned ZIP archive — the third "PK" variant, so every entry of the
|
|
70
|
+
// signature list has a case that fails if it is dropped.
|
|
71
|
+
spannedZip: () =>
|
|
72
|
+
assertEq(detect(bytes(0x50, 0x4b, 0x07, 0x08, 0x00, 0x00)), 'application/zip'),
|
|
73
|
+
|
|
64
74
|
webp: () =>
|
|
65
75
|
// "RIFF" + 4-byte size + "WEBP"
|
|
66
76
|
assertEq(
|
|
@@ -76,6 +86,25 @@ export const proof = {
|
|
|
76
86
|
null),
|
|
77
87
|
|
|
78
88
|
// Plain ASCII text matches no signature.
|
|
89
|
+
// `detect` is the magic projection of `push`, and that only holds because
|
|
90
|
+
// `magicStep` leaves a non-`scan` state alone. These pin both absorbing
|
|
91
|
+
// states as fixed points from the outside, where `magicStep` is private.
|
|
92
|
+
settledMagicIsAFixedPoint: [
|
|
93
|
+
// `matched` survives whatever follows the signature — including bytes
|
|
94
|
+
// that would not extend it, and a long tail that would otherwise keep
|
|
95
|
+
// the fold running.
|
|
96
|
+
() => assertEq(detect(bytes(0xff, 0xd8, 0xff, 0x00, 0x01, 0x02)), 'image/jpeg'),
|
|
97
|
+
() => assertEq(detect(bytes(0xff, 0xd8, 0xff, ...Array(64).fill(0x41))), 'image/jpeg'),
|
|
98
|
+
// `dead` survives too. This is the case where `push` keeps folding
|
|
99
|
+
// after the magic state is settled — `isSettled` stays false while the
|
|
100
|
+
// UTF-8 factor is still valid text — so a `dead` magic is fed many more
|
|
101
|
+
// bytes here than `detect`'s old loop ever gave it.
|
|
102
|
+
() => assertEq(detect(bytes(0x41)), null),
|
|
103
|
+
() => assertEq(detect(bytes(0x41, ...Array(64).fill(0x42))), null),
|
|
104
|
+
// ...and the same input still reads as text through the full detector,
|
|
105
|
+
// confirming the fold really did continue past the dead magic.
|
|
106
|
+
() => assertEq(detectVec(bytes(0x41, ...Array(64).fill(0x42))).type, 'text'),
|
|
107
|
+
],
|
|
79
108
|
textIsNull: () =>
|
|
80
109
|
assertEq(detect(bytes(0x68, 0x65, 0x6c, 0x6c, 0x6f)), null),
|
|
81
110
|
|
|
@@ -86,6 +115,38 @@ export const proof = {
|
|
|
86
115
|
emptyIsNull: () =>
|
|
87
116
|
assertEq(detect(empty), null),
|
|
88
117
|
|
|
118
|
+
// Every signature, one byte short of complete. A signature is only ever
|
|
119
|
+
// recognized on its *last* byte, so each of these must still be null — an
|
|
120
|
+
// off-by-one in the eliminator's terminal-position test would report the
|
|
121
|
+
// format here, and would fire the "GIF8"-prefix trap `gif8NotGif` guards.
|
|
122
|
+
truncated: {
|
|
123
|
+
png: () =>
|
|
124
|
+
assertEq(detect(bytes(0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a)), null),
|
|
125
|
+
|
|
126
|
+
jpeg: () =>
|
|
127
|
+
assertEq(detect(bytes(0xff, 0xd8)), null),
|
|
128
|
+
|
|
129
|
+
gif87a: () =>
|
|
130
|
+
assertEq(detect(bytes(0x47, 0x49, 0x46, 0x38, 0x37)), null),
|
|
131
|
+
|
|
132
|
+
gif89a: () =>
|
|
133
|
+
assertEq(detect(bytes(0x47, 0x49, 0x46, 0x38, 0x39)), null),
|
|
134
|
+
|
|
135
|
+
pdf: () =>
|
|
136
|
+
assertEq(detect(bytes(0x25, 0x50, 0x44, 0x46)), null),
|
|
137
|
+
|
|
138
|
+
zip: () =>
|
|
139
|
+
assertEq(detect(bytes(0x50, 0x4b, 0x03)), null),
|
|
140
|
+
|
|
141
|
+
// 11 bytes: "RIFF", the size wildcards, and all but the last byte of
|
|
142
|
+
// "WEBP" — the wildcard run must not shorten the pattern either.
|
|
143
|
+
webp: () =>
|
|
144
|
+
assertEq(
|
|
145
|
+
detect(bytes(
|
|
146
|
+
0x52, 0x49, 0x46, 0x46, 0x1a, 0x00, 0x00, 0x00, 0x57, 0x45, 0x42)),
|
|
147
|
+
null),
|
|
148
|
+
},
|
|
149
|
+
|
|
89
150
|
// ── Streaming detector (detectStream) ───────────────────────────────────────
|
|
90
151
|
|
|
91
152
|
stream: {
|
|
@@ -230,11 +291,10 @@ export const proof = {
|
|
|
230
291
|
assertEq(m.length, 8n)
|
|
231
292
|
},
|
|
232
293
|
|
|
233
|
-
// A
|
|
294
|
+
// A stream that fails carries its failure out as the detector's own.
|
|
234
295
|
readErrorSurfaces: () => {
|
|
235
|
-
/** @type {List<never,
|
|
236
|
-
const errStream =
|
|
237
|
-
nonEmpty(/** @type {const} */ (['error', 'boom']), emptyList())
|
|
296
|
+
/** @type {List<never, Vec, IoChannel>} */
|
|
297
|
+
const errStream = pureError(ioError({ message: 'boom' }))
|
|
238
298
|
const o = runPure(detectStream(errStream))
|
|
239
299
|
assert(o.length === 1, 'effect is not pure')
|
|
240
300
|
assert(o[0][0] === 'error')
|
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,18 +2,19 @@
|
|
|
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
|
-
import { import_ } from './effects/node/module.f.mjs'
|
|
11
|
-
/** @import { NodeOp, NodeProgram } from './effects/node/types.ts' */
|
|
14
|
+
import { errorExit, errorMessage, exitStep, import_ } from './effects/node/module.f.mjs'
|
|
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
|
-
import {
|
|
16
|
-
import { unwrap } from './types/result/module.f.mjs'
|
|
17
|
+
import { resultStep } from './effects/module.f.mjs'
|
|
17
18
|
|
|
18
19
|
/** @type {Commands<NodeOp>} */
|
|
19
20
|
const commands = [
|
|
@@ -35,9 +36,17 @@ const commands = [
|
|
|
35
36
|
{
|
|
36
37
|
names: ['mcp', 'm'],
|
|
37
38
|
description: 'Run an MCP server over stdio exposing the CAS and Evo (subjects/heads) as tools',
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
39
|
+
// `exitStep`, not `resultStep(…, () => pureOk(0))`: the server's
|
|
40
|
+
// bootstrap can fail, and a continuation that ignores its result would
|
|
41
|
+
// report a server that never started as a clean exit.
|
|
42
|
+
//
|
|
43
|
+
// The types do *not* rule that out. `Program`'s exit code being a
|
|
44
|
+
// `Result` catches the old spelling — `() => pure(0)` hands back a bare
|
|
45
|
+
// number, which no longer fits — but `() => pureOk(0)` still compiles,
|
|
46
|
+
// because discarding a result you were handed is exactly what a
|
|
47
|
+
// continuation is allowed to do. This comment guards a mistake that is
|
|
48
|
+
// still available.
|
|
49
|
+
handler: ({ home }) => exitStep(casMcpServer(home)),
|
|
41
50
|
},
|
|
42
51
|
{
|
|
43
52
|
names: ['ci', 'i'],
|
|
@@ -47,11 +56,25 @@ const commands = [
|
|
|
47
56
|
{
|
|
48
57
|
names: ['run', 'r'],
|
|
49
58
|
description: 'Run a FunctionalScript module as a NodeProgram',
|
|
59
|
+
// Both ways this can fail are the command line, not a defect: the
|
|
60
|
+
// named file may not import, and a module that does import may export
|
|
61
|
+
// no `main`. Neither deserves a stack trace, so both are reported on
|
|
62
|
+
// `stderr` and exit `1` — the same answer an unknown command gets a
|
|
63
|
+
// few lines up, and the same one every other command now gives.
|
|
50
64
|
handler: options => {
|
|
51
65
|
const [file, ...args] = options.args
|
|
52
|
-
return
|
|
66
|
+
return resultStep(
|
|
53
67
|
import_(file),
|
|
54
|
-
|
|
68
|
+
r => {
|
|
69
|
+
if (r[0] === 'error') {
|
|
70
|
+
return errorExit(`${file}: ${errorMessage(r[1])}`)
|
|
71
|
+
}
|
|
72
|
+
const { main } = r[1]
|
|
73
|
+
if (typeof main !== 'function') {
|
|
74
|
+
return errorExit(`${file}: not a NodeProgram — no exported \`main\` function`)
|
|
75
|
+
}
|
|
76
|
+
return /** @type {NodeProgram} */ (main)({ ...options, args })
|
|
77
|
+
})
|
|
55
78
|
},
|
|
56
79
|
},
|
|
57
80
|
]
|
package/fjs/module.mjs
CHANGED
package/fjs/nanvm/proof.f.mjs
CHANGED
|
@@ -121,8 +121,8 @@ const eqProof = (() => {
|
|
|
121
121
|
})
|
|
122
122
|
/** @type {(c: EqCase) => readonly[string, () => void]} */
|
|
123
123
|
const leaf = c => [c.name, () => {
|
|
124
|
-
const a =
|
|
125
|
-
const b =
|
|
124
|
+
const a = operand(c.a)
|
|
125
|
+
const b = operand(c.b)
|
|
126
126
|
assertEq(a === b, c.eq, [a, c.eq ? '===' : '!==', b])
|
|
127
127
|
assertEq(b === a, c.eq)
|
|
128
128
|
}]
|
|
@@ -157,7 +157,7 @@ const jsOnly = {
|
|
|
157
157
|
},
|
|
158
158
|
throw: {
|
|
159
159
|
toStringThrows: () => String({ toString: () => { throw 'Custom error' } }),
|
|
160
|
-
toStringNotAFunction: () => String(
|
|
160
|
+
toStringNotAFunction: () => String({ toString: 'hello' }),
|
|
161
161
|
toStringNotPrimitive: () => String({ toString: () => [] }),
|
|
162
162
|
/** `throws` describes a case's outcome; it is not a value to build. */
|
|
163
163
|
throwsIsNotAValue: () => value(() => ['throw']),
|
|
@@ -78,7 +78,7 @@ export const valueExpr = v => {
|
|
|
78
78
|
case 'bigint': { return `bigint_any(${i64Literal(v)})` }
|
|
79
79
|
}
|
|
80
80
|
if (Array.isArray(v)) {
|
|
81
|
-
const items =
|
|
81
|
+
const items = v
|
|
82
82
|
return items.length === 0
|
|
83
83
|
? 'Array::default().to_any()'
|
|
84
84
|
: `[${items.map(valueExpr).join(', ')}].to_array().to_any()`
|
|
@@ -8,16 +8,16 @@
|
|
|
8
8
|
*
|
|
9
9
|
* @module
|
|
10
10
|
*
|
|
11
|
+
* @import { IoChannel, Mkdir, NodeProgram, WriteFile } from '../../effects/node/types.ts'
|
|
11
12
|
* @import { Effect } from '../../effects/types.ts'
|
|
12
|
-
* @import { Mkdir, NodeProgram, WriteFile } from '../../effects/node/types.ts'
|
|
13
13
|
*/
|
|
14
|
+
import type { IoChannel, Mkdir, NodeProgram, WriteFile } from '../../effects/node/types.ts';
|
|
14
15
|
import type { Effect } from '../../effects/types.ts';
|
|
15
|
-
import type { Mkdir, NodeProgram, WriteFile } from '../../effects/node/types.ts';
|
|
16
16
|
/**
|
|
17
17
|
* Regenerates `nanvm-lib/tests/test/generated.rs` from the shared test data.
|
|
18
18
|
*
|
|
19
|
-
* @type {() => Effect<Mkdir | WriteFile, void>}
|
|
19
|
+
* @type {() => Effect<Mkdir | WriteFile, void, IoChannel>}
|
|
20
20
|
*/
|
|
21
|
-
export declare const generateRustTests: () => Effect<Mkdir | WriteFile, void>;
|
|
21
|
+
export declare const generateRustTests: () => Effect<Mkdir | WriteFile, void, IoChannel>;
|
|
22
22
|
/** @type {NodeProgram} */
|
|
23
23
|
export declare const main: NodeProgram;
|
|
@@ -8,26 +8,25 @@
|
|
|
8
8
|
*
|
|
9
9
|
* @module
|
|
10
10
|
*
|
|
11
|
+
* @import { IoChannel, Mkdir, NodeProgram, WriteFile } from '../../effects/node/types.ts'
|
|
11
12
|
* @import { Effect } from '../../effects/types.ts'
|
|
12
|
-
* @import { Mkdir, NodeProgram, WriteFile } from '../../effects/node/types.ts'
|
|
13
13
|
*/
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
import { mkdir, writeUtf8File } from '../../effects/node/module.f.mjs'
|
|
17
|
-
import {
|
|
15
|
+
|
|
16
|
+
import { exitStep, mkdir, writeUtf8File } from '../../effects/node/module.f.mjs'
|
|
17
|
+
import { step } from '../../effects/module.f.mjs'
|
|
18
18
|
import { data } from '../module.f.mjs'
|
|
19
19
|
import { directory, generate, path } from '../rust/module.f.mjs'
|
|
20
20
|
|
|
21
21
|
/**
|
|
22
22
|
* Regenerates `nanvm-lib/tests/test/generated.rs` from the shared test data.
|
|
23
23
|
*
|
|
24
|
-
* @type {() => Effect<Mkdir | WriteFile, void>}
|
|
24
|
+
* @type {() => Effect<Mkdir | WriteFile, void, IoChannel>}
|
|
25
25
|
*/
|
|
26
26
|
export const generateRustTests = () => {
|
|
27
|
-
const directoryReady =
|
|
28
|
-
|
|
29
|
-
return mapStep(written, unwrap)
|
|
27
|
+
const directoryReady = mkdir(directory, { recursive: true })
|
|
28
|
+
return step(directoryReady, () => writeUtf8File(path, generate(data)))
|
|
30
29
|
}
|
|
31
30
|
|
|
32
31
|
/** @type {NodeProgram} */
|
|
33
|
-
export const main = () =>
|
|
32
|
+
export const main = () => exitStep(generateRustTests())
|
|
@@ -4,8 +4,9 @@
|
|
|
4
4
|
* @module
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
+
import { exitCode } from '../../effects/node/module.f.mjs'
|
|
7
8
|
import { assert, assertEq } from '../../asserts/module.f.mjs'
|
|
8
|
-
import { step } from '../../effects/module.f.mjs'
|
|
9
|
+
import { step as ioStep } from '../../effects/module.f.mjs'
|
|
9
10
|
import { readUtf8File } from '../../effects/node/module.f.mjs'
|
|
10
11
|
import {
|
|
11
12
|
defaultNodeProgramOptions,
|
|
@@ -20,13 +21,13 @@ export const proof = {
|
|
|
20
21
|
generateRustTests: () => {
|
|
21
22
|
// The target directory does not exist in `emptyState`, so this also
|
|
22
23
|
// covers the `mkdir` the writer does before the file write.
|
|
23
|
-
const written =
|
|
24
|
+
const written = ioStep(generateRustTests(), () => readUtf8File(path))
|
|
24
25
|
const [, [tag, result]] = virtual(emptyState)(written)
|
|
25
26
|
assert(tag === 'ok', result)
|
|
26
27
|
assertEq(result, generate(data))
|
|
27
28
|
},
|
|
28
29
|
main: () => {
|
|
29
30
|
const [, result] = virtual(emptyState)(main(defaultNodeProgramOptions))
|
|
30
|
-
assertEq(result, 0)
|
|
31
|
+
assertEq(exitCode(result), 0)
|
|
31
32
|
},
|
|
32
33
|
}
|
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
|
@@ -1,9 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @import { NodeProgram, NodeProgramOptions } from './effects/node/types.ts'
|
|
3
|
+
* @import { Dir } from './effects/node/virtual/types.ts'
|
|
4
|
+
*/
|
|
1
5
|
export declare const proof: {
|
|
2
6
|
help: () => void;
|
|
3
7
|
compileRequiresArgs: () => void;
|
|
4
8
|
runModule: () => void;
|
|
5
9
|
mcp: () => void;
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
10
|
+
mcpCorruptStore: () => void;
|
|
11
|
+
runImportError: () => void;
|
|
12
|
+
runNotANodeProgram: () => void;
|
|
9
13
|
};
|
package/fjs/proof.f.mjs
CHANGED
|
@@ -1,9 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @import { NodeProgram, NodeProgramOptions } from './effects/node/types.ts'
|
|
3
|
+
* @import { Dir } from './effects/node/virtual/types.ts'
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { exitCode } from './effects/node/module.f.mjs'
|
|
1
7
|
import { assert, assertEq } from './asserts/module.f.mjs'
|
|
2
|
-
import {
|
|
3
|
-
/** @import { NodeProgram, NodeProgramOptions } from './effects/node/types.ts' */
|
|
8
|
+
import { pureError, pureOk } from './effects/module.f.mjs'
|
|
4
9
|
import { defaultNodeProgramOptions, emptyState, virtual } from './effects/node/virtual/module.f.mjs'
|
|
5
|
-
/** @import { Dir } from './effects/node/virtual/types.ts' */
|
|
6
10
|
import { main } from './module.f.mjs'
|
|
11
|
+
import { vec8 } from './types/bit_vec/module.f.mjs'
|
|
7
12
|
|
|
8
13
|
/** @type {(args: readonly string[]) => NodeProgramOptions} */
|
|
9
14
|
const makeOptions = args => ({ ...defaultNodeProgramOptions, args })
|
|
@@ -11,18 +16,20 @@ const makeOptions = args => ({ ...defaultNodeProgramOptions, args })
|
|
|
11
16
|
const run = (/** @type {Dir} */ root) => (/** @type {readonly string[]} */ args) =>
|
|
12
17
|
virtual({ ...emptyState, root })(main(makeOptions(args)))
|
|
13
18
|
|
|
19
|
+
// A program whose exit code is its argument count — non-zero, so it leaves
|
|
20
|
+
// through the error branch like any other failing program.
|
|
14
21
|
/** @type {NodeProgram} */
|
|
15
|
-
const appMain = ({ args }) =>
|
|
22
|
+
const appMain = ({ args }) => args.length === 0 ? pureOk(0) : pureError(args.length)
|
|
16
23
|
|
|
17
24
|
export const proof = {
|
|
18
25
|
help: () => {
|
|
19
26
|
const [state, code] = run({})(['help'])
|
|
20
|
-
assertEq(code, 0)
|
|
27
|
+
assertEq(exitCode(code), 0)
|
|
21
28
|
assert(state.stdout.includes('compile'), 'expected command list in stdout')
|
|
22
29
|
},
|
|
23
30
|
compileRequiresArgs: () => {
|
|
24
31
|
const [state, code] = run({})(['compile'])
|
|
25
|
-
assertEq(code, 1)
|
|
32
|
+
assertEq(exitCode(code), 1)
|
|
26
33
|
assert(state.stderr.length !== 0, 'expected error in stderr')
|
|
27
34
|
},
|
|
28
35
|
runModule: () => {
|
|
@@ -30,7 +37,7 @@ export const proof = {
|
|
|
30
37
|
const root = { 'app.f.ts': () => ({ main: appMain }) }
|
|
31
38
|
const [, code] = run(root)(['run', 'app.f.ts', 'x', 'y'])
|
|
32
39
|
// `run` strips the command and file name, so `main` sees two arguments
|
|
33
|
-
assertEq(code, 2)
|
|
40
|
+
assertEq(exitCode(code), 2)
|
|
34
41
|
},
|
|
35
42
|
mcp: () => {
|
|
36
43
|
// stdin is empty in the virtual environment, so the server sees EOF
|
|
@@ -38,11 +45,33 @@ export const proof = {
|
|
|
38
45
|
// The store is empty too, so `casMcpServer`'s Evo cache scan
|
|
39
46
|
// (`initEvo`) also runs and finds nothing.
|
|
40
47
|
const [, code] = run({})(['mcp'])
|
|
41
|
-
assertEq(code, 0)
|
|
48
|
+
assertEq(exitCode(code), 0)
|
|
49
|
+
},
|
|
50
|
+
mcpCorruptStore: () => {
|
|
51
|
+
// The headline new error path, end to end: `.cas` exists but is a
|
|
52
|
+
// file, so `initEvo`'s scan cannot list it. The server never starts,
|
|
53
|
+
// and the failure travels out of the bootstrap to the command's
|
|
54
|
+
// `exitStep` — a message on stderr and exit 1, where it used to be a
|
|
55
|
+
// panic from inside `buildCache`.
|
|
56
|
+
const [state, code] = run({ '.cas': [vec8(0x2An)] })(['mcp'])
|
|
57
|
+
assertEq(exitCode(code), 1)
|
|
58
|
+
assert(state.stderr !== '', ['expected the storage error on stderr', state.stderr])
|
|
42
59
|
},
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
60
|
+
// A file that will not import is the user's command line, not a defect:
|
|
61
|
+
// it is reported with the name they typed and exits 1, where it used to
|
|
62
|
+
// panic out of the effect runner.
|
|
63
|
+
runImportError: () => {
|
|
64
|
+
const [state, code] = run({})(['run', 'missing.f.ts'])
|
|
65
|
+
assertEq(exitCode(code), 1)
|
|
66
|
+
assert(state.stderr.startsWith('missing.f.ts: '), state.stderr)
|
|
67
|
+
},
|
|
68
|
+
// The file imports but is not a program. Same answer, different reason —
|
|
69
|
+
// and the reason is the half of it worth saying.
|
|
70
|
+
runNotANodeProgram: () => {
|
|
71
|
+
/** @type {Dir} */
|
|
72
|
+
const root = { 'app.f.ts': () => ({ notMain: 1 }) }
|
|
73
|
+
const [state, code] = run(root)(['run', 'app.f.ts'])
|
|
74
|
+
assertEq(exitCode(code), 1)
|
|
75
|
+
assert(state.stderr.includes('not a NodeProgram'), state.stderr)
|
|
47
76
|
},
|
|
48
77
|
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* JSON-RPC 2.0 envelopes and a pure dispatcher.
|
|
3
3
|
*
|
|
4
4
|
* The envelopes are rtti schemas, so one declaration yields both a runtime
|
|
5
|
-
* decoder (`
|
|
5
|
+
* decoder (`parse(request)`) and the static type (`Ts<typeof request>`) — no
|
|
6
6
|
* drift between them. The dispatcher is pure: it maps an already-parsed request
|
|
7
7
|
* value to a response value (or `null` for a notification) and performs no I/O.
|
|
8
8
|
*
|
|
@@ -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';
|
|
@@ -77,7 +77,7 @@ export declare const response: import("../../types/rtti/types.ts").Or<[{
|
|
|
77
77
|
readonly id: import("../../types/rtti/types.ts").Or<[import("../../types/rtti/types.ts")._Type0<"string">, import("../../types/rtti/types.ts")._Type0<"number">, null]>;
|
|
78
78
|
}]>;
|
|
79
79
|
/** Decodes an untrusted value as a JSON-RPC request / notification. */
|
|
80
|
-
export declare const decodeRequest: import("../../types/rtti/
|
|
80
|
+
export declare const decodeRequest: import("../../types/rtti/parse/types.ts").Parse<{
|
|
81
81
|
readonly jsonrpc: "2.0";
|
|
82
82
|
readonly method: import("../../types/rtti/types.ts")._Type0<"string">;
|
|
83
83
|
readonly params: import("../../types/rtti/types.ts").Or<readonly [() => readonly ['or', typeof import("../../media/json/rtti/module.f.mjs").primitive, typeof import("../../media/json/rtti/module.f.mjs").object, typeof import("../../media/json/rtti/module.f.mjs").array], undefined]>;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* JSON-RPC 2.0 envelopes and a pure dispatcher.
|
|
3
3
|
*
|
|
4
4
|
* The envelopes are rtti schemas, so one declaration yields both a runtime
|
|
5
|
-
* decoder (`
|
|
5
|
+
* decoder (`parse(request)`) and the static type (`Ts<typeof request>`) — no
|
|
6
6
|
* drift between them. The dispatcher is pure: it maps an already-parsed request
|
|
7
7
|
* value to a response value (or `null` for a notification) and performs no I/O.
|
|
8
8
|
*
|
|
@@ -15,11 +15,12 @@
|
|
|
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
|
-
import {
|
|
23
|
+
import { parse } from '../../types/rtti/parse/module.f.mjs'
|
|
23
24
|
import { unknown } from '../../media/json/rtti/module.f.mjs'
|
|
24
25
|
|
|
25
26
|
export const jsonrpc = /** @type {const} */ ('2.0')
|
|
@@ -62,7 +63,7 @@ export const errorResponse = /** @type {const} */ ({ jsonrpc, error, id: _id })
|
|
|
62
63
|
export const response = or(successResponse, errorResponse)
|
|
63
64
|
|
|
64
65
|
/** Decodes an untrusted value as a JSON-RPC request / notification. */
|
|
65
|
-
export const decodeRequest =
|
|
66
|
+
export const decodeRequest = parse(request)
|
|
66
67
|
|
|
67
68
|
/**
|
|
68
69
|
* Builds an `RpcError` with the given `code` and `message` (no `data`).
|
|
@@ -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,7 +1,10 @@
|
|
|
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
|
-
import {
|
|
7
|
+
import { parse } from '../../types/rtti/parse/module.f.mjs'
|
|
5
8
|
import {
|
|
6
9
|
error as errorSchema,
|
|
7
10
|
decodeRequest,
|
|
@@ -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: {
|
|
@@ -38,9 +44,9 @@ export const proof = {
|
|
|
38
44
|
notObject: () => assert(!isOk(decodeRequest(42))),
|
|
39
45
|
},
|
|
40
46
|
error: {
|
|
41
|
-
ok: () => assert(isOk(
|
|
42
|
-
withData: () => assert(isOk(
|
|
43
|
-
missingMessage: () => assert(!isOk(
|
|
47
|
+
ok: () => assert(isOk(parse(errorSchema)({ code: -1, message: 'x' }))),
|
|
48
|
+
withData: () => assert(isOk(parse(errorSchema)({ code: -1, message: 'x', data: [1, 2] }))),
|
|
49
|
+
missingMessage: () => assert(!isOk(parse(errorSchema)({ code: -1 }))),
|
|
44
50
|
},
|
|
45
51
|
},
|
|
46
52
|
errors: {
|
|
@@ -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)
|