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,266 +0,0 @@
1
- package compiler
2
-
3
- import (
4
- "fmt"
5
- "go/ast"
6
- "go/token"
7
- "go/types"
8
-
9
- "github.com/pkg/errors"
10
- )
11
-
12
- // WriteStmtFor translates a Go `for` statement (`ast.ForStmt`) into a
13
- // TypeScript `for` loop.
14
- // The structure is `for (init_ts; cond_ts; post_ts) { body_ts }`.
15
- // - The initialization part (`exp.Init`) is translated using `WriteStmtForInit`.
16
- // - The condition part (`exp.Cond`) is translated using `WriteValueExpr`. If nil,
17
- // the condition part in TypeScript is empty (resulting in an infinite loop
18
- // unless broken out of).
19
- // - The post-iteration part (`exp.Post`) is translated using `WriteStmtForPost`.
20
- // - The loop body (`exp.Body`) is translated as a block statement using `WriteStmtBlock`.
21
- //
22
- // This function covers standard Go `for` loops (three-part loops, condition-only
23
- // loops, and infinite loops). `for...range` loops are handled by `WriteStmtRange`.
24
- func (c *GoToTSCompiler) WriteStmtFor(exp *ast.ForStmt) error {
25
- c.tsw.WriteLiterally("for (")
26
- if exp.Init != nil {
27
- if err := c.WriteStmtForInit(exp.Init); err != nil { // Use WriteStmtForInit
28
- return fmt.Errorf("failed to write for loop initialization: %w", err)
29
- }
30
- }
31
- c.tsw.WriteLiterally("; ")
32
- if exp.Cond != nil {
33
- if err := c.WriteValueExpr(exp.Cond); err != nil { // Condition is a value
34
- return fmt.Errorf("failed to write for loop condition: %w", err)
35
- }
36
- }
37
- c.tsw.WriteLiterally("; ")
38
- if exp.Post != nil {
39
- if err := c.WriteStmtForPost(exp.Post); err != nil { // Use WriteStmtForPost
40
- return fmt.Errorf("failed to write for loop post statement: %w", err)
41
- }
42
- }
43
- c.tsw.WriteLiterally(") ")
44
- if err := c.WriteStmtBlock(exp.Body, false); err != nil {
45
- return fmt.Errorf("failed to write for loop body: %w", err)
46
- }
47
- return nil
48
- }
49
-
50
- // WriteStmtForInit translates the initialization part of a Go `for` loop header
51
- // (e.g., `i := 0` or `i = 0` in `for i := 0; ...`) into its TypeScript equivalent.
52
- // - If `stmt` is an `ast.AssignStmt`:
53
- // - For short variable declarations (`:=`) with multiple variables (e.g., `i, j := 0, 10`),
54
- // it generates `let i = 0, j = 10`. Each LHS variable is paired with its
55
- // corresponding RHS value; if RHS values are insufficient, remaining LHS
56
- // variables are initialized with their zero value using `WriteZeroValue`.
57
- // - For other assignments (single variable `:=`, or regular `=`), it uses
58
- // `writeAssignmentCore`. If it's `:=`, `let` is prepended.
59
- // - If `stmt` is an `ast.ExprStmt` (less common in `for` inits), it translates
60
- // the expression using `WriteValueExpr`.
61
- //
62
- // Unhandled statement types in the init part result in a comment.
63
- func (c *GoToTSCompiler) WriteStmtForInit(stmt ast.Stmt) error {
64
- switch s := stmt.(type) {
65
- case *ast.AssignStmt:
66
- // Handle assignment in init (e.g., i := 0 or i = 0)
67
- // For TypeScript for-loop init, we need to handle multi-variable declarations differently
68
- if s.Tok == token.DEFINE && len(s.Lhs) > 1 && len(s.Rhs) == 1 {
69
- // Handle the case where we have multiple LHS variables but only one RHS expression
70
- // Use array destructuring for all cases including map comma-ok idiom
71
- rhsExpr := s.Rhs[0]
72
- c.tsw.WriteLiterally("let [")
73
- for i, lhs := range s.Lhs {
74
- if i > 0 {
75
- c.tsw.WriteLiterally(", ")
76
- }
77
- if err := c.WriteValueExpr(lhs); err != nil {
78
- return err
79
- }
80
- }
81
- c.tsw.WriteLiterally("] = ")
82
- if err := c.writeDestructuringValue(rhsExpr); err != nil {
83
- return err
84
- }
85
- return nil
86
- } else if s.Tok == token.DEFINE && len(s.Lhs) > 1 && len(s.Rhs) > 0 {
87
- // For loop initialization with multiple variables (e.g., let i = 0, j = 10)
88
- c.tsw.WriteLiterally("let ")
89
-
90
- // Handle each LHS variable with its corresponding RHS value
91
- for i, lhs := range s.Lhs {
92
- if i > 0 {
93
- c.tsw.WriteLiterally(", ")
94
- }
95
-
96
- // Write the LHS variable name
97
- if err := c.WriteValueExpr(lhs); err != nil {
98
- return err
99
- }
100
-
101
- // Write the corresponding RHS, or a default if not enough RHS values
102
- c.tsw.WriteLiterally(" = ")
103
- if i < len(s.Rhs) {
104
- // If there's a corresponding RHS value
105
- if err := c.WriteValueExpr(s.Rhs[i]); err != nil {
106
- return err
107
- }
108
- } else {
109
- // No corresponding RHS
110
- return errors.Errorf("no corresponding rhs to lhs: %v", s)
111
- }
112
- }
113
- } else {
114
- // Regular single variable or assignment (not declaration)
115
- if s.Tok == token.DEFINE {
116
- c.tsw.WriteLiterally("let ")
117
- }
118
- // Use existing assignment core logic
119
- if err := c.writeAssignmentCore(s.Lhs, s.Rhs, s.Tok, false); err != nil {
120
- return err
121
- }
122
- }
123
- return nil
124
- case *ast.ExprStmt:
125
- // Handle expression statement in init
126
- return c.WriteValueExpr(s.X)
127
- case *ast.IncDecStmt:
128
- // Handle increment/decrement in init (e.g., for i++; ...)
129
- if err := c.WriteValueExpr(s.X); err != nil { // The expression (e.g., i)
130
- return err
131
- }
132
- tokStr, ok := TokenToTs(s.Tok)
133
- if !ok {
134
- return errors.Errorf("unknown incdec token: %v", s.Tok)
135
- }
136
- c.tsw.WriteLiterally(tokStr) // The token (e.g., ++)
137
- return nil
138
- default:
139
- return errors.Errorf("unhandled for loop init statement: %T", stmt)
140
- }
141
- }
142
-
143
- // writeDestructuringValue writes a value expression in a destructuring context.
144
- // For map index expressions, it generates the full tuple without [0] indexing.
145
- func (c *GoToTSCompiler) writeDestructuringValue(expr ast.Expr) error {
146
- // Check if this is a map index expression that should return a tuple
147
- if indexExpr, ok := expr.(*ast.IndexExpr); ok {
148
- if tv, ok := c.pkg.TypesInfo.Types[indexExpr.X]; ok {
149
- underlyingType := tv.Type.Underlying()
150
- // Check if it's a map type
151
- if mapType, isMap := underlyingType.(*types.Map); isMap {
152
- c.tsw.WriteLiterally("$.mapGet(")
153
- if err := c.WriteValueExpr(indexExpr.X); err != nil {
154
- return err
155
- }
156
- c.tsw.WriteLiterally(", ")
157
- if err := c.WriteValueExpr(indexExpr.Index); err != nil {
158
- return err
159
- }
160
- c.tsw.WriteLiterally(", ")
161
- // Write the zero value as the default value for mapGet
162
- c.WriteZeroValueForType(mapType.Elem())
163
- c.tsw.WriteLiterally(")") // Don't add [0] for destructuring
164
- return nil
165
- }
166
- // Check if it's a type parameter constrained to be a map type
167
- if typeParam, isTypeParam := tv.Type.(*types.TypeParam); isTypeParam {
168
- constraint := typeParam.Constraint()
169
- if constraint != nil {
170
- underlying := constraint.Underlying()
171
- if iface, isInterface := underlying.(*types.Interface); isInterface {
172
- if hasMapConstraint(iface) {
173
- c.tsw.WriteLiterally("$.mapGet(")
174
- if err := c.WriteValueExpr(indexExpr.X); err != nil {
175
- return err
176
- }
177
- c.tsw.WriteLiterally(", ")
178
- if err := c.WriteValueExpr(indexExpr.Index); err != nil {
179
- return err
180
- }
181
- c.tsw.WriteLiterally(", ")
182
- // Generate the zero value as the default value for mapGet
183
- mapValueType := getMapValueTypeFromConstraint(iface)
184
- if mapValueType != nil {
185
- c.WriteZeroValueForType(mapValueType)
186
- } else {
187
- c.tsw.WriteLiterally("null")
188
- }
189
- c.tsw.WriteLiterally(")") // Don't add [0] for destructuring
190
- return nil
191
- }
192
- }
193
- }
194
- }
195
- }
196
- }
197
- // For non-map expressions, use the regular WriteValueExpr
198
- return c.WriteValueExpr(expr)
199
- }
200
-
201
- // WriteStmtForPost translates the post-iteration part of a Go `for` loop header
202
- // (e.g., `i++` or `i, j = i+1, j-1` in `for ...; i++`) into its TypeScript
203
- // equivalent.
204
- // - If `stmt` is an `ast.IncDecStmt` (e.g., `i++`), it writes `i_ts++`.
205
- // - If `stmt` is an `ast.AssignStmt`:
206
- // - For multiple variable assignments (e.g., `i, j = i+1, j-1`), it generates
207
- // TypeScript array destructuring: `[i_ts, j_ts] = [i_ts+1, j_ts-1]`.
208
- // - For single variable assignments, it uses `writeAssignmentCore`.
209
- // - If `stmt` is an `ast.ExprStmt` (less common), it translates the expression
210
- // using `WriteValueExpr`.
211
- //
212
- // Unhandled statement types in the post part result in a comment.
213
- func (c *GoToTSCompiler) WriteStmtForPost(stmt ast.Stmt) error {
214
- switch s := stmt.(type) {
215
- case *ast.IncDecStmt:
216
- // Handle increment/decrement (e.g., i++)
217
- if err := c.WriteValueExpr(s.X); err != nil { // The expression (e.g., i)
218
- return err
219
- }
220
- tokStr, ok := TokenToTs(s.Tok)
221
- if !ok {
222
- return errors.Errorf("unknown incdec token: %v", s.Tok)
223
- }
224
- c.tsw.WriteLiterally(tokStr) // The token (e.g., ++)
225
- return nil
226
- case *ast.AssignStmt:
227
- // For multiple variable assignment in post like i, j = i+1, j-1
228
- // we need to use destructuring in TypeScript like [i, j] = [i+1, j-1]
229
- if len(s.Lhs) > 1 && len(s.Rhs) > 0 {
230
- // Write LHS as array destructuring
231
- c.tsw.WriteLiterally("[")
232
- for i, lhs := range s.Lhs {
233
- if i > 0 {
234
- c.tsw.WriteLiterally(", ")
235
- }
236
- if err := c.WriteValueExpr(lhs); err != nil {
237
- return err
238
- }
239
- }
240
- c.tsw.WriteLiterally("] = [")
241
-
242
- // Write RHS as array
243
- for i, rhs := range s.Rhs {
244
- if i > 0 {
245
- c.tsw.WriteLiterally(", ")
246
- }
247
- if err := c.WriteValueExpr(rhs); err != nil {
248
- return err
249
- }
250
- }
251
- c.tsw.WriteLiterally("]")
252
- } else {
253
- // Regular single variable assignment
254
- // No declaration handling needed in for loop post statements
255
- if err := c.writeAssignmentCore(s.Lhs, s.Rhs, s.Tok, false); err != nil {
256
- return err
257
- }
258
- }
259
- return nil
260
- case *ast.ExprStmt:
261
- // Handle expression statement in post
262
- return c.WriteValueExpr(s.X)
263
- default:
264
- return errors.Errorf("unhandled for loop post statement: %T", stmt)
265
- }
266
- }