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
|
@@ -0,0 +1,1271 @@
|
|
|
1
|
+
package gotest
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"context"
|
|
5
|
+
"os"
|
|
6
|
+
"path/filepath"
|
|
7
|
+
"runtime"
|
|
8
|
+
"slices"
|
|
9
|
+
"strconv"
|
|
10
|
+
"strings"
|
|
11
|
+
"testing"
|
|
12
|
+
"time"
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
func TestRunnerRunsOrdinaryPackageTest(t *testing.T) {
|
|
16
|
+
moduleDir := writeFixture(t, map[string]string{
|
|
17
|
+
"go.mod": "module example.test/gotest\n\ngo 1.25.3\n",
|
|
18
|
+
"value.go": strings.Join([]string{
|
|
19
|
+
"package gotest",
|
|
20
|
+
"",
|
|
21
|
+
"func Add(a int, b int) int {",
|
|
22
|
+
"\treturn a + b",
|
|
23
|
+
"}",
|
|
24
|
+
"",
|
|
25
|
+
}, "\n"),
|
|
26
|
+
"value_test.go": strings.Join([]string{
|
|
27
|
+
"package gotest",
|
|
28
|
+
"",
|
|
29
|
+
"import \"testing\"",
|
|
30
|
+
"",
|
|
31
|
+
"func TestAdd(t *testing.T) {",
|
|
32
|
+
"\tif Add(1, 2) != 3 {",
|
|
33
|
+
"\t\tt.Fatalf(\"unexpected sum\")",
|
|
34
|
+
"\t}",
|
|
35
|
+
"}",
|
|
36
|
+
"",
|
|
37
|
+
}, "\n"),
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
result, err := NewRunner().Run(context.Background(), &Request{
|
|
41
|
+
Dir: moduleDir,
|
|
42
|
+
Patterns: []string{"."},
|
|
43
|
+
Timeout: 30 * time.Second,
|
|
44
|
+
Verbose: true,
|
|
45
|
+
})
|
|
46
|
+
if err != nil {
|
|
47
|
+
t.Fatalf("run package test: %v", err)
|
|
48
|
+
}
|
|
49
|
+
if !result.Passed() {
|
|
50
|
+
t.Fatalf("expected package test to pass: %#v", result.Packages)
|
|
51
|
+
}
|
|
52
|
+
if len(result.Packages) != 1 || len(result.Packages[0].Tests) != 1 {
|
|
53
|
+
t.Fatalf("unexpected package results: %#v", result.Packages)
|
|
54
|
+
}
|
|
55
|
+
if result.Packages[0].Tests[0].Name != "TestAdd" {
|
|
56
|
+
t.Fatalf("unexpected test discovery: %#v", result.Packages[0].Tests)
|
|
57
|
+
}
|
|
58
|
+
if result.Packages[0].Phases.Workspace != PhaseStatusPass ||
|
|
59
|
+
result.Packages[0].Phases.Compile != PhaseStatusPass ||
|
|
60
|
+
result.Packages[0].Phases.Emit != PhaseStatusPass ||
|
|
61
|
+
result.Packages[0].Phases.TypeCheck != PhaseStatusPass ||
|
|
62
|
+
result.Packages[0].Phases.Runtime != PhaseStatusPass {
|
|
63
|
+
t.Fatalf("unexpected phase status: %#v", result.Packages[0].Phases)
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
func TestRunnerReportsShortMode(t *testing.T) {
|
|
68
|
+
moduleDir := writeFixture(t, map[string]string{
|
|
69
|
+
"go.mod": "module example.test/short\n\ngo 1.25.3\n",
|
|
70
|
+
"value_test.go": strings.Join([]string{
|
|
71
|
+
"package short",
|
|
72
|
+
"",
|
|
73
|
+
"import \"testing\"",
|
|
74
|
+
"",
|
|
75
|
+
"func TestShort(t *testing.T) {",
|
|
76
|
+
"\tif !testing.Short() {",
|
|
77
|
+
"\t\tt.Fatalf(\"expected short mode\")",
|
|
78
|
+
"\t}",
|
|
79
|
+
"}",
|
|
80
|
+
"",
|
|
81
|
+
}, "\n"),
|
|
82
|
+
})
|
|
83
|
+
|
|
84
|
+
result, err := NewRunner().Run(context.Background(), &Request{
|
|
85
|
+
Dir: moduleDir,
|
|
86
|
+
Patterns: []string{"."},
|
|
87
|
+
Short: true,
|
|
88
|
+
Timeout: 30 * time.Second,
|
|
89
|
+
})
|
|
90
|
+
if err != nil {
|
|
91
|
+
t.Fatalf("run short package: %v", err)
|
|
92
|
+
}
|
|
93
|
+
if !result.Passed() {
|
|
94
|
+
t.Fatalf("expected short package to pass: %#v", result.Packages)
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
func TestRunnerRunsAsyncSubtest(t *testing.T) {
|
|
99
|
+
moduleDir := writeFixture(t, map[string]string{
|
|
100
|
+
"go.mod": "module example.test/asyncsubtest\n\ngo 1.25.3\n",
|
|
101
|
+
"value_test.go": strings.Join([]string{
|
|
102
|
+
"package asyncsubtest",
|
|
103
|
+
"",
|
|
104
|
+
"import \"testing\"",
|
|
105
|
+
"",
|
|
106
|
+
"func TestAsyncSubtest(t *testing.T) {",
|
|
107
|
+
"\tt.Run(\"child\", func(t *testing.T) {",
|
|
108
|
+
"\t\tch := make(chan string, 1)",
|
|
109
|
+
"\t\tch <- \"ok\"",
|
|
110
|
+
"\t\tif <-ch != \"ok\" {",
|
|
111
|
+
"\t\t\tt.Fatalf(\"unexpected channel value\")",
|
|
112
|
+
"\t\t}",
|
|
113
|
+
"\t})",
|
|
114
|
+
"}",
|
|
115
|
+
"",
|
|
116
|
+
}, "\n"),
|
|
117
|
+
})
|
|
118
|
+
|
|
119
|
+
result, err := NewRunner().Run(context.Background(), &Request{
|
|
120
|
+
Dir: moduleDir,
|
|
121
|
+
Patterns: []string{"."},
|
|
122
|
+
Timeout: 30 * time.Second,
|
|
123
|
+
})
|
|
124
|
+
if err != nil {
|
|
125
|
+
t.Fatalf("run async subtest package: %v", err)
|
|
126
|
+
}
|
|
127
|
+
if !result.Passed() {
|
|
128
|
+
t.Fatalf("expected async subtest to pass: %#v", result.Packages)
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
func TestRunnerAwaitsAsyncDependencyCallsInTests(t *testing.T) {
|
|
133
|
+
moduleDir := writeFixture(t, map[string]string{
|
|
134
|
+
"go.mod": "module example.test/asyncdep\n\ngo 1.25.3\n",
|
|
135
|
+
"value_test.go": strings.Join([]string{
|
|
136
|
+
"package asyncdep",
|
|
137
|
+
"",
|
|
138
|
+
"import (",
|
|
139
|
+
"\t\"math/rand\"",
|
|
140
|
+
"\t\"testing\"",
|
|
141
|
+
")",
|
|
142
|
+
"",
|
|
143
|
+
"func TestAsyncDependencyCall(t *testing.T) {",
|
|
144
|
+
"\tr := rand.New(rand.NewSource(1))",
|
|
145
|
+
"\t_ = uint8(r.Intn(256))",
|
|
146
|
+
"}",
|
|
147
|
+
"",
|
|
148
|
+
}, "\n"),
|
|
149
|
+
})
|
|
150
|
+
|
|
151
|
+
result, err := NewRunner().Run(context.Background(), &Request{
|
|
152
|
+
Dir: moduleDir,
|
|
153
|
+
Patterns: []string{"."},
|
|
154
|
+
Timeout: 30 * time.Second,
|
|
155
|
+
})
|
|
156
|
+
if err != nil {
|
|
157
|
+
t.Fatalf("run async dependency package: %v", err)
|
|
158
|
+
}
|
|
159
|
+
if !result.Passed() {
|
|
160
|
+
t.Fatalf("expected async dependency package to pass: %#v", result.Packages)
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
func TestRunnerEvaluatesStructLiteralCallsBeforeFieldCopies(t *testing.T) {
|
|
165
|
+
moduleDir := writeFixture(t, map[string]string{
|
|
166
|
+
"go.mod": "module example.test/literalorder\n\ngo 1.25.3\n",
|
|
167
|
+
"value_test.go": strings.Join([]string{
|
|
168
|
+
"package literalorder",
|
|
169
|
+
"",
|
|
170
|
+
"import \"testing\"",
|
|
171
|
+
"",
|
|
172
|
+
"type result struct {",
|
|
173
|
+
"\tvalue int",
|
|
174
|
+
"\terr error",
|
|
175
|
+
"}",
|
|
176
|
+
"",
|
|
177
|
+
"func fill(value *int) error {",
|
|
178
|
+
"\t*value = 7",
|
|
179
|
+
"\treturn nil",
|
|
180
|
+
"}",
|
|
181
|
+
"",
|
|
182
|
+
"func recv() result {",
|
|
183
|
+
"\tvar value int",
|
|
184
|
+
"\treturn result{value: value, err: fill(&value)}",
|
|
185
|
+
"}",
|
|
186
|
+
"",
|
|
187
|
+
"func TestLiteralOrder(t *testing.T) {",
|
|
188
|
+
"\tres := recv()",
|
|
189
|
+
"\tif res.err != nil {",
|
|
190
|
+
"\t\tt.Fatalf(\"unexpected error: %v\", res.err)",
|
|
191
|
+
"\t}",
|
|
192
|
+
"\tif res.value != 7 {",
|
|
193
|
+
"\t\tt.Fatalf(\"unexpected value: %d\", res.value)",
|
|
194
|
+
"\t}",
|
|
195
|
+
"}",
|
|
196
|
+
"",
|
|
197
|
+
}, "\n"),
|
|
198
|
+
})
|
|
199
|
+
|
|
200
|
+
result, err := NewRunner().Run(context.Background(), &Request{
|
|
201
|
+
Dir: moduleDir,
|
|
202
|
+
Patterns: []string{"."},
|
|
203
|
+
Timeout: 30 * time.Second,
|
|
204
|
+
})
|
|
205
|
+
if err != nil {
|
|
206
|
+
t.Fatalf("run literal order package: %v", err)
|
|
207
|
+
}
|
|
208
|
+
if !result.Passed() {
|
|
209
|
+
t.Fatalf("expected literal order package to pass: %#v", result.Packages)
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
func TestRunnerRunsExternalPackageTest(t *testing.T) {
|
|
214
|
+
moduleDir := writeFixture(t, map[string]string{
|
|
215
|
+
"go.mod": "module example.test/external\n\ngo 1.25.3\n",
|
|
216
|
+
"value.go": strings.Join([]string{
|
|
217
|
+
"package external",
|
|
218
|
+
"",
|
|
219
|
+
"func Add(a int, b int) int {",
|
|
220
|
+
"\treturn a + b",
|
|
221
|
+
"}",
|
|
222
|
+
"",
|
|
223
|
+
}, "\n"),
|
|
224
|
+
"value_test.go": strings.Join([]string{
|
|
225
|
+
"package external_test",
|
|
226
|
+
"",
|
|
227
|
+
"import (",
|
|
228
|
+
"\t\"testing\"",
|
|
229
|
+
"",
|
|
230
|
+
"\texternal \"example.test/external\"",
|
|
231
|
+
")",
|
|
232
|
+
"",
|
|
233
|
+
"func TestExternalAdd(t *testing.T) {",
|
|
234
|
+
"\tif external.Add(4, 5) != 9 {",
|
|
235
|
+
"\t\tt.Fatalf(\"unexpected sum\")",
|
|
236
|
+
"\t}",
|
|
237
|
+
"}",
|
|
238
|
+
"",
|
|
239
|
+
}, "\n"),
|
|
240
|
+
})
|
|
241
|
+
|
|
242
|
+
result, err := NewRunner().Run(context.Background(), &Request{
|
|
243
|
+
Dir: moduleDir,
|
|
244
|
+
Patterns: []string{"."},
|
|
245
|
+
Timeout: 30 * time.Second,
|
|
246
|
+
})
|
|
247
|
+
if err != nil {
|
|
248
|
+
t.Fatalf("run external package test: %v", err)
|
|
249
|
+
}
|
|
250
|
+
if !result.Passed() {
|
|
251
|
+
t.Fatalf("expected external package test to pass: %#v", result.Packages)
|
|
252
|
+
}
|
|
253
|
+
if len(result.Packages) != 1 || len(result.Packages[0].Tests) != 1 {
|
|
254
|
+
t.Fatalf("unexpected package results: %#v", result.Packages)
|
|
255
|
+
}
|
|
256
|
+
if result.Packages[0].TestPackagePath == "" {
|
|
257
|
+
t.Fatalf("expected test package path: %#v", result.Packages[0])
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
func TestRunnerAppliesOverridesToTestImports(t *testing.T) {
|
|
262
|
+
moduleDir := writeFixture(t, map[string]string{
|
|
263
|
+
"go.mod": "module example.test/testoverride\n\ngo 1.25.3\n",
|
|
264
|
+
"dep/value.go": strings.Join([]string{
|
|
265
|
+
"package dep",
|
|
266
|
+
"",
|
|
267
|
+
"func Value() int {",
|
|
268
|
+
"\tx := 41",
|
|
269
|
+
"\t_ = &x",
|
|
270
|
+
"\treturn x + 1",
|
|
271
|
+
"}",
|
|
272
|
+
"",
|
|
273
|
+
}, "\n"),
|
|
274
|
+
"app/value.go": "package app\n",
|
|
275
|
+
"app/value_test.go": strings.Join([]string{
|
|
276
|
+
"package app",
|
|
277
|
+
"",
|
|
278
|
+
"import (",
|
|
279
|
+
"\t\"testing\"",
|
|
280
|
+
"",
|
|
281
|
+
"\t\"example.test/testoverride/dep\"",
|
|
282
|
+
")",
|
|
283
|
+
"",
|
|
284
|
+
"func TestOverrideImport(t *testing.T) {",
|
|
285
|
+
"\tif dep.Value() != 42 {",
|
|
286
|
+
"\t\tt.Fatal(\"bad value\")",
|
|
287
|
+
"\t}",
|
|
288
|
+
"}",
|
|
289
|
+
"",
|
|
290
|
+
}, "\n"),
|
|
291
|
+
})
|
|
292
|
+
overrideDir := filepath.Join(moduleDir, "gs")
|
|
293
|
+
if err := os.MkdirAll(filepath.Join(overrideDir, "example.test", "testoverride", "dep"), 0o755); err != nil {
|
|
294
|
+
t.Fatal(err.Error())
|
|
295
|
+
}
|
|
296
|
+
if err := os.WriteFile(
|
|
297
|
+
filepath.Join(overrideDir, "example.test", "testoverride", "dep", "index.ts"),
|
|
298
|
+
[]byte("export function Value(): number { return 42 }\n"),
|
|
299
|
+
0o644,
|
|
300
|
+
); err != nil {
|
|
301
|
+
t.Fatal(err.Error())
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
result, err := NewRunner().Run(context.Background(), &Request{
|
|
305
|
+
Dir: moduleDir,
|
|
306
|
+
Patterns: []string{"./app"},
|
|
307
|
+
OverrideDirs: []string{overrideDir},
|
|
308
|
+
Timeout: 30 * time.Second,
|
|
309
|
+
})
|
|
310
|
+
if err != nil {
|
|
311
|
+
t.Fatalf("run override import package: %v", err)
|
|
312
|
+
}
|
|
313
|
+
if !result.Passed() {
|
|
314
|
+
t.Fatalf("expected package test to pass with override import: %#v", result.Packages)
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
func TestRunnerRejectsInvalidRunPattern(t *testing.T) {
|
|
319
|
+
moduleDir := writeFixture(t, map[string]string{
|
|
320
|
+
"go.mod": "module example.test/badrun\n\ngo 1.25.3\n",
|
|
321
|
+
"value.go": "package badrun\n",
|
|
322
|
+
})
|
|
323
|
+
|
|
324
|
+
result, err := NewRunner().Run(context.Background(), &Request{
|
|
325
|
+
Dir: moduleDir,
|
|
326
|
+
Patterns: []string{"."},
|
|
327
|
+
Run: "[",
|
|
328
|
+
})
|
|
329
|
+
if err != nil {
|
|
330
|
+
t.Fatalf("run package test: %v", err)
|
|
331
|
+
}
|
|
332
|
+
if result.Passed() {
|
|
333
|
+
t.Fatalf("expected invalid run pattern to fail")
|
|
334
|
+
}
|
|
335
|
+
if result.Packages[0].Owner != OwnerPackageGraph {
|
|
336
|
+
t.Fatalf("unexpected owner classification: %#v", result.Packages[0])
|
|
337
|
+
}
|
|
338
|
+
if len(result.Diagnostics) != 1 || result.Diagnostics[0].Code != "goscript/gotest:run-pattern" {
|
|
339
|
+
t.Fatalf("expected structured run-pattern diagnostic: %#v", result.Diagnostics)
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
func TestRunnerFailsPackagePatternsWhenGraphHasOnlyDiagnostics(t *testing.T) {
|
|
344
|
+
moduleDir := writeFixture(t, map[string]string{
|
|
345
|
+
"go.mod": "module example.test/missing\n\ngo 1.25.3\n",
|
|
346
|
+
"value.go": "package missing\n",
|
|
347
|
+
})
|
|
348
|
+
|
|
349
|
+
result, err := NewRunner().Run(context.Background(), &Request{
|
|
350
|
+
Dir: moduleDir,
|
|
351
|
+
Patterns: []string{"./does-not-exist"},
|
|
352
|
+
Timeout: 30 * time.Second,
|
|
353
|
+
})
|
|
354
|
+
if err != nil {
|
|
355
|
+
t.Fatalf("run missing package test: %v", err)
|
|
356
|
+
}
|
|
357
|
+
if result.Passed() {
|
|
358
|
+
t.Fatalf("expected missing package pattern to fail")
|
|
359
|
+
}
|
|
360
|
+
if len(result.Packages) != 1 || result.Packages[0].Owner != OwnerPackageGraph {
|
|
361
|
+
t.Fatalf("unexpected package graph failure: %#v", result.Packages)
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
func TestMarkAllFailuresPreservesExistingPackageOwners(t *testing.T) {
|
|
366
|
+
result := &Result{Packages: []PackageResult{
|
|
367
|
+
{
|
|
368
|
+
PackagePath: "example.test/broken",
|
|
369
|
+
Action: ActionFail,
|
|
370
|
+
Owner: OwnerPackageGraph,
|
|
371
|
+
Error: "load failed",
|
|
372
|
+
},
|
|
373
|
+
{
|
|
374
|
+
PackagePath: "example.test/run",
|
|
375
|
+
Action: ActionFail,
|
|
376
|
+
},
|
|
377
|
+
{
|
|
378
|
+
PackagePath: "example.test/notests",
|
|
379
|
+
Action: ActionSkip,
|
|
380
|
+
},
|
|
381
|
+
}}
|
|
382
|
+
|
|
383
|
+
markAllFailures(result, OwnerTestRunner, "typecheck failed")
|
|
384
|
+
|
|
385
|
+
if result.Packages[0].Owner != OwnerPackageGraph || result.Packages[0].Error != "load failed" {
|
|
386
|
+
t.Fatalf("package graph failure was overwritten: %#v", result.Packages[0])
|
|
387
|
+
}
|
|
388
|
+
if result.Packages[1].Owner != OwnerTestRunner || result.Packages[1].Error != "typecheck failed" {
|
|
389
|
+
t.Fatalf("unowned failure was not marked: %#v", result.Packages[1])
|
|
390
|
+
}
|
|
391
|
+
if result.Packages[2].Action != ActionSkip || result.Packages[2].Owner != "" {
|
|
392
|
+
t.Fatalf("skipped package should stay skipped: %#v", result.Packages[2])
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
func TestRunnerScopesPackageLoadErrors(t *testing.T) {
|
|
397
|
+
moduleDir := writeFixture(t, map[string]string{
|
|
398
|
+
"go.mod": "module example.test/mixed\n\ngo 1.25.3\n",
|
|
399
|
+
"clean/value.go": strings.Join([]string{
|
|
400
|
+
"package clean",
|
|
401
|
+
"",
|
|
402
|
+
"func Value() int { return 11 }",
|
|
403
|
+
"",
|
|
404
|
+
}, "\n"),
|
|
405
|
+
"clean/value_test.go": strings.Join([]string{
|
|
406
|
+
"package clean",
|
|
407
|
+
"",
|
|
408
|
+
"import \"testing\"",
|
|
409
|
+
"",
|
|
410
|
+
"func TestValue(t *testing.T) {",
|
|
411
|
+
"\tif Value() != 11 {",
|
|
412
|
+
"\t\tt.Fatal(\"bad value\")",
|
|
413
|
+
"\t}",
|
|
414
|
+
"}",
|
|
415
|
+
"",
|
|
416
|
+
}, "\n"),
|
|
417
|
+
"broken/value.go": "package broken\nfunc Value() int { return 12 }\n",
|
|
418
|
+
"broken/value_test.go": strings.Join([]string{
|
|
419
|
+
"package broken",
|
|
420
|
+
"",
|
|
421
|
+
"import \"testing\"",
|
|
422
|
+
"",
|
|
423
|
+
"func TestBroken(t *testing.T) {",
|
|
424
|
+
"\tMissing()",
|
|
425
|
+
"}",
|
|
426
|
+
"",
|
|
427
|
+
}, "\n"),
|
|
428
|
+
"notests/value.go": "package notests\nfunc Value() int { return 13 }\n",
|
|
429
|
+
})
|
|
430
|
+
|
|
431
|
+
result, err := NewRunner().Run(context.Background(), &Request{
|
|
432
|
+
Dir: moduleDir,
|
|
433
|
+
Patterns: []string{"./..."},
|
|
434
|
+
Timeout: 30 * time.Second,
|
|
435
|
+
})
|
|
436
|
+
if err != nil {
|
|
437
|
+
t.Fatalf("run mixed package tests: %v", err)
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
clean := requirePackageResult(t, result, "example.test/mixed/clean")
|
|
441
|
+
if clean.Action != ActionPass {
|
|
442
|
+
t.Fatalf("clean package should pass independently: %#v", clean)
|
|
443
|
+
}
|
|
444
|
+
broken := requirePackageResult(t, result, "example.test/mixed/broken")
|
|
445
|
+
if broken.Action != ActionFail || broken.Owner != OwnerPackageGraph {
|
|
446
|
+
t.Fatalf("broken package should carry package graph failure: %#v", broken)
|
|
447
|
+
}
|
|
448
|
+
if broken.Phases.Compile != PhaseStatusFail {
|
|
449
|
+
t.Fatalf("broken package should carry compile phase failure: %#v", broken)
|
|
450
|
+
}
|
|
451
|
+
if !strings.Contains(broken.Error, "Missing") {
|
|
452
|
+
t.Fatalf("broken package error should preserve load diagnostic: %#v", broken)
|
|
453
|
+
}
|
|
454
|
+
noTests := requirePackageResult(t, result, "example.test/mixed/notests")
|
|
455
|
+
if noTests.Action != ActionSkip {
|
|
456
|
+
t.Fatalf("no-test package should stay skipped: %#v", noTests)
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
func TestRunnerScopesPackageCompileErrors(t *testing.T) {
|
|
461
|
+
moduleDir := writeFixture(t, map[string]string{
|
|
462
|
+
"go.mod": "module example.test/mixedcompile\n\ngo 1.25.3\n",
|
|
463
|
+
"clean/value.go": strings.Join([]string{
|
|
464
|
+
"package clean",
|
|
465
|
+
"",
|
|
466
|
+
"func Value() int { return 11 }",
|
|
467
|
+
"",
|
|
468
|
+
}, "\n"),
|
|
469
|
+
"clean/value_test.go": strings.Join([]string{
|
|
470
|
+
"package clean",
|
|
471
|
+
"",
|
|
472
|
+
"import \"testing\"",
|
|
473
|
+
"",
|
|
474
|
+
"func TestValue(t *testing.T) {",
|
|
475
|
+
"\tif Value() != 11 {",
|
|
476
|
+
"\t\tt.Fatal(\"bad value\")",
|
|
477
|
+
"\t}",
|
|
478
|
+
"}",
|
|
479
|
+
"",
|
|
480
|
+
}, "\n"),
|
|
481
|
+
"broken/value.go": strings.Join([]string{
|
|
482
|
+
"package broken",
|
|
483
|
+
"",
|
|
484
|
+
"func Value() int {",
|
|
485
|
+
"\tx := 1",
|
|
486
|
+
"\tp := &x",
|
|
487
|
+
"\t_ = &(*p)",
|
|
488
|
+
"\treturn x",
|
|
489
|
+
"}",
|
|
490
|
+
"",
|
|
491
|
+
}, "\n"),
|
|
492
|
+
"broken/value_test.go": strings.Join([]string{
|
|
493
|
+
"package broken",
|
|
494
|
+
"",
|
|
495
|
+
"import \"testing\"",
|
|
496
|
+
"",
|
|
497
|
+
"func TestBroken(t *testing.T) {",
|
|
498
|
+
"\tif Value() == 0 {",
|
|
499
|
+
"\t\tt.Fatal(\"bad value\")",
|
|
500
|
+
"\t}",
|
|
501
|
+
"}",
|
|
502
|
+
"",
|
|
503
|
+
}, "\n"),
|
|
504
|
+
})
|
|
505
|
+
|
|
506
|
+
result, err := NewRunner().Run(context.Background(), &Request{
|
|
507
|
+
Dir: moduleDir,
|
|
508
|
+
Patterns: []string{"./..."},
|
|
509
|
+
Timeout: 30 * time.Second,
|
|
510
|
+
})
|
|
511
|
+
if err != nil {
|
|
512
|
+
t.Fatalf("run mixed compile test: %v", err)
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
clean := requirePackageResult(t, result, "example.test/mixedcompile/clean")
|
|
516
|
+
if clean.Action != ActionPass {
|
|
517
|
+
t.Fatalf("clean package should pass independently: %#v", clean)
|
|
518
|
+
}
|
|
519
|
+
broken := requirePackageResult(t, result, "example.test/mixedcompile/broken")
|
|
520
|
+
if broken.Action != ActionFail || broken.Owner != OwnerLowering {
|
|
521
|
+
t.Fatalf("broken package should carry lowering failure: %#v", broken)
|
|
522
|
+
}
|
|
523
|
+
if !strings.Contains(broken.Error, "unsupported address expression") {
|
|
524
|
+
t.Fatalf("broken package error should preserve compile diagnostic: %#v", broken)
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
func TestRunnerDoesNotCompileDependencyTests(t *testing.T) {
|
|
529
|
+
moduleDir := writeFixture(t, map[string]string{
|
|
530
|
+
"go.mod": "module example.test/deptest\n\ngo 1.25.3\n",
|
|
531
|
+
"dep/value.go": strings.Join([]string{
|
|
532
|
+
"package dep",
|
|
533
|
+
"",
|
|
534
|
+
"func Value() int { return 11 }",
|
|
535
|
+
"",
|
|
536
|
+
}, "\n"),
|
|
537
|
+
"dep/value_test.go": strings.Join([]string{
|
|
538
|
+
"package dep",
|
|
539
|
+
"",
|
|
540
|
+
"import \"testing\"",
|
|
541
|
+
"",
|
|
542
|
+
"func TestDependencyOnly(t *testing.T) {",
|
|
543
|
+
"Loop:",
|
|
544
|
+
"\tfor {",
|
|
545
|
+
"\t\tbreak Loop",
|
|
546
|
+
"\t}",
|
|
547
|
+
"}",
|
|
548
|
+
"",
|
|
549
|
+
}, "\n"),
|
|
550
|
+
"app/value.go": strings.Join([]string{
|
|
551
|
+
"package app",
|
|
552
|
+
"",
|
|
553
|
+
"import \"example.test/deptest/dep\"",
|
|
554
|
+
"",
|
|
555
|
+
"func Value() int { return dep.Value() }",
|
|
556
|
+
"",
|
|
557
|
+
}, "\n"),
|
|
558
|
+
"app/value_test.go": strings.Join([]string{
|
|
559
|
+
"package app",
|
|
560
|
+
"",
|
|
561
|
+
"import \"testing\"",
|
|
562
|
+
"",
|
|
563
|
+
"func TestValue(t *testing.T) {",
|
|
564
|
+
"\tif Value() != 11 {",
|
|
565
|
+
"\t\tt.Fatal(\"bad value\")",
|
|
566
|
+
"\t}",
|
|
567
|
+
"}",
|
|
568
|
+
"",
|
|
569
|
+
}, "\n"),
|
|
570
|
+
})
|
|
571
|
+
|
|
572
|
+
result, err := NewRunner().Run(context.Background(), &Request{
|
|
573
|
+
Dir: moduleDir,
|
|
574
|
+
Patterns: []string{"./app"},
|
|
575
|
+
Timeout: 30 * time.Second,
|
|
576
|
+
})
|
|
577
|
+
if err != nil {
|
|
578
|
+
t.Fatalf("run dependency test isolation fixture: %v", err)
|
|
579
|
+
}
|
|
580
|
+
|
|
581
|
+
app := requirePackageResult(t, result, "example.test/deptest/app")
|
|
582
|
+
if app.Action != ActionPass {
|
|
583
|
+
t.Fatalf("package under test should ignore dependency-only tests: %#v", app)
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
func TestRunnerScopesPackageTypecheckErrors(t *testing.T) {
|
|
588
|
+
moduleDir := writeFixture(t, map[string]string{
|
|
589
|
+
"go.mod": "module example.test/mixedtypecheck\n\ngo 1.25.3\n",
|
|
590
|
+
"clean/value.go": strings.Join([]string{
|
|
591
|
+
"package clean",
|
|
592
|
+
"",
|
|
593
|
+
"func Value() int { return 11 }",
|
|
594
|
+
"",
|
|
595
|
+
}, "\n"),
|
|
596
|
+
"clean/value_test.go": strings.Join([]string{
|
|
597
|
+
"package clean",
|
|
598
|
+
"",
|
|
599
|
+
"import \"testing\"",
|
|
600
|
+
"",
|
|
601
|
+
"func TestValue(t *testing.T) {",
|
|
602
|
+
"\tif Value() != 11 {",
|
|
603
|
+
"\t\tt.Fatal(\"bad value\")",
|
|
604
|
+
"\t}",
|
|
605
|
+
"}",
|
|
606
|
+
"",
|
|
607
|
+
}, "\n"),
|
|
608
|
+
"bad/value.go": strings.Join([]string{
|
|
609
|
+
"package bad",
|
|
610
|
+
"",
|
|
611
|
+
"func Value() int { return 12 }",
|
|
612
|
+
"",
|
|
613
|
+
}, "\n"),
|
|
614
|
+
"bad/value_test.go": strings.Join([]string{
|
|
615
|
+
"package bad",
|
|
616
|
+
"",
|
|
617
|
+
"import \"testing\"",
|
|
618
|
+
"",
|
|
619
|
+
"func TestBad(t *testing.T) {",
|
|
620
|
+
"\tif Value() != 12 {",
|
|
621
|
+
"\t\tt.Fatal(\"bad value\")",
|
|
622
|
+
"\t}",
|
|
623
|
+
"}",
|
|
624
|
+
"",
|
|
625
|
+
}, "\n"),
|
|
626
|
+
})
|
|
627
|
+
writeExecutable(t, filepath.Join(moduleDir, "node_modules", ".bin", "tsgo"), strings.Join([]string{
|
|
628
|
+
"#!/bin/sh",
|
|
629
|
+
"project=",
|
|
630
|
+
"while [ \"$#\" -gt 0 ]; do",
|
|
631
|
+
"\tif [ \"$1\" = \"--project\" ]; then",
|
|
632
|
+
"\t\tshift",
|
|
633
|
+
"\t\tproject=\"$1\"",
|
|
634
|
+
"\tfi",
|
|
635
|
+
"\tshift || break",
|
|
636
|
+
"done",
|
|
637
|
+
"if [ \"$project\" = \"tsconfig.json\" ]; then",
|
|
638
|
+
"\tif grep -q 'example.test/mixedtypecheck/bad' runner-*.ts; then",
|
|
639
|
+
"\t\techo 'TypeScript TS9000: bad package'",
|
|
640
|
+
"\t\texit 1",
|
|
641
|
+
"\tfi",
|
|
642
|
+
"\texit 0",
|
|
643
|
+
"fi",
|
|
644
|
+
"runner=$(sed -n 's/.*\"\\(runner-[0-9][0-9]*\\.ts\\)\".*/\\1/p' \"$project\" | head -n 1)",
|
|
645
|
+
"if grep -q 'example.test/mixedtypecheck/bad' \"$runner\"; then",
|
|
646
|
+
"\techo 'TypeScript TS9000: bad package'",
|
|
647
|
+
"\texit 1",
|
|
648
|
+
"fi",
|
|
649
|
+
"exit 0",
|
|
650
|
+
"",
|
|
651
|
+
}, "\n"))
|
|
652
|
+
writeExecutable(t, filepath.Join(moduleDir, "node_modules", ".bin", "bun"), strings.Join([]string{
|
|
653
|
+
"#!/bin/sh",
|
|
654
|
+
"exit 0",
|
|
655
|
+
"",
|
|
656
|
+
}, "\n"))
|
|
657
|
+
|
|
658
|
+
result, err := NewRunner().Run(context.Background(), &Request{
|
|
659
|
+
Dir: moduleDir,
|
|
660
|
+
Patterns: []string{"./..."},
|
|
661
|
+
Timeout: 30 * time.Second,
|
|
662
|
+
})
|
|
663
|
+
if err != nil {
|
|
664
|
+
t.Fatalf("run mixed typecheck test: %v", err)
|
|
665
|
+
}
|
|
666
|
+
|
|
667
|
+
clean := requirePackageResult(t, result, "example.test/mixedtypecheck/clean")
|
|
668
|
+
if clean.Action != ActionPass {
|
|
669
|
+
t.Fatalf("clean package should pass independently: %#v", clean)
|
|
670
|
+
}
|
|
671
|
+
bad := requirePackageResult(t, result, "example.test/mixedtypecheck/bad")
|
|
672
|
+
if bad.Action != ActionFail || bad.Owner != OwnerTypeScriptEmitter {
|
|
673
|
+
t.Fatalf("bad package should carry typecheck failure: %#v", bad)
|
|
674
|
+
}
|
|
675
|
+
if !strings.Contains(bad.Error, "TS9000") {
|
|
676
|
+
t.Fatalf("bad package error should preserve typecheck output: %#v", bad)
|
|
677
|
+
}
|
|
678
|
+
}
|
|
679
|
+
|
|
680
|
+
func TestRunnerDoesNotRepeatSharedOverrideTypecheckFailure(t *testing.T) {
|
|
681
|
+
moduleDir := writeFixture(t, map[string]string{
|
|
682
|
+
"go.mod": "module example.test/sharedoverride\n\ngo 1.25.3\n",
|
|
683
|
+
"one/value.go": strings.Join([]string{
|
|
684
|
+
"package one",
|
|
685
|
+
"",
|
|
686
|
+
"func Value() int { return 1 }",
|
|
687
|
+
"",
|
|
688
|
+
}, "\n"),
|
|
689
|
+
"one/value_test.go": strings.Join([]string{
|
|
690
|
+
"package one",
|
|
691
|
+
"",
|
|
692
|
+
"import \"testing\"",
|
|
693
|
+
"",
|
|
694
|
+
"func TestOne(t *testing.T) {",
|
|
695
|
+
"\tif Value() != 1 {",
|
|
696
|
+
"\t\tt.Fatal(\"bad value\")",
|
|
697
|
+
"\t}",
|
|
698
|
+
"}",
|
|
699
|
+
"",
|
|
700
|
+
}, "\n"),
|
|
701
|
+
"two/value.go": strings.Join([]string{
|
|
702
|
+
"package two",
|
|
703
|
+
"",
|
|
704
|
+
"func Value() int { return 2 }",
|
|
705
|
+
"",
|
|
706
|
+
}, "\n"),
|
|
707
|
+
"two/value_test.go": strings.Join([]string{
|
|
708
|
+
"package two",
|
|
709
|
+
"",
|
|
710
|
+
"import \"testing\"",
|
|
711
|
+
"",
|
|
712
|
+
"func TestTwo(t *testing.T) {",
|
|
713
|
+
"\tif Value() != 2 {",
|
|
714
|
+
"\t\tt.Fatal(\"bad value\")",
|
|
715
|
+
"\t}",
|
|
716
|
+
"}",
|
|
717
|
+
"",
|
|
718
|
+
}, "\n"),
|
|
719
|
+
})
|
|
720
|
+
workDir := filepath.Join(moduleDir, "work")
|
|
721
|
+
projectLog := filepath.Join(moduleDir, "projects.log")
|
|
722
|
+
writeExecutable(t, filepath.Join(moduleDir, "node_modules", ".bin", "tsgo"), strings.Join([]string{
|
|
723
|
+
"#!/bin/sh",
|
|
724
|
+
"project=",
|
|
725
|
+
"while [ \"$#\" -gt 0 ]; do",
|
|
726
|
+
"\tif [ \"$1\" = \"--project\" ]; then",
|
|
727
|
+
"\t\tshift",
|
|
728
|
+
"\t\tproject=\"$1\"",
|
|
729
|
+
"\tfi",
|
|
730
|
+
"\tshift || break",
|
|
731
|
+
"done",
|
|
732
|
+
"printf '%s\\n' \"$project\" >> " + strconv.Quote(projectLog),
|
|
733
|
+
"echo 'output/@goscript/example.test/override/index.ts(1,1): error TS2305: Module has no exported member Thing'",
|
|
734
|
+
"exit 1",
|
|
735
|
+
"",
|
|
736
|
+
}, "\n"))
|
|
737
|
+
writeExecutable(t, filepath.Join(moduleDir, "node_modules", ".bin", "bun"), strings.Join([]string{
|
|
738
|
+
"#!/bin/sh",
|
|
739
|
+
"exit 0",
|
|
740
|
+
"",
|
|
741
|
+
}, "\n"))
|
|
742
|
+
|
|
743
|
+
result, err := NewRunner().Run(context.Background(), &Request{
|
|
744
|
+
Dir: moduleDir,
|
|
745
|
+
Patterns: []string{"./..."},
|
|
746
|
+
Timeout: 30 * time.Second,
|
|
747
|
+
WorkDir: workDir,
|
|
748
|
+
})
|
|
749
|
+
if err != nil {
|
|
750
|
+
t.Fatalf("run shared override typecheck fixture: %v", err)
|
|
751
|
+
}
|
|
752
|
+
|
|
753
|
+
one := requirePackageResult(t, result, "example.test/sharedoverride/one")
|
|
754
|
+
two := requirePackageResult(t, result, "example.test/sharedoverride/two")
|
|
755
|
+
for _, pkg := range []PackageResult{one, two} {
|
|
756
|
+
if pkg.Action != ActionFail || pkg.Owner != OwnerOverridePackage {
|
|
757
|
+
t.Fatalf("package should carry aggregate override failure: %#v", pkg)
|
|
758
|
+
}
|
|
759
|
+
if pkg.Phases.TypeCheck != PhaseStatusFail || pkg.Phases.Runtime != PhaseStatusSkip {
|
|
760
|
+
t.Fatalf("package should fail at aggregate typecheck without runtime: %#v", pkg)
|
|
761
|
+
}
|
|
762
|
+
}
|
|
763
|
+
data, err := os.ReadFile(projectLog)
|
|
764
|
+
if err != nil {
|
|
765
|
+
t.Fatalf("read project log: %v", err)
|
|
766
|
+
}
|
|
767
|
+
projects := strings.Fields(string(data))
|
|
768
|
+
if len(projects) != 1 || projects[0] != "tsconfig.json" {
|
|
769
|
+
t.Fatalf("expected only aggregate typecheck, got:\n%s", data)
|
|
770
|
+
}
|
|
771
|
+
}
|
|
772
|
+
|
|
773
|
+
func TestRunnerUsesBatchTypeScriptProject(t *testing.T) {
|
|
774
|
+
moduleDir := writeFixture(t, map[string]string{
|
|
775
|
+
"go.mod": "module example.test/packageprojects\n\ngo 1.25.3\n",
|
|
776
|
+
"one/value.go": strings.Join([]string{
|
|
777
|
+
"package one",
|
|
778
|
+
"",
|
|
779
|
+
"func Value() int { return 1 }",
|
|
780
|
+
"",
|
|
781
|
+
}, "\n"),
|
|
782
|
+
"one/value_test.go": strings.Join([]string{
|
|
783
|
+
"package one",
|
|
784
|
+
"",
|
|
785
|
+
"import \"testing\"",
|
|
786
|
+
"",
|
|
787
|
+
"func TestOne(t *testing.T) {",
|
|
788
|
+
"\tif Value() != 1 {",
|
|
789
|
+
"\t\tt.Fatal(\"bad value\")",
|
|
790
|
+
"\t}",
|
|
791
|
+
"}",
|
|
792
|
+
"",
|
|
793
|
+
}, "\n"),
|
|
794
|
+
"two/value.go": strings.Join([]string{
|
|
795
|
+
"package two",
|
|
796
|
+
"",
|
|
797
|
+
"func Value() int { return 2 }",
|
|
798
|
+
"",
|
|
799
|
+
}, "\n"),
|
|
800
|
+
"two/value_test.go": strings.Join([]string{
|
|
801
|
+
"package two",
|
|
802
|
+
"",
|
|
803
|
+
"import \"testing\"",
|
|
804
|
+
"",
|
|
805
|
+
"func TestTwo(t *testing.T) {",
|
|
806
|
+
"\tif Value() != 2 {",
|
|
807
|
+
"\t\tt.Fatal(\"bad value\")",
|
|
808
|
+
"\t}",
|
|
809
|
+
"}",
|
|
810
|
+
"",
|
|
811
|
+
}, "\n"),
|
|
812
|
+
})
|
|
813
|
+
workDir := filepath.Join(moduleDir, ".tmp", "package-projects")
|
|
814
|
+
projectLog := filepath.Join(moduleDir, "projects.log")
|
|
815
|
+
writeExecutable(t, filepath.Join(moduleDir, "node_modules", ".bin", "tsgo"), strings.Join([]string{
|
|
816
|
+
"#!/bin/sh",
|
|
817
|
+
"project=",
|
|
818
|
+
"while [ \"$#\" -gt 0 ]; do",
|
|
819
|
+
"\tif [ \"$1\" = \"--project\" ]; then",
|
|
820
|
+
"\t\tshift",
|
|
821
|
+
"\t\tproject=\"$1\"",
|
|
822
|
+
"\tfi",
|
|
823
|
+
"\tshift || break",
|
|
824
|
+
"done",
|
|
825
|
+
"printf '%s\\n' \"$project\" >> " + strconv.Quote(projectLog),
|
|
826
|
+
"exit 0",
|
|
827
|
+
"",
|
|
828
|
+
}, "\n"))
|
|
829
|
+
writeExecutable(t, filepath.Join(moduleDir, "node_modules", ".bin", "bun"), strings.Join([]string{
|
|
830
|
+
"#!/bin/sh",
|
|
831
|
+
"exit 0",
|
|
832
|
+
"",
|
|
833
|
+
}, "\n"))
|
|
834
|
+
|
|
835
|
+
result, err := NewRunner().Run(context.Background(), &Request{
|
|
836
|
+
Dir: moduleDir,
|
|
837
|
+
Patterns: []string{"./..."},
|
|
838
|
+
Timeout: 30 * time.Second,
|
|
839
|
+
WorkDir: workDir,
|
|
840
|
+
Parallelism: 2,
|
|
841
|
+
})
|
|
842
|
+
if err != nil {
|
|
843
|
+
t.Fatalf("run package projects fixture: %v", err)
|
|
844
|
+
}
|
|
845
|
+
if !result.Passed() {
|
|
846
|
+
t.Fatalf("expected package projects fixture to pass: %#v", result.Packages)
|
|
847
|
+
}
|
|
848
|
+
data, err := os.ReadFile(projectLog)
|
|
849
|
+
if err != nil {
|
|
850
|
+
t.Fatalf("read project log: %v", err)
|
|
851
|
+
}
|
|
852
|
+
projects := string(data)
|
|
853
|
+
if strings.TrimSpace(projects) != "tsconfig.json" {
|
|
854
|
+
t.Fatalf("expected aggregate tsconfig project, got:\n%s", projects)
|
|
855
|
+
}
|
|
856
|
+
}
|
|
857
|
+
|
|
858
|
+
func TestRunnerRunsCombinedRuntimeChunks(t *testing.T) {
|
|
859
|
+
moduleDir := writeFixture(t, map[string]string{
|
|
860
|
+
"go.mod": "module example.test/runtimechunks\n\ngo 1.25.3\n",
|
|
861
|
+
"one/value.go": strings.Join([]string{
|
|
862
|
+
"package one",
|
|
863
|
+
"",
|
|
864
|
+
"func Value() int { return 1 }",
|
|
865
|
+
"",
|
|
866
|
+
}, "\n"),
|
|
867
|
+
"one/value_test.go": strings.Join([]string{
|
|
868
|
+
"package one",
|
|
869
|
+
"",
|
|
870
|
+
"import \"testing\"",
|
|
871
|
+
"",
|
|
872
|
+
"func TestOne(t *testing.T) {",
|
|
873
|
+
"\tif Value() != 1 {",
|
|
874
|
+
"\t\tt.Fatal(\"bad value\")",
|
|
875
|
+
"\t}",
|
|
876
|
+
"}",
|
|
877
|
+
"",
|
|
878
|
+
}, "\n"),
|
|
879
|
+
"two/value.go": strings.Join([]string{
|
|
880
|
+
"package two",
|
|
881
|
+
"",
|
|
882
|
+
"func Value() int { return 2 }",
|
|
883
|
+
"",
|
|
884
|
+
}, "\n"),
|
|
885
|
+
"two/value_test.go": strings.Join([]string{
|
|
886
|
+
"package two",
|
|
887
|
+
"",
|
|
888
|
+
"import \"testing\"",
|
|
889
|
+
"",
|
|
890
|
+
"func TestTwo(t *testing.T) {",
|
|
891
|
+
"\tif Value() != 2 {",
|
|
892
|
+
"\t\tt.Fatal(\"bad value\")",
|
|
893
|
+
"\t}",
|
|
894
|
+
"}",
|
|
895
|
+
"",
|
|
896
|
+
}, "\n"),
|
|
897
|
+
})
|
|
898
|
+
workDir := filepath.Join(moduleDir, ".tmp", "runtime-chunks")
|
|
899
|
+
runtimeLog := filepath.Join(moduleDir, "runtime.log")
|
|
900
|
+
writeExecutable(t, filepath.Join(moduleDir, "node_modules", ".bin", "tsgo"), strings.Join([]string{
|
|
901
|
+
"#!/bin/sh",
|
|
902
|
+
"exit 0",
|
|
903
|
+
"",
|
|
904
|
+
}, "\n"))
|
|
905
|
+
writeExecutable(t, filepath.Join(moduleDir, "node_modules", ".bin", "bun"), strings.Join([]string{
|
|
906
|
+
"#!/bin/sh",
|
|
907
|
+
"runner=\"$1\"",
|
|
908
|
+
"printf '%s\\n' \"$runner\" >> " + strconv.Quote(runtimeLog),
|
|
909
|
+
"case \"$runner\" in",
|
|
910
|
+
"runner-all-*)",
|
|
911
|
+
"\tsed -n 's/.*await __goscriptRunPackage(\"\\([^\"]*\\)\".*/\\1/p' \"$runner\" | while IFS= read -r pkg; do",
|
|
912
|
+
"\t\tprintf '" + combinedRuntimeResultPrefix + "{\"packagePath\":\"%s\",\"ok\":true,\"elapsedMs\":1,\"output\":\"\"}\\n' \"$pkg\"",
|
|
913
|
+
"\tdone",
|
|
914
|
+
"\texit 0",
|
|
915
|
+
"\t;;",
|
|
916
|
+
"*)",
|
|
917
|
+
"\texit 1",
|
|
918
|
+
"\t;;",
|
|
919
|
+
"esac",
|
|
920
|
+
"",
|
|
921
|
+
}, "\n"))
|
|
922
|
+
|
|
923
|
+
result, err := NewRunner().Run(context.Background(), &Request{
|
|
924
|
+
Dir: moduleDir,
|
|
925
|
+
Patterns: []string{"./..."},
|
|
926
|
+
Timeout: 30 * time.Second,
|
|
927
|
+
WorkDir: workDir,
|
|
928
|
+
Parallelism: 2,
|
|
929
|
+
RuntimeGroups: true,
|
|
930
|
+
})
|
|
931
|
+
if err != nil {
|
|
932
|
+
t.Fatalf("run runtime chunks fixture: %v", err)
|
|
933
|
+
}
|
|
934
|
+
if !result.Passed() {
|
|
935
|
+
t.Fatalf("expected runtime chunks fixture to pass: %#v", result.Packages)
|
|
936
|
+
}
|
|
937
|
+
data, err := os.ReadFile(runtimeLog)
|
|
938
|
+
if err != nil {
|
|
939
|
+
t.Fatalf("read runtime log: %v", err)
|
|
940
|
+
}
|
|
941
|
+
runners := strings.Fields(string(data))
|
|
942
|
+
slices.Sort(runners)
|
|
943
|
+
if strings.Join(runners, "\n") != "runner-all-0.ts\nrunner-all-1.ts" {
|
|
944
|
+
t.Fatalf("expected chunked combined runners, got:\n%s", data)
|
|
945
|
+
}
|
|
946
|
+
}
|
|
947
|
+
|
|
948
|
+
func TestRunnerFallsBackToPackageScopedTypeScriptProjects(t *testing.T) {
|
|
949
|
+
moduleDir := writeFixture(t, map[string]string{
|
|
950
|
+
"go.mod": "module example.test/packageprojects\n\ngo 1.25.3\n",
|
|
951
|
+
"one/value.go": strings.Join([]string{
|
|
952
|
+
"package one",
|
|
953
|
+
"",
|
|
954
|
+
"func Value() int { return 1 }",
|
|
955
|
+
"",
|
|
956
|
+
}, "\n"),
|
|
957
|
+
"one/value_test.go": strings.Join([]string{
|
|
958
|
+
"package one",
|
|
959
|
+
"",
|
|
960
|
+
"import \"testing\"",
|
|
961
|
+
"",
|
|
962
|
+
"func TestOne(t *testing.T) {",
|
|
963
|
+
"\tif Value() != 1 {",
|
|
964
|
+
"\t\tt.Fatal(\"bad value\")",
|
|
965
|
+
"\t}",
|
|
966
|
+
"}",
|
|
967
|
+
"",
|
|
968
|
+
}, "\n"),
|
|
969
|
+
"two/value.go": strings.Join([]string{
|
|
970
|
+
"package two",
|
|
971
|
+
"",
|
|
972
|
+
"func Value() int { return 2 }",
|
|
973
|
+
"",
|
|
974
|
+
}, "\n"),
|
|
975
|
+
"two/value_test.go": strings.Join([]string{
|
|
976
|
+
"package two",
|
|
977
|
+
"",
|
|
978
|
+
"import \"testing\"",
|
|
979
|
+
"",
|
|
980
|
+
"func TestTwo(t *testing.T) {",
|
|
981
|
+
"\tif Value() != 2 {",
|
|
982
|
+
"\t\tt.Fatal(\"bad value\")",
|
|
983
|
+
"\t}",
|
|
984
|
+
"}",
|
|
985
|
+
"",
|
|
986
|
+
}, "\n"),
|
|
987
|
+
})
|
|
988
|
+
workDir := filepath.Join(moduleDir, ".tmp", "package-projects")
|
|
989
|
+
projectLog := filepath.Join(moduleDir, "projects.log")
|
|
990
|
+
writeExecutable(t, filepath.Join(moduleDir, "node_modules", ".bin", "tsgo"), strings.Join([]string{
|
|
991
|
+
"#!/bin/sh",
|
|
992
|
+
"project=",
|
|
993
|
+
"while [ \"$#\" -gt 0 ]; do",
|
|
994
|
+
"\tif [ \"$1\" = \"--project\" ]; then",
|
|
995
|
+
"\t\tshift",
|
|
996
|
+
"\t\tproject=\"$1\"",
|
|
997
|
+
"\tfi",
|
|
998
|
+
"\tshift || break",
|
|
999
|
+
"done",
|
|
1000
|
+
"printf '%s\\n' \"$project\" >> " + strconv.Quote(projectLog),
|
|
1001
|
+
"if [ \"$project\" = \"tsconfig.json\" ]; then",
|
|
1002
|
+
"\texit 1",
|
|
1003
|
+
"fi",
|
|
1004
|
+
"exit 0",
|
|
1005
|
+
"",
|
|
1006
|
+
}, "\n"))
|
|
1007
|
+
writeExecutable(t, filepath.Join(moduleDir, "node_modules", ".bin", "bun"), strings.Join([]string{
|
|
1008
|
+
"#!/bin/sh",
|
|
1009
|
+
"exit 0",
|
|
1010
|
+
"",
|
|
1011
|
+
}, "\n"))
|
|
1012
|
+
|
|
1013
|
+
result, err := NewRunner().Run(context.Background(), &Request{
|
|
1014
|
+
Dir: moduleDir,
|
|
1015
|
+
Patterns: []string{"./..."},
|
|
1016
|
+
Timeout: 30 * time.Second,
|
|
1017
|
+
WorkDir: workDir,
|
|
1018
|
+
Parallelism: 2,
|
|
1019
|
+
})
|
|
1020
|
+
if err != nil {
|
|
1021
|
+
t.Fatalf("run package projects fixture: %v", err)
|
|
1022
|
+
}
|
|
1023
|
+
if !result.Passed() {
|
|
1024
|
+
t.Fatalf("expected package projects fixture to pass: %#v", result.Packages)
|
|
1025
|
+
}
|
|
1026
|
+
data, err := os.ReadFile(projectLog)
|
|
1027
|
+
if err != nil {
|
|
1028
|
+
t.Fatalf("read project log: %v", err)
|
|
1029
|
+
}
|
|
1030
|
+
projects := string(data)
|
|
1031
|
+
if !strings.Contains(projects, "tsconfig.json") ||
|
|
1032
|
+
!strings.Contains(projects, "tsconfig-0.json") ||
|
|
1033
|
+
!strings.Contains(projects, "tsconfig-1.json") {
|
|
1034
|
+
t.Fatalf("expected aggregate project and package-scoped fallback, got:\n%s", projects)
|
|
1035
|
+
}
|
|
1036
|
+
}
|
|
1037
|
+
|
|
1038
|
+
func TestDefaultParallelismCapsAtEight(t *testing.T) {
|
|
1039
|
+
previous := runtime.GOMAXPROCS(16)
|
|
1040
|
+
t.Cleanup(func() { runtime.GOMAXPROCS(previous) })
|
|
1041
|
+
|
|
1042
|
+
if got := DefaultParallelism(); got != 8 {
|
|
1043
|
+
t.Fatalf("expected default parallelism cap 8, got %d", got)
|
|
1044
|
+
}
|
|
1045
|
+
}
|
|
1046
|
+
|
|
1047
|
+
func TestNormalizeKeepsIncrementalTypeCheckExplicit(t *testing.T) {
|
|
1048
|
+
norm, err := (&Request{
|
|
1049
|
+
Patterns: []string{"./..."},
|
|
1050
|
+
WorkDir: t.TempDir(),
|
|
1051
|
+
}).normalize()
|
|
1052
|
+
if err != nil {
|
|
1053
|
+
t.Fatalf("normalize request: %v", err)
|
|
1054
|
+
}
|
|
1055
|
+
if norm.IncrementalTypeCheck {
|
|
1056
|
+
t.Fatalf("expected explicit workdir alone to skip incremental typecheck cache")
|
|
1057
|
+
}
|
|
1058
|
+
|
|
1059
|
+
norm, err = (&Request{
|
|
1060
|
+
Patterns: []string{"./..."},
|
|
1061
|
+
IncrementalTypeCheck: true,
|
|
1062
|
+
}).normalize()
|
|
1063
|
+
if err != nil {
|
|
1064
|
+
t.Fatalf("normalize incremental request: %v", err)
|
|
1065
|
+
}
|
|
1066
|
+
if !norm.IncrementalTypeCheck {
|
|
1067
|
+
t.Fatalf("expected incremental flag to enable typecheck cache")
|
|
1068
|
+
}
|
|
1069
|
+
}
|
|
1070
|
+
|
|
1071
|
+
func TestPackageExecutionIndexesPrioritizesLargerTestPackages(t *testing.T) {
|
|
1072
|
+
result := &Result{Packages: []PackageResult{
|
|
1073
|
+
{
|
|
1074
|
+
PackagePath: "example.test/small",
|
|
1075
|
+
Tests: []Test{{Name: "TestSmall"}},
|
|
1076
|
+
},
|
|
1077
|
+
{
|
|
1078
|
+
PackagePath: "example.test/large",
|
|
1079
|
+
Tests: []Test{
|
|
1080
|
+
{Name: "TestLargeA"},
|
|
1081
|
+
{Name: "TestLargeB"},
|
|
1082
|
+
{Name: "TestLargeC"},
|
|
1083
|
+
},
|
|
1084
|
+
},
|
|
1085
|
+
{
|
|
1086
|
+
PackagePath: "example.test/medium-b",
|
|
1087
|
+
Tests: []Test{
|
|
1088
|
+
{Name: "TestMediumB1"},
|
|
1089
|
+
{Name: "TestMediumB2"},
|
|
1090
|
+
},
|
|
1091
|
+
},
|
|
1092
|
+
{
|
|
1093
|
+
PackagePath: "example.test/medium-a",
|
|
1094
|
+
Tests: []Test{
|
|
1095
|
+
{Name: "TestMediumA1"},
|
|
1096
|
+
{Name: "TestMediumA2"},
|
|
1097
|
+
},
|
|
1098
|
+
},
|
|
1099
|
+
}}
|
|
1100
|
+
|
|
1101
|
+
got := packageExecutionIndexes(result, []int{0, 1, 2, 3})
|
|
1102
|
+
want := []int{1, 3, 2, 0}
|
|
1103
|
+
if !slices.Equal(got, want) {
|
|
1104
|
+
t.Fatalf("expected execution indexes %v, got %v", want, got)
|
|
1105
|
+
}
|
|
1106
|
+
}
|
|
1107
|
+
|
|
1108
|
+
func TestRenderRunnerChangesToPackageSourceDir(t *testing.T) {
|
|
1109
|
+
req := &normalizedRequest{}
|
|
1110
|
+
runner := renderRunner(PackageResult{
|
|
1111
|
+
PackagePath: "example.test/pkg",
|
|
1112
|
+
SourceDir: "/workspace/pkg",
|
|
1113
|
+
Tests: []Test{{
|
|
1114
|
+
Name: "TestCwd",
|
|
1115
|
+
PackagePath: "example.test/pkg",
|
|
1116
|
+
}},
|
|
1117
|
+
}, req)
|
|
1118
|
+
|
|
1119
|
+
if !strings.Contains(runner, "process.chdir(\"/workspace/pkg\")") {
|
|
1120
|
+
t.Fatalf("expected runner to chdir to package source dir: %s", runner)
|
|
1121
|
+
}
|
|
1122
|
+
if !strings.Contains(runner, "await runTests(\"example.test/pkg\"") {
|
|
1123
|
+
t.Fatalf("expected runner to execute package tests: %s", runner)
|
|
1124
|
+
}
|
|
1125
|
+
}
|
|
1126
|
+
|
|
1127
|
+
func TestRenderCombinedRunnerChangesToEachPackageSourceDir(t *testing.T) {
|
|
1128
|
+
req := &normalizedRequest{}
|
|
1129
|
+
runner := renderCombinedRunner(&Result{Packages: []PackageResult{
|
|
1130
|
+
{
|
|
1131
|
+
PackagePath: "example.test/one",
|
|
1132
|
+
SourceDir: "/workspace/one",
|
|
1133
|
+
Tests: []Test{{
|
|
1134
|
+
Name: "TestOne",
|
|
1135
|
+
PackagePath: "example.test/one",
|
|
1136
|
+
}},
|
|
1137
|
+
},
|
|
1138
|
+
{
|
|
1139
|
+
PackagePath: "example.test/two",
|
|
1140
|
+
SourceDir: "/workspace/two",
|
|
1141
|
+
Tests: []Test{{
|
|
1142
|
+
Name: "TestTwo",
|
|
1143
|
+
PackagePath: "example.test/two",
|
|
1144
|
+
}},
|
|
1145
|
+
},
|
|
1146
|
+
}}, []int{0, 1}, req)
|
|
1147
|
+
|
|
1148
|
+
if !strings.Contains(runner, "await __goscriptRunPackage(\"example.test/one\", \"/workspace/one\"") {
|
|
1149
|
+
t.Fatalf("expected combined runner to pass first package source dir: %s", runner)
|
|
1150
|
+
}
|
|
1151
|
+
if !strings.Contains(runner, "await __goscriptRunPackage(\"example.test/two\", \"/workspace/two\"") {
|
|
1152
|
+
t.Fatalf("expected combined runner to pass second package source dir: %s", runner)
|
|
1153
|
+
}
|
|
1154
|
+
if !strings.Contains(runner, "process.chdir(packageDir)") {
|
|
1155
|
+
t.Fatalf("expected combined runner to chdir before each package: %s", runner)
|
|
1156
|
+
}
|
|
1157
|
+
}
|
|
1158
|
+
|
|
1159
|
+
func TestRenderTypeScriptProjectDisablesAmbientTypePackages(t *testing.T) {
|
|
1160
|
+
req := &normalizedRequest{
|
|
1161
|
+
WorkDir: "/work",
|
|
1162
|
+
}
|
|
1163
|
+
|
|
1164
|
+
tsconfig := renderTypeScriptProject(req, "/work/output/package-0", "runner-0.ts", "tsconfig-0.json", false)
|
|
1165
|
+
if !strings.Contains(tsconfig, "\"types\": []") {
|
|
1166
|
+
t.Fatalf("expected generated tsconfig to disable ambient @types packages: %s", tsconfig)
|
|
1167
|
+
}
|
|
1168
|
+
if !strings.Contains(tsconfig, "\"goscript-node.d.ts\"") {
|
|
1169
|
+
t.Fatalf("expected generated tsconfig to include GoScript node ambient declarations: %s", tsconfig)
|
|
1170
|
+
}
|
|
1171
|
+
if strings.Contains(tsconfig, "\"incremental\": true") || strings.Contains(tsconfig, "\"tsBuildInfoFile\"") {
|
|
1172
|
+
t.Fatalf("expected generated tsconfig to keep one-shot typecheck by default: %s", tsconfig)
|
|
1173
|
+
}
|
|
1174
|
+
if strings.Contains(tsconfig, "output/package-0/**/*.ts") {
|
|
1175
|
+
t.Fatalf("expected generated tsconfig to typecheck from runner roots, not output globs: %s", tsconfig)
|
|
1176
|
+
}
|
|
1177
|
+
}
|
|
1178
|
+
|
|
1179
|
+
func TestRenderTypeScriptProjectUsesNodeTypesWhenAvailable(t *testing.T) {
|
|
1180
|
+
req := &normalizedRequest{
|
|
1181
|
+
WorkDir: "/work",
|
|
1182
|
+
}
|
|
1183
|
+
|
|
1184
|
+
tsconfig := renderTypeScriptProject(req, "/work/output/package-0", "runner-0.ts", "tsconfig-0.json", true)
|
|
1185
|
+
if !strings.Contains(tsconfig, "\"types\": [\"node\"]") {
|
|
1186
|
+
t.Fatalf("expected generated tsconfig to opt into node types: %s", tsconfig)
|
|
1187
|
+
}
|
|
1188
|
+
}
|
|
1189
|
+
|
|
1190
|
+
func TestRenderRuntimeTypeScriptProjectDisablesEmit(t *testing.T) {
|
|
1191
|
+
req := &normalizedRequest{
|
|
1192
|
+
WorkDir: "/work",
|
|
1193
|
+
}
|
|
1194
|
+
|
|
1195
|
+
tsconfig := renderRuntimeTypeScriptProject(req, []string{"/work/output"}, false)
|
|
1196
|
+
if !strings.Contains(tsconfig, "\"noEmit\": true") {
|
|
1197
|
+
t.Fatalf("expected aggregate tsconfig to disable emit: %s", tsconfig)
|
|
1198
|
+
}
|
|
1199
|
+
if strings.Contains(tsconfig, "\"incremental\": true") || strings.Contains(tsconfig, "\"tsBuildInfoFile\"") {
|
|
1200
|
+
t.Fatalf("expected aggregate tsconfig to keep one-shot typecheck by default: %s", tsconfig)
|
|
1201
|
+
}
|
|
1202
|
+
if !strings.Contains(tsconfig, "\"runner-*.ts\"") {
|
|
1203
|
+
t.Fatalf("expected aggregate tsconfig to typecheck generated runner roots: %s", tsconfig)
|
|
1204
|
+
}
|
|
1205
|
+
if !strings.Contains(tsconfig, "./output/@goscript/*") {
|
|
1206
|
+
t.Fatalf("expected aggregate tsconfig path aliases to reference output root: %s", tsconfig)
|
|
1207
|
+
}
|
|
1208
|
+
if strings.Contains(tsconfig, "output/**/*.ts") {
|
|
1209
|
+
t.Fatalf("expected aggregate tsconfig to typecheck from runner roots, not output globs: %s", tsconfig)
|
|
1210
|
+
}
|
|
1211
|
+
}
|
|
1212
|
+
|
|
1213
|
+
func TestRenderTypeScriptProjectsCanUseIncrementalBuildInfo(t *testing.T) {
|
|
1214
|
+
req := &normalizedRequest{
|
|
1215
|
+
WorkDir: "/work",
|
|
1216
|
+
IncrementalTypeCheck: true,
|
|
1217
|
+
}
|
|
1218
|
+
|
|
1219
|
+
packageTSConfig := renderTypeScriptProject(req, "/work/output/package-0", "runner-0.ts", "tsconfig-0.json", false)
|
|
1220
|
+
if !strings.Contains(packageTSConfig, "\"incremental\": true") ||
|
|
1221
|
+
!strings.Contains(packageTSConfig, "\"tsBuildInfoFile\": \".goscript/tsconfig-0.tsbuildinfo\"") {
|
|
1222
|
+
t.Fatalf("expected package tsconfig to cache package typecheck state: %s", packageTSConfig)
|
|
1223
|
+
}
|
|
1224
|
+
|
|
1225
|
+
aggregateTSConfig := renderRuntimeTypeScriptProject(req, []string{"/work/output"}, false)
|
|
1226
|
+
if !strings.Contains(aggregateTSConfig, "\"incremental\": true") ||
|
|
1227
|
+
!strings.Contains(aggregateTSConfig, "\"tsBuildInfoFile\": \".goscript/tsconfig.tsbuildinfo\"") {
|
|
1228
|
+
t.Fatalf("expected aggregate tsconfig to cache typecheck state: %s", aggregateTSConfig)
|
|
1229
|
+
}
|
|
1230
|
+
}
|
|
1231
|
+
|
|
1232
|
+
func requirePackageResult(t *testing.T, result *Result, packagePath string) PackageResult {
|
|
1233
|
+
t.Helper()
|
|
1234
|
+
|
|
1235
|
+
if result != nil {
|
|
1236
|
+
for _, pkg := range result.Packages {
|
|
1237
|
+
if pkg.PackagePath == packagePath {
|
|
1238
|
+
return pkg
|
|
1239
|
+
}
|
|
1240
|
+
}
|
|
1241
|
+
}
|
|
1242
|
+
t.Fatalf("missing package result %q in %#v", packagePath, result)
|
|
1243
|
+
return PackageResult{}
|
|
1244
|
+
}
|
|
1245
|
+
|
|
1246
|
+
func writeFixture(t *testing.T, files map[string]string) string {
|
|
1247
|
+
t.Helper()
|
|
1248
|
+
|
|
1249
|
+
dir := t.TempDir()
|
|
1250
|
+
for name, contents := range files {
|
|
1251
|
+
path := filepath.Join(dir, name)
|
|
1252
|
+
if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil {
|
|
1253
|
+
t.Fatal(err.Error())
|
|
1254
|
+
}
|
|
1255
|
+
if err := os.WriteFile(path, []byte(contents), 0o644); err != nil {
|
|
1256
|
+
t.Fatal(err.Error())
|
|
1257
|
+
}
|
|
1258
|
+
}
|
|
1259
|
+
return dir
|
|
1260
|
+
}
|
|
1261
|
+
|
|
1262
|
+
func writeExecutable(t *testing.T, path string, contents string) {
|
|
1263
|
+
t.Helper()
|
|
1264
|
+
|
|
1265
|
+
if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil {
|
|
1266
|
+
t.Fatal(err.Error())
|
|
1267
|
+
}
|
|
1268
|
+
if err := os.WriteFile(path, []byte(contents), 0o755); err != nil {
|
|
1269
|
+
t.Fatal(err.Error())
|
|
1270
|
+
}
|
|
1271
|
+
}
|