goscript 0.0.84 → 0.1.1
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 -243
- package/cmd/goscript/cmd-test.go +193 -0
- package/cmd/goscript/cmd-test_test.go +76 -0
- package/cmd/goscript/cmd_compile.go +70 -69
- package/cmd/goscript/cmd_compile_test.go +79 -0
- package/cmd/goscript/main.go +11 -5
- package/compiler/build-flags.go +38 -0
- package/compiler/compile-request.go +220 -0
- package/compiler/compiler.go +16 -1336
- package/compiler/compliance_test.go +188 -0
- package/compiler/config.go +6 -13
- package/compiler/diagnostic.go +70 -0
- package/compiler/gotest/owner.go +24 -0
- package/compiler/gotest/package-result.go +67 -0
- package/compiler/gotest/request.go +145 -0
- package/compiler/gotest/result.go +28 -0
- package/compiler/gotest/runner.go +588 -0
- package/compiler/gotest/runner_test.go +627 -0
- package/compiler/gotest/test.go +9 -0
- package/compiler/index.test.ts +28 -28
- package/compiler/index.ts +40 -72
- package/compiler/lowered-program.go +184 -0
- package/compiler/lowering.go +8072 -0
- package/compiler/override-facts.go +307 -0
- package/compiler/override-registry.go +283 -0
- package/compiler/override-registry_test.go +254 -0
- package/compiler/package-graph.go +254 -0
- package/compiler/package-graph_test.go +316 -0
- package/compiler/package-test-function.go +9 -0
- package/compiler/package-test-graph-package.go +40 -0
- package/compiler/package-test-graph-variant.go +105 -0
- package/compiler/package-test-graph.go +117 -0
- package/compiler/package-test-graph_test.go +144 -0
- package/compiler/result.go +13 -0
- package/compiler/runtime-contract.go +439 -0
- package/compiler/runtime-contract_test.go +104 -0
- package/compiler/semantic-model-types.go +113 -0
- package/compiler/semantic-model.go +1422 -0
- package/compiler/semantic-model_test.go +471 -0
- package/compiler/service.go +133 -0
- package/compiler/skeleton_test.go +1775 -0
- package/compiler/tsworkspace/owner.go +334 -0
- package/compiler/tsworkspace/owner_test.go +93 -0
- package/compiler/tsworkspace/result.go +17 -0
- package/compiler/typescript-emitter.go +1040 -0
- package/compiler/wasm/compile.go +2 -3
- package/compiler/wasm/compile_test.go +79 -0
- package/compiler/wasm_api.go +140 -124
- package/dist/compiler/index.d.ts +1 -3
- package/dist/compiler/index.js +31 -55
- package/dist/compiler/index.js.map +1 -1
- package/dist/gs/builtin/builtin.d.ts +33 -2
- package/dist/gs/builtin/builtin.js +217 -6
- package/dist/gs/builtin/builtin.js.map +1 -1
- package/dist/gs/builtin/channel.d.ts +11 -3
- package/dist/gs/builtin/channel.js +12 -0
- package/dist/gs/builtin/channel.js.map +1 -1
- package/dist/gs/builtin/hostio.d.ts +15 -1
- package/dist/gs/builtin/hostio.js +134 -49
- package/dist/gs/builtin/hostio.js.map +1 -1
- package/dist/gs/builtin/index.d.ts +1 -0
- package/dist/gs/builtin/index.js +1 -0
- package/dist/gs/builtin/index.js.map +1 -1
- package/dist/gs/builtin/slice.d.ts +23 -3
- package/dist/gs/builtin/slice.js +216 -44
- package/dist/gs/builtin/slice.js.map +1 -1
- package/dist/gs/builtin/type.d.ts +16 -2
- package/dist/gs/builtin/type.js +134 -21
- package/dist/gs/builtin/type.js.map +1 -1
- package/dist/gs/builtin/varRef.d.ts +5 -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 +48 -44
- package/dist/gs/bytes/buffer.gs.js.map +1 -1
- package/dist/gs/bytes/bytes.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/context/context.d.ts +5 -4
- package/dist/gs/context/context.js +10 -10
- package/dist/gs/context/context.js.map +1 -1
- 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 +5 -0
- package/dist/gs/crypto/rand/index.js +77 -0
- package/dist/gs/crypto/rand/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 +178 -0
- package/dist/gs/encoding/json/index.js.map +1 -0
- package/dist/gs/errors/errors.d.ts +4 -0
- package/dist/gs/errors/errors.js +81 -0
- 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 +36 -1
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js +212 -2
- 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 +825 -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 +163 -0
- package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js +449 -0
- package/dist/gs/github.com/aperturerobotics/starpc/srpc/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/klauspost/compress/internal/le/index.d.ts +9 -0
- package/dist/gs/github.com/klauspost/compress/internal/le/index.js +71 -0
- package/dist/gs/github.com/klauspost/compress/internal/le/index.js.map +1 -0
- package/dist/gs/github.com/pkg/errors/errors.js.map +1 -1
- package/dist/gs/github.com/pkg/errors/stack.js.map +1 -1
- 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 +42 -0
- package/dist/gs/go/scanner/index.js +155 -0
- package/dist/gs/go/scanner/index.js.map +1 -0
- package/dist/gs/go/token/index.d.ts +187 -0
- package/dist/gs/go/token/index.js +578 -0
- package/dist/gs/go/token/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/fs.js.map +1 -1
- 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/readdir.js.map +1 -1
- package/dist/gs/io/fs/readfile.js.map +1 -1
- package/dist/gs/io/fs/readlink.d.ts +8 -0
- package/dist/gs/io/fs/readlink.js +64 -0
- package/dist/gs/io/fs/readlink.js.map +1 -0
- package/dist/gs/io/fs/stat.js.map +1 -1
- package/dist/gs/io/fs/sub.js.map +1 -1
- 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/maps/iter.d.ts +3 -3
- package/dist/gs/maps/iter.js +3 -3
- package/dist/gs/maps/iter.js.map +1 -1
- package/dist/gs/maps/maps.d.ts +2 -2
- 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 +66 -34
- 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 +50 -0
- package/dist/gs/mime/index.js.map +1 -0
- package/dist/gs/net/http/httptest/index.d.ts +11 -0
- package/dist/gs/net/http/httptest/index.js +21 -0
- package/dist/gs/net/http/httptest/index.js.map +1 -0
- package/dist/gs/net/http/index.d.ts +27 -0
- package/dist/gs/net/http/index.js +61 -0
- package/dist/gs/net/http/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 +2 -4
- package/dist/gs/os/error.gs.js.map +1 -1
- package/dist/gs/os/exec.gs.js.map +1 -1
- package/dist/gs/os/exec_posix.gs.js.map +1 -1
- package/dist/gs/os/rawconn_js.gs.js.map +1 -1
- package/dist/gs/os/root_js.gs.js.map +1 -1
- package/dist/gs/os/tempfile.gs.js +66 -9
- package/dist/gs/os/tempfile.gs.js.map +1 -1
- package/dist/gs/os/types.gs.js.map +1 -1
- package/dist/gs/os/types_js.gs.js +9 -9
- package/dist/gs/os/types_js.gs.js.map +1 -1
- package/dist/gs/os/types_unix.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 +3 -1
- package/dist/gs/path/filepath/path.js +133 -4
- package/dist/gs/path/filepath/path.js.map +1 -1
- package/dist/gs/path/match.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 +3 -3
- package/dist/gs/reflect/index.js +2 -2
- package/dist/gs/reflect/index.js.map +1 -1
- package/dist/gs/reflect/map.js +3 -0
- package/dist/gs/reflect/map.js.map +1 -1
- package/dist/gs/reflect/type.d.ts +9 -5
- package/dist/gs/reflect/type.js +233 -21
- package/dist/gs/reflect/type.js.map +1 -1
- package/dist/gs/reflect/types.js.map +1 -1
- package/dist/gs/reflect/visiblefields.js.map +1 -1
- package/dist/gs/runtime/debug/index.d.ts +2 -0
- package/dist/gs/runtime/debug/index.js +8 -0
- package/dist/gs/runtime/debug/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/slices/slices.d.ts +24 -5
- package/dist/gs/slices/slices.js +214 -5
- package/dist/gs/slices/slices.js.map +1 -1
- package/dist/gs/sort/slice.gs.d.ts +3 -3
- package/dist/gs/sort/slice.gs.js +6 -6
- 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/strconv/atoi.gs.js.map +1 -1
- package/dist/gs/strconv/quote.gs.js.map +1 -1
- package/dist/gs/strings/builder.d.ts +1 -1
- package/dist/gs/strings/builder.js +3 -2
- package/dist/gs/strings/builder.js.map +1 -1
- package/dist/gs/strings/reader.js.map +1 -1
- package/dist/gs/strings/replace.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/atomic/value.gs.js.map +1 -1
- package/dist/gs/sync/sync.d.ts +3 -0
- package/dist/gs/sync/sync.js +39 -0
- 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 +2 -0
- package/dist/gs/syscall/errors.js +8 -0
- package/dist/gs/syscall/errors.js.map +1 -1
- package/dist/gs/syscall/fs.d.ts +43 -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 +375 -0
- package/dist/gs/syscall/js/index.js.map +1 -0
- package/dist/gs/syscall/types.d.ts +22 -0
- 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 +77 -0
- package/dist/gs/testing/testing.js +301 -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 +205 -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 +71 -0
- package/dist/gs/unique/index.js.map +1 -0
- package/go.mod +2 -2
- package/go.sum +9 -0
- package/gs/builtin/builtin.ts +266 -8
- package/gs/builtin/channel.ts +22 -0
- package/gs/builtin/hostio.test.ts +177 -0
- package/gs/builtin/hostio.ts +171 -56
- package/gs/builtin/index.ts +1 -0
- package/gs/builtin/runtime-contract.test.ts +356 -0
- package/gs/builtin/slice.ts +259 -50
- package/gs/builtin/type.ts +188 -30
- package/gs/builtin/varRef.ts +38 -1
- package/gs/bytes/buffer.gs.ts +48 -44
- package/gs/bytes/meta.json +8 -3
- package/gs/bytes/reader.gs.ts +20 -19
- package/gs/context/context.test.ts +41 -0
- package/gs/context/context.ts +22 -26
- 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 +32 -0
- package/gs/crypto/rand/index.ts +90 -0
- package/gs/crypto/rand/meta.json +5 -0
- package/gs/embed/index.ts +20 -0
- package/gs/embed/meta.json +5 -0
- package/gs/encoding/json/index.test.ts +79 -0
- package/gs/encoding/json/index.ts +210 -0
- package/gs/errors/errors.test.ts +82 -0
- package/gs/errors/errors.ts +104 -0
- package/gs/fmt/fmt.ts +56 -16
- package/gs/github.com/aperturerobotics/protobuf-go-lite/index.test.ts +95 -0
- package/gs/github.com/aperturerobotics/protobuf-go-lite/index.ts +300 -2
- package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.test.ts +159 -0
- package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.ts +1005 -0
- package/gs/github.com/aperturerobotics/starpc/srpc/index.ts +719 -0
- package/gs/github.com/aperturerobotics/starpc/srpc/meta.json +40 -0
- package/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/meta.json +3 -1
- package/gs/github.com/klauspost/compress/internal/le/index.test.ts +36 -0
- package/gs/github.com/klauspost/compress/internal/le/index.ts +114 -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 +72 -0
- package/gs/go/scanner/index.ts +204 -0
- package/gs/go/token/index.test.ts +67 -0
- package/gs/go/token/index.ts +686 -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 +77 -0
- package/gs/io/fs/walk.test.ts +61 -0
- package/gs/io/fs/walk.ts +9 -9
- package/gs/io/io.ts +174 -31
- package/gs/io/meta.json +10 -2
- package/gs/maps/iter.ts +12 -6
- package/gs/maps/maps.ts +8 -6
- package/gs/math/bits/index.ts +103 -47
- package/gs/math/const.gs.test.ts +11 -5
- package/gs/math/const.gs.ts +5 -6
- package/gs/mime/index.ts +54 -0
- package/gs/net/http/httptest/index.ts +25 -0
- package/gs/net/http/index.test.ts +20 -0
- package/gs/net/http/index.ts +81 -0
- package/gs/os/dir_unix.gs.ts +2 -3
- package/gs/os/file_unix_js.test.ts +50 -0
- package/gs/os/meta.json +1 -2
- package/gs/os/tempfile.gs.test.ts +85 -0
- package/gs/os/tempfile.gs.ts +71 -11
- package/gs/os/types_js.gs.ts +11 -11
- package/gs/path/filepath/match.test.ts +31 -12
- package/gs/path/filepath/match.ts +178 -3
- package/gs/path/filepath/path.test.ts +25 -0
- package/gs/path/filepath/path.ts +159 -5
- package/gs/path/path.ts +20 -5
- package/gs/reflect/index.ts +2 -1
- package/gs/reflect/map.test.ts +19 -0
- package/gs/reflect/map.ts +4 -0
- package/gs/reflect/type.ts +298 -29
- package/gs/reflect/typefor.test.ts +75 -0
- package/gs/runtime/debug/index.test.ts +24 -0
- package/gs/runtime/debug/index.ts +8 -0
- package/gs/runtime/runtime.test.ts +19 -0
- package/gs/runtime/runtime.ts +98 -3
- package/gs/slices/slices.test.ts +94 -0
- package/gs/slices/slices.ts +245 -5
- package/gs/sort/meta.json +7 -0
- package/gs/sort/slice.gs.ts +16 -7
- package/gs/sort/sort.gs.ts +16 -13
- package/gs/strings/builder.ts +4 -3
- package/gs/sync/atomic/type.gs.ts +13 -14
- package/gs/sync/meta.json +3 -1
- package/gs/sync/sync.test.ts +36 -0
- package/gs/sync/sync.ts +39 -0
- package/gs/syscall/constants.ts +39 -24
- package/gs/syscall/errors.ts +10 -0
- package/gs/syscall/fs.ts +195 -0
- package/gs/syscall/js/index.ts +458 -0
- package/gs/syscall/js/meta.json +4 -0
- package/gs/syscall/net.test.ts +85 -0
- package/gs/syscall/types.ts +56 -0
- package/gs/testing/index.ts +1 -0
- package/gs/testing/meta.json +5 -0
- package/gs/testing/testing.test.ts +90 -0
- package/gs/testing/testing.ts +382 -0
- package/gs/time/time.test.ts +106 -0
- package/gs/time/time.ts +278 -57
- package/gs/unicode/unicode.test.ts +25 -0
- package/gs/unicode/unicode.ts +119 -9
- package/gs/unicode/utf8/utf8.test.ts +13 -0
- package/gs/unicode/utf8/utf8.ts +28 -16
- package/gs/unique/index.ts +91 -0
- package/package.json +14 -13
- package/compiler/analysis.go +0 -3475
- package/compiler/analysis_test.go +0 -338
- package/compiler/assignment.go +0 -580
- package/compiler/builtin_test.go +0 -92
- package/compiler/code-writer.go +0 -115
- package/compiler/compiler_test.go +0 -149
- package/compiler/composite-lit.go +0 -779
- package/compiler/config_test.go +0 -62
- package/compiler/constraint.go +0 -86
- package/compiler/decl.go +0 -801
- package/compiler/expr-call-async.go +0 -188
- package/compiler/expr-call-builtins.go +0 -208
- package/compiler/expr-call-helpers.go +0 -382
- package/compiler/expr-call-make.go +0 -318
- package/compiler/expr-call-type-conversion.go +0 -520
- package/compiler/expr-call.go +0 -413
- package/compiler/expr-selector.go +0 -343
- package/compiler/expr-star.go +0 -82
- package/compiler/expr-type.go +0 -442
- package/compiler/expr-value.go +0 -89
- package/compiler/expr.go +0 -773
- package/compiler/field.go +0 -183
- package/compiler/gs_dependencies_test.go +0 -298
- package/compiler/lit.go +0 -322
- package/compiler/output.go +0 -72
- package/compiler/primitive.go +0 -149
- package/compiler/protobuf.go +0 -697
- package/compiler/sanitize.go +0 -100
- package/compiler/spec-struct.go +0 -995
- package/compiler/spec-value.go +0 -540
- package/compiler/spec.go +0 -725
- package/compiler/stmt-assign.go +0 -664
- package/compiler/stmt-for.go +0 -266
- package/compiler/stmt-range.go +0 -475
- package/compiler/stmt-select.go +0 -262
- package/compiler/stmt-type-switch.go +0 -147
- package/compiler/stmt.go +0 -1308
- package/compiler/type-assert.go +0 -386
- package/compiler/type-info.go +0 -156
- package/compiler/type-utils.go +0 -207
- package/compiler/type.go +0 -892
package/gs/builtin/builtin.ts
CHANGED
|
@@ -2,6 +2,15 @@ import type { Slice, SliceProxy } from './slice.js'
|
|
|
2
2
|
import { writeHostStdoutText } from './hostio.js'
|
|
3
3
|
import { formatPrintedArgs } from './print.js'
|
|
4
4
|
import { isSliceProxy } from './slice.js'
|
|
5
|
+
import { isVarRef, type VarRef } from './varRef.js'
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Implementation of Go's built-in print function
|
|
9
|
+
* @param args Arguments to print
|
|
10
|
+
*/
|
|
11
|
+
export function print(...args: any[]): void {
|
|
12
|
+
writeHostStdoutText(args.length === 0 ? '' : formatPrintedArgs(args))
|
|
13
|
+
}
|
|
5
14
|
|
|
6
15
|
/**
|
|
7
16
|
* Implementation of Go's built-in println function
|
|
@@ -26,7 +35,7 @@ export function panic(...args: any[]): never {
|
|
|
26
35
|
* For maps, it deletes all entries.
|
|
27
36
|
* @param v The slice or map to clear
|
|
28
37
|
*/
|
|
29
|
-
export function clear<T>(v: T
|
|
38
|
+
export function clear<T>(v: Slice<T> | Map<unknown, unknown> | null): void {
|
|
30
39
|
if (v === null || v === undefined) {
|
|
31
40
|
return
|
|
32
41
|
}
|
|
@@ -34,12 +43,40 @@ export function clear<T>(v: T[] | Map<unknown, unknown> | null): void {
|
|
|
34
43
|
v.clear()
|
|
35
44
|
return
|
|
36
45
|
}
|
|
46
|
+
if (v instanceof Uint8Array) {
|
|
47
|
+
v.fill(0)
|
|
48
|
+
return
|
|
49
|
+
}
|
|
50
|
+
if (isSliceProxy(v)) {
|
|
51
|
+
const zero = clearZeroValue(v)
|
|
52
|
+
for (let i = 0; i < v.length; i++) {
|
|
53
|
+
v[i] = zero
|
|
54
|
+
}
|
|
55
|
+
return
|
|
56
|
+
}
|
|
37
57
|
if (Array.isArray(v)) {
|
|
38
|
-
v.fill(
|
|
58
|
+
v.fill(clearZeroValue(v))
|
|
39
59
|
return
|
|
40
60
|
}
|
|
41
61
|
}
|
|
42
62
|
|
|
63
|
+
function clearZeroValue<T>(v: T[]): T {
|
|
64
|
+
for (const item of v) {
|
|
65
|
+
if (item !== null && item !== undefined) {
|
|
66
|
+
switch (typeof item) {
|
|
67
|
+
case 'number':
|
|
68
|
+
return 0 as T
|
|
69
|
+
case 'string':
|
|
70
|
+
return '' as T
|
|
71
|
+
case 'boolean':
|
|
72
|
+
return false as T
|
|
73
|
+
}
|
|
74
|
+
break
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return null as T
|
|
78
|
+
}
|
|
79
|
+
|
|
43
80
|
/**
|
|
44
81
|
* assignStruct copies all field values from source struct to target struct.
|
|
45
82
|
* Used for pointer dereference assignment: *p = value
|
|
@@ -69,13 +106,155 @@ export function assignStruct<T>(target: T, source: T): void {
|
|
|
69
106
|
}
|
|
70
107
|
}
|
|
71
108
|
|
|
109
|
+
/**
|
|
110
|
+
* pointerValue unwraps a Go pointer value for generated field, method, and
|
|
111
|
+
* dereference access. Struct pointers may be represented directly as class
|
|
112
|
+
* instances or indirectly as VarRef values when the pointer came from taking a
|
|
113
|
+
* variable's address.
|
|
114
|
+
*/
|
|
115
|
+
export function pointerValue<T>(value: T | VarRef<T> | null | undefined): T {
|
|
116
|
+
if (value === null || value === undefined) {
|
|
117
|
+
throw new Error(
|
|
118
|
+
'runtime error: invalid memory address or nil pointer dereference',
|
|
119
|
+
)
|
|
120
|
+
}
|
|
121
|
+
if (isVarRef(value)) {
|
|
122
|
+
return value.value as T
|
|
123
|
+
}
|
|
124
|
+
return value
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
export function arrayEqual(a: unknown, b: unknown): boolean {
|
|
128
|
+
return comparableEqual(a, b)
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function comparableEqual(a: unknown, b: unknown): boolean {
|
|
132
|
+
if (a === b) {
|
|
133
|
+
return true
|
|
134
|
+
}
|
|
135
|
+
if (a === null || a === undefined || b === null || b === undefined) {
|
|
136
|
+
return false
|
|
137
|
+
}
|
|
138
|
+
if (isArrayLike(a) && isArrayLike(b)) {
|
|
139
|
+
if (a.length !== b.length) {
|
|
140
|
+
return false
|
|
141
|
+
}
|
|
142
|
+
for (let i = 0; i < a.length; i++) {
|
|
143
|
+
if (!comparableEqual(a[i], b[i])) {
|
|
144
|
+
return false
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return true
|
|
148
|
+
}
|
|
149
|
+
if (hasGoType(a) || hasGoType(b)) {
|
|
150
|
+
if (!hasGoType(a) || !hasGoType(b) || a.__goType !== b.__goType) {
|
|
151
|
+
return false
|
|
152
|
+
}
|
|
153
|
+
if (a.__isTypedNil || b.__isTypedNil) {
|
|
154
|
+
return a.__isTypedNil === true && b.__isTypedNil === true
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
if (isStructValue(a) && isStructValue(b)) {
|
|
158
|
+
return fieldsEqual(a._fields, b._fields)
|
|
159
|
+
}
|
|
160
|
+
return false
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
function isArrayLike(value: unknown): value is ArrayLike<unknown> {
|
|
164
|
+
return Array.isArray(value) || value instanceof Uint8Array
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
function hasGoType(value: unknown): value is {
|
|
168
|
+
__goType: string
|
|
169
|
+
__isTypedNil?: boolean
|
|
170
|
+
} {
|
|
171
|
+
return (
|
|
172
|
+
typeof value === 'object' &&
|
|
173
|
+
value !== null &&
|
|
174
|
+
typeof (value as { __goType?: unknown }).__goType === 'string'
|
|
175
|
+
)
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
function isStructValue(value: unknown): value is {
|
|
179
|
+
_fields: Record<string, VarRef<unknown>>
|
|
180
|
+
} {
|
|
181
|
+
return (
|
|
182
|
+
typeof value === 'object' &&
|
|
183
|
+
value !== null &&
|
|
184
|
+
typeof (value as { _fields?: unknown })._fields === 'object' &&
|
|
185
|
+
(value as { _fields?: unknown })._fields !== null
|
|
186
|
+
)
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
function fieldsEqual(
|
|
190
|
+
a: Record<string, VarRef<unknown>>,
|
|
191
|
+
b: Record<string, VarRef<unknown>>,
|
|
192
|
+
): boolean {
|
|
193
|
+
const aKeys = Object.keys(a)
|
|
194
|
+
const bKeys = Object.keys(b)
|
|
195
|
+
if (aKeys.length !== bKeys.length) {
|
|
196
|
+
return false
|
|
197
|
+
}
|
|
198
|
+
for (const key of aKeys) {
|
|
199
|
+
if (!(key in b) || !comparableEqual(a[key].value, b[key].value)) {
|
|
200
|
+
return false
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
return true
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
export interface Complex {
|
|
207
|
+
real: number
|
|
208
|
+
imag: number
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
export function complex(real: number, imag: number): Complex {
|
|
212
|
+
return { real, imag }
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
export function real(value: number | Complex | null | undefined): number {
|
|
216
|
+
if (typeof value === 'number') {
|
|
217
|
+
return value
|
|
218
|
+
}
|
|
219
|
+
return value?.real ?? 0
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
export function imag(value: number | Complex | null | undefined): number {
|
|
223
|
+
if (typeof value === 'number') {
|
|
224
|
+
return 0
|
|
225
|
+
}
|
|
226
|
+
return value?.imag ?? 0
|
|
227
|
+
}
|
|
228
|
+
|
|
72
229
|
// Bytes represents all valid []byte representations in TypeScript
|
|
73
230
|
// This includes Uint8Array (the preferred representation) and $.Slice<number> (which includes null)
|
|
74
231
|
export type Bytes = Uint8Array | Slice<number>
|
|
75
232
|
|
|
76
233
|
// int converts a value to a Go int type, handling proper signed integer conversion
|
|
77
234
|
// This ensures that values like 2147483648 (2^31) are properly handled according to Go semantics
|
|
78
|
-
export function int(value: number): number {
|
|
235
|
+
export function int(value: number | bigint, bits = 0): number {
|
|
236
|
+
if (typeof value === 'bigint') {
|
|
237
|
+
if (bits > 0 && bits <= 64) {
|
|
238
|
+
return Number(BigInt.asIntN(bits, value))
|
|
239
|
+
}
|
|
240
|
+
return Number(value)
|
|
241
|
+
}
|
|
242
|
+
if (bits > 0 && bits < 64) {
|
|
243
|
+
const modulo = 2 ** bits
|
|
244
|
+
const sign = 2 ** (bits - 1)
|
|
245
|
+
let truncated = Math.trunc(value)
|
|
246
|
+
if (!Number.isFinite(truncated)) {
|
|
247
|
+
return truncated
|
|
248
|
+
}
|
|
249
|
+
truncated %= modulo
|
|
250
|
+
if (truncated < 0) {
|
|
251
|
+
truncated += modulo
|
|
252
|
+
}
|
|
253
|
+
if (truncated >= sign) {
|
|
254
|
+
truncated -= modulo
|
|
255
|
+
}
|
|
256
|
+
return truncated
|
|
257
|
+
}
|
|
79
258
|
// In Go, int is typically 64-bit on 64-bit systems, but for compatibility with JavaScript
|
|
80
259
|
// we need to handle the conversion properly. The issue is that JavaScript's number type
|
|
81
260
|
// can represent values larger than 32-bit signed integers, but when cast in certain contexts
|
|
@@ -88,6 +267,86 @@ export function int(value: number): number {
|
|
|
88
267
|
return Math.trunc(value)
|
|
89
268
|
}
|
|
90
269
|
|
|
270
|
+
// uint converts a value to an unsigned Go integer width.
|
|
271
|
+
export function uint(value: number | bigint, bits = 64): number {
|
|
272
|
+
if (typeof value === 'bigint') {
|
|
273
|
+
const normalized = BigInt.asUintN(Math.min(bits, 64), value)
|
|
274
|
+
if (bits >= 64) {
|
|
275
|
+
return normalized as unknown as number
|
|
276
|
+
}
|
|
277
|
+
return Number(normalized)
|
|
278
|
+
}
|
|
279
|
+
const modulo = bits >= 64 ? 2 ** 64 : 2 ** bits
|
|
280
|
+
let truncated = Math.trunc(value)
|
|
281
|
+
if (!Number.isFinite(truncated)) {
|
|
282
|
+
return truncated
|
|
283
|
+
}
|
|
284
|
+
truncated %= modulo
|
|
285
|
+
if (truncated < 0) {
|
|
286
|
+
truncated += modulo
|
|
287
|
+
}
|
|
288
|
+
return truncated
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
export function uint64Shl(value: number | bigint, shift: number | bigint): number {
|
|
292
|
+
return uint64Result(uint64Value(value) << BigInt(Math.trunc(Number(shift))))
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
export function uint64Shr(value: number | bigint, shift: number | bigint): number {
|
|
296
|
+
return uint64Result(uint64Value(value) >> BigInt(Math.trunc(Number(shift))))
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
export function uintShr(
|
|
300
|
+
value: number | bigint,
|
|
301
|
+
shift: number | bigint,
|
|
302
|
+
bits = 32,
|
|
303
|
+
): number {
|
|
304
|
+
const width = Math.min(bits, 32)
|
|
305
|
+
const amount = Math.trunc(Number(shift))
|
|
306
|
+
if (amount < 0) {
|
|
307
|
+
throw new Error('runtime error: negative shift amount')
|
|
308
|
+
}
|
|
309
|
+
if (amount >= width) {
|
|
310
|
+
return 0
|
|
311
|
+
}
|
|
312
|
+
return uint(value, width) >>> amount
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
export function uint64Mul(left: number | bigint, right: number | bigint): number {
|
|
316
|
+
return uint64Result(uint64Value(left) * uint64Value(right))
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
export function uint64Add(left: number | bigint, right: number | bigint): number {
|
|
320
|
+
return uint64Result(uint64Value(left) + uint64Value(right))
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
export function uint64Sub(left: number | bigint, right: number | bigint): number {
|
|
324
|
+
return uint64Result(uint64Value(left) - uint64Value(right))
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
export function uint64And(left: number | bigint, right: number | bigint): number {
|
|
328
|
+
return uint64Result(uint64Value(left) & uint64Value(right))
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
export function uint64Or(left: number | bigint, right: number | bigint): number {
|
|
332
|
+
return uint64Result(uint64Value(left) | uint64Value(right))
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
export function uint64Xor(left: number | bigint, right: number | bigint): number {
|
|
336
|
+
return uint64Result(uint64Value(left) ^ uint64Value(right))
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
function uint64Value(value: number | bigint): bigint {
|
|
340
|
+
if (typeof value === 'bigint') {
|
|
341
|
+
return BigInt.asUintN(64, value)
|
|
342
|
+
}
|
|
343
|
+
return BigInt.asUintN(64, BigInt(Math.trunc(value)))
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
function uint64Result(value: bigint): number {
|
|
347
|
+
return BigInt.asUintN(64, value) as unknown as number
|
|
348
|
+
}
|
|
349
|
+
|
|
91
350
|
/**
|
|
92
351
|
* Normalizes various byte representations into a `Uint8Array` for protobuf compatibility.
|
|
93
352
|
*
|
|
@@ -221,17 +480,16 @@ export function bytesToArray(bytes: Bytes | null): number[] {
|
|
|
221
480
|
return Array.from(bytes)
|
|
222
481
|
}
|
|
223
482
|
|
|
224
|
-
if (Array.isArray(bytes)) {
|
|
225
|
-
return bytes
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
// Handle SliceProxy
|
|
229
483
|
if (isSliceProxy(bytes)) {
|
|
230
484
|
const proxy = bytes as SliceProxy<number>
|
|
231
485
|
const meta = proxy.__meta__
|
|
232
486
|
return meta.backing.slice(meta.offset, meta.offset + meta.length)
|
|
233
487
|
}
|
|
234
488
|
|
|
489
|
+
if (Array.isArray(bytes)) {
|
|
490
|
+
return bytes
|
|
491
|
+
}
|
|
492
|
+
|
|
235
493
|
throw new Error(`Cannot convert bytes of type ${typeof bytes} to array`)
|
|
236
494
|
}
|
|
237
495
|
|
package/gs/builtin/channel.ts
CHANGED
|
@@ -77,6 +77,11 @@ export interface Channel<T> {
|
|
|
77
77
|
* Used for non-blocking select operations.
|
|
78
78
|
*/
|
|
79
79
|
canSendNonBlocking(): boolean
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Reports the number of buffered values currently queued in the channel.
|
|
83
|
+
*/
|
|
84
|
+
len(): number
|
|
80
85
|
}
|
|
81
86
|
|
|
82
87
|
/**
|
|
@@ -530,6 +535,10 @@ class BufferedChannel<T> implements Channel<T> {
|
|
|
530
535
|
this.receiversWithOk.length > 0
|
|
531
536
|
)
|
|
532
537
|
}
|
|
538
|
+
|
|
539
|
+
len(): number {
|
|
540
|
+
return this.buffer.length
|
|
541
|
+
}
|
|
533
542
|
}
|
|
534
543
|
|
|
535
544
|
/**
|
|
@@ -555,6 +564,7 @@ export interface ChannelRef<T> {
|
|
|
555
564
|
canReceiveNonBlocking(): boolean
|
|
556
565
|
selectSend(value: T, id: number): Promise<SelectResult<boolean>>
|
|
557
566
|
selectReceive(id: number): Promise<SelectResult<T>>
|
|
567
|
+
len(): number
|
|
558
568
|
}
|
|
559
569
|
|
|
560
570
|
/**
|
|
@@ -597,6 +607,10 @@ export class BidirectionalChannelRef<T> implements ChannelRef<T> {
|
|
|
597
607
|
selectReceive(id: number): Promise<SelectResult<T>> {
|
|
598
608
|
return this.channel.selectReceive(id)
|
|
599
609
|
}
|
|
610
|
+
|
|
611
|
+
len(): number {
|
|
612
|
+
return this.channel.len()
|
|
613
|
+
}
|
|
600
614
|
}
|
|
601
615
|
|
|
602
616
|
/**
|
|
@@ -641,6 +655,10 @@ export class SendOnlyChannelRef<T> implements ChannelRef<T> {
|
|
|
641
655
|
selectReceive(_id: number): Promise<SelectResult<T>> {
|
|
642
656
|
throw new Error('Cannot receive from send-only channel')
|
|
643
657
|
}
|
|
658
|
+
|
|
659
|
+
len(): number {
|
|
660
|
+
return this.channel.len()
|
|
661
|
+
}
|
|
644
662
|
}
|
|
645
663
|
|
|
646
664
|
/**
|
|
@@ -685,6 +703,10 @@ export class ReceiveOnlyChannelRef<T> implements ChannelRef<T> {
|
|
|
685
703
|
selectSend(_value: T, _id: number): Promise<SelectResult<boolean>> {
|
|
686
704
|
throw new Error('Cannot send to receive-only channel')
|
|
687
705
|
}
|
|
706
|
+
|
|
707
|
+
len(): number {
|
|
708
|
+
return this.channel.len()
|
|
709
|
+
}
|
|
688
710
|
}
|
|
689
711
|
|
|
690
712
|
/**
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import { afterEach, describe, expect, it, vi } from 'vitest'
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
|
+
getHostRuntime,
|
|
5
|
+
HostRuntimeOwner,
|
|
6
|
+
type HostRuntime,
|
|
7
|
+
isMainScript,
|
|
4
8
|
resetHostRuntimeForTests,
|
|
5
9
|
writeHostStderrText,
|
|
6
10
|
writeHostStdoutText,
|
|
@@ -10,6 +14,8 @@ const originalDeno = (globalThis as any).Deno
|
|
|
10
14
|
const originalProcess = (globalThis as any).process
|
|
11
15
|
|
|
12
16
|
afterEach(() => {
|
|
17
|
+
vi.restoreAllMocks()
|
|
18
|
+
|
|
13
19
|
if (originalDeno === undefined) {
|
|
14
20
|
delete (globalThis as any).Deno
|
|
15
21
|
} else {
|
|
@@ -25,6 +31,40 @@ afterEach(() => {
|
|
|
25
31
|
resetHostRuntimeForTests()
|
|
26
32
|
})
|
|
27
33
|
|
|
34
|
+
function runtimeFixture(platform: string): HostRuntime {
|
|
35
|
+
return {
|
|
36
|
+
deno: null,
|
|
37
|
+
getEnv: () => '',
|
|
38
|
+
getStdioHandle: () => null,
|
|
39
|
+
nodeFS: null,
|
|
40
|
+
platform,
|
|
41
|
+
processObj: null,
|
|
42
|
+
readFD: () => null,
|
|
43
|
+
writeFD: () => 0,
|
|
44
|
+
writeStderrText: () => {},
|
|
45
|
+
writeStdoutText: () => {},
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
describe('hostio runtime owner', () => {
|
|
50
|
+
it('caches host capability detection until reset', () => {
|
|
51
|
+
let detects = 0
|
|
52
|
+
const owner = new HostRuntimeOwner(() => {
|
|
53
|
+
detects++
|
|
54
|
+
return runtimeFixture(`host-${detects}`)
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
expect(owner.current().platform).toBe('host-1')
|
|
58
|
+
expect(owner.current().platform).toBe('host-1')
|
|
59
|
+
expect(detects).toBe(1)
|
|
60
|
+
|
|
61
|
+
owner.reset()
|
|
62
|
+
|
|
63
|
+
expect(owner.current().platform).toBe('host-2')
|
|
64
|
+
expect(detects).toBe(2)
|
|
65
|
+
})
|
|
66
|
+
})
|
|
67
|
+
|
|
28
68
|
describe('hostio text writes', () => {
|
|
29
69
|
it('uses sync node fs writes for stdout and stderr', () => {
|
|
30
70
|
const writes: Array<{ fd: number; bytes: number[] }> = []
|
|
@@ -66,4 +106,141 @@ describe('hostio text writes', () => {
|
|
|
66
106
|
expect((globalThis as any).process.stdout.write).not.toHaveBeenCalled()
|
|
67
107
|
expect((globalThis as any).process.stderr.write).not.toHaveBeenCalled()
|
|
68
108
|
})
|
|
109
|
+
|
|
110
|
+
it('falls back to node fs when Deno is present without sync stdio', () => {
|
|
111
|
+
const writes: Array<{ fd: number; bytes: number[] }> = []
|
|
112
|
+
const writeSync = vi.fn(
|
|
113
|
+
(
|
|
114
|
+
fd: number,
|
|
115
|
+
buffer: Uint8Array,
|
|
116
|
+
_offset?: number,
|
|
117
|
+
length?: number,
|
|
118
|
+
_position?: number | null,
|
|
119
|
+
) => {
|
|
120
|
+
writes.push({
|
|
121
|
+
bytes: Array.from(buffer.subarray(0, length ?? buffer.length)),
|
|
122
|
+
fd,
|
|
123
|
+
})
|
|
124
|
+
return length ?? buffer.length
|
|
125
|
+
},
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
;(globalThis as any).Deno = {
|
|
129
|
+
stderr: {},
|
|
130
|
+
stdout: {},
|
|
131
|
+
}
|
|
132
|
+
;(globalThis as any).process = {
|
|
133
|
+
getBuiltinModule: vi.fn(() => ({
|
|
134
|
+
readSync: vi.fn(),
|
|
135
|
+
writeSync,
|
|
136
|
+
})),
|
|
137
|
+
}
|
|
138
|
+
resetHostRuntimeForTests()
|
|
139
|
+
|
|
140
|
+
writeHostStdoutText('bun\n')
|
|
141
|
+
writeHostStderrText('err\n')
|
|
142
|
+
|
|
143
|
+
expect(writeSync).toHaveBeenCalledTimes(2)
|
|
144
|
+
expect(writes).toEqual([
|
|
145
|
+
{ bytes: [98, 117, 110, 10], fd: 1 },
|
|
146
|
+
{ bytes: [101, 114, 114, 10], fd: 2 },
|
|
147
|
+
])
|
|
148
|
+
expect(getHostRuntime().platform).toBe('unknown')
|
|
149
|
+
})
|
|
150
|
+
|
|
151
|
+
it('prefers Deno sync stdio when it is available', () => {
|
|
152
|
+
const denoWrites: Array<{ bytes: number[]; stream: string }> = []
|
|
153
|
+
const nodeWriteSync = vi.fn()
|
|
154
|
+
const denoWriteSync = vi.fn((buffer: Uint8Array) => {
|
|
155
|
+
denoWrites.push({
|
|
156
|
+
bytes: Array.from(buffer),
|
|
157
|
+
stream: 'stdout',
|
|
158
|
+
})
|
|
159
|
+
return buffer.length
|
|
160
|
+
})
|
|
161
|
+
|
|
162
|
+
;(globalThis as any).Deno = {
|
|
163
|
+
build: { os: 'darwin' },
|
|
164
|
+
stdout: { writeSync: denoWriteSync },
|
|
165
|
+
}
|
|
166
|
+
;(globalThis as any).process = {
|
|
167
|
+
getBuiltinModule: vi.fn(() => ({
|
|
168
|
+
readSync: vi.fn(),
|
|
169
|
+
writeSync: nodeWriteSync,
|
|
170
|
+
})),
|
|
171
|
+
}
|
|
172
|
+
resetHostRuntimeForTests()
|
|
173
|
+
|
|
174
|
+
writeHostStdoutText('deno\n')
|
|
175
|
+
|
|
176
|
+
expect(denoWriteSync).toHaveBeenCalledTimes(1)
|
|
177
|
+
expect(nodeWriteSync).not.toHaveBeenCalled()
|
|
178
|
+
expect(denoWrites).toEqual([
|
|
179
|
+
{ bytes: [100, 101, 110, 111, 10], stream: 'stdout' },
|
|
180
|
+
])
|
|
181
|
+
expect(getHostRuntime().platform).toBe('darwin')
|
|
182
|
+
})
|
|
183
|
+
|
|
184
|
+
it('uses console fallback in browser-like hosts', () => {
|
|
185
|
+
const consoleLog = vi.spyOn(console, 'log').mockImplementation(() => {})
|
|
186
|
+
|
|
187
|
+
delete (globalThis as any).Deno
|
|
188
|
+
delete (globalThis as any).process
|
|
189
|
+
resetHostRuntimeForTests()
|
|
190
|
+
|
|
191
|
+
writeHostStdoutText('browser\n')
|
|
192
|
+
|
|
193
|
+
expect(getHostRuntime().platform).toBe('unknown')
|
|
194
|
+
expect(getHostRuntime().nodeFS).toBeNull()
|
|
195
|
+
expect(consoleLog).toHaveBeenCalledWith('browser')
|
|
196
|
+
})
|
|
197
|
+
})
|
|
198
|
+
|
|
199
|
+
describe('hostio isMainScript', () => {
|
|
200
|
+
it('returns true when the runtime marks the module as main', () => {
|
|
201
|
+
expect(
|
|
202
|
+
isMainScript({
|
|
203
|
+
main: true,
|
|
204
|
+
url: 'file:///tmp/example.gs.ts',
|
|
205
|
+
}),
|
|
206
|
+
).toBe(true)
|
|
207
|
+
})
|
|
208
|
+
|
|
209
|
+
it('matches process argv[1] against the module url', () => {
|
|
210
|
+
delete (globalThis as any).Deno
|
|
211
|
+
;(globalThis as any).process = {
|
|
212
|
+
argv: ['bun', './dist/app.gs.ts'],
|
|
213
|
+
cwd: vi.fn(() => '/tmp/project'),
|
|
214
|
+
getBuiltinModule: vi.fn(() => ({
|
|
215
|
+
readSync: vi.fn(),
|
|
216
|
+
writeSync: vi.fn(),
|
|
217
|
+
})),
|
|
218
|
+
}
|
|
219
|
+
resetHostRuntimeForTests()
|
|
220
|
+
|
|
221
|
+
expect(
|
|
222
|
+
isMainScript({
|
|
223
|
+
url: 'file:///tmp/project/dist/app.gs.ts',
|
|
224
|
+
}),
|
|
225
|
+
).toBe(true)
|
|
226
|
+
})
|
|
227
|
+
|
|
228
|
+
it('returns false when the module was imported instead of executed', () => {
|
|
229
|
+
delete (globalThis as any).Deno
|
|
230
|
+
;(globalThis as any).process = {
|
|
231
|
+
argv: ['bun', './runner.ts'],
|
|
232
|
+
cwd: vi.fn(() => '/tmp/project'),
|
|
233
|
+
getBuiltinModule: vi.fn(() => ({
|
|
234
|
+
readSync: vi.fn(),
|
|
235
|
+
writeSync: vi.fn(),
|
|
236
|
+
})),
|
|
237
|
+
}
|
|
238
|
+
resetHostRuntimeForTests()
|
|
239
|
+
|
|
240
|
+
expect(
|
|
241
|
+
isMainScript({
|
|
242
|
+
url: 'file:///tmp/project/dist/app.gs.ts',
|
|
243
|
+
}),
|
|
244
|
+
).toBe(false)
|
|
245
|
+
})
|
|
69
246
|
})
|