goscript 0.0.84 → 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.
Files changed (188) hide show
  1. package/README.md +13 -1
  2. package/cmd/goscript/cmd_compile.go +70 -69
  3. package/cmd/goscript/cmd_compile_test.go +79 -0
  4. package/cmd/goscript/main.go +10 -5
  5. package/compiler/compile-request.go +218 -0
  6. package/compiler/compiler.go +16 -1336
  7. package/compiler/compliance_test.go +196 -0
  8. package/compiler/config.go +6 -13
  9. package/compiler/diagnostic.go +70 -0
  10. package/compiler/index.test.ts +28 -28
  11. package/compiler/index.ts +40 -72
  12. package/compiler/lowered-program.go +132 -0
  13. package/compiler/lowering.go +3576 -0
  14. package/compiler/override-registry.go +422 -0
  15. package/compiler/override-registry_test.go +207 -0
  16. package/compiler/package-graph.go +231 -0
  17. package/compiler/package-graph_test.go +281 -0
  18. package/compiler/result.go +13 -0
  19. package/compiler/runtime-contract.go +279 -0
  20. package/compiler/runtime-contract_test.go +90 -0
  21. package/compiler/semantic-model-types.go +110 -0
  22. package/compiler/semantic-model.go +922 -0
  23. package/compiler/semantic-model_test.go +416 -0
  24. package/compiler/service.go +133 -0
  25. package/compiler/skeleton_test.go +1145 -0
  26. package/compiler/typescript-emitter.go +663 -0
  27. package/compiler/wasm/compile.go +2 -3
  28. package/compiler/wasm/compile_test.go +29 -0
  29. package/compiler/wasm_api.go +10 -159
  30. package/dist/compiler/index.d.ts +1 -3
  31. package/dist/compiler/index.js +31 -55
  32. package/dist/compiler/index.js.map +1 -1
  33. package/dist/gs/builtin/builtin.d.ts +13 -0
  34. package/dist/gs/builtin/builtin.js +23 -0
  35. package/dist/gs/builtin/builtin.js.map +1 -1
  36. package/dist/gs/builtin/channel.d.ts +3 -3
  37. package/dist/gs/builtin/channel.js.map +1 -1
  38. package/dist/gs/builtin/hostio.d.ts +15 -1
  39. package/dist/gs/builtin/hostio.js +134 -49
  40. package/dist/gs/builtin/hostio.js.map +1 -1
  41. package/dist/gs/builtin/index.d.ts +1 -0
  42. package/dist/gs/builtin/index.js +1 -0
  43. package/dist/gs/builtin/index.js.map +1 -1
  44. package/dist/gs/builtin/slice.d.ts +1 -1
  45. package/dist/gs/builtin/slice.js.map +1 -1
  46. package/dist/gs/builtin/type.d.ts +11 -0
  47. package/dist/gs/builtin/type.js +55 -1
  48. package/dist/gs/builtin/type.js.map +1 -1
  49. package/dist/gs/bytes/buffer.gs.js.map +1 -1
  50. package/dist/gs/bytes/bytes.gs.js.map +1 -1
  51. package/dist/gs/bytes/reader.gs.js.map +1 -1
  52. package/dist/gs/context/context.js.map +1 -1
  53. package/dist/gs/crypto/rand/index.d.ts +5 -0
  54. package/dist/gs/crypto/rand/index.js +77 -0
  55. package/dist/gs/crypto/rand/index.js.map +1 -0
  56. package/dist/gs/encoding/json/index.d.ts +3 -0
  57. package/dist/gs/encoding/json/index.js +160 -0
  58. package/dist/gs/encoding/json/index.js.map +1 -0
  59. package/dist/gs/fmt/fmt.js.map +1 -1
  60. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.d.ts +1 -1
  61. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js +1 -1
  62. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js.map +1 -1
  63. package/dist/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/browser.js.map +1 -1
  64. package/dist/gs/github.com/pkg/errors/errors.js.map +1 -1
  65. package/dist/gs/github.com/pkg/errors/stack.js.map +1 -1
  66. package/dist/gs/go/scanner/index.d.ts +29 -0
  67. package/dist/gs/go/scanner/index.js +120 -0
  68. package/dist/gs/go/scanner/index.js.map +1 -0
  69. package/dist/gs/go/token/index.d.ts +31 -0
  70. package/dist/gs/go/token/index.js +82 -0
  71. package/dist/gs/go/token/index.js.map +1 -0
  72. package/dist/gs/internal/abi/index.js.map +1 -1
  73. package/dist/gs/io/fs/fs.js.map +1 -1
  74. package/dist/gs/io/fs/readdir.js.map +1 -1
  75. package/dist/gs/io/fs/readfile.js.map +1 -1
  76. package/dist/gs/io/fs/stat.js.map +1 -1
  77. package/dist/gs/io/fs/sub.js.map +1 -1
  78. package/dist/gs/io/io.js.map +1 -1
  79. package/dist/gs/os/dir_unix.gs.js.map +1 -1
  80. package/dist/gs/os/error.gs.js +2 -4
  81. package/dist/gs/os/error.gs.js.map +1 -1
  82. package/dist/gs/os/exec.gs.js.map +1 -1
  83. package/dist/gs/os/exec_posix.gs.js.map +1 -1
  84. package/dist/gs/os/rawconn_js.gs.js.map +1 -1
  85. package/dist/gs/os/root_js.gs.js.map +1 -1
  86. package/dist/gs/os/tempfile.gs.js +66 -9
  87. package/dist/gs/os/tempfile.gs.js.map +1 -1
  88. package/dist/gs/os/types.gs.js.map +1 -1
  89. package/dist/gs/os/types_js.gs.js +9 -9
  90. package/dist/gs/os/types_js.gs.js.map +1 -1
  91. package/dist/gs/os/types_unix.gs.js.map +1 -1
  92. package/dist/gs/path/filepath/match.js.map +1 -1
  93. package/dist/gs/path/match.js.map +1 -1
  94. package/dist/gs/path/path.js.map +1 -1
  95. package/dist/gs/reflect/index.d.ts +2 -2
  96. package/dist/gs/reflect/index.js +1 -1
  97. package/dist/gs/reflect/index.js.map +1 -1
  98. package/dist/gs/reflect/map.js.map +1 -1
  99. package/dist/gs/reflect/type.d.ts +2 -1
  100. package/dist/gs/reflect/type.js +85 -14
  101. package/dist/gs/reflect/type.js.map +1 -1
  102. package/dist/gs/reflect/types.js.map +1 -1
  103. package/dist/gs/reflect/visiblefields.js.map +1 -1
  104. package/dist/gs/runtime/runtime.js.map +1 -1
  105. package/dist/gs/sort/sort.gs.js.map +1 -1
  106. package/dist/gs/strconv/atoi.gs.js.map +1 -1
  107. package/dist/gs/strconv/quote.gs.js.map +1 -1
  108. package/dist/gs/strings/builder.js.map +1 -1
  109. package/dist/gs/strings/reader.js.map +1 -1
  110. package/dist/gs/strings/replace.js.map +1 -1
  111. package/dist/gs/sync/atomic/type.gs.js.map +1 -1
  112. package/dist/gs/sync/atomic/value.gs.js.map +1 -1
  113. package/dist/gs/sync/sync.d.ts +1 -0
  114. package/dist/gs/sync/sync.js +12 -0
  115. package/dist/gs/sync/sync.js.map +1 -1
  116. package/dist/gs/time/time.js.map +1 -1
  117. package/dist/gs/unicode/unicode.js.map +1 -1
  118. package/go.mod +2 -2
  119. package/gs/builtin/builtin.ts +27 -0
  120. package/gs/builtin/hostio.test.ts +177 -0
  121. package/gs/builtin/hostio.ts +171 -56
  122. package/gs/builtin/index.ts +1 -0
  123. package/gs/builtin/runtime-contract.test.ts +230 -0
  124. package/gs/builtin/type.ts +84 -1
  125. package/gs/crypto/rand/index.test.ts +32 -0
  126. package/gs/crypto/rand/index.ts +90 -0
  127. package/gs/crypto/rand/meta.json +5 -0
  128. package/gs/encoding/json/index.test.ts +65 -0
  129. package/gs/encoding/json/index.ts +186 -0
  130. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.test.ts +23 -0
  131. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.ts +3 -1
  132. package/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/meta.json +3 -1
  133. package/gs/go/scanner/index.test.ts +50 -0
  134. package/gs/go/scanner/index.ts +157 -0
  135. package/gs/go/token/index.test.ts +21 -0
  136. package/gs/go/token/index.ts +120 -0
  137. package/gs/os/file_unix_js.test.ts +50 -0
  138. package/gs/os/meta.json +1 -2
  139. package/gs/os/tempfile.gs.test.ts +85 -0
  140. package/gs/os/tempfile.gs.ts +71 -11
  141. package/gs/os/types_js.gs.ts +9 -9
  142. package/gs/reflect/index.ts +1 -1
  143. package/gs/reflect/type.ts +106 -17
  144. package/gs/reflect/typefor.test.ts +75 -0
  145. package/gs/sync/sync.test.ts +24 -0
  146. package/gs/sync/sync.ts +12 -0
  147. package/package.json +13 -13
  148. package/compiler/analysis.go +0 -3475
  149. package/compiler/analysis_test.go +0 -338
  150. package/compiler/assignment.go +0 -580
  151. package/compiler/builtin_test.go +0 -92
  152. package/compiler/code-writer.go +0 -115
  153. package/compiler/compiler_test.go +0 -149
  154. package/compiler/composite-lit.go +0 -779
  155. package/compiler/config_test.go +0 -62
  156. package/compiler/constraint.go +0 -86
  157. package/compiler/decl.go +0 -801
  158. package/compiler/expr-call-async.go +0 -188
  159. package/compiler/expr-call-builtins.go +0 -208
  160. package/compiler/expr-call-helpers.go +0 -382
  161. package/compiler/expr-call-make.go +0 -318
  162. package/compiler/expr-call-type-conversion.go +0 -520
  163. package/compiler/expr-call.go +0 -413
  164. package/compiler/expr-selector.go +0 -343
  165. package/compiler/expr-star.go +0 -82
  166. package/compiler/expr-type.go +0 -442
  167. package/compiler/expr-value.go +0 -89
  168. package/compiler/expr.go +0 -773
  169. package/compiler/field.go +0 -183
  170. package/compiler/gs_dependencies_test.go +0 -298
  171. package/compiler/lit.go +0 -322
  172. package/compiler/output.go +0 -72
  173. package/compiler/primitive.go +0 -149
  174. package/compiler/protobuf.go +0 -697
  175. package/compiler/sanitize.go +0 -100
  176. package/compiler/spec-struct.go +0 -995
  177. package/compiler/spec-value.go +0 -540
  178. package/compiler/spec.go +0 -725
  179. package/compiler/stmt-assign.go +0 -664
  180. package/compiler/stmt-for.go +0 -266
  181. package/compiler/stmt-range.go +0 -475
  182. package/compiler/stmt-select.go +0 -262
  183. package/compiler/stmt-type-switch.go +0 -147
  184. package/compiler/stmt.go +0 -1308
  185. package/compiler/type-assert.go +0 -386
  186. package/compiler/type-info.go +0 -156
  187. package/compiler/type-utils.go +0 -207
  188. package/compiler/type.go +0 -892
@@ -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
- }