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