functionalscript 0.44.0 → 0.46.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -3
- package/fjs/asn.1/module.f.mjs +8 -1
- package/fjs/asn.1/proof.f.d.mts +15 -0
- package/fjs/asn.1/proof.f.mjs +31 -3
- package/fjs/asserts/module.f.d.mts +14 -0
- package/fjs/asserts/module.f.mjs +20 -0
- package/fjs/asserts/proof.f.d.mts +3 -0
- package/fjs/asserts/proof.f.mjs +15 -1
- package/fjs/basen/base128/module.f.mjs +22 -5
- package/fjs/basen/base128/proof.f.d.mts +3 -1
- package/fjs/basen/base128/proof.f.mjs +3 -1
- package/fjs/basen/base64/module.f.mjs +7 -3
- package/fjs/basen/base64/proof.f.d.mts +3 -1
- package/fjs/basen/base64/proof.f.mjs +7 -4
- package/fjs/basen/cbase32/proof.f.d.mts +3 -1
- package/fjs/basen/cbase32/proof.f.mjs +3 -1
- package/fjs/bnf/data/module.f.d.mts +32 -6
- package/fjs/bnf/data/module.f.mjs +112 -7
- package/fjs/bnf/data/proof.f.d.mts +2 -0
- package/fjs/bnf/data/proof.f.mjs +74 -4
- package/fjs/bnf/data/types.d.ts +20 -2
- package/fjs/bnf/descent/module.f.d.mts +34 -5
- package/fjs/bnf/descent/module.f.mjs +176 -54
- package/fjs/bnf/descent/proof.f.d.mts +3 -0
- package/fjs/bnf/descent/proof.f.mjs +189 -27
- package/fjs/bnf/descent/types.d.ts +24 -18
- package/fjs/bnf/ll1/module.f.d.mts +74 -6
- package/fjs/bnf/ll1/module.f.mjs +297 -95
- package/fjs/bnf/ll1/proof.f.d.mts +17 -2
- package/fjs/bnf/ll1/proof.f.mjs +372 -137
- package/fjs/bnf/ll1/types.d.ts +25 -27
- package/fjs/bnf/matcher/module.f.d.mts +66 -0
- package/fjs/bnf/matcher/module.f.mjs +81 -0
- package/fjs/bnf/matcher/proof.f.d.mts +10 -0
- package/fjs/bnf/matcher/proof.f.mjs +79 -0
- package/fjs/bnf/matcher/types.d.ts +54 -0
- package/fjs/bnf/module.f.d.mts +15 -6
- package/fjs/bnf/module.f.mjs +52 -11
- package/fjs/bnf/proof.f.d.mts +2 -0
- package/fjs/bnf/proof.f.mjs +79 -3
- package/fjs/bnf/testlib.f.d.mts +31 -0
- package/fjs/bnf/testlib.f.mjs +80 -0
- package/fjs/bnf/token_symbol/module.f.d.mts +4 -3
- package/fjs/bnf/token_symbol/module.f.mjs +7 -6
- package/fjs/bnf/token_symbol/proof.f.mjs +5 -2
- package/fjs/bnf/token_symbol/types.d.ts +2 -2
- package/fjs/bnf/types.d.ts +10 -3
- package/fjs/cas/cli/module.f.d.mts +1 -1
- package/fjs/cas/cli/module.f.mjs +14 -20
- package/fjs/cas/cli/proof.f.d.mts +4 -4
- package/fjs/cas/cli/proof.f.mjs +47 -34
- package/fjs/cas/evo/module.f.d.mts +71 -31
- package/fjs/cas/evo/module.f.mjs +223 -138
- package/fjs/cas/evo/proof.f.d.mts +10 -1
- package/fjs/cas/evo/proof.f.mjs +311 -226
- package/fjs/cas/evo/types.d.ts +45 -9
- package/fjs/cas/module.f.d.mts +18 -32
- package/fjs/cas/module.f.mjs +164 -176
- package/fjs/cas/proof.f.d.mts +11 -8
- package/fjs/cas/proof.f.mjs +259 -147
- package/fjs/cas/types.d.ts +24 -10
- package/fjs/ci/common/module.f.d.mts +1 -1
- package/fjs/ci/common/module.f.mjs +1 -0
- package/fjs/ci/config/module.f.d.mts +3 -3
- package/fjs/ci/config/module.f.mjs +3 -3
- package/fjs/ci/module.f.d.mts +5 -5
- package/fjs/ci/module.f.mjs +8 -7
- package/fjs/ci/nix/module.f.d.mts +7 -5
- package/fjs/ci/nix/module.f.mjs +13 -12
- package/fjs/ci/nix/proof.f.d.mts +2 -0
- package/fjs/ci/nix/proof.f.mjs +4 -4
- package/fjs/ci/proof.f.d.mts +4 -2
- package/fjs/ci/proof.f.mjs +13 -8
- package/fjs/cli/module.f.d.mts +4 -6
- package/fjs/cli/module.f.mjs +4 -8
- package/fjs/cli/proof.f.d.mts +4 -2
- package/fjs/cli/proof.f.mjs +21 -18
- package/fjs/cli/types.d.ts +2 -3
- package/fjs/common/monoid/module.f.d.mts +70 -12
- package/fjs/common/monoid/module.f.mjs +177 -14
- package/fjs/common/monoid/proof.f.d.mts +12 -1
- package/fjs/common/monoid/proof.f.mjs +88 -4
- package/fjs/common/monoid/types.d.ts +23 -0
- package/fjs/crypto/hmac/module.f.mjs +2 -2
- package/fjs/crypto/secp/proof.f.d.mts +3 -1
- package/fjs/crypto/secp/proof.f.mjs +3 -1
- package/fjs/crypto/sha2/module.f.mjs +3 -1
- package/fjs/crypto/sha2/proof.f.d.mts +4 -1
- package/fjs/crypto/sha2/proof.f.mjs +27 -1
- package/fjs/crypto/sha2/types.d.ts +11 -0
- package/fjs/crypto/sign/module.f.mjs +2 -2
- package/fjs/crypto/vdf/module.f.d.mts +23 -4
- package/fjs/crypto/vdf/module.f.mjs +6 -4
- package/fjs/dev/module.f.d.mts +17 -5
- package/fjs/dev/module.f.mjs +60 -30
- package/fjs/dev/update/module.f.d.mts +11 -3
- package/fjs/dev/update/module.f.mjs +16 -11
- package/fjs/dev/update/proof.f.d.mts +4 -3
- package/fjs/dev/update/proof.f.mjs +11 -7
- package/fjs/djs/module.f.d.mts +13 -5
- package/fjs/djs/module.f.mjs +31 -16
- package/fjs/djs/parser/module.f.d.mts +16 -3
- package/fjs/djs/parser/module.f.mjs +135 -16
- package/fjs/djs/parser/proof.f.d.mts +8 -1
- package/fjs/djs/parser/proof.f.mjs +287 -13
- package/fjs/djs/parser/types.d.ts +7 -1
- package/fjs/djs/proof.f.d.mts +20 -1
- package/fjs/djs/proof.f.mjs +190 -12
- package/fjs/djs/serializer/module.f.d.mts +25 -8
- package/fjs/djs/serializer/module.f.mjs +66 -19
- package/fjs/djs/serializer/proof.f.d.mts +5 -0
- package/fjs/djs/serializer/proof.f.mjs +23 -1
- package/fjs/djs/tokenizer/module.f.d.mts +17 -5
- package/fjs/djs/tokenizer/module.f.mjs +120 -73
- package/fjs/djs/tokenizer/proof.f.d.mts +3 -0
- package/fjs/djs/tokenizer/proof.f.mjs +86 -67
- package/fjs/djs/transpiler/module.f.d.mts +13 -19
- package/fjs/djs/transpiler/module.f.mjs +79 -72
- package/fjs/djs/transpiler/types.d.ts +29 -0
- package/fjs/djs/types.d.ts +7 -1
- package/fjs/effects/list/module.f.d.mts +23 -12
- package/fjs/effects/list/module.f.mjs +16 -12
- package/fjs/effects/list/types.d.ts +27 -7
- package/fjs/effects/memory/module.f.d.mts +6 -3
- package/fjs/effects/memory/module.f.mjs +7 -7
- package/fjs/effects/memory/proof.f.d.mts +4 -0
- package/fjs/effects/memory/proof.f.mjs +18 -9
- package/fjs/effects/memory/types.d.ts +4 -3
- package/fjs/effects/mock/module.f.d.mts +28 -4
- package/fjs/effects/mock/module.f.mjs +39 -5
- package/fjs/effects/mock/types.d.ts +10 -1
- package/fjs/effects/module.d.mts +12 -2
- package/fjs/effects/module.f.d.mts +469 -281
- package/fjs/effects/module.f.mjs +538 -299
- package/fjs/effects/module.mjs +11 -2
- package/fjs/effects/node/memory/module.d.mts +7 -2
- package/fjs/effects/node/memory/module.mjs +9 -5
- package/fjs/effects/node/memory/proof.d.mts +2 -0
- package/fjs/effects/node/memory/proof.mjs +12 -5
- package/fjs/effects/node/module.d.mts +8 -2
- package/fjs/effects/node/module.f.d.mts +183 -43
- package/fjs/effects/node/module.f.mjs +260 -62
- package/fjs/effects/node/module.mjs +61 -50
- package/fjs/effects/node/proof.f.d.mts +28 -2
- package/fjs/effects/node/proof.f.mjs +161 -42
- package/fjs/effects/node/types.d.ts +106 -18
- package/fjs/effects/node/virtual/module.f.d.mts +21 -4
- package/fjs/effects/node/virtual/module.f.mjs +113 -70
- package/fjs/effects/node/virtual/proof.f.d.mts +31 -2
- package/fjs/effects/node/virtual/proof.f.mjs +201 -8
- package/fjs/effects/proof.f.d.mts +69 -34
- package/fjs/effects/proof.f.mjs +413 -130
- package/fjs/effects/types.d.ts +161 -33
- package/fjs/emergent_testing/all.test.d.mts +8 -0
- package/fjs/emergent_testing/all.test.mjs +14 -0
- package/fjs/emergent_testing/module.f.d.mts +22 -10
- package/fjs/emergent_testing/module.f.mjs +119 -85
- package/fjs/emergent_testing/proof.f.d.mts +21 -7
- package/fjs/emergent_testing/proof.f.mjs +169 -35
- package/fjs/emergent_testing/types.d.ts +22 -4
- package/fjs/fsc/bnf.f.d.mts +3 -0
- package/fjs/fsc/bnf.f.mjs +4 -1
- package/fjs/fsc/json.f.d.mts +3 -0
- package/fjs/fsc/json.f.mjs +4 -1
- package/fjs/fsc/module.f.d.mts +9 -0
- package/fjs/fsc/module.f.mjs +5 -3
- package/fjs/fsm/module.f.d.mts +14 -4
- package/fjs/fsm/module.f.mjs +54 -37
- package/fjs/fsm/proof.f.d.mts +5 -0
- package/fjs/fsm/proof.f.mjs +87 -115
- package/fjs/js/keywords/module.f.d.mts +52 -0
- package/fjs/js/keywords/module.f.mjs +72 -0
- package/fjs/{emergent_testing/scenarios/return-value.pass.d.ts → js/keywords/proof.f.d.mts} +1 -1
- package/fjs/js/keywords/proof.f.mjs +13 -0
- package/fjs/js/tokenizer/module.f.d.mts +30 -3
- package/fjs/js/tokenizer/module.f.mjs +161 -211
- package/fjs/js/tokenizer/proof.f.d.mts +1 -0
- package/fjs/js/tokenizer/proof.f.mjs +54 -24
- package/fjs/js/tokenizer/types.d.ts +33 -24
- package/fjs/mcp/cas/module.f.d.mts +1 -6
- package/fjs/mcp/cas/module.f.mjs +55 -51
- package/fjs/mcp/cas/proof.f.d.mts +15 -0
- package/fjs/mcp/cas/proof.f.mjs +174 -0
- package/fjs/mcp/evo/module.f.d.mts +19 -10
- package/fjs/mcp/evo/module.f.mjs +48 -27
- package/fjs/mcp/evo/proof.f.d.mts +6 -1
- package/fjs/mcp/evo/proof.f.mjs +115 -31
- package/fjs/mcp/module.f.d.mts +39 -4
- package/fjs/mcp/module.f.mjs +14 -12
- package/fjs/mcp/proof.f.d.mts +13 -1
- package/fjs/mcp/proof.f.mjs +120 -61
- package/fjs/media/html/module.f.d.mts +12 -0
- package/fjs/media/html/module.f.mjs +7 -5
- package/fjs/media/html/proof.f.d.mts +3 -0
- package/fjs/media/html/proof.f.mjs +4 -1
- package/fjs/media/json/extended/module.f.d.mts +82 -0
- package/fjs/media/json/extended/module.f.mjs +153 -0
- package/fjs/media/json/extended/proof.f.d.mts +42 -0
- package/fjs/media/json/extended/proof.f.mjs +127 -0
- package/fjs/media/json/extended/types.d.ts +23 -0
- package/fjs/media/json/module.f.d.mts +8 -2
- package/fjs/media/json/module.f.mjs +43 -41
- package/fjs/media/json/number/module.f.d.mts +59 -0
- package/fjs/media/json/number/module.f.mjs +136 -0
- package/fjs/media/json/number/proof.f.d.mts +24 -0
- package/fjs/media/json/number/proof.f.mjs +86 -0
- package/fjs/media/json/number/types.d.ts +28 -0
- package/fjs/media/json/parser/module.f.d.mts +25 -13
- package/fjs/media/json/parser/module.f.mjs +133 -72
- package/fjs/media/json/parser/proof.f.d.mts +5 -0
- package/fjs/media/json/parser/proof.f.mjs +31 -1
- package/fjs/media/json/parser/types.d.ts +38 -14
- package/fjs/media/json/rtti/module.f.d.mts +1 -1
- package/fjs/media/json/rtti/module.f.mjs +1 -1
- package/fjs/media/json/rtti/proof.f.d.mts +3 -0
- package/fjs/media/json/rtti/proof.f.mjs +12 -12
- package/fjs/media/json/schema/module.f.d.mts +61 -27
- package/fjs/media/json/schema/module.f.mjs +218 -63
- package/fjs/media/json/schema/proof.f.d.mts +41 -1
- package/fjs/media/json/schema/proof.f.mjs +220 -9
- package/fjs/media/json/serializer/module.f.d.mts +44 -0
- package/fjs/media/json/serializer/module.f.mjs +71 -9
- package/fjs/media/json/tokenizer/module.f.d.mts +8 -0
- package/fjs/media/json/tokenizer/module.f.mjs +31 -8
- package/fjs/media/json/tokenizer/proof.f.d.mts +6 -0
- package/fjs/media/json/tokenizer/proof.f.mjs +62 -21
- package/fjs/media/json/types.d.ts +36 -10
- package/fjs/media/lock/module.f.d.mts +100 -0
- package/fjs/media/lock/module.f.mjs +125 -0
- package/fjs/media/lock/proof.f.d.mts +33 -0
- package/fjs/media/lock/proof.f.mjs +196 -0
- package/fjs/media/lock/types.d.ts +15 -0
- package/fjs/media/module.f.d.mts +6 -5
- package/fjs/media/module.f.mjs +8 -7
- package/fjs/media/nix/module.f.d.mts +13 -0
- package/fjs/media/nix/module.f.mjs +4 -2
- package/fjs/media/nix/proof.f.d.mts +3 -0
- package/fjs/media/nix/proof.f.mjs +4 -1
- package/fjs/media/note/module.f.d.mts +121 -0
- package/fjs/media/note/module.f.mjs +131 -0
- package/fjs/media/note/proof.f.d.mts +29 -0
- package/fjs/media/note/proof.f.mjs +150 -0
- package/fjs/media/note/types.d.ts +10 -0
- package/fjs/media/proof.f.d.mts +4 -1
- package/fjs/media/proof.f.mjs +40 -21
- package/fjs/media/revision/module.f.d.mts +83 -7
- package/fjs/media/revision/module.f.mjs +127 -23
- package/fjs/media/revision/proof.f.d.mts +14 -0
- package/fjs/media/revision/proof.f.mjs +93 -2
- package/fjs/media/revision/types.d.ts +34 -5
- package/fjs/media/type/module.f.d.mts +53 -18
- package/fjs/media/type/module.f.mjs +87 -97
- package/fjs/media/type/proof.f.d.mts +17 -0
- package/fjs/media/type/proof.f.mjs +73 -13
- package/fjs/module.d.mts +5 -0
- package/fjs/module.f.d.mts +8 -0
- package/fjs/module.f.mjs +33 -10
- package/fjs/module.mjs +6 -0
- package/fjs/nanvm/proof.f.mjs +3 -3
- package/fjs/nanvm/rust/module.f.mjs +1 -1
- package/fjs/nanvm/update/module.f.d.mts +4 -4
- package/fjs/nanvm/update/module.f.mjs +8 -9
- package/fjs/nanvm/update/proof.f.mjs +4 -3
- package/fjs/path/module.f.d.mts +8 -0
- package/fjs/path/module.f.mjs +4 -2
- package/fjs/proof.f.d.mts +7 -3
- package/fjs/proof.f.mjs +41 -12
- package/fjs/protocol/json_rpc/module.f.d.mts +3 -3
- package/fjs/protocol/json_rpc/module.f.mjs +10 -7
- package/fjs/protocol/json_rpc/proof.f.d.mts +6 -0
- package/fjs/protocol/json_rpc/proof.f.mjs +26 -5
- package/fjs/protocol/mcp/module.f.d.mts +10 -13
- package/fjs/protocol/mcp/module.f.mjs +74 -58
- package/fjs/protocol/mcp/proof.f.d.mts +16 -3
- package/fjs/protocol/mcp/proof.f.mjs +224 -69
- package/fjs/protocol/mcp/stdio/module.f.d.mts +17 -11
- package/fjs/protocol/mcp/stdio/module.f.mjs +39 -33
- package/fjs/protocol/mcp/stdio/proof.f.d.mts +5 -3
- package/fjs/protocol/mcp/stdio/proof.f.mjs +46 -13
- package/fjs/protocol/mcp/stdio/types.d.ts +14 -0
- package/fjs/protocol/mcp/types.d.ts +17 -6
- package/fjs/sul/id/module.f.d.mts +4 -0
- package/fjs/sul/id/module.f.mjs +6 -6
- package/fjs/sul/level/hash/module.f.d.mts +4 -1
- package/fjs/sul/level/hash/module.f.mjs +6 -4
- package/fjs/sul/level/hash/proof.f.d.mts +4 -0
- package/fjs/sul/level/hash/proof.f.mjs +7 -4
- package/fjs/sul/level/literal/module.f.d.mts +4 -1
- package/fjs/sul/level/literal/module.f.mjs +4 -3
- package/fjs/sul/level/literal/proof.f.d.mts +3 -0
- package/fjs/sul/level/literal/proof.f.mjs +4 -1
- package/fjs/sul/module.f.d.mts +5 -3
- package/fjs/sul/module.f.mjs +23 -17
- package/fjs/sul/proof.f.d.mts +4 -0
- package/fjs/sul/proof.f.mjs +5 -2
- package/fjs/text/ascii/module.f.d.mts +26 -0
- package/fjs/text/ascii/module.f.mjs +49 -1
- package/fjs/text/ascii/proof.f.d.mts +10 -0
- package/fjs/text/ascii/proof.f.mjs +33 -1
- package/fjs/text/code_point/module.f.d.mts +29 -3
- package/fjs/text/code_point/module.f.mjs +32 -9
- package/fjs/text/code_point/proof.f.d.mts +2 -0
- package/fjs/text/code_point/proof.f.mjs +39 -0
- package/fjs/text/module.f.d.mts +4 -2
- package/fjs/text/module.f.mjs +4 -3
- package/fjs/text/proof.f.d.mts +3 -0
- package/fjs/text/proof.f.mjs +4 -1
- package/fjs/text/sgr/module.f.d.mts +6 -5
- package/fjs/text/sgr/module.f.mjs +8 -8
- package/fjs/text/sgr/proof.f.d.mts +3 -0
- package/fjs/text/sgr/proof.f.mjs +4 -1
- package/fjs/text/utf16/module.f.d.mts +5 -1
- package/fjs/text/utf16/module.f.mjs +38 -35
- package/fjs/text/utf16/proof.f.d.mts +3 -1
- package/fjs/text/utf16/proof.f.mjs +19 -2
- package/fjs/text/utf8/module.f.d.mts +9 -5
- package/fjs/text/utf8/module.f.mjs +20 -20
- package/fjs/types/array/module.f.d.mts +2 -1
- package/fjs/types/array/module.f.mjs +16 -4
- package/fjs/types/bigfloat/module.f.d.mts +21 -1
- package/fjs/types/bigfloat/module.f.mjs +33 -7
- package/fjs/types/bigfloat/proof.f.d.mts +1 -0
- package/fjs/types/bigfloat/proof.f.mjs +46 -0
- package/fjs/types/bigint/module.f.d.mts +4 -0
- package/fjs/types/bigint/module.f.mjs +4 -3
- package/fjs/types/bit_vec/module.f.d.mts +10 -16
- package/fjs/types/bit_vec/module.f.mjs +99 -95
- package/fjs/types/bit_vec/proof.f.d.mts +6 -0
- package/fjs/types/bit_vec/proof.f.mjs +31 -5
- package/fjs/types/btree/find/module.f.d.mts +5 -1
- package/fjs/types/btree/find/module.f.mjs +5 -5
- package/fjs/types/btree/find/proof.f.d.mts +5 -1
- package/fjs/types/btree/find/proof.f.mjs +5 -3
- package/fjs/types/btree/module.f.d.mts +3 -0
- package/fjs/types/btree/module.f.mjs +3 -2
- package/fjs/types/btree/proof.f.d.mts +5 -1
- package/fjs/types/btree/proof.f.mjs +5 -3
- package/fjs/types/btree/remove/module.f.d.mts +11 -0
- package/fjs/types/btree/remove/module.f.mjs +10 -10
- package/fjs/types/btree/remove/proof.f.d.mts +3 -0
- package/fjs/types/btree/remove/proof.f.mjs +4 -1
- package/fjs/types/btree/set/module.f.d.mts +9 -0
- package/fjs/types/btree/set/module.f.mjs +14 -17
- package/fjs/types/btree/set/proof.f.d.mts +3 -0
- package/fjs/types/btree/set/proof.f.mjs +16 -1
- package/fjs/types/btree/types/module.f.d.mts +2 -1
- package/fjs/types/btree/types/module.f.mjs +2 -1
- package/fjs/types/byte_set/module.f.d.mts +20 -4
- package/fjs/types/byte_set/module.f.mjs +18 -8
- package/fjs/types/byte_set/proof.f.d.mts +3 -1
- package/fjs/types/byte_set/proof.f.mjs +10 -8
- package/fjs/types/function/compare/module.f.d.mts +3 -2
- package/fjs/types/function/compare/module.f.mjs +13 -5
- package/fjs/types/function/module.f.d.mts +8 -1
- package/fjs/types/function/module.f.mjs +8 -1
- package/fjs/types/function/operator/module.f.d.mts +2 -1
- package/fjs/types/function/operator/module.f.mjs +2 -2
- package/fjs/types/list/module.f.d.mts +10 -3
- package/fjs/types/list/module.f.mjs +6 -4
- package/fjs/types/list/proof.f.d.mts +4 -1
- package/fjs/types/list/proof.f.mjs +4 -2
- package/fjs/types/nibble_set/module.f.d.mts +2 -1
- package/fjs/types/nibble_set/module.f.mjs +2 -2
- package/fjs/types/nominal/module.f.d.mts +2 -1
- package/fjs/types/nominal/module.f.mjs +2 -1
- package/fjs/types/nullable/module.f.d.mts +26 -6
- package/fjs/types/nullable/module.f.mjs +25 -6
- package/fjs/types/nullable/proof.f.d.mts +4 -0
- package/fjs/types/nullable/proof.f.mjs +15 -0
- package/fjs/types/number/module.f.d.mts +4 -0
- package/fjs/types/number/module.f.mjs +4 -3
- package/fjs/types/object/module.f.d.mts +26 -4
- package/fjs/types/object/module.f.mjs +26 -7
- package/fjs/types/object/proof.f.d.mts +5 -2
- package/fjs/types/object/proof.f.mjs +6 -3
- package/fjs/types/object/structurally_same/module.f.d.mts +39 -0
- package/fjs/types/object/structurally_same/module.f.mjs +59 -0
- package/fjs/types/object/structurally_same/proof.f.d.mts +6 -0
- package/fjs/types/object/structurally_same/proof.f.mjs +73 -0
- package/fjs/types/ordered_map/module.f.d.mts +5 -0
- package/fjs/types/ordered_map/module.f.mjs +5 -4
- package/fjs/types/ordered_map/proof.f.d.mts +3 -0
- package/fjs/types/ordered_map/proof.f.mjs +4 -1
- package/fjs/types/patricia_trie/module.f.d.mts +2 -1
- package/fjs/types/patricia_trie/module.f.mjs +27 -12
- package/fjs/types/patricia_trie/proof.f.d.mts +3 -0
- package/fjs/types/patricia_trie/proof.f.mjs +4 -1
- package/fjs/types/prime_field/module.f.d.mts +3 -1
- package/fjs/types/prime_field/module.f.mjs +3 -2
- package/fjs/types/range/module.f.d.mts +2 -1
- package/fjs/types/range/module.f.mjs +2 -2
- package/fjs/types/range_map/module.f.d.mts +6 -0
- package/fjs/types/range_map/module.f.mjs +6 -9
- package/fjs/types/range_map/proof.f.d.mts +5 -1
- package/fjs/types/range_map/proof.f.mjs +5 -3
- package/fjs/types/range_set/module.f.d.mts +5 -0
- package/fjs/types/range_set/module.f.mjs +1 -0
- package/fjs/types/range_set/proof.f.d.mts +3 -0
- package/fjs/types/range_set/proof.f.mjs +4 -1
- package/fjs/types/result/module.d.mts +8 -0
- package/fjs/types/result/module.f.d.mts +37 -7
- package/fjs/types/result/module.f.mjs +38 -8
- package/fjs/types/result/module.mjs +9 -1
- package/fjs/types/result/proof.f.d.mts +5 -0
- package/fjs/types/result/proof.f.mjs +22 -2
- package/fjs/types/rtti/common/module.f.d.mts +44 -14
- package/fjs/types/rtti/common/module.f.mjs +42 -36
- package/fjs/types/rtti/common/proof.f.d.mts +4 -0
- package/fjs/types/rtti/common/proof.f.mjs +10 -7
- package/fjs/types/rtti/data/module.f.d.mts +134 -0
- package/fjs/types/rtti/data/module.f.mjs +1053 -0
- package/fjs/types/rtti/data/proof.f.d.mts +76 -0
- package/fjs/types/rtti/data/proof.f.mjs +589 -0
- package/fjs/types/rtti/data/types.d.ts +83 -0
- package/fjs/types/rtti/module.f.d.mts +12 -5
- package/fjs/types/rtti/module.f.mjs +7 -5
- package/fjs/types/rtti/parse/module.f.d.mts +48 -0
- package/fjs/types/rtti/parse/module.f.mjs +45 -34
- package/fjs/types/rtti/parse/proof.f.d.mts +3 -2
- package/fjs/types/rtti/parse/proof.f.mjs +51 -52
- package/fjs/types/rtti/proof.f.d.mts +3 -1
- package/fjs/types/rtti/proof.f.mjs +6 -2
- package/fjs/types/rtti/ts/module.f.d.mts +68 -9
- package/fjs/types/rtti/ts/module.f.mjs +258 -30
- package/fjs/types/rtti/ts/proof.f.d.mts +44 -0
- package/fjs/types/rtti/ts/proof.f.mjs +152 -4
- package/fjs/types/rtti/ts/types.d.ts +25 -1
- package/fjs/types/rtti/types.d.ts +40 -0
- package/fjs/types/sorted_list/module.f.d.mts +4 -1
- package/fjs/types/sorted_list/module.f.mjs +21 -12
- package/fjs/types/sorted_list/proof.f.d.mts +3 -1
- package/fjs/types/sorted_list/proof.f.mjs +3 -1
- package/fjs/types/sorted_set/module.f.d.mts +49 -1
- package/fjs/types/sorted_set/module.f.mjs +26 -2
- package/fjs/types/sorted_set/proof.f.d.mts +4 -1
- package/fjs/types/sorted_set/proof.f.mjs +19 -2
- package/fjs/types/string/module.f.d.mts +4 -0
- package/fjs/types/string/module.f.mjs +4 -3
- package/fjs/types/string_set/module.f.d.mts +3 -1
- package/fjs/types/string_set/module.f.mjs +3 -2
- package/fjs/types/ts/module.f.d.mts +2 -0
- package/fjs/types/ts/module.f.mjs +3 -3
- package/fjs/types/ts/proof.f.d.mts +1 -0
- package/fjs/types/ts/proof.f.mjs +5 -0
- package/fjs/types/ts/types.d.ts +6 -1
- package/fjs/types/uint8array/module.f.d.mts +13 -2
- package/fjs/types/uint8array/module.f.mjs +20 -15
- package/fjs/website/module.f.d.mts +5 -2
- package/fjs/website/module.f.mjs +6 -8
- package/fjs/website/proof.f.mjs +2 -1
- package/package.json +3 -3
- package/fjs/asn.1/types.js +0 -6
- package/fjs/asserts/types.js +0 -6
- package/fjs/basen/types.js +0 -6
- package/fjs/bnf/data/types.js +0 -6
- package/fjs/bnf/descent/types.js +0 -6
- package/fjs/bnf/ll1/types.js +0 -6
- package/fjs/bnf/token_symbol/types.js +0 -6
- package/fjs/bnf/types.js +0 -6
- package/fjs/cas/evo/types.js +0 -7
- package/fjs/cas/types.js +0 -6
- package/fjs/ci/common/types.js +0 -1
- package/fjs/ci/nix/types.js +0 -6
- package/fjs/ci/types.js +0 -6
- package/fjs/cli/types.js +0 -6
- package/fjs/common/monoid/types.js +0 -6
- package/fjs/crypto/pow/types.js +0 -6
- package/fjs/crypto/secp/types.js +0 -6
- package/fjs/crypto/sha2/types.js +0 -6
- package/fjs/crypto/sign/types.js +0 -6
- package/fjs/crypto/vdf/types.js +0 -6
- package/fjs/dev/package_json/module.f.d.mts +0 -32
- package/fjs/dev/package_json/module.f.mjs +0 -37
- package/fjs/dev/package_json/proof.f.d.mts +0 -6
- package/fjs/dev/package_json/proof.f.mjs +0 -32
- package/fjs/dev/types.js +0 -6
- package/fjs/djs/ast/types.js +0 -8
- package/fjs/djs/parser/types.js +0 -7
- package/fjs/djs/tokenizer/types.js +0 -7
- package/fjs/djs/types.js +0 -7
- package/fjs/effects/eff/module.f.d.mts +0 -10
- package/fjs/effects/eff/module.f.mjs +0 -68
- package/fjs/effects/eff/proof.f.d.mts +0 -12
- package/fjs/effects/eff/proof.f.mjs +0 -66
- package/fjs/effects/eff/types.d.ts +0 -71
- package/fjs/effects/eff/types.js +0 -6
- package/fjs/effects/list/types.js +0 -6
- package/fjs/effects/memory/types.js +0 -6
- package/fjs/effects/mock/types.js +0 -6
- package/fjs/effects/node/types.js +0 -6
- package/fjs/effects/node/virtual/types.js +0 -7
- package/fjs/effects/types.js +0 -6
- package/fjs/emergent_testing/all.test.d.ts +0 -1
- package/fjs/emergent_testing/all.test.js +0 -5
- package/fjs/emergent_testing/scenarios/all.d.ts +0 -1
- package/fjs/emergent_testing/scenarios/all.js +0 -1
- package/fjs/emergent_testing/scenarios/async-subtests.fail.d.ts +0 -6
- package/fjs/emergent_testing/scenarios/async-subtests.fail.js +0 -9
- package/fjs/emergent_testing/scenarios/async-subtests.pass.d.ts +0 -6
- package/fjs/emergent_testing/scenarios/async-subtests.pass.js +0 -9
- package/fjs/emergent_testing/scenarios/async.fail.d.ts +0 -3
- package/fjs/emergent_testing/scenarios/async.fail.js +0 -6
- package/fjs/emergent_testing/scenarios/async.pass.d.ts +0 -3
- package/fjs/emergent_testing/scenarios/async.pass.js +0 -5
- package/fjs/emergent_testing/scenarios/fail.fail.d.ts +0 -3
- package/fjs/emergent_testing/scenarios/fail.fail.js +0 -3
- package/fjs/emergent_testing/scenarios/return-value.pass.js +0 -4
- package/fjs/emergent_testing/scenarios/thenable.pass.d.ts +0 -5
- package/fjs/emergent_testing/scenarios/thenable.pass.js +0 -11
- package/fjs/emergent_testing/scenarios/thenable2.pass.d.ts +0 -5
- package/fjs/emergent_testing/scenarios/thenable2.pass.js +0 -3
- package/fjs/emergent_testing/scenarios/throw.pass.d.ts +0 -5
- package/fjs/emergent_testing/scenarios/throw.pass.js +0 -3
- package/fjs/emergent_testing/types.js +0 -6
- package/fjs/js/tokenizer/types.js +0 -6
- package/fjs/media/html/types.js +0 -6
- package/fjs/media/json/parser/types.js +0 -6
- package/fjs/media/json/tokenizer/types.js +0 -6
- package/fjs/media/json/types.js +0 -13
- package/fjs/media/nix/types.js +0 -6
- package/fjs/media/revision/types.js +0 -8
- package/fjs/media/type/types.js +0 -6
- package/fjs/media/types.js +0 -7
- package/fjs/nanvm/types.js +0 -11
- package/fjs/protocol/json_rpc/types.js +0 -8
- package/fjs/protocol/mcp/types.js +0 -8
- package/fjs/sul/id/types.js +0 -6
- package/fjs/sul/level/hash/types.js +0 -6
- package/fjs/sul/level/literal/types.js +0 -6
- package/fjs/sul/types.js +0 -6
- package/fjs/text/sgr/types.js +0 -6
- package/fjs/text/types.js +0 -6
- package/fjs/text/utf16/types.js +0 -6
- package/fjs/text/utf8/types.js +0 -6
- package/fjs/types/array/types.js +0 -6
- package/fjs/types/bigfloat/types.js +0 -6
- package/fjs/types/bigint/types.js +0 -6
- package/fjs/types/bit_vec/types.js +0 -6
- package/fjs/types/btree/find/types.js +0 -6
- package/fjs/types/btree/types/types.js +0 -6
- package/fjs/types/byte_set/types.js +0 -6
- package/fjs/types/function/compare/types.js +0 -6
- package/fjs/types/function/operator/types.js +0 -6
- package/fjs/types/function/types.js +0 -6
- package/fjs/types/list/types.js +0 -6
- package/fjs/types/nibble_set/types.js +0 -6
- package/fjs/types/nominal/types.js +0 -6
- package/fjs/types/nullable/types.js +0 -6
- package/fjs/types/object/types.js +0 -8
- package/fjs/types/option/types.js +0 -6
- package/fjs/types/ordered_map/types.js +0 -6
- package/fjs/types/patricia_trie/types.js +0 -6
- package/fjs/types/phantom/types.js +0 -11
- package/fjs/types/prime_field/types.js +0 -6
- package/fjs/types/range/types.js +0 -6
- package/fjs/types/range_map/types.js +0 -6
- package/fjs/types/result/types.js +0 -6
- package/fjs/types/rtti/common/types.js +0 -1
- package/fjs/types/rtti/parse/types.js +0 -1
- package/fjs/types/rtti/ts/types.js +0 -1
- package/fjs/types/rtti/types.js +0 -1
- package/fjs/types/rtti/validate/module.f.d.mts +0 -6
- package/fjs/types/rtti/validate/module.f.mjs +0 -169
- package/fjs/types/rtti/validate/proof.f.d.mts +0 -125
- package/fjs/types/rtti/validate/proof.f.mjs +0 -437
- package/fjs/types/rtti/validate/types.d.ts +0 -6
- package/fjs/types/rtti/validate/types.js +0 -1
- package/fjs/types/sorted_list/types.js +0 -6
- package/fjs/types/sorted_set/types.js +0 -6
- package/fjs/types/string_set/types.js +0 -6
- package/fjs/types/ts/types.js +0 -8
|
@@ -7,6 +7,7 @@ import { toArray } from '../../../types/list/module.f.mjs'
|
|
|
7
7
|
import { stringifyAsTree } from '../../../djs/serializer/module.f.mjs'
|
|
8
8
|
import { sort } from '../../../types/object/module.f.mjs'
|
|
9
9
|
import { stringToList } from '../../../text/utf16/module.f.mjs'
|
|
10
|
+
import { assertStructurallySame } from '../../../asserts/module.f.mjs'
|
|
10
11
|
|
|
11
12
|
/** @type {(s: string) => readonly JsonToken[]} */
|
|
12
13
|
const tokenizeString = s => toArray(tokenize(stringToList(s)))
|
|
@@ -109,11 +110,11 @@ export const proof = {
|
|
|
109
110
|
},
|
|
110
111
|
() => {
|
|
111
112
|
const result = stringify(tokenizeString('0'))
|
|
112
|
-
if (result !== '[{"
|
|
113
|
+
if (result !== '[{"kind":"number","value":"0"},{"kind":"eof"}]') { throw result }
|
|
113
114
|
},
|
|
114
115
|
() => {
|
|
115
116
|
const result = stringify(tokenizeString('[0]'))
|
|
116
|
-
if (result !== '[{"kind":"["},{"
|
|
117
|
+
if (result !== '[{"kind":"["},{"kind":"number","value":"0"},{"kind":"]"},{"kind":"eof"}]') { throw result }
|
|
117
118
|
},
|
|
118
119
|
() => {
|
|
119
120
|
const result = stringify(tokenizeString('00'))
|
|
@@ -125,23 +126,23 @@ export const proof = {
|
|
|
125
126
|
},
|
|
126
127
|
() => {
|
|
127
128
|
const result = stringify(tokenizeString('123456789012345678901234567890'))
|
|
128
|
-
if (result !== '[{"
|
|
129
|
+
if (result !== '[{"kind":"number","value":"123456789012345678901234567890"},{"kind":"eof"}]') { throw result }
|
|
129
130
|
},
|
|
130
131
|
() => {
|
|
131
132
|
const result = stringify(tokenizeString('{90}'))
|
|
132
|
-
if (result !== '[{"kind":"{"},{"
|
|
133
|
+
if (result !== '[{"kind":"{"},{"kind":"number","value":"90"},{"kind":"}"},{"kind":"eof"}]') { throw result }
|
|
133
134
|
},
|
|
134
135
|
() => {
|
|
135
136
|
const result = stringify(tokenizeString('1 2'))
|
|
136
|
-
if (result !== '[{"
|
|
137
|
+
if (result !== '[{"kind":"number","value":"1"},{"kind":"number","value":"2"},{"kind":"eof"}]') { throw result }
|
|
137
138
|
},
|
|
138
139
|
() => {
|
|
139
140
|
const result = stringify(tokenizeString('0. 2'))
|
|
140
|
-
if (result !== '[{"kind":"error","message":"invalid number"},{"
|
|
141
|
+
if (result !== '[{"kind":"error","message":"invalid number"},{"kind":"number","value":"2"},{"kind":"eof"}]') { throw result }
|
|
141
142
|
},
|
|
142
143
|
() => {
|
|
143
144
|
const result = stringify(tokenizeString('10-0'))
|
|
144
|
-
if (result !== '[{"
|
|
145
|
+
if (result !== '[{"kind":"number","value":"10"},{"kind":"number","value":"-0"},{"kind":"eof"}]') { throw result }
|
|
145
146
|
},
|
|
146
147
|
() => {
|
|
147
148
|
const result = stringify(tokenizeString('9a:'))
|
|
@@ -149,7 +150,7 @@ export const proof = {
|
|
|
149
150
|
},
|
|
150
151
|
() => {
|
|
151
152
|
const result = stringify(tokenizeString('-10'))
|
|
152
|
-
if (result !== '[{"
|
|
153
|
+
if (result !== '[{"kind":"number","value":"-10"},{"kind":"eof"}]') { throw result }
|
|
153
154
|
},
|
|
154
155
|
() => {
|
|
155
156
|
const result = stringify(tokenizeString('-'))
|
|
@@ -165,7 +166,7 @@ export const proof = {
|
|
|
165
166
|
},
|
|
166
167
|
() => {
|
|
167
168
|
const result = stringify(tokenizeString('-0'))
|
|
168
|
-
if (result !== '[{"
|
|
169
|
+
if (result !== '[{"kind":"number","value":"-0"},{"kind":"eof"}]') { throw result }
|
|
169
170
|
},
|
|
170
171
|
() => {
|
|
171
172
|
const result = stringify(tokenizeString('-00'))
|
|
@@ -173,15 +174,15 @@ export const proof = {
|
|
|
173
174
|
},
|
|
174
175
|
() => {
|
|
175
176
|
const result = stringify(tokenizeString('-.123'))
|
|
176
|
-
if (result !== '[{"kind":"error","message":"invalid token"},{"kind":"error","message":"invalid token"},{"
|
|
177
|
+
if (result !== '[{"kind":"error","message":"invalid token"},{"kind":"error","message":"invalid token"},{"kind":"number","value":"123"},{"kind":"eof"}]') { throw result }
|
|
177
178
|
},
|
|
178
179
|
() => {
|
|
179
180
|
const result = stringify(tokenizeString('0.01'))
|
|
180
|
-
if (result !== '[{"
|
|
181
|
+
if (result !== '[{"kind":"number","value":"0.01"},{"kind":"eof"}]') { throw result }
|
|
181
182
|
},
|
|
182
183
|
() => {
|
|
183
184
|
const result = stringify(tokenizeString('-0.9'))
|
|
184
|
-
if (result !== '[{"
|
|
185
|
+
if (result !== '[{"kind":"number","value":"-0.9"},{"kind":"eof"}]') { throw result }
|
|
185
186
|
},
|
|
186
187
|
() => {
|
|
187
188
|
const result = stringify(tokenizeString('-0.'))
|
|
@@ -193,11 +194,11 @@ export const proof = {
|
|
|
193
194
|
},
|
|
194
195
|
() => {
|
|
195
196
|
const result = stringify(tokenizeString('12.34'))
|
|
196
|
-
if (result !== '[{"
|
|
197
|
+
if (result !== '[{"kind":"number","value":"12.34"},{"kind":"eof"}]') { throw result }
|
|
197
198
|
},
|
|
198
199
|
() => {
|
|
199
200
|
const result = stringify(tokenizeString('-12.00'))
|
|
200
|
-
if (result !== '[{"
|
|
201
|
+
if (result !== '[{"kind":"number","value":"-12.00"},{"kind":"eof"}]') { throw result }
|
|
201
202
|
},
|
|
202
203
|
() => {
|
|
203
204
|
const result = stringify(tokenizeString('-12.'))
|
|
@@ -209,27 +210,27 @@ export const proof = {
|
|
|
209
210
|
},
|
|
210
211
|
() => {
|
|
211
212
|
const result = stringify(tokenizeString('0e1'))
|
|
212
|
-
if (result !== '[{"
|
|
213
|
+
if (result !== '[{"kind":"number","value":"0e1"},{"kind":"eof"}]') { throw result }
|
|
213
214
|
},
|
|
214
215
|
() => {
|
|
215
216
|
const result = stringify(tokenizeString('0e+2'))
|
|
216
|
-
if (result !== '[{"
|
|
217
|
+
if (result !== '[{"kind":"number","value":"0e+2"},{"kind":"eof"}]') { throw result }
|
|
217
218
|
},
|
|
218
219
|
() => {
|
|
219
220
|
const result = stringify(tokenizeString('0e-0'))
|
|
220
|
-
if (result !== '[{"
|
|
221
|
+
if (result !== '[{"kind":"number","value":"0e-0"},{"kind":"eof"}]') { throw result }
|
|
221
222
|
},
|
|
222
223
|
() => {
|
|
223
224
|
const result = stringify(tokenizeString('12e0000'))
|
|
224
|
-
if (result !== '[{"
|
|
225
|
+
if (result !== '[{"kind":"number","value":"12e0000"},{"kind":"eof"}]') { throw result }
|
|
225
226
|
},
|
|
226
227
|
() => {
|
|
227
228
|
const result = stringify(tokenizeString('-12e-0001'))
|
|
228
|
-
if (result !== '[{"
|
|
229
|
+
if (result !== '[{"kind":"number","value":"-12e-0001"},{"kind":"eof"}]') { throw result }
|
|
229
230
|
},
|
|
230
231
|
() => {
|
|
231
232
|
const result = stringify(tokenizeString('-12.34e1234'))
|
|
232
|
-
if (result !== '[{"
|
|
233
|
+
if (result !== '[{"kind":"number","value":"-12.34e1234"},{"kind":"eof"}]') { throw result }
|
|
233
234
|
},
|
|
234
235
|
() => {
|
|
235
236
|
const result = stringify(tokenizeString('0e'))
|
|
@@ -287,5 +288,45 @@ export const proof = {
|
|
|
287
288
|
const result = stringify(tokenizeString('[null]'))
|
|
288
289
|
if (result !== '[{"kind":"["},{"kind":"null"},{"kind":"]"},{"kind":"eof"}]') { throw result }
|
|
289
290
|
},
|
|
290
|
-
]
|
|
291
|
+
],
|
|
292
|
+
// Losslessness starts at the tokenizer boundary: a syntactically valid
|
|
293
|
+
// JSON number reaches `NumberToken.value` as its exact lexeme. Nothing
|
|
294
|
+
// derived from it — a coefficient bigint, an exponent number — is built
|
|
295
|
+
// while scanning, so no valid input can fail to tokenize because such a
|
|
296
|
+
// derived value would exceed a runtime numeric limit.
|
|
297
|
+
//
|
|
298
|
+
// The runtime's own bigint limit (V8 rejects magnitudes above 2^30 bits,
|
|
299
|
+
// roughly 3.2e8 decimal digits) is not exercised here: the smallest input
|
|
300
|
+
// that reaches it is a JSON document of some hundreds of megabytes. These
|
|
301
|
+
// cases stay far below that while still being far above what `number` and
|
|
302
|
+
// `Number.MAX_SAFE_INTEGER` can hold.
|
|
303
|
+
lossless: {
|
|
304
|
+
// a coefficient with more digits than any JavaScript number can carry
|
|
305
|
+
oversizedCoefficient: () => {
|
|
306
|
+
const value = `1${'0'.repeat(100000)}1`
|
|
307
|
+
assertStructurallySame(
|
|
308
|
+
tokenizeString(value),
|
|
309
|
+
[{ kind: 'number', value }, { kind: 'eof' }])
|
|
310
|
+
},
|
|
311
|
+
// exponent text far beyond JavaScript-number precision: `Number` of it
|
|
312
|
+
// is `Infinity`, yet every digit still has to reach the token
|
|
313
|
+
unboundedExponent: () => {
|
|
314
|
+
const value = '1e999999999999999999999'
|
|
315
|
+
assertStructurallySame(
|
|
316
|
+
tokenizeString(value),
|
|
317
|
+
[{ kind: 'number', value }, { kind: 'eof' }])
|
|
318
|
+
},
|
|
319
|
+
negativeUnboundedExponent: () => {
|
|
320
|
+
const value = '-1.5e-999999999999999999999'
|
|
321
|
+
assertStructurallySame(
|
|
322
|
+
tokenizeString(value),
|
|
323
|
+
[{ kind: 'number', value }, { kind: 'eof' }])
|
|
324
|
+
},
|
|
325
|
+
negativeOversized: () => {
|
|
326
|
+
const value = `-1${'0'.repeat(100000)}1`
|
|
327
|
+
assertStructurallySame(
|
|
328
|
+
tokenizeString(value),
|
|
329
|
+
[{ kind: 'number', value }, { kind: 'eof' }])
|
|
330
|
+
},
|
|
331
|
+
},
|
|
291
332
|
}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* TypeScript counterparts of the JSON data model: `Primitive`, `Unknown`,
|
|
3
|
-
* `Object`, and `Array
|
|
3
|
+
* `Object`, and `Array`, plus the leaf-parameterized `Tree` they instantiate.
|
|
4
4
|
*
|
|
5
5
|
* `Unknown` is written by hand rather than derived, so that the recursion
|
|
6
6
|
* reads directly, and is then pinned against the rtti schemas in the sibling
|
|
7
7
|
* [`./rtti/module.f.mjs`](./rtti/module.f.mjs) with
|
|
8
8
|
* `Assert<Equal<Unknown, Ts<typeof unknown>>>`. The pin is what keeps the two
|
|
9
|
-
* descriptions of the same data model from drifting apart
|
|
9
|
+
* descriptions of the same data model from drifting apart — and it holds the
|
|
10
|
+
* `Tree<Primitive>` spelling to the same data model the schemas describe.
|
|
10
11
|
*
|
|
11
12
|
* @module
|
|
12
13
|
*/
|
|
@@ -14,12 +15,37 @@ import type { Entry as ObjectEntry } from '../../types/object/types.ts';
|
|
|
14
15
|
import type { Ts } from '../../types/rtti/ts/types.ts';
|
|
15
16
|
import type { primitive } from './rtti/module.f.mjs';
|
|
16
17
|
import type { List } from '../../types/list/types.ts';
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
/**
|
|
19
|
+
* A recursive JSON-shaped tree over a leaf type `P`: JSON's container
|
|
20
|
+
* structure with its primitive set left open.
|
|
21
|
+
*
|
|
22
|
+
* The parser and the serializer are written once against this shape and are
|
|
23
|
+
* instantiated per numeric policy — `Tree<Primitive>` is ordinary JSON,
|
|
24
|
+
* `Tree<ExtendedPrimitive>` (see
|
|
25
|
+
* [`./extended/types.ts`](./extended/types.ts)) adds `bigint` to the leaves.
|
|
26
|
+
*
|
|
27
|
+
* `TreeObject`'s index signature is **optional** on purpose: reading an
|
|
28
|
+
* arbitrary key off a JSON-shaped object yields `undefined` when the property
|
|
29
|
+
* is absent, and `undefined` is not a leaf of any of these trees. A required
|
|
30
|
+
* index signature would type every missing property as a value.
|
|
31
|
+
*/
|
|
32
|
+
export type Tree<P> = P | TreeObject<P> | TreeArray<P>;
|
|
33
|
+
export type TreeObject<P> = {
|
|
34
|
+
readonly [k in string]?: Tree<P>;
|
|
21
35
|
};
|
|
22
|
-
export type
|
|
23
|
-
export type
|
|
24
|
-
export type
|
|
25
|
-
export type
|
|
36
|
+
export type TreeArray<P> = readonly Tree<P>[];
|
|
37
|
+
export type Primitive = Ts<typeof primitive>;
|
|
38
|
+
export type Unknown = Tree<Primitive>;
|
|
39
|
+
export type Object = TreeObject<Primitive>;
|
|
40
|
+
export type Array = TreeArray<Primitive>;
|
|
41
|
+
export type TreeEntry<P> = ObjectEntry<Tree<P>>;
|
|
42
|
+
export type TreeEntries<P> = List<TreeEntry<P>>;
|
|
43
|
+
/**
|
|
44
|
+
* How a serializer orders an object's entries — `sort` for canonical output,
|
|
45
|
+
* `identity` to keep insertion order. It is a per-leaf-type alias only because
|
|
46
|
+
* the entries it reorders carry the tree's own leaves.
|
|
47
|
+
*/
|
|
48
|
+
export type TreeMapEntries<P> = (entries: TreeEntries<P>) => TreeEntries<P>;
|
|
49
|
+
export type Entry = TreeEntry<Primitive>;
|
|
50
|
+
export type _Entries = TreeEntries<Primitive>;
|
|
51
|
+
export type _MapEntries = TreeMapEntries<Primitive>;
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `vnd.fjs.lock` — a lock map as a BLOB of its own, so several revisions can
|
|
3
|
+
* point at one agreed resolution instead of each carrying a copy.
|
|
4
|
+
*
|
|
5
|
+
* `vnd.fjs.revision`'s `lock` is an inline map, which keeps a revision
|
|
6
|
+
* interpretable in isolation but re-serializes the whole map into a new blob
|
|
7
|
+
* every time anything else about the revision changes — CAS deduplicates whole
|
|
8
|
+
* blobs, not fragments. This dialect is that map, alone: no `subject`,
|
|
9
|
+
* `parents`, `generation`, or `archived`, because it is a **value**, not a
|
|
10
|
+
* step. History for lock content, when someone wants it, is an ordinary
|
|
11
|
+
* revision whose `snapshot` is one of these blobs, so no second history
|
|
12
|
+
* mechanism appears and `revision` stays the only one.
|
|
13
|
+
*
|
|
14
|
+
* The `lock` schema and its semantic check are **imported** from
|
|
15
|
+
* `fjs/media/revision`, not restated: one recursive schema, one hash check,
|
|
16
|
+
* one canonical serialization, so a map means the same thing inline and shared
|
|
17
|
+
* and the two forms cannot drift (`proof.f.mjs` pins the bytes).
|
|
18
|
+
*
|
|
19
|
+
* Like its sibling, this module is the pure format only: the rtti schema, the
|
|
20
|
+
* `dialect` tag, and decode/validate. Whether a referenced blob exists, and
|
|
21
|
+
* what its bindings mean once fetched, stay a resolver's business.
|
|
22
|
+
*
|
|
23
|
+
* See `README.md` for the full spec.
|
|
24
|
+
*
|
|
25
|
+
* @module
|
|
26
|
+
*
|
|
27
|
+
* @import { Unknown } from '../json/types.ts'
|
|
28
|
+
* @import { Result } from '../../types/result/types.ts'
|
|
29
|
+
* @import { DialectEntry } from '../types.ts'
|
|
30
|
+
* @import { Lock, LockError } from './types.ts'
|
|
31
|
+
*/
|
|
32
|
+
import type { Unknown } from '../json/types.ts';
|
|
33
|
+
import type { Result } from '../../types/result/types.ts';
|
|
34
|
+
import type { DialectEntry } from '../types.ts';
|
|
35
|
+
import type { Lock, LockError } from './types.ts';
|
|
36
|
+
/**
|
|
37
|
+
* Format tag: names the dialect of this BLOB. The media type it is served
|
|
38
|
+
* with is derived mechanically: `application/` + `dialect` + `+json`.
|
|
39
|
+
*/
|
|
40
|
+
export declare const dialect: 'vnd.fjs.lock';
|
|
41
|
+
/** The media type derived from {@link dialect}: `application/vnd.fjs.lock+json`. */
|
|
42
|
+
export declare const mediaType: "application/vnd.fjs.lock+json";
|
|
43
|
+
/**
|
|
44
|
+
* rtti schema for a `lock` BLOB: the dialect tag and the map, nothing else.
|
|
45
|
+
*
|
|
46
|
+
* `lock` is `fjs/media/revision`'s own schema, so the shared form admits
|
|
47
|
+
* exactly the maps the inline form does, to the same depth, with the same
|
|
48
|
+
* value domain.
|
|
49
|
+
*
|
|
50
|
+
* The field is **required** and may be `{}`: an absent map and an empty one
|
|
51
|
+
* would otherwise be two spellings of one blob, and a blob whose only purpose
|
|
52
|
+
* is to hold a map has nothing to say when it does not. It is also never a
|
|
53
|
+
* hash — a lock blob does not reference further lock blobs (see the README's
|
|
54
|
+
* [Composition](./README.md#composition)), so following a reference always
|
|
55
|
+
* terminates in one step.
|
|
56
|
+
*/
|
|
57
|
+
export declare const lockSchema: {
|
|
58
|
+
readonly dialect: "vnd.fjs.lock";
|
|
59
|
+
readonly lock: import("../revision/types.ts").LockSchema;
|
|
60
|
+
};
|
|
61
|
+
/** Serializes a lock blob canonically, recursively sorting every object's property names.
|
|
62
|
+
* @type {(lock: Lock) => string}
|
|
63
|
+
*/
|
|
64
|
+
export declare const encodeText: (lock: Lock) => string;
|
|
65
|
+
/**
|
|
66
|
+
* Checks the semantic refinement the structural schema can't express on an
|
|
67
|
+
* already shape-valid lock blob: every direct value at every depth of the map
|
|
68
|
+
* must decode as a cbase32 hash. This is `fjs/media/revision`'s own
|
|
69
|
+
* `lockMapError`, so a map rejected inline is rejected here and vice versa.
|
|
70
|
+
*
|
|
71
|
+
* Exported separately from {@link validate} for callers holding an
|
|
72
|
+
* already-typed `Lock` — the same split, for the same reason, as the revision
|
|
73
|
+
* dialect's `checkReferences`.
|
|
74
|
+
*
|
|
75
|
+
* @type {(l: Lock) => Result<Lock, string>}
|
|
76
|
+
*/
|
|
77
|
+
export declare const checkReferences: (l: Lock) => Result<Lock, string>;
|
|
78
|
+
/**
|
|
79
|
+
* Validates an already-parsed JSON value as a `lock` BLOB: structural (rtti)
|
|
80
|
+
* validation followed by the hash semantic check.
|
|
81
|
+
*
|
|
82
|
+
* @type {(value: Unknown) => Result<Lock, LockError>}
|
|
83
|
+
*/
|
|
84
|
+
export declare const validate: (value: Unknown) => Result<Lock, LockError>;
|
|
85
|
+
/**
|
|
86
|
+
* Decodes `text` as a `lock` BLOB: JSON-parses it, then validates it per
|
|
87
|
+
* {@link validate}. Detection is semantic, not syntactic — any JSON that
|
|
88
|
+
* satisfies the schema is a lock blob, regardless of key order or whitespace.
|
|
89
|
+
*
|
|
90
|
+
* @type {(text: string) => Result<Lock, LockError>}
|
|
91
|
+
*/
|
|
92
|
+
export declare const decodeText: (text: string) => Result<Lock, LockError>;
|
|
93
|
+
/**
|
|
94
|
+
* This dialect as a registry entry for `fjs/media`'s `detect`. It carries the
|
|
95
|
+
* semantic check too, so a blob is detected as `vnd.fjs.lock` exactly when
|
|
96
|
+
* {@link decodeText} would accept it.
|
|
97
|
+
*
|
|
98
|
+
* @type {DialectEntry}
|
|
99
|
+
*/
|
|
100
|
+
export declare const lockDialect: DialectEntry;
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `vnd.fjs.lock` — a lock map as a BLOB of its own, so several revisions can
|
|
3
|
+
* point at one agreed resolution instead of each carrying a copy.
|
|
4
|
+
*
|
|
5
|
+
* `vnd.fjs.revision`'s `lock` is an inline map, which keeps a revision
|
|
6
|
+
* interpretable in isolation but re-serializes the whole map into a new blob
|
|
7
|
+
* every time anything else about the revision changes — CAS deduplicates whole
|
|
8
|
+
* blobs, not fragments. This dialect is that map, alone: no `subject`,
|
|
9
|
+
* `parents`, `generation`, or `archived`, because it is a **value**, not a
|
|
10
|
+
* step. History for lock content, when someone wants it, is an ordinary
|
|
11
|
+
* revision whose `snapshot` is one of these blobs, so no second history
|
|
12
|
+
* mechanism appears and `revision` stays the only one.
|
|
13
|
+
*
|
|
14
|
+
* The `lock` schema and its semantic check are **imported** from
|
|
15
|
+
* `fjs/media/revision`, not restated: one recursive schema, one hash check,
|
|
16
|
+
* one canonical serialization, so a map means the same thing inline and shared
|
|
17
|
+
* and the two forms cannot drift (`proof.f.mjs` pins the bytes).
|
|
18
|
+
*
|
|
19
|
+
* Like its sibling, this module is the pure format only: the rtti schema, the
|
|
20
|
+
* `dialect` tag, and decode/validate. Whether a referenced blob exists, and
|
|
21
|
+
* what its bindings mean once fetched, stay a resolver's business.
|
|
22
|
+
*
|
|
23
|
+
* See `README.md` for the full spec.
|
|
24
|
+
*
|
|
25
|
+
* @module
|
|
26
|
+
*
|
|
27
|
+
* @import { Unknown } from '../json/types.ts'
|
|
28
|
+
* @import { Result } from '../../types/result/types.ts'
|
|
29
|
+
* @import { DialectEntry } from '../types.ts'
|
|
30
|
+
* @import { Lock, LockError } from './types.ts'
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
import { parse as rttiParse } from '../../types/rtti/parse/module.f.mjs'
|
|
34
|
+
import { parse as parseJson, stringify } from '../json/module.f.mjs'
|
|
35
|
+
import { error, ok, okThen } from '../../types/result/module.f.mjs'
|
|
36
|
+
import { dialectEntry } from '../module.f.mjs'
|
|
37
|
+
import { sort } from '../../types/object/module.f.mjs'
|
|
38
|
+
import { lock, lockMapError } from '../revision/module.f.mjs'
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Format tag: names the dialect of this BLOB. The media type it is served
|
|
42
|
+
* with is derived mechanically: `application/` + `dialect` + `+json`.
|
|
43
|
+
*/
|
|
44
|
+
export const dialect = /** @type {const} */ ('vnd.fjs.lock')
|
|
45
|
+
|
|
46
|
+
/** The media type derived from {@link dialect}: `application/vnd.fjs.lock+json`. */
|
|
47
|
+
export const mediaType = /** @type {const} */ (`application/${dialect}+json`)
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* rtti schema for a `lock` BLOB: the dialect tag and the map, nothing else.
|
|
51
|
+
*
|
|
52
|
+
* `lock` is `fjs/media/revision`'s own schema, so the shared form admits
|
|
53
|
+
* exactly the maps the inline form does, to the same depth, with the same
|
|
54
|
+
* value domain.
|
|
55
|
+
*
|
|
56
|
+
* The field is **required** and may be `{}`: an absent map and an empty one
|
|
57
|
+
* would otherwise be two spellings of one blob, and a blob whose only purpose
|
|
58
|
+
* is to hold a map has nothing to say when it does not. It is also never a
|
|
59
|
+
* hash — a lock blob does not reference further lock blobs (see the README's
|
|
60
|
+
* [Composition](./README.md#composition)), so following a reference always
|
|
61
|
+
* terminates in one step.
|
|
62
|
+
*/
|
|
63
|
+
export const lockSchema = /** @type {const} */ ({
|
|
64
|
+
dialect,
|
|
65
|
+
lock,
|
|
66
|
+
})
|
|
67
|
+
|
|
68
|
+
/** Serializes a lock blob canonically, recursively sorting every object's property names.
|
|
69
|
+
* @type {(lock: Lock) => string}
|
|
70
|
+
*/
|
|
71
|
+
export const encodeText = stringify(sort)
|
|
72
|
+
|
|
73
|
+
/** Structural-only validator: checks the shape, not the hash semantics. */
|
|
74
|
+
const validateShape = rttiParse(lockSchema)
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Checks the semantic refinement the structural schema can't express on an
|
|
78
|
+
* already shape-valid lock blob: every direct value at every depth of the map
|
|
79
|
+
* must decode as a cbase32 hash. This is `fjs/media/revision`'s own
|
|
80
|
+
* `lockMapError`, so a map rejected inline is rejected here and vice versa.
|
|
81
|
+
*
|
|
82
|
+
* Exported separately from {@link validate} for callers holding an
|
|
83
|
+
* already-typed `Lock` — the same split, for the same reason, as the revision
|
|
84
|
+
* dialect's `checkReferences`.
|
|
85
|
+
*
|
|
86
|
+
* @type {(l: Lock) => Result<Lock, string>}
|
|
87
|
+
*/
|
|
88
|
+
export const checkReferences = l => {
|
|
89
|
+
const message = lockMapError(l.lock)
|
|
90
|
+
return message === null ? ok(l) : error(message)
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Validates an already-parsed JSON value as a `lock` BLOB: structural (rtti)
|
|
95
|
+
* validation followed by the hash semantic check.
|
|
96
|
+
*
|
|
97
|
+
* @type {(value: Unknown) => Result<Lock, LockError>}
|
|
98
|
+
*/
|
|
99
|
+
export const validate = value => okThen(checkReferences)(validateShape(value))
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Decodes `text` as a `lock` BLOB: JSON-parses it, then validates it per
|
|
103
|
+
* {@link validate}. Detection is semantic, not syntactic — any JSON that
|
|
104
|
+
* satisfies the schema is a lock blob, regardless of key order or whitespace.
|
|
105
|
+
*
|
|
106
|
+
* @type {(text: string) => Result<Lock, LockError>}
|
|
107
|
+
*/
|
|
108
|
+
export const decodeText = text => okThen(validate)(parseJson(text))
|
|
109
|
+
|
|
110
|
+
/** {@link checkReferences} as the `boolean` refinement a {@link DialectEntry} takes.
|
|
111
|
+
* @type {(l: Lock) => boolean}
|
|
112
|
+
*/
|
|
113
|
+
const isValidLock = l => {
|
|
114
|
+
const [tag] = checkReferences(l)
|
|
115
|
+
return tag === 'ok'
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* This dialect as a registry entry for `fjs/media`'s `detect`. It carries the
|
|
120
|
+
* semantic check too, so a blob is detected as `vnd.fjs.lock` exactly when
|
|
121
|
+
* {@link decodeText} would accept it.
|
|
122
|
+
*
|
|
123
|
+
* @type {DialectEntry}
|
|
124
|
+
*/
|
|
125
|
+
export const lockDialect = dialectEntry(lockSchema, isValidLock)
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @import { Object as JsonObject } from '../json/types.ts'
|
|
3
|
+
* @import { LockMap } from './types.ts'
|
|
4
|
+
*/
|
|
5
|
+
export declare const proof: {
|
|
6
|
+
dialectAndMediaType: () => void;
|
|
7
|
+
validate: {
|
|
8
|
+
flatMapAccepted: () => void;
|
|
9
|
+
emptyMapAccepted: () => void;
|
|
10
|
+
nestedMapAccepted: () => void;
|
|
11
|
+
missingLockRejected: () => void;
|
|
12
|
+
referenceLockRejected: () => void;
|
|
13
|
+
malformedMapRejected: () => void;
|
|
14
|
+
invalidHashRejected: () => void;
|
|
15
|
+
revisionFieldsIgnored: () => void;
|
|
16
|
+
revisionBlobRejected: () => void;
|
|
17
|
+
};
|
|
18
|
+
checkReferences: {
|
|
19
|
+
valid: () => void;
|
|
20
|
+
invalid: () => void;
|
|
21
|
+
};
|
|
22
|
+
decodeText: {
|
|
23
|
+
validJson: () => void;
|
|
24
|
+
keyOrderIndependent: () => void;
|
|
25
|
+
malformedJsonRejected: () => void;
|
|
26
|
+
ordinaryJsonRejected: () => void;
|
|
27
|
+
};
|
|
28
|
+
encodeText: {
|
|
29
|
+
recursivelySortsObjectsLexicographically: () => void;
|
|
30
|
+
equivalentOrdersConverge: () => void;
|
|
31
|
+
};
|
|
32
|
+
inlineAndSharedSerializeIdentically: () => void;
|
|
33
|
+
};
|