functionalscript 0.44.0 → 0.45.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/fjs/asn.1/proof.f.d.mts +5 -0
- package/fjs/asn.1/proof.f.mjs +15 -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/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/proof.f.mjs +0 -1
- package/fjs/bnf/descent/module.f.d.mts +17 -2
- package/fjs/bnf/descent/module.f.mjs +118 -41
- package/fjs/bnf/descent/proof.f.d.mts +1 -0
- package/fjs/bnf/descent/proof.f.mjs +77 -1
- package/fjs/bnf/descent/types.d.ts +12 -4
- package/fjs/bnf/ll1/module.f.d.mts +28 -2
- package/fjs/bnf/ll1/module.f.mjs +180 -38
- package/fjs/bnf/ll1/proof.f.d.mts +2 -0
- package/fjs/bnf/ll1/proof.f.mjs +62 -1
- package/fjs/bnf/ll1/types.d.ts +14 -8
- 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/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/proof.f.d.mts +3 -1
- package/fjs/cas/cli/proof.f.mjs +3 -1
- package/fjs/cas/evo/module.f.d.mts +7 -13
- package/fjs/cas/evo/module.f.mjs +103 -96
- package/fjs/cas/evo/proof.f.mjs +6 -3
- package/fjs/cas/module.f.mjs +96 -109
- 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 +2 -2
- package/fjs/ci/config/module.f.mjs +2 -2
- package/fjs/ci/nix/proof.f.d.mts +2 -0
- package/fjs/ci/nix/proof.f.mjs +2 -2
- package/fjs/ci/proof.f.d.mts +4 -2
- package/fjs/ci/proof.f.mjs +4 -3
- package/fjs/cli/proof.f.d.mts +4 -2
- package/fjs/cli/proof.f.mjs +4 -2
- 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/secp/proof.f.d.mts +3 -1
- package/fjs/crypto/secp/proof.f.mjs +3 -1
- package/fjs/crypto/sha2/proof.f.d.mts +3 -1
- package/fjs/crypto/sha2/proof.f.mjs +3 -1
- 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 +5 -2
- package/fjs/dev/module.f.mjs +5 -4
- package/fjs/dev/package_json/module.f.d.mts +7 -0
- package/fjs/dev/package_json/module.f.mjs +10 -7
- package/fjs/dev/update/module.f.d.mts +3 -0
- package/fjs/dev/update/module.f.mjs +3 -2
- package/fjs/dev/update/proof.f.d.mts +3 -0
- package/fjs/dev/update/proof.f.mjs +1 -2
- package/fjs/djs/parser/module.f.d.mts +3 -0
- package/fjs/djs/parser/module.f.mjs +18 -0
- package/fjs/djs/parser/proof.f.d.mts +3 -0
- package/fjs/djs/parser/proof.f.mjs +13 -1
- package/fjs/djs/proof.f.d.mts +3 -0
- package/fjs/djs/proof.f.mjs +4 -1
- package/fjs/djs/serializer/module.f.mjs +5 -4
- package/fjs/djs/tokenizer/module.f.mjs +21 -13
- package/fjs/djs/tokenizer/proof.f.d.mts +3 -0
- package/fjs/djs/tokenizer/proof.f.mjs +14 -2
- package/fjs/djs/transpiler/module.f.d.mts +1 -12
- package/fjs/djs/transpiler/module.f.mjs +1 -20
- package/fjs/djs/transpiler/types.d.ts +25 -0
- package/fjs/effects/eff/module.f.d.mts +10 -0
- package/fjs/effects/eff/module.f.mjs +4 -2
- package/fjs/effects/eff/proof.f.d.mts +3 -0
- package/fjs/effects/eff/proof.f.mjs +4 -1
- package/fjs/effects/list/module.f.d.mts +10 -2
- package/fjs/effects/list/module.f.mjs +4 -2
- package/fjs/effects/memory/module.f.d.mts +4 -2
- package/fjs/effects/memory/module.f.mjs +4 -3
- package/fjs/effects/memory/proof.f.d.mts +4 -0
- package/fjs/effects/memory/proof.f.mjs +5 -2
- package/fjs/effects/mock/module.f.d.mts +10 -2
- package/fjs/effects/mock/module.f.mjs +4 -2
- package/fjs/effects/module.d.mts +8 -0
- package/fjs/effects/module.f.d.mts +6 -4
- package/fjs/effects/module.f.mjs +6 -5
- package/fjs/effects/module.mjs +9 -1
- package/fjs/effects/node/memory/module.d.mts +3 -0
- package/fjs/effects/node/memory/module.mjs +3 -2
- package/fjs/effects/node/memory/proof.d.mts +2 -0
- package/fjs/effects/node/memory/proof.mjs +2 -1
- package/fjs/effects/node/module.d.mts +5 -0
- package/fjs/effects/node/module.f.d.mts +17 -12
- package/fjs/effects/node/module.f.mjs +6 -12
- package/fjs/effects/node/module.mjs +5 -17
- package/fjs/effects/node/virtual/module.f.d.mts +6 -3
- package/fjs/effects/node/virtual/module.f.mjs +6 -5
- package/fjs/effects/node/virtual/proof.f.d.mts +4 -1
- package/fjs/effects/node/virtual/proof.f.mjs +13 -1
- package/fjs/effects/proof.f.d.mts +3 -0
- package/fjs/effects/proof.f.mjs +4 -1
- 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 +6 -1
- package/fjs/emergent_testing/module.f.mjs +40 -66
- package/fjs/emergent_testing/proof.f.mjs +5 -5
- 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/proof.f.d.mts +3 -0
- package/fjs/fsm/proof.f.mjs +4 -1
- package/fjs/js/tokenizer/module.f.d.mts +7 -0
- package/fjs/js/tokenizer/module.f.mjs +19 -55
- package/fjs/mcp/module.f.d.mts +36 -1
- package/fjs/mcp/module.f.mjs +9 -7
- package/fjs/mcp/proof.f.d.mts +11 -1
- package/fjs/mcp/proof.f.mjs +11 -18
- package/fjs/media/html/module.f.d.mts +12 -0
- package/fjs/media/html/module.f.mjs +6 -4
- package/fjs/media/html/proof.f.d.mts +3 -0
- package/fjs/media/html/proof.f.mjs +4 -1
- package/fjs/media/json/parser/module.f.d.mts +1 -1
- package/fjs/media/json/parser/module.f.mjs +25 -8
- package/fjs/media/json/parser/types.d.ts +5 -0
- package/fjs/media/json/rtti/proof.f.d.mts +3 -0
- package/fjs/media/json/rtti/proof.f.mjs +3 -3
- package/fjs/media/json/schema/module.f.d.mts +61 -27
- package/fjs/media/json/schema/module.f.mjs +228 -63
- package/fjs/media/json/schema/proof.f.d.mts +41 -0
- package/fjs/media/json/schema/proof.f.mjs +219 -7
- package/fjs/media/json/serializer/module.f.d.mts +13 -0
- package/fjs/media/json/serializer/module.f.mjs +7 -7
- package/fjs/media/json/tokenizer/module.f.d.mts +8 -0
- package/fjs/media/json/tokenizer/module.f.mjs +24 -5
- 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/revision/module.f.d.mts +5 -0
- package/fjs/media/revision/module.f.mjs +8 -11
- package/fjs/media/revision/proof.f.d.mts +4 -0
- package/fjs/media/revision/proof.f.mjs +5 -2
- package/fjs/media/type/module.f.d.mts +28 -11
- package/fjs/media/type/module.f.mjs +69 -85
- package/fjs/media/type/proof.f.d.mts +16 -0
- package/fjs/media/type/proof.f.mjs +44 -4
- package/fjs/module.d.mts +5 -0
- package/fjs/module.f.d.mts +8 -0
- package/fjs/module.f.mjs +4 -2
- package/fjs/module.mjs +6 -0
- package/fjs/path/module.f.d.mts +8 -0
- package/fjs/path/module.f.mjs +4 -2
- package/fjs/proof.f.d.mts +4 -0
- package/fjs/proof.f.mjs +5 -2
- package/fjs/protocol/json_rpc/module.f.d.mts +1 -1
- package/fjs/protocol/json_rpc/module.f.mjs +7 -4
- package/fjs/protocol/json_rpc/proof.f.d.mts +6 -0
- package/fjs/protocol/json_rpc/proof.f.mjs +22 -1
- package/fjs/protocol/mcp/proof.f.d.mts +4 -0
- package/fjs/protocol/mcp/proof.f.mjs +47 -24
- package/fjs/protocol/mcp/stdio/module.f.d.mts +2 -4
- package/fjs/protocol/mcp/stdio/module.f.mjs +1 -8
- package/fjs/protocol/mcp/stdio/proof.f.d.mts +1 -1
- package/fjs/protocol/mcp/stdio/proof.f.mjs +1 -1
- package/fjs/protocol/mcp/stdio/types.d.ts +14 -0
- package/fjs/sul/id/module.f.d.mts +5 -0
- package/fjs/sul/id/module.f.mjs +5 -4
- package/fjs/sul/level/hash/module.f.d.mts +4 -1
- package/fjs/sul/level/hash/module.f.mjs +4 -3
- package/fjs/sul/level/hash/proof.f.d.mts +4 -0
- package/fjs/sul/level/hash/proof.f.mjs +5 -2
- 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 +5 -4
- 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 +21 -3
- package/fjs/text/code_point/module.f.mjs +24 -8
- package/fjs/text/code_point/proof.f.d.mts +1 -0
- package/fjs/text/code_point/proof.f.mjs +28 -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 +4 -1
- package/fjs/text/sgr/module.f.mjs +4 -3
- 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 +31 -33
- package/fjs/text/utf16/proof.f.d.mts +3 -1
- package/fjs/text/utf16/proof.f.mjs +18 -1
- package/fjs/text/utf8/module.f.d.mts +9 -5
- package/fjs/text/utf8/module.f.mjs +16 -18
- package/fjs/types/array/module.f.d.mts +2 -1
- package/fjs/types/array/module.f.mjs +2 -2
- 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 -14
- package/fjs/types/bit_vec/module.f.mjs +61 -71
- package/fjs/types/bit_vec/proof.f.d.mts +6 -0
- package/fjs/types/bit_vec/proof.f.mjs +29 -3
- 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 +9 -9
- 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 +5 -6
- package/fjs/types/btree/set/proof.f.d.mts +3 -0
- package/fjs/types/btree/set/proof.f.mjs +4 -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 +10 -1
- package/fjs/types/byte_set/module.f.mjs +5 -3
- package/fjs/types/byte_set/proof.f.d.mts +3 -1
- package/fjs/types/byte_set/proof.f.mjs +3 -1
- package/fjs/types/function/compare/module.f.d.mts +3 -2
- package/fjs/types/function/compare/module.f.mjs +3 -2
- 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 +9 -2
- package/fjs/types/list/module.f.mjs +5 -3
- 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 +8 -2
- package/fjs/types/nullable/module.f.mjs +4 -2
- 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 +14 -2
- package/fjs/types/object/module.f.mjs +15 -6
- 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 +2 -2
- 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 +35 -2
- package/fjs/types/rtti/common/module.f.mjs +9 -7
- package/fjs/types/rtti/common/proof.f.d.mts +4 -0
- package/fjs/types/rtti/common/proof.f.mjs +5 -2
- package/fjs/types/rtti/data/module.f.d.mts +120 -0
- package/fjs/types/rtti/data/module.f.mjs +1030 -0
- package/fjs/types/rtti/data/proof.f.d.mts +75 -0
- package/fjs/types/rtti/data/proof.f.mjs +566 -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 +38 -0
- package/fjs/types/rtti/parse/module.f.mjs +9 -7
- package/fjs/types/rtti/parse/proof.f.mjs +18 -38
- package/fjs/types/rtti/proof.f.d.mts +3 -1
- package/fjs/types/rtti/proof.f.mjs +3 -1
- package/fjs/types/rtti/ts/module.f.d.mts +68 -9
- package/fjs/types/rtti/ts/module.f.mjs +262 -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 +11 -0
- package/fjs/types/rtti/types.d.ts +40 -0
- package/fjs/types/rtti/validate/module.f.d.mts +36 -1
- package/fjs/types/rtti/validate/module.f.mjs +6 -4
- 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 +31 -1
- package/fjs/types/sorted_set/module.f.mjs +4 -2
- package/fjs/types/sorted_set/proof.f.d.mts +3 -1
- package/fjs/types/sorted_set/proof.f.mjs +3 -1
- 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 +3 -0
- package/fjs/website/module.f.mjs +3 -2
- 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/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/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.d.ts +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/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,41 @@
|
|
|
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
|
+
* Unlike `validate`, which checks an existing value in-place and returns it
|
|
9
|
+
* unchanged on success, `parse` always returns a freshly constructed value that
|
|
10
|
+
* contains only the fields/elements declared by the schema. This makes both
|
|
11
|
+
* structs and tuples effectively closed at runtime, matching the TypeScript
|
|
12
|
+
* type produced by `Ts<T>`:
|
|
13
|
+
*
|
|
14
|
+
* - Tuples: the result has exactly the schema's length; extra elements are dropped.
|
|
15
|
+
* - Structs: the result contains only the schema's keys; extra properties are dropped.
|
|
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
|
+
* This also provides forward compatibility with extended serialization formats:
|
|
20
|
+
* a schema-based parser keeps working when newer versions of the format add
|
|
21
|
+
* extra fields or tuple elements.
|
|
22
|
+
*
|
|
23
|
+
* The error shape, path bookkeeping, primitive checks, and schema
|
|
24
|
+
* recognition (`visit`) are shared with `validate` through
|
|
25
|
+
* `../common/module.f.mjs`; only container construction differs.
|
|
26
|
+
*
|
|
27
|
+
* See `./types.ts` for the `Result`/`Parse` type-level API.
|
|
28
|
+
*
|
|
29
|
+
* @module
|
|
30
|
+
*
|
|
31
|
+
* @import { Info1, Struct, Tag1, Tuple, Type } from '../types.ts'
|
|
32
|
+
* @import { Result as CommonResult } from '../../result/types.ts'
|
|
33
|
+
* @import { StringMap } from '../../object/types.ts'
|
|
34
|
+
* @import { List } from '../../list/types.ts'
|
|
35
|
+
* @import { Container, IsContainer, ValidateE, ValidationError, Visitor } from '../common/types.ts'
|
|
36
|
+
* @import { Unknown } from '../ts/types.ts'
|
|
37
|
+
* @import { Parse } from './types.ts'
|
|
38
|
+
*/
|
|
1
39
|
import type { Type } from '../types.ts';
|
|
2
40
|
import type { Result as CommonResult } from '../../result/types.ts';
|
|
3
41
|
import type { ValidationError } from '../common/types.ts';
|
|
@@ -27,12 +27,17 @@
|
|
|
27
27
|
* See `./types.ts` for the `Result`/`Parse` type-level API.
|
|
28
28
|
*
|
|
29
29
|
* @module
|
|
30
|
+
*
|
|
31
|
+
* @import { Info1, Struct, Tag1, Tuple, Type } from '../types.ts'
|
|
32
|
+
* @import { Result as CommonResult } from '../../result/types.ts'
|
|
33
|
+
* @import { StringMap } from '../../object/types.ts'
|
|
34
|
+
* @import { List } from '../../list/types.ts'
|
|
35
|
+
* @import { Container, IsContainer, ValidateE, ValidationError, Visitor } from '../common/types.ts'
|
|
36
|
+
* @import { Unknown } from '../ts/types.ts'
|
|
37
|
+
* @import { Parse } from './types.ts'
|
|
30
38
|
*/
|
|
31
|
-
|
|
32
|
-
/** @import { Result as CommonResult } from '../../result/types.ts' */
|
|
39
|
+
|
|
33
40
|
import { ok } from '../../result/module.f.mjs'
|
|
34
|
-
/** @import { StringMap } from '../../object/types.ts' */
|
|
35
|
-
/** @import { List } from '../../list/types.ts' */
|
|
36
41
|
import { reverse, toArray } from '../../list/module.f.mjs'
|
|
37
42
|
import {
|
|
38
43
|
constPrimitiveValidate,
|
|
@@ -44,9 +49,6 @@ import {
|
|
|
44
49
|
verror,
|
|
45
50
|
visit,
|
|
46
51
|
} 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
52
|
|
|
51
53
|
const { entries } = Object
|
|
52
54
|
|
|
@@ -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: () => {
|
|
@@ -173,12 +153,12 @@ 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
158
|
// The key behavior change vs `validate`: extra tuple elements are dropped.
|
|
179
159
|
extraItemsDropped: () => {
|
|
180
160
|
const r = parse(/** @type {const} */ ([42]))([42, 'extra'])
|
|
181
|
-
|
|
161
|
+
assertStructurallySame(unwrap(r), [42])
|
|
182
162
|
},
|
|
183
163
|
error: () => {
|
|
184
164
|
assertError(parse(/** @type {const} */ ([42]))([99]))
|
|
@@ -189,12 +169,12 @@ export const proof = {
|
|
|
189
169
|
ok: () => {
|
|
190
170
|
const t = /** @type {const} */ ({ a: 42, b: 'hello' })
|
|
191
171
|
const r = parse(t)({ a: 42, b: 'hello' })
|
|
192
|
-
|
|
172
|
+
assertStructurallySame(unwrap(r), { a: 42, b: 'hello' })
|
|
193
173
|
},
|
|
194
174
|
// Undeclared properties are dropped from the constructed value.
|
|
195
175
|
extraKeysDropped: () => {
|
|
196
176
|
const r = parse(/** @type {const} */ ({ a: /** @type {const} */ (42) }))({ a: 42, b: 'extra' })
|
|
197
|
-
|
|
177
|
+
assertStructurallySame(unwrap(r), { a: 42 })
|
|
198
178
|
},
|
|
199
179
|
error: () => {
|
|
200
180
|
assertError(parse(/** @type {const} */ ({ a: 42 }))({ a: 99 }))
|
|
@@ -205,11 +185,11 @@ export const proof = {
|
|
|
205
185
|
array: {
|
|
206
186
|
empty: () => {
|
|
207
187
|
const r = parse(array(number))([])
|
|
208
|
-
|
|
188
|
+
assertStructurallySame(unwrap(r), [])
|
|
209
189
|
},
|
|
210
190
|
ok: () => {
|
|
211
191
|
const r = parse(array(number))([1, 2, 3])
|
|
212
|
-
|
|
192
|
+
assertStructurallySame(unwrap(r), [1, 2, 3])
|
|
213
193
|
},
|
|
214
194
|
// `parse` always constructs a new array, even when the inner type is a primitive.
|
|
215
195
|
freshArray: () => {
|
|
@@ -217,7 +197,7 @@ export const proof = {
|
|
|
217
197
|
/** @type {readonly number[]} */
|
|
218
198
|
const out = unwrap(parse(array(number))(input))
|
|
219
199
|
assert(out !== /** @type {unknown} */ (input), 'expected a fresh array')
|
|
220
|
-
|
|
200
|
+
assertStructurallySame(out, [1, 2, 3])
|
|
221
201
|
},
|
|
222
202
|
error: () => {
|
|
223
203
|
assertError(parse(array(number))([1, 'two', 3]))
|
|
@@ -226,18 +206,18 @@ export const proof = {
|
|
|
226
206
|
},
|
|
227
207
|
nested: () => {
|
|
228
208
|
const r = parse(array(array(boolean)))([[true, false], [false]])
|
|
229
|
-
|
|
209
|
+
assertStructurallySame(unwrap(r), [[true, false], [false]])
|
|
230
210
|
assertError(parse(array(array(boolean)))([[true, 42]]))
|
|
231
211
|
},
|
|
232
212
|
},
|
|
233
213
|
record: {
|
|
234
214
|
empty: () => {
|
|
235
215
|
const r = parse(record(number))({})
|
|
236
|
-
|
|
216
|
+
assertStructurallySame(unwrap(r), {})
|
|
237
217
|
},
|
|
238
218
|
ok: () => {
|
|
239
219
|
const r = parse(record(string))({ a: 'hello', b: 'world' })
|
|
240
|
-
|
|
220
|
+
assertStructurallySame(unwrap(r), { a: 'hello', b: 'world' })
|
|
241
221
|
},
|
|
242
222
|
// `parse` always constructs a new record.
|
|
243
223
|
freshRecord: () => {
|
|
@@ -245,7 +225,7 @@ export const proof = {
|
|
|
245
225
|
/** @type {Record<string, number>} */
|
|
246
226
|
const out = unwrap(parse(record(number))(input))
|
|
247
227
|
assert(out !== /** @type {unknown} */ (input), 'expected a fresh record')
|
|
248
|
-
|
|
228
|
+
assertStructurallySame(out, { a: 1, b: 2 })
|
|
249
229
|
},
|
|
250
230
|
error: () => {
|
|
251
231
|
assertError(parse(record(number))({ a: 1, b: 'two' }))
|
|
@@ -294,7 +274,7 @@ export const proof = {
|
|
|
294
274
|
/** @type {readonly number[]} */
|
|
295
275
|
const out = unwrap(parse(t)([1, 2, 3]))
|
|
296
276
|
// The const tuple `[number]` matches first and returns a length-1 result.
|
|
297
|
-
|
|
277
|
+
assertStructurallySame(out, [1])
|
|
298
278
|
},
|
|
299
279
|
},
|
|
300
280
|
option: {
|
|
@@ -1,16 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime printer mirroring the `Ts<T>` type transformer for RTTI schemas.
|
|
3
|
+
* See `./types.ts` for `Ts<T>` and the `*Ts` transformer types.
|
|
4
|
+
*
|
|
5
|
+
* The printer routes through the serializable RTTI data form
|
|
6
|
+
* (`fjs/types/rtti/data`): `thunk RTTI → toData → dataToTs`. The data form
|
|
7
|
+
* is a finite graph, so recursive schemas — which the thunk graph represents
|
|
8
|
+
* as self-referencing functions with no leaves — terminate: every named rule
|
|
9
|
+
* becomes a TypeScript type-alias definition and every graph edge prints as
|
|
10
|
+
* that alias's identifier. Output is canonical: union members follow the
|
|
11
|
+
* data form's kind order and object keys its sorted order, so structurally
|
|
12
|
+
* different but equivalent schemas print identically.
|
|
13
|
+
*
|
|
14
|
+
* @module
|
|
15
|
+
*
|
|
16
|
+
* @import { Printer, StructField } from '../../ts/types.ts'
|
|
17
|
+
* @import { Type } from '../types.ts'
|
|
18
|
+
* @import { ArraySet, Data, KindSet, Node, ObjectSet, RuleSet, UnionSet } from '../data/types.ts'
|
|
19
|
+
*/
|
|
20
|
+
import type { Printer } from '../../ts/types.ts';
|
|
1
21
|
import type { Type } from '../types.ts';
|
|
2
|
-
|
|
22
|
+
import type { Data, RuleSet } from '../data/types.ts';
|
|
23
|
+
export type _Ctx = {
|
|
24
|
+
readonly ts: Printer;
|
|
25
|
+
readonly ids: readonly (readonly [string, string])[];
|
|
26
|
+
readonly rules: RuleSet;
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Renders a serializable RTTI {@link Data} (from `toData`) as TypeScript:
|
|
30
|
+
* the rule definitions as sorted `[identifier, expression]` pairs — render
|
|
31
|
+
* each as `type <identifier> = <expression>` — plus the entry expression,
|
|
32
|
+
* which references those identifiers. A schema with no reference cycles has
|
|
33
|
+
* no definitions and the entry expression stands alone.
|
|
34
|
+
*
|
|
35
|
+
* Rule names come from the data form; one that cannot name a type alias —
|
|
36
|
+
* not an identifier, a predefined type name, an ECMAScript reserved word,
|
|
37
|
+
* or a type-operator keyword — gets a deterministic generated identifier
|
|
38
|
+
* (`T0`, `T1`, …). A reference naming a missing definition panics.
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* ```js
|
|
42
|
+
* const list = () => ['array', list]
|
|
43
|
+
* dataToTs()(toData(list))
|
|
44
|
+
* // [[['list', 'readonly(list)[]']], 'list']
|
|
45
|
+
* // i.e. `type list = readonly(list)[]` and the entry expression `list`
|
|
46
|
+
* ```
|
|
47
|
+
*
|
|
48
|
+
* @type {(mut?: true) => (data: Data) => readonly [readonly (readonly [string, string])[], string]}
|
|
49
|
+
*/
|
|
50
|
+
export declare const dataToTs: (mut?: true) => (data: Data) => readonly [readonly (readonly [string, string])[], string];
|
|
3
51
|
/**
|
|
4
|
-
* Creates a printer that converts an RTTI schema `Type` to its TypeScript
|
|
52
|
+
* Creates a printer that converts an RTTI schema `Type` to its TypeScript
|
|
53
|
+
* type expression as a string, through the canonical data form: `toData`
|
|
54
|
+
* first, then {@link dataToTs}.
|
|
5
55
|
*
|
|
6
|
-
* Mirrors the compile-time `Ts<T>` mapped type at runtime
|
|
7
|
-
*
|
|
56
|
+
* Mirrors the compile-time `Ts<T>` mapped type at runtime, in the data
|
|
57
|
+
* form's canonical order — union members follow its kind order (e.g.
|
|
58
|
+
* `option(number)` prints `'undefined|number'`) and structurally different
|
|
59
|
+
* but equivalent schemas print identically (`or(true, false)` prints
|
|
60
|
+
* `'boolean'`). Pass `true` to emit mutable (non-`readonly`) types.
|
|
8
61
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
62
|
+
* A recursive schema prints as the identifier of its definition — use
|
|
63
|
+
* {@link dataToTs} to also obtain the `type <identifier> = <expression>`
|
|
64
|
+
* definitions the expression references; a schema with no reference cycles
|
|
65
|
+
* needs none.
|
|
11
66
|
*
|
|
12
|
-
* **Note:** the `unknown` schema produces the string `'unknown'`
|
|
13
|
-
* whereas `Ts<>` maps it to `DjsUnknown` from
|
|
67
|
+
* **Note:** the `unknown` schema produces the string `'unknown'`
|
|
68
|
+
* (TypeScript's built-in), whereas `Ts<>` maps it to `DjsUnknown` from
|
|
69
|
+
* `djs/module.f.ts`.
|
|
14
70
|
*
|
|
15
71
|
* @example
|
|
16
72
|
* ```js
|
|
@@ -18,12 +74,15 @@ import type { Type } from '../types.ts';
|
|
|
18
74
|
* toTs(boolean) // 'boolean'
|
|
19
75
|
* toTs(array(number)) // 'readonly(number)[]'
|
|
20
76
|
* toTs(record(string)) // '{readonly[k in string]?:string}'
|
|
21
|
-
* toTs(or(string, number)) // 'string
|
|
77
|
+
* toTs(or(string, number)) // 'number|string'
|
|
22
78
|
* toTs(42) // '42'
|
|
23
79
|
* toTs('hello') // '"hello"'
|
|
24
80
|
* toTs([boolean, number]) // 'readonly[boolean,number]'
|
|
25
81
|
* toTs({ x: string }) // '{readonly"x":string}'
|
|
26
82
|
*
|
|
83
|
+
* const list = () => ['array', list]
|
|
84
|
+
* toTs(list) // 'list' — see `dataToTs` for the definition
|
|
85
|
+
*
|
|
27
86
|
* const toTsMut = printer(true)
|
|
28
87
|
* toTsMut(array(number)) // '(number)[]'
|
|
29
88
|
* toTsMut(record(string)) // '{[k in string]?:string}'
|