functionalscript 0.37.0 → 0.38.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/{fs → fjs}/asn.1/proof.f.js +32 -94
- package/fjs/asserts/module.f.d.ts +36 -0
- package/fjs/asserts/module.f.js +39 -0
- package/fjs/asserts/proof.f.d.ts +11 -0
- package/fjs/asserts/proof.f.js +18 -0
- package/{fs → fjs}/base_n/proof.f.js +12 -36
- package/{fs → fjs}/basen/base64/proof.f.d.ts +1 -0
- package/{fs → fjs}/basen/base64/proof.f.js +15 -1
- package/{fs → fjs}/basen/cbase32/proof.f.js +15 -42
- package/fjs/bnf/data/module.f.d.ts +52 -0
- package/{fs → fjs}/bnf/data/module.f.js +53 -3
- package/{fs → fjs}/bnf/data/proof.f.d.ts +1 -0
- package/{fs → fjs}/bnf/data/proof.f.js +54 -19
- package/{fs → fjs}/bnf/descent/module.f.d.ts +4 -14
- package/fjs/bnf/descent/module.f.js +124 -0
- package/{fs → fjs}/bnf/descent/proof.f.d.ts +1 -0
- package/{fs → fjs}/bnf/descent/proof.f.js +55 -24
- package/{fs → fjs}/bnf/ll1/module.f.d.ts +4 -4
- package/{fs → fjs}/bnf/ll1/module.f.js +7 -5
- package/{fs → fjs}/bnf/ll1/proof.f.d.ts +1 -0
- package/{fs → fjs}/bnf/ll1/proof.f.js +27 -10
- package/{fs → fjs}/bnf/module.f.d.ts +19 -5
- package/{fs → fjs}/bnf/module.f.js +10 -11
- package/fjs/bnf/proof.f.js +69 -0
- package/{fs → fjs}/bnf/testlib.f.js +2 -2
- package/{fs → fjs}/cas/cli/proof.f.d.ts +4 -1
- package/{fs → fjs}/cas/cli/proof.f.js +29 -66
- package/fjs/cas/evo/mcp/module.f.d.ts +19 -0
- package/fjs/cas/evo/mcp/module.f.js +56 -0
- package/fjs/cas/evo/mcp/proof.f.d.ts +9 -0
- package/fjs/cas/evo/mcp/proof.f.js +95 -0
- package/fjs/cas/evo/module.f.d.ts +138 -0
- package/fjs/cas/evo/module.f.js +309 -0
- package/fjs/cas/evo/proof.f.d.ts +32 -0
- package/fjs/cas/evo/proof.f.js +453 -0
- package/fjs/cas/mcp/module.f.d.ts +49 -0
- package/{fs → fjs}/cas/mcp/module.f.js +54 -76
- package/{fs → fjs}/cas/mcp/proof.f.d.ts +4 -1
- package/{fs → fjs}/cas/mcp/proof.f.js +41 -13
- package/{fs → fjs}/cas/module.f.d.ts +10 -0
- package/{fs → fjs}/cas/module.f.js +27 -1
- package/{fs → fjs}/cas/proof.f.d.ts +4 -0
- package/{fs → fjs}/cas/proof.f.js +77 -86
- package/{fs → fjs}/ci/config/module.f.d.ts +5 -5
- package/{fs → fjs}/ci/config/module.f.js +5 -5
- package/{fs → fjs}/ci/proof.f.js +14 -9
- package/{fs → fjs}/ci/rust/module.f.js +9 -1
- package/{fs → fjs}/cli/proof.f.js +22 -63
- package/{fs → fjs}/common/monoid/proof.f.js +4 -9
- package/{fs → fjs}/crypto/hmac/proof.f.js +4 -12
- package/fjs/crypto/pow/proof.f.js +111 -0
- package/{fs → fjs}/crypto/secp/proof.f.js +12 -33
- package/{fs → fjs}/crypto/sha2/proof.f.js +18 -49
- package/{fs → fjs}/crypto/sign/module.f.d.ts +0 -5
- package/{fs → fjs}/crypto/sign/module.f.js +7 -4
- package/{fs → fjs}/crypto/sign/proof.f.js +36 -105
- package/{fs → fjs}/crypto/vdf/proof.f.js +22 -63
- package/{fs → fjs}/dev/package_json/proof.f.js +7 -7
- package/{fs → fjs}/dev/proof.f.js +2 -4
- package/{fs → fjs}/djs/ast/proof.f.js +4 -12
- package/{fs → fjs}/djs/parser/module.f.d.ts +5 -0
- package/{fs → fjs}/djs/parser/module.f.js +20 -0
- package/{fs → fjs}/djs/parser/proof.f.js +138 -400
- package/{fs → fjs}/djs/proof.f.js +13 -36
- package/{fs → fjs}/djs/serializer/proof.f.js +14 -39
- package/fjs/djs/tokenizer/module.f.d.ts +24 -0
- package/fjs/djs/tokenizer/module.f.js +472 -0
- package/{fs/djs/tokenizer-new → fjs/djs/tokenizer}/proof.f.d.ts +4 -3
- package/{fs/djs/tokenizer-new → fjs/djs/tokenizer}/proof.f.js +446 -445
- package/{fs → fjs}/djs/transpiler/proof.f.d.ts +3 -0
- package/{fs → fjs}/djs/transpiler/proof.f.js +29 -30
- package/{fs → fjs}/effects/memory/proof.f.js +8 -21
- package/{fs → fjs}/effects/node/memory/proof.js +5 -12
- package/{fs → fjs}/effects/node/module.d.ts +1 -1
- package/{fs → fjs}/effects/node/module.f.d.ts +1 -1
- package/{fs → fjs}/effects/node/module.js +3 -3
- package/{fs → fjs}/effects/node/proof.f.d.ts +1 -0
- package/{fs → fjs}/effects/node/proof.f.js +106 -292
- package/{fs → fjs}/effects/node/virtual/proof.f.d.ts +1 -0
- package/{fs → fjs}/effects/node/virtual/proof.f.js +36 -29
- package/{fs → fjs}/effects/proof.f.js +16 -45
- package/{fs → fjs}/emergent_testing/proof.f.js +7 -7
- package/{fs → fjs}/fsc/proof.f.js +12 -34
- package/{fs → fjs}/fsm/proof.f.js +5 -12
- package/{fs → fjs}/mcp/module.f.d.ts +7 -0
- package/{fs → fjs}/mcp/module.f.js +9 -2
- package/{fs → fjs}/mcp/proof.f.js +12 -12
- package/{fs → fjs}/mcp/stdio/module.f.d.ts +2 -2
- package/{fs → fjs}/mcp/stdio/module.f.js +2 -2
- package/{fs → fjs}/media/html/proof.f.js +12 -33
- package/{fs → fjs}/media/json/parser/module.f.d.ts +5 -0
- package/{fs → fjs}/media/json/parser/module.f.js +14 -0
- package/{fs → fjs}/media/json/parser/proof.f.js +39 -114
- package/{fs → fjs}/media/json/rpc/module.f.js +1 -1
- package/{fs → fjs}/media/json/schema/module.f.d.ts +2 -2
- package/{fs → fjs}/media/json/schema/module.f.js +23 -39
- package/{fs → fjs}/media/json/schema/proof.f.js +3 -6
- package/{fs → fjs}/media/json/serializer/proof.f.js +10 -27
- package/{fs → fjs}/media/module.f.d.ts +6 -6
- package/{fs → fjs}/media/module.f.js +3 -4
- package/{fs → fjs}/media/proof.f.js +5 -4
- package/{fs → fjs}/media/revision/module.f.d.ts +31 -4
- package/{fs → fjs}/media/revision/module.f.js +35 -23
- package/{fs → fjs}/media/revision/proof.f.d.ts +10 -8
- package/fjs/media/revision/proof.f.js +140 -0
- package/{fs → fjs}/media/type/proof.f.js +2 -6
- package/{fs → fjs}/module.f.js +1 -1
- package/{fs → fjs}/path/proof.f.js +27 -78
- package/{fs → fjs}/proof.f.js +2 -0
- package/{fs → fjs}/sul/id/proof.f.js +7 -21
- package/{fs → fjs}/sul/level/hash/proof.f.js +5 -5
- package/{fs → fjs}/sul/level/literal/proof.f.js +12 -26
- package/fjs/text/ascii/proof.f.d.ts +6 -0
- package/{fs → fjs}/text/ascii/proof.f.js +4 -14
- package/{fs → fjs}/text/code_point/module.f.js +10 -10
- package/{fs → fjs}/text/proof.f.js +4 -9
- package/{fs → fjs}/text/sgr/proof.f.js +6 -15
- package/{fs → fjs}/text/utf16/module.f.js +1 -1
- package/{fs → fjs}/text/utf16/proof.f.js +23 -66
- package/{fs → fjs}/text/utf8/proof.f.js +56 -125
- package/{fs → fjs}/types/array/proof.f.js +18 -52
- package/fjs/types/bigfloat/proof.f.js +217 -0
- package/{fs → fjs}/types/bigint/proof.f.js +49 -145
- package/{fs → fjs}/types/bit_vec/proof.f.js +72 -214
- package/{fs → fjs}/types/btree/find/proof.f.js +23 -66
- package/{fs → fjs}/types/btree/proof.f.js +5 -12
- package/{fs → fjs}/types/btree/remove/proof.f.d.ts +2 -0
- package/{fs → fjs}/types/btree/remove/proof.f.js +83 -230
- package/{fs → fjs}/types/btree/set/module.f.js +5 -2
- package/{fs → fjs}/types/btree/set/proof.f.js +35 -24
- package/{fs → fjs}/types/byte_set/proof.f.js +22 -63
- package/{fs → fjs}/types/function/compare/proof.f.js +13 -36
- package/{fs → fjs}/types/function/operator/proof.f.js +17 -48
- package/{fs → fjs}/types/function/proof.f.js +2 -3
- package/{fs → fjs}/types/list/proof.f.js +55 -163
- package/{fs → fjs}/types/map/proof.f.js +4 -12
- package/{fs → fjs}/types/nibble_set/proof.f.js +16 -45
- package/{fs → fjs}/types/nominal/proof.f.js +5 -10
- package/fjs/types/nullable/proof.f.js +29 -0
- package/{fs → fjs}/types/number/proof.f.js +9 -24
- package/{fs → fjs}/types/object/proof.f.js +3 -6
- package/{fs → fjs}/types/patricia_trie/proof.f.js +21 -21
- package/{fs → fjs}/types/prime_field/module.f.js +2 -7
- package/{fs → fjs}/types/range/module.f.d.ts +1 -1
- package/fjs/types/range/module.f.js +2 -0
- package/fjs/types/range/proof.f.js +9 -0
- package/{fs → fjs}/types/range_map/proof.f.js +28 -81
- package/{fs → fjs}/types/result/proof.f.d.ts +3 -2
- package/fjs/types/result/proof.f.js +31 -0
- package/{fs → fjs}/types/rtti/common/module.f.d.ts +36 -1
- package/{fs → fjs}/types/rtti/common/module.f.js +44 -0
- package/fjs/types/rtti/common/proof.f.d.ts +8 -0
- package/fjs/types/rtti/common/proof.f.js +51 -0
- package/{fs → fjs}/types/rtti/parse/module.f.js +13 -22
- package/{fs → fjs}/types/rtti/parse/proof.f.js +7 -18
- package/{fs → fjs}/types/rtti/ts/module.f.d.ts +10 -4
- package/{fs → fjs}/types/rtti/validate/module.f.js +8 -29
- package/{fs → fjs}/types/rtti/validate/proof.f.js +4 -9
- package/{fs → fjs}/types/sorted_list/proof.f.js +8 -21
- package/{fs → fjs}/types/sorted_set/proof.f.js +14 -39
- package/fjs/types/string/proof.f.js +77 -0
- package/fjs/types/string_set/proof.f.js +43 -0
- package/{fs → fjs}/types/ts/proof.f.js +15 -42
- package/{fs → fjs}/types/uint8array/module.f.js +7 -7
- package/{fs → fjs}/types/uint8array/proof.f.d.ts +4 -1
- package/{fs → fjs}/types/uint8array/proof.f.js +7 -7
- package/{fs → fjs}/website/proof.f.js +3 -6
- package/package.json +6 -6
- package/fs/asserts/module.f.d.ts +0 -4
- package/fs/asserts/module.f.js +0 -9
- package/fs/asserts/proof.f.d.ts +0 -8
- package/fs/asserts/proof.f.js +0 -51
- package/fs/bnf/data/module.f.d.ts +0 -30
- package/fs/bnf/descent/module.f.js +0 -119
- package/fs/bnf/proof.f.js +0 -104
- package/fs/cas/mcp/module.f.d.ts +0 -36
- package/fs/crypto/pow/proof.f.js +0 -161
- package/fs/djs/tokenizer/module.f.d.ts +0 -12
- package/fs/djs/tokenizer/module.f.js +0 -62
- package/fs/djs/tokenizer/proof.f.d.ts +0 -7
- package/fs/djs/tokenizer/proof.f.js +0 -543
- package/fs/djs/tokenizer-new/module.f.d.ts +0 -3
- package/fs/djs/tokenizer-new/module.f.js +0 -155
- package/fs/media/revision/proof.f.js +0 -119
- package/fs/text/ascii/proof.f.d.ts +0 -4
- package/fs/types/bigfloat/proof.f.js +0 -348
- package/fs/types/nullable/proof.f.js +0 -50
- package/fs/types/range/module.f.js +0 -2
- package/fs/types/range/proof.f.js +0 -18
- package/fs/types/result/proof.f.js +0 -52
- package/fs/types/string/proof.f.js +0 -118
- package/fs/types/string_set/proof.f.js +0 -82
- /package/{fs → fjs}/asn.1/module.f.d.ts +0 -0
- /package/{fs → fjs}/asn.1/module.f.js +0 -0
- /package/{fs → fjs}/asn.1/proof.f.d.ts +0 -0
- /package/{fs → fjs}/base_n/module.f.d.ts +0 -0
- /package/{fs → fjs}/base_n/module.f.js +0 -0
- /package/{fs → fjs}/base_n/proof.f.d.ts +0 -0
- /package/{fs → fjs}/basen/base128/module.f.d.ts +0 -0
- /package/{fs → fjs}/basen/base128/module.f.js +0 -0
- /package/{fs → fjs}/basen/base128/proof.f.d.ts +0 -0
- /package/{fs → fjs}/basen/base128/proof.f.js +0 -0
- /package/{fs → fjs}/basen/base64/module.f.d.ts +0 -0
- /package/{fs → fjs}/basen/base64/module.f.js +0 -0
- /package/{fs → fjs}/basen/cbase32/module.f.d.ts +0 -0
- /package/{fs → fjs}/basen/cbase32/module.f.js +0 -0
- /package/{fs → fjs}/basen/cbase32/proof.f.d.ts +0 -0
- /package/{fs → fjs}/bnf/proof.f.d.ts +0 -0
- /package/{fs → fjs}/bnf/testlib.f.d.ts +0 -0
- /package/{fs → fjs}/cas/cli/module.f.d.ts +0 -0
- /package/{fs → fjs}/cas/cli/module.f.js +0 -0
- /package/{fs → fjs}/ci/bun/module.f.d.ts +0 -0
- /package/{fs → fjs}/ci/bun/module.f.js +0 -0
- /package/{fs → fjs}/ci/common/module.f.d.ts +0 -0
- /package/{fs → fjs}/ci/common/module.f.js +0 -0
- /package/{fs → fjs}/ci/deno/module.f.d.ts +0 -0
- /package/{fs → fjs}/ci/deno/module.f.js +0 -0
- /package/{fs → fjs}/ci/module.f.d.ts +0 -0
- /package/{fs → fjs}/ci/module.f.js +0 -0
- /package/{fs → fjs}/ci/node/module.f.d.ts +0 -0
- /package/{fs → fjs}/ci/node/module.f.js +0 -0
- /package/{fs → fjs}/ci/playwright/module.f.d.ts +0 -0
- /package/{fs → fjs}/ci/playwright/module.f.js +0 -0
- /package/{fs → fjs}/ci/proof.f.d.ts +0 -0
- /package/{fs → fjs}/ci/rust/module.f.d.ts +0 -0
- /package/{fs → fjs}/cli/module.f.d.ts +0 -0
- /package/{fs → fjs}/cli/module.f.js +0 -0
- /package/{fs → fjs}/cli/proof.f.d.ts +0 -0
- /package/{fs → fjs}/common/monoid/module.f.d.ts +0 -0
- /package/{fs → fjs}/common/monoid/module.f.js +0 -0
- /package/{fs → fjs}/common/monoid/proof.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/hmac/module.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/hmac/module.f.js +0 -0
- /package/{fs → fjs}/crypto/hmac/proof.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/pow/module.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/pow/module.f.js +0 -0
- /package/{fs → fjs}/crypto/pow/proof.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/secp/module.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/secp/module.f.js +0 -0
- /package/{fs → fjs}/crypto/secp/proof.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/sha2/module.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/sha2/module.f.js +0 -0
- /package/{fs → fjs}/crypto/sha2/proof.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/sign/proof.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/vdf/module.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/vdf/module.f.js +0 -0
- /package/{fs → fjs}/crypto/vdf/proof.f.d.ts +0 -0
- /package/{fs → fjs}/dev/module.f.d.ts +0 -0
- /package/{fs → fjs}/dev/module.f.js +0 -0
- /package/{fs → fjs}/dev/package_json/module.f.d.ts +0 -0
- /package/{fs → fjs}/dev/package_json/module.f.js +0 -0
- /package/{fs → fjs}/dev/package_json/proof.f.d.ts +0 -0
- /package/{fs → fjs}/dev/proof.f.d.ts +0 -0
- /package/{fs → fjs}/djs/ast/module.f.d.ts +0 -0
- /package/{fs → fjs}/djs/ast/module.f.js +0 -0
- /package/{fs → fjs}/djs/ast/proof.f.d.ts +0 -0
- /package/{fs → fjs}/djs/examples/input.f.d.ts +0 -0
- /package/{fs → fjs}/djs/examples/input.f.js +0 -0
- /package/{fs → fjs}/djs/examples/m.f.d.ts +0 -0
- /package/{fs → fjs}/djs/examples/m.f.js +0 -0
- /package/{fs → fjs}/djs/module.f.d.ts +0 -0
- /package/{fs → fjs}/djs/module.f.js +0 -0
- /package/{fs → fjs}/djs/parser/proof.f.d.ts +0 -0
- /package/{fs → fjs}/djs/proof.f.d.ts +0 -0
- /package/{fs → fjs}/djs/serializer/module.f.d.ts +0 -0
- /package/{fs → fjs}/djs/serializer/module.f.js +0 -0
- /package/{fs → fjs}/djs/serializer/proof.f.d.ts +0 -0
- /package/{fs → fjs}/djs/transpiler/module.f.d.ts +0 -0
- /package/{fs → fjs}/djs/transpiler/module.f.js +0 -0
- /package/{fs → fjs}/effects/list/module.f.d.ts +0 -0
- /package/{fs → fjs}/effects/list/module.f.js +0 -0
- /package/{fs → fjs}/effects/memory/module.f.d.ts +0 -0
- /package/{fs → fjs}/effects/memory/module.f.js +0 -0
- /package/{fs → fjs}/effects/memory/proof.f.d.ts +0 -0
- /package/{fs → fjs}/effects/mock/module.f.d.ts +0 -0
- /package/{fs → fjs}/effects/mock/module.f.js +0 -0
- /package/{fs → fjs}/effects/module.d.ts +0 -0
- /package/{fs → fjs}/effects/module.f.d.ts +0 -0
- /package/{fs → fjs}/effects/module.f.js +0 -0
- /package/{fs → fjs}/effects/module.js +0 -0
- /package/{fs → fjs}/effects/node/memory/module.d.ts +0 -0
- /package/{fs → fjs}/effects/node/memory/module.js +0 -0
- /package/{fs → fjs}/effects/node/memory/proof.d.ts +0 -0
- /package/{fs → fjs}/effects/node/module.f.js +0 -0
- /package/{fs → fjs}/effects/node/virtual/module.f.d.ts +0 -0
- /package/{fs → fjs}/effects/node/virtual/module.f.js +0 -0
- /package/{fs → fjs}/effects/proof.f.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/all.test.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/all.test.js +0 -0
- /package/{fs → fjs}/emergent_testing/example.f.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/example.f.js +0 -0
- /package/{fs → fjs}/emergent_testing/module.f.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/module.f.js +0 -0
- /package/{fs → fjs}/emergent_testing/proof.f.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/all.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/all.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.fail.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.fail.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.pass.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.pass.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async.fail.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async.fail.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async.pass.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async.pass.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/fail.fail.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/fail.fail.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/return-value.pass.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/return-value.pass.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/thenable.pass.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/thenable.pass.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/thenable2.pass.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/thenable2.pass.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/throw.pass.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/throw.pass.js +0 -0
- /package/{fs → fjs}/fsc/bnf.f.d.ts +0 -0
- /package/{fs → fjs}/fsc/bnf.f.js +0 -0
- /package/{fs → fjs}/fsc/json.f.d.ts +0 -0
- /package/{fs → fjs}/fsc/json.f.js +0 -0
- /package/{fs → fjs}/fsc/module.f.d.ts +0 -0
- /package/{fs → fjs}/fsc/module.f.js +0 -0
- /package/{fs → fjs}/fsc/proof.f.d.ts +0 -0
- /package/{fs → fjs}/fsm/module.f.d.ts +0 -0
- /package/{fs → fjs}/fsm/module.f.js +0 -0
- /package/{fs → fjs}/fsm/proof.f.d.ts +0 -0
- /package/{fs → fjs}/js/tokenizer/module.f.d.ts +0 -0
- /package/{fs → fjs}/js/tokenizer/module.f.js +0 -0
- /package/{fs → fjs}/js/tokenizer/proof.f.d.ts +0 -0
- /package/{fs → fjs}/js/tokenizer/proof.f.js +0 -0
- /package/{fs → fjs}/mcp/proof.f.d.ts +0 -0
- /package/{fs → fjs}/mcp/stdio/proof.f.d.ts +0 -0
- /package/{fs → fjs}/mcp/stdio/proof.f.js +0 -0
- /package/{fs → fjs}/media/html/module.f.d.ts +0 -0
- /package/{fs → fjs}/media/html/module.f.js +0 -0
- /package/{fs → fjs}/media/html/proof.f.d.ts +0 -0
- /package/{fs → fjs}/media/json/module.f.d.ts +0 -0
- /package/{fs → fjs}/media/json/module.f.js +0 -0
- /package/{fs → fjs}/media/json/parser/proof.f.d.ts +0 -0
- /package/{fs → fjs}/media/json/proof.f.d.ts +0 -0
- /package/{fs → fjs}/media/json/proof.f.js +0 -0
- /package/{fs → fjs}/media/json/rpc/module.f.d.ts +0 -0
- /package/{fs → fjs}/media/json/rpc/proof.f.d.ts +0 -0
- /package/{fs → fjs}/media/json/rpc/proof.f.js +0 -0
- /package/{fs → fjs}/media/json/schema/proof.f.d.ts +0 -0
- /package/{fs → fjs}/media/json/serializer/module.f.d.ts +0 -0
- /package/{fs → fjs}/media/json/serializer/module.f.js +0 -0
- /package/{fs → fjs}/media/json/serializer/proof.f.d.ts +0 -0
- /package/{fs → fjs}/media/json/tokenizer/module.f.d.ts +0 -0
- /package/{fs → fjs}/media/json/tokenizer/module.f.js +0 -0
- /package/{fs → fjs}/media/json/tokenizer/proof.f.d.ts +0 -0
- /package/{fs → fjs}/media/json/tokenizer/proof.f.js +0 -0
- /package/{fs → fjs}/media/proof.f.d.ts +0 -0
- /package/{fs → fjs}/media/type/module.f.d.ts +0 -0
- /package/{fs → fjs}/media/type/module.f.js +0 -0
- /package/{fs → fjs}/media/type/proof.f.d.ts +0 -0
- /package/{fs → fjs}/module.d.ts +0 -0
- /package/{fs → fjs}/module.f.d.ts +0 -0
- /package/{fs → fjs}/module.js +0 -0
- /package/{fs → fjs}/path/module.f.d.ts +0 -0
- /package/{fs → fjs}/path/module.f.js +0 -0
- /package/{fs → fjs}/path/proof.f.d.ts +0 -0
- /package/{fs → fjs}/proof.f.d.ts +0 -0
- /package/{fs → fjs}/sul/id/module.f.d.ts +0 -0
- /package/{fs → fjs}/sul/id/module.f.js +0 -0
- /package/{fs → fjs}/sul/id/proof.f.d.ts +0 -0
- /package/{fs → fjs}/sul/level/hash/module.f.d.ts +0 -0
- /package/{fs → fjs}/sul/level/hash/module.f.js +0 -0
- /package/{fs → fjs}/sul/level/hash/proof.f.d.ts +0 -0
- /package/{fs → fjs}/sul/level/literal/module.f.d.ts +0 -0
- /package/{fs → fjs}/sul/level/literal/module.f.js +0 -0
- /package/{fs → fjs}/sul/level/literal/proof.f.d.ts +0 -0
- /package/{fs → fjs}/sul/module.f.d.ts +0 -0
- /package/{fs → fjs}/sul/module.f.js +0 -0
- /package/{fs → fjs}/sul/proof.f.d.ts +0 -0
- /package/{fs → fjs}/sul/proof.f.js +0 -0
- /package/{fs → fjs}/text/ascii/module.f.d.ts +0 -0
- /package/{fs → fjs}/text/ascii/module.f.js +0 -0
- /package/{fs → fjs}/text/code_point/module.f.d.ts +0 -0
- /package/{fs → fjs}/text/code_point/proof.f.d.ts +0 -0
- /package/{fs → fjs}/text/code_point/proof.f.js +0 -0
- /package/{fs → fjs}/text/module.f.d.ts +0 -0
- /package/{fs → fjs}/text/module.f.js +0 -0
- /package/{fs → fjs}/text/proof.f.d.ts +0 -0
- /package/{fs → fjs}/text/sgr/module.f.d.ts +0 -0
- /package/{fs → fjs}/text/sgr/module.f.js +0 -0
- /package/{fs → fjs}/text/sgr/proof.f.d.ts +0 -0
- /package/{fs → fjs}/text/utf16/module.f.d.ts +0 -0
- /package/{fs → fjs}/text/utf16/proof.f.d.ts +0 -0
- /package/{fs → fjs}/text/utf8/module.f.d.ts +0 -0
- /package/{fs → fjs}/text/utf8/module.f.js +0 -0
- /package/{fs → fjs}/text/utf8/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/array/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/array/module.f.js +0 -0
- /package/{fs → fjs}/types/array/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/bigfloat/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/bigfloat/module.f.js +0 -0
- /package/{fs → fjs}/types/bigfloat/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/bigint/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/bigint/module.f.js +0 -0
- /package/{fs → fjs}/types/bigint/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/bit_vec/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/bit_vec/module.f.js +0 -0
- /package/{fs → fjs}/types/bit_vec/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/find/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/find/module.f.js +0 -0
- /package/{fs → fjs}/types/btree/find/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/module.f.js +0 -0
- /package/{fs → fjs}/types/btree/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/remove/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/remove/module.f.js +0 -0
- /package/{fs → fjs}/types/btree/set/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/set/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/types/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/types/module.f.js +0 -0
- /package/{fs → fjs}/types/byte_set/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/byte_set/module.f.js +0 -0
- /package/{fs → fjs}/types/byte_set/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/function/compare/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/function/compare/module.f.js +0 -0
- /package/{fs → fjs}/types/function/compare/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/function/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/function/module.f.js +0 -0
- /package/{fs → fjs}/types/function/operator/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/function/operator/module.f.js +0 -0
- /package/{fs → fjs}/types/function/operator/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/function/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/list/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/list/module.f.js +0 -0
- /package/{fs → fjs}/types/list/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/map/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/map/module.f.js +0 -0
- /package/{fs → fjs}/types/map/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/nibble_set/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/nibble_set/module.f.js +0 -0
- /package/{fs → fjs}/types/nibble_set/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/nominal/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/nominal/module.f.js +0 -0
- /package/{fs → fjs}/types/nominal/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/nullable/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/nullable/module.f.js +0 -0
- /package/{fs → fjs}/types/nullable/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/number/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/number/module.f.js +0 -0
- /package/{fs → fjs}/types/number/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/object/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/object/module.f.js +0 -0
- /package/{fs → fjs}/types/object/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/option/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/option/module.f.js +0 -0
- /package/{fs → fjs}/types/ordered_map/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/ordered_map/module.f.js +0 -0
- /package/{fs → fjs}/types/ordered_map/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/ordered_map/proof.f.js +0 -0
- /package/{fs → fjs}/types/patricia_trie/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/patricia_trie/module.f.js +0 -0
- /package/{fs → fjs}/types/patricia_trie/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/phantom/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/phantom/module.f.js +0 -0
- /package/{fs → fjs}/types/prime_field/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/prime_field/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/prime_field/proof.f.js +0 -0
- /package/{fs → fjs}/types/range/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/range_map/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/range_map/module.f.js +0 -0
- /package/{fs → fjs}/types/range_map/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/result/module.d.ts +0 -0
- /package/{fs → fjs}/types/result/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/result/module.f.js +0 -0
- /package/{fs → fjs}/types/result/module.js +0 -0
- /package/{fs → fjs}/types/rtti/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/rtti/module.f.js +0 -0
- /package/{fs → fjs}/types/rtti/parse/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/rtti/parse/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/rtti/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/rtti/proof.f.js +0 -0
- /package/{fs → fjs}/types/rtti/ts/module.f.js +0 -0
- /package/{fs → fjs}/types/rtti/ts/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/rtti/ts/proof.f.js +0 -0
- /package/{fs → fjs}/types/rtti/validate/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/rtti/validate/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/sorted_list/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/sorted_list/module.f.js +0 -0
- /package/{fs → fjs}/types/sorted_list/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/sorted_set/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/sorted_set/module.f.js +0 -0
- /package/{fs → fjs}/types/sorted_set/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/string/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/string/module.f.js +0 -0
- /package/{fs → fjs}/types/string/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/string_set/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/string_set/module.f.js +0 -0
- /package/{fs → fjs}/types/string_set/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/ts/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/ts/module.f.js +0 -0
- /package/{fs → fjs}/types/ts/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/uint8array/module.f.d.ts +0 -0
- /package/{fs → fjs}/website/module.f.d.ts +0 -0
- /package/{fs → fjs}/website/module.f.js +0 -0
- /package/{fs → fjs}/website/proof.f.d.ts +0 -0
|
@@ -0,0 +1,472 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Experimental DJS parser implementation.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import { descentParser } from "../../bnf/descent/module.f.js";
|
|
7
|
+
import { eof, none, notSet, option, range, remove, repeat, repeat0Plus, set, unicodeMax, unicodeRange } from "../../bnf/module.f.js";
|
|
8
|
+
import { isKeywordToken, } from "../../js/tokenizer/module.f.js";
|
|
9
|
+
import { multiply } from "../../types/bigfloat/module.f.js";
|
|
10
|
+
import { asterisk, backspace, ht, lf, ff, cr, quotationMark, solidus, reverseSolidus, digitRange, digit0, latinCapitalLetterA, latinSmallLetterA, latinSmallLetterB, latinSmallLetterF, latinSmallLetterN, latinSmallLetterR, latinSmallLetterT, latinSmallLetterU, range as asciiRange, } from "../../text/ascii/module.f.js";
|
|
11
|
+
import { codePointListToString, stringToCodePointList } from "../../text/utf16/module.f.js";
|
|
12
|
+
import { contains } from "../../types/range/module.f.js";
|
|
13
|
+
import { concat, empty, filter, flat, flatMap, fold, map, stateScan, toArray } from "../../types/list/module.f.js";
|
|
14
|
+
import { stringifyAsTree } from "../serializer/module.f.js";
|
|
15
|
+
import { sort } from "../../types/object/module.f.js";
|
|
16
|
+
// Builds the single-token grammar that jsGrammar's whole-file `tokens` rule repeats.
|
|
17
|
+
const buildToken = () => {
|
|
18
|
+
const onenine = range('19');
|
|
19
|
+
const digit = range('09');
|
|
20
|
+
const string = [
|
|
21
|
+
'"',
|
|
22
|
+
repeat0Plus({
|
|
23
|
+
...remove(range(` ${unicodeMax}`), set('"\\')),
|
|
24
|
+
escape: [
|
|
25
|
+
'\\',
|
|
26
|
+
{
|
|
27
|
+
...set('"\\bfnrt'),
|
|
28
|
+
solidus: '/',
|
|
29
|
+
u: [
|
|
30
|
+
'u',
|
|
31
|
+
...repeat(4)({
|
|
32
|
+
digit,
|
|
33
|
+
AF: range('AF'),
|
|
34
|
+
af: range('af'),
|
|
35
|
+
})
|
|
36
|
+
],
|
|
37
|
+
}
|
|
38
|
+
],
|
|
39
|
+
}),
|
|
40
|
+
'"'
|
|
41
|
+
];
|
|
42
|
+
const digits0 = repeat0Plus(digit);
|
|
43
|
+
const digits = [digit, digits0];
|
|
44
|
+
const ws = set(' \t');
|
|
45
|
+
const newLine = set('\n\r');
|
|
46
|
+
const idStart = {
|
|
47
|
+
smallLetter: range('az'),
|
|
48
|
+
bigLetter: range('AZ'),
|
|
49
|
+
lowLine: '_',
|
|
50
|
+
dollarSign: '$'
|
|
51
|
+
};
|
|
52
|
+
const idChar = {
|
|
53
|
+
...idStart,
|
|
54
|
+
digit
|
|
55
|
+
};
|
|
56
|
+
// '.' and 'e'/'E' always succeed once seen, tagging missing digits as `numError`,
|
|
57
|
+
// so a malformed fraction/exponent (e.g. `0.`, `0e`) fails the whole number instead
|
|
58
|
+
// of silently ending it early. The sign is matched via string-literal branches
|
|
59
|
+
// (not `set('+-')`) because a range-variant branch's tag is the matched character
|
|
60
|
+
// itself, which would collide with the '+'/'-' operator tags in filterFunc.
|
|
61
|
+
const fracPart = { withDot: ['.', { valid: digits, numError: none }], noDot: none };
|
|
62
|
+
const expPart = { withExp: [set('Ee'), option({ plus: '+', minus: '-' }), { valid: digits, numError: none }], noExp: none };
|
|
63
|
+
// ECMAScript disallows a NumericLiteral immediately followed by an IdentifierStart
|
|
64
|
+
// or DecimalDigit (e.g. `00`, `123abc`). Consume that character into the number and
|
|
65
|
+
// tag it `numError` instead of leaving it to silently start a new token. idChar is
|
|
66
|
+
// wrapped in a sequence so this branch's own `numError` tag survives — a variant
|
|
67
|
+
// referenced directly as another variant's branch loses the outer tag to whichever
|
|
68
|
+
// of its own branches matches.
|
|
69
|
+
const number = [
|
|
70
|
+
{
|
|
71
|
+
0: '0',
|
|
72
|
+
onenine: [onenine, digits0],
|
|
73
|
+
},
|
|
74
|
+
option({
|
|
75
|
+
bigint: 'n',
|
|
76
|
+
frac: [fracPart, expPart]
|
|
77
|
+
}),
|
|
78
|
+
{ numError: [idChar], ok: none }
|
|
79
|
+
];
|
|
80
|
+
const id = [idStart, repeat0Plus(idChar)];
|
|
81
|
+
const operator = {
|
|
82
|
+
'.': '.',
|
|
83
|
+
'=>': '=>',
|
|
84
|
+
'===': '===',
|
|
85
|
+
'==': '==',
|
|
86
|
+
'=': '=',
|
|
87
|
+
'!==': '!==',
|
|
88
|
+
'!=': '!=',
|
|
89
|
+
'!': '!',
|
|
90
|
+
'>>>=': '>>>=',
|
|
91
|
+
'>>>': '>>>',
|
|
92
|
+
'>>=': '>>=',
|
|
93
|
+
'>>': '>>',
|
|
94
|
+
'>=': '>=',
|
|
95
|
+
'>': '>',
|
|
96
|
+
'<<=': '<<=',
|
|
97
|
+
'<<': '<<',
|
|
98
|
+
'<=': '<=',
|
|
99
|
+
'<': '<',
|
|
100
|
+
'+=': '+=',
|
|
101
|
+
'++': '++',
|
|
102
|
+
'+': '+',
|
|
103
|
+
'-=': '-=',
|
|
104
|
+
'--': '--',
|
|
105
|
+
'-': '-',
|
|
106
|
+
'**=': '**=',
|
|
107
|
+
'**': '**',
|
|
108
|
+
'*=': '*=',
|
|
109
|
+
'*': '*',
|
|
110
|
+
'/=': '/=',
|
|
111
|
+
'/': '/',
|
|
112
|
+
'%=': '%=',
|
|
113
|
+
'%': '%',
|
|
114
|
+
'&&=': '&&=',
|
|
115
|
+
'&&': '&&',
|
|
116
|
+
'&=': '&=',
|
|
117
|
+
'&': '&',
|
|
118
|
+
'||=': '||=',
|
|
119
|
+
'||': '||',
|
|
120
|
+
'|=': '|=',
|
|
121
|
+
'|': '|',
|
|
122
|
+
'^=': '^=',
|
|
123
|
+
'^': '^',
|
|
124
|
+
'~': '~',
|
|
125
|
+
'??=': '??=',
|
|
126
|
+
'??': '??',
|
|
127
|
+
'?.': '?.',
|
|
128
|
+
'?': '?',
|
|
129
|
+
'[': '[',
|
|
130
|
+
']': ']',
|
|
131
|
+
'{': '{',
|
|
132
|
+
'}': '}',
|
|
133
|
+
'(': '(',
|
|
134
|
+
')': ')',
|
|
135
|
+
',': ',',
|
|
136
|
+
':': ':'
|
|
137
|
+
};
|
|
138
|
+
// Recursive rule: tries end (*/) first at every position so **/ → content(*) + terminator(*/).
|
|
139
|
+
// Falls back to the empty `unterminated` alternative at EOF instead of failing, so `comment`
|
|
140
|
+
// always succeeds and the descent parser never backtracks into matching '/' and '*' as
|
|
141
|
+
// separate operators. Callers detect an unterminated comment by checking for this tag.
|
|
142
|
+
const multilineContent = () => {
|
|
143
|
+
const char = { na: notSet('*'), a: '*' };
|
|
144
|
+
const end = ['*', '/'];
|
|
145
|
+
const more = [char, multilineContent];
|
|
146
|
+
return { end, more, unterminated: none };
|
|
147
|
+
};
|
|
148
|
+
const comment = ['/', {
|
|
149
|
+
// TODO: investigate why `not(commentEnd)` instead of `remove(unicodeRange, newLine)` fail tests.
|
|
150
|
+
oneline: ['/', repeat0Plus(remove(unicodeRange, newLine)), option(newLine)],
|
|
151
|
+
multiline: ['*', multilineContent]
|
|
152
|
+
}
|
|
153
|
+
];
|
|
154
|
+
const token = {
|
|
155
|
+
number,
|
|
156
|
+
string,
|
|
157
|
+
id,
|
|
158
|
+
comment,
|
|
159
|
+
operator,
|
|
160
|
+
ws,
|
|
161
|
+
newLine,
|
|
162
|
+
eof
|
|
163
|
+
};
|
|
164
|
+
return token;
|
|
165
|
+
};
|
|
166
|
+
// The whole file's token stream as one right-recursive grammar rule. Safe at any input
|
|
167
|
+
// length: descentParser matches on an explicit frame stack, not the JS call stack
|
|
168
|
+
// (see fjs/bnf/descent/module.f.ts).
|
|
169
|
+
export const jsGrammar = () => repeat0Plus(buildToken());
|
|
170
|
+
const stringify = stringifyAsTree(sort);
|
|
171
|
+
const mapCodePoint = (cp) => [cp, undefined];
|
|
172
|
+
export const descentParserCpOnly = (m, name, cp) => {
|
|
173
|
+
const cpm = toArray(map(mapCodePoint)(cp));
|
|
174
|
+
return m(name, cpm);
|
|
175
|
+
};
|
|
176
|
+
// Advances path/line/column by one code point, mirroring fjs/js/tokenizer's tokenizeWithPositionOp.
|
|
177
|
+
const advanceMetadata = cp => metadata => cp === lf
|
|
178
|
+
? { path: metadata.path, line: metadata.line + 1, column: 1 }
|
|
179
|
+
: { path: metadata.path, line: metadata.line, column: metadata.column + 1 };
|
|
180
|
+
// Pairs each code point with the metadata of its position *before* it's consumed.
|
|
181
|
+
const metadataScan = (cp, metadata) => [[[cp, metadata]], advanceMetadata(cp)(metadata)];
|
|
182
|
+
const codePointsWithMetadata = path => cp => toArray(flat(stateScan(metadataScan)({ path, line: 1, column: 1 })(cp)));
|
|
183
|
+
const isNlTag = (tag) => tag === '\n' || tag === '\r';
|
|
184
|
+
const isWsTag = (tag) => tag === ' ' || tag === '\t';
|
|
185
|
+
const scanFunc = (input, state) => {
|
|
186
|
+
const [stateTag, stateMetadata, stateCodePoints] = state;
|
|
187
|
+
if (typeof input === 'string') {
|
|
188
|
+
if (isNlTag(input) && isNlTag(stateTag))
|
|
189
|
+
return [null, state];
|
|
190
|
+
if (isWsTag(input) && isWsTag(stateTag))
|
|
191
|
+
return [null, state];
|
|
192
|
+
if (isNlTag(input) && isWsTag(stateTag))
|
|
193
|
+
return [null, [input, null, []]];
|
|
194
|
+
if (isWsTag(input) && isNlTag(stateTag))
|
|
195
|
+
return [null, state];
|
|
196
|
+
const newState = [input, null, []];
|
|
197
|
+
if (stateTag === '') {
|
|
198
|
+
return [null, newState];
|
|
199
|
+
}
|
|
200
|
+
const tk = [stateTag, stateMetadata, toArray(stateCodePoints)];
|
|
201
|
+
return [[tk], newState];
|
|
202
|
+
}
|
|
203
|
+
const [cp, codePointMetadata] = input;
|
|
204
|
+
const startMetadata = stateMetadata === null ? codePointMetadata : stateMetadata;
|
|
205
|
+
return [null, [stateTag, startMetadata, concat(stateCodePoints)([cp])]];
|
|
206
|
+
};
|
|
207
|
+
// All operator tag strings produced by the grammar's operator rule
|
|
208
|
+
const operatorTags = new Set([
|
|
209
|
+
'.', '=>', '===', '==', '=', '!==', '!=', '!',
|
|
210
|
+
'>>>=', '>>>', '>>=', '>>', '>=', '>',
|
|
211
|
+
'<<=', '<<', '<=', '<',
|
|
212
|
+
'+=', '++', '+', '-=', '--', '-',
|
|
213
|
+
'**=', '**', '*=', '*', '/=', '/', '%=', '%', // TODO: '/' here causes multi-char line comments (e.g. //ab\n) to fall through as two '/' operator tokens because the oneline rule only consumes one non-newline character (option vs repeat0Plus). Fix the comment rule to use repeat0Plus, or make filterFunc distinguish operator-branch '/' from slash characters inside comments.
|
|
214
|
+
'&&=', '&&', '&=', '&', '||=', '||', '|=', '|',
|
|
215
|
+
'^=', '^', '~', '??=', '??', '?.', '?',
|
|
216
|
+
'[', ']', '{', '}', '(', ')', ',', ':'
|
|
217
|
+
]);
|
|
218
|
+
const filterFunc = tk => {
|
|
219
|
+
if (tk instanceof Array)
|
|
220
|
+
return true;
|
|
221
|
+
switch (tk) {
|
|
222
|
+
case 'number':
|
|
223
|
+
case 'string':
|
|
224
|
+
case 'id':
|
|
225
|
+
case 'comment':
|
|
226
|
+
case '\n':
|
|
227
|
+
case '\r':
|
|
228
|
+
case ' ':
|
|
229
|
+
case '\t':
|
|
230
|
+
return true;
|
|
231
|
+
default:
|
|
232
|
+
return operatorTags.has(tk);
|
|
233
|
+
}
|
|
234
|
+
};
|
|
235
|
+
const rangeCapitalAF = asciiRange('AF');
|
|
236
|
+
const stringDecodeScan = (cp, state) => {
|
|
237
|
+
switch (state.kind) {
|
|
238
|
+
case 'escape':
|
|
239
|
+
switch (cp) {
|
|
240
|
+
case quotationMark: return [[quotationMark], { kind: 'normal' }]; // \" → "
|
|
241
|
+
case reverseSolidus: return [[reverseSolidus], { kind: 'normal' }]; // \\ → \
|
|
242
|
+
case solidus: return [[solidus], { kind: 'normal' }]; // \/ → /
|
|
243
|
+
case latinSmallLetterB: return [[backspace], { kind: 'normal' }]; // \b → backspace (BS)
|
|
244
|
+
case latinSmallLetterF: return [[ff], { kind: 'normal' }]; // \f → form feed (FF)
|
|
245
|
+
case latinSmallLetterN: return [[lf], { kind: 'normal' }]; // \n → line feed (LF)
|
|
246
|
+
case latinSmallLetterR: return [[cr], { kind: 'normal' }]; // \r → carriage return (CR)
|
|
247
|
+
case latinSmallLetterT: return [[ht], { kind: 'normal' }]; // \t → horizontal tab (HT)
|
|
248
|
+
case latinSmallLetterU: return [null, { kind: 'unicode', acc: 0, count: 0 }]; // \u → start 4 hex digits
|
|
249
|
+
default: return [[cp], { kind: 'normal' }];
|
|
250
|
+
}
|
|
251
|
+
case 'unicode': {
|
|
252
|
+
// convert hex digit char to its numeric value: '0'-'9', 'A'-'F', 'a'-'f'
|
|
253
|
+
const digit = contains(...digitRange)(cp) ? cp - digit0
|
|
254
|
+
: contains(...rangeCapitalAF)(cp) ? cp - (latinCapitalLetterA - 10)
|
|
255
|
+
: cp - (latinSmallLetterA - 10);
|
|
256
|
+
const acc = (state.acc << 4) | digit;
|
|
257
|
+
return state.count === 3 ? [[acc], { kind: 'normal' }] : [null, { kind: 'unicode', acc, count: state.count + 1 }];
|
|
258
|
+
}
|
|
259
|
+
default:
|
|
260
|
+
return cp === reverseSolidus ? [null, { kind: 'escape' }] : [[cp], { kind: 'normal' }];
|
|
261
|
+
}
|
|
262
|
+
};
|
|
263
|
+
const decodeJsonString = codePoints => codePointListToString(flat(stateScan(stringDecodeScan)({ kind: 'normal' })(codePoints.slice(1, -1))));
|
|
264
|
+
// value is grammar-validated: (0|[1-9][0-9]*)(\.[0-9]+)?([eE][+-]?[0-9]+)? — no need to re-check its shape here.
|
|
265
|
+
const decodeNumber = value => {
|
|
266
|
+
// at most one of 'e'/'E' can occur, so whichever indexOf finds it (if any) is the exponent marker
|
|
267
|
+
const lowerEIndex = value.indexOf('e');
|
|
268
|
+
const eIndex = lowerEIndex < 0 ? value.indexOf('E') : lowerEIndex;
|
|
269
|
+
const mantissaText = eIndex < 0 ? value : value.slice(0, eIndex);
|
|
270
|
+
const expText = eIndex < 0 ? '' : value.slice(eIndex + 1);
|
|
271
|
+
const dotIndex = mantissaText.indexOf('.');
|
|
272
|
+
const intDigits = dotIndex < 0 ? mantissaText : mantissaText.slice(0, dotIndex);
|
|
273
|
+
const fracDigits = dotIndex < 0 ? '' : mantissaText.slice(dotIndex + 1);
|
|
274
|
+
const mantissa = BigInt(intDigits + fracDigits);
|
|
275
|
+
const exp = (expText === '' ? 0 : Number(expText)) - fracDigits.length;
|
|
276
|
+
return [mantissa, exp];
|
|
277
|
+
};
|
|
278
|
+
const keywords = new Set([
|
|
279
|
+
'true', 'false', 'null', 'undefined',
|
|
280
|
+
'arguments', 'await', 'break', 'case', 'catch', 'class', 'const', 'continue',
|
|
281
|
+
'debugger', 'default', 'delete', 'do', 'else', 'enum', 'eval', 'export',
|
|
282
|
+
'extends', 'finally', 'for', 'function', 'if', 'implements', 'import', 'in',
|
|
283
|
+
'instanceof', 'interface', 'let', 'new', 'package', 'private', 'protected',
|
|
284
|
+
'public', 'return', 'static', 'super', 'switch', 'this', 'throw', 'try',
|
|
285
|
+
'typeof', 'var', 'void', 'while', 'with', 'yield',
|
|
286
|
+
]);
|
|
287
|
+
const toJsToken = tk => {
|
|
288
|
+
const [tag, , codePoints] = tk;
|
|
289
|
+
switch (tag) {
|
|
290
|
+
case '\n':
|
|
291
|
+
case '\r':
|
|
292
|
+
return { kind: 'nl' };
|
|
293
|
+
case ' ':
|
|
294
|
+
case '\t':
|
|
295
|
+
return { kind: 'ws' };
|
|
296
|
+
case 'string':
|
|
297
|
+
return { kind: 'string', value: decodeJsonString(codePoints) };
|
|
298
|
+
case 'id': {
|
|
299
|
+
const value = codePointListToString(codePoints);
|
|
300
|
+
if (keywords.has(value))
|
|
301
|
+
return { kind: value };
|
|
302
|
+
return { kind: 'id', value };
|
|
303
|
+
}
|
|
304
|
+
case 'number': {
|
|
305
|
+
const value = codePointListToString(codePoints);
|
|
306
|
+
if (value.endsWith('n'))
|
|
307
|
+
return { kind: 'bigint', value: BigInt(value.slice(0, -1)) };
|
|
308
|
+
return { kind: 'number', value, bf: decodeNumber(value) };
|
|
309
|
+
}
|
|
310
|
+
case 'comment':
|
|
311
|
+
if (codePoints[1] === asterisk) // block comment /*...*/
|
|
312
|
+
return { kind: '/*', value: codePointListToString(codePoints.slice(2, -2)) };
|
|
313
|
+
return { kind: '//', value: codePointListToString(codePoints.slice(2)) };
|
|
314
|
+
default:
|
|
315
|
+
return { kind: tag };
|
|
316
|
+
}
|
|
317
|
+
};
|
|
318
|
+
const toJsTokens = tk => {
|
|
319
|
+
const token = toJsToken(tk);
|
|
320
|
+
if (token.kind === '/*') {
|
|
321
|
+
const hasNl = token.value.includes('\n') || token.value.includes('\r');
|
|
322
|
+
if (hasNl)
|
|
323
|
+
return [token, { kind: 'nl' }];
|
|
324
|
+
}
|
|
325
|
+
return [token];
|
|
326
|
+
};
|
|
327
|
+
// Same as toJsTokens, but pairs each emitted token with tk's start metadata instead of
|
|
328
|
+
// discarding it — used by tokenize (the metadata-aware entry point), not tokenizeString.
|
|
329
|
+
const toJsTokenWithMetadata = tk => {
|
|
330
|
+
const [, metadata] = tk;
|
|
331
|
+
const token = toJsToken(tk);
|
|
332
|
+
if (token.kind === '/*') {
|
|
333
|
+
const hasNl = token.value.includes('\n') || token.value.includes('\r');
|
|
334
|
+
if (hasNl)
|
|
335
|
+
return [{ token, metadata }, { token: { kind: 'nl' }, metadata }];
|
|
336
|
+
}
|
|
337
|
+
return [{ token, metadata }];
|
|
338
|
+
};
|
|
339
|
+
const getTokensFromAstRuleOrCodePoint = value => {
|
|
340
|
+
if (value instanceof Array)
|
|
341
|
+
return [value];
|
|
342
|
+
return getTokensFromAstRule(value);
|
|
343
|
+
};
|
|
344
|
+
const getTokensFromAstSequence = seq => {
|
|
345
|
+
return flatMap(getTokensFromAstRuleOrCodePoint)(seq);
|
|
346
|
+
};
|
|
347
|
+
const tagToToken = tag => {
|
|
348
|
+
switch (typeof tag) {
|
|
349
|
+
case 'string': return tag;
|
|
350
|
+
case 'undefined': return 'undefined';
|
|
351
|
+
default: return 'true';
|
|
352
|
+
}
|
|
353
|
+
};
|
|
354
|
+
const getTokensFromAstRule = ast => {
|
|
355
|
+
const token = tagToToken(ast.tag);
|
|
356
|
+
if (ast.sequence.length === 0)
|
|
357
|
+
return [token];
|
|
358
|
+
return { first: token, tail: getTokensFromAstSequence(ast.sequence) };
|
|
359
|
+
};
|
|
360
|
+
export const tokenizeString = s => {
|
|
361
|
+
const cp = toArray(stringToCodePointList(s));
|
|
362
|
+
if (cp.length === 0) {
|
|
363
|
+
return stringify([{ kind: 'eof' }]);
|
|
364
|
+
}
|
|
365
|
+
const m = descentParser(jsGrammar());
|
|
366
|
+
const cpm = codePointsWithMetadata('')(cp);
|
|
367
|
+
const [ast, ok, len] = m('', cpm);
|
|
368
|
+
if (!ok || len !== cp.length)
|
|
369
|
+
return 'error';
|
|
370
|
+
const flatTokens = toArray(getTokensFromAstRule(ast));
|
|
371
|
+
// multilineContent tags an unterminated block comment as 'unterminated', and number
|
|
372
|
+
// tags a malformed fraction/exponent or a disallowed trailing char as 'numError',
|
|
373
|
+
// rather than failing outright — detect them here instead.
|
|
374
|
+
if (flatTokens.includes('unterminated') || flatTokens.includes('numError'))
|
|
375
|
+
return 'error';
|
|
376
|
+
const filterTokens = concat(filter(filterFunc)(flatTokens))(['']);
|
|
377
|
+
const tokens = flat(stateScan(scanFunc)(['', null, []])(filterTokens));
|
|
378
|
+
const jsTokens = concat(flatMap(toJsTokens)(tokens))([{ kind: 'eof' }]);
|
|
379
|
+
const result = toArray(jsTokens);
|
|
380
|
+
return stringify(result);
|
|
381
|
+
};
|
|
382
|
+
// Finds `tag` in flatTokens and returns the metadata of the next code point after it.
|
|
383
|
+
// numError/unterminated tags are followed by the poisoning char / EOF-hitting position
|
|
384
|
+
// in the flattened AST walk order, so this pinpoints roughly where tokenization failed.
|
|
385
|
+
const metadataAfterTag = (tag, flatTokens, fallback) => {
|
|
386
|
+
const idx = flatTokens.indexOf(tag);
|
|
387
|
+
const found = idx < 0 ? undefined : flatTokens.slice(idx + 1).find((t) => t instanceof Array);
|
|
388
|
+
return found === undefined ? fallback : found[1];
|
|
389
|
+
};
|
|
390
|
+
export const tokenizeJs = input => path => {
|
|
391
|
+
const cp = toArray(input);
|
|
392
|
+
const initial = { path, line: 1, column: 1 };
|
|
393
|
+
if (cp.length === 0)
|
|
394
|
+
return [{ token: { kind: 'eof' }, metadata: initial }];
|
|
395
|
+
const m = descentParser(jsGrammar());
|
|
396
|
+
const cpm = codePointsWithMetadata(path)(cp);
|
|
397
|
+
const [ast, ok, len] = m('', cpm);
|
|
398
|
+
const finalMetadata = fold(advanceMetadata)(initial)(cp);
|
|
399
|
+
if (!ok || len !== cp.length) {
|
|
400
|
+
const errorMetadata = len < cpm.length ? cpm[len][1] : finalMetadata;
|
|
401
|
+
return [{ token: { kind: 'error', message: 'invalid token' }, metadata: errorMetadata }];
|
|
402
|
+
}
|
|
403
|
+
const flatTokens = toArray(getTokensFromAstRule(ast));
|
|
404
|
+
const structuralError = flatTokens.includes('unterminated') ? 'unterminated'
|
|
405
|
+
: flatTokens.includes('numError') ? 'numError'
|
|
406
|
+
: null;
|
|
407
|
+
if (structuralError !== null) {
|
|
408
|
+
const errorMetadata = metadataAfterTag(structuralError, flatTokens, finalMetadata);
|
|
409
|
+
return [{ token: { kind: 'error', message: 'invalid token' }, metadata: errorMetadata }];
|
|
410
|
+
}
|
|
411
|
+
const filterTokens = concat(filter(filterFunc)(flatTokens))(['']);
|
|
412
|
+
const tokens = flat(stateScan(scanFunc)(['', null, []])(filterTokens));
|
|
413
|
+
const withMetadata = concat(flatMap(toJsTokenWithMetadata)(tokens));
|
|
414
|
+
return withMetadata([{ token: { kind: 'eof' }, metadata: finalMetadata }]);
|
|
415
|
+
};
|
|
416
|
+
const mapDjsToken = input => {
|
|
417
|
+
switch (input.kind) {
|
|
418
|
+
case 'id':
|
|
419
|
+
case 'bigint':
|
|
420
|
+
case '{':
|
|
421
|
+
case '}':
|
|
422
|
+
case ':':
|
|
423
|
+
case ',':
|
|
424
|
+
case '[':
|
|
425
|
+
case ']':
|
|
426
|
+
case '.':
|
|
427
|
+
case '=':
|
|
428
|
+
case 'true':
|
|
429
|
+
case 'false':
|
|
430
|
+
case 'null':
|
|
431
|
+
case 'string':
|
|
432
|
+
case 'number':
|
|
433
|
+
case 'ws':
|
|
434
|
+
case 'nl':
|
|
435
|
+
case 'undefined':
|
|
436
|
+
case '//':
|
|
437
|
+
case '/*':
|
|
438
|
+
case 'eof':
|
|
439
|
+
case 'error': return [input];
|
|
440
|
+
default: return isKeywordToken(input) ? [{ kind: 'id', value: input.kind }] : [{ kind: 'error', message: 'invalid token' }];
|
|
441
|
+
}
|
|
442
|
+
};
|
|
443
|
+
const parseDjsDefaultState = input => {
|
|
444
|
+
switch (input.kind) {
|
|
445
|
+
case 'eof': return [[{ kind: 'eof' }], { kind: 'def' }];
|
|
446
|
+
case '-': return [empty, { kind: '-' }];
|
|
447
|
+
default: return [mapDjsToken(input), { kind: 'def' }];
|
|
448
|
+
}
|
|
449
|
+
};
|
|
450
|
+
// Folds a leading '-' into the following number/bigint token, mirroring the old
|
|
451
|
+
// fjs/djs/tokenizer's minus-state exactly.
|
|
452
|
+
const parseDjsMinusState = input => {
|
|
453
|
+
switch (input.kind) {
|
|
454
|
+
case 'eof': return [[{ kind: 'error', message: 'invalid token' }, { kind: 'eof' }], { kind: 'def' }];
|
|
455
|
+
case '-': return [[{ kind: 'error', message: 'invalid token' }], { kind: '-' }];
|
|
456
|
+
case 'bigint': return [[{ kind: 'bigint', value: -1n * input.value }], { kind: 'def' }];
|
|
457
|
+
case 'number': return [[{ kind: 'number', bf: multiply(input.bf)(-1n), value: `-${input.value}` }], { kind: 'def' }];
|
|
458
|
+
default: return [{ first: { kind: 'error', message: 'invalid token' }, tail: mapDjsToken(input) }, { kind: 'def' }];
|
|
459
|
+
}
|
|
460
|
+
};
|
|
461
|
+
const scanDjsToken = (input, state) => {
|
|
462
|
+
switch (state.kind) {
|
|
463
|
+
case '-': return parseDjsMinusState(input);
|
|
464
|
+
default: return parseDjsDefaultState(input);
|
|
465
|
+
}
|
|
466
|
+
};
|
|
467
|
+
const mapDjsTokenWithMetadata = metadata => token => ({ token, metadata });
|
|
468
|
+
const scanDjsTokenWithMetadata = (input, state) => {
|
|
469
|
+
const [djsTokens, newState] = scanDjsToken(input.token, state);
|
|
470
|
+
return [map(mapDjsTokenWithMetadata(input.metadata))(djsTokens), newState];
|
|
471
|
+
};
|
|
472
|
+
export const tokenize = input => path => flat(stateScan(scanDjsTokenWithMetadata)({ kind: 'def' })(tokenizeJs(input)(path)));
|
|
@@ -6,7 +6,8 @@ export declare const proof: {
|
|
|
6
6
|
ws: (() => void)[];
|
|
7
7
|
id: (() => void)[];
|
|
8
8
|
keywords: (() => void)[];
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
comments: (() => void)[];
|
|
10
|
+
metadata: (() => void)[];
|
|
11
|
+
djsTokenize: (() => void)[];
|
|
12
|
+
largeInputs: (() => void)[];
|
|
12
13
|
};
|