functionalscript 0.37.0 → 0.39.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/fjs/bnf/token_symbol/module.f.d.ts +38 -0
- package/fjs/bnf/token_symbol/module.f.js +48 -0
- package/fjs/bnf/token_symbol/proof.f.d.ts +10 -0
- package/fjs/bnf/token_symbol/proof.f.js +37 -0
- package/{fs → fjs}/cas/cli/module.f.js +6 -9
- 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 +27 -0
- package/fjs/cas/evo/mcp/module.f.js +94 -0
- package/fjs/cas/evo/mcp/proof.f.d.ts +11 -0
- package/fjs/cas/evo/mcp/proof.f.js +126 -0
- package/fjs/cas/evo/module.f.d.ts +202 -0
- package/fjs/cas/evo/module.f.js +421 -0
- package/fjs/cas/evo/proof.f.d.ts +39 -0
- package/fjs/cas/evo/proof.f.js +572 -0
- package/fjs/cas/mcp/module.f.d.ts +49 -0
- package/{fs → fjs}/cas/mcp/module.f.js +61 -81
- package/{fs → fjs}/cas/mcp/proof.f.d.ts +4 -1
- package/{fs → fjs}/cas/mcp/proof.f.js +45 -17
- package/{fs → fjs}/cas/module.f.d.ts +10 -0
- package/{fs → fjs}/cas/module.f.js +89 -36
- package/fjs/cas/proof.f.d.ts +18 -0
- package/fjs/cas/proof.f.js +305 -0
- package/{fs → fjs}/ci/bun/module.f.js +3 -3
- package/{fs → fjs}/ci/common/module.f.d.ts +1 -2
- package/{fs → fjs}/ci/common/module.f.js +1 -5
- package/{fs → fjs}/ci/config/module.f.d.ts +8 -8
- package/{fs → fjs}/ci/config/module.f.js +8 -8
- package/{fs → fjs}/ci/deno/module.f.js +3 -3
- package/{fs → fjs}/ci/module.f.js +3 -4
- package/{fs → fjs}/ci/node/module.f.js +11 -9
- package/{fs → fjs}/ci/proof.f.js +16 -9
- package/{fs → fjs}/ci/rust/module.f.js +9 -1
- package/{fs → fjs}/cli/module.f.js +2 -2
- package/{fs → fjs}/cli/proof.f.js +22 -63
- package/{fs → fjs}/common/monoid/module.f.d.ts +46 -2
- package/fjs/common/monoid/module.f.js +88 -0
- package/fjs/common/monoid/proof.f.d.ts +9 -0
- package/fjs/common/monoid/proof.f.js +48 -0
- 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/module.f.js +25 -25
- 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/module.f.js +5 -8
- package/{fs → fjs}/djs/parser/module.f.d.ts +8 -0
- package/{fs → fjs}/djs/parser/module.f.js +37 -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/module.f.js +6 -6
- package/{fs → fjs}/djs/transpiler/proof.f.d.ts +3 -0
- package/{fs → fjs}/djs/transpiler/proof.f.js +29 -30
- package/fjs/effects/eff/module.f.d.ts +72 -0
- package/fjs/effects/eff/module.f.js +46 -0
- package/fjs/effects/eff/proof.f.d.ts +11 -0
- package/fjs/effects/eff/proof.f.js +58 -0
- package/{fs → fjs}/effects/list/module.f.d.ts +11 -5
- package/{fs → fjs}/effects/list/module.f.js +2 -1
- package/{fs → fjs}/effects/memory/proof.f.js +15 -29
- package/fjs/effects/module.f.d.ts +388 -0
- package/fjs/effects/module.f.js +288 -0
- package/{fs → fjs}/effects/node/memory/proof.js +7 -13
- package/{fs → fjs}/effects/node/module.d.ts +1 -1
- package/{fs → fjs}/effects/node/module.f.d.ts +2 -2
- package/{fs → fjs}/effects/node/module.f.js +9 -11
- 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 +121 -299
- package/{fs → fjs}/effects/node/virtual/proof.f.d.ts +1 -0
- package/{fs → fjs}/effects/node/virtual/proof.f.js +36 -29
- package/fjs/effects/proof.f.d.ts +51 -0
- package/fjs/effects/proof.f.js +178 -0
- package/{fs → fjs}/emergent_testing/module.f.js +55 -39
- package/{fs → fjs}/emergent_testing/proof.f.d.ts +4 -0
- package/{fs → fjs}/emergent_testing/proof.f.js +60 -27
- 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 +17 -10
- package/{fs → fjs}/mcp/proof.f.js +17 -16
- package/{fs → fjs}/mcp/stdio/module.f.d.ts +4 -4
- package/{fs → fjs}/mcp/stdio/module.f.js +14 -14
- 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/module.f.js +2 -2
- package/{fs → fjs}/media/type/proof.f.js +8 -15
- package/{fs → fjs}/module.f.js +5 -9
- 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/module.f.js +4 -3
- package/{fs → fjs}/types/bigint/proof.f.js +49 -145
- package/{fs → fjs}/types/bit_vec/module.f.js +5 -15
- 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/module.f.d.ts +5 -0
- package/{fs → fjs}/types/btree/remove/module.f.js +12 -0
- 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/module.f.d.ts +21 -0
- package/{fs → fjs}/types/list/module.f.js +17 -0
- package/{fs → fjs}/types/list/proof.f.d.ts +1 -0
- package/{fs → fjs}/types/list/proof.f.js +79 -164
- 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/module.f.js +2 -1
- 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/{fs → fjs}/types/string/module.f.js +10 -2
- 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/module.f.js +2 -3
- package/{fs → fjs}/website/proof.f.js +3 -6
- package/package.json +8 -8
- package/fs/asserts/module.f.d.ts +0 -4
- package/fs/asserts/module.f.js +0 -9
- package/fs/asserts/proof.f.d.ts +0 -8
- package/fs/asserts/proof.f.js +0 -51
- package/fs/bnf/data/module.f.d.ts +0 -30
- package/fs/bnf/descent/module.f.js +0 -119
- package/fs/bnf/proof.f.js +0 -104
- package/fs/cas/mcp/module.f.d.ts +0 -36
- package/fs/cas/proof.f.d.ts +0 -20
- package/fs/cas/proof.f.js +0 -294
- package/fs/common/monoid/module.f.js +0 -44
- package/fs/common/monoid/proof.f.d.ts +0 -4
- package/fs/common/monoid/proof.f.js +0 -27
- 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/effects/module.f.d.ts +0 -106
- package/fs/effects/module.f.js +0 -80
- package/fs/effects/proof.f.d.ts +0 -25
- package/fs/effects/proof.f.js +0 -115
- 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}/ci/bun/module.f.d.ts +0 -0
- /package/{fs → fjs}/ci/deno/module.f.d.ts +0 -0
- /package/{fs → fjs}/ci/module.f.d.ts +0 -0
- /package/{fs → fjs}/ci/node/module.f.d.ts +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/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/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/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}/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.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/virtual/module.f.d.ts +0 -0
- /package/{fs → fjs}/effects/node/virtual/module.f.js +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/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/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/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/bit_vec/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/bit_vec/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/find/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/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/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/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/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/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/proof.f.d.ts +0 -0
|
@@ -1,25 +1,20 @@
|
|
|
1
1
|
import { arrayWrap, boolSerialize, numberSerialize, objectWrap, stringSerialize } from './module.f.js';
|
|
2
2
|
import * as list from '../../../types/list/module.f.js';
|
|
3
|
+
import { assertEq } from '../../../asserts/module.f.js';
|
|
3
4
|
const { toArray } = list;
|
|
4
5
|
export const proof = {
|
|
5
6
|
arrayWrap: [
|
|
6
7
|
() => {
|
|
7
8
|
const result = JSON.stringify(toArray(arrayWrap(null)));
|
|
8
|
-
|
|
9
|
-
throw result;
|
|
10
|
-
}
|
|
9
|
+
assertEq(result, '["[","]"]');
|
|
11
10
|
},
|
|
12
11
|
() => {
|
|
13
12
|
const result = JSON.stringify(toArray(arrayWrap([['a', 'b']])));
|
|
14
|
-
|
|
15
|
-
throw result;
|
|
16
|
-
}
|
|
13
|
+
assertEq(result, '["[","a","b","]"]');
|
|
17
14
|
},
|
|
18
15
|
() => {
|
|
19
16
|
const result = JSON.stringify(toArray(arrayWrap([['a'], ['b']])));
|
|
20
|
-
|
|
21
|
-
throw result;
|
|
22
|
-
}
|
|
17
|
+
assertEq(result, '["[","a",",","b","]"]');
|
|
23
18
|
}
|
|
24
19
|
],
|
|
25
20
|
objectWrap: [
|
|
@@ -45,43 +40,31 @@ export const proof = {
|
|
|
45
40
|
stringSerialize: [
|
|
46
41
|
() => {
|
|
47
42
|
const result = JSON.stringify(toArray(stringSerialize('abc')));
|
|
48
|
-
|
|
49
|
-
throw result;
|
|
50
|
-
}
|
|
43
|
+
assertEq(result, '["\\"abc\\""]');
|
|
51
44
|
},
|
|
52
45
|
() => {
|
|
53
46
|
const result = JSON.stringify(toArray(stringSerialize('123')));
|
|
54
|
-
|
|
55
|
-
throw result;
|
|
56
|
-
}
|
|
47
|
+
assertEq(result, '["\\"123\\""]');
|
|
57
48
|
}
|
|
58
49
|
],
|
|
59
50
|
numberSerialize: [
|
|
60
51
|
() => {
|
|
61
52
|
const result = JSON.stringify(toArray(numberSerialize(123)));
|
|
62
|
-
|
|
63
|
-
throw result;
|
|
64
|
-
}
|
|
53
|
+
assertEq(result, '["123"]');
|
|
65
54
|
},
|
|
66
55
|
() => {
|
|
67
56
|
const result = JSON.stringify(toArray(numberSerialize(10e20)));
|
|
68
|
-
|
|
69
|
-
throw result;
|
|
70
|
-
}
|
|
57
|
+
assertEq(result, '["1e+21"]');
|
|
71
58
|
}
|
|
72
59
|
],
|
|
73
60
|
boolSerialize: [
|
|
74
61
|
() => {
|
|
75
62
|
const result = JSON.stringify(toArray(boolSerialize(false)));
|
|
76
|
-
|
|
77
|
-
throw result;
|
|
78
|
-
}
|
|
63
|
+
assertEq(result, '["false"]');
|
|
79
64
|
},
|
|
80
65
|
() => {
|
|
81
66
|
const result = JSON.stringify(toArray(boolSerialize(true)));
|
|
82
|
-
|
|
83
|
-
throw result;
|
|
84
|
-
}
|
|
67
|
+
assertEq(result, '["true"]');
|
|
85
68
|
}
|
|
86
69
|
]
|
|
87
70
|
};
|
|
@@ -2,15 +2,15 @@
|
|
|
2
2
|
* Media-type detection entry point: dialect-tagged JSON recognition layered
|
|
3
3
|
* on top of the byte-signature / UTF-8 detector.
|
|
4
4
|
*
|
|
5
|
-
* `
|
|
5
|
+
* `fjs/media/type` classifies raw bytes (magic-byte signatures, UTF-8
|
|
6
6
|
* text-vs-binary) with no notion of a JSON dialect. `detect` here adds one
|
|
7
7
|
* more classification step in front of it: when the whole blob is
|
|
8
|
-
* whole-blob-valid UTF-8 text (as `
|
|
8
|
+
* whole-blob-valid UTF-8 text (as `fjs/media/type` already determined), try
|
|
9
9
|
* parsing it as JSON and validating it against a known dialect's rtti schema
|
|
10
|
-
* (currently just `vnd.fjs.revision` — see `
|
|
10
|
+
* (currently just `vnd.fjs.revision` — see `fjs/media/revision`). A match
|
|
11
11
|
* reports the dialect's derived media type; anything that isn't valid JSON,
|
|
12
12
|
* or doesn't validate against a known dialect, falls through to the
|
|
13
|
-
* `
|
|
13
|
+
* `fjs/media/type` verdict unchanged.
|
|
14
14
|
*
|
|
15
15
|
* Detection is semantic, not syntactic: any JSON that satisfies a dialect's
|
|
16
16
|
* schema is recognized regardless of key order, whitespace, or any other
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
* form), because dialect validation needs the whole parsed value. A single
|
|
22
22
|
* `Vec` already caps at `maxLength` bits (128 KiB — the same bound as the
|
|
23
23
|
* existing inline-content cap), so dialect detection is naturally
|
|
24
|
-
* size-bounded. The unbounded streaming detector (`
|
|
24
|
+
* size-bounded. The unbounded streaming detector (`fjs/media/type`
|
|
25
25
|
* `detectStream`) is untouched and stays a pure byte-signature/UTF-8
|
|
26
26
|
* classifier with no dialect awareness.
|
|
27
27
|
*
|
|
@@ -31,7 +31,7 @@ import type { Vec } from '../types/bit_vec/module.f.ts';
|
|
|
31
31
|
import { type DetectMeta } from './type/module.f.ts';
|
|
32
32
|
/**
|
|
33
33
|
* Classifies a whole buffered `Vec`, the same three-way `{ length, mime_type,
|
|
34
|
-
* type }` shape as `
|
|
34
|
+
* type }` shape as `fjs/media/type` `detectVec`, but with dialect-tagged JSON
|
|
35
35
|
* recognized ahead of the plain `text/plain` fallback.
|
|
36
36
|
*/
|
|
37
37
|
export declare const detect: (bytes: Vec) => DetectMeta;
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { fromVec } from '../text/utf8/module.f.js';
|
|
2
2
|
import { detectVec } from './type/module.f.js';
|
|
3
3
|
import { decodeText as decodeRevisionText, mediaType as revisionMediaType } from './revision/module.f.js';
|
|
4
|
-
import {
|
|
4
|
+
import { assertNotNullish } from '../asserts/module.f.js';
|
|
5
5
|
/**
|
|
6
6
|
* Classifies a whole buffered `Vec`, the same three-way `{ length, mime_type,
|
|
7
|
-
* type }` shape as `
|
|
7
|
+
* type }` shape as `fjs/media/type` `detectVec`, but with dialect-tagged JSON
|
|
8
8
|
* recognized ahead of the plain `text/plain` fallback.
|
|
9
9
|
*/
|
|
10
10
|
export const detect = (bytes) => {
|
|
@@ -14,11 +14,10 @@ export const detect = (bytes) => {
|
|
|
14
14
|
if (base.type !== 'text') {
|
|
15
15
|
return base;
|
|
16
16
|
}
|
|
17
|
-
const text = fromVec(bytes);
|
|
18
17
|
// `detectVec`'s `type: 'text'` verdict already means `bytes` is byte-aligned,
|
|
19
18
|
// whole-blob-valid UTF-8 — the same two conditions `fromVec` checks, via the
|
|
20
19
|
// same decoder — so `fromVec` cannot return `null` here.
|
|
21
|
-
|
|
20
|
+
const text = assertNotNullish(fromVec(bytes), 'detect: type text implies fromVec succeeds');
|
|
22
21
|
const [tag] = decodeRevisionText(text);
|
|
23
22
|
return tag === 'ok' ? { ...base, mime_type: revisionMediaType } : base;
|
|
24
23
|
};
|
|
@@ -4,7 +4,7 @@ import { detect } from './module.f.js';
|
|
|
4
4
|
import { dialect } from './revision/module.f.js';
|
|
5
5
|
// All test strings here are ASCII, so char code === UTF-8 byte value.
|
|
6
6
|
const utf8Bytes = (s) => u8ListToVec(msb)([...s].map(c => c.charCodeAt(0)));
|
|
7
|
-
const revisionJson = `{"dialect":"${dialect}","subject":"8","parents":[]}`;
|
|
7
|
+
const revisionJson = `{"dialect":"${dialect}","subject":"8","parents":[],"snapshot":"8","generation":0}`;
|
|
8
8
|
export const proof = {
|
|
9
9
|
// A valid revision blob is recognized and reported under its derived media type.
|
|
10
10
|
validRevision: () => {
|
|
@@ -15,12 +15,13 @@ export const proof = {
|
|
|
15
15
|
// Key order carries no meaning: a valid revision whose `dialect` key is
|
|
16
16
|
// not first must still be detected.
|
|
17
17
|
keyOrderIndependent: () => {
|
|
18
|
-
const text = `{"parents":[],"subject":"8","dialect":"${dialect}"}`;
|
|
18
|
+
const text = `{"parents":[],"subject":"8","dialect":"${dialect}","snapshot":"8","generation":0}`;
|
|
19
19
|
const m = detect(utf8Bytes(text));
|
|
20
20
|
assertEq(m.mime_type, 'application/vnd.fjs.revision+json');
|
|
21
21
|
},
|
|
22
|
-
//
|
|
23
|
-
// through to the ordinary text/plain
|
|
22
|
+
// A revision missing a required field (here `snapshot` and `generation`)
|
|
23
|
+
// fails validation and falls through to the ordinary text/plain
|
|
24
|
+
// classification.
|
|
24
25
|
invalidRevisionFallsThrough: () => {
|
|
25
26
|
const text = `{"dialect":"${dialect}","subject":"8","parents":["8","r"]}`;
|
|
26
27
|
const m = detect(utf8Bytes(text));
|
|
@@ -28,19 +28,46 @@ export declare const revisionSchema: {
|
|
|
28
28
|
readonly dialect: "vnd.fjs.revision";
|
|
29
29
|
readonly subject: import("../../types/rtti/module.f.ts").String;
|
|
30
30
|
readonly parents: import("../../types/rtti/module.f.ts").Type1<"array", import("../../types/rtti/module.f.ts").String>;
|
|
31
|
-
readonly snapshot: import("../../types/rtti/module.f.ts").
|
|
32
|
-
readonly generation: import("../../types/rtti/module.f.ts").
|
|
31
|
+
readonly snapshot: import("../../types/rtti/module.f.ts").String;
|
|
32
|
+
readonly generation: import("../../types/rtti/module.f.ts").Number;
|
|
33
33
|
readonly archived: import("../../types/rtti/module.f.ts").Or<readonly [true, undefined]>;
|
|
34
34
|
};
|
|
35
35
|
/** The TypeScript type derived from {@link revisionSchema} — the single source of truth. */
|
|
36
36
|
export type Revision = Ts<typeof revisionSchema>;
|
|
37
37
|
/** True when `s` decodes as a cbase32 CAS hash (rejects `https://` and any other non-cbase32 string). */
|
|
38
38
|
export declare const isHash: (s: string) => boolean;
|
|
39
|
-
/** Either a structural validation error or a semantic (
|
|
39
|
+
/** Either a structural validation error or a semantic (hash / generation) error message. */
|
|
40
40
|
export type RevisionError = ValidationError | string;
|
|
41
|
+
/**
|
|
42
|
+
* Checks the semantic refinements the structural schema can't express on an
|
|
43
|
+
* already shape-valid revision: every `parents` entry and the `snapshot` must
|
|
44
|
+
* decode as a cbase32 hash ({@link isHash}), and `generation` must be a
|
|
45
|
+
* non-negative *safe* integer. `subject` is not checked — it is an identity
|
|
46
|
+
* string, never a snapshot reference, so any string is valid.
|
|
47
|
+
*
|
|
48
|
+
* `generation` uses `Number.isSafeInteger`, not `Number.isInteger`: a value at
|
|
49
|
+
* or above `2 ** 53` passes `isInteger` but is no longer uniquely
|
|
50
|
+
* representable, so `1 + max(parents' generations)` — how a writer derives the
|
|
51
|
+
* next generation — can round back to the parent's value and fail to advance.
|
|
52
|
+
* Rejecting unsafe integers keeps stored generations exact.
|
|
53
|
+
*
|
|
54
|
+
* Both `snapshot` and `generation` are required by the schema, so no absence
|
|
55
|
+
* ever has to be resolved here: a revision states its content and its
|
|
56
|
+
* generation explicitly, and is fully interpretable in isolation (see the
|
|
57
|
+
* README). The former snapshot-resolution algorithm (subject-as-fallback,
|
|
58
|
+
* single-parent inheritance, multi-parent rejection) is gone.
|
|
59
|
+
*
|
|
60
|
+
* Exported separately from {@link validate} for callers that assemble a
|
|
61
|
+
* `Revision` themselves from already-typed fields (e.g. `fjs/cas/evo`'s
|
|
62
|
+
* `addRevision`): the shape is then guaranteed by TypeScript already, so only
|
|
63
|
+
* these semantic (string-only error) checks are worth re-running — routing
|
|
64
|
+
* through the combined structural-plus-semantic `validate` would add an
|
|
65
|
+
* unreachable structural-error branch on the caller's side.
|
|
66
|
+
*/
|
|
67
|
+
export declare const checkReferences: (r: Revision) => Result<Revision, string>;
|
|
41
68
|
/**
|
|
42
69
|
* Validates an already-parsed JSON value as a `revision` BLOB: structural
|
|
43
|
-
* (rtti) validation followed by the
|
|
70
|
+
* (rtti) validation followed by the hash / generation semantic checks.
|
|
44
71
|
*/
|
|
45
72
|
export declare const validate: (value: Unknown) => Result<Revision, RevisionError>;
|
|
46
73
|
/**
|
|
@@ -47,45 +47,57 @@ export const revisionSchema = {
|
|
|
47
47
|
dialect,
|
|
48
48
|
subject: string,
|
|
49
49
|
parents: array(hash),
|
|
50
|
-
snapshot:
|
|
51
|
-
generation:
|
|
50
|
+
snapshot: hash,
|
|
51
|
+
generation: number,
|
|
52
52
|
archived: option(true),
|
|
53
53
|
};
|
|
54
|
-
/** Structural-only validator: checks the shape, not the
|
|
54
|
+
/** Structural-only validator: checks the shape, not the hash / generation semantics. */
|
|
55
55
|
const validateShape = rttiValidate(revisionSchema);
|
|
56
56
|
/** True when `s` decodes as a cbase32 CAS hash (rejects `https://` and any other non-cbase32 string). */
|
|
57
57
|
export const isHash = (s) => cBase32ToVec(s) !== null;
|
|
58
58
|
/**
|
|
59
|
-
* Checks the
|
|
60
|
-
* every
|
|
61
|
-
*
|
|
62
|
-
*
|
|
63
|
-
*
|
|
64
|
-
*
|
|
65
|
-
*
|
|
59
|
+
* Checks the semantic refinements the structural schema can't express on an
|
|
60
|
+
* already shape-valid revision: every `parents` entry and the `snapshot` must
|
|
61
|
+
* decode as a cbase32 hash ({@link isHash}), and `generation` must be a
|
|
62
|
+
* non-negative *safe* integer. `subject` is not checked — it is an identity
|
|
63
|
+
* string, never a snapshot reference, so any string is valid.
|
|
64
|
+
*
|
|
65
|
+
* `generation` uses `Number.isSafeInteger`, not `Number.isInteger`: a value at
|
|
66
|
+
* or above `2 ** 53` passes `isInteger` but is no longer uniquely
|
|
67
|
+
* representable, so `1 + max(parents' generations)` — how a writer derives the
|
|
68
|
+
* next generation — can round back to the parent's value and fail to advance.
|
|
69
|
+
* Rejecting unsafe integers keeps stored generations exact.
|
|
70
|
+
*
|
|
71
|
+
* Both `snapshot` and `generation` are required by the schema, so no absence
|
|
72
|
+
* ever has to be resolved here: a revision states its content and its
|
|
73
|
+
* generation explicitly, and is fully interpretable in isolation (see the
|
|
74
|
+
* README). The former snapshot-resolution algorithm (subject-as-fallback,
|
|
75
|
+
* single-parent inheritance, multi-parent rejection) is gone.
|
|
76
|
+
*
|
|
77
|
+
* Exported separately from {@link validate} for callers that assemble a
|
|
78
|
+
* `Revision` themselves from already-typed fields (e.g. `fjs/cas/evo`'s
|
|
79
|
+
* `addRevision`): the shape is then guaranteed by TypeScript already, so only
|
|
80
|
+
* these semantic (string-only error) checks are worth re-running — routing
|
|
81
|
+
* through the combined structural-plus-semantic `validate` would add an
|
|
82
|
+
* unreachable structural-error branch on the caller's side.
|
|
66
83
|
*/
|
|
67
|
-
const checkReferences = (r) => {
|
|
84
|
+
export const checkReferences = (r) => {
|
|
68
85
|
for (const p of r.parents) {
|
|
69
86
|
if (!isHash(p)) {
|
|
70
87
|
return error(`parent is not a valid hash: ${p}`);
|
|
71
88
|
}
|
|
72
89
|
}
|
|
73
|
-
if (r.snapshot
|
|
74
|
-
return
|
|
75
|
-
}
|
|
76
|
-
if (r.parents.length === 0) {
|
|
77
|
-
return isHash(r.subject)
|
|
78
|
-
? ok(r)
|
|
79
|
-
: error(`subject must be a valid hash when snapshot is absent and there are no parents: ${r.subject}`);
|
|
90
|
+
if (!isHash(r.snapshot)) {
|
|
91
|
+
return error(`snapshot is not a valid hash: ${r.snapshot}`);
|
|
80
92
|
}
|
|
81
|
-
if (r.
|
|
82
|
-
return
|
|
93
|
+
if (!Number.isSafeInteger(r.generation) || r.generation < 0) {
|
|
94
|
+
return error(`generation must be a non-negative safe integer: ${r.generation}`);
|
|
83
95
|
}
|
|
84
|
-
return
|
|
96
|
+
return ok(r);
|
|
85
97
|
};
|
|
86
98
|
/**
|
|
87
99
|
* Validates an already-parsed JSON value as a `revision` BLOB: structural
|
|
88
|
-
* (rtti) validation followed by the
|
|
100
|
+
* (rtti) validation followed by the hash / generation semantic checks.
|
|
89
101
|
*/
|
|
90
102
|
export const validate = (value) => {
|
|
91
103
|
const [t, v] = validateShape(value);
|
|
@@ -94,7 +106,7 @@ export const validate = (value) => {
|
|
|
94
106
|
}
|
|
95
107
|
return checkReferences(v);
|
|
96
108
|
};
|
|
97
|
-
/** Parses `text` as JSON without relying on `JSON.parse` (the shared `
|
|
109
|
+
/** Parses `text` as JSON without relying on `JSON.parse` (the shared `fjs/media/json` parser/tokenizer). */
|
|
98
110
|
const parseJson = (text) => jsonParse(jsonTokenize(stringToList(text)));
|
|
99
111
|
/**
|
|
100
112
|
* Decodes `text` as a `revision` BLOB: JSON-parses it, then validates it per
|
|
@@ -6,15 +6,17 @@ export declare const proof: {
|
|
|
6
6
|
arbitraryStringRejected: () => void;
|
|
7
7
|
};
|
|
8
8
|
validate: {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
9
|
+
allFieldsPresent: () => void;
|
|
10
|
+
nonHashSubjectAccepted: () => void;
|
|
11
|
+
multiParentAccepted: () => void;
|
|
12
|
+
missingSnapshotRejected: () => void;
|
|
13
|
+
nonHashSnapshotRejected: () => void;
|
|
14
|
+
missingGenerationRejected: () => void;
|
|
15
|
+
nonIntegerGenerationRejected: () => void;
|
|
16
|
+
negativeGenerationRejected: () => void;
|
|
17
|
+
unsafeIntegerGenerationRejected: () => void;
|
|
18
|
+
positiveGenerationAccepted: () => void;
|
|
15
19
|
httpsRejectedInParents: () => void;
|
|
16
|
-
httpsRejectedInSnapshot: () => void;
|
|
17
|
-
httpsRejectedAsFallbackSubject: () => void;
|
|
18
20
|
archivedAccepted: () => void;
|
|
19
21
|
wrongDialectRejected: () => void;
|
|
20
22
|
missingSubjectRejected: () => void;
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { assert, assertEq } from '../../asserts/module.f.js';
|
|
2
|
+
import { dialect, mediaType, isHash, validate, decodeText } from './module.f.js';
|
|
3
|
+
// Valid cbase32 hashes (round-tripped in fjs/basen/cbase32/proof.f.ts): single
|
|
4
|
+
// cbase32 symbols, cheap to write inline here.
|
|
5
|
+
const h1 = '8';
|
|
6
|
+
const h2 = 'r';
|
|
7
|
+
// A shape-valid revision: every required field present (`snapshot` and
|
|
8
|
+
// `generation` included), with `extra` overriding or adding fields per test.
|
|
9
|
+
const revisionOf = (extra) => ({
|
|
10
|
+
dialect,
|
|
11
|
+
subject: h1,
|
|
12
|
+
parents: [],
|
|
13
|
+
snapshot: h2,
|
|
14
|
+
generation: 0,
|
|
15
|
+
...extra,
|
|
16
|
+
});
|
|
17
|
+
export const proof = {
|
|
18
|
+
dialectAndMediaType: () => {
|
|
19
|
+
assertEq(dialect, 'vnd.fjs.revision');
|
|
20
|
+
assertEq(mediaType, 'application/vnd.fjs.revision+json');
|
|
21
|
+
},
|
|
22
|
+
isHash: {
|
|
23
|
+
validHash: () => assert(isHash(h1)),
|
|
24
|
+
httpsRejected: () => assert(!isHash('https://example.com/blob/abc')),
|
|
25
|
+
arbitraryStringRejected: () => assert(!isHash('not-a-hash!')),
|
|
26
|
+
},
|
|
27
|
+
validate: {
|
|
28
|
+
// A fully explicit revision validates.
|
|
29
|
+
allFieldsPresent: () => {
|
|
30
|
+
const [t] = validate(revisionOf({}));
|
|
31
|
+
assertEq(t, 'ok');
|
|
32
|
+
},
|
|
33
|
+
// `subject` is a pure identity string, never a snapshot reference: a
|
|
34
|
+
// zero-parent revision whose `subject` is not a hash is now valid,
|
|
35
|
+
// because `snapshot` is always stated explicitly.
|
|
36
|
+
nonHashSubjectAccepted: () => {
|
|
37
|
+
const r = validate(revisionOf({ subject: 'my-config' }));
|
|
38
|
+
assert(r[0] === 'ok', ['expected ok', r]);
|
|
39
|
+
assertEq(r[1].subject, 'my-config');
|
|
40
|
+
},
|
|
41
|
+
// A merge revision (more than one parent) is valid like any other —
|
|
42
|
+
// there is no "multiple parents without snapshot" case left, because
|
|
43
|
+
// `snapshot` is required.
|
|
44
|
+
multiParentAccepted: () => {
|
|
45
|
+
const r = validate(revisionOf({ subject: 'my-config', parents: [h1, h2], snapshot: h2 }));
|
|
46
|
+
assert(r[0] === 'ok', ['expected ok', r]);
|
|
47
|
+
assertEq(r[1].snapshot, h2);
|
|
48
|
+
},
|
|
49
|
+
// `snapshot` is required: absent is a shape error.
|
|
50
|
+
missingSnapshotRejected: () => {
|
|
51
|
+
const [t] = validate({ dialect, subject: h1, parents: [], generation: 0 });
|
|
52
|
+
assertEq(t, 'error');
|
|
53
|
+
},
|
|
54
|
+
// `snapshot` must decode as a hash — `https://` bridge URLs rejected.
|
|
55
|
+
nonHashSnapshotRejected: () => {
|
|
56
|
+
const [t] = validate(revisionOf({ snapshot: 'https://example.com/x' }));
|
|
57
|
+
assertEq(t, 'error');
|
|
58
|
+
},
|
|
59
|
+
// `generation` is required: absent is a shape error.
|
|
60
|
+
missingGenerationRejected: () => {
|
|
61
|
+
const [t] = validate({ dialect, subject: h1, parents: [], snapshot: h2 });
|
|
62
|
+
assertEq(t, 'error');
|
|
63
|
+
},
|
|
64
|
+
// `generation` must be an integer: a fractional value is rejected.
|
|
65
|
+
nonIntegerGenerationRejected: () => {
|
|
66
|
+
const [t] = validate(revisionOf({ generation: 1.5 }));
|
|
67
|
+
assertEq(t, 'error');
|
|
68
|
+
},
|
|
69
|
+
// `generation` must be non-negative.
|
|
70
|
+
negativeGenerationRejected: () => {
|
|
71
|
+
const [t] = validate(revisionOf({ generation: -1 }));
|
|
72
|
+
assertEq(t, 'error');
|
|
73
|
+
},
|
|
74
|
+
// `generation` must be a *safe* integer: at `2 ** 53` and above the
|
|
75
|
+
// value is no longer uniquely representable, so `1 + max(...)` could
|
|
76
|
+
// fail to advance — such a blob is rejected (`Number.isInteger` would
|
|
77
|
+
// accept it; `Number.isSafeInteger` does not).
|
|
78
|
+
unsafeIntegerGenerationRejected: () => {
|
|
79
|
+
const [t] = validate(revisionOf({ generation: 2 ** 53 }));
|
|
80
|
+
assertEq(t, 'error');
|
|
81
|
+
},
|
|
82
|
+
// A positive integer generation is accepted.
|
|
83
|
+
positiveGenerationAccepted: () => {
|
|
84
|
+
const r = validate(revisionOf({ parents: [h1], generation: 3 }));
|
|
85
|
+
assert(r[0] === 'ok', ['expected ok', r]);
|
|
86
|
+
assertEq(r[1].generation, 3);
|
|
87
|
+
},
|
|
88
|
+
// `https://` bridge URLs are rejected wherever a hash is required.
|
|
89
|
+
httpsRejectedInParents: () => {
|
|
90
|
+
const [t] = validate(revisionOf({ parents: ['https://example.com/x'] }));
|
|
91
|
+
assertEq(t, 'error');
|
|
92
|
+
},
|
|
93
|
+
// `archived` follows the presence-only `option(true)` idiom.
|
|
94
|
+
archivedAccepted: () => {
|
|
95
|
+
const [t] = validate(revisionOf({ archived: true }));
|
|
96
|
+
assertEq(t, 'ok');
|
|
97
|
+
},
|
|
98
|
+
// Wrong dialect tag: structural validation rejects it outright.
|
|
99
|
+
wrongDialectRejected: () => {
|
|
100
|
+
const [t] = validate({ dialect: 'vnd.fjs.other', subject: h1, parents: [], snapshot: h2, generation: 0 });
|
|
101
|
+
assertEq(t, 'error');
|
|
102
|
+
},
|
|
103
|
+
// Missing required fields: rejected.
|
|
104
|
+
missingSubjectRejected: () => {
|
|
105
|
+
const [t] = validate({ dialect, parents: [], snapshot: h2, generation: 0 });
|
|
106
|
+
assertEq(t, 'error');
|
|
107
|
+
},
|
|
108
|
+
// rtti structs are open: extra fields don't break validation — the
|
|
109
|
+
// additive forward-compatibility path the versioning rule relies on.
|
|
110
|
+
extraFieldsAccepted: () => {
|
|
111
|
+
const [t] = validate(revisionOf({ future: 'field' }));
|
|
112
|
+
assertEq(t, 'ok');
|
|
113
|
+
},
|
|
114
|
+
},
|
|
115
|
+
decodeText: {
|
|
116
|
+
validJson: () => {
|
|
117
|
+
const r = decodeText(JSON.stringify(revisionOf({})));
|
|
118
|
+
assert(r[0] === 'ok', ['expected ok', r]);
|
|
119
|
+
assertEq(r[1].subject, h1);
|
|
120
|
+
},
|
|
121
|
+
// Key order carries no meaning: detection parses the JSON and
|
|
122
|
+
// validates the parsed value, so `dialect` need not be first.
|
|
123
|
+
keyOrderIndependent: () => {
|
|
124
|
+
const text = `{"generation":0,"snapshot":"${h2}","parents":[],"subject":"${h1}","dialect":"${dialect}"}`;
|
|
125
|
+
const [t] = decodeText(text);
|
|
126
|
+
assertEq(t, 'ok');
|
|
127
|
+
},
|
|
128
|
+
malformedJsonRejected: () => {
|
|
129
|
+
const [t] = decodeText('{not json');
|
|
130
|
+
assertEq(t, 'error');
|
|
131
|
+
},
|
|
132
|
+
// Ordinary JSON that isn't a revision at all falls through as an error
|
|
133
|
+
// here — `fjs/media`'s composed detector is what falls back to the
|
|
134
|
+
// ordinary detector; this module only reports validity.
|
|
135
|
+
ordinaryJsonRejected: () => {
|
|
136
|
+
const [t] = decodeText('{"hello":"world"}');
|
|
137
|
+
assertEq(t, 'error');
|
|
138
|
+
},
|
|
139
|
+
},
|
|
140
|
+
};
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
*/
|
|
35
35
|
import { msb, fromSentinel, length, u8List } from '../../types/bit_vec/module.f.js';
|
|
36
36
|
import { iterable } from '../../types/list/module.f.js';
|
|
37
|
-
import { pure } from '../../effects/module.f.js';
|
|
37
|
+
import { pure, step } from '../../effects/module.f.js';
|
|
38
38
|
import { ok, error } from '../../types/result/module.f.js';
|
|
39
39
|
import { isValidCodePoint, isTextCodePoint } from '../../text/code_point/module.f.js';
|
|
40
40
|
import { utf8ByteToCodePointOp } from '../../text/utf8/module.f.js';
|
|
@@ -216,7 +216,7 @@ export const detectVec = (bytes) => finish(push(detectInit)(bytes));
|
|
|
216
216
|
* item short-circuits into the `IoResult` error.
|
|
217
217
|
*/
|
|
218
218
|
export const detectStream = (stream) => {
|
|
219
|
-
const loop = (s) => (l) =>
|
|
219
|
+
const loop = (s) => (l) => step(l, (node) => {
|
|
220
220
|
if (node === undefined) {
|
|
221
221
|
return pure(ok(finish(s)));
|
|
222
222
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { assert, assertEq } from '../../asserts/module.f.js';
|
|
2
2
|
import { msb, u8ListToVec, vec8, repeat, empty } from '../../types/bit_vec/module.f.js';
|
|
3
|
-
import {
|
|
3
|
+
import { runPure } from '../../effects/module.f.js';
|
|
4
4
|
import { nonEmpty, empty as emptyList } from '../../effects/list/module.f.js';
|
|
5
5
|
import { ok } from '../../types/result/module.f.js';
|
|
6
6
|
import { detect, detectStream, detectVec } from './module.f.js';
|
|
@@ -8,22 +8,14 @@ import { detect, detectStream, detectVec } from './module.f.js';
|
|
|
8
8
|
// store would hold the leading bytes of a stored blob.
|
|
9
9
|
const bytes = (...b) => u8ListToVec(msb)(b);
|
|
10
10
|
// ── Streaming detector helpers ──────────────────────────────────────────────────
|
|
11
|
-
// Evaluates a fully pure effect (no operations) to its result.
|
|
12
|
-
const runPure = (e) => {
|
|
13
|
-
const d = decode(e);
|
|
14
|
-
if (!d.done) {
|
|
15
|
-
throw 'effect is not pure';
|
|
16
|
-
}
|
|
17
|
-
return d.result;
|
|
18
|
-
};
|
|
19
11
|
// Builds a CAS-style read stream from a sequence of ok(chunk) items.
|
|
20
12
|
const stream = (...chunks) => chunks.reduceRight((tail, c) => nonEmpty(ok(c), tail), emptyList());
|
|
21
13
|
// Runs the streaming detector over the given chunks and unwraps the metadata.
|
|
22
14
|
const detectChunks = (...chunks) => {
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
15
|
+
const o = runPure(detectStream(stream(...chunks)));
|
|
16
|
+
assert(o.length === 1, 'effect is not pure');
|
|
17
|
+
const [r] = o;
|
|
18
|
+
assert(r[0] !== 'error', r[1]);
|
|
27
19
|
return r[1];
|
|
28
20
|
};
|
|
29
21
|
export const proof = {
|
|
@@ -177,8 +169,9 @@ export const proof = {
|
|
|
177
169
|
// A read `error` item short-circuits into the IoResult error.
|
|
178
170
|
readErrorSurfaces: () => {
|
|
179
171
|
const errStream = nonEmpty(['error', 'boom'], emptyList());
|
|
180
|
-
const
|
|
181
|
-
assert(
|
|
172
|
+
const o = runPure(detectStream(errStream));
|
|
173
|
+
assert(o.length === 1, 'effect is not pure');
|
|
174
|
+
assert(o[0][0] === 'error');
|
|
182
175
|
},
|
|
183
176
|
// Empty stream: zero-length text/plain.
|
|
184
177
|
empty: () => {
|
package/{fs → fjs}/module.f.js
RENAMED
|
@@ -10,7 +10,8 @@ import { main as ciMain } from './ci/module.f.js';
|
|
|
10
10
|
import { import_ } from './effects/node/module.f.js';
|
|
11
11
|
import { dispatch } from './cli/module.f.js';
|
|
12
12
|
import { casMcpServer } from './cas/mcp/module.f.js';
|
|
13
|
-
import { pure } from './effects/module.f.js';
|
|
13
|
+
import { pure, step } from './effects/module.f.js';
|
|
14
|
+
import { unwrap } from './types/result/module.f.js';
|
|
14
15
|
const commands = [
|
|
15
16
|
{
|
|
16
17
|
names: ['test', 't'],
|
|
@@ -29,8 +30,8 @@ const commands = [
|
|
|
29
30
|
},
|
|
30
31
|
{
|
|
31
32
|
names: ['mcp', 'm'],
|
|
32
|
-
description: 'Run an MCP server over stdio exposing the CAS as tools',
|
|
33
|
-
handler: ({ home }) => casMcpServer(home)
|
|
33
|
+
description: 'Run an MCP server over stdio exposing the CAS and Evo (subjects/heads) as tools',
|
|
34
|
+
handler: ({ home }) => step(casMcpServer(home), () => pure(0)),
|
|
34
35
|
},
|
|
35
36
|
{
|
|
36
37
|
names: ['ci', 'i'],
|
|
@@ -42,12 +43,7 @@ const commands = [
|
|
|
42
43
|
description: 'Run a FunctionalScript module as a NodeProgram',
|
|
43
44
|
handler: options => {
|
|
44
45
|
const [file, ...args] = options.args;
|
|
45
|
-
return import_(file)
|
|
46
|
-
if (s === 'error') {
|
|
47
|
-
throw v;
|
|
48
|
-
}
|
|
49
|
-
return v.main({ ...options, args });
|
|
50
|
-
});
|
|
46
|
+
return step(import_(file), x => unwrap(x).main({ ...options, args }));
|
|
51
47
|
},
|
|
52
48
|
},
|
|
53
49
|
];
|