goscript 0.1.0 → 0.1.2
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 +267 -255
- package/cmd/goscript/cmd-test.go +286 -0
- package/cmd/goscript/cmd-test_test.go +76 -0
- package/cmd/goscript/cmd_compile.go +9 -0
- package/cmd/goscript/main.go +1 -0
- package/compiler/build-flags.go +38 -0
- package/compiler/compile-request.go +33 -0
- package/compiler/compiler.go +1 -1
- package/compiler/compliance_test.go +0 -10
- package/compiler/config.go +2 -0
- package/compiler/gotest/owner.go +24 -0
- package/compiler/gotest/package-result.go +69 -0
- package/compiler/gotest/request.go +210 -0
- package/compiler/gotest/result.go +28 -0
- package/compiler/gotest/runner.go +1225 -0
- package/compiler/gotest/runner_test.go +1271 -0
- package/compiler/gotest/test.go +9 -0
- package/compiler/index.test.ts +1 -1
- package/compiler/lowered-program.go +80 -21
- package/compiler/lowering.go +6754 -602
- package/compiler/override-facts.go +357 -0
- package/compiler/override-registry.go +52 -190
- package/compiler/override-registry_test.go +182 -0
- package/compiler/package-graph.go +50 -27
- package/compiler/package-graph_test.go +99 -9
- package/compiler/package-test-function.go +9 -0
- package/compiler/package-test-graph-package.go +40 -0
- package/compiler/package-test-graph-variant.go +129 -0
- package/compiler/package-test-graph.go +112 -0
- package/compiler/package-test-graph_test.go +202 -0
- package/compiler/runtime-contract.go +229 -29
- package/compiler/runtime-contract_test.go +44 -30
- package/compiler/semantic-model-types.go +25 -6
- package/compiler/semantic-model.go +819 -74
- package/compiler/semantic-model_test.go +104 -0
- package/compiler/service.go +10 -4
- package/compiler/skeleton_test.go +2777 -524
- package/compiler/tsworkspace/owner-process-unix_test.go +72 -0
- package/compiler/tsworkspace/owner.go +342 -0
- package/compiler/tsworkspace/owner_test.go +93 -0
- package/compiler/tsworkspace/result.go +17 -0
- package/compiler/tsworkspace/tool-process-other.go +14 -0
- package/compiler/tsworkspace/tool-process-unix.go +19 -0
- package/compiler/typescript-emitter.go +576 -86
- package/compiler/wasm/compile.go +1 -1
- package/compiler/wasm/compile_test.go +61 -11
- package/compiler/wasm_api.go +172 -7
- package/dist/gs/builtin/builtin.d.ts +40 -3
- package/dist/gs/builtin/builtin.js +430 -22
- package/dist/gs/builtin/builtin.js.map +1 -1
- package/dist/gs/builtin/channel.d.ts +32 -10
- package/dist/gs/builtin/channel.js +119 -25
- package/dist/gs/builtin/channel.js.map +1 -1
- package/dist/gs/builtin/defer.d.ts +1 -0
- package/dist/gs/builtin/defer.js +12 -2
- package/dist/gs/builtin/defer.js.map +1 -1
- package/dist/gs/builtin/hostio.d.ts +9 -0
- package/dist/gs/builtin/hostio.js +25 -0
- package/dist/gs/builtin/hostio.js.map +1 -1
- package/dist/gs/builtin/map.js +40 -6
- package/dist/gs/builtin/map.js.map +1 -1
- package/dist/gs/builtin/print.js.map +1 -1
- package/dist/gs/builtin/slice.d.ts +64 -10
- package/dist/gs/builtin/slice.js +619 -244
- package/dist/gs/builtin/slice.js.map +1 -1
- package/dist/gs/builtin/type.d.ts +7 -2
- package/dist/gs/builtin/type.js +128 -29
- package/dist/gs/builtin/type.js.map +1 -1
- package/dist/gs/builtin/varRef.d.ts +7 -0
- package/dist/gs/builtin/varRef.js +23 -0
- package/dist/gs/builtin/varRef.js.map +1 -1
- package/dist/gs/bytes/buffer.gs.js +74 -70
- package/dist/gs/bytes/buffer.gs.js.map +1 -1
- package/dist/gs/bytes/iter.gs.js +13 -13
- package/dist/gs/bytes/iter.gs.js.map +1 -1
- package/dist/gs/bytes/reader.gs.js +20 -18
- package/dist/gs/bytes/reader.gs.js.map +1 -1
- package/dist/gs/compress/zlib/index.d.ts +26 -0
- package/dist/gs/compress/zlib/index.js +168 -0
- package/dist/gs/compress/zlib/index.js.map +1 -0
- package/dist/gs/context/context.d.ts +6 -5
- package/dist/gs/context/context.js +17 -12
- package/dist/gs/context/context.js.map +1 -1
- package/dist/gs/crypto/ecdh/index.d.ts +52 -0
- package/dist/gs/crypto/ecdh/index.js +226 -0
- package/dist/gs/crypto/ecdh/index.js.map +1 -0
- package/dist/gs/crypto/ed25519/index.d.ts +34 -0
- package/dist/gs/crypto/ed25519/index.js +160 -0
- package/dist/gs/crypto/ed25519/index.js.map +1 -0
- package/dist/gs/crypto/internal/constanttime/index.d.ts +4 -0
- package/dist/gs/crypto/internal/constanttime/index.js +18 -0
- package/dist/gs/crypto/internal/constanttime/index.js.map +1 -0
- package/dist/gs/crypto/internal/fips140deps/byteorder/index.d.ts +1 -0
- package/dist/gs/crypto/internal/fips140deps/byteorder/index.js +2 -0
- package/dist/gs/crypto/internal/fips140deps/byteorder/index.js.map +1 -0
- package/dist/gs/crypto/internal/fips140deps/godebug/index.d.ts +1 -0
- package/dist/gs/crypto/internal/fips140deps/godebug/index.js +2 -0
- package/dist/gs/crypto/internal/fips140deps/godebug/index.js.map +1 -0
- package/dist/gs/crypto/rand/index.d.ts +2 -0
- package/dist/gs/crypto/rand/index.js +85 -0
- package/dist/gs/crypto/rand/index.js.map +1 -1
- package/dist/gs/crypto/sha256/index.d.ts +8 -0
- package/dist/gs/crypto/sha256/index.js +118 -0
- package/dist/gs/crypto/sha256/index.js.map +1 -0
- package/dist/gs/crypto/sha512/index.d.ts +14 -0
- package/dist/gs/crypto/sha512/index.js +129 -0
- package/dist/gs/crypto/sha512/index.js.map +1 -0
- package/dist/gs/embed/index.d.ts +7 -0
- package/dist/gs/embed/index.js +16 -0
- package/dist/gs/embed/index.js.map +1 -0
- package/dist/gs/encoding/json/index.d.ts +4 -0
- package/dist/gs/encoding/json/index.js +33 -0
- package/dist/gs/encoding/json/index.js.map +1 -1
- package/dist/gs/errors/errors.d.ts +4 -0
- package/dist/gs/errors/errors.js +108 -4
- package/dist/gs/errors/errors.js.map +1 -1
- package/dist/gs/fmt/fmt.d.ts +4 -4
- package/dist/gs/fmt/fmt.js +42 -11
- package/dist/gs/fmt/fmt.js.map +1 -1
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.d.ts +37 -2
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js +245 -1
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js.map +1 -1
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.d.ts +189 -0
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js +861 -0
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js.map +1 -0
- package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.d.ts +217 -0
- package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js +814 -0
- package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js.map +1 -0
- package/dist/gs/github.com/aperturerobotics/util/conc/index.d.ts +20 -0
- package/dist/gs/github.com/aperturerobotics/util/conc/index.js +134 -0
- package/dist/gs/github.com/aperturerobotics/util/conc/index.js.map +1 -0
- package/dist/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/browser.js.map +1 -1
- package/dist/gs/github.com/hack-pad/safejs/internal/catch/index.d.ts +3 -0
- package/dist/gs/github.com/hack-pad/safejs/internal/catch/index.js +50 -0
- package/dist/gs/github.com/hack-pad/safejs/internal/catch/index.js.map +1 -0
- package/dist/gs/github.com/klauspost/compress/internal/le/index.d.ts +9 -0
- package/dist/gs/github.com/klauspost/compress/internal/le/index.js +72 -0
- package/dist/gs/github.com/klauspost/compress/internal/le/index.js.map +1 -0
- package/dist/gs/github.com/mr-tron/base58/base58/index.d.ts +27 -0
- package/dist/gs/github.com/mr-tron/base58/base58/index.js +172 -0
- package/dist/gs/github.com/mr-tron/base58/base58/index.js.map +1 -0
- package/dist/gs/github.com/zeebo/blake3/internal/consts/index.d.ts +21 -0
- package/dist/gs/github.com/zeebo/blake3/internal/consts/index.js +22 -0
- package/dist/gs/github.com/zeebo/blake3/internal/consts/index.js.map +1 -0
- package/dist/gs/go/internal/scannerhooks/index.d.ts +3 -0
- package/dist/gs/go/internal/scannerhooks/index.js +5 -0
- package/dist/gs/go/internal/scannerhooks/index.js.map +1 -0
- package/dist/gs/go/scanner/index.d.ts +13 -0
- package/dist/gs/go/scanner/index.js +35 -0
- package/dist/gs/go/scanner/index.js.map +1 -1
- package/dist/gs/go/token/index.d.ts +156 -0
- package/dist/gs/go/token/index.js +507 -4
- package/dist/gs/go/token/index.js.map +1 -1
- package/dist/gs/hash/fnv/index.d.ts +57 -0
- package/dist/gs/hash/fnv/index.js +299 -0
- package/dist/gs/hash/fnv/index.js.map +1 -0
- package/dist/gs/hash/index.d.ts +17 -0
- package/dist/gs/hash/index.js +94 -0
- package/dist/gs/hash/index.js.map +1 -0
- package/dist/gs/internal/abi/index.d.ts +4 -0
- package/dist/gs/internal/abi/index.js +10 -0
- package/dist/gs/internal/abi/index.js.map +1 -1
- package/dist/gs/internal/bytealg/index.d.ts +2 -0
- package/dist/gs/internal/bytealg/index.js +14 -0
- package/dist/gs/internal/bytealg/index.js.map +1 -1
- package/dist/gs/internal/byteorder/index.d.ts +8 -2
- package/dist/gs/internal/byteorder/index.js +56 -25
- package/dist/gs/internal/byteorder/index.js.map +1 -1
- package/dist/gs/internal/godebug/index.d.ts +12 -0
- package/dist/gs/internal/godebug/index.js +30 -0
- package/dist/gs/internal/godebug/index.js.map +1 -0
- package/dist/gs/io/fs/index.d.ts +1 -0
- package/dist/gs/io/fs/index.js +1 -0
- package/dist/gs/io/fs/index.js.map +1 -1
- package/dist/gs/io/fs/readlink.d.ts +8 -0
- package/dist/gs/io/fs/readlink.js +60 -0
- package/dist/gs/io/fs/readlink.js.map +1 -0
- package/dist/gs/io/fs/walk.d.ts +3 -3
- package/dist/gs/io/fs/walk.js +7 -7
- package/dist/gs/io/fs/walk.js.map +1 -1
- package/dist/gs/io/io.d.ts +40 -6
- package/dist/gs/io/io.js +151 -26
- package/dist/gs/io/io.js.map +1 -1
- package/dist/gs/iter/iter.d.ts +3 -2
- package/dist/gs/iter/iter.js.map +1 -1
- package/dist/gs/maps/iter.d.ts +5 -5
- package/dist/gs/maps/iter.js +48 -21
- package/dist/gs/maps/iter.js.map +1 -1
- package/dist/gs/maps/maps.d.ts +6 -6
- package/dist/gs/maps/maps.js +1 -1
- package/dist/gs/maps/maps.js.map +1 -1
- package/dist/gs/math/bits/index.d.ts +13 -4
- package/dist/gs/math/bits/index.js +70 -48
- package/dist/gs/math/bits/index.js.map +1 -1
- package/dist/gs/math/const.gs.d.ts +5 -5
- package/dist/gs/math/const.gs.js +4 -4
- package/dist/gs/math/const.gs.js.map +1 -1
- package/dist/gs/mime/index.d.ts +1 -0
- package/dist/gs/mime/index.js +52 -0
- package/dist/gs/mime/index.js.map +1 -0
- package/dist/gs/net/http/httptest/index.d.ts +30 -0
- package/dist/gs/net/http/httptest/index.js +101 -0
- package/dist/gs/net/http/httptest/index.js.map +1 -0
- package/dist/gs/net/http/index.d.ts +131 -0
- package/dist/gs/net/http/index.js +307 -0
- package/dist/gs/net/http/index.js.map +1 -0
- package/dist/gs/net/http/pprof/index.d.ts +8 -0
- package/dist/gs/net/http/pprof/index.js +59 -0
- package/dist/gs/net/http/pprof/index.js.map +1 -0
- package/dist/gs/os/dir_unix.gs.js +2 -2
- package/dist/gs/os/dir_unix.gs.js.map +1 -1
- package/dist/gs/os/error.gs.js +9 -7
- package/dist/gs/os/error.gs.js.map +1 -1
- package/dist/gs/os/types_js.gs.js +95 -15
- package/dist/gs/os/types_js.gs.js.map +1 -1
- package/dist/gs/path/filepath/match.js +165 -3
- package/dist/gs/path/filepath/match.js.map +1 -1
- package/dist/gs/path/filepath/path.d.ts +8 -4
- package/dist/gs/path/filepath/path.js +192 -8
- package/dist/gs/path/filepath/path.js.map +1 -1
- package/dist/gs/path/path.d.ts +4 -1
- package/dist/gs/path/path.js +16 -4
- package/dist/gs/path/path.js.map +1 -1
- package/dist/gs/reflect/index.d.ts +4 -3
- package/dist/gs/reflect/index.js +3 -2
- package/dist/gs/reflect/index.js.map +1 -1
- package/dist/gs/reflect/iter.js +2 -2
- package/dist/gs/reflect/iter.js.map +1 -1
- package/dist/gs/reflect/map.js +29 -0
- package/dist/gs/reflect/map.js.map +1 -1
- package/dist/gs/reflect/type.d.ts +31 -9
- package/dist/gs/reflect/type.js +536 -43
- package/dist/gs/reflect/type.js.map +1 -1
- package/dist/gs/reflect/types.d.ts +1 -0
- package/dist/gs/reflect/types.js +3 -1
- package/dist/gs/reflect/types.js.map +1 -1
- package/dist/gs/reflect/value.d.ts +4 -1
- package/dist/gs/reflect/value.js +39 -1
- package/dist/gs/reflect/value.js.map +1 -1
- package/dist/gs/reflect/visiblefields.js +1 -1
- package/dist/gs/reflect/visiblefields.js.map +1 -1
- package/dist/gs/runtime/debug/index.d.ts +41 -0
- package/dist/gs/runtime/debug/index.js +66 -0
- package/dist/gs/runtime/debug/index.js.map +1 -0
- package/dist/gs/runtime/pprof/index.d.ts +20 -0
- package/dist/gs/runtime/pprof/index.js +85 -0
- package/dist/gs/runtime/pprof/index.js.map +1 -0
- package/dist/gs/runtime/runtime.d.ts +35 -3
- package/dist/gs/runtime/runtime.js +72 -0
- package/dist/gs/runtime/runtime.js.map +1 -1
- package/dist/gs/runtime/trace/index.d.ts +19 -0
- package/dist/gs/runtime/trace/index.js +64 -0
- package/dist/gs/runtime/trace/index.js.map +1 -0
- package/dist/gs/slices/slices.d.ts +42 -8
- package/dist/gs/slices/slices.js +425 -11
- package/dist/gs/slices/slices.js.map +1 -1
- package/dist/gs/sort/slice.gs.d.ts +5 -3
- package/dist/gs/sort/slice.gs.js +60 -22
- package/dist/gs/sort/slice.gs.js.map +1 -1
- package/dist/gs/sort/sort.gs.d.ts +4 -4
- package/dist/gs/sort/sort.gs.js +11 -8
- package/dist/gs/sort/sort.gs.js.map +1 -1
- package/dist/gs/strings/builder.d.ts +1 -1
- package/dist/gs/strings/builder.js +29 -19
- package/dist/gs/strings/builder.js.map +1 -1
- package/dist/gs/strings/iter.js +140 -75
- package/dist/gs/strings/iter.js.map +1 -1
- package/dist/gs/strings/replace.js +2 -2
- package/dist/gs/strings/replace.js.map +1 -1
- package/dist/gs/strings/strings.js +52 -6
- package/dist/gs/strings/strings.js.map +1 -1
- package/dist/gs/sync/atomic/type.gs.d.ts +9 -8
- package/dist/gs/sync/atomic/type.gs.js +0 -2
- package/dist/gs/sync/atomic/type.gs.js.map +1 -1
- package/dist/gs/sync/sync.d.ts +8 -3
- package/dist/gs/sync/sync.js +66 -11
- package/dist/gs/sync/sync.js.map +1 -1
- package/dist/gs/syscall/constants.d.ts +36 -24
- package/dist/gs/syscall/constants.js +12 -0
- package/dist/gs/syscall/constants.js.map +1 -1
- package/dist/gs/syscall/errors.d.ts +117 -111
- package/dist/gs/syscall/errors.js +45 -0
- package/dist/gs/syscall/errors.js.map +1 -1
- package/dist/gs/syscall/fs.d.ts +37 -0
- package/dist/gs/syscall/fs.js +102 -0
- package/dist/gs/syscall/fs.js.map +1 -1
- package/dist/gs/syscall/js/index.d.ts +90 -0
- package/dist/gs/syscall/js/index.js +383 -0
- package/dist/gs/syscall/js/index.js.map +1 -0
- package/dist/gs/syscall/types.d.ts +26 -1
- package/dist/gs/syscall/types.js +45 -1
- package/dist/gs/syscall/types.js.map +1 -1
- package/dist/gs/testing/index.d.ts +1 -0
- package/dist/gs/testing/index.js +2 -0
- package/dist/gs/testing/index.js.map +1 -0
- package/dist/gs/testing/testing.d.ts +78 -0
- package/dist/gs/testing/testing.js +318 -0
- package/dist/gs/testing/testing.js.map +1 -0
- package/dist/gs/time/time.d.ts +41 -4
- package/dist/gs/time/time.js +227 -36
- package/dist/gs/time/time.js.map +1 -1
- package/dist/gs/unicode/unicode.d.ts +23 -1
- package/dist/gs/unicode/unicode.js +79 -10
- package/dist/gs/unicode/unicode.js.map +1 -1
- package/dist/gs/unicode/utf8/utf8.d.ts +4 -4
- package/dist/gs/unicode/utf8/utf8.js +24 -11
- package/dist/gs/unicode/utf8/utf8.js.map +1 -1
- package/dist/gs/unique/index.d.ts +11 -0
- package/dist/gs/unique/index.js +76 -0
- package/dist/gs/unique/index.js.map +1 -0
- package/go.mod +8 -8
- package/go.sum +14 -14
- package/gs/builtin/builtin.ts +585 -27
- package/gs/builtin/channel.ts +183 -29
- package/gs/builtin/defer.ts +13 -2
- package/gs/builtin/hostio.test.ts +1 -0
- package/gs/builtin/hostio.ts +38 -0
- package/gs/builtin/map.ts +46 -6
- package/gs/builtin/print.ts +12 -3
- package/gs/builtin/runtime-contract.test.ts +383 -10
- package/gs/builtin/slice.test.ts +70 -0
- package/gs/builtin/slice.ts +785 -265
- package/gs/builtin/type.ts +160 -41
- package/gs/builtin/varRef.ts +40 -1
- package/gs/bytes/buffer.gs.ts +74 -70
- package/gs/bytes/iter.gs.ts +13 -14
- package/gs/bytes/meta.json +8 -3
- package/gs/bytes/reader.gs.ts +20 -19
- package/gs/compress/zlib/index.test.ts +28 -0
- package/gs/compress/zlib/index.ts +200 -0
- package/gs/compress/zlib/meta.json +3 -0
- package/gs/context/context.test.ts +71 -0
- package/gs/context/context.ts +30 -29
- package/gs/crypto/ecdh/index.test.ts +43 -0
- package/gs/crypto/ecdh/index.ts +274 -0
- package/gs/crypto/ed25519/index.test.ts +41 -0
- package/gs/crypto/ed25519/index.ts +238 -0
- package/gs/crypto/ed25519/meta.json +13 -0
- package/gs/crypto/internal/constanttime/index.test.ts +25 -0
- package/gs/crypto/internal/constanttime/index.ts +22 -0
- package/gs/crypto/internal/fips140deps/byteorder/index.ts +1 -0
- package/gs/crypto/internal/fips140deps/godebug/index.ts +1 -0
- package/gs/crypto/rand/index.test.ts +89 -1
- package/gs/crypto/rand/index.ts +103 -1
- package/gs/crypto/rand/meta.json +4 -1
- package/gs/crypto/sha256/index.test.ts +78 -0
- package/gs/crypto/sha256/index.ts +150 -0
- package/gs/crypto/sha256/meta.json +9 -0
- package/gs/crypto/sha512/index.test.ts +31 -0
- package/gs/crypto/sha512/index.ts +161 -0
- package/gs/crypto/sha512/meta.json +11 -0
- package/gs/embed/index.ts +20 -0
- package/gs/embed/meta.json +5 -0
- package/gs/encoding/json/index.test.ts +39 -3
- package/gs/encoding/json/index.ts +45 -3
- package/gs/errors/errors.test.ts +85 -0
- package/gs/errors/errors.ts +132 -4
- package/gs/fmt/fmt.test.ts +3 -1
- package/gs/fmt/fmt.ts +55 -19
- package/gs/github.com/aperturerobotics/protobuf-go-lite/index.test.ts +128 -1
- package/gs/github.com/aperturerobotics/protobuf-go-lite/index.ts +342 -4
- package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.test.ts +180 -0
- package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.ts +1084 -0
- package/gs/github.com/aperturerobotics/starpc/srpc/index.test.ts +31 -0
- package/gs/github.com/aperturerobotics/starpc/srpc/index.ts +1233 -0
- package/gs/github.com/aperturerobotics/starpc/srpc/meta.json +46 -0
- package/gs/github.com/aperturerobotics/util/conc/index.test.ts +30 -0
- package/gs/github.com/aperturerobotics/util/conc/index.ts +172 -0
- package/gs/github.com/aperturerobotics/util/conc/meta.json +9 -0
- package/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/browser.ts +1 -4
- package/gs/github.com/hack-pad/safejs/internal/catch/index.test.ts +35 -0
- package/gs/github.com/hack-pad/safejs/internal/catch/index.ts +65 -0
- package/gs/github.com/hack-pad/safejs/internal/catch/meta.json +9 -0
- package/gs/github.com/klauspost/compress/internal/le/index.test.ts +37 -0
- package/gs/github.com/klauspost/compress/internal/le/index.ts +115 -0
- package/gs/github.com/mr-tron/base58/base58/index.test.ts +70 -0
- package/gs/github.com/mr-tron/base58/base58/index.ts +231 -0
- package/gs/github.com/mr-tron/base58/base58/meta.json +3 -0
- package/gs/github.com/zeebo/blake3/internal/consts/index.test.ts +46 -0
- package/gs/github.com/zeebo/blake3/internal/consts/index.ts +26 -0
- package/gs/go/internal/scannerhooks/index.test.ts +14 -0
- package/gs/go/internal/scannerhooks/index.ts +9 -0
- package/gs/go/scanner/index.test.ts +22 -0
- package/gs/go/scanner/index.ts +47 -0
- package/gs/go/token/index.test.ts +47 -1
- package/gs/go/token/index.ts +583 -4
- package/gs/hash/fnv/index.test.ts +67 -0
- package/gs/hash/fnv/index.ts +351 -0
- package/gs/hash/fnv/meta.json +3 -0
- package/gs/hash/index.test.ts +37 -0
- package/gs/hash/index.ts +118 -0
- package/gs/hash/meta.json +5 -0
- package/gs/internal/abi/index.test.ts +18 -0
- package/gs/internal/abi/index.ts +14 -0
- package/gs/internal/bytealg/index.test.ts +18 -0
- package/gs/internal/bytealg/index.ts +16 -0
- package/gs/internal/byteorder/index.test.ts +39 -0
- package/gs/internal/byteorder/index.ts +100 -27
- package/gs/internal/godebug/index.test.ts +16 -0
- package/gs/internal/godebug/index.ts +35 -0
- package/gs/io/fs/index.ts +1 -0
- package/gs/io/fs/meta.json +5 -0
- package/gs/io/fs/readlink.test.ts +43 -0
- package/gs/io/fs/readlink.ts +69 -0
- package/gs/io/fs/walk.test.ts +61 -0
- package/gs/io/fs/walk.ts +17 -9
- package/gs/io/io.ts +177 -31
- package/gs/io/meta.json +10 -2
- package/gs/iter/iter.ts +8 -2
- package/gs/maps/iter.ts +75 -26
- package/gs/maps/maps.test.ts +23 -0
- package/gs/maps/maps.ts +13 -11
- package/gs/math/bits/index.test.ts +20 -0
- package/gs/math/bits/index.ts +107 -64
- package/gs/math/const.gs.test.ts +11 -5
- package/gs/math/const.gs.ts +5 -6
- package/gs/mime/index.ts +60 -0
- package/gs/net/http/httptest/index.test.ts +53 -0
- package/gs/net/http/httptest/index.ts +120 -0
- package/gs/net/http/index.test.ts +148 -0
- package/gs/net/http/index.ts +432 -0
- package/gs/net/http/meta.json +6 -0
- package/gs/net/http/pprof/index.test.ts +47 -0
- package/gs/net/http/pprof/index.ts +65 -0
- package/gs/os/dir_unix.gs.ts +2 -3
- package/gs/os/error.gs.ts +9 -10
- package/gs/os/error.test.ts +41 -0
- package/gs/os/file_unix_js.test.ts +55 -0
- package/gs/os/tempfile.gs.test.ts +37 -10
- package/gs/os/types_js.gs.ts +96 -17
- package/gs/path/filepath/match.test.ts +31 -12
- package/gs/path/filepath/match.ts +181 -3
- package/gs/path/filepath/meta.json +6 -0
- package/gs/path/filepath/path.test.ts +80 -0
- package/gs/path/filepath/path.ts +244 -11
- package/gs/path/path.ts +20 -5
- package/gs/reflect/field.test.ts +63 -0
- package/gs/reflect/index.ts +5 -1
- package/gs/reflect/iter.ts +2 -2
- package/gs/reflect/map.test.ts +42 -1
- package/gs/reflect/map.ts +39 -0
- package/gs/reflect/type.ts +728 -65
- package/gs/reflect/typefor.test.ts +100 -0
- package/gs/reflect/types.ts +3 -1
- package/gs/reflect/value.ts +50 -1
- package/gs/reflect/visiblefields.ts +1 -1
- package/gs/runtime/debug/index.test.ts +45 -0
- package/gs/runtime/debug/index.ts +96 -0
- package/gs/runtime/pprof/index.test.ts +36 -0
- package/gs/runtime/pprof/index.ts +104 -0
- package/gs/runtime/pprof/meta.json +6 -0
- package/gs/runtime/runtime.test.ts +19 -0
- package/gs/runtime/runtime.ts +98 -3
- package/gs/runtime/trace/index.test.ts +45 -0
- package/gs/runtime/trace/index.ts +97 -0
- package/gs/runtime/trace/meta.json +7 -0
- package/gs/slices/meta.json +2 -1
- package/gs/slices/slices.test.ts +180 -0
- package/gs/slices/slices.ts +502 -15
- package/gs/sort/meta.json +7 -0
- package/gs/sort/slice.gs.ts +85 -26
- package/gs/sort/slice.test.ts +40 -0
- package/gs/sort/sort.gs.ts +16 -13
- package/gs/strings/builder.test.ts +8 -0
- package/gs/strings/builder.ts +33 -20
- package/gs/strings/iter.test.ts +5 -7
- package/gs/strings/iter.ts +146 -71
- package/gs/strings/replace.test.ts +1 -4
- package/gs/strings/replace.ts +6 -6
- package/gs/strings/strings.test.ts +4 -0
- package/gs/strings/strings.ts +54 -6
- package/gs/sync/atomic/type.gs.ts +13 -14
- package/gs/sync/meta.json +3 -1
- package/gs/sync/sync.test.ts +69 -1
- package/gs/sync/sync.ts +72 -13
- package/gs/syscall/constants.ts +39 -24
- package/gs/syscall/errors.ts +165 -112
- package/gs/syscall/fs.ts +195 -0
- package/gs/syscall/js/index.ts +485 -0
- package/gs/syscall/js/meta.json +4 -0
- package/gs/syscall/net.test.ts +111 -0
- package/gs/syscall/types.ts +63 -2
- package/gs/testing/index.ts +1 -0
- package/gs/testing/meta.json +5 -0
- package/gs/testing/testing.test.ts +146 -0
- package/gs/testing/testing.ts +399 -0
- package/gs/time/meta.json +2 -2
- package/gs/time/time.test.ts +110 -0
- package/gs/time/time.ts +309 -57
- package/gs/unicode/unicode.test.ts +36 -0
- package/gs/unicode/unicode.ts +115 -9
- package/gs/unicode/utf8/utf8.test.ts +13 -0
- package/gs/unicode/utf8/utf8.ts +28 -16
- package/gs/unique/index.ts +98 -0
- package/package.json +3 -2
package/gs/builtin/channel.ts
CHANGED
|
@@ -56,7 +56,7 @@ export interface Channel<T> {
|
|
|
56
56
|
* @param id An identifier for this case in the select statement
|
|
57
57
|
* @returns Promise that resolves when this case is selected
|
|
58
58
|
*/
|
|
59
|
-
selectReceive(id: number): Promise<SelectResult<T>>
|
|
59
|
+
selectReceive(id: number, signal?: AbortSignal): Promise<SelectResult<T>>
|
|
60
60
|
|
|
61
61
|
/**
|
|
62
62
|
* Used in select statements to create a send operation promise.
|
|
@@ -64,7 +64,11 @@ export interface Channel<T> {
|
|
|
64
64
|
* @param id An identifier for this case in the select statement
|
|
65
65
|
* @returns Promise that resolves when this case is selected
|
|
66
66
|
*/
|
|
67
|
-
selectSend(
|
|
67
|
+
selectSend(
|
|
68
|
+
value: T,
|
|
69
|
+
id: number,
|
|
70
|
+
signal?: AbortSignal,
|
|
71
|
+
): Promise<SelectResult<boolean>>
|
|
68
72
|
|
|
69
73
|
/**
|
|
70
74
|
* Checks if the channel has data ready to be received without blocking.
|
|
@@ -77,6 +81,16 @@ export interface Channel<T> {
|
|
|
77
81
|
* Used for non-blocking select operations.
|
|
78
82
|
*/
|
|
79
83
|
canSendNonBlocking(): boolean
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Reports the number of buffered values currently queued in the channel.
|
|
87
|
+
*/
|
|
88
|
+
len(): number
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Reports the channel buffer capacity.
|
|
92
|
+
*/
|
|
93
|
+
cap(): number
|
|
80
94
|
}
|
|
81
95
|
|
|
82
96
|
/**
|
|
@@ -91,6 +105,27 @@ export interface SelectCase<T> {
|
|
|
91
105
|
onSelected?: (result: SelectResult<T>) => Promise<any>
|
|
92
106
|
}
|
|
93
107
|
|
|
108
|
+
const selectVoidReturnMarker = '__goscriptSelectVoidReturn'
|
|
109
|
+
|
|
110
|
+
export interface SelectVoidReturn {
|
|
111
|
+
readonly [selectVoidReturnMarker]: true
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
export function selectVoidReturn(): SelectVoidReturn {
|
|
115
|
+
return { [selectVoidReturnMarker]: true }
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function selectHandlerResult<V>(handlerResult: any): [boolean, V] {
|
|
119
|
+
if (
|
|
120
|
+
handlerResult &&
|
|
121
|
+
typeof handlerResult === 'object' &&
|
|
122
|
+
handlerResult[selectVoidReturnMarker] === true
|
|
123
|
+
) {
|
|
124
|
+
return [true, undefined as V]
|
|
125
|
+
}
|
|
126
|
+
return [handlerResult !== undefined, handlerResult as V]
|
|
127
|
+
}
|
|
128
|
+
|
|
94
129
|
/**
|
|
95
130
|
* Helper for 'select' statements. Takes an array of select cases
|
|
96
131
|
* and resolves when one of them completes, following Go's select rules.
|
|
@@ -146,13 +181,13 @@ export async function selectStatement<T, V = void>(
|
|
|
146
181
|
const handlerResult = await selectedCase.onSelected(
|
|
147
182
|
result as SelectResult<T>,
|
|
148
183
|
)
|
|
149
|
-
return
|
|
184
|
+
return selectHandlerResult<V>(handlerResult)
|
|
150
185
|
}
|
|
151
186
|
} else {
|
|
152
187
|
const result = await selectedCase.channel.selectReceive(selectedCase.id)
|
|
153
188
|
if (selectedCase.onSelected) {
|
|
154
189
|
const handlerResult = await selectedCase.onSelected(result)
|
|
155
|
-
return
|
|
190
|
+
return selectHandlerResult<V>(handlerResult)
|
|
156
191
|
}
|
|
157
192
|
}
|
|
158
193
|
} else {
|
|
@@ -173,22 +208,27 @@ export async function selectStatement<T, V = void>(
|
|
|
173
208
|
ok: false,
|
|
174
209
|
id: -1,
|
|
175
210
|
} as SelectResult<T>)
|
|
176
|
-
return
|
|
211
|
+
return selectHandlerResult<V>(handlerResult)
|
|
177
212
|
}
|
|
178
213
|
return [false, undefined as V] // Return after executing the default case
|
|
179
214
|
}
|
|
180
215
|
|
|
181
216
|
// 3. If no operations are ready and no default case, block until one is ready
|
|
182
217
|
// Use Promise.race on the blocking promises
|
|
218
|
+
const abort = new AbortController()
|
|
183
219
|
const blockingPromises = cases
|
|
184
220
|
.filter((c) => c.id !== -1) // Exclude default case
|
|
185
221
|
.filter((c) => c.channel !== null) // Exclude nil channels (they would block forever)
|
|
186
222
|
.map((caseObj) => {
|
|
187
223
|
// At this point caseObj.channel is guaranteed to be non-null
|
|
188
224
|
if (caseObj.isSend) {
|
|
189
|
-
return caseObj.channel!.selectSend(
|
|
225
|
+
return caseObj.channel!.selectSend(
|
|
226
|
+
caseObj.value,
|
|
227
|
+
caseObj.id,
|
|
228
|
+
abort.signal,
|
|
229
|
+
)
|
|
190
230
|
} else {
|
|
191
|
-
return caseObj.channel!.selectReceive(caseObj.id)
|
|
231
|
+
return caseObj.channel!.selectReceive(caseObj.id, abort.signal)
|
|
192
232
|
}
|
|
193
233
|
})
|
|
194
234
|
|
|
@@ -199,11 +239,12 @@ export async function selectStatement<T, V = void>(
|
|
|
199
239
|
}
|
|
200
240
|
|
|
201
241
|
const result = await Promise.race(blockingPromises)
|
|
242
|
+
abort.abort()
|
|
202
243
|
// Execute onSelected handler for the selected case
|
|
203
244
|
const selectedCase = cases.find((c) => c.id === result.id)
|
|
204
245
|
if (selectedCase && selectedCase.onSelected) {
|
|
205
246
|
const handlerResult = await selectedCase.onSelected(result)
|
|
206
|
-
return
|
|
247
|
+
return selectHandlerResult<V>(handlerResult)
|
|
207
248
|
}
|
|
208
249
|
|
|
209
250
|
// No explicit return needed here, as the function will implicitly return after the await
|
|
@@ -425,7 +466,10 @@ class BufferedChannel<T> implements Channel<T> {
|
|
|
425
466
|
})
|
|
426
467
|
}
|
|
427
468
|
|
|
428
|
-
async selectReceive(
|
|
469
|
+
async selectReceive(
|
|
470
|
+
id: number,
|
|
471
|
+
signal?: AbortSignal,
|
|
472
|
+
): Promise<SelectResult<T>> {
|
|
429
473
|
if (this.buffer.length > 0) {
|
|
430
474
|
const value = this.buffer.shift()!
|
|
431
475
|
if (this.senders.length > 0) {
|
|
@@ -447,15 +491,43 @@ class BufferedChannel<T> implements Channel<T> {
|
|
|
447
491
|
}
|
|
448
492
|
|
|
449
493
|
return new Promise<SelectResult<T>>((resolve) => {
|
|
450
|
-
|
|
494
|
+
const state = { done: false }
|
|
495
|
+
const receiversWithOk = this.receiversWithOk
|
|
496
|
+
const task = {
|
|
451
497
|
resolveReceive: (result: ChannelReceiveResult<T>) => {
|
|
452
|
-
|
|
498
|
+
if (!state.done) {
|
|
499
|
+
state.done = true
|
|
500
|
+
cleanup()
|
|
501
|
+
resolve({ ...result, id })
|
|
502
|
+
}
|
|
453
503
|
},
|
|
454
|
-
}
|
|
504
|
+
}
|
|
505
|
+
function cleanup() {
|
|
506
|
+
signal?.removeEventListener('abort', onAbort)
|
|
507
|
+
const idx = receiversWithOk.indexOf(task)
|
|
508
|
+
if (idx >= 0) {
|
|
509
|
+
receiversWithOk.splice(idx, 1)
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
function onAbort() {
|
|
513
|
+
if (!state.done) {
|
|
514
|
+
state.done = true
|
|
515
|
+
cleanup()
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
if (signal?.aborted) {
|
|
519
|
+
return
|
|
520
|
+
}
|
|
521
|
+
signal?.addEventListener('abort', onAbort, { once: true })
|
|
522
|
+
this.receiversWithOk.push(task)
|
|
455
523
|
})
|
|
456
524
|
}
|
|
457
525
|
|
|
458
|
-
async selectSend(
|
|
526
|
+
async selectSend(
|
|
527
|
+
value: T,
|
|
528
|
+
id: number,
|
|
529
|
+
signal?: AbortSignal,
|
|
530
|
+
): Promise<SelectResult<boolean>> {
|
|
459
531
|
if (this.closed) {
|
|
460
532
|
// A select case sending on a closed channel panics in Go.
|
|
461
533
|
// This will cause Promise.race in selectStatement to reject.
|
|
@@ -479,11 +551,43 @@ class BufferedChannel<T> implements Channel<T> {
|
|
|
479
551
|
}
|
|
480
552
|
|
|
481
553
|
return new Promise<SelectResult<boolean>>((resolve, reject) => {
|
|
482
|
-
|
|
554
|
+
const state = { done: false }
|
|
555
|
+
const senders = this.senders
|
|
556
|
+
const task = {
|
|
483
557
|
value,
|
|
484
|
-
resolveSend: () =>
|
|
485
|
-
|
|
486
|
-
|
|
558
|
+
resolveSend: () => {
|
|
559
|
+
if (!state.done) {
|
|
560
|
+
state.done = true
|
|
561
|
+
cleanup()
|
|
562
|
+
resolve({ value: true, ok: true, id })
|
|
563
|
+
}
|
|
564
|
+
},
|
|
565
|
+
rejectSend: (e: Error) => {
|
|
566
|
+
if (!state.done) {
|
|
567
|
+
state.done = true
|
|
568
|
+
cleanup()
|
|
569
|
+
reject(e)
|
|
570
|
+
}
|
|
571
|
+
},
|
|
572
|
+
}
|
|
573
|
+
function cleanup() {
|
|
574
|
+
signal?.removeEventListener('abort', onAbort)
|
|
575
|
+
const idx = senders.indexOf(task)
|
|
576
|
+
if (idx >= 0) {
|
|
577
|
+
senders.splice(idx, 1)
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
function onAbort() {
|
|
581
|
+
if (!state.done) {
|
|
582
|
+
state.done = true
|
|
583
|
+
cleanup()
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
if (signal?.aborted) {
|
|
587
|
+
return
|
|
588
|
+
}
|
|
589
|
+
signal?.addEventListener('abort', onAbort, { once: true })
|
|
590
|
+
this.senders.push(task)
|
|
487
591
|
})
|
|
488
592
|
}
|
|
489
593
|
|
|
@@ -530,6 +634,14 @@ class BufferedChannel<T> implements Channel<T> {
|
|
|
530
634
|
this.receiversWithOk.length > 0
|
|
531
635
|
)
|
|
532
636
|
}
|
|
637
|
+
|
|
638
|
+
len(): number {
|
|
639
|
+
return this.buffer.length
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
cap(): number {
|
|
643
|
+
return this.capacity
|
|
644
|
+
}
|
|
533
645
|
}
|
|
534
646
|
|
|
535
647
|
/**
|
|
@@ -553,8 +665,14 @@ export interface ChannelRef<T> {
|
|
|
553
665
|
close(): void
|
|
554
666
|
canSendNonBlocking(): boolean
|
|
555
667
|
canReceiveNonBlocking(): boolean
|
|
556
|
-
selectSend(
|
|
557
|
-
|
|
668
|
+
selectSend(
|
|
669
|
+
value: T,
|
|
670
|
+
id: number,
|
|
671
|
+
signal?: AbortSignal,
|
|
672
|
+
): Promise<SelectResult<boolean>>
|
|
673
|
+
selectReceive(id: number, signal?: AbortSignal): Promise<SelectResult<T>>
|
|
674
|
+
len(): number
|
|
675
|
+
cap(): number
|
|
558
676
|
}
|
|
559
677
|
|
|
560
678
|
/**
|
|
@@ -590,12 +708,24 @@ export class BidirectionalChannelRef<T> implements ChannelRef<T> {
|
|
|
590
708
|
return this.channel.canReceiveNonBlocking()
|
|
591
709
|
}
|
|
592
710
|
|
|
593
|
-
selectSend(
|
|
594
|
-
|
|
711
|
+
selectSend(
|
|
712
|
+
value: T,
|
|
713
|
+
id: number,
|
|
714
|
+
signal?: AbortSignal,
|
|
715
|
+
): Promise<SelectResult<boolean>> {
|
|
716
|
+
return this.channel.selectSend(value, id, signal)
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
selectReceive(id: number, signal?: AbortSignal): Promise<SelectResult<T>> {
|
|
720
|
+
return this.channel.selectReceive(id, signal)
|
|
721
|
+
}
|
|
722
|
+
|
|
723
|
+
len(): number {
|
|
724
|
+
return this.channel.len()
|
|
595
725
|
}
|
|
596
726
|
|
|
597
|
-
|
|
598
|
-
return this.channel.
|
|
727
|
+
cap(): number {
|
|
728
|
+
return this.channel.cap()
|
|
599
729
|
}
|
|
600
730
|
}
|
|
601
731
|
|
|
@@ -621,8 +751,12 @@ export class SendOnlyChannelRef<T> implements ChannelRef<T> {
|
|
|
621
751
|
return this.channel.canSendNonBlocking()
|
|
622
752
|
}
|
|
623
753
|
|
|
624
|
-
selectSend(
|
|
625
|
-
|
|
754
|
+
selectSend(
|
|
755
|
+
value: T,
|
|
756
|
+
id: number,
|
|
757
|
+
signal?: AbortSignal,
|
|
758
|
+
): Promise<SelectResult<boolean>> {
|
|
759
|
+
return this.channel.selectSend(value, id, signal)
|
|
626
760
|
}
|
|
627
761
|
|
|
628
762
|
// Disallow receive operations
|
|
@@ -638,9 +772,17 @@ export class SendOnlyChannelRef<T> implements ChannelRef<T> {
|
|
|
638
772
|
return false
|
|
639
773
|
}
|
|
640
774
|
|
|
641
|
-
selectReceive(_id: number): Promise<SelectResult<T>> {
|
|
775
|
+
selectReceive(_id: number, _signal?: AbortSignal): Promise<SelectResult<T>> {
|
|
642
776
|
throw new Error('Cannot receive from send-only channel')
|
|
643
777
|
}
|
|
778
|
+
|
|
779
|
+
len(): number {
|
|
780
|
+
return this.channel.len()
|
|
781
|
+
}
|
|
782
|
+
|
|
783
|
+
cap(): number {
|
|
784
|
+
return this.channel.cap()
|
|
785
|
+
}
|
|
644
786
|
}
|
|
645
787
|
|
|
646
788
|
/**
|
|
@@ -664,8 +806,8 @@ export class ReceiveOnlyChannelRef<T> implements ChannelRef<T> {
|
|
|
664
806
|
return this.channel.canReceiveNonBlocking()
|
|
665
807
|
}
|
|
666
808
|
|
|
667
|
-
selectReceive(id: number): Promise<SelectResult<T>> {
|
|
668
|
-
return this.channel.selectReceive(id)
|
|
809
|
+
selectReceive(id: number, signal?: AbortSignal): Promise<SelectResult<T>> {
|
|
810
|
+
return this.channel.selectReceive(id, signal)
|
|
669
811
|
}
|
|
670
812
|
|
|
671
813
|
// Disallow send operations
|
|
@@ -682,9 +824,21 @@ export class ReceiveOnlyChannelRef<T> implements ChannelRef<T> {
|
|
|
682
824
|
return false
|
|
683
825
|
}
|
|
684
826
|
|
|
685
|
-
selectSend(
|
|
827
|
+
selectSend(
|
|
828
|
+
_value: T,
|
|
829
|
+
_id: number,
|
|
830
|
+
_signal?: AbortSignal,
|
|
831
|
+
): Promise<SelectResult<boolean>> {
|
|
686
832
|
throw new Error('Cannot send to receive-only channel')
|
|
687
833
|
}
|
|
834
|
+
|
|
835
|
+
len(): number {
|
|
836
|
+
return this.channel.len()
|
|
837
|
+
}
|
|
838
|
+
|
|
839
|
+
cap(): number {
|
|
840
|
+
return this.channel.cap()
|
|
841
|
+
}
|
|
688
842
|
}
|
|
689
843
|
|
|
690
844
|
/**
|
package/gs/builtin/defer.ts
CHANGED
|
@@ -51,8 +51,19 @@ export class AsyncDisposableStack implements AsyncDisposable {
|
|
|
51
51
|
*/
|
|
52
52
|
async [Symbol.asyncDispose](): Promise<void> {
|
|
53
53
|
// Execute in LIFO order, awaiting each potentially async function
|
|
54
|
-
|
|
55
|
-
|
|
54
|
+
while (this.stack.length) {
|
|
55
|
+
const fn = this.stack.pop()!
|
|
56
|
+
await fn()
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
[Symbol.dispose](): void {
|
|
61
|
+
while (this.stack.length) {
|
|
62
|
+
const fn = this.stack.pop()!
|
|
63
|
+
const result = fn()
|
|
64
|
+
if (result && typeof (result as Promise<void>).then === "function") {
|
|
65
|
+
throw new Error("async deferred function disposed synchronously")
|
|
66
|
+
}
|
|
56
67
|
}
|
|
57
68
|
}
|
|
58
69
|
}
|
package/gs/builtin/hostio.ts
CHANGED
|
@@ -54,6 +54,16 @@ export type NodeFSModule = {
|
|
|
54
54
|
): void
|
|
55
55
|
}
|
|
56
56
|
|
|
57
|
+
export type NodeCryptoHash = {
|
|
58
|
+
copy?(): NodeCryptoHash
|
|
59
|
+
update(data: Uint8Array): NodeCryptoHash
|
|
60
|
+
digest(): Uint8Array
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export type NodeCryptoModule = {
|
|
64
|
+
createHash(algorithm: string): NodeCryptoHash
|
|
65
|
+
}
|
|
66
|
+
|
|
57
67
|
export type DenoStream = {
|
|
58
68
|
readSync?(buffer: Uint8Array): number | null
|
|
59
69
|
writeSync?(buffer: Uint8Array): number
|
|
@@ -74,6 +84,7 @@ type HostTextWrite = (data: string) => void
|
|
|
74
84
|
|
|
75
85
|
export type HostRuntime = {
|
|
76
86
|
deno: any | null
|
|
87
|
+
nodeCrypto: NodeCryptoModule | null
|
|
77
88
|
nodeFS: NodeFSModule | null
|
|
78
89
|
platform: string
|
|
79
90
|
processObj: any | null
|
|
@@ -166,6 +177,31 @@ function detectNodeFS(processObj: any | null): NodeFSModule | null {
|
|
|
166
177
|
return null
|
|
167
178
|
}
|
|
168
179
|
|
|
180
|
+
function detectNodeCrypto(processObj: any | null): NodeCryptoModule | null {
|
|
181
|
+
if (processObj && typeof processObj.getBuiltinModule === 'function') {
|
|
182
|
+
const module = processObj.getBuiltinModule('crypto')
|
|
183
|
+
if (module && typeof module.createHash === 'function') {
|
|
184
|
+
return module as NodeCryptoModule
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
const requireFn = getDynamicRequire()
|
|
189
|
+
if (requireFn) {
|
|
190
|
+
for (const specifier of ['node:crypto', 'crypto']) {
|
|
191
|
+
try {
|
|
192
|
+
const module = requireFn(specifier) as NodeCryptoModule | null
|
|
193
|
+
if (module && typeof module.createHash === 'function') {
|
|
194
|
+
return module
|
|
195
|
+
}
|
|
196
|
+
} catch {
|
|
197
|
+
// Try the next fallback.
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
return null
|
|
203
|
+
}
|
|
204
|
+
|
|
169
205
|
function hasURLScheme(path: string): boolean {
|
|
170
206
|
return /^[a-zA-Z][a-zA-Z\d+\-.]*:/.test(path)
|
|
171
207
|
}
|
|
@@ -247,6 +283,7 @@ function detectHostRuntime(): HostRuntime {
|
|
|
247
283
|
const deno = globalObj.Deno ?? null
|
|
248
284
|
const processObj = globalObj.process ?? null
|
|
249
285
|
const nodeFS = detectNodeFS(processObj)
|
|
286
|
+
const nodeCrypto = detectNodeCrypto(processObj)
|
|
250
287
|
|
|
251
288
|
const getStdioHandle = (fd: number): DenoFileLike | null => {
|
|
252
289
|
if (!deno) {
|
|
@@ -344,6 +381,7 @@ function detectHostRuntime(): HostRuntime {
|
|
|
344
381
|
deno,
|
|
345
382
|
getEnv,
|
|
346
383
|
getStdioHandle,
|
|
384
|
+
nodeCrypto,
|
|
347
385
|
nodeFS,
|
|
348
386
|
platform,
|
|
349
387
|
processObj,
|
package/gs/builtin/map.ts
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import { comparableEqual } from './builtin.js'
|
|
2
|
+
import { GoBinaryString, stringEqual } from './slice.js'
|
|
3
|
+
|
|
1
4
|
/**
|
|
2
5
|
* Creates a new map (TypeScript Map).
|
|
3
6
|
* @returns A new TypeScript Map.
|
|
@@ -18,9 +21,9 @@ export function mapGet<K, V, D>(
|
|
|
18
21
|
key: K,
|
|
19
22
|
defaultValue: D,
|
|
20
23
|
): [V, true] | [D, false] {
|
|
21
|
-
const
|
|
22
|
-
if (
|
|
23
|
-
return [
|
|
24
|
+
const entry = findMapEntry(map, key)
|
|
25
|
+
if (entry.found) {
|
|
26
|
+
return [entry.value, true]
|
|
24
27
|
} else {
|
|
25
28
|
return [defaultValue, false]
|
|
26
29
|
}
|
|
@@ -36,7 +39,8 @@ export const mapSet = <K, V>(map: Map<K, V> | null, key: K, value: V): void => {
|
|
|
36
39
|
if (!map) {
|
|
37
40
|
throw new Error('assign to nil map')
|
|
38
41
|
}
|
|
39
|
-
map
|
|
42
|
+
const entry = findMapEntry(map, key)
|
|
43
|
+
map.set(entry.found ? entry.key : key, value)
|
|
40
44
|
}
|
|
41
45
|
|
|
42
46
|
/**
|
|
@@ -45,7 +49,10 @@ export const mapSet = <K, V>(map: Map<K, V> | null, key: K, value: V): void => {
|
|
|
45
49
|
* @param key The key to delete.
|
|
46
50
|
*/
|
|
47
51
|
export const deleteMapEntry = <K, V>(map: Map<K, V> | null, key: K): void => {
|
|
48
|
-
map
|
|
52
|
+
const entry = findMapEntry(map, key)
|
|
53
|
+
if (entry.found) {
|
|
54
|
+
map!.delete(entry.key)
|
|
55
|
+
}
|
|
49
56
|
}
|
|
50
57
|
|
|
51
58
|
/**
|
|
@@ -55,5 +62,38 @@ export const deleteMapEntry = <K, V>(map: Map<K, V> | null, key: K): void => {
|
|
|
55
62
|
* @returns True if the key exists, false otherwise.
|
|
56
63
|
*/
|
|
57
64
|
export const mapHas = <K, V>(map: Map<K, V> | null, key: K): boolean => {
|
|
58
|
-
return map
|
|
65
|
+
return findMapEntry(map, key).found
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function findMapEntry<K, V>(
|
|
69
|
+
map: Map<K, V> | null,
|
|
70
|
+
key: K,
|
|
71
|
+
): { found: false } | { found: true; key: K; value: V } {
|
|
72
|
+
if (!map) {
|
|
73
|
+
return { found: false }
|
|
74
|
+
}
|
|
75
|
+
if (map.has(key)) {
|
|
76
|
+
return { found: true, key, value: map.get(key)! }
|
|
77
|
+
}
|
|
78
|
+
if (isGoStringKey(key)) {
|
|
79
|
+
for (const [candidate, value] of map.entries()) {
|
|
80
|
+
if (isGoStringKey(candidate) && stringEqual(candidate as string, key as string)) {
|
|
81
|
+
return { found: true, key: candidate, value }
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return { found: false }
|
|
85
|
+
}
|
|
86
|
+
if (key === null || (typeof key !== 'object' && typeof key !== 'function')) {
|
|
87
|
+
return { found: false }
|
|
88
|
+
}
|
|
89
|
+
for (const [candidate, value] of map.entries()) {
|
|
90
|
+
if (candidate !== key && comparableEqual(candidate, key)) {
|
|
91
|
+
return { found: true, key: candidate, value }
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return { found: false }
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function isGoStringKey(value: unknown): value is string | GoBinaryString {
|
|
98
|
+
return typeof value === 'string' || value instanceof GoBinaryString
|
|
59
99
|
}
|
package/gs/builtin/print.ts
CHANGED
|
@@ -68,7 +68,10 @@ function formatValue(
|
|
|
68
68
|
try {
|
|
69
69
|
if (value instanceof Map) {
|
|
70
70
|
return formatArray(
|
|
71
|
-
Array.from(value.entries()).map(
|
|
71
|
+
Array.from(value.entries()).map(
|
|
72
|
+
([k, v]) =>
|
|
73
|
+
`${formatValue(k, depth + 1, true, seen)} => ${formatValue(v, depth + 1, true, seen)}`,
|
|
74
|
+
),
|
|
72
75
|
depth,
|
|
73
76
|
seen,
|
|
74
77
|
)
|
|
@@ -113,7 +116,11 @@ function formatUint8Array(value: Uint8Array): string {
|
|
|
113
116
|
return `Uint8Array(${value.length}) [ ${Array.from(value).join(', ')} ]`
|
|
114
117
|
}
|
|
115
118
|
|
|
116
|
-
function formatArray(
|
|
119
|
+
function formatArray(
|
|
120
|
+
value: readonly any[],
|
|
121
|
+
depth: number,
|
|
122
|
+
seen: WeakSet<object>,
|
|
123
|
+
): string {
|
|
117
124
|
if (value.length === 0) {
|
|
118
125
|
return '[]'
|
|
119
126
|
}
|
|
@@ -150,5 +157,7 @@ function getObjectEntries(value: Record<string, any>): [string, any][] {
|
|
|
150
157
|
})
|
|
151
158
|
}
|
|
152
159
|
|
|
153
|
-
return Object.entries(value).filter(
|
|
160
|
+
return Object.entries(value).filter(
|
|
161
|
+
([, entry]) => typeof entry !== 'function',
|
|
162
|
+
)
|
|
154
163
|
}
|