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
package/fjs/mcp/proof.f.mjs
CHANGED
|
@@ -1,42 +1,37 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/**
|
|
2
|
+
* @import { Unknown } from '../media/json/types.ts'
|
|
3
|
+
* @import { Operation } from '../effects/types.ts'
|
|
4
|
+
* @import { Response } from '../protocol/json_rpc/types.ts'
|
|
5
|
+
* @import { Handle } from '../protocol/mcp/types.ts'
|
|
6
|
+
* @import { Vec } from '../types/bit_vec/types.ts'
|
|
7
|
+
* @import { FileCasOperation } from '../cas/types.ts'
|
|
8
|
+
* @import { List } from '../effects/list/types.ts'
|
|
9
|
+
* @import { Effect } from '../effects/types.ts'
|
|
10
|
+
* @import { ContentItem, ToolsCallResult } from '../protocol/mcp/types.ts'
|
|
11
|
+
* @import { IoChannel, Mkdir, Now, RandomInt, ReadBytes, Rename } from '../effects/node/types.ts'
|
|
12
|
+
* @import { Dir } from '../effects/node/virtual/types.ts'
|
|
13
|
+
*/
|
|
2
14
|
|
|
3
15
|
import { assert, assertEq } from '../asserts/module.f.mjs'
|
|
4
|
-
import {
|
|
5
|
-
/** @import { Effect, Operation } from '../effects/types.ts' */
|
|
16
|
+
import { pureOk, step } from '../effects/module.f.mjs'
|
|
6
17
|
import { create } from '../effects/memory/module.f.mjs'
|
|
7
18
|
import { parse as parseJson } from '../media/json/module.f.mjs'
|
|
8
19
|
import { number as rttiNumber, option, string as rttiString } from '../types/rtti/module.f.mjs'
|
|
9
20
|
import { parse as rttiParse } from '../types/rtti/parse/module.f.mjs'
|
|
10
|
-
/** @import { Response } from '../protocol/json_rpc/types.ts' */
|
|
11
|
-
/** @import { Vec } from '../types/bit_vec/types.ts' */
|
|
12
21
|
import { msb, u8ListToVec, vec8, repeat, length, maxLengthBytes } from '../types/bit_vec/module.f.mjs'
|
|
13
22
|
import { vecToCBase32 } from '../basen/cbase32/module.f.mjs'
|
|
14
23
|
import { encode as base64Encode } from '../basen/base64/module.f.mjs'
|
|
15
24
|
import { utf8 } from '../text/module.f.mjs'
|
|
16
25
|
import { fileCas } from '../cas/module.f.mjs'
|
|
17
|
-
/** @import { FileCasOperation } from '../cas/types.ts' */
|
|
18
26
|
import { dialect as revisionDialect, mediaType as revisionMediaType } from '../media/revision/module.f.mjs'
|
|
19
27
|
import { sha256 } from '../crypto/sha2/module.f.mjs'
|
|
20
28
|
import { nonEmpty, empty as elEmpty } from '../effects/list/module.f.mjs'
|
|
21
|
-
/** @import { List } from '../effects/list/types.ts' */
|
|
22
29
|
import {
|
|
23
30
|
mcpStep, uninitializedState,
|
|
24
31
|
} from '../protocol/mcp/module.f.mjs'
|
|
25
|
-
/** @import { McpSessionState, ToolsCallResult } from '../protocol/mcp/types.ts' */
|
|
26
|
-
/**
|
|
27
|
-
* @import {
|
|
28
|
-
* IoResult,
|
|
29
|
-
* Mkdir,
|
|
30
|
-
* Now,
|
|
31
|
-
* RandomInt,
|
|
32
|
-
* ReadBytes,
|
|
33
|
-
* Rename,
|
|
34
|
-
* } from '../effects/node/types.ts'
|
|
35
|
-
*/
|
|
36
32
|
import { emptyState, virtual } from '../effects/node/virtual/module.f.mjs'
|
|
37
|
-
/** @import { Dir } from '../effects/node/virtual/types.ts' */
|
|
38
33
|
import { casConfig, casMcpHandlers } from './module.f.mjs'
|
|
39
|
-
import { ok as resultOk, unwrap } from '../types/result/module.f.mjs'
|
|
34
|
+
import { ok as resultOk, unwrap, unwrap as unwrapResult } from '../types/result/module.f.mjs'
|
|
40
35
|
import { stdioTransport } from '../protocol/mcp/stdio/module.f.mjs'
|
|
41
36
|
import { fromVec } from '../types/uint8array/module.f.mjs'
|
|
42
37
|
import { initEvo } from '../cas/evo/module.f.mjs'
|
|
@@ -62,14 +57,16 @@ const parseCasGetResult = rttiParse(casGetResult)
|
|
|
62
57
|
// Feeds each message to `handler` in order, collecting every response.
|
|
63
58
|
/**
|
|
64
59
|
* @template {Operation} O
|
|
65
|
-
* @param {
|
|
66
|
-
* @returns {(msgs: readonly unknown[]) => Effect<O, readonly unknown[]>}
|
|
60
|
+
* @param {Handle<O>} handler
|
|
61
|
+
* @returns {(msgs: readonly unknown[]) => Effect<O, readonly unknown[], never>}
|
|
67
62
|
*/
|
|
68
63
|
const feed = handler => msgs => {
|
|
69
|
-
/** @type {(i: number, acc: readonly unknown[]) => Effect<O, readonly unknown[]>} */
|
|
64
|
+
/** @type {(i: number, acc: readonly unknown[]) => Effect<O, readonly unknown[], never>} */
|
|
70
65
|
const go = (i, acc) => (
|
|
71
66
|
i === msgs.length
|
|
72
|
-
?
|
|
67
|
+
? pureOk(acc)
|
|
68
|
+
// The channel stays `never`: a `Handle` has absorbed its own
|
|
69
|
+
// failures into the response, so every message contributes one.
|
|
73
70
|
: step(
|
|
74
71
|
handler(/** @type {Unknown} */ (msgs[i])),
|
|
75
72
|
r => go(i + 1, [...acc, r]))
|
|
@@ -88,11 +85,10 @@ const runSessionVirtual =
|
|
|
88
85
|
initEvo(fileCas(sha256)(home)),
|
|
89
86
|
cacheKey => step(
|
|
90
87
|
create(uninitializedState),
|
|
91
|
-
sessionKey =>
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
return virtual({ ...emptyState, root })(effect)[1]
|
|
88
|
+
sessionKey => feed(mcpStep(casConfig)(casMcpHandlers(home)(cacheKey))(sessionKey))(msgs)))
|
|
89
|
+
// A proof has nobody to report a channel failure to, so it panics: the
|
|
90
|
+
// session either ran or the test is meaningless.
|
|
91
|
+
return unwrapResult(virtual({ ...emptyState, root })(effect)[1])
|
|
96
92
|
}
|
|
97
93
|
|
|
98
94
|
// Seeds a blob directly into the virtual store via `c.write`, bypassing the
|
|
@@ -105,8 +101,8 @@ const runSessionVirtual =
|
|
|
105
101
|
const seedBlob = (root, home = '/home/user') => chunks => {
|
|
106
102
|
const c = fileCas(sha256)(home)
|
|
107
103
|
const stream = chunks.reduceRight(
|
|
108
|
-
(/** @type {List<never,
|
|
109
|
-
/** @
|
|
104
|
+
(/** @type {List<never, Vec, IoChannel>} */ tail, chunk) => nonEmpty(chunk, tail),
|
|
105
|
+
/** @satisfies {List<never, Vec, IoChannel>} */ (elEmpty()))
|
|
110
106
|
const [state, result] = virtual({ ...emptyState, root })(c.write(stream))
|
|
111
107
|
assert(result[0] === 'ok', result)
|
|
112
108
|
return [state.root, vecToCBase32(result[1])]
|
|
@@ -150,7 +146,7 @@ const runStdio =
|
|
|
150
146
|
const effect = step(
|
|
151
147
|
initEvo(fileCas(sha256)(home)),
|
|
152
148
|
cacheKey => step(
|
|
153
|
-
create(
|
|
149
|
+
create(uninitializedState),
|
|
154
150
|
sessionKey =>
|
|
155
151
|
stdioTransport(mcpStep(casConfig)(casMcpHandlers(home)(cacheKey))(sessionKey))
|
|
156
152
|
)
|
|
@@ -161,15 +157,80 @@ const runStdio =
|
|
|
161
157
|
return stdout.split('\n').filter(line => line.length > 0).slice(1).map(line => unwrap(parseJson(line)))
|
|
162
158
|
}
|
|
163
159
|
|
|
160
|
+
/**
|
|
161
|
+
* The `result` of a `tools/call` response.
|
|
162
|
+
*
|
|
163
|
+
* This is the one place a response crosses from `unknown` to a typed
|
|
164
|
+
* {@link ToolsCallResult}. The structural essentials are checked here so the
|
|
165
|
+
* accessors below — and every call site — do not have to assume them; only the
|
|
166
|
+
* final step from a checked `content` array to `ToolsCallResult` is taken on
|
|
167
|
+
* trust, because rtti's `parse` reads `Unknown`, and getting there from
|
|
168
|
+
* `unknown` is the same problem one level down.
|
|
169
|
+
*/
|
|
164
170
|
/** @type {(resp: unknown) => ToolsCallResult} */
|
|
165
|
-
const resultOf = resp =>
|
|
166
|
-
|
|
171
|
+
const resultOf = resp => {
|
|
172
|
+
assert(typeof resp === 'object' && resp !== null && 'result' in resp, resp)
|
|
173
|
+
const { result } = resp
|
|
174
|
+
assert(typeof result === 'object' && result !== null && 'content' in result, result)
|
|
175
|
+
const { content } = result
|
|
176
|
+
assert(content instanceof Array, content)
|
|
177
|
+
return /** @type {ToolsCallResult} */ (result)
|
|
178
|
+
}
|
|
167
179
|
|
|
168
|
-
/** @type {(resp: unknown) =>
|
|
169
|
-
const item0 = resp =>
|
|
180
|
+
/** @type {(resp: unknown) => ContentItem} */
|
|
181
|
+
const item0 = resp => {
|
|
182
|
+
const [item] = resultOf(resp).content
|
|
183
|
+
assert(item !== undefined, resp)
|
|
184
|
+
return item
|
|
185
|
+
}
|
|
170
186
|
|
|
171
187
|
/** @type {(resp: unknown) => string} */
|
|
172
|
-
const textOf = resp =>
|
|
188
|
+
const textOf = resp => {
|
|
189
|
+
const item = item0(resp)
|
|
190
|
+
assert(item.type === 'text', item)
|
|
191
|
+
return item.text
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// The accessors below read a response that is `unknown` at this boundary. They
|
|
195
|
+
// check their way in rather than casting, so a malformed response fails at the
|
|
196
|
+
// read with the offending value attached.
|
|
197
|
+
|
|
198
|
+
/** Whether `resp` is an object carrying `key`. */
|
|
199
|
+
/** @type {(resp: unknown, key: 'error' | 'result') => boolean} */
|
|
200
|
+
const has = (resp, key) => typeof resp === 'object' && resp !== null && key in resp
|
|
201
|
+
|
|
202
|
+
/** @type {(resp: unknown) => number} */
|
|
203
|
+
const errorCode = resp => {
|
|
204
|
+
assert(typeof resp === 'object' && resp !== null && 'error' in resp, resp)
|
|
205
|
+
const { error } = resp
|
|
206
|
+
assert(typeof error === 'object' && error !== null && 'code' in error, error)
|
|
207
|
+
const { code } = error
|
|
208
|
+
assert(typeof code === 'number', code)
|
|
209
|
+
return code
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/** @type {(resp: unknown) => unknown} */
|
|
213
|
+
const idOf = resp => {
|
|
214
|
+
assert(typeof resp === 'object' && resp !== null && 'id' in resp, resp)
|
|
215
|
+
return resp.id
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/** The `name` and `inputSchema.type` of each tool in a `tools/list` result. */
|
|
219
|
+
/** @type {(resp: unknown) => readonly { readonly name: string, readonly schemaType: unknown }[]} */
|
|
220
|
+
const toolsOf = resp => {
|
|
221
|
+
assert(typeof resp === 'object' && resp !== null && 'result' in resp, resp)
|
|
222
|
+
const { result } = resp
|
|
223
|
+
assert(typeof result === 'object' && result !== null && 'tools' in result, result)
|
|
224
|
+
const { tools } = result
|
|
225
|
+
assert(tools instanceof Array, tools)
|
|
226
|
+
return tools.map(t => {
|
|
227
|
+
assert(typeof t === 'object' && t !== null && 'name' in t && 'inputSchema' in t, t)
|
|
228
|
+
const { name, inputSchema } = t
|
|
229
|
+
assert(typeof name === 'string', name)
|
|
230
|
+
assert(typeof inputSchema === 'object' && inputSchema !== null && 'type' in inputSchema, inputSchema)
|
|
231
|
+
return { name, schemaType: inputSchema.type }
|
|
232
|
+
})
|
|
233
|
+
}
|
|
173
234
|
|
|
174
235
|
/** The `text` payload of a `cas_get` response, parsed and checked against {@link casGetResult}. */
|
|
175
236
|
const casGetResultOf = (/** @type {unknown} */ resp) =>
|
|
@@ -183,12 +244,12 @@ const textSample = 'hello, world!'
|
|
|
183
244
|
const revisionSample = `{"dialect":"${revisionDialect}","subject":"8","parents":[],"snapshot":"8","generation":0}`
|
|
184
245
|
|
|
185
246
|
// A base64-encoded binary payload for binary add→get round-trips.
|
|
186
|
-
const binarySample =
|
|
247
|
+
const binarySample = base64Encode(vec8(0x2An))
|
|
187
248
|
|
|
188
249
|
// A base64 blob whose leading bytes are the PNG magic-byte signature, so
|
|
189
250
|
// `cas_get` detects its type and returns base64 with mimeType image/png.
|
|
190
|
-
const pngSample =
|
|
191
|
-
u8ListToVec(msb)([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x01]))
|
|
251
|
+
const pngSample = base64Encode(
|
|
252
|
+
u8ListToVec(msb)([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x01]))
|
|
192
253
|
|
|
193
254
|
// Returns the RFC 4648 base64 encoding of `n` zero bytes, computed directly
|
|
194
255
|
// without bigint arithmetic — independent of `base64.encode` so these tests
|
|
@@ -216,10 +277,10 @@ const largeMultiChunkBlobMeta =
|
|
|
216
277
|
(/** @type {Vec} */ chunk0, /** @type {Vec} */ chunk1, /** @type {string} */ expectedType,
|
|
217
278
|
/** @type {string} */ expectedMime) => () => {
|
|
218
279
|
const [root, hash] = seedBlob({})([chunk0, chunk1])
|
|
219
|
-
const [metaResp] =
|
|
280
|
+
const [metaResp] = runSessionVirtual(root)([
|
|
220
281
|
init, initialized,
|
|
221
282
|
call(2, 'cas_get', { hash }),
|
|
222
|
-
]).slice(2)
|
|
283
|
+
]).slice(2)
|
|
223
284
|
assert(!resultOf(metaResp).isError)
|
|
224
285
|
const meta = casGetResultOf(metaResp)
|
|
225
286
|
assertEq(meta.type, expectedType)
|
|
@@ -272,10 +333,10 @@ export const proof = {
|
|
|
272
333
|
// buffered inline. The metadata-only path (above) still returns its size/type.
|
|
273
334
|
getContentLargeBlobTooLargeError: () => {
|
|
274
335
|
const [root, hash] = seedBlob({})([asciiChunk, asciiChunk])
|
|
275
|
-
const [getResp] =
|
|
336
|
+
const [getResp] = runSessionVirtual(root)([
|
|
276
337
|
init, initialized,
|
|
277
338
|
call(2, 'cas_get', { hash, content: true }),
|
|
278
|
-
]).slice(2)
|
|
339
|
+
]).slice(2)
|
|
279
340
|
assertEq(resultOf(getResp).isError, true)
|
|
280
341
|
const text = textOf(getResp)
|
|
281
342
|
assert(text.includes('too large'))
|
|
@@ -309,9 +370,8 @@ export const proof = {
|
|
|
309
370
|
const [getResp] = runStdio(root)([
|
|
310
371
|
call(2, 'cas_get', { hash, content: true }),
|
|
311
372
|
])
|
|
312
|
-
|
|
313
|
-
assertEq(
|
|
314
|
-
assertEq(err.id, 2)
|
|
373
|
+
assertEq(errorCode(getResp), -32603)
|
|
374
|
+
assertEq(idOf(getResp), 2)
|
|
315
375
|
},
|
|
316
376
|
|
|
317
377
|
// The paired boundary case: a blob whose base64 inflation leaves enough
|
|
@@ -344,19 +404,18 @@ export const proof = {
|
|
|
344
404
|
const [getResp] = runStdio(root)([
|
|
345
405
|
call(2, 'cas_get', { hash, content: true }),
|
|
346
406
|
])
|
|
347
|
-
|
|
348
|
-
assertEq(
|
|
349
|
-
assertEq(err.id, 2)
|
|
407
|
+
assertEq(errorCode(getResp), -32603)
|
|
408
|
+
assertEq(idOf(getResp), 2)
|
|
350
409
|
},
|
|
351
410
|
|
|
352
411
|
toolsListAdvertisesSevenTools: () => {
|
|
353
412
|
const [resp] = runSessionVirtual({})([init, initialized, list(2)]).slice(2)
|
|
354
|
-
const tools = (
|
|
413
|
+
const tools = toolsOf(resp)
|
|
355
414
|
assertEq(tools.length, 7)
|
|
356
415
|
assertEq(tools.map(t => t.name).join(','), 'cas_add,cas_get,cas_list,evo_list,evo_head,evo_revision,evo_add')
|
|
357
|
-
const add =
|
|
358
|
-
|
|
359
|
-
assertEq(add.
|
|
416
|
+
const [add] = tools
|
|
417
|
+
assert(add !== undefined, tools)
|
|
418
|
+
assertEq(add.schemaType, 'object')
|
|
360
419
|
},
|
|
361
420
|
|
|
362
421
|
// The same server also exposes Evo (fjs/cas/evo): add a revision, then
|
|
@@ -483,7 +542,7 @@ export const proof = {
|
|
|
483
542
|
call(2, 'cas_add', { content: textSample }),
|
|
484
543
|
call(3, 'cas_get', { hash, content: true }),
|
|
485
544
|
)
|
|
486
|
-
assertEq(item0(getResp)
|
|
545
|
+
assertEq(item0(getResp).type, 'text')
|
|
487
546
|
const result = casGetResultOf(getResp)
|
|
488
547
|
assertEq(result.type, 'text')
|
|
489
548
|
assertEq(result.mimeType, 'text/plain')
|
|
@@ -498,7 +557,7 @@ export const proof = {
|
|
|
498
557
|
call(3, 'cas_get', { hash, content: true }),
|
|
499
558
|
)
|
|
500
559
|
assert(!resultOf(getResp).isError)
|
|
501
|
-
assertEq(
|
|
560
|
+
assertEq(item0(getResp).type, 'text')
|
|
502
561
|
const result = casGetResultOf(getResp)
|
|
503
562
|
assertEq(result.type, 'base64')
|
|
504
563
|
assertEq(result.mimeType, 'image/png')
|
|
@@ -627,8 +686,8 @@ export const proof = {
|
|
|
627
686
|
|
|
628
687
|
toolErrorIsNotJsonRpcError: () => {
|
|
629
688
|
const [resp] = session(call(2, 'cas_add', { content: 'not valid!', type: 'base64' }))
|
|
630
|
-
assert(!('error'
|
|
631
|
-
assert('result'
|
|
689
|
+
assert(!has(resp, 'error'), resp)
|
|
690
|
+
assert(has(resp, 'result'), resp)
|
|
632
691
|
},
|
|
633
692
|
|
|
634
693
|
// cas_get without content:true returns only metadata.
|
|
@@ -664,7 +723,7 @@ export const proof = {
|
|
|
664
723
|
|
|
665
724
|
getMetaOctetStreamForUnknownBinary: () => {
|
|
666
725
|
const binaryContent = u8ListToVec(msb)([0xFF, 0xFE, 0x00, 0x01])
|
|
667
|
-
const binaryB64 =
|
|
726
|
+
const binaryB64 = base64Encode(binaryContent)
|
|
668
727
|
const [addResp] = session(call(2, 'cas_add', { content: binaryB64, type: 'base64' }))
|
|
669
728
|
const hash = textOf(addResp)
|
|
670
729
|
const [, metaResp] = session(
|
|
@@ -682,7 +741,7 @@ export const proof = {
|
|
|
682
741
|
// base64/octet-stream, not text/plain.
|
|
683
742
|
getMetaOctetStreamForNulBlob: () => {
|
|
684
743
|
const nulContent = u8ListToVec(msb)([0x00, 0x00, 0x00])
|
|
685
|
-
const nulB64 =
|
|
744
|
+
const nulB64 = base64Encode(nulContent)
|
|
686
745
|
const [addResp] = session(call(2, 'cas_add', { content: nulB64, type: 'base64' }))
|
|
687
746
|
const hash = textOf(addResp)
|
|
688
747
|
const [, metaResp] = session(
|
|
@@ -709,7 +768,7 @@ export const proof = {
|
|
|
709
768
|
// cas_get with content:true on octet-stream (no magic bytes, not UTF-8) returns inline base64.
|
|
710
769
|
getOctetStreamWithContentIncludesBase64: () => {
|
|
711
770
|
const binaryContent = u8ListToVec(msb)([0xFF, 0xFE, 0x00, 0x01])
|
|
712
|
-
const binaryB64 =
|
|
771
|
+
const binaryB64 = base64Encode(binaryContent)
|
|
713
772
|
const [addResp] = session(call(2, 'cas_add', { content: binaryB64, type: 'base64' }))
|
|
714
773
|
const hash = textOf(addResp)
|
|
715
774
|
const [, getResp] = session(
|
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTML serialization helpers: `Element`/`Attributes` builders, void-tag
|
|
3
|
+
* handling, attribute/text escaping, and a UTF-8 emitter for full documents.
|
|
4
|
+
* See `./types.ts` for the `Element`/`Node` type-level API.
|
|
5
|
+
*
|
|
6
|
+
* @module
|
|
7
|
+
*
|
|
8
|
+
* @import { List } from '../../types/list/types.ts'
|
|
9
|
+
* @import { Entry, StringMap } from '../../types/object/types.ts'
|
|
10
|
+
* @import { Vec } from '../../types/bit_vec/types.ts'
|
|
11
|
+
* @import { Element, Node } from './types.ts'
|
|
12
|
+
*/
|
|
1
13
|
import type { List } from '../../types/list/types.ts';
|
|
2
14
|
import type { StringMap } from '../../types/object/types.ts';
|
|
3
15
|
import type { Vec } from '../../types/bit_vec/types.ts';
|
|
@@ -4,19 +4,21 @@
|
|
|
4
4
|
* See `./types.ts` for the `Element`/`Node` type-level API.
|
|
5
5
|
*
|
|
6
6
|
* @module
|
|
7
|
+
*
|
|
8
|
+
* @import { List } from '../../types/list/types.ts'
|
|
9
|
+
* @import { Entry, StringMap } from '../../types/object/types.ts'
|
|
10
|
+
* @import { Vec } from '../../types/bit_vec/types.ts'
|
|
11
|
+
* @import { Element, Node } from './types.ts'
|
|
7
12
|
*/
|
|
8
|
-
|
|
13
|
+
|
|
9
14
|
import { map, flatMap, flat, concat as listConcat } from '../../types/list/module.f.mjs'
|
|
10
15
|
import { concat, concat as stringConcat } from '../../types/string/module.f.mjs'
|
|
11
16
|
import { definedEntries } from '../../types/object/module.f.mjs'
|
|
12
|
-
/** @import { Entry, StringMap } from '../../types/object/types.ts' */
|
|
13
17
|
import { compose } from '../../types/function/module.f.mjs'
|
|
14
18
|
import { stringToList } from '../../text/utf16/module.f.mjs'
|
|
15
19
|
import { includes } from '../../types/array/module.f.mjs'
|
|
16
|
-
/** @import { Vec } from '../../types/bit_vec/types.ts' */
|
|
17
20
|
import { utf8 } from '../../text/module.f.mjs'
|
|
18
21
|
import { quotationMark, ampersand, lessThanSign, greaterThanSign } from '../../text/ascii/module.f.mjs'
|
|
19
|
-
/** @import { Element, Node } from './types.ts' */
|
|
20
22
|
|
|
21
23
|
const { fromCharCode } = String
|
|
22
24
|
|
|
@@ -65,7 +67,7 @@ const escapeTable = /** @type {const} */ ({
|
|
|
65
67
|
|
|
66
68
|
/** @type {(code: number) => string} */
|
|
67
69
|
const escapeCharCode = code =>
|
|
68
|
-
escapeTable[
|
|
70
|
+
escapeTable[code] ?? fromCharCode(code)
|
|
69
71
|
|
|
70
72
|
const escape = compose(stringToList)(map(escapeCharCode))
|
|
71
73
|
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extended JSON: the ordinary JSON data model with `bigint` added to the
|
|
3
|
+
* primitive leaves, so bare integer syntax survives a parse exactly.
|
|
4
|
+
*
|
|
5
|
+
* It is a runtime representation, not a syntax. `stringify` emits ordinary,
|
|
6
|
+
* valid JSON text — there is no `123n` literal, tagged object, or
|
|
7
|
+
* quoted-integer convention — and ordinary JavaScript consumers of that text
|
|
8
|
+
* are free to read it back into whatever numeric representation they use,
|
|
9
|
+
* `JSON.parse`'s `number` included. What the extended codec adds is that
|
|
10
|
+
* *this* codec reads it back into the same runtime value it wrote.
|
|
11
|
+
*
|
|
12
|
+
* ### Parse
|
|
13
|
+
*
|
|
14
|
+
* The split is lexical, not mathematical: **a token containing `.` or `e` /
|
|
15
|
+
* `E` is a `number`, even when its value is an integer.**
|
|
16
|
+
*
|
|
17
|
+
* ```text
|
|
18
|
+
* 123 -> 123n -123 -> -123n 0 -> 0n
|
|
19
|
+
* -0 -> -0 1.5 -> 1.5 1.0 -> 1
|
|
20
|
+
* 1e3 -> 1000 1E3 -> 1000
|
|
21
|
+
* ```
|
|
22
|
+
*
|
|
23
|
+
* `-0` is the exception to bare integer syntax: `bigint` has no negative zero,
|
|
24
|
+
* so keeping it as a `number` is what preserves the sign the JSON text spells.
|
|
25
|
+
*
|
|
26
|
+
* The extended domain is exact where it claims to be, so it rejects rather
|
|
27
|
+
* than rounds: a token whose value is outside the finite `number` range
|
|
28
|
+
* (`1e400`) is a parse `error`, not `Infinity`. Ordinary rounding within that
|
|
29
|
+
* range is inherent to `number` and is not an error — `1e-400` is `0`, and
|
|
30
|
+
* `0.1` is the nearest double, as everywhere else.
|
|
31
|
+
*
|
|
32
|
+
* ### Serialize
|
|
33
|
+
*
|
|
34
|
+
* Spelling follows the runtime type of the leaf, so parsing the output returns
|
|
35
|
+
* the value that was written:
|
|
36
|
+
*
|
|
37
|
+
* ```text
|
|
38
|
+
* 0n -> 0 -> 0n 3n -> 3 -> 3n
|
|
39
|
+
* 0 -> 0.0 -> 0 3 -> 3.0 -> 3
|
|
40
|
+
* -0 -> -0 -> -0
|
|
41
|
+
* ```
|
|
42
|
+
*
|
|
43
|
+
* A `bigint` is always its full base-10 digits, **never** exponent notation,
|
|
44
|
+
* however large: exponent syntax belongs to the `number` side and would parse
|
|
45
|
+
* back as one. A whole-valued `number` other than `-0` gets a non-integer
|
|
46
|
+
* spelling (`3.0`) for the same reason. This `.0` rule is the extended codec's
|
|
47
|
+
* own; the standard codec in [`../module.f.mjs`](../module.f.mjs) has its own
|
|
48
|
+
* numeric spelling and does not route through here.
|
|
49
|
+
*
|
|
50
|
+
* `NaN`, `Infinity` and `-Infinity` cannot arrive from JSON text but can be
|
|
51
|
+
* supplied programmatically, and JSON has no syntax for them. They serialize
|
|
52
|
+
* as `null`, matching what `JSON.stringify` does with them.
|
|
53
|
+
*
|
|
54
|
+
* @module
|
|
55
|
+
*
|
|
56
|
+
* @import { Result } from '../../../types/result/types.ts'
|
|
57
|
+
* @import { List } from '../../../types/list/types.ts'
|
|
58
|
+
* @import { NumberPolicy } from '../parser/types.ts'
|
|
59
|
+
* @import { Primitive, Unknown, _MapEntries } from './types.ts'
|
|
60
|
+
*/
|
|
61
|
+
import type { Result } from '../../../types/result/types.ts';
|
|
62
|
+
import type { List } from '../../../types/list/types.ts';
|
|
63
|
+
import type { Unknown, _MapEntries } from './types.ts';
|
|
64
|
+
/**
|
|
65
|
+
* Parses `text` as extended JSON, reporting failure as a `Result` rather than
|
|
66
|
+
* throwing.
|
|
67
|
+
*
|
|
68
|
+
* @type {(text: string) => Result<Unknown, string>}
|
|
69
|
+
*/
|
|
70
|
+
export declare const parse: (text: string) => Result<Unknown, string>;
|
|
71
|
+
/**
|
|
72
|
+
* Serializes an extended JSON value as a list of string chunks.
|
|
73
|
+
*
|
|
74
|
+
* @type {(mapEntries: _MapEntries) => (value: Unknown) => List<string>}
|
|
75
|
+
*/
|
|
76
|
+
export declare const serialize: (mapEntries: _MapEntries) => (value: Unknown) => List<string>;
|
|
77
|
+
/**
|
|
78
|
+
* Serializes an extended JSON value as ordinary JSON text.
|
|
79
|
+
*
|
|
80
|
+
* @type {(mapEntries: _MapEntries) => (value: Unknown) => string}
|
|
81
|
+
*/
|
|
82
|
+
export declare const stringify: (mapEntries: _MapEntries) => (value: Unknown) => string;
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extended JSON: the ordinary JSON data model with `bigint` added to the
|
|
3
|
+
* primitive leaves, so bare integer syntax survives a parse exactly.
|
|
4
|
+
*
|
|
5
|
+
* It is a runtime representation, not a syntax. `stringify` emits ordinary,
|
|
6
|
+
* valid JSON text — there is no `123n` literal, tagged object, or
|
|
7
|
+
* quoted-integer convention — and ordinary JavaScript consumers of that text
|
|
8
|
+
* are free to read it back into whatever numeric representation they use,
|
|
9
|
+
* `JSON.parse`'s `number` included. What the extended codec adds is that
|
|
10
|
+
* *this* codec reads it back into the same runtime value it wrote.
|
|
11
|
+
*
|
|
12
|
+
* ### Parse
|
|
13
|
+
*
|
|
14
|
+
* The split is lexical, not mathematical: **a token containing `.` or `e` /
|
|
15
|
+
* `E` is a `number`, even when its value is an integer.**
|
|
16
|
+
*
|
|
17
|
+
* ```text
|
|
18
|
+
* 123 -> 123n -123 -> -123n 0 -> 0n
|
|
19
|
+
* -0 -> -0 1.5 -> 1.5 1.0 -> 1
|
|
20
|
+
* 1e3 -> 1000 1E3 -> 1000
|
|
21
|
+
* ```
|
|
22
|
+
*
|
|
23
|
+
* `-0` is the exception to bare integer syntax: `bigint` has no negative zero,
|
|
24
|
+
* so keeping it as a `number` is what preserves the sign the JSON text spells.
|
|
25
|
+
*
|
|
26
|
+
* The extended domain is exact where it claims to be, so it rejects rather
|
|
27
|
+
* than rounds: a token whose value is outside the finite `number` range
|
|
28
|
+
* (`1e400`) is a parse `error`, not `Infinity`. Ordinary rounding within that
|
|
29
|
+
* range is inherent to `number` and is not an error — `1e-400` is `0`, and
|
|
30
|
+
* `0.1` is the nearest double, as everywhere else.
|
|
31
|
+
*
|
|
32
|
+
* ### Serialize
|
|
33
|
+
*
|
|
34
|
+
* Spelling follows the runtime type of the leaf, so parsing the output returns
|
|
35
|
+
* the value that was written:
|
|
36
|
+
*
|
|
37
|
+
* ```text
|
|
38
|
+
* 0n -> 0 -> 0n 3n -> 3 -> 3n
|
|
39
|
+
* 0 -> 0.0 -> 0 3 -> 3.0 -> 3
|
|
40
|
+
* -0 -> -0 -> -0
|
|
41
|
+
* ```
|
|
42
|
+
*
|
|
43
|
+
* A `bigint` is always its full base-10 digits, **never** exponent notation,
|
|
44
|
+
* however large: exponent syntax belongs to the `number` side and would parse
|
|
45
|
+
* back as one. A whole-valued `number` other than `-0` gets a non-integer
|
|
46
|
+
* spelling (`3.0`) for the same reason. This `.0` rule is the extended codec's
|
|
47
|
+
* own; the standard codec in [`../module.f.mjs`](../module.f.mjs) has its own
|
|
48
|
+
* numeric spelling and does not route through here.
|
|
49
|
+
*
|
|
50
|
+
* `NaN`, `Infinity` and `-Infinity` cannot arrive from JSON text but can be
|
|
51
|
+
* supplied programmatically, and JSON has no syntax for them. They serialize
|
|
52
|
+
* as `null`, matching what `JSON.stringify` does with them.
|
|
53
|
+
*
|
|
54
|
+
* @module
|
|
55
|
+
*
|
|
56
|
+
* @import { Result } from '../../../types/result/types.ts'
|
|
57
|
+
* @import { List } from '../../../types/list/types.ts'
|
|
58
|
+
* @import { NumberPolicy } from '../parser/types.ts'
|
|
59
|
+
* @import { Primitive, Unknown, _MapEntries } from './types.ts'
|
|
60
|
+
*/
|
|
61
|
+
|
|
62
|
+
import { concat } from '../../../types/string/module.f.mjs'
|
|
63
|
+
import { compose } from '../../../types/function/module.f.mjs'
|
|
64
|
+
import { error, ok } from '../../../types/result/module.f.mjs'
|
|
65
|
+
import { stringToList } from '../../../text/utf16/module.f.mjs'
|
|
66
|
+
import { parse as parseTokens } from '../parser/module.f.mjs'
|
|
67
|
+
import { tokenize } from '../tokenizer/module.f.mjs'
|
|
68
|
+
import { isBareInteger, numberLexeme } from '../number/module.f.mjs'
|
|
69
|
+
import { treeSerialize, stringSerialize, nullSerialize, boolSerialize } from '../serializer/module.f.mjs'
|
|
70
|
+
|
|
71
|
+
const { isFinite } = Number
|
|
72
|
+
|
|
73
|
+
const { is } = Object
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* The extended numeric policy, applied to the token's exact lexeme.
|
|
77
|
+
*
|
|
78
|
+
* Bare integer syntax is materialized as `bigint` straight from that lexeme —
|
|
79
|
+
* never through `number`, which would round anything above
|
|
80
|
+
* `Number.MAX_SAFE_INTEGER`. Everything else is `number`, and is rejected if
|
|
81
|
+
* the finite `number` range cannot hold it.
|
|
82
|
+
*
|
|
83
|
+
* @type {NumberPolicy<number | bigint>}
|
|
84
|
+
*/
|
|
85
|
+
const numberPolicy = ({ value }) => {
|
|
86
|
+
if (isBareInteger(numberLexeme(value))) {
|
|
87
|
+
return ok(value === '-0' ? -0 : BigInt(value))
|
|
88
|
+
}
|
|
89
|
+
const n = Number(value)
|
|
90
|
+
return isFinite(n) ? ok(n) : error(`number is out of the finite range: ${value}`)
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Parses `text` as extended JSON, reporting failure as a `Result` rather than
|
|
95
|
+
* throwing.
|
|
96
|
+
*
|
|
97
|
+
* @type {(text: string) => Result<Unknown, string>}
|
|
98
|
+
*/
|
|
99
|
+
export const parse = text => parseTokens(numberPolicy)(tokenize(stringToList(text)))
|
|
100
|
+
|
|
101
|
+
const negativeZeroSerialize = ['-0']
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Spells a `number` so that reparsing it returns a `number` — never a
|
|
105
|
+
* `bigint`.
|
|
106
|
+
*
|
|
107
|
+
* A whole-valued `number` already spells itself with `.` or `e` often enough
|
|
108
|
+
* (`1e+21`, `1.5`); when it does not, `.0` is appended, which is the same
|
|
109
|
+
* value in JSON and the other lexical branch on the way back. `-0` is written
|
|
110
|
+
* out as the exact token `-0`, the one bare integer the parser keeps as a
|
|
111
|
+
* `number`.
|
|
112
|
+
*
|
|
113
|
+
* @type {(value: number) => List<string>}
|
|
114
|
+
*/
|
|
115
|
+
const numberSerialize = value => {
|
|
116
|
+
if (is(value, -0)) { return negativeZeroSerialize }
|
|
117
|
+
if (!isFinite(value)) { return nullSerialize }
|
|
118
|
+
const text = `${value}`
|
|
119
|
+
return [isBareInteger(numberLexeme(text)) ? `${text}.0` : text]
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Spells a `bigint` as its full base-10 digits. `BigInt`'s own decimal form is
|
|
124
|
+
* exactly that: no `n` suffix, and no exponent notation at any magnitude.
|
|
125
|
+
*
|
|
126
|
+
* @type {(value: bigint) => List<string>}
|
|
127
|
+
*/
|
|
128
|
+
const bigintSerialize = value => [`${value}`]
|
|
129
|
+
|
|
130
|
+
/** @type {(value: Primitive) => List<string>} */
|
|
131
|
+
const primitiveSerialize = value => {
|
|
132
|
+
switch (typeof value) {
|
|
133
|
+
case 'boolean': { return boolSerialize(value) }
|
|
134
|
+
case 'bigint': { return bigintSerialize(value) }
|
|
135
|
+
case 'number': { return numberSerialize(value) }
|
|
136
|
+
case 'string': { return stringSerialize(value) }
|
|
137
|
+
default: { return nullSerialize }
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Serializes an extended JSON value as a list of string chunks.
|
|
143
|
+
*
|
|
144
|
+
* @type {(mapEntries: _MapEntries) => (value: Unknown) => List<string>}
|
|
145
|
+
*/
|
|
146
|
+
export const serialize = treeSerialize(primitiveSerialize)
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Serializes an extended JSON value as ordinary JSON text.
|
|
150
|
+
*
|
|
151
|
+
* @type {(mapEntries: _MapEntries) => (value: Unknown) => string}
|
|
152
|
+
*/
|
|
153
|
+
export const stringify = sort => compose(serialize(sort))(concat)
|