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/cas/evo/module.f.mjs
CHANGED
|
@@ -42,33 +42,65 @@
|
|
|
42
42
|
*
|
|
43
43
|
* @module
|
|
44
44
|
*
|
|
45
|
-
* @import {
|
|
45
|
+
* @import { Operation } from '../../effects/types.ts'
|
|
46
|
+
* @import { Effect, NotImplemented } from '../../effects/types.ts'
|
|
47
|
+
* @import { EvoChannel, EvoError } from './types.ts'
|
|
46
48
|
* @import { Key, MemOp } from '../../effects/memory/types.ts'
|
|
47
49
|
* @import { Cas } from '../types.ts'
|
|
48
|
-
* @import {
|
|
50
|
+
* @import { Result } from '../../types/result/types.ts'
|
|
49
51
|
* @import { Vec } from '../../types/bit_vec/types.ts'
|
|
50
|
-
* @import {
|
|
52
|
+
* @import { Ok } from '../../types/result/types.ts'
|
|
51
53
|
* @import { List } from '../../effects/list/types.ts'
|
|
52
|
-
* @import {
|
|
54
|
+
* @import { IoChannel, IoResult } from '../../effects/node/types.ts'
|
|
55
|
+
* @import { LockField, LockMap, Revision } from '../../media/revision/types.ts'
|
|
53
56
|
* @import { Hash, Subject, RevisionData, SubjectState, Cache, Evo } from './types.ts'
|
|
54
57
|
*/
|
|
55
58
|
|
|
56
|
-
import {
|
|
57
|
-
|
|
59
|
+
import {
|
|
60
|
+
catchStep,
|
|
61
|
+
foldStep as ioFoldStep,
|
|
62
|
+
mapStep as ioMapStep,
|
|
63
|
+
pureError,
|
|
64
|
+
pureOk,
|
|
65
|
+
resultMapStep,
|
|
66
|
+
step as ioStep,
|
|
67
|
+
} from '../../effects/module.f.mjs'
|
|
58
68
|
import { create, read, write } from '../../effects/memory/module.f.mjs'
|
|
59
69
|
import { collectRead } from '../module.f.mjs'
|
|
60
70
|
import { cBase32ToVec, vecToCBase32 } from '../../basen/cbase32/module.f.mjs'
|
|
61
71
|
import { fromVec } from '../../text/utf8/module.f.mjs'
|
|
62
72
|
import { tryUtf8 } from '../../text/module.f.mjs'
|
|
63
|
-
import { ok, error } from '../../types/result/module.f.mjs'
|
|
73
|
+
import { ok, error, okThen } from '../../types/result/module.f.mjs'
|
|
64
74
|
import { nonEmpty, empty as elEmpty } from '../../effects/list/module.f.mjs'
|
|
65
75
|
import { at, definedEntries } from '../../types/object/module.f.mjs'
|
|
66
76
|
import { unwrap } from '../../types/nullable/module.f.mjs'
|
|
67
|
-
import { isNotFound } from '../../effects/node/module.f.mjs'
|
|
77
|
+
import { errorSummary, isNotFound } from '../../effects/node/module.f.mjs'
|
|
68
78
|
import { decodeText, encodeText, dialect, checkReferences, isHash } from '../../media/revision/module.f.mjs'
|
|
69
79
|
|
|
80
|
+
/**
|
|
81
|
+
* A rejected revision, tagged so it renders alongside `notImplemented` and
|
|
82
|
+
* `ioError` rather than needing a `typeof` test to be told from them.
|
|
83
|
+
*
|
|
84
|
+
* @type {(message: string) => EvoError}
|
|
85
|
+
*/
|
|
86
|
+
export const evoError = message => ['evoError', message]
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Renders an {@link EvoChannel} failure as a message.
|
|
90
|
+
*
|
|
91
|
+
* The two cases are told apart by tag and nothing else — which is the whole
|
|
92
|
+
* reason {@link EvoError} is a tuple. A rejected revision already carries a
|
|
93
|
+
* message written for a caller; a runner that could not dispatch is described
|
|
94
|
+
* by `errorSummary`, the same renderer the node channel uses, so there is one
|
|
95
|
+
* phrasing of "operation not implemented" rather than two.
|
|
96
|
+
*
|
|
97
|
+
* @type {(e: EvoChannel) => string}
|
|
98
|
+
*/
|
|
99
|
+
export const evoSummary = e => e[0] === 'evoError' ? e[1] : errorSummary(e)
|
|
100
|
+
|
|
70
101
|
/** A cache with no known subjects yet — the starting point for {@link buildCache}. */
|
|
71
|
-
|
|
102
|
+
/** @type {Cache} */
|
|
103
|
+
export const emptyCache = { bySubject: {} }
|
|
72
104
|
|
|
73
105
|
/** @type {SubjectState} */
|
|
74
106
|
const emptySubjectState = { hashes: [], parents: [], archived: [] }
|
|
@@ -94,11 +126,26 @@ const union = set => items =>
|
|
|
94
126
|
*/
|
|
95
127
|
const canonicalHash = h => vecToCBase32(unwrap(cBase32ToVec(h)))
|
|
96
128
|
|
|
97
|
-
/**
|
|
129
|
+
/**
|
|
130
|
+
* Canonicalizes every direct hash of a structurally validated lock map, at
|
|
131
|
+
* every depth, preserving its nested scope structure. Nested maps are scopes
|
|
132
|
+
* rather than references, so only the strings are re-spelled — the same split
|
|
133
|
+
* `fjs/media/revision`'s `checkReferences` validates along.
|
|
98
134
|
* @type {(lock: LockMap) => LockMap}
|
|
99
135
|
*/
|
|
100
136
|
const canonicalLock = lock =>
|
|
101
|
-
Object.fromEntries(definedEntries(lock).map(
|
|
137
|
+
Object.fromEntries(definedEntries(lock).map(
|
|
138
|
+
([subject, value]) => [subject, typeof value === 'string' ? canonicalHash(value) : canonicalLock(value)]))
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Canonicalizes a revision's `lock` field: a shared-lock reference is one hash
|
|
142
|
+
* to re-spell, an inline map is walked to the bottom ({@link canonicalLock}).
|
|
143
|
+
* The split is the same one `fjs/media/revision`'s `lockFieldError` validates
|
|
144
|
+
* along, so what this re-spells is exactly what was checked.
|
|
145
|
+
* @type {(value: LockField) => LockField}
|
|
146
|
+
*/
|
|
147
|
+
const canonicalLockField = value =>
|
|
148
|
+
typeof value === 'string' ? canonicalHash(value) : canonicalLock(value)
|
|
102
149
|
|
|
103
150
|
/** A subject's current heads: revision hashes seen that no other revision of the same subject names as a parent.
|
|
104
151
|
* @type {(state: SubjectState) => readonly Hash[]}
|
|
@@ -182,51 +229,62 @@ export const decodeRevisionVec = value => {
|
|
|
182
229
|
*
|
|
183
230
|
* @template {Operation} O
|
|
184
231
|
* @param {Cas<O>} cas
|
|
185
|
-
*
|
|
232
|
+
* The `never` is a decision, not an observation: reading the store *can* fail,
|
|
233
|
+
* and this maps that failure to `null` alongside "the bytes are not a
|
|
234
|
+
* revision". A scan wants exactly that — one unreadable blob must not fail the
|
|
235
|
+
* whole cache build — but the two are genuinely different answers, and this
|
|
236
|
+
* one loses the difference on purpose. Saying `never` puts that where a reader
|
|
237
|
+
* can disagree with it.
|
|
238
|
+
*
|
|
239
|
+
* @returns {(hash: Vec) => Effect<O, Revision | null, never>}
|
|
186
240
|
*/
|
|
187
241
|
export const decodeRevisionBlob = cas => hash =>
|
|
188
|
-
|
|
189
|
-
.
|
|
190
|
-
|
|
242
|
+
resultMapStep(
|
|
243
|
+
collectRead(cas.read(hash)),
|
|
244
|
+
([tag, value]) => ok(tag === 'error' ? null : decodeRevisionVec(value)))
|
|
191
245
|
|
|
192
246
|
/**
|
|
193
247
|
* Scans every hash in `cas` and builds a fresh {@link Cache} from the
|
|
194
248
|
* `vnd.fjs.revision` blobs found among them. Non-revision blobs are ignored.
|
|
195
249
|
*
|
|
250
|
+
* A store that cannot be listed is a failure of the scan, not an empty cache:
|
|
251
|
+
* the fold never starts, and the caller is told. Blobs that fail to *read*
|
|
252
|
+
* remain "not a revision" and are skipped — see {@link decodeRevisionBlob}.
|
|
253
|
+
*
|
|
196
254
|
* @template {Operation} O
|
|
197
255
|
* @param {Cas<O>} cas
|
|
198
|
-
* @returns {Effect<O, Cache>}
|
|
256
|
+
* @returns {Effect<O, Cache, IoChannel>}
|
|
199
257
|
*/
|
|
200
|
-
export const buildCache = cas =>
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
258
|
+
export const buildCache = cas => {
|
|
259
|
+
// Annotated rather than inferred: the body's `ok(…)` is an `Ok<Cache>`,
|
|
260
|
+
// which unifies with `Result<S, E>` for any `E`, so the fold's error type
|
|
261
|
+
// has nothing to pin it and drifts into the accumulator's.
|
|
262
|
+
/** @type {(hash: Vec) => (cache: Cache) => Effect<O, Cache, IoChannel>} */
|
|
263
|
+
const foldOne = hash => cache =>
|
|
264
|
+
ioMapStep(
|
|
265
|
+
decodeRevisionBlob(cas)(hash),
|
|
266
|
+
revision =>
|
|
267
|
+
revision === null ? cache : addRevisionToCache(vecToCBase32(hash), revision)(cache))
|
|
268
|
+
return ioStep(cas.list(), hashes => ioFoldStep(pureOk(hashes), emptyCache, foldOne))
|
|
269
|
+
}
|
|
210
270
|
|
|
211
271
|
/**
|
|
212
272
|
* Scans `cas` once and allocates a memory slot holding the resulting {@link Cache}.
|
|
213
273
|
*
|
|
214
274
|
* @template {Operation} O
|
|
215
275
|
* @param {Cas<O>} cas
|
|
216
|
-
* @returns {Effect<O | MemOp, Key<Cache
|
|
276
|
+
* @returns {Effect<O | MemOp, Key<Cache>, IoChannel>}
|
|
217
277
|
*/
|
|
218
278
|
export const initEvo = cas =>
|
|
219
|
-
|
|
220
|
-
.step(cache => create(cache))
|
|
221
|
-
.value
|
|
279
|
+
ioStep(buildCache(cas), cache => create(cache))
|
|
222
280
|
|
|
223
281
|
/** Reads, then rewrites, the cache at `cacheKey` with `revision` folded in at `hash`.
|
|
224
|
-
* @type {(cacheKey: Key<Cache>) => (hash: Hash) => (revision: Revision) => Effect<MemOp, void>}
|
|
282
|
+
* @type {(cacheKey: Key<Cache>) => (hash: Hash) => (revision: Revision) => Effect<MemOp, void, NotImplemented>}
|
|
225
283
|
*/
|
|
226
284
|
const foldIntoCache = cacheKey => hash => revision =>
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
285
|
+
ioStep(
|
|
286
|
+
read(cacheKey),
|
|
287
|
+
cache => write(cacheKey, addRevisionToCache(hash, revision)(cache)))
|
|
230
288
|
|
|
231
289
|
/**
|
|
232
290
|
* Folds `value` — bytes already written to a `Cas` at `hash` by some other
|
|
@@ -236,11 +294,11 @@ const foldIntoCache = cacheKey => hash => revision =>
|
|
|
236
294
|
* call can store a revision blob without going through {@link addRevision},
|
|
237
295
|
* and this is what keeps the cache honest about it without rescanning the
|
|
238
296
|
* whole store.
|
|
239
|
-
* @type {(cacheKey: Key<Cache>) => (hash: Vec) => (value: Vec) => Effect<MemOp, void>}
|
|
297
|
+
* @type {(cacheKey: Key<Cache>) => (hash: Vec) => (value: Vec) => Effect<MemOp, void, NotImplemented>}
|
|
240
298
|
*/
|
|
241
299
|
export const syncRevision = cacheKey => hash => value => {
|
|
242
300
|
const revision = decodeRevisionVec(value)
|
|
243
|
-
return revision === null ?
|
|
301
|
+
return revision === null ? pureOk(undefined) : foldIntoCache(cacheKey)(vecToCBase32(hash))(revision)
|
|
244
302
|
}
|
|
245
303
|
|
|
246
304
|
/**
|
|
@@ -252,42 +310,39 @@ export const syncRevision = cacheKey => hash => value => {
|
|
|
252
310
|
*
|
|
253
311
|
* @template {Operation} O
|
|
254
312
|
* @param {Cas<O>} cas
|
|
255
|
-
* @returns {(parentRef: Hash) => Effect<O,
|
|
313
|
+
* @returns {(parentRef: Hash) => Effect<O, Revision, EvoError>}
|
|
256
314
|
*/
|
|
257
315
|
const resolveParent = cas => parentRef => {
|
|
258
316
|
const parentHash = cBase32ToVec(parentRef)
|
|
259
317
|
if (parentHash === null) {
|
|
260
|
-
return
|
|
318
|
+
return pureError(evoError(`invalid parent hash: ${parentRef}`))
|
|
261
319
|
}
|
|
262
|
-
return
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
320
|
+
return ioStep(
|
|
321
|
+
decodeRevisionBlob(cas)(parentHash),
|
|
322
|
+
parent => parent === null
|
|
323
|
+
? pureError(evoError(`parent is not a revision blob: ${parentRef}`))
|
|
324
|
+
: pureOk(parent))
|
|
267
325
|
}
|
|
268
326
|
|
|
269
327
|
/**
|
|
270
328
|
* Resolves and validates every entry of `parents`, in order, short-circuiting on the first failure.
|
|
271
329
|
*
|
|
330
|
+
* Short-circuiting is `foldStep`'s, not this function's. It used to be
|
|
331
|
+
* two hand-written `[0] === 'error'` tests, which is what a verdict costs when
|
|
332
|
+
* it rides in the value instead of the channel.
|
|
333
|
+
*
|
|
272
334
|
* @template {Operation} O
|
|
273
335
|
* @param {Cas<O>} cas
|
|
274
|
-
* @returns {(parents: readonly Hash[]) => Effect<O,
|
|
336
|
+
* @returns {(parents: readonly Hash[]) => Effect<O, readonly Revision[], EvoError>}
|
|
275
337
|
*/
|
|
276
338
|
const resolveParents = cas => parents => {
|
|
277
|
-
/** @type {
|
|
278
|
-
const init =
|
|
279
|
-
return
|
|
280
|
-
|
|
339
|
+
/** @type {readonly Revision[]} */
|
|
340
|
+
const init = []
|
|
341
|
+
return ioFoldStep(
|
|
342
|
+
pureOk(parents),
|
|
281
343
|
init,
|
|
282
|
-
parentRef => (/** @type {
|
|
283
|
-
|
|
284
|
-
return eff(resolveParent(cas)(parentRef))
|
|
285
|
-
.step((/** @type {Result<Revision, string>} */ parentResult) =>
|
|
286
|
-
/** @type {Effect<never, Result<readonly Revision[], string>>} */
|
|
287
|
-
(pure(parentResult[0] === 'error' ? parentResult : ok([...acc[1], parentResult[1]])))
|
|
288
|
-
)
|
|
289
|
-
.value
|
|
290
|
-
})
|
|
344
|
+
parentRef => (/** @type {readonly Revision[]} */ acc) =>
|
|
345
|
+
ioMapStep(resolveParent(cas)(parentRef), parent => [...acc, parent]))
|
|
291
346
|
}
|
|
292
347
|
|
|
293
348
|
/**
|
|
@@ -366,21 +421,73 @@ const computeGeneration = parents =>
|
|
|
366
421
|
parents.length === 0 ? 0 : 1 + parents.reduce((max, p) => Math.max(max, p.generation), 0)
|
|
367
422
|
|
|
368
423
|
/**
|
|
369
|
-
*
|
|
424
|
+
* The pure half of {@link addRevision}: turns already-resolved `parents` into
|
|
425
|
+
* the exact `Revision` that will be stored, or the first reason it cannot be.
|
|
370
426
|
*
|
|
371
|
-
*
|
|
372
|
-
*
|
|
373
|
-
*
|
|
374
|
-
* ({@link
|
|
375
|
-
* ({@link computeGeneration}), assemble a `Revision` and check its hash /
|
|
427
|
+
* Resolves `subject` ({@link resolveSubject}) and checks every parent belongs
|
|
428
|
+
* to it ({@link validateParentSubjects}), resolves `snapshot`
|
|
429
|
+
* ({@link resolveSnapshot}) and computes `generation`
|
|
430
|
+
* ({@link computeGeneration}), assembles the `Revision` and checks its hash /
|
|
376
431
|
* generation semantics (`fjs/media/revision` `checkReferences` — the same rule
|
|
377
|
-
* a reader applies; the shape itself is already guaranteed by
|
|
378
|
-
*
|
|
379
|
-
*
|
|
380
|
-
*
|
|
381
|
-
*
|
|
382
|
-
*
|
|
383
|
-
*
|
|
432
|
+
* a reader applies; the shape itself is already guaranteed by the field types
|
|
433
|
+
* here), then canonicalizes it.
|
|
434
|
+
*
|
|
435
|
+
* Canonicalizing parent/snapshot spellings is only safe once `checkReferences`
|
|
436
|
+
* has confirmed they decode, which makes the `unwrap` inside
|
|
437
|
+
* {@link canonicalHash} safe. It is not optional: two `add` calls describing
|
|
438
|
+
* the same logical revision but spelled differently (case, `i`/`l`/`o`
|
|
439
|
+
* aliases) must serialize identically, or they would produce two distinct CAS
|
|
440
|
+
* blobs that both remain heads — the point of `canonicalHash` (see the module
|
|
441
|
+
* doc) is defeated if this module itself writes non-canonical spellings.
|
|
442
|
+
*
|
|
443
|
+
* Separate from {@link addRevision} because none of it touches the store:
|
|
444
|
+
* everything up to the bytes is a plain `Result` pipeline, so `addRevision` is
|
|
445
|
+
* left holding only the encode, the write, and the cache fold. Each step also
|
|
446
|
+
* reads values resolved by earlier ones, which is why the guards are a flat
|
|
447
|
+
* sequence rather than an `okThen` chain — see `okThen`'s own note in
|
|
448
|
+
* [`fjs/types/result`](../../types/result/module.f.mjs).
|
|
449
|
+
*
|
|
450
|
+
* @param {RevisionData} input
|
|
451
|
+
* @returns {(parents: readonly Revision[]) => Result<Revision, string>}
|
|
452
|
+
*/
|
|
453
|
+
const buildRevision = input => parents => {
|
|
454
|
+
const subjectResult = resolveSubject(input)(parents)
|
|
455
|
+
if (subjectResult[0] === 'error') { return subjectResult }
|
|
456
|
+
const subject = subjectResult[1]
|
|
457
|
+
const parentSubjectsResult = validateParentSubjects(subject)(parents)
|
|
458
|
+
if (parentSubjectsResult[0] === 'error') { return parentSubjectsResult }
|
|
459
|
+
const snapshotResult = resolveSnapshot(input)(subject)(parents)
|
|
460
|
+
if (snapshotResult[0] === 'error') { return snapshotResult }
|
|
461
|
+
/** @type {Revision} */
|
|
462
|
+
const revision = {
|
|
463
|
+
dialect,
|
|
464
|
+
subject,
|
|
465
|
+
parents: input.parents,
|
|
466
|
+
snapshot: snapshotResult[1],
|
|
467
|
+
generation: computeGeneration(parents),
|
|
468
|
+
archived: input.archived,
|
|
469
|
+
lock: input.lock,
|
|
470
|
+
}
|
|
471
|
+
const referencesResult = checkReferences(revision)
|
|
472
|
+
if (referencesResult[0] === 'error') { return referencesResult }
|
|
473
|
+
return ok({
|
|
474
|
+
...revision,
|
|
475
|
+
parents: revision.parents.map(canonicalHash),
|
|
476
|
+
snapshot: canonicalHash(revision.snapshot),
|
|
477
|
+
lock: revision.lock === undefined ? undefined : canonicalLockField(revision.lock),
|
|
478
|
+
})
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
/**
|
|
482
|
+
* Adds a new revision to `cas` and folds it into the cache at `cacheKey`.
|
|
483
|
+
*
|
|
484
|
+
* Steps: resolve and validate every parent ({@link resolveParents}), derive
|
|
485
|
+
* the revision to store from them ({@link buildRevision}), then encode it,
|
|
486
|
+
* write it to `cas`, and fold it into the cache. Every failure — an invalid
|
|
487
|
+
* or missing parent, a cross-subject parent, an unresolvable subject or
|
|
488
|
+
* snapshot, an invalid revision, a blob too large to encode, or a store write
|
|
489
|
+
* failure — is reported as `error(message)` rather than thrown, so a caller
|
|
490
|
+
* (e.g. an MCP tool handler) can surface it without a `throw`/`catch`.
|
|
384
491
|
*
|
|
385
492
|
* `input.generation` is ignored: it exists on {@link RevisionData} only so a
|
|
386
493
|
* value read back by {@link readRevision} round-trips into `add` unchanged,
|
|
@@ -389,61 +496,43 @@ const computeGeneration = parents =>
|
|
|
389
496
|
*
|
|
390
497
|
* @template {Operation} O
|
|
391
498
|
* @param {Cas<O>} cas
|
|
392
|
-
*
|
|
499
|
+
* A rejected revision and an unreachable cache slot share one channel — see
|
|
500
|
+
* {@link Evo.add} — so every branch below answers `pureError`, and the
|
|
501
|
+
* successful path never re-tests what an earlier step already decided.
|
|
502
|
+
*
|
|
503
|
+
* The `Cas` write is the one place a host failure is *translated* rather than
|
|
504
|
+
* propagated: {@link catchStep} turns any `IoChannel` error into one
|
|
505
|
+
* {@link EvoError}, because a caller of this API has the same recourse to a
|
|
506
|
+
* full disk as to a malformed parent, and the store's own error vocabulary is
|
|
507
|
+
* not part of this contract.
|
|
508
|
+
*
|
|
509
|
+
* @returns {(cacheKey: Key<Cache>) => (input: RevisionData) => Effect<O | MemOp, Hash, EvoChannel>}
|
|
393
510
|
*/
|
|
394
511
|
export const addRevision = cas => cacheKey => input =>
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
const
|
|
399
|
-
if (
|
|
400
|
-
const
|
|
401
|
-
if (parentSubjectsResult[0] === 'error') { return pure(parentSubjectsResult) }
|
|
402
|
-
const snapshotResult = resolveSnapshot(input)(subjectResult[1])(parentsResult[1])
|
|
403
|
-
if (snapshotResult[0] === 'error') { return pure(snapshotResult) }
|
|
404
|
-
/** @type {Revision} */
|
|
405
|
-
const revision = {
|
|
406
|
-
dialect,
|
|
407
|
-
subject: subjectResult[1],
|
|
408
|
-
parents: input.parents,
|
|
409
|
-
snapshot: snapshotResult[1],
|
|
410
|
-
generation: computeGeneration(parentsResult[1]),
|
|
411
|
-
archived: input.archived,
|
|
412
|
-
lock: input.lock,
|
|
413
|
-
}
|
|
414
|
-
const referencesResult = checkReferences(revision)
|
|
415
|
-
if (referencesResult[0] === 'error') { return pure(referencesResult) }
|
|
416
|
-
// Canonicalize parent/snapshot spellings now that checkReferences has
|
|
417
|
-
// confirmed they decode (`unwrap` inside `canonicalHash` is safe):
|
|
418
|
-
// two `add` calls describing the same logical revision but spelled
|
|
419
|
-
// differently (case, `i`/`l`/`o` aliases) must serialize identically,
|
|
420
|
-
// or they'd produce two distinct CAS blobs that both remain heads —
|
|
421
|
-
// the point of `canonicalHash` (see the module doc) is defeated if
|
|
422
|
-
// this module itself writes non-canonical spellings.
|
|
423
|
-
/** @type {Revision} */
|
|
424
|
-
const canonicalRevision = {
|
|
425
|
-
...revision,
|
|
426
|
-
parents: revision.parents.map(canonicalHash),
|
|
427
|
-
snapshot: canonicalHash(revision.snapshot),
|
|
428
|
-
lock: revision.lock === undefined ? undefined : canonicalLock(revision.lock),
|
|
429
|
-
}
|
|
512
|
+
ioStep(
|
|
513
|
+
resolveParents(cas)(input.parents),
|
|
514
|
+
(/** @type {readonly Revision[]} */ parents) => {
|
|
515
|
+
const revisionResult = buildRevision(input)(parents)
|
|
516
|
+
if (revisionResult[0] === 'error') { return pureError(evoError(revisionResult[1])) }
|
|
517
|
+
const canonicalRevision = revisionResult[1]
|
|
430
518
|
const bytes = tryUtf8(encodeText(canonicalRevision))
|
|
431
519
|
if (bytes === null) {
|
|
432
|
-
return
|
|
520
|
+
return pureError(evoError('revision too large to encode'))
|
|
433
521
|
}
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
522
|
+
// Annotated so the payload's operation set infers as `never`: the
|
|
523
|
+
// list is built from `pure` cells and requests no commands of its
|
|
524
|
+
// own, which `cas.write`'s `O1` has nothing else to pin it to.
|
|
525
|
+
/** @type {Effect<O, Vec, EvoError>} */
|
|
526
|
+
const written = catchStep(
|
|
527
|
+
cas.write((nonEmpty(bytes, elEmpty()))),
|
|
528
|
+
() => pureError(evoError('failed to write revision to CAS')))
|
|
529
|
+
return ioStep(
|
|
530
|
+
written,
|
|
531
|
+
(/** @type {Vec} */ writtenHash) => {
|
|
532
|
+
const hash = vecToCBase32(writtenHash)
|
|
533
|
+
return ioMapStep(foldIntoCache(cacheKey)(hash)(canonicalRevision), () => hash)
|
|
443
534
|
})
|
|
444
|
-
.value
|
|
445
535
|
})
|
|
446
|
-
.value
|
|
447
536
|
|
|
448
537
|
/**
|
|
449
538
|
* Projects a decoded `Revision` into the shared {@link RevisionData}
|
|
@@ -463,7 +552,7 @@ const toRevisionData = ({ subject, parents, snapshot, generation, archived, lock
|
|
|
463
552
|
snapshot: canonicalHash(snapshot),
|
|
464
553
|
generation,
|
|
465
554
|
archived,
|
|
466
|
-
lock: lock === undefined ? undefined :
|
|
555
|
+
lock: lock === undefined ? undefined : canonicalLockField(lock),
|
|
467
556
|
})
|
|
468
557
|
|
|
469
558
|
/**
|
|
@@ -490,17 +579,17 @@ const toRevisionData = ({ subject, parents, snapshot, generation, archived, lock
|
|
|
490
579
|
* how far it got; recovering that difference would mean folding the chunk
|
|
491
580
|
* stream here instead of reusing `collectRead`, for a distinction no client
|
|
492
581
|
* can act on differently.
|
|
493
|
-
* @type {(hash: Hash) => (result: IoResult<Vec>) => Result<RevisionData,
|
|
582
|
+
* @type {(hash: Hash) => (result: IoResult<Vec>) => Result<RevisionData, EvoError>}
|
|
494
583
|
*/
|
|
495
584
|
const decodeReadRevision = hash => ([tag, value]) => {
|
|
496
585
|
if (tag === 'error') {
|
|
497
|
-
return error(isNotFound(value)
|
|
586
|
+
return error(evoError(isNotFound(value)
|
|
498
587
|
? `revision not found: ${hash}`
|
|
499
|
-
: `failed to read revision: ${hash}`)
|
|
588
|
+
: `failed to read revision: ${hash}`))
|
|
500
589
|
}
|
|
501
590
|
const revision = decodeRevisionVec(value)
|
|
502
591
|
return revision === null
|
|
503
|
-
? error(`not a revision blob: ${hash}`)
|
|
592
|
+
? error(evoError(`not a revision blob: ${hash}`))
|
|
504
593
|
: ok(toRevisionData(revision))
|
|
505
594
|
}
|
|
506
595
|
|
|
@@ -519,15 +608,13 @@ const decodeReadRevision = hash => ([tag, value]) => {
|
|
|
519
608
|
*
|
|
520
609
|
* @template {Operation} O
|
|
521
610
|
* @param {Cas<O>} cas
|
|
522
|
-
* @returns {(hash: Hash) => Effect<O,
|
|
611
|
+
* @returns {(hash: Hash) => Effect<O, RevisionData, EvoError>}
|
|
523
612
|
*/
|
|
524
613
|
export const readRevision = cas => hash => {
|
|
525
614
|
const hashVec = cBase32ToVec(hash)
|
|
526
615
|
return hashVec === null
|
|
527
|
-
?
|
|
528
|
-
:
|
|
529
|
-
.map(decodeReadRevision(hash))
|
|
530
|
-
.value
|
|
616
|
+
? pureError(evoError(`invalid hash: ${hash}`))
|
|
617
|
+
: resultMapStep(collectRead(cas.read(hashVec)), decodeReadRevision(hash))
|
|
531
618
|
}
|
|
532
619
|
|
|
533
620
|
/**
|
|
@@ -540,17 +627,15 @@ export const readRevision = cas => hash => {
|
|
|
540
627
|
export const evo = cas => cacheKey => ({
|
|
541
628
|
list: archived => {
|
|
542
629
|
const listed = subjectListed(archived)
|
|
543
|
-
return
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
630
|
+
return ioMapStep(
|
|
631
|
+
read(cacheKey),
|
|
632
|
+
cache => definedEntries(cache.bySubject)
|
|
633
|
+
.flatMap(([subject, state]) => listed(state) ? [subject] : []))
|
|
547
634
|
},
|
|
548
|
-
head: subject =>
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
})
|
|
553
|
-
.value,
|
|
635
|
+
head: subject => ioMapStep(read(cacheKey), cache => {
|
|
636
|
+
const state = at(subject)(cache.bySubject)
|
|
637
|
+
return state === null ? [] : headsOf(state)
|
|
638
|
+
}),
|
|
554
639
|
add: input => addRevision(cas)(cacheKey)(input),
|
|
555
640
|
revision: readRevision(cas),
|
|
556
641
|
})
|
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @import { Cas } from '../types.ts'
|
|
3
|
+
* @import { EvoChannel } from './types.ts'
|
|
4
|
+
* @import { Result } from '../../types/result/types.ts'
|
|
5
|
+
* @import { Effect } from '../../effects/types.ts'
|
|
6
|
+
* @import { IoChannel, NodeOp } from '../../effects/node/types.ts'
|
|
7
|
+
* @import { State } from '../../effects/node/virtual/types.ts'
|
|
3
8
|
* @import { Vec } from '../../types/bit_vec/types.ts'
|
|
4
9
|
* @import { Ok } from '../../types/result/types.ts'
|
|
5
|
-
* @import { IoResult } from '../../effects/node/types.ts'
|
|
6
10
|
* @import { List } from '../../effects/list/types.ts'
|
|
7
11
|
* @import { RevisionData } from './types.ts'
|
|
8
12
|
*/
|
|
@@ -44,9 +48,14 @@ export declare const proof: {
|
|
|
44
48
|
revisionCanonicalizesReferenceSpellings: () => void;
|
|
45
49
|
revisionRoundTripsThroughAdd: () => void;
|
|
46
50
|
revisionLockRoundTripsAndCanonicalizes: () => void;
|
|
51
|
+
revisionSharedLockReferenceRoundTripsAndCanonicalizes: () => void;
|
|
52
|
+
revisionInvalidSharedLockReferenceIsRejected: () => void;
|
|
53
|
+
revisionNestedLockRoundTripsAndCanonicalizes: () => void;
|
|
54
|
+
revisionInvalidNestedLockValueIsRejected: () => void;
|
|
47
55
|
revisionAbsentAndEmptyLocksRemainDistinct: () => void;
|
|
48
56
|
revisionInvalidLockValueIsRejected: () => void;
|
|
49
57
|
equivalentLockOrdersReuseOneCasAddress: () => void;
|
|
58
|
+
equivalentNestedLockOrdersReuseOneCasAddress: () => void;
|
|
50
59
|
syncRevisionFoldsValidRevisionIntoCache: () => void;
|
|
51
60
|
syncRevisionIgnoresNonRevisionContent: () => void;
|
|
52
61
|
evoHeadUnknownSubjectIsEmpty: () => void;
|