goscript 0.1.4 → 0.2.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 (270) hide show
  1. package/README.md +5 -2
  2. package/cmd/go_js_wasm_exec/main.go +201 -0
  3. package/cmd/go_js_wasm_exec/main_test.go +83 -0
  4. package/cmd/goscript/{cmd_compile.go → cmd-compile.go} +7 -0
  5. package/cmd/goscript/cmd-test.go +14 -0
  6. package/cmd/goscript/cmd-test_test.go +1 -1
  7. package/compiler/compile-request.go +12 -9
  8. package/compiler/compliance_test.go +0 -1
  9. package/compiler/config.go +2 -0
  10. package/compiler/gotest/request.go +28 -0
  11. package/compiler/gotest/runner.go +353 -27
  12. package/compiler/gotest/runner_test.go +273 -1
  13. package/compiler/gotest/testdata/browserapi/browserapi_test.go +20 -0
  14. package/compiler/gotest/testdata/browserapi/go.mod +3 -0
  15. package/compiler/lowered-program.go +24 -17
  16. package/compiler/lowering.go +392 -127
  17. package/compiler/lowering_bench_test.go +41 -27
  18. package/compiler/override-facts.go +15 -0
  19. package/compiler/override-parity-verifier.go +450 -0
  20. package/compiler/override-parity.go +122 -0
  21. package/compiler/override-registry_test.go +559 -0
  22. package/compiler/protobuf-ts-binding.go +514 -0
  23. package/compiler/protobuf-ts-binding_test.go +172 -0
  24. package/compiler/semantic-model-types.go +9 -4
  25. package/compiler/semantic-model.go +282 -70
  26. package/compiler/semantic-model_test.go +82 -1
  27. package/compiler/service.go +20 -1
  28. package/compiler/skeleton_test.go +62 -8
  29. package/compiler/typescript-emitter.go +128 -13
  30. package/dist/gs/builtin/slice.d.ts +2 -1
  31. package/dist/gs/builtin/slice.js +29 -4
  32. package/dist/gs/builtin/slice.js.map +1 -1
  33. package/dist/gs/builtin/type.d.ts +13 -5
  34. package/dist/gs/builtin/type.js +153 -60
  35. package/dist/gs/builtin/type.js.map +1 -1
  36. package/dist/gs/builtin/varRef.d.ts +11 -0
  37. package/dist/gs/builtin/varRef.js +57 -2
  38. package/dist/gs/builtin/varRef.js.map +1 -1
  39. package/dist/gs/bytes/buffer.gs.js +1 -1
  40. package/dist/gs/bytes/buffer.gs.js.map +1 -1
  41. package/dist/gs/bytes/reader.gs.js +1 -1
  42. package/dist/gs/bytes/reader.gs.js.map +1 -1
  43. package/dist/gs/compress/zlib/index.d.ts +10 -3
  44. package/dist/gs/compress/zlib/index.js +50 -16
  45. package/dist/gs/compress/zlib/index.js.map +1 -1
  46. package/dist/gs/encoding/json/index.d.ts +114 -0
  47. package/dist/gs/encoding/json/index.js +544 -36
  48. package/dist/gs/encoding/json/index.js.map +1 -1
  49. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.d.ts +100 -0
  50. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js +564 -0
  51. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js.map +1 -1
  52. package/dist/gs/github.com/pkg/errors/errors.js +54 -30
  53. package/dist/gs/github.com/pkg/errors/errors.js.map +1 -1
  54. package/dist/gs/go/scanner/index.d.ts +2 -0
  55. package/dist/gs/go/scanner/index.js +29 -5
  56. package/dist/gs/go/scanner/index.js.map +1 -1
  57. package/dist/gs/go/token/index.js +22 -6
  58. package/dist/gs/go/token/index.js.map +1 -1
  59. package/dist/gs/hash/index.d.ts +6 -0
  60. package/dist/gs/hash/index.js +20 -0
  61. package/dist/gs/hash/index.js.map +1 -1
  62. package/dist/gs/internal/goarch/index.d.ts +43 -3
  63. package/dist/gs/internal/goarch/index.js +42 -10
  64. package/dist/gs/internal/goarch/index.js.map +1 -1
  65. package/dist/gs/io/fs/fs.js +26 -14
  66. package/dist/gs/io/fs/fs.js.map +1 -1
  67. package/dist/gs/io/fs/readdir.js +4 -2
  68. package/dist/gs/io/fs/readdir.js.map +1 -1
  69. package/dist/gs/io/fs/sub.js +8 -1
  70. package/dist/gs/io/fs/sub.js.map +1 -1
  71. package/dist/gs/io/io.d.ts +2 -0
  72. package/dist/gs/io/io.js.map +1 -1
  73. package/dist/gs/math/bits/index.d.ts +5 -0
  74. package/dist/gs/math/bits/index.js +16 -4
  75. package/dist/gs/math/bits/index.js.map +1 -1
  76. package/dist/gs/mime/index.d.ts +16 -0
  77. package/dist/gs/mime/index.js +315 -6
  78. package/dist/gs/mime/index.js.map +1 -1
  79. package/dist/gs/net/http/httptest/index.d.ts +12 -0
  80. package/dist/gs/net/http/httptest/index.js +85 -6
  81. package/dist/gs/net/http/httptest/index.js.map +1 -1
  82. package/dist/gs/net/http/index.d.ts +300 -5
  83. package/dist/gs/net/http/index.js +1598 -58
  84. package/dist/gs/net/http/index.js.map +1 -1
  85. package/dist/gs/os/dir_unix.gs.js +1 -1
  86. package/dist/gs/os/dir_unix.gs.js.map +1 -1
  87. package/dist/gs/os/error.gs.js +1 -1
  88. package/dist/gs/os/error.gs.js.map +1 -1
  89. package/dist/gs/os/exec.gs.d.ts +1 -0
  90. package/dist/gs/os/exec.gs.js +4 -8
  91. package/dist/gs/os/exec.gs.js.map +1 -1
  92. package/dist/gs/os/exec_posix.gs.js +1 -1
  93. package/dist/gs/os/exec_posix.gs.js.map +1 -1
  94. package/dist/gs/os/index.d.ts +1 -1
  95. package/dist/gs/os/index.js +1 -1
  96. package/dist/gs/os/index.js.map +1 -1
  97. package/dist/gs/os/proc.gs.d.ts +4 -0
  98. package/dist/gs/os/proc.gs.js +12 -6
  99. package/dist/gs/os/proc.gs.js.map +1 -1
  100. package/dist/gs/os/root_js.gs.js +1 -1
  101. package/dist/gs/os/root_js.gs.js.map +1 -1
  102. package/dist/gs/os/types.gs.js +1 -1
  103. package/dist/gs/os/types.gs.js.map +1 -1
  104. package/dist/gs/os/types_js.gs.js +1 -1
  105. package/dist/gs/os/types_js.gs.js.map +1 -1
  106. package/dist/gs/os/types_unix.gs.js +1 -1
  107. package/dist/gs/os/types_unix.gs.js.map +1 -1
  108. package/dist/gs/path/path.js +11 -7
  109. package/dist/gs/path/path.js.map +1 -1
  110. package/dist/gs/reflect/index.d.ts +5 -4
  111. package/dist/gs/reflect/index.js +4 -3
  112. package/dist/gs/reflect/index.js.map +1 -1
  113. package/dist/gs/reflect/map.js +15 -0
  114. package/dist/gs/reflect/map.js.map +1 -1
  115. package/dist/gs/reflect/type.d.ts +25 -6
  116. package/dist/gs/reflect/type.js +1418 -228
  117. package/dist/gs/reflect/type.js.map +1 -1
  118. package/dist/gs/reflect/types.d.ts +14 -6
  119. package/dist/gs/reflect/types.js +35 -1
  120. package/dist/gs/reflect/types.js.map +1 -1
  121. package/dist/gs/reflect/value.d.ts +1 -0
  122. package/dist/gs/reflect/value.js +83 -41
  123. package/dist/gs/reflect/value.js.map +1 -1
  124. package/dist/gs/reflect/visiblefields.js +4 -140
  125. package/dist/gs/reflect/visiblefields.js.map +1 -1
  126. package/dist/gs/runtime/pprof/index.d.ts +8 -2
  127. package/dist/gs/runtime/pprof/index.js +50 -30
  128. package/dist/gs/runtime/pprof/index.js.map +1 -1
  129. package/dist/gs/runtime/runtime.js +5 -4
  130. package/dist/gs/runtime/runtime.js.map +1 -1
  131. package/dist/gs/runtime/trace/index.js +5 -19
  132. package/dist/gs/runtime/trace/index.js.map +1 -1
  133. package/dist/gs/strconv/atoi.gs.js +1 -1
  134. package/dist/gs/strconv/atoi.gs.js.map +1 -1
  135. package/dist/gs/strconv/complex.gs.d.ts +3 -0
  136. package/dist/gs/strconv/complex.gs.js +148 -0
  137. package/dist/gs/strconv/complex.gs.js.map +1 -0
  138. package/dist/gs/strconv/index.d.ts +1 -0
  139. package/dist/gs/strconv/index.js +1 -0
  140. package/dist/gs/strconv/index.js.map +1 -1
  141. package/dist/gs/strings/builder.js +1 -1
  142. package/dist/gs/strings/reader.js +9 -5
  143. package/dist/gs/strings/reader.js.map +1 -1
  144. package/dist/gs/strings/replace.js +15 -7
  145. package/dist/gs/strings/replace.js.map +1 -1
  146. package/dist/gs/strings/strings.d.ts +5 -0
  147. package/dist/gs/strings/strings.js +57 -5
  148. package/dist/gs/strings/strings.js.map +1 -1
  149. package/dist/gs/sync/atomic/type.gs.js +9 -9
  150. package/dist/gs/sync/atomic/type.gs.js.map +1 -1
  151. package/dist/gs/sync/atomic/value.gs.js +2 -2
  152. package/dist/gs/sync/atomic/value.gs.js.map +1 -1
  153. package/dist/gs/syscall/env.js +22 -14
  154. package/dist/gs/syscall/env.js.map +1 -1
  155. package/dist/gs/testing/testing.js +55 -13
  156. package/dist/gs/testing/testing.js.map +1 -1
  157. package/dist/gs/time/time.d.ts +24 -1
  158. package/dist/gs/time/time.js +43 -3
  159. package/dist/gs/time/time.js.map +1 -1
  160. package/dist/gs/unique/index.js +7 -1
  161. package/dist/gs/unique/index.js.map +1 -1
  162. package/go.mod +3 -3
  163. package/go.sum +16 -0
  164. package/gs/builtin/runtime-contract.test.ts +218 -21
  165. package/gs/builtin/slice.ts +44 -4
  166. package/gs/builtin/type.ts +226 -59
  167. package/gs/builtin/varRef.ts +85 -2
  168. package/gs/bytes/buffer.gs.ts +1 -1
  169. package/gs/bytes/reader.gs.ts +1 -1
  170. package/gs/compress/zlib/index.test.ts +62 -1
  171. package/gs/compress/zlib/index.ts +53 -16
  172. package/gs/compress/zlib/parity.json +51 -0
  173. package/gs/encoding/json/index.test.ts +360 -6
  174. package/gs/encoding/json/index.ts +679 -38
  175. package/gs/encoding/json/parity.json +81 -0
  176. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.test.ts +211 -3
  177. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.ts +857 -1
  178. package/gs/github.com/pkg/errors/errors.ts +54 -30
  179. package/gs/go/scanner/index.test.ts +39 -56
  180. package/gs/go/scanner/index.ts +33 -5
  181. package/gs/go/scanner/parity.json +27 -0
  182. package/gs/go/token/index.ts +22 -6
  183. package/gs/hash/index.test.ts +20 -33
  184. package/gs/hash/index.ts +28 -0
  185. package/gs/hash/parity.json +21 -0
  186. package/gs/internal/goarch/index.test.ts +32 -0
  187. package/gs/internal/goarch/index.ts +45 -13
  188. package/gs/internal/goarch/parity.json +144 -0
  189. package/gs/io/fs/fs.ts +26 -14
  190. package/gs/io/fs/readdir.ts +4 -4
  191. package/gs/io/fs/sub.ts +8 -1
  192. package/gs/io/io.ts +1 -0
  193. package/gs/io/parity.json +162 -0
  194. package/gs/math/bits/index.test.ts +14 -1
  195. package/gs/math/bits/index.ts +23 -4
  196. package/gs/math/bits/parity.json +156 -0
  197. package/gs/mime/index.test.ts +90 -0
  198. package/gs/mime/index.ts +369 -6
  199. package/gs/mime/parity.json +36 -0
  200. package/gs/net/http/httptest/index.test.ts +98 -2
  201. package/gs/net/http/httptest/index.ts +101 -6
  202. package/gs/net/http/httptest/parity.json +15 -0
  203. package/gs/net/http/index.test.ts +781 -12
  204. package/gs/net/http/index.ts +1860 -139
  205. package/gs/net/http/meta.json +16 -1
  206. package/gs/net/http/parity.json +193 -0
  207. package/gs/os/dir_unix.gs.ts +1 -1
  208. package/gs/os/error.gs.ts +1 -1
  209. package/gs/os/exec.gs.ts +4 -8
  210. package/gs/os/exec_posix.gs.ts +1 -1
  211. package/gs/os/index.test.ts +9 -0
  212. package/gs/os/index.ts +1 -0
  213. package/gs/os/parity.json +9 -0
  214. package/gs/os/proc.gs.ts +18 -5
  215. package/gs/os/proc.test.ts +26 -0
  216. package/gs/os/root_js.gs.ts +1 -1
  217. package/gs/os/types.gs.ts +1 -1
  218. package/gs/os/types_js.gs.ts +1 -1
  219. package/gs/os/types_unix.gs.ts +1 -1
  220. package/gs/path/path.ts +11 -7
  221. package/gs/reflect/field.test.ts +37 -15
  222. package/gs/reflect/function-types.test.ts +518 -22
  223. package/gs/reflect/index.ts +8 -6
  224. package/gs/reflect/map.ts +20 -0
  225. package/gs/reflect/meta.json +6 -4
  226. package/gs/reflect/parity.json +234 -0
  227. package/gs/reflect/sliceat.test.ts +156 -0
  228. package/gs/reflect/structof.test.ts +401 -0
  229. package/gs/reflect/type.ts +1897 -317
  230. package/gs/reflect/typefor.test.ts +510 -10
  231. package/gs/reflect/types.ts +43 -18
  232. package/gs/reflect/value.ts +105 -45
  233. package/gs/reflect/visiblefields.ts +5 -168
  234. package/gs/runtime/parity.json +24 -0
  235. package/gs/runtime/pprof/index.test.ts +29 -7
  236. package/gs/runtime/pprof/index.ts +56 -30
  237. package/gs/runtime/pprof/parity.json +27 -0
  238. package/gs/runtime/runtime.test.ts +3 -1
  239. package/gs/runtime/runtime.ts +4 -3
  240. package/gs/runtime/trace/index.test.ts +5 -3
  241. package/gs/runtime/trace/index.ts +8 -20
  242. package/gs/runtime/trace/parity.json +36 -0
  243. package/gs/strconv/atoi.gs.ts +1 -1
  244. package/gs/strconv/complex.gs.ts +174 -0
  245. package/gs/strconv/complex.test.ts +65 -0
  246. package/gs/strconv/index.ts +1 -0
  247. package/gs/strconv/parity.json +120 -0
  248. package/gs/strings/builder.ts +1 -1
  249. package/gs/strings/parity.json +186 -0
  250. package/gs/strings/reader.ts +9 -5
  251. package/gs/strings/replace.ts +15 -7
  252. package/gs/strings/strings.test.ts +22 -2
  253. package/gs/strings/strings.ts +64 -6
  254. package/gs/sync/atomic/type.gs.ts +9 -9
  255. package/gs/sync/atomic/value.gs.ts +2 -2
  256. package/gs/syscall/env.ts +29 -14
  257. package/gs/testing/testing.test.ts +67 -0
  258. package/gs/testing/testing.ts +87 -19
  259. package/gs/time/parity.json +225 -0
  260. package/gs/time/time.test.ts +20 -2
  261. package/gs/time/time.ts +49 -7
  262. package/gs/unique/index.ts +7 -1
  263. package/package.json +4 -2
  264. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.d.ts +0 -217
  265. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js +0 -926
  266. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js.map +0 -1
  267. package/gs/github.com/aperturerobotics/starpc/srpc/index.test.ts +0 -38
  268. package/gs/github.com/aperturerobotics/starpc/srpc/index.ts +0 -1361
  269. package/gs/github.com/aperturerobotics/starpc/srpc/meta.json +0 -46
  270. /package/compiler/{wasm_api.go → wasm-api.go} +0 -0
@@ -1,6 +1,21 @@
1
1
  {
2
+ "asyncFunctions": {
3
+ "Get": true,
4
+ "Head": true,
5
+ "Post": true,
6
+ "PostForm": true,
7
+ "ServeContent": true
8
+ },
2
9
  "asyncMethods": {
3
10
  "Client.Do": true,
4
- "RoundTripper.RoundTrip": true
11
+ "Client.Get": true,
12
+ "Client.Head": true,
13
+ "Client.Post": true,
14
+ "Client.PostForm": true,
15
+ "Handler.ServeHTTP": true,
16
+ "HandlerFunc.ServeHTTP": true,
17
+ "ServeMux.ServeHTTP": true,
18
+ "RoundTripper.RoundTrip": true,
19
+ "Transport.RoundTrip": true
5
20
  }
6
21
  }
@@ -0,0 +1,193 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "strict": true,
4
+ "symbols": {
5
+ "AllowQuerySemicolons": { "status": "real" },
6
+ "CanonicalHeaderKey": { "status": "real" },
7
+ "Client": { "status": "real" },
8
+ "ClientConn": { "status": "real" },
9
+ "CloseNotifier": { "status": "real" },
10
+ "ConnState": { "status": "real" },
11
+ "Cookie": { "status": "real" },
12
+ "CookieJar": { "status": "real" },
13
+ "CrossOriginProtection": { "status": "real" },
14
+ "DefaultClient": { "status": "real" },
15
+ "DefaultMaxHeaderBytes": { "status": "real" },
16
+ "DefaultMaxIdleConnsPerHost": { "status": "real" },
17
+ "DefaultServeMux": { "status": "real" },
18
+ "DefaultTransport": { "status": "real" },
19
+ "DetectContentType": { "status": "real" },
20
+ "Dir": { "status": "real" },
21
+ "ErrAbortHandler": { "status": "real" },
22
+ "ErrBodyNotAllowed": { "status": "real" },
23
+ "ErrBodyReadAfterClose": { "status": "real" },
24
+ "ErrContentLength": { "status": "real" },
25
+ "ErrHandlerTimeout": { "status": "real" },
26
+ "ErrHeaderTooLong": { "status": "real" },
27
+ "ErrHijacked": { "status": "real" },
28
+ "ErrLineTooLong": { "status": "real" },
29
+ "ErrMissingBoundary": { "status": "real" },
30
+ "ErrMissingContentLength": { "status": "real" },
31
+ "ErrMissingFile": { "status": "real" },
32
+ "ErrNoCookie": { "status": "real" },
33
+ "ErrNoLocation": { "status": "real" },
34
+ "ErrNotMultipart": { "status": "real" },
35
+ "ErrNotSupported": { "status": "real" },
36
+ "ErrSchemeMismatch": { "status": "real" },
37
+ "ErrServerClosed": { "status": "real" },
38
+ "ErrShortBody": { "status": "real" },
39
+ "ErrSkipAltProtocol": { "status": "real" },
40
+ "ErrUnexpectedTrailer": { "status": "real" },
41
+ "ErrUseLastResponse": { "status": "real" },
42
+ "ErrWriteAfterFlush": { "status": "real" },
43
+ "Error": { "status": "real" },
44
+ "FS": { "status": "real" },
45
+ "File": { "status": "real" },
46
+ "FileServer": { "status": "real" },
47
+ "FileServerFS": { "status": "real" },
48
+ "FileSystem": { "status": "real" },
49
+ "Flusher": { "status": "real" },
50
+ "Get": { "status": "real" },
51
+ "HTTP2Config": { "status": "real" },
52
+ "Handle": { "status": "real" },
53
+ "HandleFunc": { "status": "real" },
54
+ "Handler": { "status": "real" },
55
+ "HandlerFunc": { "status": "real" },
56
+ "Head": { "status": "real" },
57
+ "Header": { "status": "real" },
58
+ "Hijacker": { "status": "real" },
59
+ "ListenAndServe": { "status": "real" },
60
+ "ListenAndServeTLS": { "status": "real" },
61
+ "LocalAddrContextKey": { "status": "real" },
62
+ "MaxBytesError": { "status": "real" },
63
+ "MaxBytesHandler": { "status": "real" },
64
+ "MaxBytesReader": { "status": "real" },
65
+ "MethodConnect": { "status": "real" },
66
+ "MethodDelete": { "status": "real" },
67
+ "MethodGet": { "status": "real" },
68
+ "MethodHead": { "status": "real" },
69
+ "MethodOptions": { "status": "real" },
70
+ "MethodPatch": { "status": "real" },
71
+ "MethodPost": { "status": "real" },
72
+ "MethodPut": { "status": "real" },
73
+ "MethodTrace": { "status": "real" },
74
+ "NewCrossOriginProtection": { "status": "real" },
75
+ "NewFileTransport": { "status": "real" },
76
+ "NewFileTransportFS": { "status": "real" },
77
+ "NewRequest": { "status": "real" },
78
+ "NewRequestWithContext": { "status": "real" },
79
+ "NewResponseController": { "status": "real" },
80
+ "NewServeMux": { "status": "real" },
81
+ "NoBody": { "status": "real" },
82
+ "NotFound": { "status": "real" },
83
+ "NotFoundHandler": { "status": "real" },
84
+ "ParseCookie": { "status": "real" },
85
+ "ParseHTTPVersion": { "status": "real" },
86
+ "ParseSetCookie": { "status": "real" },
87
+ "ParseTime": { "status": "real" },
88
+ "Post": { "status": "real" },
89
+ "PostForm": { "status": "real" },
90
+ "ProtocolError": { "status": "real" },
91
+ "Protocols": { "status": "real" },
92
+ "ProxyFromEnvironment": { "status": "real" },
93
+ "ProxyURL": { "status": "real" },
94
+ "PushOptions": { "status": "real" },
95
+ "Pusher": { "status": "real" },
96
+ "ReadRequest": { "status": "real" },
97
+ "ReadResponse": { "status": "real" },
98
+ "Redirect": { "status": "real" },
99
+ "RedirectHandler": { "status": "real" },
100
+ "Request": { "status": "real" },
101
+ "Response": { "status": "real" },
102
+ "ResponseController": { "status": "real" },
103
+ "ResponseWriter": { "status": "real" },
104
+ "RoundTripper": { "status": "real" },
105
+ "SameSite": { "status": "real" },
106
+ "SameSiteDefaultMode": { "status": "real" },
107
+ "SameSiteLaxMode": { "status": "real" },
108
+ "SameSiteNoneMode": { "status": "real" },
109
+ "SameSiteStrictMode": { "status": "real" },
110
+ "Serve": { "status": "real" },
111
+ "ServeContent": { "status": "real" },
112
+ "ServeFile": { "status": "real" },
113
+ "ServeFileFS": { "status": "real" },
114
+ "ServeMux": { "status": "real" },
115
+ "ServeTLS": { "status": "real" },
116
+ "Server": { "status": "real" },
117
+ "ServerContextKey": { "status": "real" },
118
+ "SetCookie": { "status": "real" },
119
+ "StateActive": { "status": "real" },
120
+ "StateClosed": { "status": "real" },
121
+ "StateHijacked": { "status": "real" },
122
+ "StateIdle": { "status": "real" },
123
+ "StateNew": { "status": "real" },
124
+ "StatusAccepted": { "status": "real" },
125
+ "StatusAlreadyReported": { "status": "real" },
126
+ "StatusBadGateway": { "status": "real" },
127
+ "StatusBadRequest": { "status": "real" },
128
+ "StatusConflict": { "status": "real" },
129
+ "StatusContinue": { "status": "real" },
130
+ "StatusCreated": { "status": "real" },
131
+ "StatusEarlyHints": { "status": "real" },
132
+ "StatusExpectationFailed": { "status": "real" },
133
+ "StatusFailedDependency": { "status": "real" },
134
+ "StatusForbidden": { "status": "real" },
135
+ "StatusFound": { "status": "real" },
136
+ "StatusGatewayTimeout": { "status": "real" },
137
+ "StatusGone": { "status": "real" },
138
+ "StatusHTTPVersionNotSupported": { "status": "real" },
139
+ "StatusIMUsed": { "status": "real" },
140
+ "StatusInsufficientStorage": { "status": "real" },
141
+ "StatusInternalServerError": { "status": "real" },
142
+ "StatusLengthRequired": { "status": "real" },
143
+ "StatusLocked": { "status": "real" },
144
+ "StatusLoopDetected": { "status": "real" },
145
+ "StatusMethodNotAllowed": { "status": "real" },
146
+ "StatusMisdirectedRequest": { "status": "real" },
147
+ "StatusMovedPermanently": { "status": "real" },
148
+ "StatusMultiStatus": { "status": "real" },
149
+ "StatusMultipleChoices": { "status": "real" },
150
+ "StatusNetworkAuthenticationRequired": { "status": "real" },
151
+ "StatusNoContent": { "status": "real" },
152
+ "StatusNonAuthoritativeInfo": { "status": "real" },
153
+ "StatusNotAcceptable": { "status": "real" },
154
+ "StatusNotExtended": { "status": "real" },
155
+ "StatusNotFound": { "status": "real" },
156
+ "StatusNotImplemented": { "status": "real" },
157
+ "StatusNotModified": { "status": "real" },
158
+ "StatusOK": { "status": "real" },
159
+ "StatusPartialContent": { "status": "real" },
160
+ "StatusPaymentRequired": { "status": "real" },
161
+ "StatusPermanentRedirect": { "status": "real" },
162
+ "StatusPreconditionFailed": { "status": "real" },
163
+ "StatusPreconditionRequired": { "status": "real" },
164
+ "StatusProcessing": { "status": "real" },
165
+ "StatusProxyAuthRequired": { "status": "real" },
166
+ "StatusRequestEntityTooLarge": { "status": "real" },
167
+ "StatusRequestHeaderFieldsTooLarge": { "status": "real" },
168
+ "StatusRequestTimeout": { "status": "real" },
169
+ "StatusRequestURITooLong": { "status": "real" },
170
+ "StatusRequestedRangeNotSatisfiable": { "status": "real" },
171
+ "StatusResetContent": { "status": "real" },
172
+ "StatusSeeOther": { "status": "real" },
173
+ "StatusServiceUnavailable": { "status": "real" },
174
+ "StatusSwitchingProtocols": { "status": "real" },
175
+ "StatusTeapot": { "status": "real" },
176
+ "StatusTemporaryRedirect": { "status": "real" },
177
+ "StatusText": { "status": "real" },
178
+ "StatusTooEarly": { "status": "real" },
179
+ "StatusTooManyRequests": { "status": "real" },
180
+ "StatusUnauthorized": { "status": "real" },
181
+ "StatusUnavailableForLegalReasons": { "status": "real" },
182
+ "StatusUnprocessableEntity": { "status": "real" },
183
+ "StatusUnsupportedMediaType": { "status": "real" },
184
+ "StatusUpgradeRequired": { "status": "real" },
185
+ "StatusUseProxy": { "status": "real" },
186
+ "StatusVariantAlsoNegotiates": { "status": "real" },
187
+ "StripPrefix": { "status": "real" },
188
+ "TimeFormat": { "status": "real" },
189
+ "TimeoutHandler": { "status": "real" },
190
+ "TrailerPrefix": { "status": "real" },
191
+ "Transport": { "status": "real" }
192
+ }
193
+ }
@@ -93,7 +93,7 @@ class dirInfo {
93
93
  new dirInfo(),
94
94
  [{ name: "close", args: [], returns: [] }],
95
95
  dirInfo,
96
- {"mu": "Mutex", "buf": { kind: $.TypeKind.Pointer, elemType: { kind: $.TypeKind.Slice, elemType: { kind: $.TypeKind.Basic, name: "number" } } }, "nbuf": { kind: $.TypeKind.Basic, name: "number" }, "bufp": { kind: $.TypeKind.Basic, name: "number" }}
96
+ [{ name: "mu", key: "mu", type: "Mutex" }, { name: "buf", key: "buf", type: { kind: $.TypeKind.Pointer, elemType: { kind: $.TypeKind.Slice, elemType: { kind: $.TypeKind.Basic, name: "number" } } } }, { name: "nbuf", key: "nbuf", type: { kind: $.TypeKind.Basic, name: "number" } }, { name: "bufp", key: "bufp", type: { kind: $.TypeKind.Basic, name: "number" } }]
97
97
  );
98
98
  }
99
99
 
package/gs/os/error.gs.ts CHANGED
@@ -119,7 +119,7 @@ export class SyscallError {
119
119
  new SyscallError(),
120
120
  [{ name: "Error", args: [], returns: [{ type: { kind: $.TypeKind.Basic, name: "string" } }] }, { name: "Unwrap", args: [], returns: [{ type: { kind: $.TypeKind.Interface, name: 'GoError', methods: [{ name: 'Error', args: [], returns: [{ type: { kind: $.TypeKind.Basic, name: 'string' } }] }] } }] }, { name: "Timeout", args: [], returns: [{ type: { kind: $.TypeKind.Basic, name: "boolean" } }] }],
121
121
  SyscallError,
122
- {"Syscall": { kind: $.TypeKind.Basic, name: "string" }, "Err": { kind: $.TypeKind.Interface, name: 'GoError', methods: [{ name: 'Error', args: [], returns: [{ type: { kind: $.TypeKind.Basic, name: 'string' } }] }] }}
122
+ [{ name: "Syscall", key: "Syscall", type: { kind: $.TypeKind.Basic, name: "string" } }, { name: "Err", key: "Err", type: { kind: $.TypeKind.Interface, name: 'GoError', methods: [{ name: 'Error', args: [], returns: [{ type: { kind: $.TypeKind.Basic, name: 'string' } }] }] } }]
123
123
  );
124
124
  }
125
125
 
package/gs/os/exec.gs.ts CHANGED
@@ -5,6 +5,7 @@ import * as errors from "@goscript/errors/index.js"
5
5
  import * as syscall from "@goscript/syscall/index.js"
6
6
 
7
7
  export let ErrProcessDone: $.GoError = errors.New("os: process already finished")
8
+ export let ErrNoHandle: $.GoError = errors.New("os: process handle unavailable")
8
9
 
9
10
  // Simplified Process class for JavaScript environment
10
11
  export class Process {
@@ -61,7 +62,7 @@ export class Process {
61
62
  { name: "Signal", args: [{ name: "sig", type: "Signal" }], returns: [{ type: { kind: $.TypeKind.Interface, name: 'GoError', methods: [{ name: 'Error', args: [], returns: [{ type: { kind: $.TypeKind.Basic, name: 'string' } }] }] } }] }
62
63
  ],
63
64
  Process,
64
- { "Pid": { kind: $.TypeKind.Basic, name: "number" } }
65
+ [{ name: "Pid", key: "Pid", type: { kind: $.TypeKind.Basic, name: "number" } }]
65
66
  );
66
67
  }
67
68
 
@@ -128,12 +129,7 @@ export class ProcAttr {
128
129
  new ProcAttr(),
129
130
  [],
130
131
  ProcAttr,
131
- {
132
- "Dir": { kind: $.TypeKind.Basic, name: "string" },
133
- "Env": { kind: $.TypeKind.Slice, elemType: { kind: $.TypeKind.Basic, name: "string" } },
134
- "Files": { kind: $.TypeKind.Slice, elemType: { kind: $.TypeKind.Basic, name: "any" } },
135
- "Sys": { kind: $.TypeKind.Basic, name: "any" }
136
- }
132
+ [{ name: "Dir", key: "Dir", type: { kind: $.TypeKind.Basic, name: "string" } }, { name: "Env", key: "Env", type: { kind: $.TypeKind.Slice, elemType: { kind: $.TypeKind.Basic, name: "string" } } }, { name: "Files", key: "Files", type: { kind: $.TypeKind.Slice, elemType: { kind: $.TypeKind.Basic, name: "any" } } }, { name: "Sys", key: "Sys", type: { kind: $.TypeKind.Basic, name: "any" } }]
137
133
  );
138
134
  }
139
135
 
@@ -155,7 +151,7 @@ export class ProcessState {
155
151
  new ProcessState(),
156
152
  [],
157
153
  ProcessState,
158
- {}
154
+ []
159
155
  );
160
156
  }
161
157
 
@@ -89,6 +89,6 @@ export class ProcessState {
89
89
  { name: "ExitCode", args: [], returns: [{ type: { kind: $.TypeKind.Basic, name: "number" } }] }
90
90
  ],
91
91
  ProcessState,
92
- { "pid": { kind: $.TypeKind.Basic, name: "number" } }
92
+ [{ name: "pid", key: "pid", type: { kind: $.TypeKind.Basic, name: "number" } }]
93
93
  );
94
94
  }
@@ -0,0 +1,9 @@
1
+ import { describe, expect, it } from 'vitest'
2
+
3
+ import { ErrNoHandle } from './index.js'
4
+
5
+ describe('os override', () => {
6
+ it('exports ErrNoHandle', () => {
7
+ expect(ErrNoHandle?.Error()).toBe('os: process handle unavailable')
8
+ })
9
+ })
package/gs/os/index.ts CHANGED
@@ -27,6 +27,7 @@ export {
27
27
  SyscallError,
28
28
  } from './error.gs.js'
29
29
  export {
30
+ ErrNoHandle,
30
31
  ErrProcessDone,
31
32
  FindProcess,
32
33
  Getpid,
@@ -0,0 +1,9 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "strict": false,
4
+ "symbols": {
5
+ "ErrNoHandle": {
6
+ "status": "real"
7
+ }
8
+ }
9
+ }
package/gs/os/proc.gs.ts CHANGED
@@ -6,6 +6,20 @@ import * as runtime from "@goscript/runtime/index.js"
6
6
 
7
7
  import * as syscall from "@goscript/syscall/index.js"
8
8
 
9
+ interface ProcessLike {
10
+ exit?: (code?: number) => never | void
11
+ }
12
+
13
+ export class ProcessExitError extends Error {
14
+ public readonly __goscriptExitCode: number
15
+
16
+ constructor(code: number) {
17
+ super("process exited with status " + String(code))
18
+ this.name = "ProcessExitError"
19
+ this.__goscriptExitCode = code
20
+ }
21
+ }
22
+
9
23
  export let Args: $.Slice<string> = null
10
24
 
11
25
  export function init(): void {
@@ -72,13 +86,12 @@ export function Exit(code: number): void {
72
86
  // enable us to write out a coverage data file.
73
87
  runtime_beforeExit(code)
74
88
 
75
- // In JavaScript environment, use process.exit if available
76
- if (typeof process !== 'undefined' && process.exit) {
89
+ // In JavaScript environment, use process.exit if available.
90
+ const process = (globalThis as { process?: ProcessLike }).process
91
+ if (process?.exit !== undefined) {
77
92
  process.exit(code)
78
- } else {
79
- // Fallback: just return (can't really exit in browser)
80
- return
81
93
  }
94
+ throw new ProcessExitError(code)
82
95
  }
83
96
 
84
97
  export function runtime_beforeExit(exitCode: number): void {
@@ -0,0 +1,26 @@
1
+ import { describe, expect, it } from 'vitest'
2
+
3
+ import { Exit, ProcessExitError } from './proc.gs.js'
4
+
5
+ describe('os process control', () => {
6
+ it('throws a structured browser exit error when process.exit is unavailable', () => {
7
+ const originalProcess = (globalThis as { process?: unknown }).process
8
+ try {
9
+ ;(globalThis as { process?: unknown }).process = {}
10
+
11
+ let err: unknown
12
+ try {
13
+ Exit(7)
14
+ } catch (caught) {
15
+ err = caught
16
+ }
17
+
18
+ expect(err).toBeInstanceOf(ProcessExitError)
19
+ expect((err as { __goscriptExitCode?: number }).__goscriptExitCode).toBe(
20
+ 7,
21
+ )
22
+ } finally {
23
+ ;(globalThis as { process?: unknown }).process = originalProcess
24
+ }
25
+ })
26
+ })
@@ -119,7 +119,7 @@ export class Root {
119
119
  { name: "Close", args: [], returns: [{ type: { kind: $.TypeKind.Interface, name: 'GoError', methods: [{ name: 'Error', args: [], returns: [{ type: { kind: $.TypeKind.Basic, name: 'string' } }] }] } }] }
120
120
  ],
121
121
  Root,
122
- { "name": { kind: $.TypeKind.Basic, name: "string" } }
122
+ [{ name: "name", key: "name", type: { kind: $.TypeKind.Basic, name: "string" } }]
123
123
  );
124
124
  }
125
125
 
package/gs/os/types.gs.ts CHANGED
@@ -140,7 +140,7 @@ export class File {
140
140
  { name: "Close", args: [], returns: [{ type: { kind: $.TypeKind.Interface, name: 'GoError', methods: [{ name: 'Error', args: [], returns: [{ type: { kind: $.TypeKind.Basic, name: 'string' } }] }] } }] }
141
141
  ],
142
142
  File,
143
- { "name": { kind: $.TypeKind.Basic, name: "string" }, "closed": { kind: $.TypeKind.Basic, name: "boolean" } }
143
+ [{ name: "name", key: "name", type: { kind: $.TypeKind.Basic, name: "string" } }, { name: "closed", key: "closed", type: { kind: $.TypeKind.Basic, name: "boolean" } }]
144
144
  );
145
145
  }
146
146
 
@@ -823,7 +823,7 @@ export class File {
823
823
  { name: "Close", args: [], returns: [{ type: { kind: $.TypeKind.Interface, name: 'GoError', methods: [{ name: 'Error', args: [], returns: [{ type: { kind: $.TypeKind.Basic, name: 'string' } }] }] } }] }
824
824
  ],
825
825
  File,
826
- { "file": { kind: $.TypeKind.Pointer, elemType: "file" }, "name": { kind: $.TypeKind.Basic, name: "string" }, "closed": { kind: $.TypeKind.Basic, name: "boolean" }, "fd": { kind: $.TypeKind.Basic, name: "number" } }
826
+ [{ name: "file", key: "file", type: { kind: $.TypeKind.Pointer, elemType: "file" } }, { name: "name", key: "name", type: { kind: $.TypeKind.Basic, name: "string" } }, { name: "closed", key: "closed", type: { kind: $.TypeKind.Basic, name: "boolean" } }, { name: "fd", key: "fd", type: { kind: $.TypeKind.Basic, name: "number" } }]
827
827
  );
828
828
  }
829
829
 
@@ -108,7 +108,7 @@ class fileStat {
108
108
  new fileStat(),
109
109
  [{ name: "Name", args: [], returns: [{ type: { kind: $.TypeKind.Basic, name: "string" } }] }, { name: "IsDir", args: [], returns: [{ type: { kind: $.TypeKind.Basic, name: "boolean" } }] }, { name: "Size", args: [], returns: [{ type: { kind: $.TypeKind.Basic, name: "number" } }] }, { name: "Mode", args: [], returns: [{ type: { kind: $.TypeKind.Basic, name: "number" } }] }, { name: "ModTime", args: [], returns: [{ type: "Time" }] }, { name: "Sys", args: [], returns: [{ type: { kind: $.TypeKind.Interface, methods: [] } }] }],
110
110
  fileStat,
111
- {"name": { kind: $.TypeKind.Basic, name: "string" }, "size": { kind: $.TypeKind.Basic, name: "number" }, "mode": { kind: $.TypeKind.Basic, name: "number" }, "modTime": "Time", "sys": "Stat_t"}
111
+ [{ name: "name", key: "name", type: { kind: $.TypeKind.Basic, name: "string" } }, { name: "size", key: "size", type: { kind: $.TypeKind.Basic, name: "number" } }, { name: "mode", key: "mode", type: { kind: $.TypeKind.Basic, name: "number" } }, { name: "modTime", key: "modTime", type: "Time" }, { name: "sys", key: "sys", type: "Stat_t" }]
112
112
  );
113
113
  }
114
114
 
package/gs/path/path.ts CHANGED
@@ -112,14 +112,18 @@ class lazybuf {
112
112
  },
113
113
  ],
114
114
  lazybuf,
115
- {
116
- s: { kind: $.TypeKind.Basic, name: 'string' },
117
- buf: {
118
- kind: $.TypeKind.Slice,
119
- elemType: { kind: $.TypeKind.Basic, name: 'number' },
115
+ [
116
+ { name: 's', key: 's', type: { kind: $.TypeKind.Basic, name: 'string' } },
117
+ {
118
+ name: 'buf',
119
+ key: 'buf',
120
+ type: {
121
+ kind: $.TypeKind.Slice,
122
+ elemType: { kind: $.TypeKind.Basic, name: 'number' },
123
+ },
120
124
  },
121
- w: { kind: $.TypeKind.Basic, name: 'number' },
122
- },
125
+ { name: 'w', key: 'w', type: { kind: $.TypeKind.Basic, name: 'number' } },
126
+ ],
123
127
  )
124
128
  }
125
129
 
@@ -4,6 +4,7 @@ import {
4
4
  TypeKind,
5
5
  arrayToSlice,
6
6
  asArray,
7
+ isOwnedPointerHandle,
7
8
  registerStructType,
8
9
  } from '../builtin/index.js'
9
10
  import { NewAt, TypeOf, ValueOf } from './index.js'
@@ -16,34 +17,48 @@ class Person {
16
17
  return this.Name
17
18
  }
18
19
  }
19
- ;(Person as any).__typeInfo = { name: 'main.Person' }
20
20
 
21
21
  describe('reflect struct field access', () => {
22
- it('finds struct fields by name and index', () => {
23
- registerStructType(
22
+ it('finds struct fields by name and index', async () => {
23
+ ;(Person as any).__typeInfo = registerStructType(
24
24
  'main.Person',
25
25
  new Person(),
26
- [{ name: 'String', args: [], returns: [] }],
26
+ [
27
+ {
28
+ name: 'String',
29
+ args: [],
30
+ returns: [{ type: { kind: TypeKind.Basic, name: 'string' } }],
31
+ },
32
+ ],
27
33
  Person,
28
- {
29
- Name: 'string',
30
- Count: { kind: TypeKind.Basic, name: 'int' },
31
- },
34
+ [
35
+ { name: 'FullName', key: 'Name', type: 'string' },
36
+ {
37
+ name: 'Count',
38
+ key: 'Count',
39
+ type: { kind: TypeKind.Basic, name: 'int' },
40
+ },
41
+ ],
32
42
  )
33
43
 
34
44
  const person = new Person()
35
45
  const typ = TypeOf(person)
36
- const [field, ok] = typ.FieldByName('Name')
46
+ const [field, ok] = typ.FieldByName('FullName')
37
47
 
38
48
  expect(ok).toBe(true)
39
- expect(field.Name).toBe('Name')
49
+ expect(field.Name).toBe('FullName')
40
50
  expect(field.Index).toEqual([0])
41
51
  expect(typ.FieldByNameFunc((name) => name === 'Count')[0].Name).toBe(
42
52
  'Count',
43
53
  )
44
54
  expect(typ.AssignableTo(typ)).toBe(true)
45
- expect(typ.MethodByName('String')[1]).toBe(true)
46
- expect(ValueOf(person).FieldByName('Name').String()).toBe('Ada')
55
+ const [method, methodOK] = typ.MethodByName('String')
56
+ expect(methodOK).toBe(true)
57
+ expect(method.Type.NumIn()).toBe(1)
58
+ expect(method.Type.In(0).String()).toBe('main.Person')
59
+ expect(method.Type.NumOut()).toBe(1)
60
+ expect(method.Type.Out(0).String()).toBe('string')
61
+ expect(ValueOf(person).FieldByName('FullName').String()).toBe('Ada')
47
62
  expect(
48
63
  ValueOf(person)
49
64
  .FieldByIndex(arrayToSlice([1]))
@@ -53,10 +68,17 @@ describe('reflect struct field access', () => {
53
68
 
54
69
  const stringMethod = ValueOf(person).MethodByName('String')
55
70
  expect(stringMethod.IsValid()).toBe(true)
56
- expect(asArray(stringMethod.Call(arrayToSlice([])))[0].String()).toBe('Ada')
71
+ expect(stringMethod.Type().NumIn()).toBe(0)
72
+ expect(stringMethod.Type().NumOut()).toBe(1)
73
+ expect(stringMethod.Type().Out(0).String()).toBe('string')
74
+ expect(asArray(await stringMethod.Call(arrayToSlice([])))[0].String()).toBe(
75
+ 'Ada',
76
+ )
57
77
 
58
- const nameField = ValueOf(person).FieldByName('Name')
59
- const namePtr = NewAt(nameField.Type(), nameField.UnsafeAddr() as any)
78
+ const nameField = ValueOf(person).FieldByName('FullName')
79
+ const nameAddress = nameField.UnsafeAddr()
80
+ expect(isOwnedPointerHandle(nameAddress)).toBe(true)
81
+ const namePtr = NewAt(nameField.Type(), nameAddress as any)
60
82
  namePtr.Elem().SetString('Grace')
61
83
  expect(person.Name).toBe('Grace')
62
84
  })