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/builtin.ts
CHANGED
|
@@ -21,12 +21,41 @@ export function println(...args: any[]): void {
|
|
|
21
21
|
writeHostStdoutText(message)
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
+
export class GoPanic extends Error {
|
|
25
|
+
constructor(public readonly value: unknown) {
|
|
26
|
+
super(`panic: ${formatPanicValue(value)}`)
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
24
30
|
/**
|
|
25
31
|
* Implementation of Go's built-in panic function
|
|
26
32
|
* @param args Arguments passed to panic
|
|
27
33
|
*/
|
|
28
|
-
export function panic(...args:
|
|
29
|
-
|
|
34
|
+
export function panic(...args: unknown[]): never {
|
|
35
|
+
const value = args.length === 1 ? args[0] : args
|
|
36
|
+
throw new GoPanic(value)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export function panicValue(value: unknown): unknown {
|
|
40
|
+
if (value instanceof GoPanic) {
|
|
41
|
+
return value.value
|
|
42
|
+
}
|
|
43
|
+
return value
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function formatPanicValue(value: unknown): string {
|
|
47
|
+
if (value instanceof Error) {
|
|
48
|
+
return value.message
|
|
49
|
+
}
|
|
50
|
+
if (
|
|
51
|
+
value !== null &&
|
|
52
|
+
typeof value === 'object' &&
|
|
53
|
+
'Error' in value &&
|
|
54
|
+
typeof (value as { Error?: unknown }).Error === 'function'
|
|
55
|
+
) {
|
|
56
|
+
return String((value as { Error(): string }).Error())
|
|
57
|
+
}
|
|
58
|
+
return String(value)
|
|
30
59
|
}
|
|
31
60
|
|
|
32
61
|
/**
|
|
@@ -35,7 +64,7 @@ export function panic(...args: any[]): never {
|
|
|
35
64
|
* For maps, it deletes all entries.
|
|
36
65
|
* @param v The slice or map to clear
|
|
37
66
|
*/
|
|
38
|
-
export function clear<T>(v: T
|
|
67
|
+
export function clear<T>(v: Slice<T> | Map<unknown, unknown> | null): void {
|
|
39
68
|
if (v === null || v === undefined) {
|
|
40
69
|
return
|
|
41
70
|
}
|
|
@@ -43,12 +72,40 @@ export function clear<T>(v: T[] | Map<unknown, unknown> | null): void {
|
|
|
43
72
|
v.clear()
|
|
44
73
|
return
|
|
45
74
|
}
|
|
75
|
+
if (v instanceof Uint8Array) {
|
|
76
|
+
v.fill(0)
|
|
77
|
+
return
|
|
78
|
+
}
|
|
79
|
+
if (isSliceProxy(v)) {
|
|
80
|
+
const zero = clearZeroValue(v)
|
|
81
|
+
for (let i = 0; i < v.length; i++) {
|
|
82
|
+
v[i] = zero
|
|
83
|
+
}
|
|
84
|
+
return
|
|
85
|
+
}
|
|
46
86
|
if (Array.isArray(v)) {
|
|
47
|
-
v.fill(
|
|
87
|
+
v.fill(clearZeroValue(v))
|
|
48
88
|
return
|
|
49
89
|
}
|
|
50
90
|
}
|
|
51
91
|
|
|
92
|
+
function clearZeroValue<T>(v: T[]): T {
|
|
93
|
+
for (const item of v) {
|
|
94
|
+
if (item !== null && item !== undefined) {
|
|
95
|
+
switch (typeof item) {
|
|
96
|
+
case 'number':
|
|
97
|
+
return 0 as T
|
|
98
|
+
case 'string':
|
|
99
|
+
return '' as T
|
|
100
|
+
case 'boolean':
|
|
101
|
+
return false as T
|
|
102
|
+
}
|
|
103
|
+
break
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return null as T
|
|
107
|
+
}
|
|
108
|
+
|
|
52
109
|
/**
|
|
53
110
|
* assignStruct copies all field values from source struct to target struct.
|
|
54
111
|
* Used for pointer dereference assignment: *p = value
|
|
@@ -93,16 +150,229 @@ export function pointerValue<T>(value: T | VarRef<T> | null | undefined): T {
|
|
|
93
150
|
if (isVarRef(value)) {
|
|
94
151
|
return value.value as T
|
|
95
152
|
}
|
|
153
|
+
const boxed =
|
|
154
|
+
typeof value === 'object' &&
|
|
155
|
+
value !== null &&
|
|
156
|
+
'__goValue' in value ?
|
|
157
|
+
(value as { __goType?: unknown; __goValue: T | VarRef<T> })
|
|
158
|
+
: null
|
|
159
|
+
if (
|
|
160
|
+
boxed !== null &&
|
|
161
|
+
typeof boxed.__goType === 'string' &&
|
|
162
|
+
boxed.__goType.startsWith('*') &&
|
|
163
|
+
!hasGoMethodSurface(value)
|
|
164
|
+
) {
|
|
165
|
+
return pointerValue(boxed.__goValue)
|
|
166
|
+
}
|
|
167
|
+
return value
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
export function pointerValueOrNil<T>(
|
|
171
|
+
value: T | VarRef<T> | null | undefined,
|
|
172
|
+
): T | null {
|
|
173
|
+
if (value === null || value === undefined) {
|
|
174
|
+
return null
|
|
175
|
+
}
|
|
176
|
+
if (isVarRef(value)) {
|
|
177
|
+
return value.value as T
|
|
178
|
+
}
|
|
179
|
+
const boxed =
|
|
180
|
+
typeof value === 'object' &&
|
|
181
|
+
value !== null &&
|
|
182
|
+
'__goValue' in value ?
|
|
183
|
+
(value as { __goType?: unknown; __goValue: T | VarRef<T> })
|
|
184
|
+
: null
|
|
185
|
+
if (
|
|
186
|
+
boxed !== null &&
|
|
187
|
+
typeof boxed.__goType === 'string' &&
|
|
188
|
+
boxed.__goType.startsWith('*') &&
|
|
189
|
+
!hasGoMethodSurface(value)
|
|
190
|
+
) {
|
|
191
|
+
return pointerValueOrNil(boxed.__goValue)
|
|
192
|
+
}
|
|
96
193
|
return value
|
|
97
194
|
}
|
|
98
195
|
|
|
196
|
+
export function arrayEqual(a: unknown, b: unknown): boolean {
|
|
197
|
+
return comparableEqual(a, b)
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
export function comparableEqual(a: unknown, b: unknown): boolean {
|
|
201
|
+
if (a === b) {
|
|
202
|
+
return true
|
|
203
|
+
}
|
|
204
|
+
if (a === null || a === undefined || b === null || b === undefined) {
|
|
205
|
+
return false
|
|
206
|
+
}
|
|
207
|
+
if (isArrayLike(a) && isArrayLike(b)) {
|
|
208
|
+
if (a.length !== b.length) {
|
|
209
|
+
return false
|
|
210
|
+
}
|
|
211
|
+
for (let i = 0; i < a.length; i++) {
|
|
212
|
+
if (!comparableEqual(a[i], b[i])) {
|
|
213
|
+
return false
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return true
|
|
217
|
+
}
|
|
218
|
+
if (isComplexValue(a) || isComplexValue(b)) {
|
|
219
|
+
return (
|
|
220
|
+
isComplexValue(a) &&
|
|
221
|
+
isComplexValue(b) &&
|
|
222
|
+
a.real === b.real &&
|
|
223
|
+
a.imag === b.imag
|
|
224
|
+
)
|
|
225
|
+
}
|
|
226
|
+
if (hasGoType(a) || hasGoType(b)) {
|
|
227
|
+
if (!hasGoType(a) || !hasGoType(b) || a.__goType !== b.__goType) {
|
|
228
|
+
return false
|
|
229
|
+
}
|
|
230
|
+
if (a.__isTypedNil || b.__isTypedNil) {
|
|
231
|
+
return a.__isTypedNil === true && b.__isTypedNil === true
|
|
232
|
+
}
|
|
233
|
+
if (hasGoValue(a) || hasGoValue(b)) {
|
|
234
|
+
return hasGoValue(a) && hasGoValue(b) && comparableEqual(a.__goValue, b.__goValue)
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
if (isStructValue(a) && isStructValue(b)) {
|
|
238
|
+
return fieldsEqual(a._fields, b._fields)
|
|
239
|
+
}
|
|
240
|
+
return false
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
function isArrayLike(value: unknown): value is ArrayLike<unknown> {
|
|
244
|
+
return Array.isArray(value) || value instanceof Uint8Array
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
function hasGoType(value: unknown): value is {
|
|
248
|
+
__goType: string
|
|
249
|
+
__isTypedNil?: boolean
|
|
250
|
+
} {
|
|
251
|
+
return (
|
|
252
|
+
typeof value === 'object' &&
|
|
253
|
+
value !== null &&
|
|
254
|
+
typeof (value as { __goType?: unknown }).__goType === 'string'
|
|
255
|
+
)
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
function hasGoValue(value: unknown): value is {
|
|
259
|
+
__goValue: unknown
|
|
260
|
+
} {
|
|
261
|
+
return typeof value === 'object' && value !== null && '__goValue' in value
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
function hasGoMethodSurface(value: unknown): boolean {
|
|
265
|
+
if (typeof value !== 'object' || value === null) {
|
|
266
|
+
return false
|
|
267
|
+
}
|
|
268
|
+
return Object.keys(value).some((key) => {
|
|
269
|
+
return (
|
|
270
|
+
key !== '__goType' &&
|
|
271
|
+
key !== '__goValue' &&
|
|
272
|
+
key !== 'valueOf' &&
|
|
273
|
+
key !== 'toString' &&
|
|
274
|
+
typeof (value as Record<string, unknown>)[key] === 'function'
|
|
275
|
+
)
|
|
276
|
+
})
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
function isStructValue(value: unknown): value is {
|
|
280
|
+
_fields: Record<string, VarRef<unknown>>
|
|
281
|
+
} {
|
|
282
|
+
const fields =
|
|
283
|
+
typeof value === 'object' && value !== null ?
|
|
284
|
+
(value as { _fields?: unknown })._fields
|
|
285
|
+
: undefined
|
|
286
|
+
return (
|
|
287
|
+
typeof fields === 'object' &&
|
|
288
|
+
fields !== null &&
|
|
289
|
+
!Array.isArray(fields) &&
|
|
290
|
+
Object.values(fields).every(isVarRef)
|
|
291
|
+
)
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
function fieldsEqual(
|
|
295
|
+
a: Record<string, VarRef<unknown>>,
|
|
296
|
+
b: Record<string, VarRef<unknown>>,
|
|
297
|
+
): boolean {
|
|
298
|
+
const aKeys = Object.keys(a)
|
|
299
|
+
const bKeys = Object.keys(b)
|
|
300
|
+
if (aKeys.length !== bKeys.length) {
|
|
301
|
+
return false
|
|
302
|
+
}
|
|
303
|
+
for (const key of aKeys) {
|
|
304
|
+
if (!(key in b) || !comparableEqual(a[key].value, b[key].value)) {
|
|
305
|
+
return false
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
return true
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
export interface Complex {
|
|
312
|
+
real: number
|
|
313
|
+
imag: number
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
function isComplexValue(value: unknown): value is Complex {
|
|
317
|
+
return (
|
|
318
|
+
typeof value === 'object' &&
|
|
319
|
+
value !== null &&
|
|
320
|
+
typeof (value as { real?: unknown }).real === 'number' &&
|
|
321
|
+
typeof (value as { imag?: unknown }).imag === 'number'
|
|
322
|
+
)
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
export function complex(real: number, imag: number): Complex {
|
|
326
|
+
return { real, imag }
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
export function real(value: number | Complex | null | undefined): number {
|
|
330
|
+
if (typeof value === 'number') {
|
|
331
|
+
return value
|
|
332
|
+
}
|
|
333
|
+
return value?.real ?? 0
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
export function imag(value: number | Complex | null | undefined): number {
|
|
337
|
+
if (typeof value === 'number') {
|
|
338
|
+
return 0
|
|
339
|
+
}
|
|
340
|
+
return value?.imag ?? 0
|
|
341
|
+
}
|
|
342
|
+
|
|
99
343
|
// Bytes represents all valid []byte representations in TypeScript
|
|
100
344
|
// This includes Uint8Array (the preferred representation) and $.Slice<number> (which includes null)
|
|
101
345
|
export type Bytes = Uint8Array | Slice<number>
|
|
346
|
+
type ByteData = Uint8Array | number[] | SliceProxy<number>
|
|
347
|
+
|
|
348
|
+
const maxSafeBigInt = BigInt(Number.MAX_SAFE_INTEGER)
|
|
349
|
+
const maxUint64BigInt = 0xffffffffffffffffn
|
|
102
350
|
|
|
103
351
|
// int converts a value to a Go int type, handling proper signed integer conversion
|
|
104
352
|
// This ensures that values like 2147483648 (2^31) are properly handled according to Go semantics
|
|
105
|
-
export function int(value: number): number {
|
|
353
|
+
export function int(value: number | bigint, bits = 0): number {
|
|
354
|
+
if (typeof value === 'bigint') {
|
|
355
|
+
if (bits > 0 && bits <= 64) {
|
|
356
|
+
return Number(BigInt.asIntN(bits, value))
|
|
357
|
+
}
|
|
358
|
+
return Number(value)
|
|
359
|
+
}
|
|
360
|
+
if (bits > 0 && bits < 64) {
|
|
361
|
+
const modulo = 2 ** bits
|
|
362
|
+
const sign = 2 ** (bits - 1)
|
|
363
|
+
let truncated = Math.trunc(value)
|
|
364
|
+
if (!Number.isFinite(truncated)) {
|
|
365
|
+
return truncated
|
|
366
|
+
}
|
|
367
|
+
truncated %= modulo
|
|
368
|
+
if (truncated < 0) {
|
|
369
|
+
truncated += modulo
|
|
370
|
+
}
|
|
371
|
+
if (truncated >= sign) {
|
|
372
|
+
truncated -= modulo
|
|
373
|
+
}
|
|
374
|
+
return truncated
|
|
375
|
+
}
|
|
106
376
|
// In Go, int is typically 64-bit on 64-bit systems, but for compatibility with JavaScript
|
|
107
377
|
// we need to handle the conversion properly. The issue is that JavaScript's number type
|
|
108
378
|
// can represent values larger than 32-bit signed integers, but when cast in certain contexts
|
|
@@ -115,6 +385,260 @@ export function int(value: number): number {
|
|
|
115
385
|
return Math.trunc(value)
|
|
116
386
|
}
|
|
117
387
|
|
|
388
|
+
// uint converts a value to an unsigned Go integer width.
|
|
389
|
+
export function uint(value: number | bigint, bits = 64): number {
|
|
390
|
+
if (typeof value === 'bigint') {
|
|
391
|
+
const normalized = BigInt.asUintN(Math.min(bits, 64), value)
|
|
392
|
+
if (bits >= 64) {
|
|
393
|
+
return uint64Result(normalized)
|
|
394
|
+
}
|
|
395
|
+
return Number(normalized)
|
|
396
|
+
}
|
|
397
|
+
if (!Number.isFinite(value)) {
|
|
398
|
+
return value
|
|
399
|
+
}
|
|
400
|
+
if (bits === 8) {
|
|
401
|
+
return value & 0xff
|
|
402
|
+
}
|
|
403
|
+
if (bits === 16) {
|
|
404
|
+
return value & 0xffff
|
|
405
|
+
}
|
|
406
|
+
if (bits === 32) {
|
|
407
|
+
return value >>> 0
|
|
408
|
+
}
|
|
409
|
+
if (bits >= 64) {
|
|
410
|
+
const truncated = Math.trunc(value)
|
|
411
|
+
if (truncated >= 0 && truncated <= Number.MAX_SAFE_INTEGER) {
|
|
412
|
+
return truncated
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
const modulo = bits >= 64 ? 2 ** 64 : 2 ** bits
|
|
416
|
+
let truncated = Math.trunc(value)
|
|
417
|
+
truncated %= modulo
|
|
418
|
+
if (truncated < 0) {
|
|
419
|
+
truncated += modulo
|
|
420
|
+
}
|
|
421
|
+
return truncated
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
export function uint64Shl(
|
|
425
|
+
value: number | bigint,
|
|
426
|
+
shift: number | bigint,
|
|
427
|
+
): number {
|
|
428
|
+
return uint64Result(uint64Value(value) << BigInt(Math.trunc(Number(shift))))
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
export function uint64Shr(
|
|
432
|
+
value: number | bigint,
|
|
433
|
+
shift: number | bigint,
|
|
434
|
+
): number {
|
|
435
|
+
return uint64Result(uint64Value(value) >> BigInt(Math.trunc(Number(shift))))
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
export function int64Shl(
|
|
439
|
+
value: number | bigint,
|
|
440
|
+
shift: number | bigint,
|
|
441
|
+
): number {
|
|
442
|
+
return int64Result(int64Value(value) << BigInt(Math.trunc(Number(shift))))
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
export function int64Shr(
|
|
446
|
+
value: number | bigint,
|
|
447
|
+
shift: number | bigint,
|
|
448
|
+
): number {
|
|
449
|
+
return int64Result(int64Value(value) >> BigInt(Math.trunc(Number(shift))))
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
export function uintShr(
|
|
453
|
+
value: number | bigint,
|
|
454
|
+
shift: number | bigint,
|
|
455
|
+
bits = 32,
|
|
456
|
+
): number {
|
|
457
|
+
const width = Math.min(bits, 32)
|
|
458
|
+
const amount = Math.trunc(Number(shift))
|
|
459
|
+
if (amount < 0) {
|
|
460
|
+
throw new Error('runtime error: negative shift amount')
|
|
461
|
+
}
|
|
462
|
+
if (amount >= width) {
|
|
463
|
+
return 0
|
|
464
|
+
}
|
|
465
|
+
return uint(value, width) >>> amount
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
export function uint64Mul(
|
|
469
|
+
left: number | bigint,
|
|
470
|
+
right: number | bigint,
|
|
471
|
+
): number {
|
|
472
|
+
return uint64Result(uint64Value(left) * uint64Value(right))
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
export function int64Mul(
|
|
476
|
+
left: number | bigint,
|
|
477
|
+
right: number | bigint,
|
|
478
|
+
): number {
|
|
479
|
+
return int64Result(int64Value(left) * int64Value(right))
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
export function uint64Div(
|
|
483
|
+
left: number | bigint,
|
|
484
|
+
right: number | bigint,
|
|
485
|
+
): number {
|
|
486
|
+
const divisor = uint64Value(right)
|
|
487
|
+
if (divisor === 0n) {
|
|
488
|
+
throw new Error('runtime error: integer divide by zero')
|
|
489
|
+
}
|
|
490
|
+
return uint64Result(uint64Value(left) / divisor)
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
export function int64Div(
|
|
494
|
+
left: number | bigint,
|
|
495
|
+
right: number | bigint,
|
|
496
|
+
): number {
|
|
497
|
+
const divisor = int64Value(right)
|
|
498
|
+
if (divisor === 0n) {
|
|
499
|
+
throw new Error('runtime error: integer divide by zero')
|
|
500
|
+
}
|
|
501
|
+
return int64Result(int64Value(left) / divisor)
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
export function uint64Mod(
|
|
505
|
+
left: number | bigint,
|
|
506
|
+
right: number | bigint,
|
|
507
|
+
): number {
|
|
508
|
+
const divisor = uint64Value(right)
|
|
509
|
+
if (divisor === 0n) {
|
|
510
|
+
throw new Error('runtime error: integer divide by zero')
|
|
511
|
+
}
|
|
512
|
+
return uint64Result(uint64Value(left) % divisor)
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
export function int64Mod(
|
|
516
|
+
left: number | bigint,
|
|
517
|
+
right: number | bigint,
|
|
518
|
+
): number {
|
|
519
|
+
const divisor = int64Value(right)
|
|
520
|
+
if (divisor === 0n) {
|
|
521
|
+
throw new Error('runtime error: integer divide by zero')
|
|
522
|
+
}
|
|
523
|
+
return int64Result(int64Value(left) % divisor)
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
export function uint64Add(
|
|
527
|
+
left: number | bigint,
|
|
528
|
+
right: number | bigint,
|
|
529
|
+
): number {
|
|
530
|
+
return uint64Result(uint64Value(left) + uint64Value(right))
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
export function int64Add(
|
|
534
|
+
left: number | bigint,
|
|
535
|
+
right: number | bigint,
|
|
536
|
+
): number {
|
|
537
|
+
return int64Result(int64Value(left) + int64Value(right))
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
export function uint64Sub(
|
|
541
|
+
left: number | bigint,
|
|
542
|
+
right: number | bigint,
|
|
543
|
+
): number {
|
|
544
|
+
return uint64Result(uint64Value(left) - uint64Value(right))
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
export function int64Sub(
|
|
548
|
+
left: number | bigint,
|
|
549
|
+
right: number | bigint,
|
|
550
|
+
): number {
|
|
551
|
+
return int64Result(int64Value(left) - int64Value(right))
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
export function uint64And(
|
|
555
|
+
left: number | bigint,
|
|
556
|
+
right: number | bigint,
|
|
557
|
+
): number {
|
|
558
|
+
return uint64Result(uint64Value(left) & uint64Value(right))
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
export function int64And(
|
|
562
|
+
left: number | bigint,
|
|
563
|
+
right: number | bigint,
|
|
564
|
+
): number {
|
|
565
|
+
return int64Result(int64Value(left) & int64Value(right))
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
export function uint64Or(
|
|
569
|
+
left: number | bigint,
|
|
570
|
+
right: number | bigint,
|
|
571
|
+
): number {
|
|
572
|
+
return uint64Result(uint64Value(left) | uint64Value(right))
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
export function int64Or(
|
|
576
|
+
left: number | bigint,
|
|
577
|
+
right: number | bigint,
|
|
578
|
+
): number {
|
|
579
|
+
return int64Result(int64Value(left) | int64Value(right))
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
export function uint64Xor(
|
|
583
|
+
left: number | bigint,
|
|
584
|
+
right: number | bigint,
|
|
585
|
+
): number {
|
|
586
|
+
return uint64Result(uint64Value(left) ^ uint64Value(right))
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
export function int64Xor(
|
|
590
|
+
left: number | bigint,
|
|
591
|
+
right: number | bigint,
|
|
592
|
+
): number {
|
|
593
|
+
return int64Result(int64Value(left) ^ int64Value(right))
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
function int64Value(value: number | bigint): bigint {
|
|
597
|
+
if (typeof value === 'bigint') {
|
|
598
|
+
return BigInt.asIntN(64, value)
|
|
599
|
+
}
|
|
600
|
+
if (Number.isFinite(value)) {
|
|
601
|
+
const truncated = Math.trunc(value)
|
|
602
|
+
if (
|
|
603
|
+
truncated >= Number.MIN_SAFE_INTEGER &&
|
|
604
|
+
truncated <= Number.MAX_SAFE_INTEGER
|
|
605
|
+
) {
|
|
606
|
+
return BigInt(truncated)
|
|
607
|
+
}
|
|
608
|
+
}
|
|
609
|
+
return BigInt.asIntN(64, BigInt(Math.trunc(value)))
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
function int64Result(value: bigint): number {
|
|
613
|
+
const normalized =
|
|
614
|
+
value >= -0x8000000000000000n && value <= 0x7fffffffffffffffn
|
|
615
|
+
? value
|
|
616
|
+
: BigInt.asIntN(64, value)
|
|
617
|
+
return Number(normalized)
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
function uint64Value(value: number | bigint): bigint {
|
|
621
|
+
if (typeof value === 'bigint') {
|
|
622
|
+
return BigInt.asUintN(64, value)
|
|
623
|
+
}
|
|
624
|
+
if (Number.isFinite(value)) {
|
|
625
|
+
const truncated = Math.trunc(value)
|
|
626
|
+
if (truncated >= 0 && truncated <= Number.MAX_SAFE_INTEGER) {
|
|
627
|
+
return BigInt(truncated)
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
return BigInt.asUintN(64, BigInt(Math.trunc(value)))
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
function uint64Result(value: bigint): number {
|
|
634
|
+
const normalized =
|
|
635
|
+
value >= 0n && value <= maxUint64BigInt ? value : BigInt.asUintN(64, value)
|
|
636
|
+
if (normalized <= maxSafeBigInt) {
|
|
637
|
+
return Number(normalized)
|
|
638
|
+
}
|
|
639
|
+
return normalized as unknown as number
|
|
640
|
+
}
|
|
641
|
+
|
|
118
642
|
/**
|
|
119
643
|
* Normalizes various byte representations into a `Uint8Array` for protobuf compatibility.
|
|
120
644
|
*
|
|
@@ -196,18 +720,15 @@ export function sortSlice<T extends string | number>(s: Slice<T>): void {
|
|
|
196
720
|
* Optimized for different byte representations.
|
|
197
721
|
*/
|
|
198
722
|
export function bytesEqual(a: Bytes | null, b: Bytes | null): boolean {
|
|
199
|
-
// Handle null cases
|
|
200
723
|
if (a === null && b === null) return true
|
|
201
724
|
if (a === null || b === null) return false
|
|
202
725
|
|
|
203
|
-
|
|
204
|
-
const
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
if (aArr.length !== bArr.length) return false
|
|
726
|
+
const aLen = bytesLen(a)
|
|
727
|
+
const bLen = bytesLen(b)
|
|
728
|
+
if (aLen !== bLen) return false
|
|
208
729
|
|
|
209
|
-
for (let i = 0; i <
|
|
210
|
-
if (
|
|
730
|
+
for (let i = 0; i < aLen; i++) {
|
|
731
|
+
if (byteAt(a, i) !== byteAt(b, i)) return false
|
|
211
732
|
}
|
|
212
733
|
|
|
213
734
|
return true
|
|
@@ -218,47 +739,65 @@ export function bytesEqual(a: Bytes | null, b: Bytes | null): boolean {
|
|
|
218
739
|
* Returns -1 if a < b, 0 if a == b, +1 if a > b.
|
|
219
740
|
*/
|
|
220
741
|
export function bytesCompare(a: Bytes | null, b: Bytes | null): number {
|
|
221
|
-
// Handle null cases
|
|
222
742
|
if (a === null && b === null) return 0
|
|
223
743
|
if (a === null) return -1
|
|
224
744
|
if (b === null) return 1
|
|
225
745
|
|
|
226
|
-
const
|
|
227
|
-
const
|
|
228
|
-
|
|
229
|
-
const minLen = Math.min(aArr.length, bArr.length)
|
|
746
|
+
const aLen = bytesLen(a)
|
|
747
|
+
const bLen = bytesLen(b)
|
|
748
|
+
const minLen = Math.min(aLen, bLen)
|
|
230
749
|
|
|
231
750
|
for (let i = 0; i < minLen; i++) {
|
|
232
|
-
|
|
233
|
-
|
|
751
|
+
const av = byteAt(a, i)
|
|
752
|
+
const bv = byteAt(b, i)
|
|
753
|
+
if (av < bv) return -1
|
|
754
|
+
if (av > bv) return 1
|
|
234
755
|
}
|
|
235
756
|
|
|
236
|
-
if (
|
|
237
|
-
if (
|
|
757
|
+
if (aLen < bLen) return -1
|
|
758
|
+
if (aLen > bLen) return 1
|
|
238
759
|
return 0
|
|
239
760
|
}
|
|
240
761
|
|
|
762
|
+
function bytesLen(bytes: ByteData): number {
|
|
763
|
+
if (bytes instanceof Uint8Array) {
|
|
764
|
+
return bytes.length
|
|
765
|
+
}
|
|
766
|
+
if (isSliceProxy(bytes)) {
|
|
767
|
+
return (bytes as SliceProxy<number>).__meta__.length
|
|
768
|
+
}
|
|
769
|
+
return bytes.length
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
function byteAt(bytes: ByteData, index: number): number {
|
|
773
|
+
if (bytes instanceof Uint8Array || Array.isArray(bytes)) {
|
|
774
|
+
return bytes[index] ?? 0
|
|
775
|
+
}
|
|
776
|
+
const meta = (bytes as SliceProxy<number>).__meta__
|
|
777
|
+
return meta.backing[meta.offset + index] ?? 0
|
|
778
|
+
}
|
|
779
|
+
|
|
241
780
|
/**
|
|
242
781
|
* bytesToArray converts any Bytes representation to a number array.
|
|
243
782
|
*/
|
|
244
783
|
export function bytesToArray(bytes: Bytes | null): number[] {
|
|
784
|
+
bytes = bytesValue(bytes) as Bytes | null
|
|
245
785
|
if (bytes === null) return []
|
|
246
786
|
|
|
247
787
|
if (bytes instanceof Uint8Array) {
|
|
248
788
|
return Array.from(bytes)
|
|
249
789
|
}
|
|
250
790
|
|
|
251
|
-
if (Array.isArray(bytes)) {
|
|
252
|
-
return bytes
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
// Handle SliceProxy
|
|
256
791
|
if (isSliceProxy(bytes)) {
|
|
257
792
|
const proxy = bytes as SliceProxy<number>
|
|
258
793
|
const meta = proxy.__meta__
|
|
259
794
|
return meta.backing.slice(meta.offset, meta.offset + meta.length)
|
|
260
795
|
}
|
|
261
796
|
|
|
797
|
+
if (Array.isArray(bytes)) {
|
|
798
|
+
return bytes
|
|
799
|
+
}
|
|
800
|
+
|
|
262
801
|
throw new Error(`Cannot convert bytes of type ${typeof bytes} to array`)
|
|
263
802
|
}
|
|
264
803
|
|
|
@@ -266,15 +805,34 @@ export function bytesToArray(bytes: Bytes | null): number[] {
|
|
|
266
805
|
* bytesToUint8Array converts any Bytes representation to a Uint8Array.
|
|
267
806
|
*/
|
|
268
807
|
export function bytesToUint8Array(bytes: Bytes | null): Uint8Array {
|
|
808
|
+
bytes = bytesValue(bytes) as Bytes | null
|
|
269
809
|
if (bytes === null) return new Uint8Array(0)
|
|
270
810
|
|
|
271
811
|
if (bytes instanceof Uint8Array) {
|
|
812
|
+
if ((bytes as Uint8Array & { __meta__?: unknown }).__meta__ !== undefined) {
|
|
813
|
+
return bytes.subarray(0)
|
|
814
|
+
}
|
|
272
815
|
return bytes
|
|
273
816
|
}
|
|
274
817
|
|
|
275
818
|
return new Uint8Array(bytesToArray(bytes))
|
|
276
819
|
}
|
|
277
820
|
|
|
821
|
+
function bytesValue(value: unknown): unknown {
|
|
822
|
+
if (isVarRef(value)) {
|
|
823
|
+
return bytesValue(value.value)
|
|
824
|
+
}
|
|
825
|
+
if (
|
|
826
|
+
typeof value === 'object' &&
|
|
827
|
+
value !== null &&
|
|
828
|
+
typeof (value as { __goType?: unknown }).__goType === 'string' &&
|
|
829
|
+
'__goValue' in value
|
|
830
|
+
) {
|
|
831
|
+
return bytesValue((value as { __goValue: unknown }).__goValue)
|
|
832
|
+
}
|
|
833
|
+
return value
|
|
834
|
+
}
|
|
835
|
+
|
|
278
836
|
/**
|
|
279
837
|
* bytesIndexOf finds the first occurrence of subslice in bytes.
|
|
280
838
|
* Returns -1 if not found.
|