functionalscript 0.44.0 → 0.46.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -3
- package/fjs/asn.1/module.f.mjs +8 -1
- package/fjs/asn.1/proof.f.d.mts +15 -0
- package/fjs/asn.1/proof.f.mjs +31 -3
- package/fjs/asserts/module.f.d.mts +14 -0
- package/fjs/asserts/module.f.mjs +20 -0
- package/fjs/asserts/proof.f.d.mts +3 -0
- package/fjs/asserts/proof.f.mjs +15 -1
- package/fjs/basen/base128/module.f.mjs +22 -5
- package/fjs/basen/base128/proof.f.d.mts +3 -1
- package/fjs/basen/base128/proof.f.mjs +3 -1
- package/fjs/basen/base64/module.f.mjs +7 -3
- package/fjs/basen/base64/proof.f.d.mts +3 -1
- package/fjs/basen/base64/proof.f.mjs +7 -4
- package/fjs/basen/cbase32/proof.f.d.mts +3 -1
- package/fjs/basen/cbase32/proof.f.mjs +3 -1
- package/fjs/bnf/data/module.f.d.mts +32 -6
- package/fjs/bnf/data/module.f.mjs +112 -7
- package/fjs/bnf/data/proof.f.d.mts +2 -0
- package/fjs/bnf/data/proof.f.mjs +74 -4
- package/fjs/bnf/data/types.d.ts +20 -2
- package/fjs/bnf/descent/module.f.d.mts +34 -5
- package/fjs/bnf/descent/module.f.mjs +176 -54
- package/fjs/bnf/descent/proof.f.d.mts +3 -0
- package/fjs/bnf/descent/proof.f.mjs +189 -27
- package/fjs/bnf/descent/types.d.ts +24 -18
- package/fjs/bnf/ll1/module.f.d.mts +74 -6
- package/fjs/bnf/ll1/module.f.mjs +297 -95
- package/fjs/bnf/ll1/proof.f.d.mts +17 -2
- package/fjs/bnf/ll1/proof.f.mjs +372 -137
- package/fjs/bnf/ll1/types.d.ts +25 -27
- package/fjs/bnf/matcher/module.f.d.mts +66 -0
- package/fjs/bnf/matcher/module.f.mjs +81 -0
- package/fjs/bnf/matcher/proof.f.d.mts +10 -0
- package/fjs/bnf/matcher/proof.f.mjs +79 -0
- package/fjs/bnf/matcher/types.d.ts +54 -0
- package/fjs/bnf/module.f.d.mts +15 -6
- package/fjs/bnf/module.f.mjs +52 -11
- package/fjs/bnf/proof.f.d.mts +2 -0
- package/fjs/bnf/proof.f.mjs +79 -3
- package/fjs/bnf/testlib.f.d.mts +31 -0
- package/fjs/bnf/testlib.f.mjs +80 -0
- package/fjs/bnf/token_symbol/module.f.d.mts +4 -3
- package/fjs/bnf/token_symbol/module.f.mjs +7 -6
- package/fjs/bnf/token_symbol/proof.f.mjs +5 -2
- package/fjs/bnf/token_symbol/types.d.ts +2 -2
- package/fjs/bnf/types.d.ts +10 -3
- package/fjs/cas/cli/module.f.d.mts +1 -1
- package/fjs/cas/cli/module.f.mjs +14 -20
- package/fjs/cas/cli/proof.f.d.mts +4 -4
- package/fjs/cas/cli/proof.f.mjs +47 -34
- package/fjs/cas/evo/module.f.d.mts +71 -31
- package/fjs/cas/evo/module.f.mjs +223 -138
- package/fjs/cas/evo/proof.f.d.mts +10 -1
- package/fjs/cas/evo/proof.f.mjs +311 -226
- package/fjs/cas/evo/types.d.ts +45 -9
- package/fjs/cas/module.f.d.mts +18 -32
- package/fjs/cas/module.f.mjs +164 -176
- package/fjs/cas/proof.f.d.mts +11 -8
- package/fjs/cas/proof.f.mjs +259 -147
- package/fjs/cas/types.d.ts +24 -10
- package/fjs/ci/common/module.f.d.mts +1 -1
- package/fjs/ci/common/module.f.mjs +1 -0
- package/fjs/ci/config/module.f.d.mts +3 -3
- package/fjs/ci/config/module.f.mjs +3 -3
- package/fjs/ci/module.f.d.mts +5 -5
- package/fjs/ci/module.f.mjs +8 -7
- package/fjs/ci/nix/module.f.d.mts +7 -5
- package/fjs/ci/nix/module.f.mjs +13 -12
- package/fjs/ci/nix/proof.f.d.mts +2 -0
- package/fjs/ci/nix/proof.f.mjs +4 -4
- package/fjs/ci/proof.f.d.mts +4 -2
- package/fjs/ci/proof.f.mjs +13 -8
- package/fjs/cli/module.f.d.mts +4 -6
- package/fjs/cli/module.f.mjs +4 -8
- package/fjs/cli/proof.f.d.mts +4 -2
- package/fjs/cli/proof.f.mjs +21 -18
- package/fjs/cli/types.d.ts +2 -3
- package/fjs/common/monoid/module.f.d.mts +70 -12
- package/fjs/common/monoid/module.f.mjs +177 -14
- package/fjs/common/monoid/proof.f.d.mts +12 -1
- package/fjs/common/monoid/proof.f.mjs +88 -4
- package/fjs/common/monoid/types.d.ts +23 -0
- package/fjs/crypto/hmac/module.f.mjs +2 -2
- package/fjs/crypto/secp/proof.f.d.mts +3 -1
- package/fjs/crypto/secp/proof.f.mjs +3 -1
- package/fjs/crypto/sha2/module.f.mjs +3 -1
- package/fjs/crypto/sha2/proof.f.d.mts +4 -1
- package/fjs/crypto/sha2/proof.f.mjs +27 -1
- package/fjs/crypto/sha2/types.d.ts +11 -0
- package/fjs/crypto/sign/module.f.mjs +2 -2
- package/fjs/crypto/vdf/module.f.d.mts +23 -4
- package/fjs/crypto/vdf/module.f.mjs +6 -4
- package/fjs/dev/module.f.d.mts +17 -5
- package/fjs/dev/module.f.mjs +60 -30
- package/fjs/dev/update/module.f.d.mts +11 -3
- package/fjs/dev/update/module.f.mjs +16 -11
- package/fjs/dev/update/proof.f.d.mts +4 -3
- package/fjs/dev/update/proof.f.mjs +11 -7
- package/fjs/djs/module.f.d.mts +13 -5
- package/fjs/djs/module.f.mjs +31 -16
- package/fjs/djs/parser/module.f.d.mts +16 -3
- package/fjs/djs/parser/module.f.mjs +135 -16
- package/fjs/djs/parser/proof.f.d.mts +8 -1
- package/fjs/djs/parser/proof.f.mjs +287 -13
- package/fjs/djs/parser/types.d.ts +7 -1
- package/fjs/djs/proof.f.d.mts +20 -1
- package/fjs/djs/proof.f.mjs +190 -12
- package/fjs/djs/serializer/module.f.d.mts +25 -8
- package/fjs/djs/serializer/module.f.mjs +66 -19
- package/fjs/djs/serializer/proof.f.d.mts +5 -0
- package/fjs/djs/serializer/proof.f.mjs +23 -1
- package/fjs/djs/tokenizer/module.f.d.mts +17 -5
- package/fjs/djs/tokenizer/module.f.mjs +120 -73
- package/fjs/djs/tokenizer/proof.f.d.mts +3 -0
- package/fjs/djs/tokenizer/proof.f.mjs +86 -67
- package/fjs/djs/transpiler/module.f.d.mts +13 -19
- package/fjs/djs/transpiler/module.f.mjs +79 -72
- package/fjs/djs/transpiler/types.d.ts +29 -0
- package/fjs/djs/types.d.ts +7 -1
- package/fjs/effects/list/module.f.d.mts +23 -12
- package/fjs/effects/list/module.f.mjs +16 -12
- package/fjs/effects/list/types.d.ts +27 -7
- package/fjs/effects/memory/module.f.d.mts +6 -3
- package/fjs/effects/memory/module.f.mjs +7 -7
- package/fjs/effects/memory/proof.f.d.mts +4 -0
- package/fjs/effects/memory/proof.f.mjs +18 -9
- package/fjs/effects/memory/types.d.ts +4 -3
- package/fjs/effects/mock/module.f.d.mts +28 -4
- package/fjs/effects/mock/module.f.mjs +39 -5
- package/fjs/effects/mock/types.d.ts +10 -1
- package/fjs/effects/module.d.mts +12 -2
- package/fjs/effects/module.f.d.mts +469 -281
- package/fjs/effects/module.f.mjs +538 -299
- package/fjs/effects/module.mjs +11 -2
- package/fjs/effects/node/memory/module.d.mts +7 -2
- package/fjs/effects/node/memory/module.mjs +9 -5
- package/fjs/effects/node/memory/proof.d.mts +2 -0
- package/fjs/effects/node/memory/proof.mjs +12 -5
- package/fjs/effects/node/module.d.mts +8 -2
- package/fjs/effects/node/module.f.d.mts +183 -43
- package/fjs/effects/node/module.f.mjs +260 -62
- package/fjs/effects/node/module.mjs +61 -50
- package/fjs/effects/node/proof.f.d.mts +28 -2
- package/fjs/effects/node/proof.f.mjs +161 -42
- package/fjs/effects/node/types.d.ts +106 -18
- package/fjs/effects/node/virtual/module.f.d.mts +21 -4
- package/fjs/effects/node/virtual/module.f.mjs +113 -70
- package/fjs/effects/node/virtual/proof.f.d.mts +31 -2
- package/fjs/effects/node/virtual/proof.f.mjs +201 -8
- package/fjs/effects/proof.f.d.mts +69 -34
- package/fjs/effects/proof.f.mjs +413 -130
- package/fjs/effects/types.d.ts +161 -33
- package/fjs/emergent_testing/all.test.d.mts +8 -0
- package/fjs/emergent_testing/all.test.mjs +14 -0
- package/fjs/emergent_testing/module.f.d.mts +22 -10
- package/fjs/emergent_testing/module.f.mjs +119 -85
- package/fjs/emergent_testing/proof.f.d.mts +21 -7
- package/fjs/emergent_testing/proof.f.mjs +169 -35
- package/fjs/emergent_testing/types.d.ts +22 -4
- package/fjs/fsc/bnf.f.d.mts +3 -0
- package/fjs/fsc/bnf.f.mjs +4 -1
- package/fjs/fsc/json.f.d.mts +3 -0
- package/fjs/fsc/json.f.mjs +4 -1
- package/fjs/fsc/module.f.d.mts +9 -0
- package/fjs/fsc/module.f.mjs +5 -3
- package/fjs/fsm/module.f.d.mts +14 -4
- package/fjs/fsm/module.f.mjs +54 -37
- package/fjs/fsm/proof.f.d.mts +5 -0
- package/fjs/fsm/proof.f.mjs +87 -115
- package/fjs/js/keywords/module.f.d.mts +52 -0
- package/fjs/js/keywords/module.f.mjs +72 -0
- package/fjs/{emergent_testing/scenarios/return-value.pass.d.ts → js/keywords/proof.f.d.mts} +1 -1
- package/fjs/js/keywords/proof.f.mjs +13 -0
- package/fjs/js/tokenizer/module.f.d.mts +30 -3
- package/fjs/js/tokenizer/module.f.mjs +161 -211
- package/fjs/js/tokenizer/proof.f.d.mts +1 -0
- package/fjs/js/tokenizer/proof.f.mjs +54 -24
- package/fjs/js/tokenizer/types.d.ts +33 -24
- package/fjs/mcp/cas/module.f.d.mts +1 -6
- package/fjs/mcp/cas/module.f.mjs +55 -51
- package/fjs/mcp/cas/proof.f.d.mts +15 -0
- package/fjs/mcp/cas/proof.f.mjs +174 -0
- package/fjs/mcp/evo/module.f.d.mts +19 -10
- package/fjs/mcp/evo/module.f.mjs +48 -27
- package/fjs/mcp/evo/proof.f.d.mts +6 -1
- package/fjs/mcp/evo/proof.f.mjs +115 -31
- package/fjs/mcp/module.f.d.mts +39 -4
- package/fjs/mcp/module.f.mjs +14 -12
- package/fjs/mcp/proof.f.d.mts +13 -1
- package/fjs/mcp/proof.f.mjs +120 -61
- package/fjs/media/html/module.f.d.mts +12 -0
- package/fjs/media/html/module.f.mjs +7 -5
- package/fjs/media/html/proof.f.d.mts +3 -0
- package/fjs/media/html/proof.f.mjs +4 -1
- package/fjs/media/json/extended/module.f.d.mts +82 -0
- package/fjs/media/json/extended/module.f.mjs +153 -0
- package/fjs/media/json/extended/proof.f.d.mts +42 -0
- package/fjs/media/json/extended/proof.f.mjs +127 -0
- package/fjs/media/json/extended/types.d.ts +23 -0
- package/fjs/media/json/module.f.d.mts +8 -2
- package/fjs/media/json/module.f.mjs +43 -41
- package/fjs/media/json/number/module.f.d.mts +59 -0
- package/fjs/media/json/number/module.f.mjs +136 -0
- package/fjs/media/json/number/proof.f.d.mts +24 -0
- package/fjs/media/json/number/proof.f.mjs +86 -0
- package/fjs/media/json/number/types.d.ts +28 -0
- package/fjs/media/json/parser/module.f.d.mts +25 -13
- package/fjs/media/json/parser/module.f.mjs +133 -72
- package/fjs/media/json/parser/proof.f.d.mts +5 -0
- package/fjs/media/json/parser/proof.f.mjs +31 -1
- package/fjs/media/json/parser/types.d.ts +38 -14
- package/fjs/media/json/rtti/module.f.d.mts +1 -1
- package/fjs/media/json/rtti/module.f.mjs +1 -1
- package/fjs/media/json/rtti/proof.f.d.mts +3 -0
- package/fjs/media/json/rtti/proof.f.mjs +12 -12
- package/fjs/media/json/schema/module.f.d.mts +61 -27
- package/fjs/media/json/schema/module.f.mjs +218 -63
- package/fjs/media/json/schema/proof.f.d.mts +41 -1
- package/fjs/media/json/schema/proof.f.mjs +220 -9
- package/fjs/media/json/serializer/module.f.d.mts +44 -0
- package/fjs/media/json/serializer/module.f.mjs +71 -9
- package/fjs/media/json/tokenizer/module.f.d.mts +8 -0
- package/fjs/media/json/tokenizer/module.f.mjs +31 -8
- package/fjs/media/json/tokenizer/proof.f.d.mts +6 -0
- package/fjs/media/json/tokenizer/proof.f.mjs +62 -21
- package/fjs/media/json/types.d.ts +36 -10
- package/fjs/media/lock/module.f.d.mts +100 -0
- package/fjs/media/lock/module.f.mjs +125 -0
- package/fjs/media/lock/proof.f.d.mts +33 -0
- package/fjs/media/lock/proof.f.mjs +196 -0
- package/fjs/media/lock/types.d.ts +15 -0
- package/fjs/media/module.f.d.mts +6 -5
- package/fjs/media/module.f.mjs +8 -7
- package/fjs/media/nix/module.f.d.mts +13 -0
- package/fjs/media/nix/module.f.mjs +4 -2
- package/fjs/media/nix/proof.f.d.mts +3 -0
- package/fjs/media/nix/proof.f.mjs +4 -1
- package/fjs/media/note/module.f.d.mts +121 -0
- package/fjs/media/note/module.f.mjs +131 -0
- package/fjs/media/note/proof.f.d.mts +29 -0
- package/fjs/media/note/proof.f.mjs +150 -0
- package/fjs/media/note/types.d.ts +10 -0
- package/fjs/media/proof.f.d.mts +4 -1
- package/fjs/media/proof.f.mjs +40 -21
- package/fjs/media/revision/module.f.d.mts +83 -7
- package/fjs/media/revision/module.f.mjs +127 -23
- package/fjs/media/revision/proof.f.d.mts +14 -0
- package/fjs/media/revision/proof.f.mjs +93 -2
- package/fjs/media/revision/types.d.ts +34 -5
- package/fjs/media/type/module.f.d.mts +53 -18
- package/fjs/media/type/module.f.mjs +87 -97
- package/fjs/media/type/proof.f.d.mts +17 -0
- package/fjs/media/type/proof.f.mjs +73 -13
- package/fjs/module.d.mts +5 -0
- package/fjs/module.f.d.mts +8 -0
- package/fjs/module.f.mjs +33 -10
- package/fjs/module.mjs +6 -0
- package/fjs/nanvm/proof.f.mjs +3 -3
- package/fjs/nanvm/rust/module.f.mjs +1 -1
- package/fjs/nanvm/update/module.f.d.mts +4 -4
- package/fjs/nanvm/update/module.f.mjs +8 -9
- package/fjs/nanvm/update/proof.f.mjs +4 -3
- package/fjs/path/module.f.d.mts +8 -0
- package/fjs/path/module.f.mjs +4 -2
- package/fjs/proof.f.d.mts +7 -3
- package/fjs/proof.f.mjs +41 -12
- package/fjs/protocol/json_rpc/module.f.d.mts +3 -3
- package/fjs/protocol/json_rpc/module.f.mjs +10 -7
- package/fjs/protocol/json_rpc/proof.f.d.mts +6 -0
- package/fjs/protocol/json_rpc/proof.f.mjs +26 -5
- package/fjs/protocol/mcp/module.f.d.mts +10 -13
- package/fjs/protocol/mcp/module.f.mjs +74 -58
- package/fjs/protocol/mcp/proof.f.d.mts +16 -3
- package/fjs/protocol/mcp/proof.f.mjs +224 -69
- package/fjs/protocol/mcp/stdio/module.f.d.mts +17 -11
- package/fjs/protocol/mcp/stdio/module.f.mjs +39 -33
- package/fjs/protocol/mcp/stdio/proof.f.d.mts +5 -3
- package/fjs/protocol/mcp/stdio/proof.f.mjs +46 -13
- package/fjs/protocol/mcp/stdio/types.d.ts +14 -0
- package/fjs/protocol/mcp/types.d.ts +17 -6
- package/fjs/sul/id/module.f.d.mts +4 -0
- package/fjs/sul/id/module.f.mjs +6 -6
- package/fjs/sul/level/hash/module.f.d.mts +4 -1
- package/fjs/sul/level/hash/module.f.mjs +6 -4
- package/fjs/sul/level/hash/proof.f.d.mts +4 -0
- package/fjs/sul/level/hash/proof.f.mjs +7 -4
- package/fjs/sul/level/literal/module.f.d.mts +4 -1
- package/fjs/sul/level/literal/module.f.mjs +4 -3
- package/fjs/sul/level/literal/proof.f.d.mts +3 -0
- package/fjs/sul/level/literal/proof.f.mjs +4 -1
- package/fjs/sul/module.f.d.mts +5 -3
- package/fjs/sul/module.f.mjs +23 -17
- package/fjs/sul/proof.f.d.mts +4 -0
- package/fjs/sul/proof.f.mjs +5 -2
- package/fjs/text/ascii/module.f.d.mts +26 -0
- package/fjs/text/ascii/module.f.mjs +49 -1
- package/fjs/text/ascii/proof.f.d.mts +10 -0
- package/fjs/text/ascii/proof.f.mjs +33 -1
- package/fjs/text/code_point/module.f.d.mts +29 -3
- package/fjs/text/code_point/module.f.mjs +32 -9
- package/fjs/text/code_point/proof.f.d.mts +2 -0
- package/fjs/text/code_point/proof.f.mjs +39 -0
- package/fjs/text/module.f.d.mts +4 -2
- package/fjs/text/module.f.mjs +4 -3
- package/fjs/text/proof.f.d.mts +3 -0
- package/fjs/text/proof.f.mjs +4 -1
- package/fjs/text/sgr/module.f.d.mts +6 -5
- package/fjs/text/sgr/module.f.mjs +8 -8
- package/fjs/text/sgr/proof.f.d.mts +3 -0
- package/fjs/text/sgr/proof.f.mjs +4 -1
- package/fjs/text/utf16/module.f.d.mts +5 -1
- package/fjs/text/utf16/module.f.mjs +38 -35
- package/fjs/text/utf16/proof.f.d.mts +3 -1
- package/fjs/text/utf16/proof.f.mjs +19 -2
- package/fjs/text/utf8/module.f.d.mts +9 -5
- package/fjs/text/utf8/module.f.mjs +20 -20
- package/fjs/types/array/module.f.d.mts +2 -1
- package/fjs/types/array/module.f.mjs +16 -4
- package/fjs/types/bigfloat/module.f.d.mts +21 -1
- package/fjs/types/bigfloat/module.f.mjs +33 -7
- package/fjs/types/bigfloat/proof.f.d.mts +1 -0
- package/fjs/types/bigfloat/proof.f.mjs +46 -0
- package/fjs/types/bigint/module.f.d.mts +4 -0
- package/fjs/types/bigint/module.f.mjs +4 -3
- package/fjs/types/bit_vec/module.f.d.mts +10 -16
- package/fjs/types/bit_vec/module.f.mjs +99 -95
- package/fjs/types/bit_vec/proof.f.d.mts +6 -0
- package/fjs/types/bit_vec/proof.f.mjs +31 -5
- package/fjs/types/btree/find/module.f.d.mts +5 -1
- package/fjs/types/btree/find/module.f.mjs +5 -5
- package/fjs/types/btree/find/proof.f.d.mts +5 -1
- package/fjs/types/btree/find/proof.f.mjs +5 -3
- package/fjs/types/btree/module.f.d.mts +3 -0
- package/fjs/types/btree/module.f.mjs +3 -2
- package/fjs/types/btree/proof.f.d.mts +5 -1
- package/fjs/types/btree/proof.f.mjs +5 -3
- package/fjs/types/btree/remove/module.f.d.mts +11 -0
- package/fjs/types/btree/remove/module.f.mjs +10 -10
- package/fjs/types/btree/remove/proof.f.d.mts +3 -0
- package/fjs/types/btree/remove/proof.f.mjs +4 -1
- package/fjs/types/btree/set/module.f.d.mts +9 -0
- package/fjs/types/btree/set/module.f.mjs +14 -17
- package/fjs/types/btree/set/proof.f.d.mts +3 -0
- package/fjs/types/btree/set/proof.f.mjs +16 -1
- package/fjs/types/btree/types/module.f.d.mts +2 -1
- package/fjs/types/btree/types/module.f.mjs +2 -1
- package/fjs/types/byte_set/module.f.d.mts +20 -4
- package/fjs/types/byte_set/module.f.mjs +18 -8
- package/fjs/types/byte_set/proof.f.d.mts +3 -1
- package/fjs/types/byte_set/proof.f.mjs +10 -8
- package/fjs/types/function/compare/module.f.d.mts +3 -2
- package/fjs/types/function/compare/module.f.mjs +13 -5
- package/fjs/types/function/module.f.d.mts +8 -1
- package/fjs/types/function/module.f.mjs +8 -1
- package/fjs/types/function/operator/module.f.d.mts +2 -1
- package/fjs/types/function/operator/module.f.mjs +2 -2
- package/fjs/types/list/module.f.d.mts +10 -3
- package/fjs/types/list/module.f.mjs +6 -4
- package/fjs/types/list/proof.f.d.mts +4 -1
- package/fjs/types/list/proof.f.mjs +4 -2
- package/fjs/types/nibble_set/module.f.d.mts +2 -1
- package/fjs/types/nibble_set/module.f.mjs +2 -2
- package/fjs/types/nominal/module.f.d.mts +2 -1
- package/fjs/types/nominal/module.f.mjs +2 -1
- package/fjs/types/nullable/module.f.d.mts +26 -6
- package/fjs/types/nullable/module.f.mjs +25 -6
- package/fjs/types/nullable/proof.f.d.mts +4 -0
- package/fjs/types/nullable/proof.f.mjs +15 -0
- package/fjs/types/number/module.f.d.mts +4 -0
- package/fjs/types/number/module.f.mjs +4 -3
- package/fjs/types/object/module.f.d.mts +26 -4
- package/fjs/types/object/module.f.mjs +26 -7
- package/fjs/types/object/proof.f.d.mts +5 -2
- package/fjs/types/object/proof.f.mjs +6 -3
- package/fjs/types/object/structurally_same/module.f.d.mts +39 -0
- package/fjs/types/object/structurally_same/module.f.mjs +59 -0
- package/fjs/types/object/structurally_same/proof.f.d.mts +6 -0
- package/fjs/types/object/structurally_same/proof.f.mjs +73 -0
- package/fjs/types/ordered_map/module.f.d.mts +5 -0
- package/fjs/types/ordered_map/module.f.mjs +5 -4
- package/fjs/types/ordered_map/proof.f.d.mts +3 -0
- package/fjs/types/ordered_map/proof.f.mjs +4 -1
- package/fjs/types/patricia_trie/module.f.d.mts +2 -1
- package/fjs/types/patricia_trie/module.f.mjs +27 -12
- package/fjs/types/patricia_trie/proof.f.d.mts +3 -0
- package/fjs/types/patricia_trie/proof.f.mjs +4 -1
- package/fjs/types/prime_field/module.f.d.mts +3 -1
- package/fjs/types/prime_field/module.f.mjs +3 -2
- package/fjs/types/range/module.f.d.mts +2 -1
- package/fjs/types/range/module.f.mjs +2 -2
- package/fjs/types/range_map/module.f.d.mts +6 -0
- package/fjs/types/range_map/module.f.mjs +6 -9
- package/fjs/types/range_map/proof.f.d.mts +5 -1
- package/fjs/types/range_map/proof.f.mjs +5 -3
- package/fjs/types/range_set/module.f.d.mts +5 -0
- package/fjs/types/range_set/module.f.mjs +1 -0
- package/fjs/types/range_set/proof.f.d.mts +3 -0
- package/fjs/types/range_set/proof.f.mjs +4 -1
- package/fjs/types/result/module.d.mts +8 -0
- package/fjs/types/result/module.f.d.mts +37 -7
- package/fjs/types/result/module.f.mjs +38 -8
- package/fjs/types/result/module.mjs +9 -1
- package/fjs/types/result/proof.f.d.mts +5 -0
- package/fjs/types/result/proof.f.mjs +22 -2
- package/fjs/types/rtti/common/module.f.d.mts +44 -14
- package/fjs/types/rtti/common/module.f.mjs +42 -36
- package/fjs/types/rtti/common/proof.f.d.mts +4 -0
- package/fjs/types/rtti/common/proof.f.mjs +10 -7
- package/fjs/types/rtti/data/module.f.d.mts +134 -0
- package/fjs/types/rtti/data/module.f.mjs +1053 -0
- package/fjs/types/rtti/data/proof.f.d.mts +76 -0
- package/fjs/types/rtti/data/proof.f.mjs +589 -0
- package/fjs/types/rtti/data/types.d.ts +83 -0
- package/fjs/types/rtti/module.f.d.mts +12 -5
- package/fjs/types/rtti/module.f.mjs +7 -5
- package/fjs/types/rtti/parse/module.f.d.mts +48 -0
- package/fjs/types/rtti/parse/module.f.mjs +45 -34
- package/fjs/types/rtti/parse/proof.f.d.mts +3 -2
- package/fjs/types/rtti/parse/proof.f.mjs +51 -52
- package/fjs/types/rtti/proof.f.d.mts +3 -1
- package/fjs/types/rtti/proof.f.mjs +6 -2
- package/fjs/types/rtti/ts/module.f.d.mts +68 -9
- package/fjs/types/rtti/ts/module.f.mjs +258 -30
- package/fjs/types/rtti/ts/proof.f.d.mts +44 -0
- package/fjs/types/rtti/ts/proof.f.mjs +152 -4
- package/fjs/types/rtti/ts/types.d.ts +25 -1
- package/fjs/types/rtti/types.d.ts +40 -0
- package/fjs/types/sorted_list/module.f.d.mts +4 -1
- package/fjs/types/sorted_list/module.f.mjs +21 -12
- package/fjs/types/sorted_list/proof.f.d.mts +3 -1
- package/fjs/types/sorted_list/proof.f.mjs +3 -1
- package/fjs/types/sorted_set/module.f.d.mts +49 -1
- package/fjs/types/sorted_set/module.f.mjs +26 -2
- package/fjs/types/sorted_set/proof.f.d.mts +4 -1
- package/fjs/types/sorted_set/proof.f.mjs +19 -2
- package/fjs/types/string/module.f.d.mts +4 -0
- package/fjs/types/string/module.f.mjs +4 -3
- package/fjs/types/string_set/module.f.d.mts +3 -1
- package/fjs/types/string_set/module.f.mjs +3 -2
- package/fjs/types/ts/module.f.d.mts +2 -0
- package/fjs/types/ts/module.f.mjs +3 -3
- package/fjs/types/ts/proof.f.d.mts +1 -0
- package/fjs/types/ts/proof.f.mjs +5 -0
- package/fjs/types/ts/types.d.ts +6 -1
- package/fjs/types/uint8array/module.f.d.mts +13 -2
- package/fjs/types/uint8array/module.f.mjs +20 -15
- package/fjs/website/module.f.d.mts +5 -2
- package/fjs/website/module.f.mjs +6 -8
- package/fjs/website/proof.f.mjs +2 -1
- package/package.json +3 -3
- package/fjs/asn.1/types.js +0 -6
- package/fjs/asserts/types.js +0 -6
- package/fjs/basen/types.js +0 -6
- package/fjs/bnf/data/types.js +0 -6
- package/fjs/bnf/descent/types.js +0 -6
- package/fjs/bnf/ll1/types.js +0 -6
- package/fjs/bnf/token_symbol/types.js +0 -6
- package/fjs/bnf/types.js +0 -6
- package/fjs/cas/evo/types.js +0 -7
- package/fjs/cas/types.js +0 -6
- package/fjs/ci/common/types.js +0 -1
- package/fjs/ci/nix/types.js +0 -6
- package/fjs/ci/types.js +0 -6
- package/fjs/cli/types.js +0 -6
- package/fjs/common/monoid/types.js +0 -6
- package/fjs/crypto/pow/types.js +0 -6
- package/fjs/crypto/secp/types.js +0 -6
- package/fjs/crypto/sha2/types.js +0 -6
- package/fjs/crypto/sign/types.js +0 -6
- package/fjs/crypto/vdf/types.js +0 -6
- package/fjs/dev/package_json/module.f.d.mts +0 -32
- package/fjs/dev/package_json/module.f.mjs +0 -37
- package/fjs/dev/package_json/proof.f.d.mts +0 -6
- package/fjs/dev/package_json/proof.f.mjs +0 -32
- package/fjs/dev/types.js +0 -6
- package/fjs/djs/ast/types.js +0 -8
- package/fjs/djs/parser/types.js +0 -7
- package/fjs/djs/tokenizer/types.js +0 -7
- package/fjs/djs/types.js +0 -7
- package/fjs/effects/eff/module.f.d.mts +0 -10
- package/fjs/effects/eff/module.f.mjs +0 -68
- package/fjs/effects/eff/proof.f.d.mts +0 -12
- package/fjs/effects/eff/proof.f.mjs +0 -66
- package/fjs/effects/eff/types.d.ts +0 -71
- package/fjs/effects/eff/types.js +0 -6
- package/fjs/effects/list/types.js +0 -6
- package/fjs/effects/memory/types.js +0 -6
- package/fjs/effects/mock/types.js +0 -6
- package/fjs/effects/node/types.js +0 -6
- package/fjs/effects/node/virtual/types.js +0 -7
- package/fjs/effects/types.js +0 -6
- package/fjs/emergent_testing/all.test.d.ts +0 -1
- package/fjs/emergent_testing/all.test.js +0 -5
- package/fjs/emergent_testing/scenarios/all.d.ts +0 -1
- package/fjs/emergent_testing/scenarios/all.js +0 -1
- package/fjs/emergent_testing/scenarios/async-subtests.fail.d.ts +0 -6
- package/fjs/emergent_testing/scenarios/async-subtests.fail.js +0 -9
- package/fjs/emergent_testing/scenarios/async-subtests.pass.d.ts +0 -6
- package/fjs/emergent_testing/scenarios/async-subtests.pass.js +0 -9
- package/fjs/emergent_testing/scenarios/async.fail.d.ts +0 -3
- package/fjs/emergent_testing/scenarios/async.fail.js +0 -6
- package/fjs/emergent_testing/scenarios/async.pass.d.ts +0 -3
- package/fjs/emergent_testing/scenarios/async.pass.js +0 -5
- package/fjs/emergent_testing/scenarios/fail.fail.d.ts +0 -3
- package/fjs/emergent_testing/scenarios/fail.fail.js +0 -3
- package/fjs/emergent_testing/scenarios/return-value.pass.js +0 -4
- package/fjs/emergent_testing/scenarios/thenable.pass.d.ts +0 -5
- package/fjs/emergent_testing/scenarios/thenable.pass.js +0 -11
- package/fjs/emergent_testing/scenarios/thenable2.pass.d.ts +0 -5
- package/fjs/emergent_testing/scenarios/thenable2.pass.js +0 -3
- package/fjs/emergent_testing/scenarios/throw.pass.d.ts +0 -5
- package/fjs/emergent_testing/scenarios/throw.pass.js +0 -3
- package/fjs/emergent_testing/types.js +0 -6
- package/fjs/js/tokenizer/types.js +0 -6
- package/fjs/media/html/types.js +0 -6
- package/fjs/media/json/parser/types.js +0 -6
- package/fjs/media/json/tokenizer/types.js +0 -6
- package/fjs/media/json/types.js +0 -13
- package/fjs/media/nix/types.js +0 -6
- package/fjs/media/revision/types.js +0 -8
- package/fjs/media/type/types.js +0 -6
- package/fjs/media/types.js +0 -7
- package/fjs/nanvm/types.js +0 -11
- package/fjs/protocol/json_rpc/types.js +0 -8
- package/fjs/protocol/mcp/types.js +0 -8
- package/fjs/sul/id/types.js +0 -6
- package/fjs/sul/level/hash/types.js +0 -6
- package/fjs/sul/level/literal/types.js +0 -6
- package/fjs/sul/types.js +0 -6
- package/fjs/text/sgr/types.js +0 -6
- package/fjs/text/types.js +0 -6
- package/fjs/text/utf16/types.js +0 -6
- package/fjs/text/utf8/types.js +0 -6
- package/fjs/types/array/types.js +0 -6
- package/fjs/types/bigfloat/types.js +0 -6
- package/fjs/types/bigint/types.js +0 -6
- package/fjs/types/bit_vec/types.js +0 -6
- package/fjs/types/btree/find/types.js +0 -6
- package/fjs/types/btree/types/types.js +0 -6
- package/fjs/types/byte_set/types.js +0 -6
- package/fjs/types/function/compare/types.js +0 -6
- package/fjs/types/function/operator/types.js +0 -6
- package/fjs/types/function/types.js +0 -6
- package/fjs/types/list/types.js +0 -6
- package/fjs/types/nibble_set/types.js +0 -6
- package/fjs/types/nominal/types.js +0 -6
- package/fjs/types/nullable/types.js +0 -6
- package/fjs/types/object/types.js +0 -8
- package/fjs/types/option/types.js +0 -6
- package/fjs/types/ordered_map/types.js +0 -6
- package/fjs/types/patricia_trie/types.js +0 -6
- package/fjs/types/phantom/types.js +0 -11
- package/fjs/types/prime_field/types.js +0 -6
- package/fjs/types/range/types.js +0 -6
- package/fjs/types/range_map/types.js +0 -6
- package/fjs/types/result/types.js +0 -6
- package/fjs/types/rtti/common/types.js +0 -1
- package/fjs/types/rtti/parse/types.js +0 -1
- package/fjs/types/rtti/ts/types.js +0 -1
- package/fjs/types/rtti/types.js +0 -1
- package/fjs/types/rtti/validate/module.f.d.mts +0 -6
- package/fjs/types/rtti/validate/module.f.mjs +0 -169
- package/fjs/types/rtti/validate/proof.f.d.mts +0 -125
- package/fjs/types/rtti/validate/proof.f.mjs +0 -437
- package/fjs/types/rtti/validate/types.d.ts +0 -6
- package/fjs/types/rtti/validate/types.js +0 -1
- package/fjs/types/sorted_list/types.js +0 -6
- package/fjs/types/sorted_set/types.js +0 -6
- package/fjs/types/string_set/types.js +0 -6
- package/fjs/types/ts/types.js +0 -8
package/fjs/bnf/testlib.f.d.mts
CHANGED
|
@@ -1,10 +1,41 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @module
|
|
3
3
|
*
|
|
4
|
+
* @import { Ast, AstTag } from './matcher/types.ts'
|
|
4
5
|
* @import { Rule } from './types.ts'
|
|
5
6
|
*/
|
|
7
|
+
import type { Ast } from './matcher/types.ts';
|
|
6
8
|
import type { Rule } from './types.ts';
|
|
7
9
|
/** @type {() => Rule} */
|
|
8
10
|
export declare const classic: () => Rule;
|
|
9
11
|
/** @type {() => Rule} */
|
|
10
12
|
export declare const deterministic: () => Rule;
|
|
13
|
+
export type _Leaf = number | readonly [number, unknown];
|
|
14
|
+
export type _AstNode = Ast<_Leaf>;
|
|
15
|
+
export type _AstChild = _AstNode | _Leaf;
|
|
16
|
+
export type _Parts = {
|
|
17
|
+
readonly parts: readonly string[];
|
|
18
|
+
readonly text: string;
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Renders a matcher AST as one line of `tag(children)`, with the code points a
|
|
22
|
+
* node consumed directly written as one quoted string.
|
|
23
|
+
*
|
|
24
|
+
* A proof that pins a whole AST is checking its *shape*, and raw JSON buries
|
|
25
|
+
* that under `{"tag":…,"sequence":[…]}` and a `[32,null]` per space — several
|
|
26
|
+
* kilobytes for an input a reader can hold in their head. This keeps the two
|
|
27
|
+
* things a repetition changes legible: how deep the nesting goes, and which
|
|
28
|
+
* tags survive. Repeated items are siblings under one node, whereas the
|
|
29
|
+
* right-recursive encoding puts each item one level deeper than the last.
|
|
30
|
+
*
|
|
31
|
+
* @type {(node: _AstNode) => string}
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
*
|
|
35
|
+
* ```ts
|
|
36
|
+
* // three spaces matched by a flat `repeat`, then by right-recursion
|
|
37
|
+
* '(" "(" ") " "(" ") " "(" "))'
|
|
38
|
+
* '" "(" " " "(" " " "(" " *())'
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export declare const showAst: (node: _AstNode) => string;
|
package/fjs/bnf/testlib.f.mjs
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @module
|
|
3
3
|
*
|
|
4
|
+
* @import { Ast, AstTag } from './matcher/types.ts'
|
|
4
5
|
* @import { Rule } from './types.ts'
|
|
5
6
|
*/
|
|
6
7
|
|
|
8
|
+
import { codePointToString } from '../text/utf16/module.f.mjs'
|
|
7
9
|
import {
|
|
8
10
|
commaJoin0Plus,
|
|
9
11
|
none,
|
|
@@ -194,3 +196,81 @@ export const deterministic = () => {
|
|
|
194
196
|
|
|
195
197
|
return json
|
|
196
198
|
}
|
|
199
|
+
|
|
200
|
+
//
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* The leaf of either backend's AST: `bnf/ll1` keeps the code point alone and
|
|
204
|
+
* `bnf/descent` pairs it with metadata, so a renderer that takes both is
|
|
205
|
+
* generic over exactly this.
|
|
206
|
+
*
|
|
207
|
+
* @typedef {number | readonly [number, unknown]} _Leaf
|
|
208
|
+
*/
|
|
209
|
+
|
|
210
|
+
/** @typedef {Ast<_Leaf>} _AstNode */
|
|
211
|
+
|
|
212
|
+
/** @typedef {_AstNode | _Leaf} _AstChild */
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* @param {_AstChild} child
|
|
216
|
+
* @returns {child is _AstNode}
|
|
217
|
+
*/
|
|
218
|
+
const isAstNode = child => typeof child !== 'number' && !(child instanceof Array)
|
|
219
|
+
|
|
220
|
+
/** @type {(child: _Leaf) => number} */
|
|
221
|
+
const codePointOf = child => typeof child === 'number' ? child : child[0]
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* A tag as `showAst` writes it: a quoted string, `*` for the tagless empty
|
|
225
|
+
* match, and nothing at all for an untagged node. `*` rather than `true`
|
|
226
|
+
* because a branch may itself be named `true` — the JSON grammars have one.
|
|
227
|
+
*
|
|
228
|
+
* @type {(tag: AstTag) => string}
|
|
229
|
+
*/
|
|
230
|
+
const showTag = tag =>
|
|
231
|
+
tag === undefined ? '' : tag === true ? '*' : JSON.stringify(tag)
|
|
232
|
+
|
|
233
|
+
/** @typedef {{ readonly parts: readonly string[], readonly text: string }} _Parts */
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
* Ends the run of consumed code points being accumulated, if there is one, so
|
|
237
|
+
* that a node's text appears as one quoted string rather than one part per
|
|
238
|
+
* symbol.
|
|
239
|
+
*
|
|
240
|
+
* @type {(acc: _Parts) => readonly string[]}
|
|
241
|
+
*/
|
|
242
|
+
const flushText = acc =>
|
|
243
|
+
acc.text === '' ? acc.parts : [...acc.parts, JSON.stringify(acc.text)]
|
|
244
|
+
|
|
245
|
+
/** @type {(acc: _Parts, child: _AstChild) => _Parts} */
|
|
246
|
+
const addChild = (acc, child) =>
|
|
247
|
+
isAstNode(child)
|
|
248
|
+
? { parts: [...flushText(acc), showAst(child)], text: '' }
|
|
249
|
+
: { parts: acc.parts, text: acc.text + codePointToString(codePointOf(child)) }
|
|
250
|
+
|
|
251
|
+
/** @type {_Parts} */
|
|
252
|
+
const noParts = { parts: [], text: '' }
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* Renders a matcher AST as one line of `tag(children)`, with the code points a
|
|
256
|
+
* node consumed directly written as one quoted string.
|
|
257
|
+
*
|
|
258
|
+
* A proof that pins a whole AST is checking its *shape*, and raw JSON buries
|
|
259
|
+
* that under `{"tag":…,"sequence":[…]}` and a `[32,null]` per space — several
|
|
260
|
+
* kilobytes for an input a reader can hold in their head. This keeps the two
|
|
261
|
+
* things a repetition changes legible: how deep the nesting goes, and which
|
|
262
|
+
* tags survive. Repeated items are siblings under one node, whereas the
|
|
263
|
+
* right-recursive encoding puts each item one level deeper than the last.
|
|
264
|
+
*
|
|
265
|
+
* @type {(node: _AstNode) => string}
|
|
266
|
+
*
|
|
267
|
+
* @example
|
|
268
|
+
*
|
|
269
|
+
* ```ts
|
|
270
|
+
* // three spaces matched by a flat `repeat`, then by right-recursion
|
|
271
|
+
* '(" "(" ") " "(" ") " "(" "))'
|
|
272
|
+
* '" "(" " " "(" " " "(" " *())'
|
|
273
|
+
* ```
|
|
274
|
+
*/
|
|
275
|
+
export const showAst = node =>
|
|
276
|
+
`${showTag(node.tag)}(${flushText(node.sequence.reduce(addChild, noParts)).join(' ')})`
|
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
* A parser built on top of a tokenizer consumes one input symbol per token, so
|
|
5
5
|
* multi-character operators (`>>>=`) and keywords (`instanceof`) each need a
|
|
6
6
|
* symbol of their own. Names are registered as one fixed alphabet and get a
|
|
7
|
-
* symbol from their position in it, above the Unicode range and
|
|
7
|
+
* symbol from their position in it, above the Unicode range and up to the last
|
|
8
|
+
* ordinary symbol.
|
|
8
9
|
*
|
|
9
10
|
* See `./types.ts` for the `Encoding<T>` type-level API.
|
|
10
11
|
*
|
|
@@ -14,8 +15,8 @@
|
|
|
14
15
|
*/
|
|
15
16
|
import type { Encoding } from './types.ts';
|
|
16
17
|
/**
|
|
17
|
-
* How many names one encoding holds: every symbol from {@link start} up to
|
|
18
|
-
*
|
|
18
|
+
* How many names one encoding holds: every symbol from {@link start} up to and
|
|
19
|
+
* including the last ordinary symbol (`0xFFFFFE`, the top of `fullRange`).
|
|
19
20
|
*
|
|
20
21
|
* @type {number}
|
|
21
22
|
*/
|
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
* A parser built on top of a tokenizer consumes one input symbol per token, so
|
|
5
5
|
* multi-character operators (`>>>=`) and keywords (`instanceof`) each need a
|
|
6
6
|
* symbol of their own. Names are registered as one fixed alphabet and get a
|
|
7
|
-
* symbol from their position in it, above the Unicode range and
|
|
7
|
+
* symbol from their position in it, above the Unicode range and up to the last
|
|
8
|
+
* ordinary symbol.
|
|
8
9
|
*
|
|
9
10
|
* See `./types.ts` for the `Encoding<T>` type-level API.
|
|
10
11
|
*
|
|
@@ -15,11 +16,11 @@
|
|
|
15
16
|
|
|
16
17
|
import { assert } from '../../asserts/module.f.mjs'
|
|
17
18
|
import { fromUndefined } from '../../types/nullable/module.f.mjs'
|
|
18
|
-
import {
|
|
19
|
+
import { fullRange, rangeDecode, unicodeRange } from '../module.f.mjs'
|
|
19
20
|
|
|
20
21
|
const [, unicodeLast] = rangeDecode(unicodeRange)
|
|
21
22
|
|
|
22
|
-
const [
|
|
23
|
+
const [, lastOrdinary] = rangeDecode(fullRange)
|
|
23
24
|
|
|
24
25
|
/**
|
|
25
26
|
* The symbol of the first registered name: `0x110000`, one past the last
|
|
@@ -29,12 +30,12 @@ const [eofSymbol] = rangeDecode(eof)
|
|
|
29
30
|
const start = unicodeLast + 1
|
|
30
31
|
|
|
31
32
|
/**
|
|
32
|
-
* How many names one encoding holds: every symbol from {@link start} up to
|
|
33
|
-
*
|
|
33
|
+
* How many names one encoding holds: every symbol from {@link start} up to and
|
|
34
|
+
* including the last ordinary symbol (`0xFFFFFE`, the top of `fullRange`).
|
|
34
35
|
*
|
|
35
36
|
* @type {number}
|
|
36
37
|
*/
|
|
37
|
-
export const capacity =
|
|
38
|
+
export const capacity = lastOrdinary - start + 1
|
|
38
39
|
|
|
39
40
|
/**
|
|
40
41
|
* Builds an encoding over the complete list of token names.
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { assertEq } from '../../asserts/module.f.mjs'
|
|
2
|
+
import { eofSymbol } from '../module.f.mjs'
|
|
2
3
|
import { capacity, encoding } from './module.f.mjs'
|
|
3
4
|
|
|
4
5
|
const names = /** @type {const} */ (['>>', '>>>=', 'instanceof'])
|
|
@@ -17,10 +18,12 @@ export const proof = {
|
|
|
17
18
|
},
|
|
18
19
|
() => {
|
|
19
20
|
const { decode } = encoding(names)
|
|
20
|
-
// past the end of the alphabet, a code point,
|
|
21
|
+
// past the end of the alphabet, a code point, the last ordinary
|
|
22
|
+
// symbol, and `eof`
|
|
21
23
|
assertEq(decode(0x110003), null)
|
|
22
24
|
assertEq(decode(0x10FFFF), null)
|
|
23
|
-
assertEq(decode(
|
|
25
|
+
assertEq(decode(0xFFFFFE), null)
|
|
26
|
+
assertEq(decode(eofSymbol), null)
|
|
24
27
|
},
|
|
25
28
|
],
|
|
26
29
|
roundTrip: () => {
|
|
@@ -20,8 +20,8 @@ export type Encoding<T extends string> = {
|
|
|
20
20
|
readonly encode: (name: T) => number;
|
|
21
21
|
/**
|
|
22
22
|
* The name a symbol stands for, or `null` when the symbol belongs to no
|
|
23
|
-
* registered name — a code point, `eof
|
|
24
|
-
* alphabet.
|
|
23
|
+
* registered name — a code point, the `eof` symbol, or a symbol past the
|
|
24
|
+
* end of the alphabet.
|
|
25
25
|
*/
|
|
26
26
|
readonly decode: (symbol: number) => Nullable<T>;
|
|
27
27
|
};
|
package/fjs/bnf/types.d.ts
CHANGED
|
@@ -5,11 +5,18 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import type { StringMap } from '../types/object/types.ts';
|
|
7
7
|
/**
|
|
8
|
-
* A range of symbols. Two 24-bit
|
|
8
|
+
* A range of symbols. Two 24-bit endpoint codes are stored in one JS number
|
|
9
|
+
* (48 bits).
|
|
9
10
|
*
|
|
10
11
|
* For example: 0xBBBBBB_EEEEEE
|
|
11
|
-
* - 0xBBBBBB is the first
|
|
12
|
-
* - 0xEEEEEE is the last
|
|
12
|
+
* - 0xBBBBBB is the first endpoint's stored code (24 bits)
|
|
13
|
+
* - 0xEEEEEE is the last endpoint's stored code (24 bits)
|
|
14
|
+
*
|
|
15
|
+
* A stored code is not the semantic terminal value: the semantic domain is
|
|
16
|
+
* `[-1] | [0, 2 ** 24 - 2]` — EOF plus every ordinary symbol — and EOF's code
|
|
17
|
+
* is `0xFFFFFF`, the top of the stored space. `rangeEncode` / `rangeDecode` in
|
|
18
|
+
* `./module.f.mjs` convert between the two, and everything that compares
|
|
19
|
+
* terminals compares decoded values.
|
|
13
20
|
*
|
|
14
21
|
* 24 bits per half, not 26 (the most `float64`'s 52-bit safe-integer mantissa
|
|
15
22
|
* could fit two of): 24 is divisible by 4, so each half is exactly 6 hex
|
|
@@ -14,4 +14,4 @@ import type { MemOp } from '../../effects/memory/types.ts';
|
|
|
14
14
|
import type { FileCasOperation } from '../types.ts';
|
|
15
15
|
/** @type {Commands<FileCasOperation | WriteFile | Write | All | MemOp | Read>} */
|
|
16
16
|
export declare const commands: Commands<FileCasOperation | WriteFile | Write | All | MemOp | Read>;
|
|
17
|
-
export declare const main:
|
|
17
|
+
export declare const main: import("../../effects/node/types.ts").Program<All | Read | Write | WriteFile | FileCasOperation | MemOp>;
|
package/fjs/cas/cli/module.f.mjs
CHANGED
|
@@ -11,8 +11,9 @@
|
|
|
11
11
|
|
|
12
12
|
import { sha256 } from '../../crypto/sha2/module.f.mjs'
|
|
13
13
|
import { cBase32ToVec, vecToCBase32 } from '../../basen/cbase32/module.f.mjs'
|
|
14
|
-
|
|
15
|
-
import { errorExit, log, writeFromStream } from '../../effects/node/module.f.mjs'
|
|
14
|
+
|
|
15
|
+
import { errorExit, exitStep, log, writeFromStream } from '../../effects/node/module.f.mjs'
|
|
16
|
+
import { forEachStep, step as ioStep } from '../../effects/module.f.mjs'
|
|
16
17
|
import { dispatch } from '../../cli/module.f.mjs'
|
|
17
18
|
import { casAddFile, fileCas } from '../module.f.mjs'
|
|
18
19
|
|
|
@@ -26,15 +27,9 @@ export const commands = [
|
|
|
26
27
|
return errorExit("'cas add' expects one parameter")
|
|
27
28
|
}
|
|
28
29
|
const c = fileCas(sha256)(home)
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
? pure(1)
|
|
33
|
-
: step(
|
|
34
|
-
log(vecToCBase32(hashResult[1])),
|
|
35
|
-
() => pure(0)
|
|
36
|
-
)
|
|
37
|
-
)
|
|
30
|
+
const added = casAddFile(c)(path)
|
|
31
|
+
const logged = ioStep(added, hash => log(vecToCBase32(hash)))
|
|
32
|
+
return exitStep(logged)
|
|
38
33
|
},
|
|
39
34
|
},
|
|
40
35
|
{
|
|
@@ -50,10 +45,7 @@ export const commands = [
|
|
|
50
45
|
}
|
|
51
46
|
const c = fileCas(sha256)(home)
|
|
52
47
|
const x = c.read(hash)
|
|
53
|
-
return
|
|
54
|
-
writeFromStream(path, x),
|
|
55
|
-
([r, v]) => r === 'error' ? errorExit(`e: ` + String(v)) : pure(0),
|
|
56
|
-
)
|
|
48
|
+
return exitStep(writeFromStream(path, x))
|
|
57
49
|
},
|
|
58
50
|
},
|
|
59
51
|
{
|
|
@@ -61,11 +53,13 @@ export const commands = [
|
|
|
61
53
|
description: 'List all stored content hashes',
|
|
62
54
|
handler: ({ home }) => {
|
|
63
55
|
const c = fileCas(sha256)(home)
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
56
|
+
// The fold's `items` is deliberately a raw effect, so a fallible
|
|
57
|
+
// producer composes with `step` ahead of it rather than the fold
|
|
58
|
+
// growing an error channel of its own.
|
|
59
|
+
// `c.list()` feeds the fold directly: the step that used to sit
|
|
60
|
+
// here existed only to unwrap the list so `pure` could wrap it
|
|
61
|
+
// again.
|
|
62
|
+
return exitStep(forEachStep(c.list(), j => log(vecToCBase32(j))))
|
|
69
63
|
},
|
|
70
64
|
},
|
|
71
65
|
]
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/**
|
|
2
|
+
* @import { NodeProgramOptions } from '../../effects/node/types.ts'
|
|
3
|
+
*/
|
|
2
4
|
export declare const proof: {
|
|
3
5
|
mainAdd: () => void;
|
|
4
6
|
mainAddGetBig: () => void;
|
|
@@ -12,7 +14,5 @@ export declare const proof: {
|
|
|
12
14
|
mainListEmptyStore: () => void;
|
|
13
15
|
mainNoCmd: () => void;
|
|
14
16
|
mainUnknownCmd: () => void;
|
|
15
|
-
|
|
16
|
-
mainListCorruptStore: () => readonly [import("../../effects/node/virtual/types.ts").State, number];
|
|
17
|
-
};
|
|
17
|
+
mainListCorruptStore: () => void;
|
|
18
18
|
};
|
package/fjs/cas/cli/proof.f.mjs
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/**
|
|
2
|
+
* @import { NodeProgramOptions } from '../../effects/node/types.ts'
|
|
3
|
+
*/
|
|
2
4
|
|
|
5
|
+
import { exitCode } from '../../effects/node/module.f.mjs'
|
|
3
6
|
import { commands } from './module.f.mjs'
|
|
4
7
|
import { computeSync, sha256 } from '../../crypto/sha2/module.f.mjs'
|
|
5
8
|
import { maxLength, vec, vec8 } from '../../types/bit_vec/module.f.mjs'
|
|
@@ -18,8 +21,8 @@ export const proof = {
|
|
|
18
21
|
mainAdd: () => {
|
|
19
22
|
const content = vec8(0x2An)
|
|
20
23
|
const state = { ...emptyState, root: { myfile: [content] } }
|
|
21
|
-
const [finalState,
|
|
22
|
-
assertEq(exitCode, 0, ['expected exit 0',
|
|
24
|
+
const [finalState, code] = virtual(state)(main(makeOptions(['add', 'myfile'])))
|
|
25
|
+
assertEq(exitCode(code), 0, ['expected exit 0', code])
|
|
23
26
|
assert(finalState.stdout.length !== 0, 'expected hash in stdout')
|
|
24
27
|
},
|
|
25
28
|
mainAddGetBig: () => {
|
|
@@ -27,8 +30,8 @@ export const proof = {
|
|
|
27
30
|
const content = [chunk, chunk]
|
|
28
31
|
const state = { ...emptyState, root: { myfile: content } }
|
|
29
32
|
//
|
|
30
|
-
const [finalState,
|
|
31
|
-
assertEq(exitCode, 0)
|
|
33
|
+
const [finalState, code] = virtual(state)(main(makeOptions(['add', 'myfile'])))
|
|
34
|
+
assertEq(exitCode(code), 0)
|
|
32
35
|
const stdout = finalState.stdout
|
|
33
36
|
assert(stdout.length !== 0)
|
|
34
37
|
//
|
|
@@ -38,32 +41,33 @@ export const proof = {
|
|
|
38
41
|
//
|
|
39
42
|
const [finalState2, exitCode2] = virtual(finalState)(main(makeOptions(['get', hs, 'myfile2'])))
|
|
40
43
|
// console.log(finalState2.stderr)
|
|
41
|
-
assertEq(exitCode2, 0, 'e2')
|
|
44
|
+
assertEq(exitCode(exitCode2), 0, 'e2')
|
|
42
45
|
const { myfile2 } = finalState2.root
|
|
43
46
|
assert(myfile2 instanceof Array)
|
|
44
47
|
const h2 = computeSync(sha256)(myfile2)
|
|
45
48
|
assertEq(h, h2, 'h')
|
|
46
49
|
},
|
|
47
50
|
mainAddWrongArgs: () => {
|
|
48
|
-
const [finalState,
|
|
49
|
-
assertEq(exitCode, 1)
|
|
51
|
+
const [finalState, code] = virtual(emptyState)(main(makeOptions(['add'])))
|
|
52
|
+
assertEq(exitCode(code), 1)
|
|
50
53
|
assert(finalState.stderr.length !== 0)
|
|
51
54
|
},
|
|
52
55
|
mainAddMissingFile: () => {
|
|
53
|
-
// The source path doesn't exist, so `streamFile`'s first read comes back as
|
|
54
|
-
//
|
|
55
|
-
// without ever calling `log` — covers
|
|
56
|
-
const [,
|
|
57
|
-
assertEq(exitCode, 1)
|
|
56
|
+
// The source path doesn't exist, so `streamFile`'s first read comes back as a
|
|
57
|
+
// stream failure; `write` fails closed with that error and the handler exits 1
|
|
58
|
+
// without ever calling `log` — covers `exitStep`'s error branch.
|
|
59
|
+
const [finalState, code] = virtual(emptyState)(main(makeOptions(['add', 'missing'])))
|
|
60
|
+
assertEq(exitCode(code), 1)
|
|
61
|
+
assertEq(finalState.stderr, 'no such file or directory\n', finalState.stderr)
|
|
58
62
|
},
|
|
59
63
|
mainGetFound: () => {
|
|
60
64
|
const content = vec8(0x2An)
|
|
61
65
|
const state = { ...emptyState, root: { myfile: [content] } }
|
|
62
66
|
const [state1, exitCode1] = virtual(state)(main(makeOptions(['add', 'myfile'])))
|
|
63
|
-
assertEq(exitCode1, 0, ['expected add exit 0', exitCode1])
|
|
67
|
+
assertEq(exitCode(exitCode1), 0, ['expected add exit 0', exitCode1])
|
|
64
68
|
const hashStr = state1.stdout.trim()
|
|
65
69
|
const [, exitCode2] = virtual(state1)(main(makeOptions(['get', hashStr, 'output'])))
|
|
66
|
-
assertEq(exitCode2, 0, ['expected get exit 0', exitCode2])
|
|
70
|
+
assertEq(exitCode(exitCode2), 0, ['expected get exit 0', exitCode2])
|
|
67
71
|
},
|
|
68
72
|
mainGetNotFound: () => {
|
|
69
73
|
// valid cBase32 hash that has not been stored
|
|
@@ -72,47 +76,56 @@ export const proof = {
|
|
|
72
76
|
const [state1] = virtual(state)(main(makeOptions(['add', 'myfile'])))
|
|
73
77
|
const hashStr = state1.stdout.trim()
|
|
74
78
|
// use an empty store so the hash is not found
|
|
75
|
-
const [finalState,
|
|
76
|
-
assertEq(exitCode, 1, ['expected exit 1',
|
|
77
|
-
|
|
79
|
+
const [finalState, code] = virtual(emptyState)(main(makeOptions(['get', hashStr, 'output'])))
|
|
80
|
+
assertEq(exitCode(code), 1, ['expected exit 1', code])
|
|
81
|
+
// The *message*, not just a non-empty line: the failure reaches the user
|
|
82
|
+
// as the host's own words. Asserting only that something was written is
|
|
83
|
+
// what let a stringified error tuple (`ioError,[object Object]`) pass.
|
|
84
|
+
assertEq(finalState.stderr, 'no such file or directory\n', finalState.stderr)
|
|
78
85
|
},
|
|
79
86
|
mainGetWrongArgs: () => {
|
|
80
|
-
const [finalState,
|
|
81
|
-
assertEq(exitCode, 1, ['expected exit 1',
|
|
87
|
+
const [finalState, code] = virtual(emptyState)(main(makeOptions(['get'])))
|
|
88
|
+
assertEq(exitCode(code), 1, ['expected exit 1', code])
|
|
82
89
|
assert(finalState.stderr.length !== 0, 'expected error in stderr')
|
|
83
90
|
},
|
|
84
91
|
mainGetInvalidHash: () => {
|
|
85
|
-
const [finalState,
|
|
86
|
-
assertEq(exitCode, 1, ['expected exit 1',
|
|
92
|
+
const [finalState, code] = virtual(emptyState)(main(makeOptions(['get', 'not-a-valid-hash', 'output'])))
|
|
93
|
+
assertEq(exitCode(code), 1, ['expected exit 1', code])
|
|
87
94
|
assert(finalState.stderr.length !== 0, 'expected error in stderr')
|
|
88
95
|
},
|
|
89
96
|
mainList: () => {
|
|
90
97
|
const content = vec8(0x2An)
|
|
91
98
|
const state = { ...emptyState, root: { myfile: [content] } }
|
|
92
99
|
const [state1] = virtual(state)(main(makeOptions(['add', 'myfile'])))
|
|
93
|
-
const [,
|
|
94
|
-
assertEq(exitCode, 0, ['expected exit 0',
|
|
100
|
+
const [, code] = virtual(state1)(main(makeOptions(['list'])))
|
|
101
|
+
assertEq(exitCode(code), 0, ['expected exit 0', code])
|
|
95
102
|
},
|
|
96
103
|
mainListEmptyStore: () => {
|
|
97
104
|
// A fresh directory has no `.cas` yet; listing must succeed (empty),
|
|
98
105
|
// not crash unwrapping a readdir ENOENT.
|
|
99
|
-
const [finalState,
|
|
100
|
-
assertEq(exitCode, 0, ['expected exit 0',
|
|
106
|
+
const [finalState, code] = virtual(emptyState)(main(makeOptions(['list'])))
|
|
107
|
+
assertEq(exitCode(code), 0, ['expected exit 0', code])
|
|
101
108
|
assertEq(finalState.stdout, '', ['expected empty stdout', finalState.stdout])
|
|
102
109
|
},
|
|
103
110
|
mainNoCmd: () => {
|
|
104
|
-
const [finalState,
|
|
105
|
-
assertEq(exitCode, 1, ['expected exit 1',
|
|
111
|
+
const [finalState, code] = virtual(emptyState)(main(makeOptions([])))
|
|
112
|
+
assertEq(exitCode(code), 1, ['expected exit 1', code])
|
|
106
113
|
assert(finalState.stderr.length !== 0, 'expected error in stderr')
|
|
107
114
|
},
|
|
108
115
|
mainUnknownCmd: () => {
|
|
109
|
-
const [finalState,
|
|
110
|
-
assertEq(exitCode, 1, ['expected exit 1',
|
|
116
|
+
const [finalState, code] = virtual(emptyState)(main(makeOptions(['bogus'])))
|
|
117
|
+
assertEq(exitCode(code), 1, ['expected exit 1', code])
|
|
111
118
|
assert(finalState.stderr.length !== 0, 'expected error in stderr')
|
|
112
119
|
},
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
120
|
+
// `.cas` exists but is a file, not a directory: a real storage error that
|
|
121
|
+
// must surface, not be masked as an empty list. It is no longer a panic
|
|
122
|
+
// either — `list` answers with the error and the CLI reports it on stderr
|
|
123
|
+
// and exits 1, which is why this is an ordinary proof rather than a
|
|
124
|
+
// `throw` one.
|
|
125
|
+
mainListCorruptStore: () => {
|
|
126
|
+
const [state, code] = virtual({ ...emptyState, root: { '.cas': [vec8(0x2An)] } })(main(makeOptions(['list'])))
|
|
127
|
+
assertEq(exitCode(code), 1)
|
|
128
|
+
assert(state.stderr !== '', ['expected the storage error reported on stderr', state.stderr])
|
|
129
|
+
assertEq(state.stdout, '')
|
|
117
130
|
},
|
|
118
131
|
}
|