functionalscript 0.36.0 → 0.38.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 +1 -1
- package/{fs → fjs}/asn.1/module.f.js +1 -1
- package/{fs → fjs}/asn.1/proof.f.js +32 -94
- package/fjs/asserts/module.f.d.ts +36 -0
- package/fjs/asserts/module.f.js +39 -0
- package/fjs/asserts/proof.f.d.ts +11 -0
- package/fjs/asserts/proof.f.js +18 -0
- package/{fs → fjs}/base_n/module.f.js +3 -3
- package/{fs → fjs}/base_n/proof.f.js +15 -39
- package/{fs → fjs/basen}/base128/module.f.d.ts +1 -1
- package/{fs → fjs/basen}/base128/module.f.js +1 -1
- package/{fs → fjs/basen}/base128/proof.f.js +3 -3
- package/{fs → fjs/basen}/base64/module.f.d.ts +2 -2
- package/{fs → fjs/basen}/base64/module.f.js +25 -15
- package/{fs → fjs/basen}/base64/proof.f.d.ts +2 -0
- package/{fs → fjs/basen}/base64/proof.f.js +26 -6
- package/{fs → fjs/basen}/cbase32/module.f.d.ts +2 -2
- package/{fs → fjs/basen}/cbase32/module.f.js +2 -2
- package/{fs → fjs/basen}/cbase32/proof.f.js +16 -43
- package/fjs/bnf/data/module.f.d.ts +52 -0
- package/{fs → fjs}/bnf/data/module.f.js +56 -6
- package/{fs → fjs}/bnf/data/proof.f.d.ts +1 -0
- package/{fs → fjs}/bnf/data/proof.f.js +59 -24
- package/{fs → fjs}/bnf/descent/module.f.d.ts +4 -14
- package/fjs/bnf/descent/module.f.js +124 -0
- package/{fs → fjs}/bnf/descent/proof.f.d.ts +1 -0
- package/{fs → fjs}/bnf/descent/proof.f.js +59 -28
- package/{fs → fjs}/bnf/ll1/module.f.d.ts +4 -4
- package/{fs → fjs}/bnf/ll1/module.f.js +15 -13
- package/{fs → fjs}/bnf/ll1/proof.f.d.ts +1 -0
- package/{fs → fjs}/bnf/ll1/proof.f.js +33 -16
- package/{fs → fjs}/bnf/module.f.d.ts +19 -5
- package/{fs → fjs}/bnf/module.f.js +14 -15
- package/fjs/bnf/proof.f.js +69 -0
- package/{fs → fjs}/bnf/testlib.f.js +2 -2
- package/{fs → fjs}/cas/cli/module.f.js +7 -7
- package/{fs → fjs}/cas/cli/proof.f.d.ts +4 -1
- package/{fs → fjs}/cas/cli/proof.f.js +37 -74
- package/fjs/cas/evo/mcp/module.f.d.ts +19 -0
- package/fjs/cas/evo/mcp/module.f.js +56 -0
- package/fjs/cas/evo/mcp/proof.f.d.ts +9 -0
- package/fjs/cas/evo/mcp/proof.f.js +95 -0
- package/fjs/cas/evo/module.f.d.ts +138 -0
- package/fjs/cas/evo/module.f.js +309 -0
- package/fjs/cas/evo/proof.f.d.ts +32 -0
- package/fjs/cas/evo/proof.f.js +453 -0
- package/fjs/cas/mcp/module.f.d.ts +49 -0
- package/fjs/cas/mcp/module.f.js +267 -0
- package/{fs → fjs}/cas/mcp/proof.f.d.ts +7 -2
- package/{fs → fjs}/cas/mcp/proof.f.js +116 -60
- package/{fs → fjs}/cas/module.f.d.ts +10 -0
- package/{fs → fjs}/cas/module.f.js +36 -10
- package/{fs → fjs}/cas/proof.f.d.ts +8 -2
- package/{fs → fjs}/cas/proof.f.js +85 -94
- package/{fs → fjs}/ci/bun/module.f.js +2 -2
- package/{fs → fjs}/ci/common/module.f.d.ts +2 -2
- package/{fs → fjs}/ci/common/module.f.js +4 -4
- package/fjs/ci/config/module.f.d.ts +42 -0
- package/{fs → fjs}/ci/config/module.f.js +6 -8
- package/fjs/ci/deno/module.f.js +20 -0
- package/{fs → fjs}/ci/module.f.js +9 -9
- package/{fs → fjs}/ci/node/module.f.d.ts +1 -1
- package/{fs → fjs}/ci/node/module.f.js +3 -5
- package/{fs → fjs}/ci/playwright/module.f.js +3 -3
- package/{fs → fjs}/ci/proof.f.js +27 -22
- package/{fs → fjs}/ci/rust/module.f.js +11 -3
- package/{fs → fjs}/cli/module.f.js +3 -3
- package/{fs → fjs}/cli/proof.f.js +25 -66
- package/{fs/types → fjs/common}/monoid/module.f.d.ts +1 -1
- package/{fs/types → fjs/common}/monoid/proof.f.js +4 -9
- package/{fs → fjs}/crypto/hmac/module.f.js +2 -2
- package/{fs → fjs}/crypto/hmac/proof.f.js +9 -17
- package/{fs → fjs}/crypto/pow/module.f.js +3 -3
- package/fjs/crypto/pow/proof.f.js +111 -0
- package/{fs → fjs}/crypto/secp/module.f.js +2 -2
- package/{fs → fjs}/crypto/secp/proof.f.js +14 -35
- package/{fs → fjs}/crypto/sha2/module.f.js +2 -2
- package/{fs → fjs}/crypto/sha2/proof.f.js +23 -54
- package/{fs → fjs}/crypto/sign/module.f.d.ts +0 -5
- package/{fs → fjs}/crypto/sign/module.f.js +11 -8
- package/{fs → fjs}/crypto/sign/proof.f.js +36 -105
- package/{fs → fjs}/crypto/vdf/module.f.js +1 -1
- package/{fs → fjs}/crypto/vdf/proof.f.js +23 -64
- package/{fs → fjs}/dev/module.f.js +6 -6
- package/{fs → fjs}/dev/package_json/module.f.js +6 -6
- package/{fs → fjs}/dev/package_json/proof.f.js +9 -9
- package/{fs → fjs}/dev/proof.f.js +3 -5
- package/{fs → fjs}/djs/ast/module.f.js +2 -2
- package/{fs → fjs}/djs/ast/proof.f.js +8 -16
- package/fjs/djs/examples/m.f.d.ts +2 -0
- package/{fs → fjs}/djs/module.f.d.ts +1 -1
- package/{fs → fjs}/djs/module.f.js +5 -5
- package/{fs → fjs}/djs/parser/module.f.d.ts +5 -0
- package/{fs → fjs}/djs/parser/module.f.js +24 -4
- package/{fs → fjs}/djs/parser/proof.f.js +145 -407
- package/{fs → fjs}/djs/proof.f.js +16 -39
- package/{fs → fjs}/djs/serializer/module.f.js +6 -6
- package/{fs → fjs}/djs/serializer/proof.f.js +18 -43
- package/fjs/djs/tokenizer/module.f.d.ts +24 -0
- package/fjs/djs/tokenizer/module.f.js +472 -0
- package/{fs/djs/tokenizer-new → fjs/djs/tokenizer}/proof.f.d.ts +4 -3
- package/{fs/djs/tokenizer-new → fjs/djs/tokenizer}/proof.f.js +447 -446
- package/{fs → fjs}/djs/transpiler/module.f.d.ts +5 -0
- package/{fs → fjs}/djs/transpiler/module.f.js +21 -11
- package/{fs → fjs}/djs/transpiler/proof.f.d.ts +3 -0
- package/fjs/djs/transpiler/proof.f.js +67 -0
- package/{fs → fjs}/effects/memory/module.f.js +4 -4
- package/{fs → fjs}/effects/memory/proof.f.js +11 -24
- package/{fs → fjs}/effects/module.f.js +1 -1
- package/{fs → fjs}/effects/node/memory/module.js +2 -2
- package/{fs → fjs}/effects/node/memory/proof.js +8 -15
- package/{fs → fjs}/effects/node/module.d.ts +1 -1
- package/{fs → fjs}/effects/node/module.f.d.ts +1 -1
- package/{fs → fjs}/effects/node/module.f.js +7 -7
- package/{fs → fjs}/effects/node/module.js +13 -13
- package/{fs → fjs}/effects/node/proof.f.d.ts +1 -0
- package/{fs → fjs}/effects/node/proof.f.js +106 -292
- package/{fs → fjs}/effects/node/virtual/module.f.js +7 -7
- package/{fs → fjs}/effects/node/virtual/proof.f.d.ts +2 -0
- package/{fs → fjs}/effects/node/virtual/proof.f.js +44 -30
- package/{fs → fjs}/effects/proof.f.js +18 -47
- package/fjs/emergent_testing/all.test.js +4 -0
- package/{fs → fjs}/emergent_testing/example.f.d.ts +1 -1
- package/{fs → fjs}/emergent_testing/module.f.js +6 -6
- package/{fs → fjs}/emergent_testing/proof.f.d.ts +19 -17
- package/{fs → fjs}/emergent_testing/proof.f.js +14 -14
- package/fjs/emergent_testing/scenarios/all.js +1 -0
- package/{fs → fjs}/fsc/bnf.f.js +2 -2
- package/{fs → fjs}/fsc/json.f.js +1 -1
- package/{fs → fjs}/fsc/module.f.js +7 -7
- package/{fs → fjs}/fsc/proof.f.js +16 -38
- package/{fs → fjs}/fsm/module.f.js +9 -9
- package/{fs → fjs}/fsm/proof.f.js +12 -19
- package/{fs → fjs}/js/tokenizer/module.f.js +7 -7
- package/{fs → fjs}/js/tokenizer/proof.f.js +5 -5
- package/{fs → fjs}/mcp/module.f.d.ts +20 -13
- package/{fs → fjs}/mcp/module.f.js +16 -9
- package/{fs → fjs}/mcp/proof.f.js +17 -17
- package/{fs → fjs}/mcp/stdio/module.f.d.ts +4 -4
- package/{fs → fjs}/mcp/stdio/module.f.js +12 -12
- package/{fs → fjs}/mcp/stdio/proof.f.js +10 -10
- package/{fs → fjs/media}/html/module.f.d.ts +3 -3
- package/{fs → fjs/media}/html/module.f.js +9 -9
- package/{fs → fjs/media}/html/proof.f.js +12 -33
- package/fjs/media/json/module.f.d.ts +50 -0
- package/{fs → fjs/media}/json/module.f.js +7 -7
- package/{fs → fjs/media}/json/parser/module.f.d.ts +7 -2
- package/{fs → fjs/media}/json/parser/module.f.js +21 -7
- package/{fs → fjs/media}/json/parser/proof.f.js +45 -120
- package/{fs → fjs/media}/json/proof.f.js +4 -4
- package/fjs/media/json/rpc/module.f.d.ts +114 -0
- package/{fs → fjs/media}/json/rpc/module.f.js +4 -4
- package/{fs → fjs/media}/json/rpc/proof.f.js +4 -4
- package/fjs/media/json/schema/module.f.d.ts +78 -0
- package/{fs → fjs/media}/json/schema/module.f.js +25 -41
- package/{fs → fjs/media}/json/schema/proof.f.js +6 -9
- package/{fs → fjs/media}/json/serializer/module.f.d.ts +1 -1
- package/{fs → fjs/media}/json/serializer/module.f.js +2 -2
- package/{fs → fjs/media}/json/serializer/proof.f.js +12 -29
- package/{fs → fjs/media}/json/tokenizer/module.f.d.ts +2 -2
- package/{fs → fjs/media}/json/tokenizer/module.f.js +4 -4
- package/{fs → fjs/media}/json/tokenizer/proof.f.js +5 -5
- package/fjs/media/module.f.d.ts +37 -0
- package/fjs/media/module.f.js +23 -0
- package/fjs/media/proof.f.d.ts +9 -0
- package/fjs/media/proof.f.js +58 -0
- package/fjs/media/revision/module.f.d.ts +78 -0
- package/fjs/media/revision/module.f.js +122 -0
- package/fjs/media/revision/proof.f.d.ts +31 -0
- package/fjs/media/revision/proof.f.js +140 -0
- package/{fs/mime → fjs/media/type}/module.f.d.ts +6 -6
- package/{fs/mime → fjs/media/type}/module.f.js +6 -6
- package/{fs/mime → fjs/media/type}/proof.f.js +8 -12
- package/fjs/module.f.d.ts +2 -0
- package/{fs/fjs → fjs}/module.f.js +9 -9
- package/fjs/module.js +4 -0
- package/{fs → fjs}/path/module.f.js +2 -2
- package/{fs → fjs}/path/proof.f.js +27 -78
- package/{fs/fjs → fjs}/proof.f.js +6 -4
- package/{fs → fjs}/sul/id/module.f.js +9 -9
- package/{fs → fjs}/sul/id/proof.f.js +12 -26
- package/{fs → fjs}/sul/level/hash/module.f.js +3 -3
- package/{fs → fjs}/sul/level/hash/proof.f.js +8 -8
- package/{fs → fjs}/sul/level/literal/module.f.js +5 -5
- package/{fs → fjs}/sul/level/literal/proof.f.js +15 -29
- package/{fs → fjs}/sul/module.f.js +3 -3
- package/{fs → fjs}/sul/proof.f.js +3 -3
- package/fjs/text/ascii/proof.f.d.ts +6 -0
- package/fjs/text/ascii/proof.f.js +14 -0
- package/{fs → fjs}/text/code_point/module.f.js +12 -12
- package/{fs → fjs}/text/code_point/proof.f.js +1 -1
- package/{fs → fjs}/text/module.f.js +5 -5
- package/{fs → fjs}/text/proof.f.js +7 -12
- package/{fs → fjs}/text/sgr/module.f.js +2 -2
- package/{fs → fjs}/text/sgr/proof.f.js +8 -17
- package/{fs → fjs}/text/utf16/module.f.js +6 -6
- package/{fs → fjs}/text/utf16/proof.f.js +27 -70
- package/{fs → fjs}/text/utf8/module.f.js +22 -17
- package/{fs → fjs}/text/utf8/proof.f.js +59 -128
- package/{fs → fjs}/types/array/module.f.js +1 -1
- package/{fs → fjs}/types/array/proof.f.js +21 -55
- package/{fs → fjs}/types/bigfloat/module.f.js +1 -1
- package/fjs/types/bigfloat/proof.f.js +217 -0
- package/{fs → fjs}/types/bigint/module.f.js +2 -2
- package/{fs → fjs}/types/bigint/proof.f.js +51 -147
- package/{fs → fjs}/types/bit_vec/module.f.js +8 -8
- package/{fs → fjs}/types/bit_vec/proof.f.js +76 -218
- package/{fs → fjs}/types/btree/find/module.f.js +1 -1
- package/fjs/types/btree/find/proof.f.d.ts +3 -0
- package/fjs/types/btree/find/proof.f.js +108 -0
- package/{fs → fjs}/types/btree/module.f.js +2 -2
- package/fjs/types/btree/proof.f.d.ts +13 -0
- package/{fs → fjs}/types/btree/proof.f.js +12 -19
- package/{fs → fjs}/types/btree/remove/module.f.js +4 -4
- package/fjs/types/btree/remove/proof.f.d.ts +9 -0
- package/{fs → fjs}/types/btree/remove/proof.f.js +88 -235
- package/{fs → fjs}/types/btree/set/module.f.js +8 -5
- package/{fs → fjs}/types/btree/set/proof.f.js +39 -28
- package/{fs → fjs}/types/byte_set/module.f.js +2 -2
- package/fjs/types/byte_set/proof.f.js +79 -0
- package/{fs → fjs}/types/function/compare/proof.f.js +14 -37
- package/fjs/types/function/operator/proof.f.d.ts +23 -0
- package/{fs → fjs}/types/function/operator/proof.f.js +18 -49
- package/{fs → fjs}/types/function/proof.f.js +3 -4
- package/{fs → fjs}/types/list/module.f.js +2 -2
- package/fjs/types/list/proof.f.d.ts +30 -0
- package/{fs → fjs}/types/list/proof.f.js +59 -167
- package/{fs → fjs}/types/map/proof.f.js +6 -14
- package/fjs/types/nibble_set/proof.f.js +60 -0
- package/{fs → fjs}/types/nominal/proof.f.js +5 -10
- package/{fs → fjs}/types/nullable/module.f.js +2 -2
- package/fjs/types/nullable/proof.f.js +29 -0
- package/{fs → fjs}/types/number/module.f.js +5 -5
- package/{fs → fjs}/types/number/proof.f.js +10 -25
- package/{fs → fjs}/types/object/module.f.js +4 -4
- package/{fs → fjs}/types/object/proof.f.js +4 -7
- package/{fs → fjs}/types/ordered_map/module.f.js +6 -6
- package/{fs → fjs}/types/ordered_map/proof.f.js +3 -3
- package/fjs/types/patricia_trie/proof.f.d.ts +13 -0
- package/{fs → fjs}/types/patricia_trie/proof.f.js +22 -22
- package/{fs → fjs}/types/prime_field/module.f.js +3 -8
- package/{fs → fjs}/types/prime_field/proof.f.js +2 -2
- package/{fs → fjs}/types/range/module.f.d.ts +1 -1
- package/fjs/types/range/module.f.js +2 -0
- package/fjs/types/range/proof.f.js +9 -0
- package/{fs → fjs}/types/range_map/module.f.js +4 -4
- package/{fs → fjs}/types/range_map/proof.f.js +35 -88
- package/{fs → fjs}/types/result/module.js +1 -1
- package/fjs/types/result/proof.f.d.ts +12 -0
- package/fjs/types/result/proof.f.js +31 -0
- package/{fs → fjs}/types/rtti/common/module.f.d.ts +36 -1
- package/{fs → fjs}/types/rtti/common/module.f.js +48 -4
- package/fjs/types/rtti/common/proof.f.d.ts +8 -0
- package/fjs/types/rtti/common/proof.f.js +51 -0
- package/{fs → fjs}/types/rtti/module.f.d.ts +2 -2
- package/{fs → fjs}/types/rtti/module.f.js +1 -1
- package/{fs → fjs}/types/rtti/parse/module.f.js +16 -25
- package/{fs → fjs}/types/rtti/parse/proof.f.js +9 -20
- package/{fs → fjs}/types/rtti/ts/module.f.d.ts +10 -4
- package/{fs → fjs}/types/rtti/ts/module.f.js +1 -1
- package/{fs → fjs}/types/rtti/ts/proof.f.js +2 -2
- package/{fs → fjs}/types/rtti/validate/module.f.js +11 -32
- package/{fs → fjs}/types/rtti/validate/proof.f.js +6 -11
- package/{fs → fjs}/types/sorted_list/module.f.js +3 -3
- package/{fs → fjs}/types/sorted_list/proof.f.js +14 -27
- package/{fs → fjs}/types/sorted_set/module.f.js +1 -1
- package/{fs → fjs}/types/sorted_set/proof.f.js +20 -45
- package/{fs → fjs}/types/string/module.f.js +4 -4
- package/fjs/types/string/proof.f.js +77 -0
- package/{fs → fjs}/types/string_set/module.f.js +6 -6
- package/fjs/types/string_set/proof.f.js +43 -0
- package/{fs → fjs}/types/ts/proof.f.d.ts +18 -18
- package/{fs → fjs}/types/ts/proof.f.js +16 -43
- package/{fs → fjs}/types/uint8array/module.f.js +10 -10
- package/{fs → fjs}/types/uint8array/proof.f.d.ts +4 -1
- package/{fs → fjs}/types/uint8array/proof.f.js +11 -11
- package/{fs → fjs}/website/module.f.js +3 -3
- package/fjs/website/proof.f.js +13 -0
- package/package.json +8 -8
- package/fs/asserts/module.f.d.ts +0 -4
- package/fs/asserts/module.f.js +0 -9
- package/fs/asserts/proof.f.d.ts +0 -8
- package/fs/asserts/proof.f.js +0 -51
- package/fs/bnf/data/module.f.d.ts +0 -30
- package/fs/bnf/descent/module.f.js +0 -119
- package/fs/bnf/proof.f.js +0 -104
- package/fs/cas/mcp/module.f.d.ts +0 -36
- package/fs/cas/mcp/module.f.js +0 -249
- package/fs/ci/config/module.f.d.ts +0 -43
- package/fs/ci/deno/module.f.js +0 -16
- package/fs/crypto/pow/proof.f.js +0 -161
- package/fs/djs/examples/m.f.d.ts +0 -2
- package/fs/djs/tokenizer/module.f.d.ts +0 -12
- package/fs/djs/tokenizer/module.f.js +0 -62
- package/fs/djs/tokenizer/proof.f.d.ts +0 -7
- package/fs/djs/tokenizer/proof.f.js +0 -543
- package/fs/djs/tokenizer-new/module.f.d.ts +0 -3
- package/fs/djs/tokenizer-new/module.f.js +0 -155
- package/fs/djs/transpiler/proof.f.js +0 -68
- package/fs/emergent_testing/all.test.js +0 -4
- package/fs/emergent_testing/scenarios/all.js +0 -1
- package/fs/fjs/module.f.d.ts +0 -2
- package/fs/fjs/module.js +0 -4
- package/fs/json/module.f.d.ts +0 -50
- package/fs/json/rpc/module.f.d.ts +0 -114
- package/fs/json/schema/module.f.d.ts +0 -77
- package/fs/text/ascii/proof.f.d.ts +0 -4
- package/fs/text/ascii/proof.f.js +0 -24
- package/fs/types/bigfloat/proof.f.js +0 -348
- package/fs/types/btree/find/proof.f.js +0 -151
- package/fs/types/btree/proof.f.d.ts +0 -7
- package/fs/types/btree/remove/proof.f.d.ts +0 -4
- package/fs/types/byte_set/proof.f.js +0 -120
- package/fs/types/function/operator/proof.f.d.ts +0 -12
- package/fs/types/list/proof.f.d.ts +0 -22
- package/fs/types/nibble_set/proof.f.js +0 -89
- package/fs/types/nullable/proof.f.js +0 -50
- package/fs/types/patricia_trie/proof.f.d.ts +0 -7
- package/fs/types/range/module.f.js +0 -2
- package/fs/types/range/proof.f.d.ts +0 -1
- package/fs/types/range/proof.f.js +0 -18
- package/fs/types/result/proof.f.d.ts +0 -6
- package/fs/types/result/proof.f.js +0 -52
- package/fs/types/string/proof.f.js +0 -118
- package/fs/types/string_set/proof.f.js +0 -82
- package/fs/website/proof.f.js +0 -16
- /package/{fs → fjs}/asn.1/module.f.d.ts +0 -0
- /package/{fs → fjs}/asn.1/proof.f.d.ts +0 -0
- /package/{fs → fjs}/base_n/module.f.d.ts +0 -0
- /package/{fs → fjs}/base_n/proof.f.d.ts +0 -0
- /package/{fs → fjs/basen}/base128/proof.f.d.ts +0 -0
- /package/{fs → fjs/basen}/cbase32/proof.f.d.ts +0 -0
- /package/{fs → fjs}/bnf/proof.f.d.ts +0 -0
- /package/{fs → fjs}/bnf/testlib.f.d.ts +0 -0
- /package/{fs → fjs}/cas/cli/module.f.d.ts +0 -0
- /package/{fs → fjs}/ci/bun/module.f.d.ts +0 -0
- /package/{fs → fjs}/ci/deno/module.f.d.ts +0 -0
- /package/{fs → fjs}/ci/module.f.d.ts +0 -0
- /package/{fs → fjs}/ci/playwright/module.f.d.ts +0 -0
- /package/{fs → fjs}/ci/proof.f.d.ts +0 -0
- /package/{fs → fjs}/ci/rust/module.f.d.ts +0 -0
- /package/{fs → fjs}/cli/module.f.d.ts +0 -0
- /package/{fs → fjs}/cli/proof.f.d.ts +0 -0
- /package/{fs/types → fjs/common}/monoid/module.f.js +0 -0
- /package/{fs/types → fjs/common}/monoid/proof.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/hmac/module.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/hmac/proof.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/pow/module.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/pow/proof.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/secp/module.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/secp/proof.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/sha2/module.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/sha2/proof.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/sign/proof.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/vdf/module.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/vdf/proof.f.d.ts +0 -0
- /package/{fs → fjs}/dev/module.f.d.ts +0 -0
- /package/{fs → fjs}/dev/package_json/module.f.d.ts +0 -0
- /package/{fs → fjs}/dev/package_json/proof.f.d.ts +0 -0
- /package/{fs → fjs}/dev/proof.f.d.ts +0 -0
- /package/{fs → fjs}/djs/ast/module.f.d.ts +0 -0
- /package/{fs → fjs}/djs/ast/proof.f.d.ts +0 -0
- /package/{fs → fjs}/djs/examples/input.f.d.ts +0 -0
- /package/{fs → fjs}/djs/examples/input.f.js +0 -0
- /package/{fs → fjs}/djs/examples/m.f.js +0 -0
- /package/{fs → fjs}/djs/parser/proof.f.d.ts +0 -0
- /package/{fs → fjs}/djs/proof.f.d.ts +0 -0
- /package/{fs → fjs}/djs/serializer/module.f.d.ts +0 -0
- /package/{fs → fjs}/djs/serializer/proof.f.d.ts +0 -0
- /package/{fs → fjs}/effects/list/module.f.d.ts +0 -0
- /package/{fs → fjs}/effects/list/module.f.js +0 -0
- /package/{fs → fjs}/effects/memory/module.f.d.ts +0 -0
- /package/{fs → fjs}/effects/memory/proof.f.d.ts +0 -0
- /package/{fs → fjs}/effects/mock/module.f.d.ts +0 -0
- /package/{fs → fjs}/effects/mock/module.f.js +0 -0
- /package/{fs → fjs}/effects/module.d.ts +0 -0
- /package/{fs → fjs}/effects/module.f.d.ts +0 -0
- /package/{fs → fjs}/effects/module.js +0 -0
- /package/{fs → fjs}/effects/node/memory/module.d.ts +0 -0
- /package/{fs → fjs}/effects/node/memory/proof.d.ts +0 -0
- /package/{fs → fjs}/effects/node/virtual/module.f.d.ts +0 -0
- /package/{fs → fjs}/effects/proof.f.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/all.test.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/example.f.js +0 -0
- /package/{fs → fjs}/emergent_testing/module.f.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/all.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.fail.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.fail.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.pass.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.pass.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async.fail.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async.fail.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async.pass.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async.pass.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/fail.fail.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/fail.fail.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/return-value.pass.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/return-value.pass.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/thenable.pass.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/thenable.pass.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/thenable2.pass.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/thenable2.pass.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/throw.pass.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/throw.pass.js +0 -0
- /package/{fs → fjs}/fsc/bnf.f.d.ts +0 -0
- /package/{fs → fjs}/fsc/json.f.d.ts +0 -0
- /package/{fs → fjs}/fsc/module.f.d.ts +0 -0
- /package/{fs → fjs}/fsc/proof.f.d.ts +0 -0
- /package/{fs → fjs}/fsm/module.f.d.ts +0 -0
- /package/{fs → fjs}/fsm/proof.f.d.ts +0 -0
- /package/{fs → fjs}/js/tokenizer/module.f.d.ts +0 -0
- /package/{fs → fjs}/js/tokenizer/proof.f.d.ts +0 -0
- /package/{fs → fjs}/mcp/proof.f.d.ts +0 -0
- /package/{fs → fjs}/mcp/stdio/proof.f.d.ts +0 -0
- /package/{fs → fjs/media}/html/proof.f.d.ts +0 -0
- /package/{fs → fjs/media}/json/parser/proof.f.d.ts +0 -0
- /package/{fs → fjs/media}/json/proof.f.d.ts +0 -0
- /package/{fs → fjs/media}/json/rpc/proof.f.d.ts +0 -0
- /package/{fs → fjs/media}/json/schema/proof.f.d.ts +0 -0
- /package/{fs → fjs/media}/json/serializer/proof.f.d.ts +0 -0
- /package/{fs → fjs/media}/json/tokenizer/proof.f.d.ts +0 -0
- /package/{fs/mime → fjs/media/type}/proof.f.d.ts +0 -0
- /package/{fs/fjs → fjs}/module.d.ts +0 -0
- /package/{fs → fjs}/path/module.f.d.ts +0 -0
- /package/{fs → fjs}/path/proof.f.d.ts +0 -0
- /package/{fs/fjs → fjs}/proof.f.d.ts +0 -0
- /package/{fs → fjs}/sul/id/module.f.d.ts +0 -0
- /package/{fs → fjs}/sul/id/proof.f.d.ts +0 -0
- /package/{fs → fjs}/sul/level/hash/module.f.d.ts +0 -0
- /package/{fs → fjs}/sul/level/hash/proof.f.d.ts +0 -0
- /package/{fs → fjs}/sul/level/literal/module.f.d.ts +0 -0
- /package/{fs → fjs}/sul/level/literal/proof.f.d.ts +0 -0
- /package/{fs → fjs}/sul/module.f.d.ts +0 -0
- /package/{fs → fjs}/sul/proof.f.d.ts +0 -0
- /package/{fs → fjs}/text/ascii/module.f.d.ts +0 -0
- /package/{fs → fjs}/text/ascii/module.f.js +0 -0
- /package/{fs → fjs}/text/code_point/module.f.d.ts +0 -0
- /package/{fs → fjs}/text/code_point/proof.f.d.ts +0 -0
- /package/{fs → fjs}/text/module.f.d.ts +0 -0
- /package/{fs → fjs}/text/proof.f.d.ts +0 -0
- /package/{fs → fjs}/text/sgr/module.f.d.ts +0 -0
- /package/{fs → fjs}/text/sgr/proof.f.d.ts +0 -0
- /package/{fs → fjs}/text/utf16/module.f.d.ts +0 -0
- /package/{fs → fjs}/text/utf16/proof.f.d.ts +0 -0
- /package/{fs → fjs}/text/utf8/module.f.d.ts +0 -0
- /package/{fs → fjs}/text/utf8/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/array/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/array/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/bigfloat/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/bigfloat/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/bigint/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/bigint/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/bit_vec/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/bit_vec/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/find/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/remove/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/set/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/set/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/types/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/types/module.f.js +0 -0
- /package/{fs → fjs}/types/byte_set/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/byte_set/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/function/compare/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/function/compare/module.f.js +0 -0
- /package/{fs/types/btree/find → fjs/types/function/compare}/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/function/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/function/module.f.js +0 -0
- /package/{fs → fjs}/types/function/operator/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/function/operator/module.f.js +0 -0
- /package/{fs/types/function/compare → fjs/types/function}/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/list/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/map/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/map/module.f.js +0 -0
- /package/{fs → fjs}/types/map/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/nibble_set/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/nibble_set/module.f.js +0 -0
- /package/{fs → fjs}/types/nibble_set/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/nominal/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/nominal/module.f.js +0 -0
- /package/{fs → fjs}/types/nominal/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/nullable/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/nullable/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/number/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/number/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/object/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/object/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/option/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/option/module.f.js +0 -0
- /package/{fs → fjs}/types/ordered_map/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/ordered_map/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/patricia_trie/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/patricia_trie/module.f.js +0 -0
- /package/{fs → fjs}/types/phantom/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/phantom/module.f.js +0 -0
- /package/{fs → fjs}/types/prime_field/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/prime_field/proof.f.d.ts +0 -0
- /package/{fs/types/function → fjs/types/range}/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/range_map/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/range_map/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/result/module.d.ts +0 -0
- /package/{fs → fjs}/types/result/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/result/module.f.js +0 -0
- /package/{fs → fjs}/types/rtti/parse/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/rtti/parse/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/rtti/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/rtti/proof.f.js +0 -0
- /package/{fs → fjs}/types/rtti/ts/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/rtti/validate/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/rtti/validate/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/sorted_list/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/sorted_list/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/sorted_set/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/sorted_set/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/string/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/string/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/string_set/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/string_set/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/ts/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/ts/module.f.js +0 -0
- /package/{fs → fjs}/types/uint8array/module.f.d.ts +0 -0
- /package/{fs → fjs}/website/module.f.d.ts +0 -0
- /package/{fs → fjs}/website/proof.f.d.ts +0 -0
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `vnd.fjs.revision` — one step in the evolution of a mutable object on top
|
|
3
|
+
* of an immutable content-addressable store.
|
|
4
|
+
*
|
|
5
|
+
* A revision BLOB links back to its parent revision(s) (a DAG, not just a
|
|
6
|
+
* chain, so concurrent edits can merge) and carries the full materialized
|
|
7
|
+
* content of that step — never an incremental diff (see the versioning rule
|
|
8
|
+
* in the README). This module is the pure format only: the rtti schema, the
|
|
9
|
+
* `dialect` tag, and decode/validate. No store access, no effects — head
|
|
10
|
+
* resolution, materialization, and reverse indexes are a separate, deferred
|
|
11
|
+
* concern.
|
|
12
|
+
*
|
|
13
|
+
* See `README.md` for the full spec.
|
|
14
|
+
*
|
|
15
|
+
* @module
|
|
16
|
+
*/
|
|
17
|
+
import { array, number, option, string } from '../../types/rtti/module.f.js';
|
|
18
|
+
import { validate as rttiValidate } from '../../types/rtti/validate/module.f.js';
|
|
19
|
+
import { parse as jsonParse } from '../json/parser/module.f.js';
|
|
20
|
+
import { tokenize as jsonTokenize } from '../json/tokenizer/module.f.js';
|
|
21
|
+
import { stringToList } from '../../text/utf16/module.f.js';
|
|
22
|
+
import { cBase32ToVec } from '../../basen/cbase32/module.f.js';
|
|
23
|
+
import { error, ok } from '../../types/result/module.f.js';
|
|
24
|
+
/**
|
|
25
|
+
* Format tag: names the dialect of this BLOB. The media type it is served
|
|
26
|
+
* with is derived mechanically: `application/` + `dialect` + `+json`.
|
|
27
|
+
*/
|
|
28
|
+
export const dialect = 'vnd.fjs.revision';
|
|
29
|
+
/** The media type derived from {@link dialect}: `application/vnd.fjs.revision+json`. */
|
|
30
|
+
export const mediaType = `application/${dialect}+json`;
|
|
31
|
+
/**
|
|
32
|
+
* rtti schema for the snapshot-reference type: a cbase32 CAS hash string.
|
|
33
|
+
*
|
|
34
|
+
* This is `string` at the rtti (structural) level — rtti schemas can't
|
|
35
|
+
* express string-content refinements — so cbase32 decodability, and the
|
|
36
|
+
* rejection of `https://` bridge URLs and any other location-addressed
|
|
37
|
+
* reference form, is enforced by {@link isHash} / {@link validate} below,
|
|
38
|
+
* not by this schema on its own.
|
|
39
|
+
*/
|
|
40
|
+
export const hash = string;
|
|
41
|
+
/**
|
|
42
|
+
* rtti schema for a `revision` BLOB. See the README for the full semantics of
|
|
43
|
+
* each field; `dialect` is the type discriminant, matched here as an exact
|
|
44
|
+
* literal so structural validation alone rejects any other dialect's blob.
|
|
45
|
+
*/
|
|
46
|
+
export const revisionSchema = {
|
|
47
|
+
dialect,
|
|
48
|
+
subject: string,
|
|
49
|
+
parents: array(hash),
|
|
50
|
+
snapshot: hash,
|
|
51
|
+
generation: number,
|
|
52
|
+
archived: option(true),
|
|
53
|
+
};
|
|
54
|
+
/** Structural-only validator: checks the shape, not the hash / generation semantics. */
|
|
55
|
+
const validateShape = rttiValidate(revisionSchema);
|
|
56
|
+
/** True when `s` decodes as a cbase32 CAS hash (rejects `https://` and any other non-cbase32 string). */
|
|
57
|
+
export const isHash = (s) => cBase32ToVec(s) !== null;
|
|
58
|
+
/**
|
|
59
|
+
* Checks the semantic refinements the structural schema can't express on an
|
|
60
|
+
* already shape-valid revision: every `parents` entry and the `snapshot` must
|
|
61
|
+
* decode as a cbase32 hash ({@link isHash}), and `generation` must be a
|
|
62
|
+
* non-negative *safe* integer. `subject` is not checked — it is an identity
|
|
63
|
+
* string, never a snapshot reference, so any string is valid.
|
|
64
|
+
*
|
|
65
|
+
* `generation` uses `Number.isSafeInteger`, not `Number.isInteger`: a value at
|
|
66
|
+
* or above `2 ** 53` passes `isInteger` but is no longer uniquely
|
|
67
|
+
* representable, so `1 + max(parents' generations)` — how a writer derives the
|
|
68
|
+
* next generation — can round back to the parent's value and fail to advance.
|
|
69
|
+
* Rejecting unsafe integers keeps stored generations exact.
|
|
70
|
+
*
|
|
71
|
+
* Both `snapshot` and `generation` are required by the schema, so no absence
|
|
72
|
+
* ever has to be resolved here: a revision states its content and its
|
|
73
|
+
* generation explicitly, and is fully interpretable in isolation (see the
|
|
74
|
+
* README). The former snapshot-resolution algorithm (subject-as-fallback,
|
|
75
|
+
* single-parent inheritance, multi-parent rejection) is gone.
|
|
76
|
+
*
|
|
77
|
+
* Exported separately from {@link validate} for callers that assemble a
|
|
78
|
+
* `Revision` themselves from already-typed fields (e.g. `fjs/cas/evo`'s
|
|
79
|
+
* `addRevision`): the shape is then guaranteed by TypeScript already, so only
|
|
80
|
+
* these semantic (string-only error) checks are worth re-running — routing
|
|
81
|
+
* through the combined structural-plus-semantic `validate` would add an
|
|
82
|
+
* unreachable structural-error branch on the caller's side.
|
|
83
|
+
*/
|
|
84
|
+
export const checkReferences = (r) => {
|
|
85
|
+
for (const p of r.parents) {
|
|
86
|
+
if (!isHash(p)) {
|
|
87
|
+
return error(`parent is not a valid hash: ${p}`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (!isHash(r.snapshot)) {
|
|
91
|
+
return error(`snapshot is not a valid hash: ${r.snapshot}`);
|
|
92
|
+
}
|
|
93
|
+
if (!Number.isSafeInteger(r.generation) || r.generation < 0) {
|
|
94
|
+
return error(`generation must be a non-negative safe integer: ${r.generation}`);
|
|
95
|
+
}
|
|
96
|
+
return ok(r);
|
|
97
|
+
};
|
|
98
|
+
/**
|
|
99
|
+
* Validates an already-parsed JSON value as a `revision` BLOB: structural
|
|
100
|
+
* (rtti) validation followed by the hash / generation semantic checks.
|
|
101
|
+
*/
|
|
102
|
+
export const validate = (value) => {
|
|
103
|
+
const [t, v] = validateShape(value);
|
|
104
|
+
if (t === 'error') {
|
|
105
|
+
return error(v);
|
|
106
|
+
}
|
|
107
|
+
return checkReferences(v);
|
|
108
|
+
};
|
|
109
|
+
/** Parses `text` as JSON without relying on `JSON.parse` (the shared `fjs/media/json` parser/tokenizer). */
|
|
110
|
+
const parseJson = (text) => jsonParse(jsonTokenize(stringToList(text)));
|
|
111
|
+
/**
|
|
112
|
+
* Decodes `text` as a `revision` BLOB: JSON-parses it, then validates it per
|
|
113
|
+
* {@link validate}. Detection is semantic, not syntactic — any JSON that
|
|
114
|
+
* satisfies the schema is a revision, regardless of key order or whitespace.
|
|
115
|
+
*/
|
|
116
|
+
export const decodeText = (text) => {
|
|
117
|
+
const [t, v] = parseJson(text);
|
|
118
|
+
if (t === 'error') {
|
|
119
|
+
return error(v);
|
|
120
|
+
}
|
|
121
|
+
return validate(v);
|
|
122
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export declare const proof: {
|
|
2
|
+
dialectAndMediaType: () => void;
|
|
3
|
+
isHash: {
|
|
4
|
+
validHash: () => void;
|
|
5
|
+
httpsRejected: () => void;
|
|
6
|
+
arbitraryStringRejected: () => void;
|
|
7
|
+
};
|
|
8
|
+
validate: {
|
|
9
|
+
allFieldsPresent: () => void;
|
|
10
|
+
nonHashSubjectAccepted: () => void;
|
|
11
|
+
multiParentAccepted: () => void;
|
|
12
|
+
missingSnapshotRejected: () => void;
|
|
13
|
+
nonHashSnapshotRejected: () => void;
|
|
14
|
+
missingGenerationRejected: () => void;
|
|
15
|
+
nonIntegerGenerationRejected: () => void;
|
|
16
|
+
negativeGenerationRejected: () => void;
|
|
17
|
+
unsafeIntegerGenerationRejected: () => void;
|
|
18
|
+
positiveGenerationAccepted: () => void;
|
|
19
|
+
httpsRejectedInParents: () => void;
|
|
20
|
+
archivedAccepted: () => void;
|
|
21
|
+
wrongDialectRejected: () => void;
|
|
22
|
+
missingSubjectRejected: () => void;
|
|
23
|
+
extraFieldsAccepted: () => void;
|
|
24
|
+
};
|
|
25
|
+
decodeText: {
|
|
26
|
+
validJson: () => void;
|
|
27
|
+
keyOrderIndependent: () => void;
|
|
28
|
+
malformedJsonRejected: () => void;
|
|
29
|
+
ordinaryJsonRejected: () => void;
|
|
30
|
+
};
|
|
31
|
+
};
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { assert, assertEq } from '../../asserts/module.f.js';
|
|
2
|
+
import { dialect, mediaType, isHash, validate, decodeText } from './module.f.js';
|
|
3
|
+
// Valid cbase32 hashes (round-tripped in fjs/basen/cbase32/proof.f.ts): single
|
|
4
|
+
// cbase32 symbols, cheap to write inline here.
|
|
5
|
+
const h1 = '8';
|
|
6
|
+
const h2 = 'r';
|
|
7
|
+
// A shape-valid revision: every required field present (`snapshot` and
|
|
8
|
+
// `generation` included), with `extra` overriding or adding fields per test.
|
|
9
|
+
const revisionOf = (extra) => ({
|
|
10
|
+
dialect,
|
|
11
|
+
subject: h1,
|
|
12
|
+
parents: [],
|
|
13
|
+
snapshot: h2,
|
|
14
|
+
generation: 0,
|
|
15
|
+
...extra,
|
|
16
|
+
});
|
|
17
|
+
export const proof = {
|
|
18
|
+
dialectAndMediaType: () => {
|
|
19
|
+
assertEq(dialect, 'vnd.fjs.revision');
|
|
20
|
+
assertEq(mediaType, 'application/vnd.fjs.revision+json');
|
|
21
|
+
},
|
|
22
|
+
isHash: {
|
|
23
|
+
validHash: () => assert(isHash(h1)),
|
|
24
|
+
httpsRejected: () => assert(!isHash('https://example.com/blob/abc')),
|
|
25
|
+
arbitraryStringRejected: () => assert(!isHash('not-a-hash!')),
|
|
26
|
+
},
|
|
27
|
+
validate: {
|
|
28
|
+
// A fully explicit revision validates.
|
|
29
|
+
allFieldsPresent: () => {
|
|
30
|
+
const [t] = validate(revisionOf({}));
|
|
31
|
+
assertEq(t, 'ok');
|
|
32
|
+
},
|
|
33
|
+
// `subject` is a pure identity string, never a snapshot reference: a
|
|
34
|
+
// zero-parent revision whose `subject` is not a hash is now valid,
|
|
35
|
+
// because `snapshot` is always stated explicitly.
|
|
36
|
+
nonHashSubjectAccepted: () => {
|
|
37
|
+
const r = validate(revisionOf({ subject: 'my-config' }));
|
|
38
|
+
assert(r[0] === 'ok', ['expected ok', r]);
|
|
39
|
+
assertEq(r[1].subject, 'my-config');
|
|
40
|
+
},
|
|
41
|
+
// A merge revision (more than one parent) is valid like any other —
|
|
42
|
+
// there is no "multiple parents without snapshot" case left, because
|
|
43
|
+
// `snapshot` is required.
|
|
44
|
+
multiParentAccepted: () => {
|
|
45
|
+
const r = validate(revisionOf({ subject: 'my-config', parents: [h1, h2], snapshot: h2 }));
|
|
46
|
+
assert(r[0] === 'ok', ['expected ok', r]);
|
|
47
|
+
assertEq(r[1].snapshot, h2);
|
|
48
|
+
},
|
|
49
|
+
// `snapshot` is required: absent is a shape error.
|
|
50
|
+
missingSnapshotRejected: () => {
|
|
51
|
+
const [t] = validate({ dialect, subject: h1, parents: [], generation: 0 });
|
|
52
|
+
assertEq(t, 'error');
|
|
53
|
+
},
|
|
54
|
+
// `snapshot` must decode as a hash — `https://` bridge URLs rejected.
|
|
55
|
+
nonHashSnapshotRejected: () => {
|
|
56
|
+
const [t] = validate(revisionOf({ snapshot: 'https://example.com/x' }));
|
|
57
|
+
assertEq(t, 'error');
|
|
58
|
+
},
|
|
59
|
+
// `generation` is required: absent is a shape error.
|
|
60
|
+
missingGenerationRejected: () => {
|
|
61
|
+
const [t] = validate({ dialect, subject: h1, parents: [], snapshot: h2 });
|
|
62
|
+
assertEq(t, 'error');
|
|
63
|
+
},
|
|
64
|
+
// `generation` must be an integer: a fractional value is rejected.
|
|
65
|
+
nonIntegerGenerationRejected: () => {
|
|
66
|
+
const [t] = validate(revisionOf({ generation: 1.5 }));
|
|
67
|
+
assertEq(t, 'error');
|
|
68
|
+
},
|
|
69
|
+
// `generation` must be non-negative.
|
|
70
|
+
negativeGenerationRejected: () => {
|
|
71
|
+
const [t] = validate(revisionOf({ generation: -1 }));
|
|
72
|
+
assertEq(t, 'error');
|
|
73
|
+
},
|
|
74
|
+
// `generation` must be a *safe* integer: at `2 ** 53` and above the
|
|
75
|
+
// value is no longer uniquely representable, so `1 + max(...)` could
|
|
76
|
+
// fail to advance — such a blob is rejected (`Number.isInteger` would
|
|
77
|
+
// accept it; `Number.isSafeInteger` does not).
|
|
78
|
+
unsafeIntegerGenerationRejected: () => {
|
|
79
|
+
const [t] = validate(revisionOf({ generation: 2 ** 53 }));
|
|
80
|
+
assertEq(t, 'error');
|
|
81
|
+
},
|
|
82
|
+
// A positive integer generation is accepted.
|
|
83
|
+
positiveGenerationAccepted: () => {
|
|
84
|
+
const r = validate(revisionOf({ parents: [h1], generation: 3 }));
|
|
85
|
+
assert(r[0] === 'ok', ['expected ok', r]);
|
|
86
|
+
assertEq(r[1].generation, 3);
|
|
87
|
+
},
|
|
88
|
+
// `https://` bridge URLs are rejected wherever a hash is required.
|
|
89
|
+
httpsRejectedInParents: () => {
|
|
90
|
+
const [t] = validate(revisionOf({ parents: ['https://example.com/x'] }));
|
|
91
|
+
assertEq(t, 'error');
|
|
92
|
+
},
|
|
93
|
+
// `archived` follows the presence-only `option(true)` idiom.
|
|
94
|
+
archivedAccepted: () => {
|
|
95
|
+
const [t] = validate(revisionOf({ archived: true }));
|
|
96
|
+
assertEq(t, 'ok');
|
|
97
|
+
},
|
|
98
|
+
// Wrong dialect tag: structural validation rejects it outright.
|
|
99
|
+
wrongDialectRejected: () => {
|
|
100
|
+
const [t] = validate({ dialect: 'vnd.fjs.other', subject: h1, parents: [], snapshot: h2, generation: 0 });
|
|
101
|
+
assertEq(t, 'error');
|
|
102
|
+
},
|
|
103
|
+
// Missing required fields: rejected.
|
|
104
|
+
missingSubjectRejected: () => {
|
|
105
|
+
const [t] = validate({ dialect, parents: [], snapshot: h2, generation: 0 });
|
|
106
|
+
assertEq(t, 'error');
|
|
107
|
+
},
|
|
108
|
+
// rtti structs are open: extra fields don't break validation — the
|
|
109
|
+
// additive forward-compatibility path the versioning rule relies on.
|
|
110
|
+
extraFieldsAccepted: () => {
|
|
111
|
+
const [t] = validate(revisionOf({ future: 'field' }));
|
|
112
|
+
assertEq(t, 'ok');
|
|
113
|
+
},
|
|
114
|
+
},
|
|
115
|
+
decodeText: {
|
|
116
|
+
validJson: () => {
|
|
117
|
+
const r = decodeText(JSON.stringify(revisionOf({})));
|
|
118
|
+
assert(r[0] === 'ok', ['expected ok', r]);
|
|
119
|
+
assertEq(r[1].subject, h1);
|
|
120
|
+
},
|
|
121
|
+
// Key order carries no meaning: detection parses the JSON and
|
|
122
|
+
// validates the parsed value, so `dialect` need not be first.
|
|
123
|
+
keyOrderIndependent: () => {
|
|
124
|
+
const text = `{"generation":0,"snapshot":"${h2}","parents":[],"subject":"${h1}","dialect":"${dialect}"}`;
|
|
125
|
+
const [t] = decodeText(text);
|
|
126
|
+
assertEq(t, 'ok');
|
|
127
|
+
},
|
|
128
|
+
malformedJsonRejected: () => {
|
|
129
|
+
const [t] = decodeText('{not json');
|
|
130
|
+
assertEq(t, 'error');
|
|
131
|
+
},
|
|
132
|
+
// Ordinary JSON that isn't a revision at all falls through as an error
|
|
133
|
+
// here — `fjs/media`'s composed detector is what falls back to the
|
|
134
|
+
// ordinary detector; this module only reports validity.
|
|
135
|
+
ordinaryJsonRejected: () => {
|
|
136
|
+
const [t] = decodeText('{"hello":"world"}');
|
|
137
|
+
assertEq(t, 'error');
|
|
138
|
+
},
|
|
139
|
+
},
|
|
140
|
+
};
|
|
@@ -32,12 +32,12 @@
|
|
|
32
32
|
*
|
|
33
33
|
* @module
|
|
34
34
|
*/
|
|
35
|
-
import { type Vec } from '
|
|
36
|
-
import type { Nullable } from '
|
|
37
|
-
import { type Effect, type Operation } from '
|
|
38
|
-
import type { List } from '
|
|
39
|
-
import type { IoResult } from '
|
|
40
|
-
import { type Utf8State } from '
|
|
35
|
+
import { type Vec } from '../../types/bit_vec/module.f.ts';
|
|
36
|
+
import type { Nullable } from '../../types/nullable/module.f.ts';
|
|
37
|
+
import { type Effect, type Operation } from '../../effects/module.f.ts';
|
|
38
|
+
import type { List } from '../../effects/list/module.f.ts';
|
|
39
|
+
import type { IoResult } from '../../effects/node/module.f.ts';
|
|
40
|
+
import { type Utf8State } from '../../text/utf8/module.f.ts';
|
|
41
41
|
/**
|
|
42
42
|
* Detects the MIME type of `bytes` from its leading magic-byte signature.
|
|
43
43
|
*
|
|
@@ -32,12 +32,12 @@
|
|
|
32
32
|
*
|
|
33
33
|
* @module
|
|
34
34
|
*/
|
|
35
|
-
import { msb, fromSentinel, length, u8List } from
|
|
36
|
-
import { iterable } from
|
|
37
|
-
import { pure } from
|
|
38
|
-
import { ok, error } from
|
|
39
|
-
import { isValidCodePoint, isTextCodePoint } from
|
|
40
|
-
import { utf8ByteToCodePointOp } from
|
|
35
|
+
import { msb, fromSentinel, length, u8List } from '../../types/bit_vec/module.f.js';
|
|
36
|
+
import { iterable } from '../../types/list/module.f.js';
|
|
37
|
+
import { pure } from '../../effects/module.f.js';
|
|
38
|
+
import { ok, error } from '../../types/result/module.f.js';
|
|
39
|
+
import { isValidCodePoint, isTextCodePoint } from '../../text/code_point/module.f.js';
|
|
40
|
+
import { utf8ByteToCodePointOp } from '../../text/utf8/module.f.js';
|
|
41
41
|
const { startsWith, removeFront } = msb;
|
|
42
42
|
// Each signature is written as a hex literal whose leading `1` nibble is a
|
|
43
43
|
// sentinel marking the start of the byte run (so leading zero bytes survive)
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { assert, assertEq } from
|
|
2
|
-
import { msb, u8ListToVec, vec8, repeat, empty } from
|
|
3
|
-
import { decode } from
|
|
4
|
-
import { nonEmpty, empty as emptyList } from
|
|
5
|
-
import { ok } from
|
|
6
|
-
import { detect, detectStream, detectVec } from
|
|
1
|
+
import { assert, assertEq } from '../../asserts/module.f.js';
|
|
2
|
+
import { msb, u8ListToVec, vec8, repeat, empty } from '../../types/bit_vec/module.f.js';
|
|
3
|
+
import { decode } from '../../effects/module.f.js';
|
|
4
|
+
import { nonEmpty, empty as emptyList } from '../../effects/list/module.f.js';
|
|
5
|
+
import { ok } from '../../types/result/module.f.js';
|
|
6
|
+
import { detect, detectStream, detectVec } from './module.f.js';
|
|
7
7
|
// Builds a big-endian `Vec` from a list of byte values — mirrors how the CAS
|
|
8
8
|
// store would hold the leading bytes of a stored blob.
|
|
9
9
|
const bytes = (...b) => u8ListToVec(msb)(b);
|
|
@@ -11,9 +11,7 @@ const bytes = (...b) => u8ListToVec(msb)(b);
|
|
|
11
11
|
// Evaluates a fully pure effect (no operations) to its result.
|
|
12
12
|
const runPure = (e) => {
|
|
13
13
|
const d = decode(e);
|
|
14
|
-
|
|
15
|
-
throw 'effect is not pure';
|
|
16
|
-
}
|
|
14
|
+
assert(d.done, 'effect is not pure');
|
|
17
15
|
return d.result;
|
|
18
16
|
};
|
|
19
17
|
// Builds a CAS-style read stream from a sequence of ok(chunk) items.
|
|
@@ -21,9 +19,7 @@ const stream = (...chunks) => chunks.reduceRight((tail, c) => nonEmpty(ok(c), ta
|
|
|
21
19
|
// Runs the streaming detector over the given chunks and unwraps the metadata.
|
|
22
20
|
const detectChunks = (...chunks) => {
|
|
23
21
|
const r = runPure(detectStream(stream(...chunks)));
|
|
24
|
-
|
|
25
|
-
throw r[1];
|
|
26
|
-
}
|
|
22
|
+
assert(r[0] !== 'error', r[1]);
|
|
27
23
|
return r[1];
|
|
28
24
|
};
|
|
29
25
|
export const proof = {
|
|
@@ -3,14 +3,14 @@
|
|
|
3
3
|
*
|
|
4
4
|
* @module
|
|
5
5
|
*/
|
|
6
|
-
import { compile } from
|
|
7
|
-
import { main as testMain } from
|
|
8
|
-
import { commands as casCommands } from
|
|
9
|
-
import { main as ciMain } from
|
|
10
|
-
import { import_ } from
|
|
11
|
-
import { dispatch } from
|
|
12
|
-
import { casMcpServer } from
|
|
13
|
-
import { pure } from
|
|
6
|
+
import { compile } from './djs/module.f.js';
|
|
7
|
+
import { main as testMain } from './emergent_testing/module.f.js';
|
|
8
|
+
import { commands as casCommands } from './cas/cli/module.f.js';
|
|
9
|
+
import { main as ciMain } from './ci/module.f.js';
|
|
10
|
+
import { import_ } from './effects/node/module.f.js';
|
|
11
|
+
import { dispatch } from './cli/module.f.js';
|
|
12
|
+
import { casMcpServer } from './cas/mcp/module.f.js';
|
|
13
|
+
import { pure } from './effects/module.f.js';
|
|
14
14
|
const commands = [
|
|
15
15
|
{
|
|
16
16
|
names: ['test', 't'],
|
|
@@ -29,7 +29,7 @@ const commands = [
|
|
|
29
29
|
},
|
|
30
30
|
{
|
|
31
31
|
names: ['mcp', 'm'],
|
|
32
|
-
description: 'Run an MCP server over stdio exposing the CAS as tools',
|
|
32
|
+
description: 'Run an MCP server over stdio exposing the CAS and Evo (subjects/heads) as tools',
|
|
33
33
|
handler: ({ home }) => casMcpServer(home).step(() => pure(0)),
|
|
34
34
|
},
|
|
35
35
|
{
|
package/fjs/module.js
ADDED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { fold, last, take, length, concat as listConcat, toArray } from
|
|
2
|
-
import { join as listJoin, concat as stringConcat } from
|
|
1
|
+
import { fold, last, take, length, concat as listConcat, toArray } from '../types/list/module.f.js';
|
|
2
|
+
import { join as listJoin, concat as stringConcat } from '../types/string/module.f.js';
|
|
3
3
|
const foldNormalizeOp = input => state => {
|
|
4
4
|
switch (input) {
|
|
5
5
|
case '':
|
|
@@ -1,170 +1,119 @@
|
|
|
1
1
|
import { concat, isProperPrefix, join, normalize, relativize, toPosix } from "./module.f.js";
|
|
2
|
+
import { assertEq } from '../asserts/module.f.js';
|
|
2
3
|
const normalizeTest = [
|
|
3
4
|
() => {
|
|
4
5
|
const norm = normalize("dir/file.json");
|
|
5
|
-
|
|
6
|
-
throw norm;
|
|
7
|
-
}
|
|
6
|
+
assertEq(norm, "dir/file.json");
|
|
8
7
|
},
|
|
9
8
|
() => {
|
|
10
9
|
const norm = normalize("dir//file.json");
|
|
11
|
-
|
|
12
|
-
throw norm;
|
|
13
|
-
}
|
|
10
|
+
assertEq(norm, "dir/file.json");
|
|
14
11
|
},
|
|
15
12
|
() => {
|
|
16
13
|
const norm = normalize("../../dir/file.json");
|
|
17
|
-
|
|
18
|
-
throw norm;
|
|
19
|
-
}
|
|
14
|
+
assertEq(norm, "../../dir/file.json");
|
|
20
15
|
},
|
|
21
16
|
() => {
|
|
22
17
|
const norm = normalize("../../dir/../file.json");
|
|
23
|
-
|
|
24
|
-
throw norm;
|
|
25
|
-
}
|
|
18
|
+
assertEq(norm, "../../file.json");
|
|
26
19
|
},
|
|
27
20
|
];
|
|
28
21
|
const concatTest = [
|
|
29
22
|
() => {
|
|
30
23
|
const c = concat("a")("b");
|
|
31
|
-
|
|
32
|
-
throw c;
|
|
33
|
-
}
|
|
24
|
+
assertEq(c, "a/b");
|
|
34
25
|
},
|
|
35
26
|
() => {
|
|
36
27
|
const c = concat("a///b/")("c");
|
|
37
|
-
|
|
38
|
-
throw c;
|
|
39
|
-
}
|
|
28
|
+
assertEq(c, "a/b/c");
|
|
40
29
|
},
|
|
41
30
|
() => {
|
|
42
31
|
const c = concat("a/../b/..")("c");
|
|
43
|
-
|
|
44
|
-
throw c;
|
|
45
|
-
}
|
|
32
|
+
assertEq(c, "c");
|
|
46
33
|
},
|
|
47
34
|
];
|
|
48
35
|
const joinTest = [
|
|
49
36
|
() => {
|
|
50
37
|
const r = join('a', 'b');
|
|
51
|
-
|
|
52
|
-
throw r;
|
|
53
|
-
}
|
|
38
|
+
assertEq(r, 'a/b');
|
|
54
39
|
},
|
|
55
40
|
() => {
|
|
56
41
|
const r = join('/abs/root', 'x');
|
|
57
|
-
|
|
58
|
-
throw r;
|
|
59
|
-
}
|
|
42
|
+
assertEq(r, '/abs/root/x');
|
|
60
43
|
},
|
|
61
44
|
() => {
|
|
62
45
|
const r = join('a', 'b', 'c', 'd');
|
|
63
|
-
|
|
64
|
-
throw r;
|
|
65
|
-
}
|
|
46
|
+
assertEq(r, 'a/b/c/d');
|
|
66
47
|
},
|
|
67
48
|
() => {
|
|
68
49
|
const r = join('', 'x');
|
|
69
|
-
|
|
70
|
-
throw r;
|
|
71
|
-
}
|
|
50
|
+
assertEq(r, '/x');
|
|
72
51
|
},
|
|
73
52
|
() => {
|
|
74
53
|
const r = join();
|
|
75
|
-
|
|
76
|
-
throw r;
|
|
77
|
-
}
|
|
54
|
+
assertEq(r, '');
|
|
78
55
|
},
|
|
79
56
|
() => {
|
|
80
57
|
const r = join('only');
|
|
81
|
-
|
|
82
|
-
throw r;
|
|
83
|
-
}
|
|
58
|
+
assertEq(r, 'only');
|
|
84
59
|
},
|
|
85
60
|
];
|
|
86
61
|
const relativizeTest = [
|
|
87
62
|
() => {
|
|
88
63
|
const r = relativize('/repo', '/repo/fs/a.ts');
|
|
89
|
-
|
|
90
|
-
throw r;
|
|
91
|
-
}
|
|
64
|
+
assertEq(r, './fs/a.ts');
|
|
92
65
|
},
|
|
93
66
|
() => {
|
|
94
67
|
const r = relativize('/repo', '/other/a.ts');
|
|
95
|
-
|
|
96
|
-
throw r;
|
|
97
|
-
}
|
|
68
|
+
assertEq(r, '/other/a.ts');
|
|
98
69
|
},
|
|
99
70
|
() => {
|
|
100
71
|
const r = relativize('', './fs/a.ts');
|
|
101
|
-
|
|
102
|
-
throw r;
|
|
103
|
-
}
|
|
72
|
+
assertEq(r, './fs/a.ts');
|
|
104
73
|
},
|
|
105
74
|
];
|
|
106
75
|
const toPosixTest = [
|
|
107
76
|
() => {
|
|
108
77
|
const p = toPosix('a\\b\\c');
|
|
109
|
-
|
|
110
|
-
throw p;
|
|
111
|
-
}
|
|
78
|
+
assertEq(p, 'a/b/c');
|
|
112
79
|
},
|
|
113
80
|
() => {
|
|
114
81
|
const p = toPosix('a/b/c');
|
|
115
|
-
|
|
116
|
-
throw p;
|
|
117
|
-
}
|
|
82
|
+
assertEq(p, 'a/b/c');
|
|
118
83
|
},
|
|
119
84
|
() => {
|
|
120
85
|
const p = toPosix('C:\\Users\\x');
|
|
121
|
-
|
|
122
|
-
throw p;
|
|
123
|
-
}
|
|
86
|
+
assertEq(p, 'C:/Users/x');
|
|
124
87
|
},
|
|
125
88
|
() => {
|
|
126
89
|
const p = toPosix('');
|
|
127
|
-
|
|
128
|
-
throw p;
|
|
129
|
-
}
|
|
90
|
+
assertEq(p, '');
|
|
130
91
|
},
|
|
131
92
|
];
|
|
132
93
|
const isProperPrefixTest = [
|
|
133
94
|
() => {
|
|
134
95
|
const r = isProperPrefix(['a', 'b'], ['a', 'b', 'c']);
|
|
135
|
-
|
|
136
|
-
throw r;
|
|
137
|
-
}
|
|
96
|
+
assertEq(r, true);
|
|
138
97
|
},
|
|
139
98
|
() => {
|
|
140
99
|
const r = isProperPrefix(['a', 'b'], ['a', 'b']);
|
|
141
|
-
|
|
142
|
-
throw r;
|
|
143
|
-
}
|
|
100
|
+
assertEq(r, false);
|
|
144
101
|
},
|
|
145
102
|
() => {
|
|
146
103
|
const r = isProperPrefix(['a', 'x'], ['a', 'b', 'c']);
|
|
147
|
-
|
|
148
|
-
throw r;
|
|
149
|
-
}
|
|
104
|
+
assertEq(r, false);
|
|
150
105
|
},
|
|
151
106
|
() => {
|
|
152
107
|
const r = isProperPrefix(['a', 'b', 'c'], ['a', 'b']);
|
|
153
|
-
|
|
154
|
-
throw r;
|
|
155
|
-
}
|
|
108
|
+
assertEq(r, false);
|
|
156
109
|
},
|
|
157
110
|
() => {
|
|
158
111
|
const r = isProperPrefix([], ['a']);
|
|
159
|
-
|
|
160
|
-
throw r;
|
|
161
|
-
}
|
|
112
|
+
assertEq(r, true);
|
|
162
113
|
},
|
|
163
114
|
() => {
|
|
164
115
|
const r = isProperPrefix([], []);
|
|
165
|
-
|
|
166
|
-
throw r;
|
|
167
|
-
}
|
|
116
|
+
assertEq(r, false);
|
|
168
117
|
},
|
|
169
118
|
];
|
|
170
119
|
export const proof = { normalizeTest, concatTest, joinTest, relativizeTest, toPosixTest, isProperPrefixTest };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { assert, assertEq } from
|
|
2
|
-
import { pure } from
|
|
3
|
-
import { defaultNodeProgramOptions, emptyState, virtual } from
|
|
4
|
-
import { main } from
|
|
1
|
+
import { assert, assertEq } from './asserts/module.f.js';
|
|
2
|
+
import { pure } from './effects/module.f.js';
|
|
3
|
+
import { defaultNodeProgramOptions, emptyState, virtual } from './effects/node/virtual/module.f.js';
|
|
4
|
+
import { main } from './module.f.js';
|
|
5
5
|
const makeOptions = (args) => ({ ...defaultNodeProgramOptions, args });
|
|
6
6
|
const run = (root) => (args) => virtual({ ...emptyState, root })(main(makeOptions(args)));
|
|
7
7
|
const appMain = ({ args }) => pure(args.length);
|
|
@@ -25,6 +25,8 @@ export const proof = {
|
|
|
25
25
|
mcp: () => {
|
|
26
26
|
// stdin is empty in the virtual environment, so the server sees EOF
|
|
27
27
|
// immediately and shuts down cleanly, exercising the `mcp` handler.
|
|
28
|
+
// The store is empty too, so `casMcpServer`'s Evo cache scan
|
|
29
|
+
// (`initEvo`) also runs and finds nothing.
|
|
28
30
|
const [, code] = run({})(['mcp']);
|
|
29
31
|
assertEq(code, 0);
|
|
30
32
|
},
|