goscript 0.0.83 → 0.1.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 +13 -1
- package/cmd/goscript/cmd_compile.go +70 -69
- package/cmd/goscript/cmd_compile_test.go +79 -0
- package/cmd/goscript/main.go +10 -5
- package/compiler/compile-request.go +218 -0
- package/compiler/compiler.go +16 -1336
- package/compiler/compliance_test.go +196 -0
- package/compiler/config.go +6 -13
- package/compiler/diagnostic.go +70 -0
- package/compiler/index.test.ts +28 -28
- package/compiler/index.ts +40 -72
- package/compiler/lowered-program.go +132 -0
- package/compiler/lowering.go +3576 -0
- package/compiler/override-registry.go +422 -0
- package/compiler/override-registry_test.go +207 -0
- package/compiler/package-graph.go +231 -0
- package/compiler/package-graph_test.go +281 -0
- package/compiler/result.go +13 -0
- package/compiler/runtime-contract.go +279 -0
- package/compiler/runtime-contract_test.go +90 -0
- package/compiler/semantic-model-types.go +110 -0
- package/compiler/semantic-model.go +922 -0
- package/compiler/semantic-model_test.go +416 -0
- package/compiler/service.go +133 -0
- package/compiler/skeleton_test.go +1145 -0
- package/compiler/typescript-emitter.go +663 -0
- package/compiler/wasm/compile.go +2 -3
- package/compiler/wasm/compile_test.go +29 -0
- package/compiler/wasm_api.go +10 -159
- package/dist/compiler/index.d.ts +1 -3
- package/dist/compiler/index.js +31 -55
- package/dist/compiler/index.js.map +1 -1
- package/dist/gs/builtin/builtin.d.ts +13 -0
- package/dist/gs/builtin/builtin.js +27 -7
- package/dist/gs/builtin/builtin.js.map +1 -1
- package/dist/gs/builtin/channel.d.ts +3 -3
- package/dist/gs/builtin/channel.js.map +1 -1
- package/dist/gs/builtin/hostio.d.ts +86 -0
- package/dist/gs/builtin/hostio.js +266 -0
- package/dist/gs/builtin/hostio.js.map +1 -0
- package/dist/gs/builtin/index.d.ts +1 -0
- package/dist/gs/builtin/index.js +1 -0
- package/dist/gs/builtin/index.js.map +1 -1
- package/dist/gs/builtin/print.d.ts +8 -0
- package/dist/gs/builtin/print.js +111 -0
- package/dist/gs/builtin/print.js.map +1 -0
- package/dist/gs/builtin/slice.d.ts +1 -1
- package/dist/gs/builtin/slice.js.map +1 -1
- package/dist/gs/builtin/type.d.ts +11 -0
- package/dist/gs/builtin/type.js +55 -1
- package/dist/gs/builtin/type.js.map +1 -1
- package/dist/gs/bytes/buffer.gs.js.map +1 -1
- package/dist/gs/bytes/bytes.gs.js.map +1 -1
- package/dist/gs/bytes/reader.gs.js.map +1 -1
- package/dist/gs/context/context.js.map +1 -1
- package/dist/gs/crypto/rand/index.d.ts +5 -0
- package/dist/gs/crypto/rand/index.js +77 -0
- package/dist/gs/crypto/rand/index.js.map +1 -0
- package/dist/gs/encoding/json/index.d.ts +3 -0
- package/dist/gs/encoding/json/index.js +160 -0
- package/dist/gs/encoding/json/index.js.map +1 -0
- package/dist/gs/fmt/fmt.js +2 -22
- package/dist/gs/fmt/fmt.js.map +1 -1
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.d.ts +1 -1
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js +1 -1
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js.map +1 -1
- package/dist/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/browser.js.map +1 -1
- package/dist/gs/github.com/pkg/errors/errors.js.map +1 -1
- package/dist/gs/github.com/pkg/errors/stack.js.map +1 -1
- package/dist/gs/go/scanner/index.d.ts +29 -0
- package/dist/gs/go/scanner/index.js +120 -0
- package/dist/gs/go/scanner/index.js.map +1 -0
- package/dist/gs/go/token/index.d.ts +31 -0
- package/dist/gs/go/token/index.js +82 -0
- package/dist/gs/go/token/index.js.map +1 -0
- package/dist/gs/internal/abi/index.js.map +1 -1
- package/dist/gs/io/fs/fs.js.map +1 -1
- package/dist/gs/io/fs/readdir.js.map +1 -1
- package/dist/gs/io/fs/readfile.js.map +1 -1
- package/dist/gs/io/fs/stat.js.map +1 -1
- package/dist/gs/io/fs/sub.js.map +1 -1
- package/dist/gs/io/io.js.map +1 -1
- package/dist/gs/os/dir_unix.gs.js.map +1 -1
- package/dist/gs/os/error.gs.js +2 -4
- package/dist/gs/os/error.gs.js.map +1 -1
- package/dist/gs/os/exec.gs.js.map +1 -1
- package/dist/gs/os/exec_posix.gs.js.map +1 -1
- package/dist/gs/os/rawconn_js.gs.js.map +1 -1
- package/dist/gs/os/root_js.gs.js.map +1 -1
- package/dist/gs/os/tempfile.gs.js +66 -9
- package/dist/gs/os/tempfile.gs.js.map +1 -1
- package/dist/gs/os/types.gs.js.map +1 -1
- package/dist/gs/os/types_js.gs.d.ts +2 -51
- package/dist/gs/os/types_js.gs.js +67 -105
- package/dist/gs/os/types_js.gs.js.map +1 -1
- package/dist/gs/os/types_unix.gs.js.map +1 -1
- package/dist/gs/path/filepath/match.js.map +1 -1
- package/dist/gs/path/match.js.map +1 -1
- package/dist/gs/path/path.js.map +1 -1
- package/dist/gs/reflect/index.d.ts +2 -2
- package/dist/gs/reflect/index.js +1 -1
- package/dist/gs/reflect/index.js.map +1 -1
- package/dist/gs/reflect/map.js.map +1 -1
- package/dist/gs/reflect/type.d.ts +2 -1
- package/dist/gs/reflect/type.js +85 -14
- package/dist/gs/reflect/type.js.map +1 -1
- package/dist/gs/reflect/types.js.map +1 -1
- package/dist/gs/reflect/visiblefields.js.map +1 -1
- package/dist/gs/runtime/runtime.js.map +1 -1
- package/dist/gs/sort/sort.gs.js.map +1 -1
- package/dist/gs/strconv/atoi.gs.js.map +1 -1
- package/dist/gs/strconv/quote.gs.js.map +1 -1
- package/dist/gs/strings/builder.js.map +1 -1
- package/dist/gs/strings/reader.js.map +1 -1
- package/dist/gs/strings/replace.js.map +1 -1
- package/dist/gs/sync/atomic/type.gs.js.map +1 -1
- package/dist/gs/sync/atomic/value.gs.js.map +1 -1
- package/dist/gs/sync/sync.d.ts +1 -0
- package/dist/gs/sync/sync.js +12 -0
- package/dist/gs/sync/sync.js.map +1 -1
- package/dist/gs/time/time.js.map +1 -1
- package/dist/gs/unicode/unicode.js.map +1 -1
- package/go.mod +2 -2
- package/gs/builtin/builtin.ts +31 -6
- package/gs/builtin/hostio.test.ts +246 -0
- package/gs/builtin/hostio.ts +413 -0
- package/gs/builtin/index.ts +1 -0
- package/gs/builtin/print.test.ts +48 -0
- package/gs/builtin/print.ts +154 -0
- package/gs/builtin/runtime-contract.test.ts +230 -0
- package/gs/builtin/type.ts +84 -1
- package/gs/crypto/rand/index.test.ts +32 -0
- package/gs/crypto/rand/index.ts +90 -0
- package/gs/crypto/rand/meta.json +5 -0
- package/gs/encoding/json/index.test.ts +65 -0
- package/gs/encoding/json/index.ts +186 -0
- package/gs/fmt/fmt.test.ts +41 -30
- package/gs/fmt/fmt.ts +2 -22
- package/gs/github.com/aperturerobotics/protobuf-go-lite/index.test.ts +23 -0
- package/gs/github.com/aperturerobotics/protobuf-go-lite/index.ts +3 -1
- package/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/meta.json +3 -1
- package/gs/go/scanner/index.test.ts +50 -0
- package/gs/go/scanner/index.ts +157 -0
- package/gs/go/token/index.test.ts +21 -0
- package/gs/go/token/index.ts +120 -0
- package/gs/os/file_unix_js.test.ts +103 -0
- package/gs/os/meta.json +1 -2
- package/gs/os/tempfile.gs.test.ts +85 -0
- package/gs/os/tempfile.gs.ts +71 -11
- package/gs/os/types_js.gs.ts +74 -153
- package/gs/reflect/index.ts +1 -1
- package/gs/reflect/type.ts +106 -17
- package/gs/reflect/typefor.test.ts +75 -0
- package/gs/sync/sync.test.ts +24 -0
- package/gs/sync/sync.ts +12 -0
- package/package.json +13 -13
- package/compiler/analysis.go +0 -3475
- package/compiler/analysis_test.go +0 -338
- package/compiler/assignment.go +0 -580
- package/compiler/builtin_test.go +0 -92
- package/compiler/code-writer.go +0 -115
- package/compiler/compiler_test.go +0 -149
- package/compiler/composite-lit.go +0 -779
- package/compiler/config_test.go +0 -62
- package/compiler/constraint.go +0 -86
- package/compiler/decl.go +0 -801
- package/compiler/expr-call-async.go +0 -188
- package/compiler/expr-call-builtins.go +0 -208
- package/compiler/expr-call-helpers.go +0 -382
- package/compiler/expr-call-make.go +0 -318
- package/compiler/expr-call-type-conversion.go +0 -520
- package/compiler/expr-call.go +0 -413
- package/compiler/expr-selector.go +0 -343
- package/compiler/expr-star.go +0 -82
- package/compiler/expr-type.go +0 -442
- package/compiler/expr-value.go +0 -89
- package/compiler/expr.go +0 -773
- package/compiler/field.go +0 -183
- package/compiler/gs_dependencies_test.go +0 -298
- package/compiler/lit.go +0 -322
- package/compiler/output.go +0 -72
- package/compiler/primitive.go +0 -149
- package/compiler/protobuf.go +0 -697
- package/compiler/sanitize.go +0 -100
- package/compiler/spec-struct.go +0 -995
- package/compiler/spec-value.go +0 -540
- package/compiler/spec.go +0 -725
- package/compiler/stmt-assign.go +0 -664
- package/compiler/stmt-for.go +0 -266
- package/compiler/stmt-range.go +0 -475
- package/compiler/stmt-select.go +0 -262
- package/compiler/stmt-type-switch.go +0 -147
- package/compiler/stmt.go +0 -1308
- package/compiler/type-assert.go +0 -386
- package/compiler/type-info.go +0 -156
- package/compiler/type-utils.go +0 -207
- package/compiler/type.go +0 -892
package/compiler/code-writer.go
DELETED
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
package compiler
|
|
2
|
-
|
|
3
|
-
import (
|
|
4
|
-
"fmt"
|
|
5
|
-
"io"
|
|
6
|
-
"strings"
|
|
7
|
-
)
|
|
8
|
-
|
|
9
|
-
// TSCodeWriter writes TypeScript code.
|
|
10
|
-
type TSCodeWriter struct {
|
|
11
|
-
w io.Writer
|
|
12
|
-
indentLevel int
|
|
13
|
-
sectionWrittenFlag bool
|
|
14
|
-
lineWritten bool
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
// NewTSCodeWriter builds a new TypeScript code writer.
|
|
18
|
-
func NewTSCodeWriter(w io.Writer) *TSCodeWriter {
|
|
19
|
-
return &TSCodeWriter{w: w}
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
// WriteLinePreamble writes the indentation.
|
|
23
|
-
func (w *TSCodeWriter) WriteLinePreamble() {
|
|
24
|
-
w.sectionWrittenFlag = true
|
|
25
|
-
w.lineWritten = false
|
|
26
|
-
for range w.indentLevel {
|
|
27
|
-
w.w.Write([]byte{byte('\t')}) //nolint:errcheck
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
// WriteLine writes a line of code to the output.
|
|
32
|
-
func (w *TSCodeWriter) WriteLine(line string) {
|
|
33
|
-
if line != "" && w.lineWritten {
|
|
34
|
-
w.WriteLinePreamble()
|
|
35
|
-
}
|
|
36
|
-
w.w.Write([]byte(line)) //nolint:errcheck
|
|
37
|
-
w.w.Write([]byte{byte('\n')}) //nolint:errcheck
|
|
38
|
-
w.lineWritten = true
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
// WriteLinef writes a formatted line of code to the output.
|
|
42
|
-
func (w *TSCodeWriter) WriteLinef(line string, args ...any) {
|
|
43
|
-
l := fmt.Sprintf(line, args...)
|
|
44
|
-
w.WriteLine(l)
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
// Indent changes the indentation level by a delta.
|
|
48
|
-
func (w *TSCodeWriter) Indent(count int) {
|
|
49
|
-
w.indentLevel += count
|
|
50
|
-
if w.indentLevel < 0 {
|
|
51
|
-
w.indentLevel = 0
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
// WriteImport writes a TypeScript import.
|
|
56
|
-
func (w *TSCodeWriter) WriteImport(symbolName, importPath string) {
|
|
57
|
-
w.WriteLinef("import * as %s from %q", symbolName, importPath)
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
// WriteCommentLine writes a comment as a // line.
|
|
61
|
-
func (w *TSCodeWriter) WriteCommentLine(commentText string) {
|
|
62
|
-
lines := strings.SplitSeq(commentText, "\n")
|
|
63
|
-
for line := range lines {
|
|
64
|
-
w.WriteLinef("// %s", line)
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
// WriteCommentLinef writes a formatted comment as a // line.
|
|
69
|
-
func (w *TSCodeWriter) WriteCommentLinef(format string, args ...any) {
|
|
70
|
-
commentText := fmt.Sprintf(format, args...)
|
|
71
|
-
lines := strings.SplitSeq(commentText, "\n")
|
|
72
|
-
for line := range lines {
|
|
73
|
-
w.WriteLinef("// %s", line)
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
// WriteCommentInline write a comment within /* */.
|
|
78
|
-
func (w *TSCodeWriter) WriteCommentInline(commentText string) {
|
|
79
|
-
w.w.Write([]byte("/* ")) //nolint:errcheck
|
|
80
|
-
w.w.Write([]byte(commentText)) //nolint:errcheck
|
|
81
|
-
w.w.Write([]byte(" */")) //nolint:errcheck
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
// WriteCommentInlinef writes a formatted comment within /* */.
|
|
85
|
-
func (w *TSCodeWriter) WriteCommentInlinef(format string, args ...any) {
|
|
86
|
-
w.WriteCommentInline(fmt.Sprintf(format, args...))
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
// WriteLiterally writes something to the output without processing
|
|
90
|
-
func (w *TSCodeWriter) WriteLiterally(literal string) {
|
|
91
|
-
w.sectionWrittenFlag = true
|
|
92
|
-
if w.lineWritten {
|
|
93
|
-
w.WriteLinePreamble()
|
|
94
|
-
}
|
|
95
|
-
w.w.Write([]byte(literal)) //nolint:errcheck
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
// WriteLiterallyf writes something to the output with formatting.
|
|
99
|
-
func (w *TSCodeWriter) WriteLiterallyf(literal string, args ...any) {
|
|
100
|
-
w.sectionWrittenFlag = true
|
|
101
|
-
if w.lineWritten {
|
|
102
|
-
w.WriteLinePreamble()
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
l := fmt.Sprintf(literal, args...)
|
|
106
|
-
w.w.Write([]byte(l)) //nolint:errcheck
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
// WriteSectionTail writes the end of a section.
|
|
110
|
-
func (w *TSCodeWriter) WriteSectionTail() {
|
|
111
|
-
if w.sectionWrittenFlag {
|
|
112
|
-
w.WriteLine("")
|
|
113
|
-
w.sectionWrittenFlag = false
|
|
114
|
-
}
|
|
115
|
-
}
|
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
package compiler_test
|
|
2
|
-
|
|
3
|
-
import (
|
|
4
|
-
"fmt"
|
|
5
|
-
"os"
|
|
6
|
-
"os/exec"
|
|
7
|
-
"path/filepath"
|
|
8
|
-
"runtime"
|
|
9
|
-
"slices"
|
|
10
|
-
"strings"
|
|
11
|
-
"sync"
|
|
12
|
-
"sync/atomic"
|
|
13
|
-
"testing"
|
|
14
|
-
|
|
15
|
-
"github.com/aperturerobotics/goscript/tests"
|
|
16
|
-
)
|
|
17
|
-
|
|
18
|
-
// NOTE: this is here instead of tests/tests_test.go so coverage ends up in this package.
|
|
19
|
-
|
|
20
|
-
func TestCompliance(t *testing.T) {
|
|
21
|
-
// Get workspace directory (project root)
|
|
22
|
-
workspaceDir, err := os.Getwd()
|
|
23
|
-
if err != nil {
|
|
24
|
-
t.Fatalf("failed to get working directory: %v", err)
|
|
25
|
-
}
|
|
26
|
-
workspaceDir = filepath.Join(workspaceDir, "..")
|
|
27
|
-
|
|
28
|
-
// First collect all test paths
|
|
29
|
-
testsDir := filepath.Join(workspaceDir, "tests/tests")
|
|
30
|
-
dirs, err := os.ReadDir(testsDir)
|
|
31
|
-
if err != nil {
|
|
32
|
-
t.Fatalf("failed to read tests dir: %v", err)
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
var testPaths []string
|
|
36
|
-
for _, dir := range dirs {
|
|
37
|
-
if !dir.IsDir() {
|
|
38
|
-
continue
|
|
39
|
-
}
|
|
40
|
-
testPath := filepath.Join(testsDir, dir.Name())
|
|
41
|
-
goFiles, err := filepath.Glob(filepath.Join(testPath, "*.go"))
|
|
42
|
-
if err != nil || len(goFiles) == 0 {
|
|
43
|
-
// t.Errorf("no .go files found in %s", testPath)
|
|
44
|
-
continue
|
|
45
|
-
}
|
|
46
|
-
testPaths = append(testPaths, testPath)
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
// sort testPaths
|
|
50
|
-
slices.Sort(testPaths)
|
|
51
|
-
|
|
52
|
-
// limit concurrency
|
|
53
|
-
simulLimit := make(chan struct{}, runtime.GOMAXPROCS(-1))
|
|
54
|
-
for range cap(simulLimit) {
|
|
55
|
-
simulLimit <- struct{}{}
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
// Now run tests in parallel with goroutines
|
|
59
|
-
var wg sync.WaitGroup
|
|
60
|
-
var ranTests atomic.Int32
|
|
61
|
-
for _, testPath := range testPaths {
|
|
62
|
-
wg.Add(1)
|
|
63
|
-
go func(path string) {
|
|
64
|
-
defer wg.Done() // runs even if t.Run is skipped
|
|
65
|
-
t.Run(filepath.Base(path), func(t *testing.T) {
|
|
66
|
-
t.Helper()
|
|
67
|
-
|
|
68
|
-
ranTests.Add(1)
|
|
69
|
-
// limit how many tests can run simultaneously
|
|
70
|
-
<-simulLimit
|
|
71
|
-
defer func() {
|
|
72
|
-
simulLimit <- struct{}{}
|
|
73
|
-
}()
|
|
74
|
-
tests.RunGoScriptTestDir(t, workspaceDir, path) // Pass workspaceDir
|
|
75
|
-
|
|
76
|
-
// Remove dir if everything passed
|
|
77
|
-
if !t.Failed() {
|
|
78
|
-
os.RemoveAll(filepath.Join(path, "run"))
|
|
79
|
-
}
|
|
80
|
-
})
|
|
81
|
-
}(testPath)
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
// Wait for all tests to complete
|
|
85
|
-
wg.Wait()
|
|
86
|
-
|
|
87
|
-
// Typecheck
|
|
88
|
-
failed := t.Failed()
|
|
89
|
-
t.Run("typecheck", func(t *testing.T) {
|
|
90
|
-
t.Helper()
|
|
91
|
-
if failed {
|
|
92
|
-
t.Log("at least one tests test failed: skipping typecheck")
|
|
93
|
-
t.SkipNow()
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
// NOTE: typecheck does not yet pass, so we skip for now.
|
|
97
|
-
if ranTests.Load() != 0 {
|
|
98
|
-
t.Log("at least one tests test ran: skipping typecheck")
|
|
99
|
-
t.SkipNow()
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
// Get parent module path for the global typecheck
|
|
103
|
-
parentModPath, err := getParentGoModulePath()
|
|
104
|
-
if err != nil {
|
|
105
|
-
t.Fatalf("Failed to determine parent Go module path: %v", err)
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
// Create global typecheck tsconfig
|
|
109
|
-
tsconfigPath := tests.WriteGlobalTypeCheckConfig(t, parentModPath, workspaceDir)
|
|
110
|
-
|
|
111
|
-
// Run TypeScript type checking
|
|
112
|
-
typecheckDir := filepath.Dir(tsconfigPath)
|
|
113
|
-
cmd := exec.Command("tsc", "--project", filepath.Base(tsconfigPath))
|
|
114
|
-
cmd.Dir = typecheckDir
|
|
115
|
-
|
|
116
|
-
// Set up PATH to include node_modules/.bin
|
|
117
|
-
nodeBinDir := filepath.Join(workspaceDir, "node_modules", ".bin")
|
|
118
|
-
currentPath := os.Getenv("PATH")
|
|
119
|
-
newPath := nodeBinDir + string(os.PathListSeparator) + currentPath
|
|
120
|
-
cmd.Env = append(os.Environ(), "PATH="+newPath)
|
|
121
|
-
|
|
122
|
-
output, err := cmd.CombinedOutput()
|
|
123
|
-
if err != nil {
|
|
124
|
-
t.Errorf("Global TypeScript type checking failed: %v\noutput:\n%s", err, string(output))
|
|
125
|
-
} else {
|
|
126
|
-
t.Logf("Global TypeScript type checking passed")
|
|
127
|
-
}
|
|
128
|
-
})
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
// getParentGoModulePath is a helper function to get the parent Go module path
|
|
132
|
-
// This is similar to the one in tests.go but simplified for use in tests
|
|
133
|
-
func getParentGoModulePath() (string, error) {
|
|
134
|
-
cmd := exec.Command("go", "list", "-m")
|
|
135
|
-
output, err := cmd.Output()
|
|
136
|
-
if err != nil {
|
|
137
|
-
return "", err
|
|
138
|
-
}
|
|
139
|
-
// note: in a go work configuration, go list -m can report multiple modules
|
|
140
|
-
// only one of which is the goscript case, so we need to filter:
|
|
141
|
-
pf := strings.Fields(strings.TrimSpace(string(output)))
|
|
142
|
-
pf = slices.DeleteFunc(pf, func(n string) bool {
|
|
143
|
-
return !strings.HasSuffix(n, "goscript")
|
|
144
|
-
})
|
|
145
|
-
if len(pf) != 1 {
|
|
146
|
-
return "", fmt.Errorf("'go list -m' did not have exactly 1 goscript package -- run in root of goscript package")
|
|
147
|
-
}
|
|
148
|
-
return pf[0], nil
|
|
149
|
-
}
|