goscript 0.1.4 → 0.2.0
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 +5 -2
- package/cmd/go_js_wasm_exec/main.go +201 -0
- package/cmd/go_js_wasm_exec/main_test.go +83 -0
- package/cmd/goscript/{cmd_compile.go → cmd-compile.go} +7 -0
- package/cmd/goscript/cmd-test.go +14 -0
- package/cmd/goscript/cmd-test_test.go +1 -1
- package/compiler/compile-request.go +12 -9
- package/compiler/compliance_test.go +0 -1
- package/compiler/config.go +2 -0
- package/compiler/gotest/request.go +28 -0
- package/compiler/gotest/runner.go +353 -27
- package/compiler/gotest/runner_test.go +273 -1
- package/compiler/gotest/testdata/browserapi/browserapi_test.go +20 -0
- package/compiler/gotest/testdata/browserapi/go.mod +3 -0
- package/compiler/lowered-program.go +24 -17
- package/compiler/lowering.go +392 -127
- package/compiler/lowering_bench_test.go +41 -27
- package/compiler/override-facts.go +15 -0
- package/compiler/override-parity-verifier.go +450 -0
- package/compiler/override-parity.go +122 -0
- package/compiler/override-registry_test.go +559 -0
- package/compiler/protobuf-ts-binding.go +514 -0
- package/compiler/protobuf-ts-binding_test.go +172 -0
- package/compiler/semantic-model-types.go +9 -4
- package/compiler/semantic-model.go +282 -70
- package/compiler/semantic-model_test.go +82 -1
- package/compiler/service.go +20 -1
- package/compiler/skeleton_test.go +62 -8
- package/compiler/typescript-emitter.go +128 -13
- package/dist/gs/builtin/slice.d.ts +2 -1
- package/dist/gs/builtin/slice.js +29 -4
- package/dist/gs/builtin/slice.js.map +1 -1
- package/dist/gs/builtin/type.d.ts +13 -5
- package/dist/gs/builtin/type.js +153 -60
- package/dist/gs/builtin/type.js.map +1 -1
- package/dist/gs/builtin/varRef.d.ts +11 -0
- package/dist/gs/builtin/varRef.js +57 -2
- package/dist/gs/builtin/varRef.js.map +1 -1
- package/dist/gs/bytes/buffer.gs.js +1 -1
- package/dist/gs/bytes/buffer.gs.js.map +1 -1
- package/dist/gs/bytes/reader.gs.js +1 -1
- package/dist/gs/bytes/reader.gs.js.map +1 -1
- package/dist/gs/compress/zlib/index.d.ts +10 -3
- package/dist/gs/compress/zlib/index.js +50 -16
- package/dist/gs/compress/zlib/index.js.map +1 -1
- package/dist/gs/encoding/json/index.d.ts +114 -0
- package/dist/gs/encoding/json/index.js +544 -36
- package/dist/gs/encoding/json/index.js.map +1 -1
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.d.ts +100 -0
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js +564 -0
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js.map +1 -1
- package/dist/gs/github.com/pkg/errors/errors.js +54 -30
- package/dist/gs/github.com/pkg/errors/errors.js.map +1 -1
- package/dist/gs/go/scanner/index.d.ts +2 -0
- package/dist/gs/go/scanner/index.js +29 -5
- package/dist/gs/go/scanner/index.js.map +1 -1
- package/dist/gs/go/token/index.js +22 -6
- package/dist/gs/go/token/index.js.map +1 -1
- package/dist/gs/hash/index.d.ts +6 -0
- package/dist/gs/hash/index.js +20 -0
- package/dist/gs/hash/index.js.map +1 -1
- package/dist/gs/internal/goarch/index.d.ts +43 -3
- package/dist/gs/internal/goarch/index.js +42 -10
- package/dist/gs/internal/goarch/index.js.map +1 -1
- package/dist/gs/io/fs/fs.js +26 -14
- package/dist/gs/io/fs/fs.js.map +1 -1
- package/dist/gs/io/fs/readdir.js +4 -2
- package/dist/gs/io/fs/readdir.js.map +1 -1
- package/dist/gs/io/fs/sub.js +8 -1
- package/dist/gs/io/fs/sub.js.map +1 -1
- package/dist/gs/io/io.d.ts +2 -0
- package/dist/gs/io/io.js.map +1 -1
- package/dist/gs/math/bits/index.d.ts +5 -0
- package/dist/gs/math/bits/index.js +16 -4
- package/dist/gs/math/bits/index.js.map +1 -1
- package/dist/gs/mime/index.d.ts +16 -0
- package/dist/gs/mime/index.js +315 -6
- package/dist/gs/mime/index.js.map +1 -1
- package/dist/gs/net/http/httptest/index.d.ts +12 -0
- package/dist/gs/net/http/httptest/index.js +85 -6
- package/dist/gs/net/http/httptest/index.js.map +1 -1
- package/dist/gs/net/http/index.d.ts +300 -5
- package/dist/gs/net/http/index.js +1598 -58
- package/dist/gs/net/http/index.js.map +1 -1
- package/dist/gs/os/dir_unix.gs.js +1 -1
- package/dist/gs/os/dir_unix.gs.js.map +1 -1
- package/dist/gs/os/error.gs.js +1 -1
- package/dist/gs/os/error.gs.js.map +1 -1
- package/dist/gs/os/exec.gs.d.ts +1 -0
- package/dist/gs/os/exec.gs.js +4 -8
- package/dist/gs/os/exec.gs.js.map +1 -1
- package/dist/gs/os/exec_posix.gs.js +1 -1
- package/dist/gs/os/exec_posix.gs.js.map +1 -1
- package/dist/gs/os/index.d.ts +1 -1
- package/dist/gs/os/index.js +1 -1
- package/dist/gs/os/index.js.map +1 -1
- package/dist/gs/os/proc.gs.d.ts +4 -0
- package/dist/gs/os/proc.gs.js +12 -6
- package/dist/gs/os/proc.gs.js.map +1 -1
- package/dist/gs/os/root_js.gs.js +1 -1
- package/dist/gs/os/root_js.gs.js.map +1 -1
- package/dist/gs/os/types.gs.js +1 -1
- package/dist/gs/os/types.gs.js.map +1 -1
- package/dist/gs/os/types_js.gs.js +1 -1
- package/dist/gs/os/types_js.gs.js.map +1 -1
- package/dist/gs/os/types_unix.gs.js +1 -1
- package/dist/gs/os/types_unix.gs.js.map +1 -1
- package/dist/gs/path/path.js +11 -7
- package/dist/gs/path/path.js.map +1 -1
- package/dist/gs/reflect/index.d.ts +5 -4
- package/dist/gs/reflect/index.js +4 -3
- package/dist/gs/reflect/index.js.map +1 -1
- package/dist/gs/reflect/map.js +15 -0
- package/dist/gs/reflect/map.js.map +1 -1
- package/dist/gs/reflect/type.d.ts +25 -6
- package/dist/gs/reflect/type.js +1418 -228
- package/dist/gs/reflect/type.js.map +1 -1
- package/dist/gs/reflect/types.d.ts +14 -6
- package/dist/gs/reflect/types.js +35 -1
- package/dist/gs/reflect/types.js.map +1 -1
- package/dist/gs/reflect/value.d.ts +1 -0
- package/dist/gs/reflect/value.js +83 -41
- package/dist/gs/reflect/value.js.map +1 -1
- package/dist/gs/reflect/visiblefields.js +4 -140
- package/dist/gs/reflect/visiblefields.js.map +1 -1
- package/dist/gs/runtime/pprof/index.d.ts +8 -2
- package/dist/gs/runtime/pprof/index.js +50 -30
- package/dist/gs/runtime/pprof/index.js.map +1 -1
- package/dist/gs/runtime/runtime.js +5 -4
- package/dist/gs/runtime/runtime.js.map +1 -1
- package/dist/gs/runtime/trace/index.js +5 -19
- package/dist/gs/runtime/trace/index.js.map +1 -1
- package/dist/gs/strconv/atoi.gs.js +1 -1
- package/dist/gs/strconv/atoi.gs.js.map +1 -1
- package/dist/gs/strconv/complex.gs.d.ts +3 -0
- package/dist/gs/strconv/complex.gs.js +148 -0
- package/dist/gs/strconv/complex.gs.js.map +1 -0
- package/dist/gs/strconv/index.d.ts +1 -0
- package/dist/gs/strconv/index.js +1 -0
- package/dist/gs/strconv/index.js.map +1 -1
- package/dist/gs/strings/builder.js +1 -1
- package/dist/gs/strings/reader.js +9 -5
- package/dist/gs/strings/reader.js.map +1 -1
- package/dist/gs/strings/replace.js +15 -7
- package/dist/gs/strings/replace.js.map +1 -1
- package/dist/gs/strings/strings.d.ts +5 -0
- package/dist/gs/strings/strings.js +57 -5
- package/dist/gs/strings/strings.js.map +1 -1
- package/dist/gs/sync/atomic/type.gs.js +9 -9
- package/dist/gs/sync/atomic/type.gs.js.map +1 -1
- package/dist/gs/sync/atomic/value.gs.js +2 -2
- package/dist/gs/sync/atomic/value.gs.js.map +1 -1
- package/dist/gs/syscall/env.js +22 -14
- package/dist/gs/syscall/env.js.map +1 -1
- package/dist/gs/testing/testing.js +55 -13
- package/dist/gs/testing/testing.js.map +1 -1
- package/dist/gs/time/time.d.ts +24 -1
- package/dist/gs/time/time.js +43 -3
- package/dist/gs/time/time.js.map +1 -1
- package/dist/gs/unique/index.js +7 -1
- package/dist/gs/unique/index.js.map +1 -1
- package/go.mod +3 -3
- package/go.sum +16 -0
- package/gs/builtin/runtime-contract.test.ts +218 -21
- package/gs/builtin/slice.ts +44 -4
- package/gs/builtin/type.ts +226 -59
- package/gs/builtin/varRef.ts +85 -2
- package/gs/bytes/buffer.gs.ts +1 -1
- package/gs/bytes/reader.gs.ts +1 -1
- package/gs/compress/zlib/index.test.ts +62 -1
- package/gs/compress/zlib/index.ts +53 -16
- package/gs/compress/zlib/parity.json +51 -0
- package/gs/encoding/json/index.test.ts +360 -6
- package/gs/encoding/json/index.ts +679 -38
- package/gs/encoding/json/parity.json +81 -0
- package/gs/github.com/aperturerobotics/protobuf-go-lite/index.test.ts +211 -3
- package/gs/github.com/aperturerobotics/protobuf-go-lite/index.ts +857 -1
- package/gs/github.com/pkg/errors/errors.ts +54 -30
- package/gs/go/scanner/index.test.ts +39 -56
- package/gs/go/scanner/index.ts +33 -5
- package/gs/go/scanner/parity.json +27 -0
- package/gs/go/token/index.ts +22 -6
- package/gs/hash/index.test.ts +20 -33
- package/gs/hash/index.ts +28 -0
- package/gs/hash/parity.json +21 -0
- package/gs/internal/goarch/index.test.ts +32 -0
- package/gs/internal/goarch/index.ts +45 -13
- package/gs/internal/goarch/parity.json +144 -0
- package/gs/io/fs/fs.ts +26 -14
- package/gs/io/fs/readdir.ts +4 -4
- package/gs/io/fs/sub.ts +8 -1
- package/gs/io/io.ts +1 -0
- package/gs/io/parity.json +162 -0
- package/gs/math/bits/index.test.ts +14 -1
- package/gs/math/bits/index.ts +23 -4
- package/gs/math/bits/parity.json +156 -0
- package/gs/mime/index.test.ts +90 -0
- package/gs/mime/index.ts +369 -6
- package/gs/mime/parity.json +36 -0
- package/gs/net/http/httptest/index.test.ts +98 -2
- package/gs/net/http/httptest/index.ts +101 -6
- package/gs/net/http/httptest/parity.json +15 -0
- package/gs/net/http/index.test.ts +781 -12
- package/gs/net/http/index.ts +1860 -139
- package/gs/net/http/meta.json +16 -1
- package/gs/net/http/parity.json +193 -0
- package/gs/os/dir_unix.gs.ts +1 -1
- package/gs/os/error.gs.ts +1 -1
- package/gs/os/exec.gs.ts +4 -8
- package/gs/os/exec_posix.gs.ts +1 -1
- package/gs/os/index.test.ts +9 -0
- package/gs/os/index.ts +1 -0
- package/gs/os/parity.json +9 -0
- package/gs/os/proc.gs.ts +18 -5
- package/gs/os/proc.test.ts +26 -0
- package/gs/os/root_js.gs.ts +1 -1
- package/gs/os/types.gs.ts +1 -1
- package/gs/os/types_js.gs.ts +1 -1
- package/gs/os/types_unix.gs.ts +1 -1
- package/gs/path/path.ts +11 -7
- package/gs/reflect/field.test.ts +37 -15
- package/gs/reflect/function-types.test.ts +518 -22
- package/gs/reflect/index.ts +8 -6
- package/gs/reflect/map.ts +20 -0
- package/gs/reflect/meta.json +6 -4
- package/gs/reflect/parity.json +234 -0
- package/gs/reflect/sliceat.test.ts +156 -0
- package/gs/reflect/structof.test.ts +401 -0
- package/gs/reflect/type.ts +1897 -317
- package/gs/reflect/typefor.test.ts +510 -10
- package/gs/reflect/types.ts +43 -18
- package/gs/reflect/value.ts +105 -45
- package/gs/reflect/visiblefields.ts +5 -168
- package/gs/runtime/parity.json +24 -0
- package/gs/runtime/pprof/index.test.ts +29 -7
- package/gs/runtime/pprof/index.ts +56 -30
- package/gs/runtime/pprof/parity.json +27 -0
- package/gs/runtime/runtime.test.ts +3 -1
- package/gs/runtime/runtime.ts +4 -3
- package/gs/runtime/trace/index.test.ts +5 -3
- package/gs/runtime/trace/index.ts +8 -20
- package/gs/runtime/trace/parity.json +36 -0
- package/gs/strconv/atoi.gs.ts +1 -1
- package/gs/strconv/complex.gs.ts +174 -0
- package/gs/strconv/complex.test.ts +65 -0
- package/gs/strconv/index.ts +1 -0
- package/gs/strconv/parity.json +120 -0
- package/gs/strings/builder.ts +1 -1
- package/gs/strings/parity.json +186 -0
- package/gs/strings/reader.ts +9 -5
- package/gs/strings/replace.ts +15 -7
- package/gs/strings/strings.test.ts +22 -2
- package/gs/strings/strings.ts +64 -6
- package/gs/sync/atomic/type.gs.ts +9 -9
- package/gs/sync/atomic/value.gs.ts +2 -2
- package/gs/syscall/env.ts +29 -14
- package/gs/testing/testing.test.ts +67 -0
- package/gs/testing/testing.ts +87 -19
- package/gs/time/parity.json +225 -0
- package/gs/time/time.test.ts +20 -2
- package/gs/time/time.ts +49 -7
- package/gs/unique/index.ts +7 -1
- package/package.json +4 -2
- package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.d.ts +0 -217
- package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js +0 -926
- package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js.map +0 -1
- package/gs/github.com/aperturerobotics/starpc/srpc/index.test.ts +0 -38
- package/gs/github.com/aperturerobotics/starpc/srpc/index.ts +0 -1361
- package/gs/github.com/aperturerobotics/starpc/srpc/meta.json +0 -46
- /package/compiler/{wasm_api.go → wasm-api.go} +0 -0
|
@@ -1036,7 +1036,7 @@ func TestRunnerRunsCombinedRuntimeChunks(t *testing.T) {
|
|
|
1036
1036
|
"case \"$runner\" in",
|
|
1037
1037
|
"runner-all-*)",
|
|
1038
1038
|
"\tsed -n 's/.*await __goscriptRunPackage(\"\\([^\"]*\\)\".*/\\1/p' \"$runner\" | while IFS= read -r pkg; do",
|
|
1039
|
-
"\t\tprintf '" + combinedRuntimeResultPrefix + "
|
|
1039
|
+
"\t\tprintf '" + combinedRuntimeResultPrefix + "%s\\t1\\t1\\t\\n' \"$pkg\"",
|
|
1040
1040
|
"\tdone",
|
|
1041
1041
|
"\texit 0",
|
|
1042
1042
|
"\t;;",
|
|
@@ -1072,6 +1072,157 @@ func TestRunnerRunsCombinedRuntimeChunks(t *testing.T) {
|
|
|
1072
1072
|
}
|
|
1073
1073
|
}
|
|
1074
1074
|
|
|
1075
|
+
func TestRunnerRunsBrowserRuntimeBackend(t *testing.T) {
|
|
1076
|
+
moduleDir := writeFixture(t, map[string]string{
|
|
1077
|
+
"go.mod": "module example.test/browser\n\ngo 1.25.3\n",
|
|
1078
|
+
"value_test.go": strings.Join([]string{
|
|
1079
|
+
"package browser",
|
|
1080
|
+
"",
|
|
1081
|
+
"import \"testing\"",
|
|
1082
|
+
"",
|
|
1083
|
+
"func TestBrowser(t *testing.T) {}",
|
|
1084
|
+
"",
|
|
1085
|
+
}, "\n"),
|
|
1086
|
+
})
|
|
1087
|
+
workDir := filepath.Join(moduleDir, ".tmp", "browser-runtime")
|
|
1088
|
+
writeExecutable(t, filepath.Join(moduleDir, "node_modules", ".bin", "vitest"), strings.Join([]string{
|
|
1089
|
+
"#!/bin/sh",
|
|
1090
|
+
"printf '" + combinedRuntimeResultPrefix + "example.test%%2Fbrowser\\t1\\t7\\tbrowser%%20ok\\n'",
|
|
1091
|
+
"exit 0",
|
|
1092
|
+
"",
|
|
1093
|
+
}, "\n"))
|
|
1094
|
+
|
|
1095
|
+
result, err := NewRunner().Run(context.Background(), &Request{
|
|
1096
|
+
Dir: moduleDir,
|
|
1097
|
+
Patterns: []string{"."},
|
|
1098
|
+
Timeout: 30 * time.Second,
|
|
1099
|
+
WorkDir: workDir,
|
|
1100
|
+
RuntimeBackend: RuntimeBackendBrowser,
|
|
1101
|
+
})
|
|
1102
|
+
if err != nil {
|
|
1103
|
+
t.Fatalf("run browser runtime fixture: %v", err)
|
|
1104
|
+
}
|
|
1105
|
+
if !result.Passed() {
|
|
1106
|
+
t.Fatalf("expected browser runtime fixture to pass: %#v", result.Packages)
|
|
1107
|
+
}
|
|
1108
|
+
if got := result.Packages[0].Output; got != "browser ok" {
|
|
1109
|
+
t.Fatalf("expected browser runtime output, got %q", got)
|
|
1110
|
+
}
|
|
1111
|
+
config, err := os.ReadFile(filepath.Join(workDir, "vitest-browser-0.config.mts"))
|
|
1112
|
+
if err != nil {
|
|
1113
|
+
t.Fatalf("read browser vitest config: %v", err)
|
|
1114
|
+
}
|
|
1115
|
+
if !strings.Contains(string(config), "browser: \"chromium\"") {
|
|
1116
|
+
t.Fatalf("expected Chromium browser config, got:\n%s", config)
|
|
1117
|
+
}
|
|
1118
|
+
}
|
|
1119
|
+
|
|
1120
|
+
func TestRunnerReportsBrowserRuntimeFailureRecord(t *testing.T) {
|
|
1121
|
+
moduleDir := writeFixture(t, map[string]string{
|
|
1122
|
+
"go.mod": "module example.test/browserfail\n\ngo 1.25.3\n",
|
|
1123
|
+
"value_test.go": strings.Join([]string{
|
|
1124
|
+
"package browserfail",
|
|
1125
|
+
"",
|
|
1126
|
+
"import \"testing\"",
|
|
1127
|
+
"",
|
|
1128
|
+
"func TestBrowser(t *testing.T) {}",
|
|
1129
|
+
"",
|
|
1130
|
+
}, "\n"),
|
|
1131
|
+
})
|
|
1132
|
+
writeExecutable(t, filepath.Join(moduleDir, "node_modules", ".bin", "tsgo"), "#!/bin/sh\nexit 0\n")
|
|
1133
|
+
writeExecutable(t, filepath.Join(moduleDir, "node_modules", ".bin", "vitest"), strings.Join([]string{
|
|
1134
|
+
"#!/bin/sh",
|
|
1135
|
+
"printf '" + combinedRuntimeResultPrefix + "example.test%%2Fbrowserfail\\t0\\t3\\tpage%%20exploded\\n'",
|
|
1136
|
+
"exit 1",
|
|
1137
|
+
"",
|
|
1138
|
+
}, "\n"))
|
|
1139
|
+
|
|
1140
|
+
result, err := NewRunner().Run(context.Background(), &Request{
|
|
1141
|
+
Dir: moduleDir,
|
|
1142
|
+
Patterns: []string{"."},
|
|
1143
|
+
Timeout: 30 * time.Second,
|
|
1144
|
+
RuntimeBackend: RuntimeBackendBrowser,
|
|
1145
|
+
})
|
|
1146
|
+
if err != nil {
|
|
1147
|
+
t.Fatalf("run browser failure fixture: %v", err)
|
|
1148
|
+
}
|
|
1149
|
+
if result.Passed() {
|
|
1150
|
+
t.Fatalf("expected browser runtime failure")
|
|
1151
|
+
}
|
|
1152
|
+
pkg := requirePackageResult(t, result, "example.test/browserfail")
|
|
1153
|
+
if pkg.Action != ActionFail || pkg.Phases.Runtime != PhaseStatusFail || pkg.Error != "page exploded" {
|
|
1154
|
+
t.Fatalf("unexpected browser failure result: %#v", pkg)
|
|
1155
|
+
}
|
|
1156
|
+
}
|
|
1157
|
+
|
|
1158
|
+
func TestParseCombinedRuntimeRecordsLineProtocol(t *testing.T) {
|
|
1159
|
+
records, ok := parseCombinedRuntimeRecords(strings.Join([]string{
|
|
1160
|
+
"ordinary output",
|
|
1161
|
+
combinedRuntimeResultPrefix + "example.test%2Fpkg\t1\t42\tline%201%0Aline%202%09tail",
|
|
1162
|
+
"",
|
|
1163
|
+
}, "\n"))
|
|
1164
|
+
if !ok {
|
|
1165
|
+
t.Fatal("expected combined runtime record")
|
|
1166
|
+
}
|
|
1167
|
+
if len(records) != 1 {
|
|
1168
|
+
t.Fatalf("expected one combined runtime record, got %#v", records)
|
|
1169
|
+
}
|
|
1170
|
+
record := records[0]
|
|
1171
|
+
if record.PackagePath != "example.test/pkg" {
|
|
1172
|
+
t.Fatalf("unexpected package path: %q", record.PackagePath)
|
|
1173
|
+
}
|
|
1174
|
+
if !record.OK {
|
|
1175
|
+
t.Fatal("expected passing runtime record")
|
|
1176
|
+
}
|
|
1177
|
+
if record.ElapsedMS != 42 {
|
|
1178
|
+
t.Fatalf("unexpected elapsed ms: %d", record.ElapsedMS)
|
|
1179
|
+
}
|
|
1180
|
+
if record.Output != "line 1\nline 2\ttail" {
|
|
1181
|
+
t.Fatalf("unexpected output: %q", record.Output)
|
|
1182
|
+
}
|
|
1183
|
+
}
|
|
1184
|
+
|
|
1185
|
+
func TestRunnerReportsBrowserRuntimeMissingResult(t *testing.T) {
|
|
1186
|
+
moduleDir := writeFixture(t, map[string]string{
|
|
1187
|
+
"go.mod": "module example.test/browsermissing\n\ngo 1.25.3\n",
|
|
1188
|
+
"value_test.go": strings.Join([]string{
|
|
1189
|
+
"package browsermissing",
|
|
1190
|
+
"",
|
|
1191
|
+
"import \"testing\"",
|
|
1192
|
+
"",
|
|
1193
|
+
"func TestBrowser(t *testing.T) {}",
|
|
1194
|
+
"",
|
|
1195
|
+
}, "\n"),
|
|
1196
|
+
})
|
|
1197
|
+
writeExecutable(t, filepath.Join(moduleDir, "node_modules", ".bin", "tsgo"), "#!/bin/sh\nexit 0\n")
|
|
1198
|
+
writeExecutable(t, filepath.Join(moduleDir, "node_modules", ".bin", "vitest"), strings.Join([]string{
|
|
1199
|
+
"#!/bin/sh",
|
|
1200
|
+
"printf 'page exploded before result\\n'",
|
|
1201
|
+
"exit 1",
|
|
1202
|
+
"",
|
|
1203
|
+
}, "\n"))
|
|
1204
|
+
|
|
1205
|
+
result, err := NewRunner().Run(context.Background(), &Request{
|
|
1206
|
+
Dir: moduleDir,
|
|
1207
|
+
Patterns: []string{"."},
|
|
1208
|
+
Timeout: 30 * time.Second,
|
|
1209
|
+
RuntimeBackend: RuntimeBackendBrowser,
|
|
1210
|
+
})
|
|
1211
|
+
if err != nil {
|
|
1212
|
+
t.Fatalf("run browser missing-result fixture: %v", err)
|
|
1213
|
+
}
|
|
1214
|
+
if result.Passed() {
|
|
1215
|
+
t.Fatalf("expected browser runtime failure")
|
|
1216
|
+
}
|
|
1217
|
+
pkg := requirePackageResult(t, result, "example.test/browsermissing")
|
|
1218
|
+
if pkg.Action != ActionFail || pkg.Phases.Runtime != PhaseStatusFail {
|
|
1219
|
+
t.Fatalf("unexpected browser missing-result status: %#v", pkg)
|
|
1220
|
+
}
|
|
1221
|
+
if !strings.Contains(pkg.Error, "page exploded before result") {
|
|
1222
|
+
t.Fatalf("expected browser process output in error, got %#v", pkg)
|
|
1223
|
+
}
|
|
1224
|
+
}
|
|
1225
|
+
|
|
1075
1226
|
func TestRunnerFallsBackToPackageScopedTypeScriptProjects(t *testing.T) {
|
|
1076
1227
|
moduleDir := writeFixture(t, map[string]string{
|
|
1077
1228
|
"go.mod": "module example.test/packageprojects\n\ngo 1.25.3\n",
|
|
@@ -1195,6 +1346,34 @@ func TestNormalizeKeepsIncrementalTypeCheckExplicit(t *testing.T) {
|
|
|
1195
1346
|
}
|
|
1196
1347
|
}
|
|
1197
1348
|
|
|
1349
|
+
func TestNormalizeRuntimeBackend(t *testing.T) {
|
|
1350
|
+
norm, err := (&Request{Patterns: []string{"."}}).normalize()
|
|
1351
|
+
if err != nil {
|
|
1352
|
+
t.Fatalf("normalize default runtime backend: %v", err)
|
|
1353
|
+
}
|
|
1354
|
+
if norm.RuntimeBackend != RuntimeBackendBun {
|
|
1355
|
+
t.Fatalf("runtime backend = %q, want %q", norm.RuntimeBackend, RuntimeBackendBun)
|
|
1356
|
+
}
|
|
1357
|
+
|
|
1358
|
+
norm, err = (&Request{
|
|
1359
|
+
Patterns: []string{"."},
|
|
1360
|
+
RuntimeBackend: RuntimeBackendBrowser,
|
|
1361
|
+
}).normalize()
|
|
1362
|
+
if err != nil {
|
|
1363
|
+
t.Fatalf("normalize browser runtime backend: %v", err)
|
|
1364
|
+
}
|
|
1365
|
+
if norm.RuntimeBackend != RuntimeBackendBrowser {
|
|
1366
|
+
t.Fatalf("runtime backend = %q, want %q", norm.RuntimeBackend, RuntimeBackendBrowser)
|
|
1367
|
+
}
|
|
1368
|
+
|
|
1369
|
+
if _, err := (&Request{
|
|
1370
|
+
Patterns: []string{"."},
|
|
1371
|
+
RuntimeBackend: RuntimeBackend("deno"),
|
|
1372
|
+
}).normalize(); err == nil {
|
|
1373
|
+
t.Fatal("expected unsupported runtime backend to fail")
|
|
1374
|
+
}
|
|
1375
|
+
}
|
|
1376
|
+
|
|
1198
1377
|
func TestPackageExecutionIndexesPrioritizesLargerTestPackages(t *testing.T) {
|
|
1199
1378
|
result := &Result{Packages: []PackageResult{
|
|
1200
1379
|
{
|
|
@@ -1251,6 +1430,76 @@ func TestRenderRunnerChangesToPackageSourceDir(t *testing.T) {
|
|
|
1251
1430
|
}
|
|
1252
1431
|
}
|
|
1253
1432
|
|
|
1433
|
+
func TestRenderBrowserRunnerAvoidsProcessAPIs(t *testing.T) {
|
|
1434
|
+
req := &normalizedRequest{
|
|
1435
|
+
RuntimeBackend: RuntimeBackendBrowser,
|
|
1436
|
+
}
|
|
1437
|
+
runner := renderPackageRunner(PackageResult{
|
|
1438
|
+
PackagePath: "example.test/pkg",
|
|
1439
|
+
SourceDir: "/workspace/pkg",
|
|
1440
|
+
Tests: []Test{{
|
|
1441
|
+
Name: "TestBrowser",
|
|
1442
|
+
PackagePath: "example.test/pkg",
|
|
1443
|
+
}},
|
|
1444
|
+
}, req)
|
|
1445
|
+
|
|
1446
|
+
if strings.Contains(runner, "process.") {
|
|
1447
|
+
t.Fatalf("browser runner should not use process APIs: %s", runner)
|
|
1448
|
+
}
|
|
1449
|
+
if !strings.Contains(runner, "import { test } from \"vitest\"") {
|
|
1450
|
+
t.Fatalf("expected browser runner to use Vitest: %s", runner)
|
|
1451
|
+
}
|
|
1452
|
+
if !strings.Contains(runner, "await runTests(\"example.test/pkg\"") {
|
|
1453
|
+
t.Fatalf("expected browser runner to execute package tests: %s", runner)
|
|
1454
|
+
}
|
|
1455
|
+
}
|
|
1456
|
+
|
|
1457
|
+
func TestRenderBrowserRunnerReportsProcessExit(t *testing.T) {
|
|
1458
|
+
req := &normalizedRequest{
|
|
1459
|
+
RuntimeBackend: RuntimeBackendBrowser,
|
|
1460
|
+
}
|
|
1461
|
+
runner := renderPackageRunner(PackageResult{
|
|
1462
|
+
PackagePath: "example.test/pkg",
|
|
1463
|
+
SourceDir: "/workspace/pkg",
|
|
1464
|
+
Tests: []Test{{
|
|
1465
|
+
Name: "TestBrowser",
|
|
1466
|
+
PackagePath: "example.test/pkg",
|
|
1467
|
+
}},
|
|
1468
|
+
}, req)
|
|
1469
|
+
|
|
1470
|
+
if !strings.Contains(runner, "__goscriptProcessExitCode") {
|
|
1471
|
+
t.Fatalf("expected browser runner to classify process exit: %s", runner)
|
|
1472
|
+
}
|
|
1473
|
+
if !strings.Contains(runner, "goscript process exited with code") {
|
|
1474
|
+
t.Fatalf("expected browser runner to report process exit code: %s", runner)
|
|
1475
|
+
}
|
|
1476
|
+
if !strings.Contains(runner, "__goscriptOK = exitCode === 0") {
|
|
1477
|
+
t.Fatalf("expected zero exit to pass and nonzero exit to fail: %s", runner)
|
|
1478
|
+
}
|
|
1479
|
+
}
|
|
1480
|
+
|
|
1481
|
+
func TestRenderBrowserRunnerHonorsPanicOnExitZero(t *testing.T) {
|
|
1482
|
+
req := &normalizedRequest{
|
|
1483
|
+
RuntimeBackend: RuntimeBackendBrowser,
|
|
1484
|
+
PanicOnExit0: true,
|
|
1485
|
+
}
|
|
1486
|
+
runner := renderPackageRunner(PackageResult{
|
|
1487
|
+
PackagePath: "example.test/pkg",
|
|
1488
|
+
SourceDir: "/workspace/pkg",
|
|
1489
|
+
Tests: []Test{{
|
|
1490
|
+
Name: "TestBrowser",
|
|
1491
|
+
PackagePath: "example.test/pkg",
|
|
1492
|
+
}},
|
|
1493
|
+
}, req)
|
|
1494
|
+
|
|
1495
|
+
if !strings.Contains(runner, "exitCode === 0 && true") {
|
|
1496
|
+
t.Fatalf("expected panic-on-exit-zero to reject os.Exit(0): %s", runner)
|
|
1497
|
+
}
|
|
1498
|
+
if !strings.Contains(runner, "unexpected os.Exit(0) during test") {
|
|
1499
|
+
t.Fatalf("expected panic-on-exit-zero error text: %s", runner)
|
|
1500
|
+
}
|
|
1501
|
+
}
|
|
1502
|
+
|
|
1254
1503
|
func TestRenderCombinedRunnerChangesToEachPackageSourceDir(t *testing.T) {
|
|
1255
1504
|
req := &normalizedRequest{}
|
|
1256
1505
|
runner := renderCombinedRunner(&Result{Packages: []PackageResult{
|
|
@@ -1303,6 +1552,29 @@ func TestRenderTypeScriptProjectDisablesAmbientTypePackages(t *testing.T) {
|
|
|
1303
1552
|
}
|
|
1304
1553
|
}
|
|
1305
1554
|
|
|
1555
|
+
func TestRenderBrowserTypeScriptProjectsExcludeNodeAmbientDeclarations(t *testing.T) {
|
|
1556
|
+
req := &normalizedRequest{
|
|
1557
|
+
WorkDir: "/work",
|
|
1558
|
+
RuntimeBackend: RuntimeBackendBrowser,
|
|
1559
|
+
}
|
|
1560
|
+
|
|
1561
|
+
packageTSConfig := renderTypeScriptProject(req, "/work/output/package-0", "runner-0.ts", "tsconfig-0.json", false)
|
|
1562
|
+
if strings.Contains(packageTSConfig, "goscript-node.d.ts") {
|
|
1563
|
+
t.Fatalf("browser package tsconfig should not include node ambient declarations: %s", packageTSConfig)
|
|
1564
|
+
}
|
|
1565
|
+
if !strings.Contains(packageTSConfig, "goscript-browser.d.ts") {
|
|
1566
|
+
t.Fatalf("browser package tsconfig should include browser ambient declarations: %s", packageTSConfig)
|
|
1567
|
+
}
|
|
1568
|
+
|
|
1569
|
+
aggregateTSConfig := renderRuntimeTypeScriptProject(req, []string{"/work/output"}, false)
|
|
1570
|
+
if strings.Contains(aggregateTSConfig, "goscript-node.d.ts") {
|
|
1571
|
+
t.Fatalf("browser aggregate tsconfig should not include node ambient declarations: %s", aggregateTSConfig)
|
|
1572
|
+
}
|
|
1573
|
+
if !strings.Contains(aggregateTSConfig, "goscript-browser.d.ts") {
|
|
1574
|
+
t.Fatalf("browser aggregate tsconfig should include browser ambient declarations: %s", aggregateTSConfig)
|
|
1575
|
+
}
|
|
1576
|
+
}
|
|
1577
|
+
|
|
1306
1578
|
func TestRenderTypeScriptProjectUsesNodeTypesWhenAvailable(t *testing.T) {
|
|
1307
1579
|
req := &normalizedRequest{
|
|
1308
1580
|
WorkDir: "/work",
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
//go:build js && wasm
|
|
2
|
+
|
|
3
|
+
package browserapi
|
|
4
|
+
|
|
5
|
+
import (
|
|
6
|
+
"syscall/js"
|
|
7
|
+
"testing"
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
func TestBrowserAPI(t *testing.T) {
|
|
11
|
+
document := js.Global().Get("document")
|
|
12
|
+
if document.IsUndefined() || document.IsNull() {
|
|
13
|
+
t.Fatal("missing browser document")
|
|
14
|
+
}
|
|
15
|
+
div := document.Call("createElement", "div")
|
|
16
|
+
div.Set("id", "goscript-browser-api")
|
|
17
|
+
if got := div.Get("id").String(); got != "goscript-browser-api" {
|
|
18
|
+
t.Fatalf("div id = %q", got)
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -18,6 +18,7 @@ type loweredFile struct {
|
|
|
18
18
|
decls []loweredDecl
|
|
19
19
|
exports []string
|
|
20
20
|
typeExports []string
|
|
21
|
+
exportAll bool
|
|
21
22
|
sideEffect bool
|
|
22
23
|
}
|
|
23
24
|
|
|
@@ -75,28 +76,34 @@ type loweredStructField struct {
|
|
|
75
76
|
runtimeType string
|
|
76
77
|
doc string
|
|
77
78
|
tag string
|
|
79
|
+
pkgPath string
|
|
80
|
+
index []int
|
|
81
|
+
offset int64
|
|
82
|
+
anonymous bool
|
|
83
|
+
exported bool
|
|
78
84
|
structValue bool
|
|
79
85
|
arrayValue bool
|
|
80
86
|
}
|
|
81
87
|
|
|
82
88
|
type loweredFunction struct {
|
|
83
|
-
exported
|
|
84
|
-
indexExported
|
|
85
|
-
init
|
|
86
|
-
async
|
|
87
|
-
name
|
|
88
|
-
typeParams
|
|
89
|
-
runtimeName
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
89
|
+
exported bool
|
|
90
|
+
indexExported bool
|
|
91
|
+
init bool
|
|
92
|
+
async bool
|
|
93
|
+
name string
|
|
94
|
+
typeParams []string
|
|
95
|
+
runtimeName string
|
|
96
|
+
runtimeSignature string
|
|
97
|
+
receiverAlias string
|
|
98
|
+
receiverType string
|
|
99
|
+
receiverValue string
|
|
100
|
+
receiverMutable bool
|
|
101
|
+
params []loweredParam
|
|
102
|
+
paramBindings []loweredStmt
|
|
103
|
+
namedResults []loweredNamedResult
|
|
104
|
+
result string
|
|
105
|
+
body []loweredStmt
|
|
106
|
+
deferState *loweredDeferState
|
|
100
107
|
}
|
|
101
108
|
|
|
102
109
|
type loweredParam struct {
|