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,207 +0,0 @@
1
- package compiler
2
-
3
- import (
4
- "go/ast"
5
- "go/types"
6
- )
7
-
8
- // isByteSliceType checks if a type is []byte (slice of uint8)
9
- func (c *GoToTSCompiler) isByteSliceType(t types.Type) bool {
10
- if sliceType, isSlice := t.Underlying().(*types.Slice); isSlice {
11
- if basicElem, isBasic := sliceType.Elem().(*types.Basic); isBasic && basicElem.Kind() == types.Uint8 {
12
- return true
13
- }
14
- }
15
- return false
16
- }
17
-
18
- // isRuneSliceType checks if a type is []rune (slice of int32)
19
- func (c *GoToTSCompiler) isRuneSliceType(t types.Type) bool {
20
- if sliceType, isSlice := t.Underlying().(*types.Slice); isSlice {
21
- if basicElem, isBasic := sliceType.Elem().(*types.Basic); isBasic && basicElem.Kind() == types.Int32 {
22
- return true
23
- }
24
- }
25
- return false
26
- }
27
-
28
- // isStringType checks if a type is string or could be string (e.g., type parameter)
29
- func (c *GoToTSCompiler) isStringType(t types.Type) bool {
30
- if basic, isBasic := t.Underlying().(*types.Basic); isBasic {
31
- return basic.Kind() == types.String || basic.Kind() == types.UntypedString
32
- }
33
- // Handle type parameters (e.g., Bytes ~[]byte | ~string)
34
- if typeParam, isTypeParam := t.(*types.TypeParam); isTypeParam {
35
- constraint := typeParam.Constraint()
36
- if constraintIface, ok := constraint.(*types.Interface); ok {
37
- return c.constraintIncludesString(constraintIface)
38
- }
39
- }
40
- return false
41
- }
42
-
43
- // constraintIncludesString checks if a type constraint includes string
44
- func (c *GoToTSCompiler) constraintIncludesString(constraint *types.Interface) bool {
45
- // Check if the constraint has type terms that include string
46
- if constraint.IsMethodSet() {
47
- return false // Pure method interface, no type terms
48
- }
49
- // For union constraints like []byte | string, check each term
50
- for embedded := range constraint.EmbeddedTypes() {
51
- // Check if embedded is a union
52
- if union, isUnion := embedded.(*types.Union); isUnion {
53
- for term := range union.Terms() {
54
- termType := term.Type()
55
- // Check if term is string or ~string
56
- if basic, isBasic := termType.Underlying().(*types.Basic); isBasic {
57
- if basic.Kind() == types.String {
58
- return true
59
- }
60
- }
61
- }
62
- }
63
- // Check direct embedded type
64
- if basic, isBasic := embedded.Underlying().(*types.Basic); isBasic {
65
- if basic.Kind() == types.String {
66
- return true
67
- }
68
- }
69
- }
70
- return false
71
- }
72
-
73
- // isPointerType checks if a type expression represents a pointer type
74
- func (c *GoToTSCompiler) isPointerType(expr ast.Expr) bool {
75
- _, isPointer := expr.(*ast.StarExpr)
76
- return isPointer
77
- }
78
-
79
- // isProtobufType checks if a given type is a protobuf type by examining its methods
80
- // and, when available, by verifying it implements the protobuf-go-lite Message interface.
81
- func (c *GoToTSCompiler) isProtobufType(typ types.Type) bool {
82
- // Normalize to a named type if possible
83
- var named *types.Named
84
- switch t := typ.(type) {
85
- case *types.Named:
86
- named = t
87
- case *types.Pointer:
88
- if n, ok := t.Elem().(*types.Named); ok {
89
- named = n
90
- }
91
- }
92
- if named == nil {
93
- return false
94
- }
95
-
96
- // Prefer interface-based detection when the protobuf-go-lite package is loaded
97
- if iface := c.getProtobufMessageInterface(); iface != nil {
98
- if types.Implements(named, iface) || types.Implements(types.NewPointer(named), iface) {
99
- return true
100
- }
101
- }
102
-
103
- // Fallback: method-set detection for common protobuf-go-lite methods
104
- // Check both value and pointer method sets
105
- if c.typeHasMethods(named, "MarshalVT", "UnmarshalVT") || c.typeHasMethods(types.NewPointer(named), "MarshalVT", "UnmarshalVT") {
106
- return true
107
- }
108
-
109
- return false
110
- }
111
-
112
- // isWrapperType checks if a type should be treated as a wrapper type (type alias with basic underlying type).
113
- // Wrapper types are rendered as TypeScript type aliases rather than classes with constructors.
114
- // Examples: os.FileMode (uint32), MyString (string), etc.
115
- func (c *GoToTSCompiler) isWrapperType(t types.Type) bool {
116
- // Check analysis cache first (for types with methods in analyzed packages)
117
- if c.analysis.IsNamedBasicType(t) {
118
- return true
119
- }
120
-
121
- // For external package types, check if it's a named type with a basic underlying type
122
- if namedType, ok := t.(*types.Named); ok {
123
- if _, ok := namedType.Underlying().(*types.Basic); ok {
124
- return true
125
- }
126
- }
127
-
128
- // Also check for type aliases with basic underlying types
129
- if aliasType, ok := t.(*types.Alias); ok {
130
- if _, ok := aliasType.Underlying().(*types.Basic); ok {
131
- return true
132
- }
133
- }
134
-
135
- return false
136
- }
137
-
138
- // isStructValueType checks if a type is a named struct type
139
- func (c *GoToTSCompiler) isStructValueType(fieldType types.Type) bool {
140
- if named, ok := fieldType.(*types.Named); ok {
141
- if _, isStruct := named.Underlying().(*types.Struct); isStruct {
142
- return true
143
- }
144
- }
145
- return false
146
- }
147
-
148
- // isImportedBasicType checks if a type is an imported named type with a basic underlying type
149
- func (c *GoToTSCompiler) isImportedBasicType(fieldType types.Type) bool {
150
- // Handle named types
151
- if named, isNamed := fieldType.(*types.Named); isNamed {
152
- obj := named.Obj()
153
- if obj == nil || obj.Pkg() == nil || obj.Pkg() == c.pkg.Types {
154
- return false // Not imported or is local
155
- }
156
-
157
- underlying := named.Underlying()
158
- if underlying == nil {
159
- return false
160
- }
161
-
162
- _, isBasic := underlying.(*types.Basic)
163
- return isBasic
164
- }
165
-
166
- // Handle type aliases (like os.FileMode = fs.FileMode)
167
- if alias, isAlias := fieldType.(*types.Alias); isAlias {
168
- obj := alias.Obj()
169
- if obj == nil || obj.Pkg() == nil || obj.Pkg() == c.pkg.Types {
170
- return false // Not imported or is local
171
- }
172
-
173
- underlying := alias.Underlying()
174
- if underlying == nil {
175
- return false
176
- }
177
-
178
- _, isBasic := underlying.(*types.Basic)
179
- return isBasic
180
- }
181
-
182
- return false
183
- }
184
-
185
- // isMapType checks if a type is a map type (including type parameters constrained to maps)
186
- func (c *GoToTSCompiler) isMapType(iterType, underlying types.Type) bool {
187
- if _, ok := underlying.(*types.Map); ok {
188
- return true
189
- }
190
- if typeParam, isTypeParam := iterType.(*types.TypeParam); isTypeParam {
191
- constraint := typeParam.Constraint()
192
- if constraint != nil {
193
- constraintUnderlying := constraint.Underlying()
194
- if iface, isInterface := constraintUnderlying.(*types.Interface); isInterface {
195
- return hasMapConstraint(iface)
196
- }
197
- }
198
- }
199
- return false
200
- }
201
-
202
- // isArrayOrSlice checks if a type is an array or slice type
203
- func (c *GoToTSCompiler) isArrayOrSlice(underlying types.Type) bool {
204
- _, isSlice := underlying.(*types.Slice)
205
- _, isArray := underlying.(*types.Array)
206
- return isArray || isSlice
207
- }