goscript 0.1.3 → 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 (330) 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} +35 -8
  5. package/cmd/goscript/cmd-test.go +14 -0
  6. package/cmd/goscript/cmd-test_test.go +1 -1
  7. package/cmd/goscript/cmd_compile_test.go +105 -6
  8. package/compiler/build-flags.go +9 -10
  9. package/compiler/compile-request.go +12 -9
  10. package/compiler/compliance_test.go +0 -1
  11. package/compiler/config.go +2 -0
  12. package/compiler/gotest/request.go +28 -0
  13. package/compiler/gotest/runner.go +353 -27
  14. package/compiler/gotest/runner_test.go +400 -1
  15. package/compiler/gotest/testdata/browserapi/browserapi_test.go +20 -0
  16. package/compiler/gotest/testdata/browserapi/go.mod +3 -0
  17. package/compiler/lowered-program.go +24 -17
  18. package/compiler/lowering.go +988 -263
  19. package/compiler/lowering_bench_test.go +364 -0
  20. package/compiler/override-facts.go +15 -0
  21. package/compiler/override-parity-verifier.go +450 -0
  22. package/compiler/override-parity.go +122 -0
  23. package/compiler/override-registry_test.go +559 -0
  24. package/compiler/package-graph.go +61 -4
  25. package/compiler/package-graph_test.go +30 -0
  26. package/compiler/protobuf-ts-binding.go +514 -0
  27. package/compiler/protobuf-ts-binding_test.go +172 -0
  28. package/compiler/semantic-model-types.go +17 -4
  29. package/compiler/semantic-model.go +709 -72
  30. package/compiler/semantic-model_test.go +219 -0
  31. package/compiler/service.go +20 -1
  32. package/compiler/skeleton_test.go +1008 -20
  33. package/compiler/typescript-emitter.go +147 -15
  34. package/dist/gs/builtin/builtin.d.ts +2 -2
  35. package/dist/gs/builtin/builtin.js +20 -0
  36. package/dist/gs/builtin/builtin.js.map +1 -1
  37. package/dist/gs/builtin/slice.d.ts +2 -1
  38. package/dist/gs/builtin/slice.js +34 -4
  39. package/dist/gs/builtin/slice.js.map +1 -1
  40. package/dist/gs/builtin/type.d.ts +14 -6
  41. package/dist/gs/builtin/type.js +224 -64
  42. package/dist/gs/builtin/type.js.map +1 -1
  43. package/dist/gs/builtin/varRef.d.ts +11 -0
  44. package/dist/gs/builtin/varRef.js +57 -2
  45. package/dist/gs/builtin/varRef.js.map +1 -1
  46. package/dist/gs/bytes/buffer.gs.js +1 -1
  47. package/dist/gs/bytes/buffer.gs.js.map +1 -1
  48. package/dist/gs/bytes/reader.gs.js +1 -1
  49. package/dist/gs/bytes/reader.gs.js.map +1 -1
  50. package/dist/gs/compress/zlib/index.d.ts +13 -6
  51. package/dist/gs/compress/zlib/index.js +131 -35
  52. package/dist/gs/compress/zlib/index.js.map +1 -1
  53. package/dist/gs/crypto/sha1/index.js +2 -5
  54. package/dist/gs/crypto/sha1/index.js.map +1 -1
  55. package/dist/gs/crypto/sha256/index.js +2 -5
  56. package/dist/gs/crypto/sha256/index.js.map +1 -1
  57. package/dist/gs/crypto/sha512/index.js +2 -5
  58. package/dist/gs/crypto/sha512/index.js.map +1 -1
  59. package/dist/gs/embed/index.d.ts +6 -0
  60. package/dist/gs/embed/index.js +210 -5
  61. package/dist/gs/embed/index.js.map +1 -1
  62. package/dist/gs/encoding/json/index.d.ts +114 -0
  63. package/dist/gs/encoding/json/index.js +544 -36
  64. package/dist/gs/encoding/json/index.js.map +1 -1
  65. package/dist/gs/fmt/fmt.d.ts +3 -3
  66. package/dist/gs/fmt/fmt.js +29 -16
  67. package/dist/gs/fmt/fmt.js.map +1 -1
  68. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.d.ts +100 -0
  69. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js +564 -0
  70. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js.map +1 -1
  71. package/dist/gs/github.com/go-git/go-billy/v6/osfs/index.d.ts +45 -0
  72. package/dist/gs/github.com/go-git/go-billy/v6/osfs/index.js +229 -0
  73. package/dist/gs/github.com/go-git/go-billy/v6/osfs/index.js.map +1 -0
  74. package/dist/gs/github.com/pkg/errors/errors.js +54 -30
  75. package/dist/gs/github.com/pkg/errors/errors.js.map +1 -1
  76. package/dist/gs/go/scanner/index.d.ts +2 -0
  77. package/dist/gs/go/scanner/index.js +29 -5
  78. package/dist/gs/go/scanner/index.js.map +1 -1
  79. package/dist/gs/go/token/index.js +22 -6
  80. package/dist/gs/go/token/index.js.map +1 -1
  81. package/dist/gs/hash/index.d.ts +6 -0
  82. package/dist/gs/hash/index.js +20 -0
  83. package/dist/gs/hash/index.js.map +1 -1
  84. package/dist/gs/internal/goarch/index.d.ts +43 -3
  85. package/dist/gs/internal/goarch/index.js +42 -10
  86. package/dist/gs/internal/goarch/index.js.map +1 -1
  87. package/dist/gs/io/fs/fs.js +26 -14
  88. package/dist/gs/io/fs/fs.js.map +1 -1
  89. package/dist/gs/io/fs/readdir.js +8 -4
  90. package/dist/gs/io/fs/readdir.js.map +1 -1
  91. package/dist/gs/io/fs/sub.js +8 -1
  92. package/dist/gs/io/fs/sub.js.map +1 -1
  93. package/dist/gs/io/io.d.ts +12 -6
  94. package/dist/gs/io/io.js +87 -42
  95. package/dist/gs/io/io.js.map +1 -1
  96. package/dist/gs/math/bits/index.d.ts +31 -5
  97. package/dist/gs/math/bits/index.js +29 -28
  98. package/dist/gs/math/bits/index.js.map +1 -1
  99. package/dist/gs/mime/index.d.ts +16 -0
  100. package/dist/gs/mime/index.js +315 -6
  101. package/dist/gs/mime/index.js.map +1 -1
  102. package/dist/gs/net/http/httptest/index.d.ts +12 -0
  103. package/dist/gs/net/http/httptest/index.js +85 -6
  104. package/dist/gs/net/http/httptest/index.js.map +1 -1
  105. package/dist/gs/net/http/index.d.ts +303 -6
  106. package/dist/gs/net/http/index.js +1615 -58
  107. package/dist/gs/net/http/index.js.map +1 -1
  108. package/dist/gs/os/dir_unix.gs.js +1 -1
  109. package/dist/gs/os/dir_unix.gs.js.map +1 -1
  110. package/dist/gs/os/error.gs.js +1 -1
  111. package/dist/gs/os/error.gs.js.map +1 -1
  112. package/dist/gs/os/exec.gs.d.ts +1 -0
  113. package/dist/gs/os/exec.gs.js +4 -8
  114. package/dist/gs/os/exec.gs.js.map +1 -1
  115. package/dist/gs/os/exec_posix.gs.js +1 -1
  116. package/dist/gs/os/exec_posix.gs.js.map +1 -1
  117. package/dist/gs/os/index.d.ts +1 -1
  118. package/dist/gs/os/index.js +1 -1
  119. package/dist/gs/os/index.js.map +1 -1
  120. package/dist/gs/os/proc.gs.d.ts +4 -0
  121. package/dist/gs/os/proc.gs.js +12 -6
  122. package/dist/gs/os/proc.gs.js.map +1 -1
  123. package/dist/gs/os/root_js.gs.js +1 -1
  124. package/dist/gs/os/root_js.gs.js.map +1 -1
  125. package/dist/gs/os/types.gs.js +1 -1
  126. package/dist/gs/os/types.gs.js.map +1 -1
  127. package/dist/gs/os/types_js.gs.d.ts +6 -2
  128. package/dist/gs/os/types_js.gs.js +170 -9
  129. package/dist/gs/os/types_js.gs.js.map +1 -1
  130. package/dist/gs/os/types_unix.gs.js +1 -1
  131. package/dist/gs/os/types_unix.gs.js.map +1 -1
  132. package/dist/gs/path/path.js +11 -7
  133. package/dist/gs/path/path.js.map +1 -1
  134. package/dist/gs/reflect/index.d.ts +5 -4
  135. package/dist/gs/reflect/index.js +4 -3
  136. package/dist/gs/reflect/index.js.map +1 -1
  137. package/dist/gs/reflect/map.js +15 -0
  138. package/dist/gs/reflect/map.js.map +1 -1
  139. package/dist/gs/reflect/type.d.ts +26 -6
  140. package/dist/gs/reflect/type.js +1498 -279
  141. package/dist/gs/reflect/type.js.map +1 -1
  142. package/dist/gs/reflect/types.d.ts +14 -6
  143. package/dist/gs/reflect/types.js +35 -1
  144. package/dist/gs/reflect/types.js.map +1 -1
  145. package/dist/gs/reflect/value.d.ts +1 -0
  146. package/dist/gs/reflect/value.js +83 -41
  147. package/dist/gs/reflect/value.js.map +1 -1
  148. package/dist/gs/reflect/visiblefields.js +4 -140
  149. package/dist/gs/reflect/visiblefields.js.map +1 -1
  150. package/dist/gs/runtime/pprof/index.d.ts +8 -2
  151. package/dist/gs/runtime/pprof/index.js +50 -30
  152. package/dist/gs/runtime/pprof/index.js.map +1 -1
  153. package/dist/gs/runtime/runtime.js +5 -4
  154. package/dist/gs/runtime/runtime.js.map +1 -1
  155. package/dist/gs/runtime/trace/index.js +5 -19
  156. package/dist/gs/runtime/trace/index.js.map +1 -1
  157. package/dist/gs/strconv/atoi.gs.js +1 -1
  158. package/dist/gs/strconv/atoi.gs.js.map +1 -1
  159. package/dist/gs/strconv/complex.gs.d.ts +3 -0
  160. package/dist/gs/strconv/complex.gs.js +148 -0
  161. package/dist/gs/strconv/complex.gs.js.map +1 -0
  162. package/dist/gs/strconv/index.d.ts +1 -0
  163. package/dist/gs/strconv/index.js +1 -0
  164. package/dist/gs/strconv/index.js.map +1 -1
  165. package/dist/gs/strings/builder.js +1 -1
  166. package/dist/gs/strings/reader.d.ts +1 -1
  167. package/dist/gs/strings/reader.js +11 -7
  168. package/dist/gs/strings/reader.js.map +1 -1
  169. package/dist/gs/strings/replace.js +15 -7
  170. package/dist/gs/strings/replace.js.map +1 -1
  171. package/dist/gs/strings/strings.d.ts +5 -0
  172. package/dist/gs/strings/strings.js +57 -5
  173. package/dist/gs/strings/strings.js.map +1 -1
  174. package/dist/gs/sync/atomic/type.gs.js +9 -9
  175. package/dist/gs/sync/atomic/type.gs.js.map +1 -1
  176. package/dist/gs/sync/atomic/value.gs.js +2 -2
  177. package/dist/gs/sync/atomic/value.gs.js.map +1 -1
  178. package/dist/gs/sync/sync.d.ts +2 -1
  179. package/dist/gs/sync/sync.js +37 -16
  180. package/dist/gs/sync/sync.js.map +1 -1
  181. package/dist/gs/syscall/env.js +22 -14
  182. package/dist/gs/syscall/env.js.map +1 -1
  183. package/dist/gs/syscall/js/index.js +9 -0
  184. package/dist/gs/syscall/js/index.js.map +1 -1
  185. package/dist/gs/testing/testing.js +59 -15
  186. package/dist/gs/testing/testing.js.map +1 -1
  187. package/dist/gs/time/time.d.ts +24 -1
  188. package/dist/gs/time/time.js +43 -3
  189. package/dist/gs/time/time.js.map +1 -1
  190. package/dist/gs/unique/index.js +7 -1
  191. package/dist/gs/unique/index.js.map +1 -1
  192. package/go.mod +3 -3
  193. package/go.sum +16 -0
  194. package/gs/builtin/builtin.ts +25 -2
  195. package/gs/builtin/runtime-contract.test.ts +260 -18
  196. package/gs/builtin/slice.ts +51 -4
  197. package/gs/builtin/type.ts +310 -63
  198. package/gs/builtin/varRef.ts +85 -2
  199. package/gs/bytes/buffer.gs.ts +1 -1
  200. package/gs/bytes/reader.gs.ts +1 -1
  201. package/gs/compress/zlib/index.test.ts +159 -1
  202. package/gs/compress/zlib/index.ts +164 -37
  203. package/gs/compress/zlib/meta.json +4 -1
  204. package/gs/compress/zlib/parity.json +51 -0
  205. package/gs/crypto/sha1/index.test.ts +19 -2
  206. package/gs/crypto/sha1/index.ts +3 -6
  207. package/gs/crypto/sha256/index.test.ts +14 -2
  208. package/gs/crypto/sha256/index.ts +3 -6
  209. package/gs/crypto/sha512/index.test.ts +17 -2
  210. package/gs/crypto/sha512/index.ts +3 -6
  211. package/gs/embed/index.test.ts +87 -0
  212. package/gs/embed/index.ts +229 -5
  213. package/gs/encoding/json/index.test.ts +360 -6
  214. package/gs/encoding/json/index.ts +679 -38
  215. package/gs/encoding/json/parity.json +81 -0
  216. package/gs/fmt/fmt.test.ts +41 -3
  217. package/gs/fmt/fmt.ts +40 -17
  218. package/gs/fmt/meta.json +6 -1
  219. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.test.ts +211 -3
  220. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.ts +857 -1
  221. package/gs/github.com/go-git/go-billy/v6/osfs/index.test.ts +110 -0
  222. package/gs/github.com/go-git/go-billy/v6/osfs/index.ts +280 -0
  223. package/gs/github.com/go-git/go-billy/v6/osfs/meta.json +8 -0
  224. package/gs/github.com/pkg/errors/errors.ts +54 -30
  225. package/gs/go/scanner/index.test.ts +39 -56
  226. package/gs/go/scanner/index.ts +33 -5
  227. package/gs/go/scanner/parity.json +27 -0
  228. package/gs/go/token/index.ts +22 -6
  229. package/gs/hash/index.test.ts +20 -33
  230. package/gs/hash/index.ts +28 -0
  231. package/gs/hash/parity.json +21 -0
  232. package/gs/internal/goarch/index.test.ts +32 -0
  233. package/gs/internal/goarch/index.ts +45 -13
  234. package/gs/internal/goarch/parity.json +144 -0
  235. package/gs/io/fs/fs.ts +26 -14
  236. package/gs/io/fs/readdir.test.ts +38 -0
  237. package/gs/io/fs/readdir.ts +8 -4
  238. package/gs/io/fs/sub.ts +8 -1
  239. package/gs/io/io.test.ts +77 -6
  240. package/gs/io/io.ts +115 -52
  241. package/gs/io/meta.json +7 -1
  242. package/gs/io/parity.json +162 -0
  243. package/gs/math/bits/index.test.ts +14 -1
  244. package/gs/math/bits/index.ts +75 -32
  245. package/gs/math/bits/parity.json +156 -0
  246. package/gs/mime/index.test.ts +90 -0
  247. package/gs/mime/index.ts +369 -6
  248. package/gs/mime/parity.json +36 -0
  249. package/gs/net/http/httptest/index.test.ts +98 -2
  250. package/gs/net/http/httptest/index.ts +101 -6
  251. package/gs/net/http/httptest/parity.json +15 -0
  252. package/gs/net/http/index.test.ts +797 -12
  253. package/gs/net/http/index.ts +1874 -136
  254. package/gs/net/http/meta.json +16 -1
  255. package/gs/net/http/parity.json +193 -0
  256. package/gs/os/dir_unix.gs.ts +1 -1
  257. package/gs/os/error.gs.ts +1 -1
  258. package/gs/os/exec.gs.ts +4 -8
  259. package/gs/os/exec_posix.gs.ts +1 -1
  260. package/gs/os/file_unix_js.test.ts +52 -0
  261. package/gs/os/index.test.ts +9 -0
  262. package/gs/os/index.ts +1 -0
  263. package/gs/os/meta.json +4 -0
  264. package/gs/os/parity.json +9 -0
  265. package/gs/os/proc.gs.ts +18 -5
  266. package/gs/os/proc.test.ts +26 -0
  267. package/gs/os/readdir.test.ts +56 -0
  268. package/gs/os/root_js.gs.ts +1 -1
  269. package/gs/os/types.gs.ts +1 -1
  270. package/gs/os/types_js.gs.ts +170 -9
  271. package/gs/os/types_unix.gs.ts +1 -1
  272. package/gs/path/path.ts +11 -7
  273. package/gs/reflect/deepequal.test.ts +10 -1
  274. package/gs/reflect/field.test.ts +37 -15
  275. package/gs/reflect/function-types.test.ts +518 -22
  276. package/gs/reflect/index.ts +8 -6
  277. package/gs/reflect/map.ts +20 -0
  278. package/gs/reflect/meta.json +6 -4
  279. package/gs/reflect/parity.json +234 -0
  280. package/gs/reflect/sliceat.test.ts +156 -0
  281. package/gs/reflect/structof.test.ts +401 -0
  282. package/gs/reflect/type.ts +1980 -365
  283. package/gs/reflect/typefor.test.ts +540 -10
  284. package/gs/reflect/types.ts +43 -18
  285. package/gs/reflect/value.ts +105 -45
  286. package/gs/reflect/visiblefields.ts +5 -168
  287. package/gs/runtime/parity.json +24 -0
  288. package/gs/runtime/pprof/index.test.ts +29 -7
  289. package/gs/runtime/pprof/index.ts +56 -30
  290. package/gs/runtime/pprof/parity.json +27 -0
  291. package/gs/runtime/runtime.test.ts +3 -1
  292. package/gs/runtime/runtime.ts +4 -3
  293. package/gs/runtime/trace/index.test.ts +5 -3
  294. package/gs/runtime/trace/index.ts +8 -20
  295. package/gs/runtime/trace/parity.json +36 -0
  296. package/gs/strconv/atoi.gs.ts +1 -1
  297. package/gs/strconv/complex.gs.ts +174 -0
  298. package/gs/strconv/complex.test.ts +65 -0
  299. package/gs/strconv/index.ts +1 -0
  300. package/gs/strconv/parity.json +120 -0
  301. package/gs/strings/builder.ts +1 -1
  302. package/gs/strings/meta.json +5 -2
  303. package/gs/strings/parity.json +186 -0
  304. package/gs/strings/reader.test.ts +2 -2
  305. package/gs/strings/reader.ts +11 -7
  306. package/gs/strings/replace.ts +15 -7
  307. package/gs/strings/strings.test.ts +22 -2
  308. package/gs/strings/strings.ts +64 -6
  309. package/gs/sync/atomic/type.gs.ts +9 -9
  310. package/gs/sync/atomic/value.gs.ts +2 -2
  311. package/gs/sync/meta.json +1 -0
  312. package/gs/sync/sync.test.ts +41 -1
  313. package/gs/sync/sync.ts +41 -16
  314. package/gs/syscall/env.ts +29 -14
  315. package/gs/syscall/js/index.test.ts +18 -0
  316. package/gs/syscall/js/index.ts +12 -0
  317. package/gs/testing/testing.test.ts +99 -3
  318. package/gs/testing/testing.ts +95 -24
  319. package/gs/time/parity.json +225 -0
  320. package/gs/time/time.test.ts +20 -2
  321. package/gs/time/time.ts +49 -7
  322. package/gs/unique/index.ts +7 -1
  323. package/package.json +4 -2
  324. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.d.ts +0 -217
  325. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js +0 -814
  326. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js.map +0 -1
  327. package/gs/github.com/aperturerobotics/starpc/srpc/index.test.ts +0 -31
  328. package/gs/github.com/aperturerobotics/starpc/srpc/index.ts +0 -1233
  329. package/gs/github.com/aperturerobotics/starpc/srpc/meta.json +0 -46
  330. /package/compiler/{wasm_api.go → wasm-api.go} +0 -0
@@ -285,12 +285,28 @@ export class Position {
285
285
  },
286
286
  ],
287
287
  Position,
288
- {
289
- Filename: { kind: $.TypeKind.Basic, name: 'string' },
290
- Offset: { kind: $.TypeKind.Basic, name: 'int' },
291
- Line: { kind: $.TypeKind.Basic, name: 'int' },
292
- Column: { kind: $.TypeKind.Basic, name: 'int' },
293
- },
288
+ [
289
+ {
290
+ name: 'Filename',
291
+ key: 'Filename',
292
+ type: { kind: $.TypeKind.Basic, name: 'string' },
293
+ },
294
+ {
295
+ name: 'Offset',
296
+ key: 'Offset',
297
+ type: { kind: $.TypeKind.Basic, name: 'int' },
298
+ },
299
+ {
300
+ name: 'Line',
301
+ key: 'Line',
302
+ type: { kind: $.TypeKind.Basic, name: 'int' },
303
+ },
304
+ {
305
+ name: 'Column',
306
+ key: 'Column',
307
+ type: { kind: $.TypeKind.Basic, name: 'int' },
308
+ },
309
+ ],
294
310
  )
295
311
  }
296
312
 
@@ -1,37 +1,24 @@
1
1
  import { describe, expect, it } from 'vitest'
2
2
 
3
- import * as $ from '../builtin/index.js'
4
-
5
- import './index.js'
6
-
7
- class FakeHash {
8
- Write(p: $.Bytes): [number, $.GoError] {
9
- return [$.len(p), null]
10
- }
11
-
12
- Sum(b: $.Bytes): $.Bytes {
13
- return b
14
- }
15
-
16
- Reset(): void {}
17
-
18
- Size(): number {
19
- return 20
20
- }
21
-
22
- BlockSize(): number {
23
- return 64
24
- }
25
- }
26
-
27
- describe('hash runtime contracts', () => {
28
- it('registers Hash for runtime type assertions', () => {
29
- const [value, ok] = $.typeAssertTuple<FakeHash>(
30
- new FakeHash(),
31
- 'hash.Hash',
32
- )
33
-
34
- expect(ok).toBe(true)
35
- expect(value).toBeInstanceOf(FakeHash)
3
+ import * as $ from '@goscript/builtin/index.js'
4
+
5
+ import type { XOF } from './index.js'
6
+
7
+ describe('hash override', () => {
8
+ it('exports the XOF interface shape', () => {
9
+ const xof: XOF = {
10
+ Write(p: $.Bytes): [number, $.GoError] {
11
+ return [$.len(p), null]
12
+ },
13
+ Read(p: $.Bytes): [number, $.GoError] {
14
+ return [$.len(p), null]
15
+ },
16
+ Reset(): void {},
17
+ BlockSize(): number {
18
+ return 1
19
+ },
20
+ }
21
+
22
+ expect(xof.BlockSize()).toBe(1)
36
23
  })
37
24
  })
package/gs/hash/index.ts CHANGED
@@ -16,6 +16,13 @@ export interface Hash64 extends Hash {
16
16
  Sum64(): bigint
17
17
  }
18
18
 
19
+ export interface XOF {
20
+ Write(p: $.Bytes): [number, $.GoError]
21
+ Read(p: $.Bytes): [number, $.GoError]
22
+ Reset(): void
23
+ BlockSize(): number
24
+ }
25
+
19
26
  export interface Cloner {
20
27
  Clone(): [Hash, $.GoError]
21
28
  }
@@ -116,3 +123,24 @@ $.registerInterfaceType('hash.Cloner', null, [
116
123
  ],
117
124
  },
118
125
  ])
126
+
127
+ $.registerInterfaceType('hash.XOF', null, [
128
+ {
129
+ name: 'Write',
130
+ args: [{ name: 'p', type: bytesType }],
131
+ returns: [
132
+ { name: 'n', type: intType },
133
+ { name: 'err', type: errorType },
134
+ ],
135
+ },
136
+ {
137
+ name: 'Read',
138
+ args: [{ name: 'p', type: bytesType }],
139
+ returns: [
140
+ { name: 'n', type: intType },
141
+ { name: 'err', type: errorType },
142
+ ],
143
+ },
144
+ { name: 'Reset', args: [], returns: [] },
145
+ { name: 'BlockSize', args: [], returns: [{ name: '_r0', type: intType }] },
146
+ ])
@@ -0,0 +1,21 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "strict": true,
4
+ "symbols": {
5
+ "Cloner": {
6
+ "status": "real"
7
+ },
8
+ "Hash": {
9
+ "status": "real"
10
+ },
11
+ "Hash32": {
12
+ "status": "real"
13
+ },
14
+ "Hash64": {
15
+ "status": "real"
16
+ },
17
+ "XOF": {
18
+ "status": "real"
19
+ }
20
+ }
21
+ }
@@ -0,0 +1,32 @@
1
+ import { describe, expect, it } from 'vitest'
2
+
3
+ import {
4
+ ArchFamily,
5
+ BigEndian,
6
+ DefaultPhysPageSize,
7
+ GOARCH,
8
+ Int64Align,
9
+ IsAmd64,
10
+ IsWasm,
11
+ PCQuantum,
12
+ PtrBits,
13
+ PtrSize,
14
+ StackAlign,
15
+ WASM,
16
+ } from './index.js'
17
+
18
+ describe('internal/goarch override', () => {
19
+ it('matches JS/WASM Go architecture constants', () => {
20
+ expect(GOARCH).toBe('wasm')
21
+ expect(IsWasm).toBe(1)
22
+ expect(IsAmd64).toBe(0)
23
+ expect(PtrSize).toBe(8)
24
+ expect(PtrBits).toBe(64)
25
+ expect(Int64Align).toBe(PtrSize)
26
+ expect(StackAlign).toBe(PtrSize)
27
+ expect(BigEndian).toBe(false)
28
+ expect(DefaultPhysPageSize).toBe(65536)
29
+ expect(PCQuantum).toBe(1)
30
+ expect(ArchFamily).toBe(WASM)
31
+ })
32
+ })
@@ -1,18 +1,50 @@
1
- // Architecture constants for JavaScript/WebAssembly target
2
- // This replaces the auto-generated version with appropriate values for JS
1
+ export type ArchFamilyType = number
3
2
 
4
- // Pointer size in bytes (64-bit in modern JavaScript environments)
5
- export const PtrSize = 8
3
+ export const AMD64: ArchFamilyType = 0
4
+ export const ARM: ArchFamilyType = 1
5
+ export const ARM64: ArchFamilyType = 2
6
+ export const I386: ArchFamilyType = 3
7
+ export const LOONG64: ArchFamilyType = 4
8
+ export const MIPS: ArchFamilyType = 5
9
+ export const MIPS64: ArchFamilyType = 6
10
+ export const PPC64: ArchFamilyType = 7
11
+ export const RISCV64: ArchFamilyType = 8
12
+ export const S390X: ArchFamilyType = 9
13
+ export const WASM: ArchFamilyType = 10
6
14
 
7
- // JavaScript is little-endian
8
- export const BigEndian = false
15
+ export const GOARCH = 'wasm'
9
16
 
10
- // Architecture family
11
- export const ArchFamily = 'wasm'
17
+ export const Is386 = 0
18
+ export const IsAmd64 = 0
19
+ export const IsAmd64p32 = 0
20
+ export const IsArm = 0
21
+ export const IsArmbe = 0
22
+ export const IsArm64 = 0
23
+ export const IsArm64be = 0
24
+ export const IsLoong64 = 0
25
+ export const IsMips = 0
26
+ export const IsMipsle = 0
27
+ export const IsMips64 = 0
28
+ export const IsMips64le = 0
29
+ export const IsMips64p32 = 0
30
+ export const IsMips64p32le = 0
31
+ export const IsPpc = 0
32
+ export const IsPpc64 = 0
33
+ export const IsPpc64le = 0
34
+ export const IsRiscv = 0
35
+ export const IsRiscv64 = 0
36
+ export const IsS390 = 0
37
+ export const IsS390x = 0
38
+ export const IsSparc = 0
39
+ export const IsSparc64 = 0
40
+ export const IsWasm = 1
12
41
 
13
- // Other common architecture constants
14
- export const Int64Align = 8
42
+ export const PtrSize = 8
43
+ export const PtrBits = PtrSize * 8
44
+ export const Int64Align = PtrSize
45
+ export const BigEndian = false
46
+ export const ArchFamily: ArchFamilyType = WASM
47
+ export const DefaultPhysPageSize = 65536
48
+ export const PCQuantum = 1
15
49
  export const MinFrameSize = 0
16
-
17
- // CPU cache line size (not really applicable in JS, but some code might reference it)
18
- export const CacheLineSize = 64
50
+ export const StackAlign = PtrSize
@@ -0,0 +1,144 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "strict": true,
4
+ "symbols": {
5
+ "AMD64": {
6
+ "status": "real"
7
+ },
8
+ "ArchFamily": {
9
+ "status": "real"
10
+ },
11
+ "ArchFamilyType": {
12
+ "status": "real"
13
+ },
14
+ "ARM": {
15
+ "status": "real"
16
+ },
17
+ "ARM64": {
18
+ "status": "real"
19
+ },
20
+ "BigEndian": {
21
+ "status": "real"
22
+ },
23
+ "DefaultPhysPageSize": {
24
+ "status": "real"
25
+ },
26
+ "GOARCH": {
27
+ "status": "real"
28
+ },
29
+ "I386": {
30
+ "status": "real"
31
+ },
32
+ "Int64Align": {
33
+ "status": "real"
34
+ },
35
+ "Is386": {
36
+ "status": "real"
37
+ },
38
+ "IsAmd64": {
39
+ "status": "real"
40
+ },
41
+ "IsAmd64p32": {
42
+ "status": "real"
43
+ },
44
+ "IsArm": {
45
+ "status": "real"
46
+ },
47
+ "IsArm64": {
48
+ "status": "real"
49
+ },
50
+ "IsArm64be": {
51
+ "status": "real"
52
+ },
53
+ "IsArmbe": {
54
+ "status": "real"
55
+ },
56
+ "IsLoong64": {
57
+ "status": "real"
58
+ },
59
+ "IsMips": {
60
+ "status": "real"
61
+ },
62
+ "IsMips64": {
63
+ "status": "real"
64
+ },
65
+ "IsMips64le": {
66
+ "status": "real"
67
+ },
68
+ "IsMips64p32": {
69
+ "status": "real"
70
+ },
71
+ "IsMips64p32le": {
72
+ "status": "real"
73
+ },
74
+ "IsMipsle": {
75
+ "status": "real"
76
+ },
77
+ "IsPpc": {
78
+ "status": "real"
79
+ },
80
+ "IsPpc64": {
81
+ "status": "real"
82
+ },
83
+ "IsPpc64le": {
84
+ "status": "real"
85
+ },
86
+ "IsRiscv": {
87
+ "status": "real"
88
+ },
89
+ "IsRiscv64": {
90
+ "status": "real"
91
+ },
92
+ "IsS390": {
93
+ "status": "real"
94
+ },
95
+ "IsS390x": {
96
+ "status": "real"
97
+ },
98
+ "IsSparc": {
99
+ "status": "real"
100
+ },
101
+ "IsSparc64": {
102
+ "status": "real"
103
+ },
104
+ "IsWasm": {
105
+ "status": "real"
106
+ },
107
+ "LOONG64": {
108
+ "status": "real"
109
+ },
110
+ "MinFrameSize": {
111
+ "status": "real"
112
+ },
113
+ "MIPS": {
114
+ "status": "real"
115
+ },
116
+ "MIPS64": {
117
+ "status": "real"
118
+ },
119
+ "PCQuantum": {
120
+ "status": "real"
121
+ },
122
+ "PPC64": {
123
+ "status": "real"
124
+ },
125
+ "PtrBits": {
126
+ "status": "real"
127
+ },
128
+ "PtrSize": {
129
+ "status": "real"
130
+ },
131
+ "RISCV64": {
132
+ "status": "real"
133
+ },
134
+ "S390X": {
135
+ "status": "real"
136
+ },
137
+ "StackAlign": {
138
+ "status": "real"
139
+ },
140
+ "WASM": {
141
+ "status": "real"
142
+ }
143
+ }
144
+ }
package/gs/io/fs/fs.ts CHANGED
@@ -618,20 +618,32 @@ export class PathError {
618
618
  },
619
619
  ],
620
620
  PathError,
621
- {
622
- Op: { kind: $.TypeKind.Basic, name: 'string' },
623
- Path: { kind: $.TypeKind.Basic, name: 'string' },
624
- Err: {
625
- kind: $.TypeKind.Interface,
626
- name: 'GoError',
627
- methods: [
628
- {
629
- name: 'Error',
630
- args: [],
631
- returns: [{ type: { kind: $.TypeKind.Basic, name: 'string' } }],
632
- },
633
- ],
621
+ [
622
+ {
623
+ name: 'Op',
624
+ key: 'Op',
625
+ type: { kind: $.TypeKind.Basic, name: 'string' },
634
626
  },
635
- },
627
+ {
628
+ name: 'Path',
629
+ key: 'Path',
630
+ type: { kind: $.TypeKind.Basic, name: 'string' },
631
+ },
632
+ {
633
+ name: 'Err',
634
+ key: 'Err',
635
+ type: {
636
+ kind: $.TypeKind.Interface,
637
+ name: 'GoError',
638
+ methods: [
639
+ {
640
+ name: 'Error',
641
+ args: [],
642
+ returns: [{ type: { kind: $.TypeKind.Basic, name: 'string' } }],
643
+ },
644
+ ],
645
+ },
646
+ },
647
+ ],
636
648
  )
637
649
  }
@@ -0,0 +1,38 @@
1
+ import { describe, expect, it } from 'vitest'
2
+ import * as $ from '@goscript/builtin/index.js'
3
+
4
+ import { File, FileInfo, ReadDir } from './index.js'
5
+
6
+ describe('io/fs ReadDir override', () => {
7
+ it('returns a nil entry slice without sorting when directory read fails', () => {
8
+ const readErr = $.newError('read failed')
9
+ const file: File & {
10
+ ReadDir(n: number): [null, $.GoError]
11
+ } = {
12
+ Close(): $.GoError {
13
+ return null
14
+ },
15
+ Read(_p0: Uint8Array): [number, $.GoError] {
16
+ return [0, readErr]
17
+ },
18
+ Stat(): [FileInfo, $.GoError] {
19
+ return [null, readErr]
20
+ },
21
+ ReadDir(_n: number): [null, $.GoError] {
22
+ return [null, readErr]
23
+ },
24
+ }
25
+
26
+ const [list, err] = ReadDir(
27
+ {
28
+ Open(_name: string): [File, $.GoError] {
29
+ return [file, null]
30
+ },
31
+ },
32
+ 'dir',
33
+ )
34
+
35
+ expect(list).toBeNull()
36
+ expect(err).toBe(readErr)
37
+ })
38
+ })
@@ -92,9 +92,13 @@ export function ReadDir(
92
92
 
93
93
  let list: $.Slice<DirEntry>
94
94
  ;[list, err] = dir!.ReadDir(-1)
95
- list!.sort((a: DirEntry, b: DirEntry): number => {
96
- return a!.Name().localeCompare(b!.Name())
97
- })
95
+ if (list) {
96
+ list.sort((a: DirEntry, b: DirEntry): number => {
97
+ return $.pointerValue<Exclude<DirEntry, null>>(a)
98
+ .Name()
99
+ .localeCompare($.pointerValue<Exclude<DirEntry, null>>(b).Name())
100
+ })
101
+ }
98
102
  return [list, err]
99
103
  }
100
104
 
@@ -194,7 +198,7 @@ class dirInfo {
194
198
  },
195
199
  ],
196
200
  dirInfo,
197
- { fileInfo: 'FileInfo' },
201
+ [{ name: 'fileInfo', key: 'fileInfo', type: 'FileInfo' }],
198
202
  )
199
203
  }
200
204
 
package/gs/io/fs/sub.ts CHANGED
@@ -444,6 +444,13 @@ class subFS {
444
444
  },
445
445
  ],
446
446
  subFS,
447
- { fsys: 'FS', dir: { kind: $.TypeKind.Basic, name: 'string' } },
447
+ [
448
+ { name: 'fsys', key: 'fsys', type: 'FS' },
449
+ {
450
+ name: 'dir',
451
+ key: 'dir',
452
+ type: { kind: $.TypeKind.Basic, name: 'string' },
453
+ },
454
+ ],
448
455
  )
449
456
  }
package/gs/io/io.test.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as $ from '@goscript/builtin/index.js'
2
- import { LimitedReader, MultiWriter, TeeReader } from './index.js'
2
+ import { LimitedReader, MultiWriter, NopCloser, Pipe, TeeReader } from './index.js'
3
3
  import { describe, expect, test } from 'vitest'
4
4
 
5
5
  class sliceReader {
@@ -9,7 +9,7 @@ class sliceReader {
9
9
  const n = Math.min($.len(p), this.data.length)
10
10
  p!.set(this.data.subarray(0, n), 0)
11
11
  this.data = this.data.subarray(n)
12
- return [n, n === 0 ? new Error('EOF') as $.GoError : null]
12
+ return [n, n === 0 ? (new Error('EOF') as $.GoError) : null]
13
13
  }
14
14
  }
15
15
 
@@ -37,28 +37,99 @@ describe('io override', () => {
37
37
  expect(Buffer.from(buf.subarray(0, n)).toString('utf8')).toBe('abc')
38
38
  })
39
39
 
40
- test('TeeReader accepts nullable generated interface values', () => {
40
+ test('TeeReader accepts nullable generated interface values', async () => {
41
41
  const writer = new captureWriter()
42
42
  const reader = TeeReader(new sliceReader($.stringToBytes('abc')), writer)
43
43
  const buf = new Uint8Array(4)
44
44
 
45
- const [n, err] = reader.Read(buf)
45
+ const [n, err] = await reader.Read(buf)
46
46
 
47
47
  expect(err).toBeNull()
48
48
  expect(n).toBe(3)
49
49
  expect(Buffer.from(writer.chunks).toString('utf8')).toBe('abc')
50
50
  })
51
51
 
52
- test('MultiWriter accepts nullable generated interface values', () => {
52
+ test('NopCloser accepts nullable generated interface values', () => {
53
+ const reader: sliceReader | null = new sliceReader($.stringToBytes('abc'))
54
+ const body = NopCloser(reader)
55
+ const buf = new Uint8Array(4)
56
+
57
+ const [n, err] = body.Read(buf)
58
+
59
+ expect(err).toBeNull()
60
+ expect(n).toBe(3)
61
+ expect(body.Close()).toBeNull()
62
+ })
63
+
64
+ test('TeeReader awaits async readers and writers', async () => {
65
+ const chunks: number[] = []
66
+ const reader = TeeReader(
67
+ {
68
+ async Read(p: $.Bytes): Promise<[number, $.GoError]> {
69
+ await Promise.resolve()
70
+ p!.set($.stringToBytes('abc'), 0)
71
+ return [3, null]
72
+ },
73
+ } as any,
74
+ {
75
+ async Write(p: $.Bytes): Promise<[number, $.GoError]> {
76
+ await Promise.resolve()
77
+ chunks.push(...Array.from(p ?? []))
78
+ return [$.len(p), null]
79
+ },
80
+ } as any,
81
+ )
82
+ const buf = new Uint8Array(4)
83
+
84
+ const [n, err] = await reader.Read(buf)
85
+
86
+ expect(err).toBeNull()
87
+ expect(n).toBe(3)
88
+ expect(Buffer.from(chunks).toString('utf8')).toBe('abc')
89
+ })
90
+
91
+ test('MultiWriter accepts nullable generated interface values', async () => {
53
92
  const first = new captureWriter()
54
93
  const second = new captureWriter()
55
94
  const writer = MultiWriter(first, second)
56
95
 
57
- const [n, err] = writer.Write($.stringToBytes('abc'))
96
+ const [n, err] = await writer.Write($.stringToBytes('abc'))
58
97
 
59
98
  expect(err).toBeNull()
60
99
  expect(n).toBe(3)
61
100
  expect(Buffer.from(first.chunks).toString('utf8')).toBe('abc')
62
101
  expect(Buffer.from(second.chunks).toString('utf8')).toBe('abc')
63
102
  })
103
+
104
+ test('MultiWriter awaits async generated writers', async () => {
105
+ const chunks: number[] = []
106
+ const writer = MultiWriter({
107
+ async Write(p: $.Bytes): Promise<[number, $.GoError]> {
108
+ await Promise.resolve()
109
+ chunks.push(...Array.from(p ?? []))
110
+ return [$.len(p), null]
111
+ },
112
+ })
113
+
114
+ const [n, err] = await writer.Write($.stringToBytes('abc'))
115
+
116
+ expect(err).toBeNull()
117
+ expect(n).toBe(3)
118
+ expect(Buffer.from(chunks).toString('utf8')).toBe('abc')
119
+ })
120
+
121
+ test('PipeReader waits for a later write', async () => {
122
+ const [reader, writer] = Pipe()
123
+ const buf = new Uint8Array(5)
124
+
125
+ const read = reader.Read(buf)
126
+ const [written, writeErr] = await writer.Write($.stringToBytes('later'))
127
+ const [readBytes, readErr] = await read
128
+
129
+ expect(writeErr).toBeNull()
130
+ expect(written).toBe(5)
131
+ expect(readErr).toBeNull()
132
+ expect(readBytes).toBe(5)
133
+ expect(Buffer.from(buf).toString('utf8')).toBe('later')
134
+ })
64
135
  })