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
|
@@ -35,6 +35,53 @@ func TestOverrideRegistryPlansRuntimeAndOverrideDependencies(t *testing.T) {
|
|
|
35
35
|
}
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
+
func TestOverrideRegistryFactsAreImmutable(t *testing.T) {
|
|
39
|
+
owner := NewOverrideRegistryOwner()
|
|
40
|
+
facts, diagnostics := owner.Facts(context.Background())
|
|
41
|
+
if diagnosticsHaveErrors(diagnostics) {
|
|
42
|
+
t.Fatalf("override facts failed: %#v", diagnostics)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
metadata := facts.Metadata("sync")
|
|
46
|
+
if !metadata.AsyncMethods["Map.Load"] {
|
|
47
|
+
t.Fatalf("expected sync Map.Load async metadata")
|
|
48
|
+
}
|
|
49
|
+
metadata.AsyncMethods["Map.Load"] = false
|
|
50
|
+
metadata.Dependencies = append(metadata.Dependencies, "mutated")
|
|
51
|
+
|
|
52
|
+
metadata = facts.Metadata("sync")
|
|
53
|
+
if !metadata.AsyncMethods["Map.Load"] {
|
|
54
|
+
t.Fatalf("override metadata mutation leaked back into facts")
|
|
55
|
+
}
|
|
56
|
+
if slices.Contains(metadata.Dependencies, "mutated") {
|
|
57
|
+
t.Fatalf("override dependency mutation leaked back into facts: %v", metadata.Dependencies)
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
pkg, dependencies, ok := facts.copyPackage("fmt")
|
|
61
|
+
if !ok {
|
|
62
|
+
t.Fatalf("missing fmt copy package facts")
|
|
63
|
+
}
|
|
64
|
+
if !slices.Contains(dependencies, "errors") {
|
|
65
|
+
t.Fatalf("expected fmt dependency on errors, got %v", dependencies)
|
|
66
|
+
}
|
|
67
|
+
dependencies = append(dependencies, "mutated")
|
|
68
|
+
if len(pkg.files) == 0 {
|
|
69
|
+
t.Fatalf("expected fmt copy files")
|
|
70
|
+
}
|
|
71
|
+
pkg.files[0].data[0] = '!'
|
|
72
|
+
|
|
73
|
+
pkg, dependencies, ok = facts.copyPackage("fmt")
|
|
74
|
+
if !ok {
|
|
75
|
+
t.Fatalf("missing fmt copy package facts after mutation")
|
|
76
|
+
}
|
|
77
|
+
if slices.Contains(dependencies, "mutated") {
|
|
78
|
+
t.Fatalf("copy dependency mutation leaked back into facts: %v", dependencies)
|
|
79
|
+
}
|
|
80
|
+
if len(pkg.files) == 0 || pkg.files[0].data[0] == '!' {
|
|
81
|
+
t.Fatalf("copy file mutation leaked back into facts")
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
38
85
|
func TestOverrideRegistryCopiesRuntimeAndOverrides(t *testing.T) {
|
|
39
86
|
owner := NewOverrideRegistryOwner()
|
|
40
87
|
req := &CompileRequest{
|
|
@@ -71,6 +118,47 @@ func TestOverrideRegistryCopiesRuntimeAndOverrides(t *testing.T) {
|
|
|
71
118
|
}
|
|
72
119
|
}
|
|
73
120
|
|
|
121
|
+
func TestOverrideRegistryCopiesExternalOverride(t *testing.T) {
|
|
122
|
+
overrideDir := filepath.Join(t.TempDir(), "gs")
|
|
123
|
+
writeFixtureFile(t, overrideDir, "example.test/lib/index.ts", strings.Join([]string{
|
|
124
|
+
"import * as helper from '@goscript/example.test/helper/index.js'",
|
|
125
|
+
"export function Run(): void { helper.Run() }",
|
|
126
|
+
"",
|
|
127
|
+
}, "\n"))
|
|
128
|
+
writeFixtureFile(t, overrideDir, "example.test/lib/meta.json", `{"dependencies":["example.test/helper"]}`)
|
|
129
|
+
writeFixtureFile(t, overrideDir, "example.test/helper/index.ts", "export function Run(): void {}\n")
|
|
130
|
+
|
|
131
|
+
owner := NewOverrideRegistryOwner(overrideDir)
|
|
132
|
+
req := &CompileRequest{
|
|
133
|
+
OutputPath: filepath.Join(t.TempDir(), "out"),
|
|
134
|
+
RuntimeEmissionMode: RuntimeEmissionModeEmit,
|
|
135
|
+
}
|
|
136
|
+
plan, diagnostics := owner.CopyPlan(context.Background(), req, &PackageGraph{Nodes: []*PackageGraphNode{{
|
|
137
|
+
PkgPath: "example.test/lib",
|
|
138
|
+
OverrideCandidate: true,
|
|
139
|
+
}}})
|
|
140
|
+
if diagnosticsHaveErrors(diagnostics) {
|
|
141
|
+
t.Fatalf("copy plan failed: %#v", diagnostics)
|
|
142
|
+
}
|
|
143
|
+
copied, diagnostics := owner.CopyPackages(context.Background(), req, plan)
|
|
144
|
+
if diagnosticsHaveErrors(diagnostics) {
|
|
145
|
+
t.Fatalf("copy failed: %#v", diagnostics)
|
|
146
|
+
}
|
|
147
|
+
for _, pkg := range []string{"builtin", "example.test/helper", "example.test/lib"} {
|
|
148
|
+
if !slices.Contains(copied, pkg) {
|
|
149
|
+
t.Fatalf("missing copied package %s in %v", pkg, copied)
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
for _, path := range []string{
|
|
153
|
+
"@goscript/example.test/helper/index.ts",
|
|
154
|
+
"@goscript/example.test/lib/index.ts",
|
|
155
|
+
} {
|
|
156
|
+
if _, err := os.Stat(filepath.Join(req.OutputPath, filepath.FromSlash(path))); err != nil {
|
|
157
|
+
t.Fatalf("expected copied file %s: %v", path, err)
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
74
162
|
func TestOverrideRegistryReportsMissingOverridePackage(t *testing.T) {
|
|
75
163
|
_, diagnostics := NewOverrideRegistryOwner().CopyPlan(context.Background(), &CompileRequest{
|
|
76
164
|
RuntimeEmissionMode: RuntimeEmissionModeEmit,
|
|
@@ -205,3 +293,97 @@ func TestCompilePackagesAwaitsOverrideAsyncMethods(t *testing.T) {
|
|
|
205
293
|
t.Fatalf("override async method call was not awaited:\n%s", string(content))
|
|
206
294
|
}
|
|
207
295
|
}
|
|
296
|
+
|
|
297
|
+
func TestCompilePackagesPropagatesOverrideAsyncInterfaceMethods(t *testing.T) {
|
|
298
|
+
moduleDir := writePackageGraphFixture(t, map[string]string{
|
|
299
|
+
"go.mod": "module example.test/overrideasynciface\n\ngo 1.25.3\n",
|
|
300
|
+
"main.go": strings.Join([]string{
|
|
301
|
+
"package main",
|
|
302
|
+
"import \"net/http\"",
|
|
303
|
+
"type client struct { rt http.RoundTripper }",
|
|
304
|
+
"func (c *client) Do(req *http.Request) (*http.Response, error) {",
|
|
305
|
+
" return c.rt.RoundTrip(req)",
|
|
306
|
+
"}",
|
|
307
|
+
"func Use(c *client, req *http.Request) (*http.Response, error) {",
|
|
308
|
+
" return c.Do(req)",
|
|
309
|
+
"}",
|
|
310
|
+
"func main() {}",
|
|
311
|
+
"",
|
|
312
|
+
}, "\n"),
|
|
313
|
+
})
|
|
314
|
+
out := filepath.Join(t.TempDir(), "out")
|
|
315
|
+
comp, err := NewCompiler(&Config{
|
|
316
|
+
Dir: moduleDir,
|
|
317
|
+
OutputPath: out,
|
|
318
|
+
AllDependencies: true,
|
|
319
|
+
}, nil, nil)
|
|
320
|
+
if err != nil {
|
|
321
|
+
t.Fatal(err.Error())
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
if _, err := comp.CompilePackages(context.Background(), "."); err != nil {
|
|
325
|
+
t.Fatal(err.Error())
|
|
326
|
+
}
|
|
327
|
+
content, err := os.ReadFile(filepath.Join(out, "@goscript", "example.test", "overrideasynciface", "main.gs.ts"))
|
|
328
|
+
if err != nil {
|
|
329
|
+
t.Fatal(err.Error())
|
|
330
|
+
}
|
|
331
|
+
text := string(content)
|
|
332
|
+
for _, want := range []string{
|
|
333
|
+
"public async Do(req: http.Request | $.VarRef<http.Request> | null): globalThis.Promise<[http.Response | $.VarRef<http.Response> | null, $.GoError]>",
|
|
334
|
+
"return await $.pointerValue<Exclude<http.RoundTripper, null>>($.pointerValue<client>(c).rt).RoundTrip(req)",
|
|
335
|
+
"export async function Use(c: client | $.VarRef<client> | null, req: http.Request | $.VarRef<http.Request> | null): globalThis.Promise<[http.Response | $.VarRef<http.Response> | null, $.GoError]>",
|
|
336
|
+
"return await client.prototype.Do.call(c, req)",
|
|
337
|
+
} {
|
|
338
|
+
if !strings.Contains(text, want) {
|
|
339
|
+
t.Fatalf("missing %q in generated output:\n%s", want, text)
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
func TestCompilePackagesAwaitsOverrideAsyncFunctions(t *testing.T) {
|
|
345
|
+
moduleDir := writePackageGraphFixture(t, map[string]string{
|
|
346
|
+
"go.mod": "module example.test/overrideasyncfunc\n\ngo 1.25.3\n",
|
|
347
|
+
"main.go": strings.Join([]string{
|
|
348
|
+
"package main",
|
|
349
|
+
"import (",
|
|
350
|
+
" \"io/fs\"",
|
|
351
|
+
" \"path/filepath\"",
|
|
352
|
+
" \"sync\"",
|
|
353
|
+
")",
|
|
354
|
+
"func main() {",
|
|
355
|
+
" var m sync.Map",
|
|
356
|
+
" _ = filepath.WalkDir(\".\", func(path string, d fs.DirEntry, err error) error {",
|
|
357
|
+
" if _, ok := m.Load(path); ok {",
|
|
358
|
+
" return nil",
|
|
359
|
+
" }",
|
|
360
|
+
" return nil",
|
|
361
|
+
" })",
|
|
362
|
+
"}",
|
|
363
|
+
"",
|
|
364
|
+
}, "\n"),
|
|
365
|
+
})
|
|
366
|
+
out := filepath.Join(t.TempDir(), "out")
|
|
367
|
+
comp, err := NewCompiler(&Config{
|
|
368
|
+
Dir: moduleDir,
|
|
369
|
+
OutputPath: out,
|
|
370
|
+
AllDependencies: true,
|
|
371
|
+
}, nil, nil)
|
|
372
|
+
if err != nil {
|
|
373
|
+
t.Fatal(err.Error())
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
if _, err := comp.CompilePackages(context.Background(), "."); err != nil {
|
|
377
|
+
t.Fatal(err.Error())
|
|
378
|
+
}
|
|
379
|
+
content, err := os.ReadFile(filepath.Join(out, "@goscript", "example.test", "overrideasyncfunc", "main.gs.ts"))
|
|
380
|
+
if err != nil {
|
|
381
|
+
t.Fatal(err.Error())
|
|
382
|
+
}
|
|
383
|
+
if !strings.Contains(string(content), "await filepath.WalkDir") {
|
|
384
|
+
t.Fatalf("override async function call was not awaited:\n%s", string(content))
|
|
385
|
+
}
|
|
386
|
+
if !strings.Contains(string(content), "$.functionValue(async") {
|
|
387
|
+
t.Fatalf("walk callback was not lowered as async:\n%s", string(content))
|
|
388
|
+
}
|
|
389
|
+
}
|
|
@@ -3,9 +3,9 @@ package compiler
|
|
|
3
3
|
import (
|
|
4
4
|
"context"
|
|
5
5
|
"os"
|
|
6
|
-
"
|
|
6
|
+
"slices"
|
|
7
|
+
"strings"
|
|
7
8
|
|
|
8
|
-
gs "github.com/aperturerobotics/goscript"
|
|
9
9
|
"golang.org/x/tools/go/packages"
|
|
10
10
|
)
|
|
11
11
|
|
|
@@ -35,6 +35,8 @@ type PackageGraphNode struct {
|
|
|
35
35
|
ModulePath string
|
|
36
36
|
// ModuleDir is the owning module directory when known.
|
|
37
37
|
ModuleDir string
|
|
38
|
+
// ForTest is the package path under test for Go test variants.
|
|
39
|
+
ForTest string
|
|
38
40
|
// GoFiles are the package source files.
|
|
39
41
|
GoFiles []string
|
|
40
42
|
// CompiledGoFiles are files selected by build constraints.
|
|
@@ -48,11 +50,17 @@ type PackageGraphNode struct {
|
|
|
48
50
|
}
|
|
49
51
|
|
|
50
52
|
// PackageGraphOwner owns Go package loading and graph identity.
|
|
51
|
-
type PackageGraphOwner struct{
|
|
53
|
+
type PackageGraphOwner struct {
|
|
54
|
+
overrideOwner *OverrideRegistryOwner
|
|
55
|
+
}
|
|
52
56
|
|
|
53
57
|
// NewPackageGraphOwner creates the package graph owner.
|
|
54
|
-
func NewPackageGraphOwner() *PackageGraphOwner {
|
|
55
|
-
|
|
58
|
+
func NewPackageGraphOwner(overrideOwners ...*OverrideRegistryOwner) *PackageGraphOwner {
|
|
59
|
+
overrideOwner := NewOverrideRegistryOwner()
|
|
60
|
+
if len(overrideOwners) != 0 && overrideOwners[0] != nil {
|
|
61
|
+
overrideOwner = overrideOwners[0]
|
|
62
|
+
}
|
|
63
|
+
return &PackageGraphOwner{overrideOwner: overrideOwner}
|
|
56
64
|
}
|
|
57
65
|
|
|
58
66
|
// Load builds the package graph for a validated request.
|
|
@@ -69,8 +77,8 @@ func (o *PackageGraphOwner) Load(ctx context.Context, req *CompileRequest) (*Pac
|
|
|
69
77
|
Context: ctx,
|
|
70
78
|
Dir: req.Dir,
|
|
71
79
|
Env: append(os.Environ(), "GOOS=js", "GOARCH=wasm"),
|
|
72
|
-
BuildFlags:
|
|
73
|
-
Tests:
|
|
80
|
+
BuildFlags: goScriptBuildFlags(req.BuildFlags),
|
|
81
|
+
Tests: req.Tests,
|
|
74
82
|
Mode: packages.NeedName |
|
|
75
83
|
packages.NeedFiles |
|
|
76
84
|
packages.NeedCompiledGoFiles |
|
|
@@ -81,6 +89,7 @@ func (o *PackageGraphOwner) Load(ctx context.Context, req *CompileRequest) (*Pac
|
|
|
81
89
|
packages.NeedSyntax |
|
|
82
90
|
packages.NeedTypesInfo |
|
|
83
91
|
packages.NeedTypesSizes |
|
|
92
|
+
packages.NeedForTest |
|
|
84
93
|
packages.NeedModule,
|
|
85
94
|
}
|
|
86
95
|
pkgs, err := packages.Load(cfg, req.Patterns...)
|
|
@@ -99,6 +108,10 @@ func (o *PackageGraphOwner) Load(ctx context.Context, req *CompileRequest) (*Pac
|
|
|
99
108
|
Message: "package patterns did not match any packages",
|
|
100
109
|
}}
|
|
101
110
|
}
|
|
111
|
+
overrideFacts, overrideDiagnostics := o.overrideOwner.Facts(ctx)
|
|
112
|
+
if diagnosticsHaveErrors(overrideDiagnostics) {
|
|
113
|
+
return nil, overrideDiagnostics
|
|
114
|
+
}
|
|
102
115
|
|
|
103
116
|
graph := &PackageGraph{
|
|
104
117
|
RequestedPatterns: append([]string(nil), req.Patterns...),
|
|
@@ -109,23 +122,29 @@ func (o *PackageGraphOwner) Load(ctx context.Context, req *CompileRequest) (*Pac
|
|
|
109
122
|
|
|
110
123
|
requested := make(map[string]bool)
|
|
111
124
|
for _, pkg := range pkgs {
|
|
125
|
+
if isTestMainPackage(pkg) {
|
|
126
|
+
continue
|
|
127
|
+
}
|
|
112
128
|
path := packagePath(pkg)
|
|
113
129
|
requested[path] = true
|
|
114
130
|
graph.RequestedPackagePaths = append(graph.RequestedPackagePaths, path)
|
|
115
131
|
}
|
|
116
|
-
|
|
132
|
+
slices.Sort(graph.RequestedPackagePaths)
|
|
117
133
|
|
|
118
134
|
var diagnostics []Diagnostic
|
|
119
135
|
seen := make(map[string]bool)
|
|
120
136
|
for _, pkg := range pkgs {
|
|
121
|
-
|
|
137
|
+
if isTestMainPackage(pkg) {
|
|
138
|
+
continue
|
|
139
|
+
}
|
|
140
|
+
o.collect(graph, pkg, req.DependencyMode, requested, overrideFacts, seen)
|
|
122
141
|
diagnostics = append(diagnostics, packageDiagnostics(pkg)...)
|
|
123
142
|
}
|
|
124
|
-
|
|
125
|
-
if
|
|
126
|
-
return
|
|
143
|
+
slices.SortFunc(graph.Nodes, func(a, b *PackageGraphNode) int {
|
|
144
|
+
if a.PkgPath == b.PkgPath {
|
|
145
|
+
return strings.Compare(a.ID, b.ID)
|
|
127
146
|
}
|
|
128
|
-
return
|
|
147
|
+
return strings.Compare(a.PkgPath, b.PkgPath)
|
|
129
148
|
})
|
|
130
149
|
if len(graph.Nodes) == 0 {
|
|
131
150
|
diagnostics = append(diagnostics, Diagnostic{
|
|
@@ -142,15 +161,22 @@ func (o *PackageGraphOwner) collect(
|
|
|
142
161
|
pkg *packages.Package,
|
|
143
162
|
mode DependencyMode,
|
|
144
163
|
requested map[string]bool,
|
|
164
|
+
overrideFacts *OverrideFacts,
|
|
145
165
|
seen map[string]bool,
|
|
146
166
|
) {
|
|
147
167
|
if pkg == nil || seen[pkg.ID] {
|
|
148
168
|
return
|
|
149
169
|
}
|
|
170
|
+
if pkg.ForTest != "" && !requested[pkg.ForTest] {
|
|
171
|
+
if prod := pkg.Imports[pkg.ForTest]; prod != nil {
|
|
172
|
+
o.collect(graph, prod, mode, requested, overrideFacts, seen)
|
|
173
|
+
}
|
|
174
|
+
return
|
|
175
|
+
}
|
|
150
176
|
seen[pkg.ID] = true
|
|
151
177
|
|
|
152
178
|
path := packagePath(pkg)
|
|
153
|
-
node := newPackageGraphNode(pkg, requested[path])
|
|
179
|
+
node := newPackageGraphNode(pkg, requested[path], overrideFacts)
|
|
154
180
|
graph.Nodes = append(graph.Nodes, node)
|
|
155
181
|
graph.NodesByPackagePath[path] = node
|
|
156
182
|
graph.packagesByPath[path] = pkg
|
|
@@ -162,18 +188,18 @@ func (o *PackageGraphOwner) collect(
|
|
|
162
188
|
for importPath := range pkg.Imports {
|
|
163
189
|
imports = append(imports, importPath)
|
|
164
190
|
}
|
|
165
|
-
|
|
191
|
+
slices.Sort(imports)
|
|
166
192
|
for _, importPath := range imports {
|
|
167
|
-
o.collect(graph, pkg.Imports[importPath], mode, requested, seen)
|
|
193
|
+
o.collect(graph, pkg.Imports[importPath], mode, requested, overrideFacts, seen)
|
|
168
194
|
}
|
|
169
195
|
}
|
|
170
196
|
|
|
171
|
-
func newPackageGraphNode(pkg *packages.Package, requested bool) *PackageGraphNode {
|
|
197
|
+
func newPackageGraphNode(pkg *packages.Package, requested bool, overrideFacts *OverrideFacts) *PackageGraphNode {
|
|
172
198
|
imports := make([]string, 0, len(pkg.Imports))
|
|
173
199
|
for importPath := range pkg.Imports {
|
|
174
200
|
imports = append(imports, importPath)
|
|
175
201
|
}
|
|
176
|
-
|
|
202
|
+
slices.Sort(imports)
|
|
177
203
|
|
|
178
204
|
var modulePath string
|
|
179
205
|
var moduleDir string
|
|
@@ -188,14 +214,19 @@ func newPackageGraphNode(pkg *packages.Package, requested bool) *PackageGraphNod
|
|
|
188
214
|
Name: pkg.Name,
|
|
189
215
|
ModulePath: modulePath,
|
|
190
216
|
ModuleDir: moduleDir,
|
|
217
|
+
ForTest: pkg.ForTest,
|
|
191
218
|
GoFiles: append([]string(nil), pkg.GoFiles...),
|
|
192
219
|
CompiledGoFiles: append([]string(nil), pkg.CompiledGoFiles...),
|
|
193
220
|
Imports: imports,
|
|
194
221
|
Requested: requested,
|
|
195
|
-
OverrideCandidate:
|
|
222
|
+
OverrideCandidate: overrideFacts.HasPackage(packagePath(pkg)),
|
|
196
223
|
}
|
|
197
224
|
}
|
|
198
225
|
|
|
226
|
+
func isTestMainPackage(pkg *packages.Package) bool {
|
|
227
|
+
return pkg != nil && pkg.ForTest == "" && pkg.Name == "main" && strings.HasSuffix(packagePath(pkg), ".test")
|
|
228
|
+
}
|
|
229
|
+
|
|
199
230
|
func packagePath(pkg *packages.Package) string {
|
|
200
231
|
if pkg == nil {
|
|
201
232
|
return ""
|
|
@@ -221,11 +252,3 @@ func packageDiagnostics(pkg *packages.Package) []Diagnostic {
|
|
|
221
252
|
}
|
|
222
253
|
return diagnostics
|
|
223
254
|
}
|
|
224
|
-
|
|
225
|
-
func hasOverrideCandidate(pkgPath string) bool {
|
|
226
|
-
if pkgPath == "" {
|
|
227
|
-
return false
|
|
228
|
-
}
|
|
229
|
-
_, err := gs.GsOverrides.ReadFile("gs/" + pkgPath + "/index.ts")
|
|
230
|
-
return err == nil
|
|
231
|
-
}
|
|
@@ -176,6 +176,37 @@ func TestPackageGraphHonorsBuildFlags(t *testing.T) {
|
|
|
176
176
|
}
|
|
177
177
|
}
|
|
178
178
|
|
|
179
|
+
func TestPackageGraphAddsGoScriptBuildTag(t *testing.T) {
|
|
180
|
+
moduleDir := writePackageGraphFixture(t, map[string]string{
|
|
181
|
+
"go.mod": "module example.test/goscripttag\n\ngo 1.25.3\n",
|
|
182
|
+
"default.go": "package goscripttag\nconst Selected = \"default\"\n",
|
|
183
|
+
"goscript.go": "//go:build goscript\n\npackage goscripttag\nconst GoScript = true\n",
|
|
184
|
+
"excluded.go": "//go:build !goscript\n\npackage goscripttag\nconst Excluded = true\n",
|
|
185
|
+
"customtag.go": "//go:build customtag\n\npackage goscripttag\nconst Custom = true\n",
|
|
186
|
+
})
|
|
187
|
+
graph := loadPackageGraph(t, &CompileRequest{
|
|
188
|
+
Patterns: []string{"."},
|
|
189
|
+
Dir: moduleDir,
|
|
190
|
+
OutputPath: filepath.Join(t.TempDir(), "out"),
|
|
191
|
+
BuildFlags: []string{"-tags=customtag"},
|
|
192
|
+
DependencyMode: DependencyModeRequested,
|
|
193
|
+
RuntimeEmissionMode: RuntimeEmissionModeEmit,
|
|
194
|
+
})
|
|
195
|
+
|
|
196
|
+
var compiled []string
|
|
197
|
+
for _, file := range graph.Nodes[0].CompiledGoFiles {
|
|
198
|
+
compiled = append(compiled, filepath.Base(file))
|
|
199
|
+
}
|
|
200
|
+
for _, expected := range []string{"default.go", "goscript.go", "customtag.go"} {
|
|
201
|
+
if !slices.Contains(compiled, expected) {
|
|
202
|
+
t.Fatalf("expected %s in compiled files: %v", expected, compiled)
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
if slices.Contains(compiled, "excluded.go") {
|
|
206
|
+
t.Fatalf("did not expect excluded.go in compiled files: %v", compiled)
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
179
210
|
func TestPackageGraphLoadsLocalReplacement(t *testing.T) {
|
|
180
211
|
moduleDir := writePackageGraphFixture(t, map[string]string{
|
|
181
212
|
"go.mod": strings.Join([]string{
|
|
@@ -227,14 +258,67 @@ func TestPackageGraphDetectsOverrideCandidates(t *testing.T) {
|
|
|
227
258
|
}
|
|
228
259
|
}
|
|
229
260
|
|
|
261
|
+
func TestPackageGraphDetectsExternalOverrideCandidates(t *testing.T) {
|
|
262
|
+
moduleDir := writePackageGraphFixture(t, map[string]string{
|
|
263
|
+
"go.mod": strings.Join([]string{
|
|
264
|
+
"module example.test/externaloverride",
|
|
265
|
+
"",
|
|
266
|
+
"go 1.25.3",
|
|
267
|
+
"",
|
|
268
|
+
"require example.test/lib v0.0.0",
|
|
269
|
+
"replace example.test/lib => ./lib",
|
|
270
|
+
"",
|
|
271
|
+
}, "\n"),
|
|
272
|
+
"main.go": "package main\nimport \"example.test/lib\"\nfunc main() { lib.Run() }\n",
|
|
273
|
+
"lib/go.mod": strings.Join([]string{
|
|
274
|
+
"module example.test/lib",
|
|
275
|
+
"",
|
|
276
|
+
"go 1.25.3",
|
|
277
|
+
"",
|
|
278
|
+
"require example.test/heavy v0.0.0",
|
|
279
|
+
"replace example.test/heavy => ../heavy",
|
|
280
|
+
"",
|
|
281
|
+
}, "\n"),
|
|
282
|
+
"lib/lib.go": "package lib\nimport \"example.test/heavy\"\nfunc Run() { heavy.Run() }\n",
|
|
283
|
+
"heavy/go.mod": "module example.test/heavy\n\ngo 1.25.3\n",
|
|
284
|
+
"heavy/heavy.go": "package heavy\nfunc Run() {}\n",
|
|
285
|
+
})
|
|
286
|
+
overrideDir := filepath.Join(t.TempDir(), "gs")
|
|
287
|
+
writeFixtureFile(t, overrideDir, "example.test/lib/index.ts", "export function Run(): void {}\n")
|
|
288
|
+
|
|
289
|
+
overrideOwner := NewOverrideRegistryOwner(overrideDir)
|
|
290
|
+
req := &CompileRequest{
|
|
291
|
+
Patterns: []string{"."},
|
|
292
|
+
Dir: moduleDir,
|
|
293
|
+
OutputPath: filepath.Join(t.TempDir(), "out"),
|
|
294
|
+
DependencyMode: DependencyModeAll,
|
|
295
|
+
RuntimeEmissionMode: RuntimeEmissionModeEmit,
|
|
296
|
+
}
|
|
297
|
+
graph, diagnostics := NewPackageGraphOwner(overrideOwner).Load(context.Background(), req)
|
|
298
|
+
if diagnosticsHaveErrors(diagnostics) {
|
|
299
|
+
t.Fatalf("package graph failed: %#v", diagnostics)
|
|
300
|
+
}
|
|
301
|
+
lib := graph.NodesByPackagePath["example.test/lib"]
|
|
302
|
+
if lib == nil || !lib.OverrideCandidate {
|
|
303
|
+
t.Fatalf("expected external override candidate for lib")
|
|
304
|
+
}
|
|
305
|
+
if graph.NodesByPackagePath["example.test/heavy"] != nil {
|
|
306
|
+
t.Fatalf("external override dependency should not be collected")
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
|
|
230
310
|
func TestPackageGraphOverrideCandidatesRequirePackageIndex(t *testing.T) {
|
|
231
311
|
parent := "github.com/aperturerobotics/wasivm/wazero/kernel"
|
|
232
312
|
child := parent + "/runtime"
|
|
313
|
+
facts, diagnostics := NewOverrideRegistryOwner().Facts(context.Background())
|
|
314
|
+
if diagnosticsHaveErrors(diagnostics) {
|
|
315
|
+
t.Fatalf("override facts failed: %#v", diagnostics)
|
|
316
|
+
}
|
|
233
317
|
|
|
234
|
-
if
|
|
318
|
+
if facts.HasPackage(parent) {
|
|
235
319
|
t.Fatalf("parent directory without an override index was detected as an override candidate")
|
|
236
320
|
}
|
|
237
|
-
if !
|
|
321
|
+
if !facts.HasPackage(child) {
|
|
238
322
|
t.Fatalf("nested package with an override index was not detected as an override candidate")
|
|
239
323
|
}
|
|
240
324
|
}
|
|
@@ -258,17 +342,23 @@ func writePackageGraphFixture(t *testing.T, files map[string]string) string {
|
|
|
258
342
|
|
|
259
343
|
dir := t.TempDir()
|
|
260
344
|
for name, contents := range files {
|
|
261
|
-
|
|
262
|
-
if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil {
|
|
263
|
-
t.Fatal(err.Error())
|
|
264
|
-
}
|
|
265
|
-
if err := os.WriteFile(path, []byte(contents), 0o644); err != nil {
|
|
266
|
-
t.Fatal(err.Error())
|
|
267
|
-
}
|
|
345
|
+
writeFixtureFile(t, dir, name, contents)
|
|
268
346
|
}
|
|
269
347
|
return dir
|
|
270
348
|
}
|
|
271
349
|
|
|
350
|
+
func writeFixtureFile(t *testing.T, root, name, contents string) {
|
|
351
|
+
t.Helper()
|
|
352
|
+
|
|
353
|
+
path := filepath.Join(root, filepath.FromSlash(name))
|
|
354
|
+
if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil {
|
|
355
|
+
t.Fatal(err.Error())
|
|
356
|
+
}
|
|
357
|
+
if err := os.WriteFile(path, []byte(contents), 0o644); err != nil {
|
|
358
|
+
t.Fatal(err.Error())
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
|
|
272
362
|
func requireDiagnosticCode(t *testing.T, diagnostics []Diagnostic, code string) {
|
|
273
363
|
t.Helper()
|
|
274
364
|
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
package compiler
|
|
2
|
+
|
|
3
|
+
// PackageTestFunction describes one discovered ordinary Go test function.
|
|
4
|
+
type PackageTestFunction struct {
|
|
5
|
+
// Name is the Go TestXxx function name.
|
|
6
|
+
Name string
|
|
7
|
+
// PackagePath is the package variant that exports the function.
|
|
8
|
+
PackagePath string
|
|
9
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
package compiler
|
|
2
|
+
|
|
3
|
+
import "golang.org/x/tools/go/packages"
|
|
4
|
+
|
|
5
|
+
// PackageTestGraphPackage describes one requested package under test.
|
|
6
|
+
type PackageTestGraphPackage struct {
|
|
7
|
+
// PackagePath is the package under test.
|
|
8
|
+
PackagePath string
|
|
9
|
+
// PackageName is the base package name.
|
|
10
|
+
PackageName string
|
|
11
|
+
// PackageID is the go/packages package identity for the package under test.
|
|
12
|
+
PackageID string
|
|
13
|
+
// GoFiles are the package source files.
|
|
14
|
+
GoFiles []string
|
|
15
|
+
// CompiledGoFiles are files selected by build constraints.
|
|
16
|
+
CompiledGoFiles []string
|
|
17
|
+
// SamePackageTests is the same-package test variant when present.
|
|
18
|
+
SamePackageTests *PackageTestGraphVariant
|
|
19
|
+
// ExternalPackageTests is the external-package test variant when present.
|
|
20
|
+
ExternalPackageTests *PackageTestGraphVariant
|
|
21
|
+
// Diagnostics are package or variant load diagnostics attached to this package.
|
|
22
|
+
Diagnostics []Diagnostic
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// HasTests returns true when the package has any loaded test variant.
|
|
26
|
+
func (p *PackageTestGraphPackage) HasTests() bool {
|
|
27
|
+
return p != nil && (p.SamePackageTests != nil || p.ExternalPackageTests != nil)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
func (p *PackageTestGraphPackage) appendDiagnostics(diagnostics []Diagnostic) {
|
|
31
|
+
p.Diagnostics = append(p.Diagnostics, diagnostics...)
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
func (p *PackageTestGraphPackage) setPackage(pkg *packages.Package) {
|
|
35
|
+
p.PackagePath = packagePath(pkg)
|
|
36
|
+
p.PackageName = pkg.Name
|
|
37
|
+
p.PackageID = pkg.ID
|
|
38
|
+
p.GoFiles = append([]string(nil), pkg.GoFiles...)
|
|
39
|
+
p.CompiledGoFiles = append([]string(nil), pkg.CompiledGoFiles...)
|
|
40
|
+
}
|