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/type.ts
CHANGED
|
@@ -18,6 +18,7 @@ export enum TypeKind {
|
|
|
18
18
|
*/
|
|
19
19
|
export interface BaseTypeInfo {
|
|
20
20
|
name?: string
|
|
21
|
+
typeName?: string
|
|
21
22
|
kind: TypeKind
|
|
22
23
|
zeroValue?: any
|
|
23
24
|
}
|
|
@@ -44,6 +45,7 @@ export interface MethodSignature {
|
|
|
44
45
|
*/
|
|
45
46
|
export interface StructFieldInfo {
|
|
46
47
|
type: TypeInfo | string // The field's type
|
|
48
|
+
name?: string // The Go field name when it differs from the TypeScript key.
|
|
47
49
|
tag?: string // The struct field tag (e.g., `json:"name,omitempty"`)
|
|
48
50
|
}
|
|
49
51
|
|
|
@@ -203,6 +205,19 @@ export interface Comparable {
|
|
|
203
205
|
|
|
204
206
|
// Registry to store runtime type information
|
|
205
207
|
const typeRegistry = new Map<string, TypeInfo>()
|
|
208
|
+
const duplicateTypeRegistry = new Map<string, TypeInfo[]>()
|
|
209
|
+
|
|
210
|
+
function registerTypeInfo(name: string, typeInfo: TypeInfo): void {
|
|
211
|
+
const existing = typeRegistry.get(name)
|
|
212
|
+
if (existing && existing !== typeInfo) {
|
|
213
|
+
const candidates = duplicateTypeRegistry.get(name) ?? [existing]
|
|
214
|
+
if (!candidates.includes(typeInfo)) {
|
|
215
|
+
candidates.push(typeInfo)
|
|
216
|
+
}
|
|
217
|
+
duplicateTypeRegistry.set(name, candidates)
|
|
218
|
+
}
|
|
219
|
+
typeRegistry.set(name, typeInfo)
|
|
220
|
+
}
|
|
206
221
|
|
|
207
222
|
/**
|
|
208
223
|
* Registers a struct type with the runtime type system.
|
|
@@ -229,10 +244,17 @@ export const registerStructType = (
|
|
|
229
244
|
ctor,
|
|
230
245
|
fields,
|
|
231
246
|
}
|
|
232
|
-
|
|
247
|
+
registerTypeInfo(name, typeInfo)
|
|
233
248
|
return typeInfo
|
|
234
249
|
}
|
|
235
250
|
|
|
251
|
+
function resolveZeroValue<T>(zeroValue: any): T {
|
|
252
|
+
if (typeof zeroValue === 'function') {
|
|
253
|
+
return zeroValue() as T
|
|
254
|
+
}
|
|
255
|
+
return zeroValue as T
|
|
256
|
+
}
|
|
257
|
+
|
|
236
258
|
/**
|
|
237
259
|
* Registers an interface type with the runtime type system.
|
|
238
260
|
*
|
|
@@ -252,7 +274,7 @@ export const registerInterfaceType = (
|
|
|
252
274
|
zeroValue,
|
|
253
275
|
methods,
|
|
254
276
|
}
|
|
255
|
-
|
|
277
|
+
registerTypeInfo(name, typeInfo)
|
|
256
278
|
return typeInfo
|
|
257
279
|
}
|
|
258
280
|
|
|
@@ -293,6 +315,14 @@ function normalizeTypeInfo(info: string | TypeInfo): TypeInfo {
|
|
|
293
315
|
return info
|
|
294
316
|
}
|
|
295
317
|
|
|
318
|
+
function typeInfoRuntimeName(info: TypeInfo): string | undefined {
|
|
319
|
+
return info.typeName || info.name
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
function goTypeMatchesTypeInfo(goType: string, info: TypeInfo): boolean {
|
|
323
|
+
return goType === typeInfoRuntimeName(info)
|
|
324
|
+
}
|
|
325
|
+
|
|
296
326
|
function compareOptionalTypeInfo(
|
|
297
327
|
type1?: string | TypeInfo,
|
|
298
328
|
type2?: string | TypeInfo,
|
|
@@ -500,13 +530,9 @@ function matchesStructType(value: any, info: TypeInfo): boolean {
|
|
|
500
530
|
|
|
501
531
|
if (fieldsExist && sameFieldCount && allFieldsInStruct) {
|
|
502
532
|
return Object.entries(info.fields).every(([fieldName, fieldType]) => {
|
|
503
|
-
const fieldTypeInfo =
|
|
504
|
-
? fieldType.type
|
|
505
|
-
|
|
506
|
-
return matchesType(
|
|
507
|
-
value[fieldName],
|
|
508
|
-
normalizeTypeInfo(fieldTypeInfo),
|
|
509
|
-
)
|
|
533
|
+
const fieldTypeInfo =
|
|
534
|
+
isStructFieldInfo(fieldType) ? fieldType.type : fieldType
|
|
535
|
+
return matchesType(value[fieldName], normalizeTypeInfo(fieldTypeInfo))
|
|
510
536
|
})
|
|
511
537
|
}
|
|
512
538
|
|
|
@@ -526,11 +552,13 @@ function matchesStructType(value: any, info: TypeInfo): boolean {
|
|
|
526
552
|
*/
|
|
527
553
|
function matchesInterfaceType(value: any, info: TypeInfo): boolean {
|
|
528
554
|
// Check basic conditions first
|
|
529
|
-
if (
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
555
|
+
if (!isInterfaceTypeInfo(info) || value === null || value === undefined) {
|
|
556
|
+
return false
|
|
557
|
+
}
|
|
558
|
+
if (info.methods.length === 0) {
|
|
559
|
+
return true
|
|
560
|
+
}
|
|
561
|
+
if (typeof value !== 'object') {
|
|
534
562
|
return false
|
|
535
563
|
}
|
|
536
564
|
|
|
@@ -667,9 +695,15 @@ function matchesMapType(value: any, info: TypeInfo): boolean {
|
|
|
667
695
|
*/
|
|
668
696
|
function matchesArrayOrSliceType(value: any, info: TypeInfo): boolean {
|
|
669
697
|
// For slices and arrays, check if the value is an array and sample element types
|
|
670
|
-
if (!Array.isArray(value)) return false
|
|
671
698
|
if (!isArrayTypeInfo(info) && !isSliceTypeInfo(info)) return false
|
|
672
699
|
|
|
700
|
+
if (value instanceof Uint8Array) {
|
|
701
|
+
if (isArrayTypeInfo(info) && value.length !== info.length) return false
|
|
702
|
+
return isNumberElementType(info.elemType)
|
|
703
|
+
}
|
|
704
|
+
|
|
705
|
+
if (!Array.isArray(value)) return false
|
|
706
|
+
|
|
673
707
|
if (info.elemType) {
|
|
674
708
|
const arr = value as any[]
|
|
675
709
|
if (arr.length === 0) return true // Empty array matches any array type
|
|
@@ -690,6 +724,21 @@ function matchesArrayOrSliceType(value: any, info: TypeInfo): boolean {
|
|
|
690
724
|
return true
|
|
691
725
|
}
|
|
692
726
|
|
|
727
|
+
function isNumberElementType(typeInfo: string | TypeInfo | undefined): boolean {
|
|
728
|
+
if (typeInfo === undefined) return true
|
|
729
|
+
const info = normalizeTypeInfo(typeInfo)
|
|
730
|
+
return (
|
|
731
|
+
info.kind === TypeKind.Basic &&
|
|
732
|
+
(info.name === undefined ||
|
|
733
|
+
info.name === 'number' ||
|
|
734
|
+
info.name === 'int' ||
|
|
735
|
+
info.name === 'uint' ||
|
|
736
|
+
info.name === 'uint8' ||
|
|
737
|
+
info.name === 'byte' ||
|
|
738
|
+
info.name === 'float64')
|
|
739
|
+
)
|
|
740
|
+
}
|
|
741
|
+
|
|
693
742
|
// Symbol used to mark struct instances that represent values (not pointers)
|
|
694
743
|
const STRUCT_VALUE_MARKER = Symbol('structValue')
|
|
695
744
|
|
|
@@ -701,6 +750,32 @@ export function markAsStructValue<T>(value: T): T {
|
|
|
701
750
|
return value
|
|
702
751
|
}
|
|
703
752
|
|
|
753
|
+
export function cloneStructValue<T>(value: T): T {
|
|
754
|
+
const cloneable = value as T & {
|
|
755
|
+
__goscriptClone?: () => T
|
|
756
|
+
clone?: () => T
|
|
757
|
+
}
|
|
758
|
+
if (typeof cloneable.__goscriptClone === 'function') {
|
|
759
|
+
return cloneable.__goscriptClone()
|
|
760
|
+
}
|
|
761
|
+
if (typeof cloneable.clone === 'function') {
|
|
762
|
+
return cloneable.clone()
|
|
763
|
+
}
|
|
764
|
+
throw new Error('runtime error: value is not cloneable')
|
|
765
|
+
}
|
|
766
|
+
|
|
767
|
+
export function cloneArrayValue<T>(value: T): T {
|
|
768
|
+
if (value instanceof Uint8Array) {
|
|
769
|
+
const out = new Uint8Array(value.length)
|
|
770
|
+
out.set(value)
|
|
771
|
+
return out as T
|
|
772
|
+
}
|
|
773
|
+
if (Array.isArray(value)) {
|
|
774
|
+
return value.map((item) => cloneArrayValue(item)) as T
|
|
775
|
+
}
|
|
776
|
+
return value
|
|
777
|
+
}
|
|
778
|
+
|
|
704
779
|
// Check if a struct instance is marked as a value
|
|
705
780
|
function isMarkedAsStructValue(value: any): boolean {
|
|
706
781
|
return (
|
|
@@ -729,6 +804,10 @@ function matchesPointerType(value: any, info: TypeInfo): boolean {
|
|
|
729
804
|
|
|
730
805
|
if (!isPointerTypeInfo(info)) return false
|
|
731
806
|
|
|
807
|
+
if (typeof value.__goType === 'string') {
|
|
808
|
+
return compareTypeStringWithTypeInfo(value.__goType, info)
|
|
809
|
+
}
|
|
810
|
+
|
|
732
811
|
if (!info.elemType) return false
|
|
733
812
|
|
|
734
813
|
let elem = info.elemType
|
|
@@ -854,6 +933,13 @@ function matchesType(value: any, info: TypeInfo): boolean {
|
|
|
854
933
|
if (value === null || value === undefined) {
|
|
855
934
|
return false
|
|
856
935
|
}
|
|
936
|
+
if (
|
|
937
|
+
typeof value === 'object' &&
|
|
938
|
+
typeof value.__goType === 'string' &&
|
|
939
|
+
goTypeMatchesTypeInfo(value.__goType, info)
|
|
940
|
+
) {
|
|
941
|
+
return true
|
|
942
|
+
}
|
|
857
943
|
|
|
858
944
|
switch (info.kind) {
|
|
859
945
|
case TypeKind.Basic:
|
|
@@ -1011,7 +1097,10 @@ export function typeAssert<T>(
|
|
|
1011
1097
|
|
|
1012
1098
|
// Handle typed nil pointers (created by typedNil() for conversions like (*T)(nil))
|
|
1013
1099
|
if (typeof value === 'object' && value !== null && value.__isTypedNil) {
|
|
1014
|
-
if (
|
|
1100
|
+
if (
|
|
1101
|
+
isInterfaceTypeInfo(normalizedType) &&
|
|
1102
|
+
matchesInterfaceType(value, normalizedType)
|
|
1103
|
+
) {
|
|
1015
1104
|
return { value: value as T, ok: true }
|
|
1016
1105
|
}
|
|
1017
1106
|
// For typed nils, we need to compare the stored type with the expected type
|
|
@@ -1029,6 +1118,17 @@ export function typeAssert<T>(
|
|
|
1029
1118
|
if (isPointerTypeInfo(normalizedType) && value === null) {
|
|
1030
1119
|
return { value: null as unknown as T, ok: false }
|
|
1031
1120
|
}
|
|
1121
|
+
if (
|
|
1122
|
+
typeof value === 'object' &&
|
|
1123
|
+
value !== null &&
|
|
1124
|
+
typeof value.__goType === 'string' &&
|
|
1125
|
+
goTypeMatchesTypeInfo(value.__goType, normalizedType)
|
|
1126
|
+
) {
|
|
1127
|
+
if ('__goValue' in value) {
|
|
1128
|
+
return { value: value.__goValue as T, ok: true }
|
|
1129
|
+
}
|
|
1130
|
+
return { value: value as T, ok: true }
|
|
1131
|
+
}
|
|
1032
1132
|
|
|
1033
1133
|
// Removed struct matching logic - struct types should use nominal matching
|
|
1034
1134
|
// via matchesStructType in matchesType, not structural matching here
|
|
@@ -1040,9 +1140,9 @@ export function typeAssert<T>(
|
|
|
1040
1140
|
) {
|
|
1041
1141
|
if (normalizedType.keyType || normalizedType.elemType) {
|
|
1042
1142
|
const entries =
|
|
1043
|
-
value instanceof Map
|
|
1044
|
-
|
|
1045
|
-
|
|
1143
|
+
value instanceof Map ?
|
|
1144
|
+
Array.from(value.entries())
|
|
1145
|
+
: Object.entries(value)
|
|
1046
1146
|
|
|
1047
1147
|
if (entries.length === 0) {
|
|
1048
1148
|
return { value: value as T, ok: true }
|
|
@@ -1080,29 +1180,26 @@ export function typeAssert<T>(
|
|
|
1080
1180
|
|
|
1081
1181
|
const matches = matchesType(value, normalizedType)
|
|
1082
1182
|
if (matches) {
|
|
1083
|
-
// Special handling for pointer type assertions:
|
|
1084
|
-
// If the value is a VarRef and we're asserting to a pointer type,
|
|
1085
|
-
// return the inner value (value.value), not the VarRef object itself
|
|
1086
|
-
if (
|
|
1087
|
-
isPointerTypeInfo(normalizedType) &&
|
|
1088
|
-
typeof value === 'object' &&
|
|
1089
|
-
value !== null &&
|
|
1090
|
-
'value' in value
|
|
1091
|
-
) {
|
|
1092
|
-
return { value: value.value as T, ok: true }
|
|
1093
|
-
}
|
|
1094
1183
|
return { value: value as T, ok: true }
|
|
1095
1184
|
}
|
|
1096
1185
|
|
|
1186
|
+
if (typeof typeInfo === 'string') {
|
|
1187
|
+
for (const candidate of duplicateTypeRegistry.get(typeInfo) ?? []) {
|
|
1188
|
+
if (candidate !== normalizedType && matchesType(value, candidate)) {
|
|
1189
|
+
return { value: value as T, ok: true }
|
|
1190
|
+
}
|
|
1191
|
+
}
|
|
1192
|
+
}
|
|
1193
|
+
|
|
1097
1194
|
// If we get here, the assertion failed
|
|
1098
1195
|
// For registered types, use the zero value from the registry
|
|
1099
1196
|
if (typeof typeInfo === 'string') {
|
|
1100
1197
|
const registeredType = typeRegistry.get(typeInfo)
|
|
1101
1198
|
if (registeredType && registeredType.zeroValue !== undefined) {
|
|
1102
|
-
return { value: registeredType.zeroValue
|
|
1199
|
+
return { value: resolveZeroValue<T>(registeredType.zeroValue), ok: false }
|
|
1103
1200
|
}
|
|
1104
1201
|
} else if (normalizedType.zeroValue !== undefined) {
|
|
1105
|
-
return { value: normalizedType.zeroValue
|
|
1202
|
+
return { value: resolveZeroValue<T>(normalizedType.zeroValue), ok: false }
|
|
1106
1203
|
}
|
|
1107
1204
|
|
|
1108
1205
|
return { value: null as unknown as T, ok: false }
|
|
@@ -1166,7 +1263,7 @@ export function is(value: any, typeInfo: string | TypeInfo): boolean {
|
|
|
1166
1263
|
*/
|
|
1167
1264
|
export interface TypeSwitchCase {
|
|
1168
1265
|
types: (string | TypeInfo)[] // Array of types for this case (e.g., case int, string:)
|
|
1169
|
-
body: (value?: any) =>
|
|
1266
|
+
body: (value?: any) => any // Function representing the case body. 'value' is the asserted value if applicable.
|
|
1170
1267
|
}
|
|
1171
1268
|
|
|
1172
1269
|
/**
|
|
@@ -1180,16 +1277,15 @@ export interface TypeSwitchCase {
|
|
|
1180
1277
|
export function typeSwitch(
|
|
1181
1278
|
value: any,
|
|
1182
1279
|
cases: TypeSwitchCase[],
|
|
1183
|
-
defaultCase?: () =>
|
|
1184
|
-
):
|
|
1280
|
+
defaultCase?: () => any,
|
|
1281
|
+
): any {
|
|
1185
1282
|
for (const caseObj of cases) {
|
|
1186
1283
|
// For cases with multiple types (case T1, T2:), use $.is
|
|
1187
1284
|
if (caseObj.types.length > 1) {
|
|
1188
1285
|
const matchesAny = caseObj.types.some((typeInfo) => is(value, typeInfo))
|
|
1189
1286
|
if (matchesAny) {
|
|
1190
1287
|
// For multi-type cases, the case variable (if any) gets the original value
|
|
1191
|
-
caseObj.body(value)
|
|
1192
|
-
return // Found a match, exit switch
|
|
1288
|
+
return caseObj.body(value)
|
|
1193
1289
|
}
|
|
1194
1290
|
} else if (caseObj.types.length === 1) {
|
|
1195
1291
|
// For single-type cases (case T:), use $.typeAssert to get the typed value and ok status
|
|
@@ -1197,9 +1293,7 @@ export function typeSwitch(
|
|
|
1197
1293
|
const { value: assertedValue, ok } = typeAssert(value, typeInfo)
|
|
1198
1294
|
if (ok) {
|
|
1199
1295
|
// Pass the asserted value to the case body function
|
|
1200
|
-
caseObj.body(assertedValue)
|
|
1201
|
-
|
|
1202
|
-
return // Found a match, exit switch
|
|
1296
|
+
return caseObj.body(assertedValue)
|
|
1203
1297
|
}
|
|
1204
1298
|
}
|
|
1205
1299
|
// Note: Cases with 0 types are not valid in Go type switches
|
|
@@ -1207,7 +1301,7 @@ export function typeSwitch(
|
|
|
1207
1301
|
|
|
1208
1302
|
// If no case matched and a default case exists, execute it
|
|
1209
1303
|
if (defaultCase) {
|
|
1210
|
-
defaultCase()
|
|
1304
|
+
return defaultCase()
|
|
1211
1305
|
}
|
|
1212
1306
|
}
|
|
1213
1307
|
|
|
@@ -1228,6 +1322,13 @@ export function typedNil(typeName: string): any {
|
|
|
1228
1322
|
|
|
1229
1323
|
export function interfaceValue<T>(value: unknown, typeName: string): T {
|
|
1230
1324
|
if (value !== null && value !== undefined) {
|
|
1325
|
+
if (typeof value === 'object') {
|
|
1326
|
+
Object.defineProperty(value, '__goType', {
|
|
1327
|
+
value: typeName,
|
|
1328
|
+
writable: true,
|
|
1329
|
+
configurable: true,
|
|
1330
|
+
})
|
|
1331
|
+
}
|
|
1231
1332
|
return value as T
|
|
1232
1333
|
}
|
|
1233
1334
|
|
|
@@ -1255,6 +1356,24 @@ export function interfaceValue<T>(value: unknown, typeName: string): T {
|
|
|
1255
1356
|
return nilValue as T
|
|
1256
1357
|
}
|
|
1257
1358
|
|
|
1359
|
+
export function namedValueInterfaceValue<T>(
|
|
1360
|
+
value: unknown,
|
|
1361
|
+
typeName: string,
|
|
1362
|
+
methods: Record<string, (receiver: any, ...args: any[]) => any>,
|
|
1363
|
+
): T {
|
|
1364
|
+
const boxed: any = {
|
|
1365
|
+
__goType: typeName,
|
|
1366
|
+
__goValue: value,
|
|
1367
|
+
valueOf: () => value,
|
|
1368
|
+
toString: () => String(value),
|
|
1369
|
+
[Symbol.toPrimitive]: () => value as any,
|
|
1370
|
+
}
|
|
1371
|
+
for (const [name, method] of Object.entries(methods)) {
|
|
1372
|
+
boxed[name] = (...args: any[]) => method(value, ...args)
|
|
1373
|
+
}
|
|
1374
|
+
return boxed as T
|
|
1375
|
+
}
|
|
1376
|
+
|
|
1258
1377
|
export function namedFunction<T>(fn: T, typeName: string): T {
|
|
1259
1378
|
if (typeof fn !== 'function') {
|
|
1260
1379
|
return fn
|
package/gs/builtin/varRef.ts
CHANGED
|
@@ -5,7 +5,14 @@
|
|
|
5
5
|
* var myVariable int // variable referenced
|
|
6
6
|
* myOtherVar := &myVariable
|
|
7
7
|
*/
|
|
8
|
-
export type VarRef<T> = {
|
|
8
|
+
export type VarRef<T> = {
|
|
9
|
+
value: T
|
|
10
|
+
__isVarRef?: true
|
|
11
|
+
__goType?: string
|
|
12
|
+
__goAddress?: () => number
|
|
13
|
+
__goCollection?: unknown
|
|
14
|
+
__goIndex?: number
|
|
15
|
+
}
|
|
9
16
|
|
|
10
17
|
/** Wrap a non-null T in a variable reference. */
|
|
11
18
|
export function varRef<T>(v: T): VarRef<T> {
|
|
@@ -15,6 +22,22 @@ export function varRef<T>(v: T): VarRef<T> {
|
|
|
15
22
|
return { value: v, __isVarRef: true }
|
|
16
23
|
}
|
|
17
24
|
|
|
25
|
+
/** Create a variable reference to an object field. */
|
|
26
|
+
export function fieldRef<T extends object, K extends keyof T>(
|
|
27
|
+
target: T,
|
|
28
|
+
key: K,
|
|
29
|
+
): VarRef<T[K]> {
|
|
30
|
+
return {
|
|
31
|
+
get value(): T[K] {
|
|
32
|
+
return target[key]
|
|
33
|
+
},
|
|
34
|
+
set value(value: T[K]) {
|
|
35
|
+
target[key] = value
|
|
36
|
+
},
|
|
37
|
+
__isVarRef: true,
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
18
41
|
/** Check if a value is a VarRef (pointer) */
|
|
19
42
|
export function isVarRef(v: unknown): v is VarRef<unknown> {
|
|
20
43
|
return v !== null && typeof v === 'object' && (v as any).__isVarRef === true
|
|
@@ -29,3 +52,19 @@ export function unref<T>(b: VarRef<T>): T {
|
|
|
29
52
|
}
|
|
30
53
|
return b.value
|
|
31
54
|
}
|
|
55
|
+
|
|
56
|
+
export function unsupportedPointerRef<T>(_value: unknown): VarRef<T> {
|
|
57
|
+
return {
|
|
58
|
+
get value(): T {
|
|
59
|
+
throw new Error(
|
|
60
|
+
'unsafe pointer dereference is not supported in JavaScript/TypeScript',
|
|
61
|
+
)
|
|
62
|
+
},
|
|
63
|
+
set value(_value: T) {
|
|
64
|
+
throw new Error(
|
|
65
|
+
'unsafe pointer dereference is not supported in JavaScript/TypeScript',
|
|
66
|
+
)
|
|
67
|
+
},
|
|
68
|
+
__isVarRef: true,
|
|
69
|
+
}
|
|
70
|
+
}
|