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,32 +9,22 @@
|
|
|
9
9
|
* scheduling and pass/fail counting.
|
|
10
10
|
*
|
|
11
11
|
* @module
|
|
12
|
+
*
|
|
13
|
+
* @import { Operation } from '../effects/types.ts'
|
|
14
|
+
* @import { Effect, NotImplemented } from '../effects/types.ts'
|
|
15
|
+
* @import { LoadModuleOperations, ModuleMap } from '../dev/types.ts'
|
|
16
|
+
* @import { TestFn, TestEntry, TestSet, Path, Reporter, _TestState, _TestAndPath } from './types.ts'
|
|
17
|
+
* @import { All, Await, Env, IoChannel, NodeProgram, NodeProgramOptions, Program, Sandbox, SandboxResult, Test, TestContext, Write, WriteConsoles } from '../effects/node/types.ts'
|
|
12
18
|
*/
|
|
13
19
|
|
|
14
20
|
import { reset, fgGreen, fgRed, bold, csiWrite } from '../text/sgr/module.f.mjs'
|
|
15
|
-
import {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
Env,
|
|
20
|
-
NodeProgram,
|
|
21
|
-
NodeProgramOptions,
|
|
22
|
-
Program,
|
|
23
|
-
Sandbox,
|
|
24
|
-
SandboxResult,
|
|
25
|
-
Test,
|
|
26
|
-
TestContext,
|
|
27
|
-
Write,
|
|
28
|
-
WriteConsoles
|
|
29
|
-
} from '../effects/node/types.ts' */
|
|
30
|
-
import { history, historyStep, pure, step } from '../effects/module.f.mjs'
|
|
31
|
-
/** @import { Effect, Operation } from '../effects/types.ts' */
|
|
32
|
-
import { eff } from '../effects/eff/module.f.mjs'
|
|
21
|
+
import { allOk, awaitIfPromise, errorExit, errorMessage, errorSummary, exitStep, sandbox, test } from '../effects/node/module.f.mjs'
|
|
22
|
+
import {
|
|
23
|
+
catchStep, history, historyStep, mapStep, pureError, pureOk, resultStep, step,
|
|
24
|
+
} from '../effects/module.f.mjs'
|
|
33
25
|
import { loadModuleMap } from '../dev/module.f.mjs'
|
|
34
|
-
/** @import { LoadModuleOperations, ModuleMap } from '../dev/types.ts' */
|
|
35
26
|
import { invert } from '../types/result/module.f.mjs'
|
|
36
27
|
import { definedEntries } from '../types/object/module.f.mjs'
|
|
37
|
-
/** @import { TestFn, TestEntry, TestSet, Path, Reporter, _TestState, _TestAndPath } from './types.ts' */
|
|
38
28
|
|
|
39
29
|
/** @type {(delta: number) => (ts: _TestState) => _TestState} */
|
|
40
30
|
const addPass = delta => ts =>
|
|
@@ -117,10 +107,10 @@ export const collectTests = (path, throws, v) => {
|
|
|
117
107
|
* This is the correct model for Node `--test`, Bun, and Deno, where tests must
|
|
118
108
|
* be declared upfront and the framework drives execution.
|
|
119
109
|
*
|
|
120
|
-
* @type {(ctx: TestContext, k: string, v: unknown, star: string) => Effect<Test | All | Await, void>}
|
|
110
|
+
* @type {(ctx: TestContext, k: string, v: unknown, star: string) => Effect<Test | All | Await, void, NotImplemented>}
|
|
121
111
|
*/
|
|
122
112
|
export const registerModule = (ctx, k, v, star) => {
|
|
123
|
-
/** @type {(ctx: TestContext, entry: _TestAndPath) => Effect<Test | All | Await, void>} */
|
|
113
|
+
/** @type {(ctx: TestContext, entry: _TestAndPath) => Effect<Test | All | Await, void, NotImplemented>} */
|
|
124
114
|
const registerOne = (ctx, [path, { fn, throws }]) => {
|
|
125
115
|
// `star` (non-empty for Bun and for Node below the 26 baseline) signals
|
|
126
116
|
// that all sub-tests run inline inside this single registration, so an
|
|
@@ -130,28 +120,38 @@ export const registerModule = (ctx, k, v, star) => {
|
|
|
130
120
|
// extra suffix is needed.
|
|
131
121
|
const base = fmtImport(k, path)
|
|
132
122
|
const name = throws ? base : `${base}${star}`
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
)
|
|
123
|
+
// The registered callback panics on failure, deliberately. `Test` hands
|
|
124
|
+
// it to an external framework (node `--test`, Bun, Deno) that takes a
|
|
125
|
+
// body which either returns or throws: there is no channel to answer a
|
|
126
|
+
// failure through, so propagating it here would only discard it one
|
|
127
|
+
// level up.
|
|
128
|
+
// A throw is what that framework *does* understand — it reports the
|
|
129
|
+
// test as failed, which is the outcome a caller wants anyway. The `test`
|
|
130
|
+
// operation's own result is propagated normally, just below.
|
|
131
|
+
//
|
|
132
|
+
// `catchStep` rather than `unwrapStep`, so the absorption is visible in
|
|
133
|
+
// the type: the body answers `Effect<…, void, never>`, and the `never`
|
|
134
|
+
// is *because* this handler panics. `errorSummary` still names what is
|
|
135
|
+
// being panicked on and pins it, so if the body's channel ever widens
|
|
136
|
+
// past the node one, the compiler asks here rather than turning a new
|
|
137
|
+
// recoverable failure into a crash.
|
|
138
|
+
/** @type {(t: TestContext) => Effect<Test | All | Await, void, never>} */
|
|
139
|
+
const body = t =>
|
|
140
|
+
catchStep(step(awaitIfPromise(fn()), resolved => {
|
|
141
|
+
if (throws) {
|
|
142
|
+
return pureOk(undefined)
|
|
143
|
+
}
|
|
144
|
+
const sub = collectTests([...path, null], false, resolved)
|
|
145
|
+
if (sub.length === 0) {
|
|
146
|
+
return pureOk(undefined)
|
|
147
|
+
}
|
|
148
|
+
return mapStep(allOk(...sub.map(e => registerOne(t, e))), () => undefined)
|
|
149
|
+
}), e => { throw errorSummary(e) })
|
|
150
|
+
return test(ctx, name, throws, body)
|
|
149
151
|
}
|
|
150
152
|
const tests = collectTests([], false, v)
|
|
151
|
-
if (tests.length === 0) { return
|
|
152
|
-
return
|
|
153
|
-
.step(() => pure(undefined))
|
|
154
|
-
.value
|
|
153
|
+
if (tests.length === 0) { return pureOk(undefined) }
|
|
154
|
+
return mapStep(allOk(...tests.map(e => registerOne(ctx, e))), () => undefined)
|
|
155
155
|
}
|
|
156
156
|
|
|
157
157
|
/** @type {(a: _TestState, b: _TestState) => _TestState} */
|
|
@@ -164,10 +164,10 @@ const zero = { time: 0, pass: 0, fail: 0 }
|
|
|
164
164
|
/**
|
|
165
165
|
* @template {Operation} O
|
|
166
166
|
* @param {Reporter<O>} reporter
|
|
167
|
-
* @returns {(k: string, v: unknown) => (ts: _TestState) => Effect<O | All, _TestState>}
|
|
167
|
+
* @returns {(k: string, v: unknown) => (ts: _TestState) => Effect<O | All, _TestState, IoChannel>}
|
|
168
168
|
*/
|
|
169
169
|
const runModule = ({ result, test }) => (k, v) => ts => {
|
|
170
|
-
/** @type {(entry: _TestAndPath) => Effect<O | All, _TestState>} */
|
|
170
|
+
/** @type {(entry: _TestAndPath) => Effect<O | All, _TestState, IoChannel>} */
|
|
171
171
|
const one = ([testPath, set]) => {
|
|
172
172
|
// The sandbox result is still needed after it has been reported, so the
|
|
173
173
|
// reporting call is captured rather than nested inside its own step.
|
|
@@ -179,28 +179,24 @@ const runModule = ({ result, test }) => (k, v) => ts => {
|
|
|
179
179
|
([, sr]) => {
|
|
180
180
|
const { result: [s, r], duration } = sr
|
|
181
181
|
if (s !== 'ok') {
|
|
182
|
-
return
|
|
182
|
+
return pureOk(addFail(duration)(zero))
|
|
183
183
|
}
|
|
184
184
|
if (set.throws) {
|
|
185
|
-
return
|
|
185
|
+
return pureOk(addPass(duration)(zero))
|
|
186
186
|
}
|
|
187
187
|
// Walk return-value sub-tree; null marks the call boundary so
|
|
188
188
|
// paths render as e.g. `outer().inner`. throws resets to false.
|
|
189
|
-
return
|
|
189
|
+
return mapStep(
|
|
190
190
|
walk([...testPath, null], false, r),
|
|
191
|
-
sub =>
|
|
191
|
+
sub => mergeState(addPass(duration)(zero), sub))
|
|
192
192
|
})
|
|
193
193
|
}
|
|
194
|
-
/** @type {(path: Path, throws: boolean, v: unknown) => Effect<O | All, _TestState>} */
|
|
194
|
+
/** @type {(path: Path, throws: boolean, v: unknown) => Effect<O | All, _TestState, IoChannel>} */
|
|
195
195
|
const walk = (path, throws, v) => {
|
|
196
196
|
const effects = collectTests(path, throws, v).map(one)
|
|
197
|
-
return
|
|
198
|
-
.step(states => pure(states.reduce(mergeState, zero)))
|
|
199
|
-
.value
|
|
197
|
+
return mapStep(allOk(...effects), states => states.reduce(mergeState, zero))
|
|
200
198
|
}
|
|
201
|
-
return
|
|
202
|
-
.step(delta => pure(mergeState(ts, delta)))
|
|
203
|
-
.value
|
|
199
|
+
return mapStep(walk([], false, v), delta => mergeState(ts, delta))
|
|
204
200
|
}
|
|
205
201
|
|
|
206
202
|
/** @type {(moduleMap: ModuleMap) => readonly (readonly [string, unknown])[]} */
|
|
@@ -215,44 +211,74 @@ const proofEntries = moduleMap =>
|
|
|
215
211
|
*
|
|
216
212
|
* @template {Operation} O
|
|
217
213
|
* @param {Reporter<O>} reporter
|
|
218
|
-
* @returns {(moduleMap: ModuleMap) => Effect<O | All, number>}
|
|
214
|
+
* @returns {(moduleMap: ModuleMap) => Effect<O | All, number, IoChannel>}
|
|
219
215
|
*/
|
|
220
216
|
export const runModuleMap = reporter => moduleMap => {
|
|
221
217
|
const { summary } = reporter
|
|
222
218
|
const modules = proofEntries(moduleMap)
|
|
223
|
-
|
|
224
|
-
.
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
219
|
+
const total = mapStep(
|
|
220
|
+
allOk(...modules.map(([k, v]) => runModule(reporter)(k, v)(zero))),
|
|
221
|
+
m => m.reduce(mergeState, zero))
|
|
222
|
+
// The totals are still needed after the summary has been printed, so they
|
|
223
|
+
// are carried forward in a history rather than closed over by a nested
|
|
224
|
+
// continuation.
|
|
225
|
+
const reported = historyStep(
|
|
226
|
+
history(total),
|
|
227
|
+
ts => summary(ts.pass, ts.fail, ts.time))
|
|
228
|
+
return mapStep(reported, ([, ts]) => ts.fail !== 0 ? 1 : 0)
|
|
228
229
|
}
|
|
229
230
|
|
|
231
|
+
/**
|
|
232
|
+
* Ends a run with the exit code it computed, reporting a channel failure on
|
|
233
|
+
* `stderr` as exit `1`.
|
|
234
|
+
*
|
|
235
|
+
* Not `exitStep`, which answers `0` for every success: this chain's success
|
|
236
|
+
* value **is** the exit code, `1` when a test failed. The two policies differ
|
|
237
|
+
* only in what an `ok` means, and conflating them would report a failing suite
|
|
238
|
+
* as a passing run.
|
|
239
|
+
*
|
|
240
|
+
* A non-zero code therefore leaves through the *error* branch, which is what it
|
|
241
|
+
* means — a suite with failures is a failed program — and is why a caller
|
|
242
|
+
* cannot chain past it by accident.
|
|
243
|
+
*
|
|
244
|
+
* @type {<O extends Operation>(e: Effect<O, number, IoChannel>) => Effect<O | Write, 0, number>}
|
|
245
|
+
*/
|
|
246
|
+
const exitCodeStep = e =>
|
|
247
|
+
resultStep(e, r => {
|
|
248
|
+
/** @type {Effect<Write, 0, number>} */
|
|
249
|
+
const code = r[0] === 'error'
|
|
250
|
+
? errorExit(errorMessage(r[1]))
|
|
251
|
+
: r[1] === 0 ? pureOk(0) : pureError(r[1])
|
|
252
|
+
return code
|
|
253
|
+
})
|
|
254
|
+
|
|
230
255
|
/**
|
|
231
256
|
* Discovers all test modules via `loadModuleMap`, then runs them through
|
|
232
257
|
* `runModuleMap`. The composed effect is a `NodeProgram` entry point for the
|
|
233
258
|
* `fjs t` test runner.
|
|
234
259
|
*
|
|
260
|
+
* The chain leaves the error channel here, because this is where a `Program` ends
|
|
261
|
+
* and a `Program`'s answer is an exit code rather than a `Result`. A run that
|
|
262
|
+
* could not report its own results is a failed run, so it exits `1` with the
|
|
263
|
+
* reason on `stderr` instead of unwinding as a panic.
|
|
264
|
+
*
|
|
235
265
|
* @template {Operation} O
|
|
236
266
|
* @param {Reporter<O>} reporter
|
|
237
|
-
* @returns {Program<O | All | LoadModuleOperations>}
|
|
267
|
+
* @returns {Program<O | All | LoadModuleOperations | Write>}
|
|
238
268
|
*/
|
|
239
269
|
export const testAll = reporter => options =>
|
|
240
|
-
|
|
241
|
-
.step(runModuleMap(reporter))
|
|
242
|
-
.value
|
|
270
|
+
exitCodeStep(step(loadModuleMap(options.env), runModuleMap(reporter)))
|
|
243
271
|
|
|
244
272
|
/**
|
|
245
273
|
* Registers all modules in `moduleMap` that export a `proof` property with
|
|
246
274
|
* `ctx`. Delegates to `registerModule` for each matching entry.
|
|
247
275
|
*
|
|
248
|
-
* @type {(ctx: TestContext, star: string) => (moduleMap: ModuleMap) => Effect<Test | All | Await, void>}
|
|
276
|
+
* @type {(ctx: TestContext, star: string) => (moduleMap: ModuleMap) => Effect<Test | All | Await, void, NotImplemented>}
|
|
249
277
|
*/
|
|
250
278
|
const registerModuleMap = (ctx, star) => moduleMap => {
|
|
251
279
|
const modules = proofEntries(moduleMap)
|
|
252
|
-
if (modules.length === 0) { return
|
|
253
|
-
return
|
|
254
|
-
.step(() => pure(undefined))
|
|
255
|
-
.value
|
|
280
|
+
if (modules.length === 0) { return pureOk(undefined) }
|
|
281
|
+
return mapStep(allOk(...modules.map(([k, v]) => registerModule(ctx, k, v, star))), () => undefined)
|
|
256
282
|
}
|
|
257
283
|
|
|
258
284
|
/** @type {(c: string) => boolean} */
|
|
@@ -338,12 +364,10 @@ export const ghEscape = s =>
|
|
|
338
364
|
* Default `Reporter.test` implementation: sandboxes `fn` once and inverts the
|
|
339
365
|
* result when `throws` is `true` (caught error → pass, clean return → fail).
|
|
340
366
|
*
|
|
341
|
-
* @type {(file: string, path: Path, entry: TestEntry) => Effect<Sandbox, SandboxResult<unknown
|
|
367
|
+
* @type {(file: string, path: Path, entry: TestEntry) => Effect<Sandbox, SandboxResult<unknown>, NotImplemented>}
|
|
342
368
|
*/
|
|
343
369
|
export const defaultTest = (file, path, { fn, throws }) =>
|
|
344
|
-
|
|
345
|
-
.step(r => pure(throws ? { ...r, result: invert(r.result) } : r))
|
|
346
|
-
.value
|
|
370
|
+
mapStep(sandbox(fn), r => throws ? { ...r, result: invert(r.result) } : r)
|
|
347
371
|
|
|
348
372
|
/** @type {(file: string, path: Path, color: string, label: string, duration: number) => string} */
|
|
349
373
|
const fmtResultLine = (file, path, color, label, duration) =>
|
|
@@ -360,7 +384,12 @@ const fmtResultLine = (file, path, color, label, duration) =>
|
|
|
360
384
|
*/
|
|
361
385
|
export const defaultReporter = options => {
|
|
362
386
|
const write = csiWrite(options)
|
|
363
|
-
|
|
387
|
+
// A reporter that cannot emit its own output has no fallback to choose —
|
|
388
|
+
// there is nowhere left to report the failure — but it does not have to
|
|
389
|
+
// decide that here: the failure travels to the program's tail, which ends
|
|
390
|
+
// the run with the reason on `stderr` and exit `1`. That is the same
|
|
391
|
+
// outcome a panic produced, minus the stack trace.
|
|
392
|
+
/** @type {(w: WriteConsoles) => (s: string) => Effect<Write, void, NotImplemented>} */
|
|
364
393
|
const line = w => {
|
|
365
394
|
const x = write(w)
|
|
366
395
|
return s => x(s + '\n')
|
|
@@ -375,14 +404,17 @@ export const defaultReporter = options => {
|
|
|
375
404
|
? csiLog(fmtResultLine(file, path, fgGreen, 'ok', duration) + (throws ? ' # EXPECTED TO THROW' : ''))
|
|
376
405
|
: isGitHub
|
|
377
406
|
? csiError(`::error file=${file},line=1,title=${ghEscape(fmtImport(file, path))}::${ghEscape(String(v))}`)
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
407
|
+
// `step`, so the detail line is attempted only when the
|
|
408
|
+
// header line was written: two halves of one report, and
|
|
409
|
+
// half of it is worse than none.
|
|
410
|
+
: step(
|
|
411
|
+
csiError(fmtResultLine(file, path, fgRed, 'error', duration)),
|
|
412
|
+
() => csiError(`${fgRed}${v}${reset}`)),
|
|
381
413
|
summary: (pass, fail, time) => {
|
|
382
414
|
const fgFail = fail === 0 ? fgGreen : fgRed
|
|
383
|
-
return
|
|
384
|
-
|
|
385
|
-
|
|
415
|
+
return step(
|
|
416
|
+
csiLog(`${bold}Number of tests: pass: ${fgGreen}${pass}${reset}${bold}, fail: ${fgFail}${fail}${reset}${bold}, total: ${pass + fail}${reset}`),
|
|
417
|
+
() => csiLog(`${bold}Time: ${timeFormat(time)}${reset}`))
|
|
386
418
|
},
|
|
387
419
|
test: defaultTest,
|
|
388
420
|
}
|
|
@@ -407,8 +439,10 @@ export const main =
|
|
|
407
439
|
export const register = o => {
|
|
408
440
|
const star = o.inlineTestContext ? ' ...' : ''
|
|
409
441
|
const ctx = o.engine === 'bun' ? o.bunTestContext : o.testContext
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
442
|
+
const registered = step(loadModuleMap(o.env), registerModuleMap(ctx, star))
|
|
443
|
+
// `exitStep`, not `mapStep(…, () => 0)`: registering is the whole job here,
|
|
444
|
+
// so "registered nothing, exit 0" is the answer this used to give and the
|
|
445
|
+
// one it must not. A success has no code of its own, which is exactly the
|
|
446
|
+
// shape `exitStep` is for.
|
|
447
|
+
return exitStep(registered)
|
|
414
448
|
}
|
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @import {
|
|
3
|
-
* @import {
|
|
2
|
+
* @import { RunInstance } from '../effects/mock/types.ts'
|
|
3
|
+
* @import { Effect, NotImplemented } from '../effects/types.ts'
|
|
4
|
+
* @import { NodeProgramOptions, OpResult, Sandbox, Write } from '../effects/node/types.ts'
|
|
4
5
|
* @import { JsModule } from '../effects/node/virtual/types.ts'
|
|
5
6
|
* @import { Reporter } from './types.ts'
|
|
6
|
-
* @import { All, Await, Test, TestContext } from '../effects/node/types.ts'
|
|
7
|
+
* @import { All, Await, Import, Readdir, Test, TestContext } from '../effects/node/types.ts'
|
|
7
8
|
* @import { Ts } from '../types/rtti/ts/types.ts'
|
|
8
9
|
*/
|
|
10
|
+
import type { RunInstance } from '../effects/mock/types.ts';
|
|
9
11
|
import type { Effect } from '../effects/types.ts';
|
|
10
|
-
import type { Sandbox, Write } from '../effects/node/types.ts';
|
|
12
|
+
import type { OpResult, Sandbox, Write } from '../effects/node/types.ts';
|
|
11
13
|
import type { Reporter } from './types.ts';
|
|
12
|
-
import type { All, Await, Test, TestContext } from '../effects/node/types.ts';
|
|
14
|
+
import type { All, Await, Import, Readdir, Test, TestContext } from '../effects/node/types.ts';
|
|
13
15
|
import type { Ts } from '../types/rtti/ts/types.ts';
|
|
14
16
|
/**
|
|
15
17
|
* The mock reporter's stdout lines. A schema rather than a hand-written type:
|
|
@@ -39,13 +41,19 @@ export declare const defaultReporterOutput: () => void;
|
|
|
39
41
|
export declare const defaultReporterOutputLargeDuration: () => void;
|
|
40
42
|
export declare const defaultReporterFailOutput: () => void;
|
|
41
43
|
export declare const githubReporterOutput: () => void;
|
|
44
|
+
export type _FailOps = All | Import | Readdir | Sandbox | Write;
|
|
45
|
+
/** @typedef {All | Import | Readdir | Sandbox | Write} _FailOps */
|
|
46
|
+
export declare const reporterWriteFailure: () => void;
|
|
42
47
|
export type _RegisterMockState = readonly string[];
|
|
43
48
|
export type _RegisterMockOps = Test | All | Await;
|
|
44
|
-
export type _RegisterRunner =
|
|
45
|
-
export type _RegisterTestOp = (runner: _RegisterRunner, ctx: TestContext, name: string, expectFailure: boolean, fn: (t: TestContext) => Effect<_RegisterMockOps, void>) => (s: _RegisterMockState) => readonly [_RegisterMockState, void];
|
|
49
|
+
export type _RegisterRunner = RunInstance<_RegisterMockOps, _RegisterMockState>;
|
|
50
|
+
export type _RegisterTestOp = (runner: _RegisterRunner, ctx: TestContext, name: string, expectFailure: boolean, fn: (t: TestContext) => Effect<_RegisterMockOps, void, never>) => (s: _RegisterMockState) => readonly [_RegisterMockState, OpResult<void>];
|
|
46
51
|
export declare const registerSuffixes: () => void;
|
|
52
|
+
declare const registerBodyPanicsOnUndispatchableEffect: () => void;
|
|
47
53
|
export declare const registerThrowsWithoutThrowing: () => void;
|
|
48
54
|
export declare const registerEmptyProof: () => void;
|
|
55
|
+
export declare const registerEmptyModuleMap: () => void;
|
|
56
|
+
export declare const registerSelectsContextAndStar: () => void;
|
|
49
57
|
export declare const helpers: {
|
|
50
58
|
isInteger: () => void;
|
|
51
59
|
isIdentifier: () => void;
|
|
@@ -61,6 +69,9 @@ export declare const helpers: {
|
|
|
61
69
|
};
|
|
62
70
|
declare const defaultReporterExpectedToThrow: () => void;
|
|
63
71
|
export declare const proof: {
|
|
72
|
+
throw: {
|
|
73
|
+
registerBodyPanicsOnUndispatchableEffect: typeof registerBodyPanicsOnUndispatchableEffect;
|
|
74
|
+
};
|
|
64
75
|
flat: typeof flat;
|
|
65
76
|
nested: typeof nested;
|
|
66
77
|
throwKey: typeof throwKey;
|
|
@@ -76,9 +87,12 @@ export declare const proof: {
|
|
|
76
87
|
defaultReporterOutputLargeDuration: typeof defaultReporterOutputLargeDuration;
|
|
77
88
|
defaultReporterFailOutput: typeof defaultReporterFailOutput;
|
|
78
89
|
githubReporterOutput: typeof githubReporterOutput;
|
|
90
|
+
reporterWriteFailure: typeof reporterWriteFailure;
|
|
79
91
|
registerSuffixes: typeof registerSuffixes;
|
|
80
92
|
registerThrowsWithoutThrowing: typeof registerThrowsWithoutThrowing;
|
|
81
93
|
registerEmptyProof: typeof registerEmptyProof;
|
|
94
|
+
registerEmptyModuleMap: typeof registerEmptyModuleMap;
|
|
95
|
+
registerSelectsContextAndStar: typeof registerSelectsContextAndStar;
|
|
82
96
|
defaultReporterExpectedToThrow: typeof defaultReporterExpectedToThrow;
|
|
83
97
|
helpers: {
|
|
84
98
|
isInteger: () => void;
|