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
|
@@ -9,55 +9,166 @@
|
|
|
9
9
|
* See `./types.ts` for the type-level API.
|
|
10
10
|
*
|
|
11
11
|
* @module
|
|
12
|
+
*
|
|
13
|
+
* @import { Vec } from '../../types/bit_vec/types.ts'
|
|
14
|
+
* @import { Result } from '../../types/result/types.ts'
|
|
15
|
+
* @import { Commands, CommandSet, Effect, Func, NotImplemented, Operation } from '../types.ts'
|
|
16
|
+
* @import { List } from '../list/types.ts'
|
|
17
|
+
* @import { All, Access, Await, Console, CreateExclusive, CreateServer, Dirent, Engine, Env, Exec, ExecResult, Fetch, FileStat, Forever, Fs, Headers, Http, IncomingMessage, Import, IoChannel, IoError, IoErrorInfo, Listen, MakeDirectoryOptions, Mkdir, Module, Now, NodeOp, NodeProgramOptions, RandomInt, Read, ReadBytes, ReadConsoles, ReadFile, Readdir, ReaddirOptions, RequestListener, Rename, Rm, Sandbox, SandboxResult, Server, ServerResponse, Stat, Test, TestContext, TestFn, Write, WriteBytes, WriteConsoles, WriteFile, _UtfList, _WriteLoop } from './types.ts'
|
|
12
18
|
*/
|
|
19
|
+
|
|
13
20
|
import { utf8, utf8ToString } from '../../text/module.f.mjs'
|
|
14
21
|
import { toCodePointList } from '../../text/utf8/module.f.mjs'
|
|
15
22
|
import { codePointListToString } from '../../text/utf16/module.f.mjs'
|
|
16
23
|
import { reverse } from '../../types/list/module.f.mjs'
|
|
17
24
|
import { length } from '../../types/bit_vec/module.f.mjs'
|
|
18
|
-
import {
|
|
19
|
-
import { do_,
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
25
|
+
import { error as resultError, ok as resultOk, unwrap } from '../../types/result/module.f.mjs'
|
|
26
|
+
import { do_, pure } from '../module.f.mjs'
|
|
27
|
+
import {
|
|
28
|
+
mapStep as ioMapStep, pureError, pureOk, resultMapStep, resultStep, step as ioStep,
|
|
29
|
+
} from '../module.f.mjs'
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Builds a normalized host error. The constructor exists so the shape is
|
|
33
|
+
* written once: every runner reports its failures through it, and a consumer
|
|
34
|
+
* matching on `'ioError'` knows what the payload holds.
|
|
35
|
+
*
|
|
36
|
+
* @type {(info: IoErrorInfo) => IoError}
|
|
37
|
+
*/
|
|
38
|
+
export const ioError = info => ['ioError', info]
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Normalizes a **thrown** value into an {@link IoError}: the OS error code when
|
|
42
|
+
* the host attached a string one, and a message that is the `Error`'s own or
|
|
43
|
+
* the value's string form.
|
|
44
|
+
*
|
|
45
|
+
* This is the boundary where an impure runner's `catch` becomes ordinary effect
|
|
46
|
+
* data. Nothing past it sees the thrown object, which is the point — a stack, a
|
|
47
|
+
* `cause`, and arbitrary own properties do not survive a wire hop, and a
|
|
48
|
+
* program that branched on them would be reading the host's implementation
|
|
49
|
+
* rather than the operation's contract.
|
|
50
|
+
*
|
|
51
|
+
* @type {(e: unknown) => IoError}
|
|
52
|
+
*/
|
|
53
|
+
export const toIoError = e => {
|
|
54
|
+
const message = e instanceof Error ? e.message : String(e)
|
|
55
|
+
if (typeof e !== 'object' || e === null || !('code' in e) || typeof e.code !== 'string') {
|
|
56
|
+
return ioError({ message })
|
|
57
|
+
}
|
|
58
|
+
return ioError({ code: e.code, message })
|
|
59
|
+
}
|
|
32
60
|
|
|
33
61
|
/**
|
|
34
62
|
* True if `e` is a "file or directory does not exist" (`ENOENT`) error.
|
|
35
63
|
*
|
|
36
|
-
* Node's filesystem rejections are `Error`s carrying `code: 'ENOENT'
|
|
37
|
-
*
|
|
38
|
-
* only the missing-path case (e.g. a fresh
|
|
39
|
-
* failures (permissions, corruption) rather
|
|
64
|
+
* Node's filesystem rejections are `Error`s carrying `code: 'ENOENT'`, which
|
|
65
|
+
* {@link toIoError} keeps; the virtual interpreter reports the same code for
|
|
66
|
+
* absent paths. Lets callers swallow only the missing-path case (e.g. a fresh
|
|
67
|
+
* store) while propagating genuine failures (permissions, corruption) rather
|
|
68
|
+
* than masking them.
|
|
69
|
+
*
|
|
70
|
+
* A {@link NotImplemented} is never "not found": a runner that cannot perform
|
|
71
|
+
* the operation has not looked for the path at all, so the two must not
|
|
72
|
+
* collapse into one benign branch — which is exactly what a bare `unknown`
|
|
73
|
+
* error channel used to allow.
|
|
74
|
+
*
|
|
75
|
+
* @type {(e: IoChannel) => boolean}
|
|
76
|
+
*/
|
|
77
|
+
export const isNotFound = ([tag, payload]) =>
|
|
78
|
+
tag === 'ioError' && payload.code === 'ENOENT'
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* `NodeOp`'s commands as data, so a runner that implements only part of them
|
|
82
|
+
* can still tell an operation it lacks from a `Do` node whose `command` was
|
|
83
|
+
* never a `NodeOp` at all — see `CommandSet` in `../types.ts` for why the
|
|
84
|
+
* distinction needs the set at runtime.
|
|
85
|
+
*
|
|
86
|
+
* Declared as a record because `CommandSet<NodeOp>` is checked for
|
|
87
|
+
* *completeness*: adding a command to `NodeOp` and forgetting it here is a
|
|
88
|
+
* compile error, where an array literal would only have its members checked and
|
|
89
|
+
* would drift silently.
|
|
90
|
+
*
|
|
91
|
+
* @type {CommandSet<NodeOp>}
|
|
92
|
+
*/
|
|
93
|
+
const nodeCommandSet = {
|
|
94
|
+
access: null, all: null, await: null, createExclusive: null,
|
|
95
|
+
createServer: null, exec: null, fetch: null, forever: null,
|
|
96
|
+
import: null, listen: null, memCreate: null, memRead: null,
|
|
97
|
+
memWrite: null, mkdir: null, now: null, randomInt: null,
|
|
98
|
+
read: null, readBytes: null, readFile: null, readdir: null,
|
|
99
|
+
rename: null, rm: null, sandbox: null, stat: null,
|
|
100
|
+
test: null, write: null, writeBytes: null, writeFile: null,
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* The commands of {@link nodeCommandSet}, in the form a partial runner tests
|
|
105
|
+
* membership against. The cast is the one `Object.keys` always needs: it
|
|
106
|
+
* answers `string[]` for a record whose keys the type system knows exactly.
|
|
40
107
|
*
|
|
41
|
-
* @type {
|
|
108
|
+
* @type {Commands<NodeOp>}
|
|
42
109
|
*/
|
|
43
|
-
export const
|
|
44
|
-
typeof e === 'object' && e !== null && (/** @type {{ readonly code?: unknown }} */ (e)).code === 'ENOENT'
|
|
110
|
+
export const nodeCommands = /** @type {Commands<NodeOp>} */ (Object.keys(nodeCommandSet))
|
|
45
111
|
|
|
46
112
|
// all
|
|
47
113
|
|
|
48
114
|
/**
|
|
49
115
|
* To run the operation `O` should be known by the runner/engine.
|
|
50
|
-
* This is the reason why we merge `O` with `All` in the
|
|
116
|
+
* This is the reason why we merge `O` with `All` in the resulting effect.
|
|
51
117
|
*/
|
|
52
118
|
export const all =
|
|
53
|
-
|
|
54
|
-
|
|
119
|
+
// `Func` cannot express a variadic generic operation, so the declared type
|
|
120
|
+
// is written out here and `do_`'s is set aside.
|
|
121
|
+
/** @type {<O extends Operation, T, E>(...a: readonly Effect<O, T, E>[]) => Effect<O | All, readonly Result<T, E>[], NotImplemented>} */
|
|
122
|
+
(/** @type {unknown} */ (do_('all')))
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Collapses a list of results into a result of the list, keeping the **first**
|
|
126
|
+
* error in list order and discarding the later ones.
|
|
127
|
+
*
|
|
128
|
+
* Keeping one is what makes this a `Result` rather than a report: the callers
|
|
129
|
+
* that need it are chains, and a chain has one error channel. A site that wants
|
|
130
|
+
* every failure wants a different return type and should not reach for this.
|
|
131
|
+
*
|
|
132
|
+
* @type {<T, E>(list: readonly Result<T, E>[]) => Result<readonly T[], E>}
|
|
133
|
+
*/
|
|
134
|
+
const okList = list => {
|
|
135
|
+
for (const r of list) {
|
|
136
|
+
if (r[0] === 'error') { return r }
|
|
137
|
+
}
|
|
138
|
+
return resultOk(list.map(unwrap))
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* {@link all} in the `ok` channel: collects the values when every effect
|
|
143
|
+
* succeeded, and answers with the first failure otherwise.
|
|
144
|
+
*
|
|
145
|
+
* `all` alone cannot serve a fallible chain. Its envelope is the runner's
|
|
146
|
+
* (`OpResult`, saying whether the *operation* could be dispatched), so handing
|
|
147
|
+
* it `Effect`s nests one `Result` inside another and the caller receives
|
|
148
|
+
* `readonly Result<T, E>[]`. That has to be collapsed before the chain can
|
|
149
|
+
* `step` again, and a continuation that forgets to is the value-discarding
|
|
150
|
+
* hazard this migration exists to remove — one level in, where it is harder to
|
|
151
|
+
* see.
|
|
152
|
+
*
|
|
153
|
+
* **Every effect still runs.** The short-circuit is in the *result*, not in the
|
|
154
|
+
* execution: `all` performs them concurrently and this reads the answers once
|
|
155
|
+
* they are all in, so a failure does not cancel its siblings the way it stops
|
|
156
|
+
* the sequential `forEachStep` in `./module.f.mjs`. The error channel
|
|
157
|
+
* unions the runner's
|
|
158
|
+
* `NotImplemented` with the effects' own `E` for the same reason every other
|
|
159
|
+
* step does — either can be what went wrong.
|
|
160
|
+
*
|
|
161
|
+
* @type {<O extends Operation, T, E>(...a: readonly Effect<O, T, E>[]) => Effect<O | All, readonly T[], NotImplemented | E>}
|
|
162
|
+
*/
|
|
163
|
+
export const allOk = (...a) =>
|
|
164
|
+
ioStep(all(...a), rs => pure(okList(rs)))
|
|
55
165
|
|
|
56
166
|
/**
|
|
57
167
|
* @template {Operation} O0
|
|
58
168
|
* @template T0
|
|
59
|
-
* @
|
|
60
|
-
* @
|
|
169
|
+
* @template E0
|
|
170
|
+
* @param {Effect<O0, T0, E0>} a
|
|
171
|
+
* @returns {<O1 extends Operation, T1, E1>(b: Effect<O1, T1, E1>) => Effect<O0 | O1 | All, readonly[Result<T0, E0>, Result<T1, E1>], NotImplemented>}
|
|
61
172
|
*/
|
|
62
173
|
export const both = a => b =>
|
|
63
174
|
/** @type {any} */ (all)(a, b)
|
|
@@ -80,14 +191,14 @@ export const readFile = do_('readFile')
|
|
|
80
191
|
/**
|
|
81
192
|
* Reads a file as UTF-8 text.
|
|
82
193
|
*
|
|
83
|
-
* Preserves the
|
|
84
|
-
* on
|
|
85
|
-
* call site.
|
|
194
|
+
* Preserves the error channel instead of unwrapping so callers can
|
|
195
|
+
* pattern-match on it (e.g. convert a failure into a domain-specific error) or
|
|
196
|
+
* `unwrap` at the call site.
|
|
86
197
|
*
|
|
87
|
-
* @type {(path: string) => Effect<ReadFile,
|
|
198
|
+
* @type {(path: string) => Effect<ReadFile, string, IoChannel>}
|
|
88
199
|
*/
|
|
89
200
|
export const readUtf8File = path =>
|
|
90
|
-
|
|
201
|
+
ioMapStep(readFile(path), utf8ToString)
|
|
91
202
|
|
|
92
203
|
// readdir
|
|
93
204
|
|
|
@@ -102,7 +213,7 @@ export const writeFile = do_('writeFile')
|
|
|
102
213
|
/**
|
|
103
214
|
* Writes a string to `path` as UTF-8 bytes.
|
|
104
215
|
*
|
|
105
|
-
* @type {(path: string, content: string) => Effect<WriteFile,
|
|
216
|
+
* @type {(path: string, content: string) => Effect<WriteFile, void, IoChannel>}
|
|
106
217
|
*/
|
|
107
218
|
export const writeUtf8File = (path, content) =>
|
|
108
219
|
writeFile(path, utf8(content))
|
|
@@ -151,21 +262,18 @@ export const writeBytes = do_('writeBytes')
|
|
|
151
262
|
const writeLoop = path => {
|
|
152
263
|
/** @type {_WriteLoop} */
|
|
153
264
|
const f = (offset, e) =>
|
|
154
|
-
|
|
155
|
-
if (
|
|
156
|
-
return
|
|
157
|
-
}
|
|
158
|
-
const { first: [t, v], tail } = r
|
|
159
|
-
if (t === 'error') {
|
|
160
|
-
return pure(resultError(v))
|
|
265
|
+
ioStep(e, node => {
|
|
266
|
+
if (node === undefined) {
|
|
267
|
+
return pureOk(undefined)
|
|
161
268
|
}
|
|
269
|
+
const { first: v, tail } = node
|
|
162
270
|
const lenV = length(v)
|
|
163
271
|
if ((lenV & 0b111n) !== 0n) {
|
|
164
|
-
return
|
|
272
|
+
return pureError(ioError({ message: 'invalid buffer size' }))
|
|
165
273
|
}
|
|
166
|
-
return
|
|
274
|
+
return ioStep(
|
|
167
275
|
writeBytes(path, offset, v),
|
|
168
|
-
|
|
276
|
+
() => f(offset + Number(lenV >> 3n), tail))
|
|
169
277
|
})
|
|
170
278
|
return f
|
|
171
279
|
}
|
|
@@ -173,13 +281,13 @@ const writeLoop = path => {
|
|
|
173
281
|
/**
|
|
174
282
|
* @template {Operation} O
|
|
175
283
|
* @param {string} path
|
|
176
|
-
* @param {List<O,
|
|
177
|
-
* @returns {Effect<O | WriteBytes | CreateExclusive,
|
|
284
|
+
* @param {List<O, Vec, IoChannel>} e
|
|
285
|
+
* @returns {Effect<O | WriteBytes | CreateExclusive, void, IoChannel>}
|
|
178
286
|
*/
|
|
179
287
|
export const writeFromStream = (path, e) =>
|
|
180
|
-
|
|
288
|
+
ioStep(
|
|
181
289
|
createExclusive(path),
|
|
182
|
-
|
|
290
|
+
() => writeLoop(path)(0, e))
|
|
183
291
|
|
|
184
292
|
// stat
|
|
185
293
|
|
|
@@ -210,27 +318,31 @@ export const import_ = do_('import')
|
|
|
210
318
|
// write
|
|
211
319
|
|
|
212
320
|
/** Emits a `Write` effect to the given named stream. */
|
|
213
|
-
|
|
321
|
+
/** @type {Func<Write>} */
|
|
322
|
+
export const write = do_('write')
|
|
214
323
|
|
|
215
324
|
/**
|
|
216
325
|
* Encodes `s + '\n'` as UTF-8 and emits a `Write` effect to `stream`.
|
|
217
326
|
* Shared implementation for `log` and `error`.
|
|
218
327
|
*
|
|
219
|
-
* @type {(stream: WriteConsoles) =>
|
|
328
|
+
* @type {(stream: WriteConsoles) => Console}
|
|
220
329
|
*/
|
|
221
330
|
const writeString = stream => s =>
|
|
222
331
|
write(stream, utf8(s + '\n'))
|
|
223
332
|
|
|
224
333
|
/** Writes a line to `stdout`. Replaces the retired `Log` effect. */
|
|
225
|
-
|
|
334
|
+
/** @type {Console} */
|
|
335
|
+
export const log = writeString('stdout')
|
|
226
336
|
|
|
227
337
|
/** Writes a line to `stderr`. Replaces the retired `Error` effect. */
|
|
228
|
-
|
|
338
|
+
/** @type {Console} */
|
|
339
|
+
export const error = writeString('stderr')
|
|
229
340
|
|
|
230
341
|
// read
|
|
231
342
|
|
|
232
343
|
/** Emits a `Read` effect, yielding the next input byte or `null` at EOF. */
|
|
233
|
-
|
|
344
|
+
/** @type {Func<Read>} */
|
|
345
|
+
export const read = do_('read')
|
|
234
346
|
|
|
235
347
|
/** @type {(bytes: _UtfList) => string} */
|
|
236
348
|
const utf8ListToString = bytes =>
|
|
@@ -253,17 +365,20 @@ const lf = 0x0a
|
|
|
253
365
|
* reversed and decoded once at the terminator, so a large line costs O(n)
|
|
254
366
|
* rather than the O(n²) of copying a growing array on every byte.
|
|
255
367
|
*
|
|
256
|
-
*
|
|
368
|
+
* A failed `read` — a runner without the operation — propagates: the line is
|
|
369
|
+
* not silently truncated into a `null` that a caller would read as EOF.
|
|
370
|
+
*
|
|
371
|
+
* @type {(stream: ReadConsoles) => Effect<Read, string | null, NotImplemented>}
|
|
257
372
|
*/
|
|
258
373
|
export const readLine = stream => {
|
|
259
|
-
/** @type {(acc: _UtfList) => Effect<Read, string | null>} */
|
|
374
|
+
/** @type {(acc: _UtfList) => Effect<Read, string | null, NotImplemented>} */
|
|
260
375
|
const loop = acc =>
|
|
261
|
-
|
|
376
|
+
ioStep(
|
|
262
377
|
read(stream),
|
|
263
378
|
b => b === null
|
|
264
|
-
?
|
|
379
|
+
? pureOk(acc === null ? null : utf8ListToString(reverse(acc)))
|
|
265
380
|
: b === lf
|
|
266
|
-
?
|
|
381
|
+
? pureOk(utf8ListToString(reverse(acc)))
|
|
267
382
|
: loop({ first: b, tail: acc })
|
|
268
383
|
)
|
|
269
384
|
return loop(null)
|
|
@@ -301,9 +416,9 @@ export const sandbox = do_('sandbox')
|
|
|
301
416
|
/** @type {Func<Await>} */
|
|
302
417
|
const awaitPromise = do_('await')
|
|
303
418
|
|
|
304
|
-
/** @type {(p: unknown) => Effect<Await, unknown>} */
|
|
419
|
+
/** @type {(p: unknown) => Effect<Await, unknown, NotImplemented>} */
|
|
305
420
|
export const awaitIfPromise = p =>
|
|
306
|
-
|
|
421
|
+
ioMapStep(awaitPromise(p), ([x]) => x)
|
|
307
422
|
|
|
308
423
|
// Test registration
|
|
309
424
|
|
|
@@ -313,14 +428,97 @@ export const test = do_('test')
|
|
|
313
428
|
// Node
|
|
314
429
|
|
|
315
430
|
/**
|
|
316
|
-
* Writes an error line to `stderr` and
|
|
431
|
+
* Writes an error line to `stderr` and fails with exit code `1`. The canonical
|
|
317
432
|
* "fail with a message" program for a `NodeProgram`. For non-`1` exit codes,
|
|
318
|
-
* compose `
|
|
433
|
+
* compose `resultMapStep(error(s), () => resultError(n))` directly.
|
|
434
|
+
*
|
|
435
|
+
* **It never succeeds, and the type says so.** `E` is `number` and `T` is
|
|
436
|
+
* `never`, so `step`'s continuation takes a `never` and can never run. That is
|
|
437
|
+
* a continuation nobody reaches, not a compile error: writing one still type-
|
|
438
|
+
* checks, because a function accepting `never` accepts anything. What the type
|
|
439
|
+
* buys is that no *value* can be invented for the success branch, so nothing
|
|
440
|
+
* downstream can proceed as if this had succeeded.
|
|
319
441
|
*
|
|
320
|
-
*
|
|
442
|
+
* **The write's own outcome is deliberately discarded**, which is why this is
|
|
443
|
+
* `resultMapStep` rather than `mapStep`. The program is already failing and
|
|
444
|
+
* the exit code is `1` whether or not `stderr` accepted the bytes; propagating
|
|
445
|
+
* here would hand every caller a "failed to report a failure" branch with no
|
|
446
|
+
* better answer available to it than the one taken here.
|
|
447
|
+
*
|
|
448
|
+
* @type {(s: string) => Effect<Write, never, number>}
|
|
321
449
|
*/
|
|
322
450
|
export const errorExit = s =>
|
|
323
|
-
|
|
451
|
+
resultMapStep(error(s), () => resultError(1))
|
|
452
|
+
|
|
453
|
+
/**
|
|
454
|
+
* The exit code a {@link Program} answered, from whichever branch it came.
|
|
455
|
+
*
|
|
456
|
+
* `Result<0, number>` puts a number at `[1]` on both sides — `ok(0)` for
|
|
457
|
+
* success, `error(n)` for failure — so reading the code never asks which
|
|
458
|
+
* branch produced it, while a caller that cares *whether* it failed still asks
|
|
459
|
+
* `[0]`. That is why the success type is the literal `0` rather than `void`.
|
|
460
|
+
*
|
|
461
|
+
* A non-zero code belongs in the `error` branch and `0` in the `ok` branch; the
|
|
462
|
+
* type cannot say so, since there is no "non-zero number", and nothing depends
|
|
463
|
+
* on it — this reads `[1]` either way.
|
|
464
|
+
*
|
|
465
|
+
* @type {(r: Result<0, number>) => number}
|
|
466
|
+
*/
|
|
467
|
+
export const exitCode = ([, code]) => code
|
|
468
|
+
|
|
469
|
+
/**
|
|
470
|
+
* Renders a channel error as a human line: an {@link IoError}'s own message, or
|
|
471
|
+
* the command name a runner could not dispatch.
|
|
472
|
+
*
|
|
473
|
+
* @type {(e: IoChannel) => string}
|
|
474
|
+
*/
|
|
475
|
+
export const errorMessage = ([tag, payload]) =>
|
|
476
|
+
tag === 'notImplemented' ? `operation not implemented: ${payload}` : payload.message
|
|
477
|
+
|
|
478
|
+
/**
|
|
479
|
+
* Renders a channel error for a **remote** caller: the command name for a
|
|
480
|
+
* {@link NotImplemented}, the OS error code for an `IoError`, and nothing else.
|
|
481
|
+
*
|
|
482
|
+
* {@link errorMessage} is for the operator of the program, who is entitled to
|
|
483
|
+
* the host's own words — including the path that failed. A protocol client is
|
|
484
|
+
* not, and the difference is not stylistic: `payload.message` is where the
|
|
485
|
+
* host puts the absolute path it could not read, so answering an MCP tool call
|
|
486
|
+
* with it publishes the server's filesystem layout to whoever is on the other
|
|
487
|
+
* end. The code (`ENOENT`, `EACCES`) says *what* went wrong without saying
|
|
488
|
+
* *where*, which is the part a client can act on anyway.
|
|
489
|
+
*
|
|
490
|
+
* A host that attached no code leaves nothing safe to forward, so the answer is
|
|
491
|
+
* the bare kind. That is deliberate: guessing which part of a free-text message
|
|
492
|
+
* is path-free is exactly the mistake this exists to prevent.
|
|
493
|
+
*
|
|
494
|
+
* @type {(e: IoChannel) => string}
|
|
495
|
+
*/
|
|
496
|
+
export const errorSummary = ([tag, payload]) =>
|
|
497
|
+
tag === 'notImplemented'
|
|
498
|
+
? `operation not implemented: ${payload}`
|
|
499
|
+
: payload.code === undefined ? 'io error' : `io error: ${payload.code}`
|
|
500
|
+
|
|
501
|
+
/**
|
|
502
|
+
* Ends a program with an exit code that reflects `e`: `ok` yields `0`, and a
|
|
503
|
+
* failure is reported on `stderr` and yields `1` ({@link errorExit}).
|
|
504
|
+
*
|
|
505
|
+
* This is the exit-code policy a `NodeProgram` needs at the end of its chain,
|
|
506
|
+
* and the reason a program does not have to invent one per command. It is the
|
|
507
|
+
* counterpart of {@link isNotFound} at the other end of the channel: where that
|
|
508
|
+
* one asks which failure this is, this one stops asking and reports.
|
|
509
|
+
*
|
|
510
|
+
* @type {<O extends Operation, T>(e: Effect<O, T, IoChannel>) => Effect<O | Write, 0, number>}
|
|
511
|
+
*/
|
|
512
|
+
export const exitStep = e =>
|
|
513
|
+
resultStep(e, r => {
|
|
514
|
+
// Bound rather than returned inline: the two branches are
|
|
515
|
+
// `Effect<Write, never, number>` and `Effect<never, 0, never>`, both
|
|
516
|
+
// assignable to this, but `step` infers its continuation's type from
|
|
517
|
+
// the union and picks neither.
|
|
518
|
+
/** @type {Effect<Write, 0, number>} */
|
|
519
|
+
const code = r[0] === 'error' ? errorExit(errorMessage(r[1])) : pureOk(0)
|
|
520
|
+
return code
|
|
521
|
+
})
|
|
324
522
|
|
|
325
523
|
/** @type {(version: string) => readonly number[]} */
|
|
326
524
|
const versionParts = version =>
|