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
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types for the serializable RTTI data form.
|
|
3
|
+
*
|
|
4
|
+
* A schema in data form denotes a set of values. The representation
|
|
5
|
+
* partitions that set into six disjoint *kinds* — unit values (`null`,
|
|
6
|
+
* `undefined`, `false`, `true`), numbers, strings, bigints, arrays and
|
|
7
|
+
* objects — so that union, equality and subset reduce to kind-wise set
|
|
8
|
+
* operations. See `./README.md` for the design rationale.
|
|
9
|
+
*
|
|
10
|
+
* @module
|
|
11
|
+
*/
|
|
12
|
+
import type { StringMap } from '../../object/types.ts';
|
|
13
|
+
/**
|
|
14
|
+
* A set of values of one kind: `true` is the whole kind, an array lists its
|
|
15
|
+
* members (literals or patterns), canonically sorted and deduplicated. An
|
|
16
|
+
* empty kind is an absent property of {@link UnionSet}, never an empty array.
|
|
17
|
+
*/
|
|
18
|
+
export type KindSet<T> = true | readonly T[];
|
|
19
|
+
/**
|
|
20
|
+
* A set of arrays: a tuple with an optional rest.
|
|
21
|
+
*
|
|
22
|
+
* - `prefix` constrains the value set of each leading position.
|
|
23
|
+
* - `rest` present: the array may be any length `>= prefix.length`, and every
|
|
24
|
+
* element past the prefix belongs to `rest`.
|
|
25
|
+
* - `rest` absent: the array length is exactly `prefix.length`.
|
|
26
|
+
*
|
|
27
|
+
* A tuple schema is `{ prefix }`; a uniform array schema is
|
|
28
|
+
* `{ prefix: [], rest }`. Both are points of the same kind, so
|
|
29
|
+
* `readonly [number] ⊂ readonly number[]` is a plain pattern inclusion.
|
|
30
|
+
*/
|
|
31
|
+
export type ArraySet = {
|
|
32
|
+
readonly prefix: readonly Node[];
|
|
33
|
+
readonly rest?: Node;
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* A set of objects: per-key value sets with an optional rest.
|
|
37
|
+
*
|
|
38
|
+
* - `props` constrains, per declared key, the value *read* at that key — an
|
|
39
|
+
* absent property reads as `undefined`, so a key is required exactly when
|
|
40
|
+
* its set excludes `undefined`. Keys are canonically sorted, and a key
|
|
41
|
+
* whose set is the whole value domain is omitted.
|
|
42
|
+
* - `rest` present: the value at every other *present* key belongs to `rest`.
|
|
43
|
+
* - `rest` absent: other keys are unconstrained.
|
|
44
|
+
*
|
|
45
|
+
* A struct schema is `{ props }`; a uniform record schema is
|
|
46
|
+
* `{ props: {}, rest }`.
|
|
47
|
+
*/
|
|
48
|
+
export type ObjectSet = {
|
|
49
|
+
readonly props: StringMap<Node>;
|
|
50
|
+
readonly rest?: Node;
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* A set of values as a disjoint union over the six kinds. An absent
|
|
54
|
+
* component is the empty set of that kind, so `{}` is `never` and a union
|
|
55
|
+
* with every component at its maximum (see `unknown` in `./module.f.mjs`)
|
|
56
|
+
* is `unknown`.
|
|
57
|
+
*
|
|
58
|
+
* `unit` is a bitset over the four singleton values; bit `1 << i` stands for
|
|
59
|
+
* `unitList[i]` from `./module.f.mjs` (`['null', 'undefined', 'false',
|
|
60
|
+
* 'true']`), so `or(true, false)` collapses to the two boolean bits with no
|
|
61
|
+
* special-case rule.
|
|
62
|
+
*/
|
|
63
|
+
export type UnionSet = {
|
|
64
|
+
readonly unit?: number;
|
|
65
|
+
readonly number?: KindSet<number>;
|
|
66
|
+
readonly string?: KindSet<string>;
|
|
67
|
+
readonly bigint?: KindSet<bigint>;
|
|
68
|
+
readonly array?: KindSet<ArraySet>;
|
|
69
|
+
readonly object?: KindSet<ObjectSet>;
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* A nested type position: an inline {@link UnionSet}, or the name of a rule
|
|
73
|
+
* in the enclosing {@link RuleSet}. Only recursive definitions are named;
|
|
74
|
+
* everything else is inlined, so non-recursive schemas are pure trees.
|
|
75
|
+
*/
|
|
76
|
+
export type Node = UnionSet | string;
|
|
77
|
+
/** Named recursive definitions, referenced by {@link Node} strings. */
|
|
78
|
+
export type RuleSet = StringMap<UnionSet>;
|
|
79
|
+
/**
|
|
80
|
+
* A complete serializable schema: the named recursive definitions plus the
|
|
81
|
+
* entry node. Produced by `toData` in `./module.f.mjs`.
|
|
82
|
+
*/
|
|
83
|
+
export type Data = readonly [RuleSet, Node];
|
|
@@ -1,11 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime type information (RTTI) — a type-safe schema system for describing and
|
|
3
|
+
* converting TypeScript types. See `./types.ts` for the type-level API.
|
|
4
|
+
*
|
|
5
|
+
* @module
|
|
6
|
+
*
|
|
7
|
+
* @import { Includes } from '../array/types.ts'
|
|
8
|
+
* @import { Assert } from '../../asserts/types.ts'
|
|
9
|
+
* @import { Equal } from '../ts/types.ts'
|
|
10
|
+
* @import { Tag0, Primitive0, _Type0, Bigint, Unknown, Tag1, _MakeType1, Array, Record, Or, Type } from './types.ts'
|
|
11
|
+
*/
|
|
1
12
|
import type { Includes } from '../array/types.ts';
|
|
2
13
|
import type { Assert } from '../../asserts/types.ts';
|
|
3
14
|
import type { Equal } from '../ts/types.ts';
|
|
4
15
|
import type { Primitive0, _Type0, Bigint, Unknown, Tag1, _MakeType1, Or, Type } from './types.ts';
|
|
5
|
-
/** @import { Includes } from '../array/types.ts' */
|
|
6
|
-
/** @import { Assert } from '../../asserts/types.ts' */
|
|
7
|
-
/** @import { Equal } from '../ts/types.ts' */
|
|
8
|
-
/** @import { Tag0, Primitive0, _Type0, Bigint, Unknown, Tag1, _MakeType1, Array, Record, Or, Type } from './types.ts' */
|
|
9
16
|
declare const primitive0List: readonly ['bigint', 'boolean', 'number', 'string'];
|
|
10
17
|
export type _Primitive0Pinned = Assert<Equal<Primitive0, typeof primitive0List[number]>>;
|
|
11
18
|
/** @typedef {Assert<Equal<Primitive0, typeof primitive0List[number]>>} _Primitive0Pinned */
|
|
@@ -53,7 +60,7 @@ export declare const record: _MakeType1<'record'>;
|
|
|
53
60
|
* `or` is intentionally a lazy, allocation-free constructor: it captures its
|
|
54
61
|
* arguments in a thunk and does no flattening, deduplication, subset analysis,
|
|
55
62
|
* or canonical-form work. All such algebra lives on the serializable data form
|
|
56
|
-
* — see
|
|
63
|
+
* — see `./data/README.md`.
|
|
57
64
|
*
|
|
58
65
|
* @template {readonly Type[]} T
|
|
59
66
|
* @param {T} types
|
|
@@ -3,12 +3,14 @@
|
|
|
3
3
|
* converting TypeScript types. See `./types.ts` for the type-level API.
|
|
4
4
|
*
|
|
5
5
|
* @module
|
|
6
|
+
*
|
|
7
|
+
* @import { Includes } from '../array/types.ts'
|
|
8
|
+
* @import { Assert } from '../../asserts/types.ts'
|
|
9
|
+
* @import { Equal } from '../ts/types.ts'
|
|
10
|
+
* @import { Tag0, Primitive0, _Type0, Bigint, Unknown, Tag1, _MakeType1, Array, Record, Or, Type } from './types.ts'
|
|
6
11
|
*/
|
|
12
|
+
|
|
7
13
|
import { includes } from '../array/module.f.mjs'
|
|
8
|
-
/** @import { Includes } from '../array/types.ts' */
|
|
9
|
-
/** @import { Assert } from '../../asserts/types.ts' */
|
|
10
|
-
/** @import { Equal } from '../ts/types.ts' */
|
|
11
|
-
/** @import { Tag0, Primitive0, _Type0, Bigint, Unknown, Tag1, _MakeType1, Array, Record, Or, Type } from './types.ts' */
|
|
12
14
|
|
|
13
15
|
const primitive0List = /** @type {const} */ (['bigint', 'boolean', 'number', 'string'])
|
|
14
16
|
|
|
@@ -84,7 +86,7 @@ export const record = type1('record')
|
|
|
84
86
|
* `or` is intentionally a lazy, allocation-free constructor: it captures its
|
|
85
87
|
* arguments in a thunk and does no flattening, deduplication, subset analysis,
|
|
86
88
|
* or canonical-form work. All such algebra lives on the serializable data form
|
|
87
|
-
* — see
|
|
89
|
+
* — see `./data/README.md`.
|
|
88
90
|
*
|
|
89
91
|
* @template {readonly Type[]} T
|
|
90
92
|
* @param {T} types
|
|
@@ -1,3 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime deserialization of unknown values against RTTI schemas.
|
|
3
|
+
*
|
|
4
|
+
* The main entry point is `parse(rtti)`, which takes a schema `Type` and returns
|
|
5
|
+
* a `Parse<T>` function. When called with an unknown value, it returns a `Result`
|
|
6
|
+
* that is either `['ok', newValue]` or `['error', { path, message }]`.
|
|
7
|
+
*
|
|
8
|
+
* **Structs and tuples are open.** A value carrying more than the schema
|
|
9
|
+
* declares is accepted; `parse` then returns a freshly constructed value that
|
|
10
|
+
* contains only the declared fields/elements, so the extras are accepted on
|
|
11
|
+
* the way in and absent on the way out:
|
|
12
|
+
*
|
|
13
|
+
* - Tuples: a longer array is accepted; the result has the schema's length.
|
|
14
|
+
* - Structs: undeclared properties are accepted; the result has only the
|
|
15
|
+
* schema's keys.
|
|
16
|
+
* - Arrays/records: every element/value is itself parsed, so a fresh container is
|
|
17
|
+
* always returned even if the inner type is a primitive.
|
|
18
|
+
*
|
|
19
|
+
* A member is required exactly when its set excludes `undefined` — an absent
|
|
20
|
+
* member reads as `undefined`, on both kinds — so a shorter array whose
|
|
21
|
+
* trailing position admits `undefined` is accepted and the gap is filled.
|
|
22
|
+
*
|
|
23
|
+
* Openness is what makes this forward-compatible with extended serialization
|
|
24
|
+
* formats: a schema-based parser keeps working when newer versions of the
|
|
25
|
+
* format add extra fields or tuple elements.
|
|
26
|
+
*
|
|
27
|
+
* **Do not read "the result has the schema's length" as "tuples are closed"
|
|
28
|
+
* and add a length check here.** The set a tuple schema describes includes
|
|
29
|
+
* longer arrays; `Ts<T>` renders the closed approximation only because
|
|
30
|
+
* TypeScript cannot express the open one (see `../ts/types.ts` `TupleTs`), and
|
|
31
|
+
* taking that rendering for the model is what produced #1622. A schema that
|
|
32
|
+
* wants exact members says so — see `../todo/close-type.md`.
|
|
33
|
+
*
|
|
34
|
+
* The error shape, path bookkeeping, primitive checks, and schema
|
|
35
|
+
* recognition (`visit`) come from `../common/module.f.mjs`.
|
|
36
|
+
*
|
|
37
|
+
* See `./types.ts` for the `Result`/`Parse` type-level API.
|
|
38
|
+
*
|
|
39
|
+
* @module
|
|
40
|
+
*
|
|
41
|
+
* @import { Info1, Struct, Tag1, Tuple, Type } from '../types.ts'
|
|
42
|
+
* @import { Result as CommonResult } from '../../result/types.ts'
|
|
43
|
+
* @import { StringMap } from '../../object/types.ts'
|
|
44
|
+
* @import { List } from '../../list/types.ts'
|
|
45
|
+
* @import { Container, IsContainer, ValidationError, Visitor } from '../common/types.ts'
|
|
46
|
+
* @import { Unknown } from '../ts/types.ts'
|
|
47
|
+
* @import { Parse } from './types.ts'
|
|
48
|
+
*/
|
|
1
49
|
import type { Type } from '../types.ts';
|
|
2
50
|
import type { Result as CommonResult } from '../../result/types.ts';
|
|
3
51
|
import type { ValidationError } from '../common/types.ts';
|
|
@@ -5,34 +5,49 @@
|
|
|
5
5
|
* a `Parse<T>` function. When called with an unknown value, it returns a `Result`
|
|
6
6
|
* that is either `['ok', newValue]` or `['error', { path, message }]`.
|
|
7
7
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* contains only the fields/elements
|
|
11
|
-
*
|
|
12
|
-
* type produced by `Ts<T>`:
|
|
8
|
+
* **Structs and tuples are open.** A value carrying more than the schema
|
|
9
|
+
* declares is accepted; `parse` then returns a freshly constructed value that
|
|
10
|
+
* contains only the declared fields/elements, so the extras are accepted on
|
|
11
|
+
* the way in and absent on the way out:
|
|
13
12
|
*
|
|
14
|
-
* - Tuples: the result has
|
|
15
|
-
* - Structs:
|
|
13
|
+
* - Tuples: a longer array is accepted; the result has the schema's length.
|
|
14
|
+
* - Structs: undeclared properties are accepted; the result has only the
|
|
15
|
+
* schema's keys.
|
|
16
16
|
* - Arrays/records: every element/value is itself parsed, so a fresh container is
|
|
17
17
|
* always returned even if the inner type is a primitive.
|
|
18
18
|
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
19
|
+
* A member is required exactly when its set excludes `undefined` — an absent
|
|
20
|
+
* member reads as `undefined`, on both kinds — so a shorter array whose
|
|
21
|
+
* trailing position admits `undefined` is accepted and the gap is filled.
|
|
22
|
+
*
|
|
23
|
+
* Openness is what makes this forward-compatible with extended serialization
|
|
24
|
+
* formats: a schema-based parser keeps working when newer versions of the
|
|
25
|
+
* format add extra fields or tuple elements.
|
|
26
|
+
*
|
|
27
|
+
* **Do not read "the result has the schema's length" as "tuples are closed"
|
|
28
|
+
* and add a length check here.** The set a tuple schema describes includes
|
|
29
|
+
* longer arrays; `Ts<T>` renders the closed approximation only because
|
|
30
|
+
* TypeScript cannot express the open one (see `../ts/types.ts` `TupleTs`), and
|
|
31
|
+
* taking that rendering for the model is what produced #1622. A schema that
|
|
32
|
+
* wants exact members says so — see `../todo/close-type.md`.
|
|
22
33
|
*
|
|
23
34
|
* The error shape, path bookkeeping, primitive checks, and schema
|
|
24
|
-
* recognition (`visit`)
|
|
25
|
-
* `../common/module.f.mjs`; only container construction differs.
|
|
35
|
+
* recognition (`visit`) come from `../common/module.f.mjs`.
|
|
26
36
|
*
|
|
27
37
|
* See `./types.ts` for the `Result`/`Parse` type-level API.
|
|
28
38
|
*
|
|
29
39
|
* @module
|
|
40
|
+
*
|
|
41
|
+
* @import { Info1, Struct, Tag1, Tuple, Type } from '../types.ts'
|
|
42
|
+
* @import { Result as CommonResult } from '../../result/types.ts'
|
|
43
|
+
* @import { StringMap } from '../../object/types.ts'
|
|
44
|
+
* @import { List } from '../../list/types.ts'
|
|
45
|
+
* @import { Container, IsContainer, ValidationError, Visitor } from '../common/types.ts'
|
|
46
|
+
* @import { Unknown } from '../ts/types.ts'
|
|
47
|
+
* @import { Parse } from './types.ts'
|
|
30
48
|
*/
|
|
31
|
-
|
|
32
|
-
/** @import { Result as CommonResult } from '../../result/types.ts' */
|
|
49
|
+
|
|
33
50
|
import { ok } from '../../result/module.f.mjs'
|
|
34
|
-
/** @import { StringMap } from '../../object/types.ts' */
|
|
35
|
-
/** @import { List } from '../../list/types.ts' */
|
|
36
51
|
import { reverse, toArray } from '../../list/module.f.mjs'
|
|
37
52
|
import {
|
|
38
53
|
constPrimitiveValidate,
|
|
@@ -44,9 +59,6 @@ import {
|
|
|
44
59
|
verror,
|
|
45
60
|
visit,
|
|
46
61
|
} from '../common/module.f.mjs'
|
|
47
|
-
/** @import { Container, IsContainer, ValidateE, ValidationError, Visitor } from '../common/types.ts' */
|
|
48
|
-
/** @import { Unknown } from '../ts/types.ts' */
|
|
49
|
-
/** @import { Parse } from './types.ts' */
|
|
50
62
|
|
|
51
63
|
const { entries } = Object
|
|
52
64
|
|
|
@@ -76,11 +88,10 @@ const orderedEntries = list =>
|
|
|
76
88
|
toArray(reverse(list))
|
|
77
89
|
|
|
78
90
|
/**
|
|
79
|
-
* Builds a parser for `array` or `record` schemas
|
|
80
|
-
*
|
|
81
|
-
*
|
|
82
|
-
*
|
|
83
|
-
* schemas don't recurse forever on empty containers.
|
|
91
|
+
* Builds a parser for `array` or `record` schemas: rebuilds a fresh container
|
|
92
|
+
* from each item's parsed result. The inner item parser is instantiated lazily
|
|
93
|
+
* (only when the container is non-empty) so recursive schemas don't recurse
|
|
94
|
+
* forever on empty containers.
|
|
84
95
|
*/
|
|
85
96
|
const containerParse =
|
|
86
97
|
/**
|
|
@@ -98,7 +109,7 @@ const containerParse =
|
|
|
98
109
|
if (e.length === 0) {
|
|
99
110
|
return /** @type {any} */ (ok(rebuild([])))
|
|
100
111
|
}
|
|
101
|
-
const itemParse = /** @type {
|
|
112
|
+
const itemParse = /** @type {any} */ (parse(item))
|
|
102
113
|
const r = eachEntry(e, (_k, v) => itemParse(v), emptyEntries, consEntry)
|
|
103
114
|
return r[0] === 'error' ? r : /** @type {any} */ (ok(rebuild(orderedEntries(r[1]))))
|
|
104
115
|
}
|
|
@@ -108,10 +119,10 @@ const arrayParse = containerParse(isArray, arrayRebuild)
|
|
|
108
119
|
const recordParse = containerParse(isObject, recordRebuild)
|
|
109
120
|
|
|
110
121
|
/**
|
|
111
|
-
* Builds a parser for `Tuple` or `Struct` const schemas.
|
|
112
|
-
*
|
|
113
|
-
*
|
|
114
|
-
*
|
|
122
|
+
* Builds a parser for `Tuple` or `Struct` const schemas. It iterates the
|
|
123
|
+
* *schema's* entries, which is what makes both kinds open: a longer array or
|
|
124
|
+
* an undeclared key is never visited, so it is accepted and left out of the
|
|
125
|
+
* rebuilt result.
|
|
115
126
|
*/
|
|
116
127
|
const constContainerParse =
|
|
117
128
|
/**
|
|
@@ -128,7 +139,7 @@ const constContainerParse =
|
|
|
128
139
|
}
|
|
129
140
|
const r = eachEntry(
|
|
130
141
|
entries(rtti),
|
|
131
|
-
(k, t) =>
|
|
142
|
+
(k, t) => (/** @type {any} */ (parse(t))(getItem(value, k))),
|
|
132
143
|
emptyEntries,
|
|
133
144
|
consEntry,
|
|
134
145
|
)
|
|
@@ -154,7 +165,7 @@ const orParse =
|
|
|
154
165
|
* @returns {Parse<() => readonly ['or', ...T]>}
|
|
155
166
|
*/
|
|
156
167
|
rtti =>
|
|
157
|
-
/** @type {any} */ (orVisit(/** @type {
|
|
168
|
+
/** @type {any} */ (orVisit(/** @type {any} */ (parse))(rtti))
|
|
158
169
|
|
|
159
170
|
/**
|
|
160
171
|
* Creates a parser function for the given RTTI schema.
|
|
@@ -173,10 +184,10 @@ const orParse =
|
|
|
173
184
|
* p([1, 2, 3]) // ['ok', [1, 2, 3]] (a new array)
|
|
174
185
|
* p([1, 'two']) // ['error', { path: ['1'], message: 'unexpected value' }]
|
|
175
186
|
*
|
|
176
|
-
* //
|
|
187
|
+
* // open: a longer array is accepted, and the extra is not carried over
|
|
177
188
|
* parse([number, number])([1, 2, 3]) // ['ok', [1, 2]]
|
|
178
189
|
*
|
|
179
|
-
* //
|
|
190
|
+
* // open: an undeclared key is accepted, and not carried over
|
|
180
191
|
* parse({ a: number })({ a: 1, b: 2 }) // ['ok', { a: 1 }]
|
|
181
192
|
* ```
|
|
182
193
|
*/
|
|
@@ -193,4 +204,4 @@ const parseVisitor = /** @type {any} */ ({
|
|
|
193
204
|
|
|
194
205
|
/** @type {<T extends Type>(rtti: T) => Parse<T>} */
|
|
195
206
|
export const parse = rtti =>
|
|
196
|
-
|
|
207
|
+
(visit(parseVisitor)(rtti))
|
|
@@ -64,12 +64,13 @@ export declare const proof: {
|
|
|
64
64
|
};
|
|
65
65
|
tuple: {
|
|
66
66
|
ok: () => void;
|
|
67
|
-
|
|
67
|
+
extraItemsAcceptedAndDropped: () => void;
|
|
68
|
+
shortArrayFillsAnOptionalPosition: () => void;
|
|
68
69
|
error: () => void;
|
|
69
70
|
};
|
|
70
71
|
struct: {
|
|
71
72
|
ok: () => void;
|
|
72
|
-
|
|
73
|
+
extraKeysAcceptedAndDropped: () => void;
|
|
73
74
|
error: () => void;
|
|
74
75
|
};
|
|
75
76
|
};
|
|
@@ -8,7 +8,11 @@
|
|
|
8
8
|
|
|
9
9
|
import { parse } from './module.f.mjs'
|
|
10
10
|
import { boolean, number, string, bigint, unknown, array, record, or, option } from '../module.f.mjs'
|
|
11
|
-
import {
|
|
11
|
+
import {
|
|
12
|
+
assert,
|
|
13
|
+
assertEq,
|
|
14
|
+
assertStructurallySame,
|
|
15
|
+
} from '../../../asserts/module.f.mjs'
|
|
12
16
|
|
|
13
17
|
/** @type {(r: readonly [string, unknown]) => void} */
|
|
14
18
|
const assertOk = ([k]) => { assertEq(k, 'ok', 'expected ok') }
|
|
@@ -31,33 +35,9 @@ const assertErrorPath = expected =>
|
|
|
31
35
|
r => {
|
|
32
36
|
assert(r[0] === 'error', 'expected error')
|
|
33
37
|
const e = /** @type {ValidationError} */ (r[1])
|
|
34
|
-
|
|
35
|
-
for (let i = 0; i < expected.length; i++) {
|
|
36
|
-
if (e.path[i] !== expected[i]) { throw `path[${i}] ${e.path[i]} != ${expected[i]}` }
|
|
37
|
-
}
|
|
38
|
+
assertStructurallySame(e.path, expected, 'unexpected error path')
|
|
38
39
|
}
|
|
39
40
|
|
|
40
|
-
/** @type {(a: unknown, b: unknown) => void} */
|
|
41
|
-
const assertDeepEqual = (a, b) => {
|
|
42
|
-
if (a === b) { return }
|
|
43
|
-
if (a instanceof Array && b instanceof Array) {
|
|
44
|
-
if (a.length !== b.length) { throw `array length ${a.length} != ${b.length}` }
|
|
45
|
-
for (let i = 0; i < a.length; i++) { assertDeepEqual(a[i], b[i]) }
|
|
46
|
-
return
|
|
47
|
-
}
|
|
48
|
-
if (typeof a === 'object' && a !== null && typeof b === 'object' && b !== null) {
|
|
49
|
-
const ka = Object.keys(a).sort()
|
|
50
|
-
const kb = Object.keys(b).sort()
|
|
51
|
-
if (ka.length !== kb.length) { throw `key count ${ka.length} != ${kb.length}` }
|
|
52
|
-
for (let i = 0; i < ka.length; i++) {
|
|
53
|
-
if (ka[i] !== kb[i]) { throw `key ${ka[i]} != ${kb[i]}` }
|
|
54
|
-
assertDeepEqual((/** @type {any} */ (a))[ka[i]], (/** @type {any} */ (b))[kb[i]])
|
|
55
|
-
}
|
|
56
|
-
return
|
|
57
|
-
}
|
|
58
|
-
throw `not deep-equal: ${String(a)} vs ${String(b)}`
|
|
59
|
-
}
|
|
60
|
-
|
|
61
41
|
export const proof = {
|
|
62
42
|
boolean: {
|
|
63
43
|
ok: () => {
|
|
@@ -129,32 +109,32 @@ export const proof = {
|
|
|
129
109
|
error: () => assertError(parse(/** @type {const} */ (42))(43)),
|
|
130
110
|
},
|
|
131
111
|
nan: {
|
|
132
|
-
ok: () => assertOk(parse(
|
|
112
|
+
ok: () => assertOk(parse(NaN)(NaN)),
|
|
133
113
|
error: () => {
|
|
134
|
-
assertError(parse(
|
|
114
|
+
assertError(parse(NaN)(0))
|
|
135
115
|
assertError(parse(/** @type {const} */ (0))(NaN))
|
|
136
116
|
assertError(parse(/** @type {const} */ (42))(NaN))
|
|
137
117
|
},
|
|
138
118
|
},
|
|
139
119
|
infinity: {
|
|
140
120
|
ok: () => {
|
|
141
|
-
assertOk(parse(
|
|
142
|
-
assertOk(parse(
|
|
121
|
+
assertOk(parse(Infinity)(Infinity))
|
|
122
|
+
assertOk(parse(-Infinity)(-Infinity))
|
|
143
123
|
},
|
|
144
124
|
error: () => {
|
|
145
|
-
assertError(parse(
|
|
146
|
-
assertError(parse(
|
|
125
|
+
assertError(parse(Infinity)(-Infinity))
|
|
126
|
+
assertError(parse(Infinity)(0))
|
|
147
127
|
},
|
|
148
128
|
},
|
|
149
129
|
signedZero: {
|
|
150
130
|
// `Object.is` distinguishes +0 and -0; `===` treats them equal.
|
|
151
131
|
distinct: () => {
|
|
152
132
|
assertError(parse(/** @type {const} */ (0))(-0))
|
|
153
|
-
assertError(parse(
|
|
133
|
+
assertError(parse(-0)(0))
|
|
154
134
|
},
|
|
155
135
|
self: () => {
|
|
156
136
|
assertOk(parse(/** @type {const} */ (0))(0))
|
|
157
|
-
assertOk(parse(
|
|
137
|
+
assertOk(parse(-0)(-0))
|
|
158
138
|
},
|
|
159
139
|
},
|
|
160
140
|
string: {
|
|
@@ -173,28 +153,47 @@ export const proof = {
|
|
|
173
153
|
ok: () => {
|
|
174
154
|
const t = /** @type {const} */ ([42, 'hello'])
|
|
175
155
|
const r = parse(t)([42, 'hello'])
|
|
176
|
-
|
|
156
|
+
assertStructurallySame(unwrap(r), [42, 'hello'])
|
|
177
157
|
},
|
|
178
|
-
//
|
|
179
|
-
|
|
158
|
+
// A tuple is OPEN: a longer array is accepted, and the extras are
|
|
159
|
+
// absent from what `parse` builds. This is deliberate — see
|
|
160
|
+
// "Structs and tuples are open" in ../README.md. Do not add a
|
|
161
|
+
// length check here on the strength of `Ts<readonly [42]>` being
|
|
162
|
+
// an exact tuple; that mapping is exact only because TypeScript
|
|
163
|
+
// could not express the open one (see ../ts/types.ts `TupleTs`),
|
|
164
|
+
// and reading it as a design decision is what produced #1622.
|
|
165
|
+
extraItemsAcceptedAndDropped: () => {
|
|
180
166
|
const r = parse(/** @type {const} */ ([42]))([42, 'extra'])
|
|
181
|
-
|
|
167
|
+
assertStructurallySame(unwrap(r), [42])
|
|
168
|
+
const long = parse(/** @type {const} */ ([42]))([42, 1, 2, 3])
|
|
169
|
+
assertStructurallySame(unwrap(long), [42])
|
|
170
|
+
},
|
|
171
|
+
// An absent member reads as `undefined`, so a position is required
|
|
172
|
+
// exactly when its set excludes `undefined` — the same rule the
|
|
173
|
+
// data form states for object keys, applied to arrays.
|
|
174
|
+
shortArrayFillsAnOptionalPosition: () => {
|
|
175
|
+
const r = parse([number, option(string)])([42])
|
|
176
|
+
assertStructurallySame(unwrap(r), [42, undefined])
|
|
182
177
|
},
|
|
183
178
|
error: () => {
|
|
184
179
|
assertError(parse(/** @type {const} */ ([42]))([99]))
|
|
185
180
|
assertError(parse(/** @type {const} */ ([42]))({}))
|
|
181
|
+
// `42` excludes `undefined`, so position 0 is required.
|
|
182
|
+
assertError(parse(/** @type {const} */ ([42]))([]))
|
|
186
183
|
},
|
|
187
184
|
},
|
|
188
185
|
struct: {
|
|
189
186
|
ok: () => {
|
|
190
187
|
const t = /** @type {const} */ ({ a: 42, b: 'hello' })
|
|
191
188
|
const r = parse(t)({ a: 42, b: 'hello' })
|
|
192
|
-
|
|
189
|
+
assertStructurallySame(unwrap(r), { a: 42, b: 'hello' })
|
|
193
190
|
},
|
|
194
|
-
//
|
|
195
|
-
|
|
191
|
+
// A struct is OPEN, on the same terms as a tuple: undeclared
|
|
192
|
+
// properties are accepted and absent from what `parse` builds.
|
|
193
|
+
// See "Structs and tuples are open" in ../README.md.
|
|
194
|
+
extraKeysAcceptedAndDropped: () => {
|
|
196
195
|
const r = parse(/** @type {const} */ ({ a: /** @type {const} */ (42) }))({ a: 42, b: 'extra' })
|
|
197
|
-
|
|
196
|
+
assertStructurallySame(unwrap(r), { a: 42 })
|
|
198
197
|
},
|
|
199
198
|
error: () => {
|
|
200
199
|
assertError(parse(/** @type {const} */ ({ a: 42 }))({ a: 99 }))
|
|
@@ -205,19 +204,19 @@ export const proof = {
|
|
|
205
204
|
array: {
|
|
206
205
|
empty: () => {
|
|
207
206
|
const r = parse(array(number))([])
|
|
208
|
-
|
|
207
|
+
assertStructurallySame(unwrap(r), [])
|
|
209
208
|
},
|
|
210
209
|
ok: () => {
|
|
211
210
|
const r = parse(array(number))([1, 2, 3])
|
|
212
|
-
|
|
211
|
+
assertStructurallySame(unwrap(r), [1, 2, 3])
|
|
213
212
|
},
|
|
214
213
|
// `parse` always constructs a new array, even when the inner type is a primitive.
|
|
215
214
|
freshArray: () => {
|
|
216
215
|
const input = [1, 2, 3]
|
|
217
216
|
/** @type {readonly number[]} */
|
|
218
217
|
const out = unwrap(parse(array(number))(input))
|
|
219
|
-
assert(out !==
|
|
220
|
-
|
|
218
|
+
assert(out !== input, 'expected a fresh array')
|
|
219
|
+
assertStructurallySame(out, [1, 2, 3])
|
|
221
220
|
},
|
|
222
221
|
error: () => {
|
|
223
222
|
assertError(parse(array(number))([1, 'two', 3]))
|
|
@@ -226,26 +225,26 @@ export const proof = {
|
|
|
226
225
|
},
|
|
227
226
|
nested: () => {
|
|
228
227
|
const r = parse(array(array(boolean)))([[true, false], [false]])
|
|
229
|
-
|
|
228
|
+
assertStructurallySame(unwrap(r), [[true, false], [false]])
|
|
230
229
|
assertError(parse(array(array(boolean)))([[true, 42]]))
|
|
231
230
|
},
|
|
232
231
|
},
|
|
233
232
|
record: {
|
|
234
233
|
empty: () => {
|
|
235
234
|
const r = parse(record(number))({})
|
|
236
|
-
|
|
235
|
+
assertStructurallySame(unwrap(r), {})
|
|
237
236
|
},
|
|
238
237
|
ok: () => {
|
|
239
238
|
const r = parse(record(string))({ a: 'hello', b: 'world' })
|
|
240
|
-
|
|
239
|
+
assertStructurallySame(unwrap(r), { a: 'hello', b: 'world' })
|
|
241
240
|
},
|
|
242
241
|
// `parse` always constructs a new record.
|
|
243
242
|
freshRecord: () => {
|
|
244
243
|
const input = { a: 1, b: 2 }
|
|
245
244
|
/** @type {Record<string, number>} */
|
|
246
245
|
const out = unwrap(parse(record(number))(input))
|
|
247
|
-
assert(out !==
|
|
248
|
-
|
|
246
|
+
assert(out !== input, 'expected a fresh record')
|
|
247
|
+
assertStructurallySame(out, { a: 1, b: 2 })
|
|
249
248
|
},
|
|
250
249
|
error: () => {
|
|
251
250
|
assertError(parse(record(number))({ a: 1, b: 'two' }))
|
|
@@ -294,7 +293,7 @@ export const proof = {
|
|
|
294
293
|
/** @type {readonly number[]} */
|
|
295
294
|
const out = unwrap(parse(t)([1, 2, 3]))
|
|
296
295
|
// The const tuple `[number]` matches first and returns a length-1 result.
|
|
297
|
-
|
|
296
|
+
assertStructurallySame(out, [1])
|
|
298
297
|
},
|
|
299
298
|
},
|
|
300
299
|
option: {
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/**
|
|
2
|
+
* @import { StringMap } from '../object/types.ts'
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { assertNotNullish } from '../../asserts/module.f.mjs'
|
|
2
6
|
|
|
3
7
|
/** @typedef {StringMap<readonly unknown[]>} _Tests */
|
|
4
8
|
|
|
@@ -14,7 +18,7 @@ const tests = {
|
|
|
14
18
|
}
|
|
15
19
|
|
|
16
20
|
export const proof = {
|
|
17
|
-
typeof: Object.fromEntries(Object.entries(tests).map(([k, a]) => [k,
|
|
21
|
+
typeof: Object.fromEntries(Object.entries(tests).map(([k, a]) => [k, assertNotNullish(a).map(v => () => {
|
|
18
22
|
if (typeof v !== k) { throw `typeof ${v} !== ${k}` }
|
|
19
23
|
})])),
|
|
20
24
|
}
|