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
|
@@ -7,16 +7,16 @@
|
|
|
7
7
|
* value to a response value (or `null` for a notification) and performs no I/O.
|
|
8
8
|
*
|
|
9
9
|
* Out of scope here (follow-ups): transports — stdio / HTTP framing — over
|
|
10
|
-
* `
|
|
10
|
+
* `fjs/effects/node`, and concrete method sets such as MCP (i665-mcp), which layer
|
|
11
11
|
* on top of `dispatch`.
|
|
12
12
|
*
|
|
13
13
|
* https://www.jsonrpc.org/specification
|
|
14
14
|
*
|
|
15
15
|
* @module
|
|
16
16
|
*/
|
|
17
|
-
import { number, string, or, option } from
|
|
18
|
-
import { validate } from
|
|
19
|
-
import { unknown } from
|
|
17
|
+
import { number, string, or, option } from '../../../types/rtti/module.f.js';
|
|
18
|
+
import { validate } from '../../../types/rtti/validate/module.f.js';
|
|
19
|
+
import { unknown } from '../module.f.js';
|
|
20
20
|
export const jsonrpc = '2.0';
|
|
21
21
|
/** Request/response identifier: a string, a number, or `null`. */
|
|
22
22
|
const id = or(string, number, null);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { assert, assertEq } from
|
|
2
|
-
import { ok, error } from
|
|
3
|
-
import { validate } from
|
|
4
|
-
import { error as errorSchema, decodeRequest, dispatch, rpcError, parseError, invalidRequest, methodNotFound, invalidParams, internalError, } from
|
|
1
|
+
import { assert, assertEq } from '../../../asserts/module.f.js';
|
|
2
|
+
import { ok, error } from '../../../types/result/module.f.js';
|
|
3
|
+
import { validate } from '../../../types/rtti/validate/module.f.js';
|
|
4
|
+
import { error as errorSchema, decodeRequest, dispatch, rpcError, parseError, invalidRequest, methodNotFound, invalidParams, internalError, } from './module.f.js';
|
|
5
5
|
const isOk = (r) => r[0] === 'ok';
|
|
6
6
|
const handlers = {
|
|
7
7
|
ping: () => ok('pong'),
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Converts an rtti schema to a JSON Schema (draft 2020-12) object.
|
|
3
|
+
*
|
|
4
|
+
* Driven by `fjs/types/rtti/common/module.f.ts`'s `visit`, the same shared
|
|
5
|
+
* `Type`-ADT walker used by `validate` and `parse`.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
import { type Type as RttiType } from '../../../types/rtti/module.f.ts';
|
|
10
|
+
import type { Ts } from '../../../types/rtti/ts/module.f.ts';
|
|
11
|
+
import type { Phantom } from '../../../types/phantom/module.f.ts';
|
|
12
|
+
import { unknown as jsonUnknown } from '../module.f.ts';
|
|
13
|
+
declare const unknownThunk: () => readonly ['const', {
|
|
14
|
+
readonly type: import("../../../types/rtti/module.f.ts").Or<["boolean", "number", "string", "integer", "array", "object", undefined]>;
|
|
15
|
+
readonly const: import("../../../types/rtti/module.f.ts").Or<readonly [typeof jsonUnknown, undefined]>;
|
|
16
|
+
readonly not: import("../../../types/rtti/module.f.ts").Or<readonly [Phantom<() => readonly ['const', /*elided*/ any], UnknownConst>, undefined]>;
|
|
17
|
+
readonly anyOf: import("../../../types/rtti/module.f.ts").Or<readonly [import("../../../types/rtti/module.f.ts").Type1<"array", Phantom<() => readonly ['const', any], UnknownConst>>, undefined]>;
|
|
18
|
+
readonly items: import("../../../types/rtti/module.f.ts").Or<[Phantom<() => readonly ['const', any], UnknownConst>, false, undefined]>;
|
|
19
|
+
readonly prefixItems: import("../../../types/rtti/module.f.ts").Or<readonly [import("../../../types/rtti/module.f.ts").Type1<"array", Phantom<() => readonly ['const', any], UnknownConst>>, undefined]>;
|
|
20
|
+
readonly properties: import("../../../types/rtti/module.f.ts").Or<readonly [import("../../../types/rtti/module.f.ts").Type1<"record", Phantom<() => readonly ['const', any], UnknownConst>>, undefined]>;
|
|
21
|
+
readonly required: import("../../../types/rtti/module.f.ts").Or<readonly [import("../../../types/rtti/module.f.ts").Type1<"array", import("../../../types/rtti/module.f.ts").String>, undefined]>;
|
|
22
|
+
readonly additionalProperties: import("../../../types/rtti/module.f.ts").Or<readonly [Phantom<() => readonly ['const', any], UnknownConst>, undefined]>;
|
|
23
|
+
}];
|
|
24
|
+
/** rtti schema for a JSON Schema (draft 2020-12) document. */
|
|
25
|
+
export declare const unknown: Phantom<typeof unknownThunk, UnknownConst>;
|
|
26
|
+
/** A JSON Schema (draft 2020-12) document — the subset of keywords that `toJsonSchema` emits. */
|
|
27
|
+
export type Unknown = Ts<typeof unknown>;
|
|
28
|
+
declare const unknownConst: {
|
|
29
|
+
readonly type: import("../../../types/rtti/module.f.ts").Or<["boolean", "number", "string", "integer", "array", "object", undefined]>;
|
|
30
|
+
readonly const: import("../../../types/rtti/module.f.ts").Or<readonly [typeof jsonUnknown, undefined]>;
|
|
31
|
+
readonly not: import("../../../types/rtti/module.f.ts").Or<readonly [Phantom<typeof unknownThunk, UnknownConst>, undefined]>;
|
|
32
|
+
readonly anyOf: import("../../../types/rtti/module.f.ts").Or<readonly [import("../../../types/rtti/module.f.ts").Type1<"array", Phantom<typeof unknownThunk, UnknownConst>>, undefined]>;
|
|
33
|
+
readonly items: import("../../../types/rtti/module.f.ts").Or<[Phantom<typeof unknownThunk, UnknownConst>, false, undefined]>;
|
|
34
|
+
readonly prefixItems: import("../../../types/rtti/module.f.ts").Or<readonly [import("../../../types/rtti/module.f.ts").Type1<"array", Phantom<typeof unknownThunk, UnknownConst>>, undefined]>;
|
|
35
|
+
readonly properties: import("../../../types/rtti/module.f.ts").Or<readonly [import("../../../types/rtti/module.f.ts").Type1<"record", Phantom<typeof unknownThunk, UnknownConst>>, undefined]>;
|
|
36
|
+
readonly required: import("../../../types/rtti/module.f.ts").Or<readonly [import("../../../types/rtti/module.f.ts").Type1<"array", import("../../../types/rtti/module.f.ts").String>, undefined]>;
|
|
37
|
+
readonly additionalProperties: import("../../../types/rtti/module.f.ts").Or<readonly [Phantom<typeof unknownThunk, UnknownConst>, undefined]>;
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Hand-written base type used as the `$out` annotation on `unknown`.
|
|
41
|
+
*
|
|
42
|
+
* The `?` markers are required even though `Ts<>` already includes `undefined`
|
|
43
|
+
* in each field type. Without `?`, `Unknown = UnknownConst` would require all
|
|
44
|
+
* 9 fields to be present in every object literal returned by `toJsonSchema`,
|
|
45
|
+
* because TypeScript distinguishes "field absent" (`?`) from "field present but
|
|
46
|
+
* undefined" (`T | undefined`). JSON Schema objects only include the fields
|
|
47
|
+
* they need, so all fields must be optional.
|
|
48
|
+
*/
|
|
49
|
+
type UnknownConst = {
|
|
50
|
+
readonly type?: Ts<typeof unknownConst.type>;
|
|
51
|
+
readonly const?: Ts<typeof unknownConst.const>;
|
|
52
|
+
readonly not?: Ts<typeof unknownConst.not>;
|
|
53
|
+
readonly anyOf?: Ts<typeof unknownConst.anyOf>;
|
|
54
|
+
readonly items?: Ts<typeof unknownConst.items>;
|
|
55
|
+
readonly prefixItems?: Ts<typeof unknownConst.prefixItems>;
|
|
56
|
+
readonly properties?: Ts<typeof unknownConst.properties>;
|
|
57
|
+
readonly required?: Ts<typeof unknownConst.required>;
|
|
58
|
+
readonly additionalProperties?: Ts<typeof unknownConst.additionalProperties>;
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* Converts an rtti `Type` to a JSON Schema (draft 2020-12) object.
|
|
62
|
+
*
|
|
63
|
+
* | rtti | JSON Schema |
|
|
64
|
+
* |-----------------------------------------------|-------------------------------------------------------------------------------------|
|
|
65
|
+
* | `boolean` / `number` / `string` | `{ "type": "..." }` |
|
|
66
|
+
* | `bigint` | `{ "type": "integer" }` (lossy; JSON integers are IEEE-754 doubles) |
|
|
67
|
+
* | `unknown` | `{}` (always-true schema) |
|
|
68
|
+
* | primitive const (`42`, `'x'`, `true`, `null`) | `{ "const": <value> }` |
|
|
69
|
+
* | `bigint` const | `{ "const": Number(value) }` (lossy for \|value\| > MAX_SAFE_INTEGER) |
|
|
70
|
+
* | `undefined` const | `{ "not": {} }` (no JSON value satisfies this) |
|
|
71
|
+
* | struct `{ a: T, … }` | `{ "type": "object", "properties": { "a": …T… }, "required": [non-optional keys] }` |
|
|
72
|
+
* | tuple `[A, B]` | `{ "type": "array", "prefixItems": […A…, …B…], "items": false }` |
|
|
73
|
+
* | `array(T)` | `{ "type": "array", "items": …T… }` |
|
|
74
|
+
* | `record(T)` | `{ "type": "object", "additionalProperties": …T… }` |
|
|
75
|
+
* | `or(...types)` | `{ "anyOf": […each…] }` |
|
|
76
|
+
*/
|
|
77
|
+
export declare const toJsonSchema: (rtti: RttiType) => Unknown;
|
|
78
|
+
export {};
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Converts an rtti schema to a JSON Schema (draft 2020-12) object.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Driven by `fjs/types/rtti/common/module.f.ts`'s `visit`, the same shared
|
|
5
|
+
* `Type`-ADT walker used by `validate` and `parse`.
|
|
6
6
|
*
|
|
7
7
|
* @module
|
|
8
8
|
*/
|
|
9
|
-
import { array, option, or, record, string } from
|
|
10
|
-
import {
|
|
9
|
+
import { array, option, or, record, string } from '../../../types/rtti/module.f.js';
|
|
10
|
+
import { visit } from '../../../types/rtti/common/module.f.js';
|
|
11
|
+
import { unknown as jsonUnknown } from '../module.f.js';
|
|
11
12
|
const unknownThunk = () => ['const', unknownConst];
|
|
12
13
|
/** rtti schema for a JSON Schema (draft 2020-12) document. */
|
|
13
14
|
export const unknown = unknownThunk;
|
|
@@ -45,24 +46,10 @@ const stripUndefined = (rtti) => {
|
|
|
45
46
|
const rest = r.flatMap(t => t !== undefined ? [t] : []);
|
|
46
47
|
return rest.length === 1 ? rest[0] : or(...rest);
|
|
47
48
|
};
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
if (typeof rtti !== 'object' || rtti === null) {
|
|
53
|
-
// bigint consts are represented as numbers (lossy for |value| > MAX_SAFE_INTEGER)
|
|
54
|
-
return { const: typeof rtti === 'bigint' ? Number(rtti) : rtti };
|
|
55
|
-
}
|
|
56
|
-
if (rtti instanceof Array) {
|
|
57
|
-
return {
|
|
58
|
-
type: 'array',
|
|
59
|
-
prefixItems: rtti.map(toJsonSchema),
|
|
60
|
-
items: false,
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
// Struct: keys not admitting undefined go into `required`; optional keys have
|
|
64
|
-
// undefined stripped from their property schema. additionalProperties is omitted
|
|
65
|
-
// (lenient), matching rtti's open-struct validation semantics.
|
|
49
|
+
// Struct: keys not admitting undefined go into `required`; optional keys have
|
|
50
|
+
// undefined stripped from their property schema. additionalProperties is omitted
|
|
51
|
+
// (lenient), matching rtti's open-struct validation semantics.
|
|
52
|
+
const structSchema = (rtti) => {
|
|
66
53
|
const ents = Object.entries(rtti);
|
|
67
54
|
const properties = Object.fromEntries(ents.map(([k, v]) => [k, toJsonSchema(stripUndefined(v))]));
|
|
68
55
|
const required = ents
|
|
@@ -74,6 +61,21 @@ const constToJsonSchema = (rtti) => {
|
|
|
74
61
|
...(required.length > 0 ? { required } : {}),
|
|
75
62
|
};
|
|
76
63
|
};
|
|
64
|
+
const constPrimitiveSchema = (rtti) => rtti === undefined
|
|
65
|
+
? { not: {} }
|
|
66
|
+
// bigint consts are represented as numbers (lossy for |value| > MAX_SAFE_INTEGER)
|
|
67
|
+
: { const: typeof rtti === 'bigint' ? Number(rtti) : rtti };
|
|
68
|
+
const visitor = {
|
|
69
|
+
tuple: (t) => ({ type: 'array', prefixItems: t.map(toJsonSchema), items: false }),
|
|
70
|
+
struct: structSchema,
|
|
71
|
+
array: item => ({ type: 'array', items: toJsonSchema(item) }),
|
|
72
|
+
record: item => ({ type: 'object', additionalProperties: toJsonSchema(item) }),
|
|
73
|
+
or: variants => ({ anyOf: variants.map(toJsonSchema) }),
|
|
74
|
+
constPrimitive: constPrimitiveSchema,
|
|
75
|
+
// bigint is not representable in JSON Schema; 'integer' is the closest approximation
|
|
76
|
+
primitive0: tag => ({ type: tag === 'bigint' ? 'integer' : tag }),
|
|
77
|
+
unknown: () => ({}),
|
|
78
|
+
};
|
|
77
79
|
/**
|
|
78
80
|
* Converts an rtti `Type` to a JSON Schema (draft 2020-12) object.
|
|
79
81
|
*
|
|
@@ -91,22 +93,4 @@ const constToJsonSchema = (rtti) => {
|
|
|
91
93
|
* | `record(T)` | `{ "type": "object", "additionalProperties": …T… }` |
|
|
92
94
|
* | `or(...types)` | `{ "anyOf": […each…] }` |
|
|
93
95
|
*/
|
|
94
|
-
export const toJsonSchema = (
|
|
95
|
-
if (typeof rtti !== 'function') {
|
|
96
|
-
return constToJsonSchema(rtti);
|
|
97
|
-
}
|
|
98
|
-
const [tag, ...rest] = rtti();
|
|
99
|
-
switch (tag) {
|
|
100
|
-
case 'const': return constToJsonSchema(rest[0]);
|
|
101
|
-
case 'boolean': return { type: 'boolean' };
|
|
102
|
-
case 'number': return { type: 'number' };
|
|
103
|
-
case 'string': return { type: 'string' };
|
|
104
|
-
// bigint is not representable in JSON Schema; 'integer' is the closest approximation
|
|
105
|
-
case 'bigint': return { type: 'integer' };
|
|
106
|
-
case 'unknown': return {};
|
|
107
|
-
case 'array': return { type: 'array', items: toJsonSchema(rest[0]) };
|
|
108
|
-
case 'record': return { type: 'object', additionalProperties: toJsonSchema(rest[0]) };
|
|
109
|
-
case 'or': return { anyOf: rest.map(toJsonSchema) };
|
|
110
|
-
default: return {};
|
|
111
|
-
}
|
|
112
|
-
};
|
|
96
|
+
export const toJsonSchema = visit(visitor);
|
|
@@ -1,13 +1,12 @@
|
|
|
1
|
-
import { boolean, number, string, bigint, unknown, array, record, or, option } from
|
|
2
|
-
import { stringify } from
|
|
3
|
-
import { toJsonSchema, unknown as schemaUnknown } from
|
|
1
|
+
import { boolean, number, string, bigint, unknown, array, record, or, option } from '../../../types/rtti/module.f.js';
|
|
2
|
+
import { stringify } from '../module.f.js';
|
|
3
|
+
import { toJsonSchema, unknown as schemaUnknown } from './module.f.js';
|
|
4
|
+
import { assert, assertEq } from '../../../asserts/module.f.js';
|
|
4
5
|
const serialize = (v) => stringify(e => e)(v);
|
|
5
6
|
const eq = (rtti, expected) => () => {
|
|
6
7
|
const result = serialize(toJsonSchema(rtti));
|
|
7
8
|
const exp = serialize(expected);
|
|
8
|
-
|
|
9
|
-
throw [result, exp];
|
|
10
|
-
}
|
|
9
|
+
assertEq(result, exp, [result, exp]);
|
|
11
10
|
};
|
|
12
11
|
export const proof = {
|
|
13
12
|
tag0: {
|
|
@@ -62,9 +61,7 @@ export const proof = {
|
|
|
62
61
|
},
|
|
63
62
|
schemaUnknownTag: () => {
|
|
64
63
|
const r = schemaUnknown();
|
|
65
|
-
|
|
66
|
-
throw r[0];
|
|
67
|
-
}
|
|
64
|
+
assert(r[0] === 'const');
|
|
68
65
|
},
|
|
69
66
|
nested: {
|
|
70
67
|
arrayOfRecords: eq(array(record(boolean)), {
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
*
|
|
4
4
|
* @module
|
|
5
5
|
*/
|
|
6
|
-
import { flat, reduce, empty } from
|
|
7
|
-
import {} from
|
|
6
|
+
import { flat, reduce, empty } from '../../../types/list/module.f.js';
|
|
7
|
+
import {} from '../../../types/function/operator/module.f.js';
|
|
8
8
|
const jsonStringify = JSON.stringify;
|
|
9
9
|
/**
|
|
10
10
|
* Serializes a string as a JSON string literal.
|
|
@@ -1,25 +1,20 @@
|
|
|
1
|
-
import { arrayWrap, boolSerialize, numberSerialize, objectWrap, stringSerialize } from
|
|
2
|
-
import * as list from
|
|
1
|
+
import { arrayWrap, boolSerialize, numberSerialize, objectWrap, stringSerialize } from './module.f.js';
|
|
2
|
+
import * as list from '../../../types/list/module.f.js';
|
|
3
|
+
import { assertEq } from '../../../asserts/module.f.js';
|
|
3
4
|
const { toArray } = list;
|
|
4
5
|
export const proof = {
|
|
5
6
|
arrayWrap: [
|
|
6
7
|
() => {
|
|
7
8
|
const result = JSON.stringify(toArray(arrayWrap(null)));
|
|
8
|
-
|
|
9
|
-
throw result;
|
|
10
|
-
}
|
|
9
|
+
assertEq(result, '["[","]"]');
|
|
11
10
|
},
|
|
12
11
|
() => {
|
|
13
12
|
const result = JSON.stringify(toArray(arrayWrap([['a', 'b']])));
|
|
14
|
-
|
|
15
|
-
throw result;
|
|
16
|
-
}
|
|
13
|
+
assertEq(result, '["[","a","b","]"]');
|
|
17
14
|
},
|
|
18
15
|
() => {
|
|
19
16
|
const result = JSON.stringify(toArray(arrayWrap([['a'], ['b']])));
|
|
20
|
-
|
|
21
|
-
throw result;
|
|
22
|
-
}
|
|
17
|
+
assertEq(result, '["[","a",",","b","]"]');
|
|
23
18
|
}
|
|
24
19
|
],
|
|
25
20
|
objectWrap: [
|
|
@@ -45,43 +40,31 @@ export const proof = {
|
|
|
45
40
|
stringSerialize: [
|
|
46
41
|
() => {
|
|
47
42
|
const result = JSON.stringify(toArray(stringSerialize('abc')));
|
|
48
|
-
|
|
49
|
-
throw result;
|
|
50
|
-
}
|
|
43
|
+
assertEq(result, '["\\"abc\\""]');
|
|
51
44
|
},
|
|
52
45
|
() => {
|
|
53
46
|
const result = JSON.stringify(toArray(stringSerialize('123')));
|
|
54
|
-
|
|
55
|
-
throw result;
|
|
56
|
-
}
|
|
47
|
+
assertEq(result, '["\\"123\\""]');
|
|
57
48
|
}
|
|
58
49
|
],
|
|
59
50
|
numberSerialize: [
|
|
60
51
|
() => {
|
|
61
52
|
const result = JSON.stringify(toArray(numberSerialize(123)));
|
|
62
|
-
|
|
63
|
-
throw result;
|
|
64
|
-
}
|
|
53
|
+
assertEq(result, '["123"]');
|
|
65
54
|
},
|
|
66
55
|
() => {
|
|
67
56
|
const result = JSON.stringify(toArray(numberSerialize(10e20)));
|
|
68
|
-
|
|
69
|
-
throw result;
|
|
70
|
-
}
|
|
57
|
+
assertEq(result, '["1e+21"]');
|
|
71
58
|
}
|
|
72
59
|
],
|
|
73
60
|
boolSerialize: [
|
|
74
61
|
() => {
|
|
75
62
|
const result = JSON.stringify(toArray(boolSerialize(false)));
|
|
76
|
-
|
|
77
|
-
throw result;
|
|
78
|
-
}
|
|
63
|
+
assertEq(result, '["false"]');
|
|
79
64
|
},
|
|
80
65
|
() => {
|
|
81
66
|
const result = JSON.stringify(toArray(boolSerialize(true)));
|
|
82
|
-
|
|
83
|
-
throw result;
|
|
84
|
-
}
|
|
67
|
+
assertEq(result, '["true"]');
|
|
85
68
|
}
|
|
86
69
|
]
|
|
87
70
|
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { type List } from '
|
|
2
|
-
import { type EofToken, type ErrorToken, type NumberToken, type StringToken } from '
|
|
1
|
+
import { type List } from '../../../types/list/module.f.ts';
|
|
2
|
+
import { type EofToken, type ErrorToken, type NumberToken, type StringToken } from '../../../js/tokenizer/module.f.ts';
|
|
3
3
|
export type JsonToken = {
|
|
4
4
|
readonly kind: 'true' | 'false' | 'null';
|
|
5
5
|
} | {
|
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
*
|
|
4
4
|
* @module
|
|
5
5
|
*/
|
|
6
|
-
import {} from
|
|
7
|
-
import { concat, empty, flat, stateScan } from
|
|
8
|
-
import { multiply } from
|
|
9
|
-
import { tokenize as jsTokenize } from
|
|
6
|
+
import {} from '../../../types/function/operator/module.f.js';
|
|
7
|
+
import { concat, empty, flat, stateScan } from '../../../types/list/module.f.js';
|
|
8
|
+
import { multiply } from '../../../types/bigfloat/module.f.js';
|
|
9
|
+
import { tokenize as jsTokenize } from '../../../js/tokenizer/module.f.js';
|
|
10
10
|
const mapToken = input => {
|
|
11
11
|
switch (input.kind) {
|
|
12
12
|
case '{':
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { tokenize } from
|
|
2
|
-
import { toArray } from
|
|
3
|
-
import { stringifyAsTree } from
|
|
4
|
-
import { sort } from
|
|
5
|
-
import { stringToList } from
|
|
1
|
+
import { tokenize } from './module.f.js';
|
|
2
|
+
import { toArray } from '../../../types/list/module.f.js';
|
|
3
|
+
import { stringifyAsTree } from '../../../djs/serializer/module.f.js';
|
|
4
|
+
import { sort } from '../../../types/object/module.f.js';
|
|
5
|
+
import { stringToList } from '../../../text/utf16/module.f.js';
|
|
6
6
|
const tokenizeString = s => toArray(tokenize(stringToList(s)));
|
|
7
7
|
const stringify = stringifyAsTree(sort);
|
|
8
8
|
export const proof = {
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Media-type detection entry point: dialect-tagged JSON recognition layered
|
|
3
|
+
* on top of the byte-signature / UTF-8 detector.
|
|
4
|
+
*
|
|
5
|
+
* `fjs/media/type` classifies raw bytes (magic-byte signatures, UTF-8
|
|
6
|
+
* text-vs-binary) with no notion of a JSON dialect. `detect` here adds one
|
|
7
|
+
* more classification step in front of it: when the whole blob is
|
|
8
|
+
* whole-blob-valid UTF-8 text (as `fjs/media/type` already determined), try
|
|
9
|
+
* parsing it as JSON and validating it against a known dialect's rtti schema
|
|
10
|
+
* (currently just `vnd.fjs.revision` — see `fjs/media/revision`). A match
|
|
11
|
+
* reports the dialect's derived media type; anything that isn't valid JSON,
|
|
12
|
+
* or doesn't validate against a known dialect, falls through to the
|
|
13
|
+
* `fjs/media/type` verdict unchanged.
|
|
14
|
+
*
|
|
15
|
+
* Detection is semantic, not syntactic: any JSON that satisfies a dialect's
|
|
16
|
+
* schema is recognized regardless of key order, whitespace, or any other
|
|
17
|
+
* serialization detail — there is no byte-level shortcut such as a
|
|
18
|
+
* `{"dialect":` prefix check.
|
|
19
|
+
*
|
|
20
|
+
* This only classifies an already-buffered `Vec` (`detectVec`'s single-`Vec`
|
|
21
|
+
* form), because dialect validation needs the whole parsed value. A single
|
|
22
|
+
* `Vec` already caps at `maxLength` bits (128 KiB — the same bound as the
|
|
23
|
+
* existing inline-content cap), so dialect detection is naturally
|
|
24
|
+
* size-bounded. The unbounded streaming detector (`fjs/media/type`
|
|
25
|
+
* `detectStream`) is untouched and stays a pure byte-signature/UTF-8
|
|
26
|
+
* classifier with no dialect awareness.
|
|
27
|
+
*
|
|
28
|
+
* @module
|
|
29
|
+
*/
|
|
30
|
+
import type { Vec } from '../types/bit_vec/module.f.ts';
|
|
31
|
+
import { type DetectMeta } from './type/module.f.ts';
|
|
32
|
+
/**
|
|
33
|
+
* Classifies a whole buffered `Vec`, the same three-way `{ length, mime_type,
|
|
34
|
+
* type }` shape as `fjs/media/type` `detectVec`, but with dialect-tagged JSON
|
|
35
|
+
* recognized ahead of the plain `text/plain` fallback.
|
|
36
|
+
*/
|
|
37
|
+
export declare const detect: (bytes: Vec) => DetectMeta;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { fromVec } from '../text/utf8/module.f.js';
|
|
2
|
+
import { detectVec } from './type/module.f.js';
|
|
3
|
+
import { decodeText as decodeRevisionText, mediaType as revisionMediaType } from './revision/module.f.js';
|
|
4
|
+
import { assertNotNullish } from '../asserts/module.f.js';
|
|
5
|
+
/**
|
|
6
|
+
* Classifies a whole buffered `Vec`, the same three-way `{ length, mime_type,
|
|
7
|
+
* type }` shape as `fjs/media/type` `detectVec`, but with dialect-tagged JSON
|
|
8
|
+
* recognized ahead of the plain `text/plain` fallback.
|
|
9
|
+
*/
|
|
10
|
+
export const detect = (bytes) => {
|
|
11
|
+
const base = detectVec(bytes);
|
|
12
|
+
// Only whole-blob-valid UTF-8 text can possibly be JSON; a magic-byte hit
|
|
13
|
+
// or binary fallback is never a dialect match.
|
|
14
|
+
if (base.type !== 'text') {
|
|
15
|
+
return base;
|
|
16
|
+
}
|
|
17
|
+
// `detectVec`'s `type: 'text'` verdict already means `bytes` is byte-aligned,
|
|
18
|
+
// whole-blob-valid UTF-8 — the same two conditions `fromVec` checks, via the
|
|
19
|
+
// same decoder — so `fromVec` cannot return `null` here.
|
|
20
|
+
const text = assertNotNullish(fromVec(bytes), 'detect: type text implies fromVec succeeds');
|
|
21
|
+
const [tag] = decodeRevisionText(text);
|
|
22
|
+
return tag === 'ok' ? { ...base, mime_type: revisionMediaType } : base;
|
|
23
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const proof: {
|
|
2
|
+
validRevision: () => void;
|
|
3
|
+
keyOrderIndependent: () => void;
|
|
4
|
+
invalidRevisionFallsThrough: () => void;
|
|
5
|
+
ordinaryJsonFallsThrough: () => void;
|
|
6
|
+
plainTextFallsThrough: () => void;
|
|
7
|
+
binaryFallsThrough: () => void;
|
|
8
|
+
largeNonJsonWithinBound: () => void;
|
|
9
|
+
};
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { assertEq } from '../asserts/module.f.js';
|
|
2
|
+
import { msb, u8ListToVec, repeat, vec8 } from '../types/bit_vec/module.f.js';
|
|
3
|
+
import { detect } from './module.f.js';
|
|
4
|
+
import { dialect } from './revision/module.f.js';
|
|
5
|
+
// All test strings here are ASCII, so char code === UTF-8 byte value.
|
|
6
|
+
const utf8Bytes = (s) => u8ListToVec(msb)([...s].map(c => c.charCodeAt(0)));
|
|
7
|
+
const revisionJson = `{"dialect":"${dialect}","subject":"8","parents":[],"snapshot":"8","generation":0}`;
|
|
8
|
+
export const proof = {
|
|
9
|
+
// A valid revision blob is recognized and reported under its derived media type.
|
|
10
|
+
validRevision: () => {
|
|
11
|
+
const m = detect(utf8Bytes(revisionJson));
|
|
12
|
+
assertEq(m.type, 'text');
|
|
13
|
+
assertEq(m.mime_type, 'application/vnd.fjs.revision+json');
|
|
14
|
+
},
|
|
15
|
+
// Key order carries no meaning: a valid revision whose `dialect` key is
|
|
16
|
+
// not first must still be detected.
|
|
17
|
+
keyOrderIndependent: () => {
|
|
18
|
+
const text = `{"parents":[],"subject":"8","dialect":"${dialect}","snapshot":"8","generation":0}`;
|
|
19
|
+
const m = detect(utf8Bytes(text));
|
|
20
|
+
assertEq(m.mime_type, 'application/vnd.fjs.revision+json');
|
|
21
|
+
},
|
|
22
|
+
// A revision missing a required field (here `snapshot` and `generation`)
|
|
23
|
+
// fails validation and falls through to the ordinary text/plain
|
|
24
|
+
// classification.
|
|
25
|
+
invalidRevisionFallsThrough: () => {
|
|
26
|
+
const text = `{"dialect":"${dialect}","subject":"8","parents":["8","r"]}`;
|
|
27
|
+
const m = detect(utf8Bytes(text));
|
|
28
|
+
assertEq(m.type, 'text');
|
|
29
|
+
assertEq(m.mime_type, 'text/plain');
|
|
30
|
+
},
|
|
31
|
+
// Ordinary JSON with no `dialect` field at all falls through unchanged.
|
|
32
|
+
ordinaryJsonFallsThrough: () => {
|
|
33
|
+
const m = detect(utf8Bytes('{"hello":"world"}'));
|
|
34
|
+
assertEq(m.type, 'text');
|
|
35
|
+
assertEq(m.mime_type, 'text/plain');
|
|
36
|
+
},
|
|
37
|
+
// Plain (non-JSON) text is unaffected.
|
|
38
|
+
plainTextFallsThrough: () => {
|
|
39
|
+
const m = detect(utf8Bytes('hello'));
|
|
40
|
+
assertEq(m.type, 'text');
|
|
41
|
+
assertEq(m.mime_type, 'text/plain');
|
|
42
|
+
},
|
|
43
|
+
// Binary content (magic-byte hit) is unaffected by dialect detection.
|
|
44
|
+
binaryFallsThrough: () => {
|
|
45
|
+
const m = detect(u8ListToVec(msb)([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]));
|
|
46
|
+
assertEq(m.type, 'base64');
|
|
47
|
+
assertEq(m.mime_type, 'image/png');
|
|
48
|
+
},
|
|
49
|
+
// A large blob is still bounded by the single-`Vec` `maxLength` cap; this
|
|
50
|
+
// only exercises that dialect detection doesn't change size handling for
|
|
51
|
+
// non-JSON content within that bound.
|
|
52
|
+
largeNonJsonWithinBound: () => {
|
|
53
|
+
const a = repeat(1000n)(vec8(0x61n)); // 1,000 bytes of 'a'
|
|
54
|
+
const m = detect(a);
|
|
55
|
+
assertEq(m.type, 'text');
|
|
56
|
+
assertEq(m.mime_type, 'text/plain');
|
|
57
|
+
},
|
|
58
|
+
};
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { type ValidationError } from '../../types/rtti/validate/module.f.ts';
|
|
2
|
+
import type { Ts } from '../../types/rtti/ts/module.f.ts';
|
|
3
|
+
import type { Unknown } from '../json/module.f.ts';
|
|
4
|
+
import { type Result } from '../../types/result/module.f.ts';
|
|
5
|
+
/**
|
|
6
|
+
* Format tag: names the dialect of this BLOB. The media type it is served
|
|
7
|
+
* with is derived mechanically: `application/` + `dialect` + `+json`.
|
|
8
|
+
*/
|
|
9
|
+
export declare const dialect: 'vnd.fjs.revision';
|
|
10
|
+
/** The media type derived from {@link dialect}: `application/vnd.fjs.revision+json`. */
|
|
11
|
+
export declare const mediaType: "application/vnd.fjs.revision+json";
|
|
12
|
+
/**
|
|
13
|
+
* rtti schema for the snapshot-reference type: a cbase32 CAS hash string.
|
|
14
|
+
*
|
|
15
|
+
* This is `string` at the rtti (structural) level — rtti schemas can't
|
|
16
|
+
* express string-content refinements — so cbase32 decodability, and the
|
|
17
|
+
* rejection of `https://` bridge URLs and any other location-addressed
|
|
18
|
+
* reference form, is enforced by {@link isHash} / {@link validate} below,
|
|
19
|
+
* not by this schema on its own.
|
|
20
|
+
*/
|
|
21
|
+
export declare const hash: import("../../types/rtti/module.f.ts").String;
|
|
22
|
+
/**
|
|
23
|
+
* rtti schema for a `revision` BLOB. See the README for the full semantics of
|
|
24
|
+
* each field; `dialect` is the type discriminant, matched here as an exact
|
|
25
|
+
* literal so structural validation alone rejects any other dialect's blob.
|
|
26
|
+
*/
|
|
27
|
+
export declare const revisionSchema: {
|
|
28
|
+
readonly dialect: "vnd.fjs.revision";
|
|
29
|
+
readonly subject: import("../../types/rtti/module.f.ts").String;
|
|
30
|
+
readonly parents: import("../../types/rtti/module.f.ts").Type1<"array", import("../../types/rtti/module.f.ts").String>;
|
|
31
|
+
readonly snapshot: import("../../types/rtti/module.f.ts").String;
|
|
32
|
+
readonly generation: import("../../types/rtti/module.f.ts").Number;
|
|
33
|
+
readonly archived: import("../../types/rtti/module.f.ts").Or<readonly [true, undefined]>;
|
|
34
|
+
};
|
|
35
|
+
/** The TypeScript type derived from {@link revisionSchema} — the single source of truth. */
|
|
36
|
+
export type Revision = Ts<typeof revisionSchema>;
|
|
37
|
+
/** True when `s` decodes as a cbase32 CAS hash (rejects `https://` and any other non-cbase32 string). */
|
|
38
|
+
export declare const isHash: (s: string) => boolean;
|
|
39
|
+
/** Either a structural validation error or a semantic (hash / generation) error message. */
|
|
40
|
+
export type RevisionError = ValidationError | string;
|
|
41
|
+
/**
|
|
42
|
+
* Checks the semantic refinements the structural schema can't express on an
|
|
43
|
+
* already shape-valid revision: every `parents` entry and the `snapshot` must
|
|
44
|
+
* decode as a cbase32 hash ({@link isHash}), and `generation` must be a
|
|
45
|
+
* non-negative *safe* integer. `subject` is not checked — it is an identity
|
|
46
|
+
* string, never a snapshot reference, so any string is valid.
|
|
47
|
+
*
|
|
48
|
+
* `generation` uses `Number.isSafeInteger`, not `Number.isInteger`: a value at
|
|
49
|
+
* or above `2 ** 53` passes `isInteger` but is no longer uniquely
|
|
50
|
+
* representable, so `1 + max(parents' generations)` — how a writer derives the
|
|
51
|
+
* next generation — can round back to the parent's value and fail to advance.
|
|
52
|
+
* Rejecting unsafe integers keeps stored generations exact.
|
|
53
|
+
*
|
|
54
|
+
* Both `snapshot` and `generation` are required by the schema, so no absence
|
|
55
|
+
* ever has to be resolved here: a revision states its content and its
|
|
56
|
+
* generation explicitly, and is fully interpretable in isolation (see the
|
|
57
|
+
* README). The former snapshot-resolution algorithm (subject-as-fallback,
|
|
58
|
+
* single-parent inheritance, multi-parent rejection) is gone.
|
|
59
|
+
*
|
|
60
|
+
* Exported separately from {@link validate} for callers that assemble a
|
|
61
|
+
* `Revision` themselves from already-typed fields (e.g. `fjs/cas/evo`'s
|
|
62
|
+
* `addRevision`): the shape is then guaranteed by TypeScript already, so only
|
|
63
|
+
* these semantic (string-only error) checks are worth re-running — routing
|
|
64
|
+
* through the combined structural-plus-semantic `validate` would add an
|
|
65
|
+
* unreachable structural-error branch on the caller's side.
|
|
66
|
+
*/
|
|
67
|
+
export declare const checkReferences: (r: Revision) => Result<Revision, string>;
|
|
68
|
+
/**
|
|
69
|
+
* Validates an already-parsed JSON value as a `revision` BLOB: structural
|
|
70
|
+
* (rtti) validation followed by the hash / generation semantic checks.
|
|
71
|
+
*/
|
|
72
|
+
export declare const validate: (value: Unknown) => Result<Revision, RevisionError>;
|
|
73
|
+
/**
|
|
74
|
+
* Decodes `text` as a `revision` BLOB: JSON-parses it, then validates it per
|
|
75
|
+
* {@link validate}. Detection is semantic, not syntactic — any JSON that
|
|
76
|
+
* satisfies the schema is a revision, regardless of key order or whitespace.
|
|
77
|
+
*/
|
|
78
|
+
export declare const decodeText: (text: string) => Result<Revision, RevisionError>;
|