goscript 0.1.1 → 0.1.3

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 (376) hide show
  1. package/cmd/goscript/cmd-test.go +104 -11
  2. package/cmd/goscript/cmd-test_test.go +1 -1
  3. package/cmd/goscript/cmd_compile.go +9 -0
  4. package/compiler/compile-request.go +31 -0
  5. package/compiler/compiler.go +1 -1
  6. package/compiler/compliance_test.go +0 -2
  7. package/compiler/config.go +2 -0
  8. package/compiler/gotest/package-result.go +2 -0
  9. package/compiler/gotest/request.go +85 -20
  10. package/compiler/gotest/runner.go +733 -96
  11. package/compiler/gotest/runner_test.go +647 -3
  12. package/compiler/lowered-program.go +10 -2
  13. package/compiler/lowering.go +2676 -349
  14. package/compiler/override-facts.go +77 -27
  15. package/compiler/override-registry.go +5 -4
  16. package/compiler/override-registry_test.go +178 -0
  17. package/compiler/package-graph_test.go +62 -7
  18. package/compiler/package-test-graph-variant.go +40 -16
  19. package/compiler/package-test-graph.go +0 -5
  20. package/compiler/package-test-graph_test.go +61 -3
  21. package/compiler/runtime-contract.go +40 -0
  22. package/compiler/semantic-model-types.go +16 -0
  23. package/compiler/semantic-model.go +336 -91
  24. package/compiler/semantic-model_test.go +50 -1
  25. package/compiler/service.go +9 -3
  26. package/compiler/skeleton_test.go +2371 -296
  27. package/compiler/tsworkspace/owner-process-unix_test.go +72 -0
  28. package/compiler/tsworkspace/owner.go +8 -0
  29. package/compiler/tsworkspace/tool-process-other.go +14 -0
  30. package/compiler/tsworkspace/tool-process-unix.go +19 -0
  31. package/compiler/typescript-emitter.go +149 -10
  32. package/dist/gs/builtin/builtin.d.ts +20 -1
  33. package/dist/gs/builtin/builtin.js +246 -26
  34. package/dist/gs/builtin/builtin.js.map +1 -1
  35. package/dist/gs/builtin/channel.d.ts +24 -10
  36. package/dist/gs/builtin/channel.js +143 -34
  37. package/dist/gs/builtin/channel.js.map +1 -1
  38. package/dist/gs/builtin/defer.d.ts +1 -0
  39. package/dist/gs/builtin/defer.js +12 -2
  40. package/dist/gs/builtin/defer.js.map +1 -1
  41. package/dist/gs/builtin/hostio.d.ts +9 -0
  42. package/dist/gs/builtin/hostio.js +25 -0
  43. package/dist/gs/builtin/hostio.js.map +1 -1
  44. package/dist/gs/builtin/map.js +40 -6
  45. package/dist/gs/builtin/map.js.map +1 -1
  46. package/dist/gs/builtin/print.js.map +1 -1
  47. package/dist/gs/builtin/slice.d.ts +43 -9
  48. package/dist/gs/builtin/slice.js +437 -234
  49. package/dist/gs/builtin/slice.js.map +1 -1
  50. package/dist/gs/builtin/type.d.ts +2 -0
  51. package/dist/gs/builtin/type.js +55 -10
  52. package/dist/gs/builtin/type.js.map +1 -1
  53. package/dist/gs/builtin/varRef.d.ts +2 -0
  54. package/dist/gs/builtin/varRef.js.map +1 -1
  55. package/dist/gs/bytes/buffer.gs.js +28 -28
  56. package/dist/gs/bytes/buffer.gs.js.map +1 -1
  57. package/dist/gs/bytes/bytes.gs.d.ts +7 -5
  58. package/dist/gs/bytes/bytes.gs.js +10 -4
  59. package/dist/gs/bytes/bytes.gs.js.map +1 -1
  60. package/dist/gs/bytes/iter.gs.js +13 -13
  61. package/dist/gs/bytes/iter.gs.js.map +1 -1
  62. package/dist/gs/compress/zlib/index.d.ts +26 -0
  63. package/dist/gs/compress/zlib/index.js +168 -0
  64. package/dist/gs/compress/zlib/index.js.map +1 -0
  65. package/dist/gs/context/context.d.ts +1 -1
  66. package/dist/gs/context/context.js +8 -3
  67. package/dist/gs/context/context.js.map +1 -1
  68. package/dist/gs/crypto/ecdh/index.d.ts +52 -0
  69. package/dist/gs/crypto/ecdh/index.js +226 -0
  70. package/dist/gs/crypto/ecdh/index.js.map +1 -0
  71. package/dist/gs/crypto/ed25519/index.d.ts +34 -0
  72. package/dist/gs/crypto/ed25519/index.js +160 -0
  73. package/dist/gs/crypto/ed25519/index.js.map +1 -0
  74. package/dist/gs/crypto/internal/constanttime/index.d.ts +4 -0
  75. package/dist/gs/crypto/internal/constanttime/index.js +18 -0
  76. package/dist/gs/crypto/internal/constanttime/index.js.map +1 -0
  77. package/dist/gs/crypto/rand/index.d.ts +2 -0
  78. package/dist/gs/crypto/rand/index.js +85 -0
  79. package/dist/gs/crypto/rand/index.js.map +1 -1
  80. package/dist/gs/crypto/sha1/index.d.ts +5 -0
  81. package/dist/gs/crypto/sha1/index.js +106 -0
  82. package/dist/gs/crypto/sha1/index.js.map +1 -0
  83. package/dist/gs/crypto/sha256/index.d.ts +8 -0
  84. package/dist/gs/crypto/sha256/index.js +118 -0
  85. package/dist/gs/crypto/sha256/index.js.map +1 -0
  86. package/dist/gs/crypto/sha512/index.d.ts +14 -0
  87. package/dist/gs/crypto/sha512/index.js +129 -0
  88. package/dist/gs/crypto/sha512/index.js.map +1 -0
  89. package/dist/gs/encoding/json/index.d.ts +3 -0
  90. package/dist/gs/encoding/json/index.js +15 -0
  91. package/dist/gs/encoding/json/index.js.map +1 -1
  92. package/dist/gs/errors/errors.js +29 -6
  93. package/dist/gs/errors/errors.js.map +1 -1
  94. package/dist/gs/fmt/fmt.d.ts +1 -1
  95. package/dist/gs/fmt/fmt.js +64 -3
  96. package/dist/gs/fmt/fmt.js.map +1 -1
  97. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.d.ts +7 -7
  98. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js +52 -18
  99. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js.map +1 -1
  100. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js +56 -20
  101. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js.map +1 -1
  102. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.d.ts +57 -3
  103. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js +366 -1
  104. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js.map +1 -1
  105. package/dist/gs/github.com/aperturerobotics/util/conc/index.d.ts +20 -0
  106. package/dist/gs/github.com/aperturerobotics/util/conc/index.js +134 -0
  107. package/dist/gs/github.com/aperturerobotics/util/conc/index.js.map +1 -0
  108. package/dist/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/browser.js.map +1 -1
  109. package/dist/gs/github.com/hack-pad/safejs/internal/catch/index.d.ts +3 -0
  110. package/dist/gs/github.com/hack-pad/safejs/internal/catch/index.js +50 -0
  111. package/dist/gs/github.com/hack-pad/safejs/internal/catch/index.js.map +1 -0
  112. package/dist/gs/github.com/klauspost/compress/internal/le/index.js +3 -2
  113. package/dist/gs/github.com/klauspost/compress/internal/le/index.js.map +1 -1
  114. package/dist/gs/github.com/mr-tron/base58/base58/index.d.ts +27 -0
  115. package/dist/gs/github.com/mr-tron/base58/base58/index.js +172 -0
  116. package/dist/gs/github.com/mr-tron/base58/base58/index.js.map +1 -0
  117. package/dist/gs/github.com/zeebo/blake3/internal/consts/index.d.ts +21 -0
  118. package/dist/gs/github.com/zeebo/blake3/internal/consts/index.js +22 -0
  119. package/dist/gs/github.com/zeebo/blake3/internal/consts/index.js.map +1 -0
  120. package/dist/gs/go/token/index.js +11 -4
  121. package/dist/gs/go/token/index.js.map +1 -1
  122. package/dist/gs/hash/fnv/index.d.ts +57 -0
  123. package/dist/gs/hash/fnv/index.js +299 -0
  124. package/dist/gs/hash/fnv/index.js.map +1 -0
  125. package/dist/gs/hash/index.d.ts +17 -0
  126. package/dist/gs/hash/index.js +94 -0
  127. package/dist/gs/hash/index.js.map +1 -0
  128. package/dist/gs/io/fs/readlink.js +2 -6
  129. package/dist/gs/io/fs/readlink.js.map +1 -1
  130. package/dist/gs/io/fs/walk.js.map +1 -1
  131. package/dist/gs/io/io.d.ts +8 -5
  132. package/dist/gs/io/io.js +20 -2
  133. package/dist/gs/io/io.js.map +1 -1
  134. package/dist/gs/iter/iter.d.ts +3 -2
  135. package/dist/gs/iter/iter.js.map +1 -1
  136. package/dist/gs/maps/iter.d.ts +5 -5
  137. package/dist/gs/maps/iter.js +48 -21
  138. package/dist/gs/maps/iter.js.map +1 -1
  139. package/dist/gs/maps/maps.d.ts +6 -6
  140. package/dist/gs/math/bits/index.js +14 -24
  141. package/dist/gs/math/bits/index.js.map +1 -1
  142. package/dist/gs/mime/index.js +3 -1
  143. package/dist/gs/mime/index.js.map +1 -1
  144. package/dist/gs/net/http/httptest/index.d.ts +20 -1
  145. package/dist/gs/net/http/httptest/index.js +85 -3
  146. package/dist/gs/net/http/httptest/index.js.map +1 -1
  147. package/dist/gs/net/http/index.d.ts +118 -6
  148. package/dist/gs/net/http/index.js +389 -14
  149. package/dist/gs/net/http/index.js.map +1 -1
  150. package/dist/gs/net/http/pprof/index.d.ts +8 -0
  151. package/dist/gs/net/http/pprof/index.js +59 -0
  152. package/dist/gs/net/http/pprof/index.js.map +1 -0
  153. package/dist/gs/os/error.gs.js +9 -7
  154. package/dist/gs/os/error.gs.js.map +1 -1
  155. package/dist/gs/os/types_js.gs.js +95 -15
  156. package/dist/gs/os/types_js.gs.js.map +1 -1
  157. package/dist/gs/os/zero_copy_posix.gs.js +1 -1
  158. package/dist/gs/os/zero_copy_posix.gs.js.map +1 -1
  159. package/dist/gs/path/filepath/match.js.map +1 -1
  160. package/dist/gs/path/filepath/path.d.ts +5 -3
  161. package/dist/gs/path/filepath/path.js +65 -10
  162. package/dist/gs/path/filepath/path.js.map +1 -1
  163. package/dist/gs/reflect/index.d.ts +3 -2
  164. package/dist/gs/reflect/index.js +2 -1
  165. package/dist/gs/reflect/index.js.map +1 -1
  166. package/dist/gs/reflect/iter.js +2 -2
  167. package/dist/gs/reflect/iter.js.map +1 -1
  168. package/dist/gs/reflect/map.js +26 -0
  169. package/dist/gs/reflect/map.js.map +1 -1
  170. package/dist/gs/reflect/type.d.ts +24 -5
  171. package/dist/gs/reflect/type.js +390 -38
  172. package/dist/gs/reflect/type.js.map +1 -1
  173. package/dist/gs/reflect/types.d.ts +1 -0
  174. package/dist/gs/reflect/types.js +3 -1
  175. package/dist/gs/reflect/types.js.map +1 -1
  176. package/dist/gs/reflect/value.d.ts +4 -1
  177. package/dist/gs/reflect/value.js +39 -1
  178. package/dist/gs/reflect/value.js.map +1 -1
  179. package/dist/gs/reflect/visiblefields.js +1 -1
  180. package/dist/gs/reflect/visiblefields.js.map +1 -1
  181. package/dist/gs/runtime/debug/index.d.ts +39 -0
  182. package/dist/gs/runtime/debug/index.js +58 -0
  183. package/dist/gs/runtime/debug/index.js.map +1 -1
  184. package/dist/gs/runtime/pprof/index.d.ts +20 -0
  185. package/dist/gs/runtime/pprof/index.js +85 -0
  186. package/dist/gs/runtime/pprof/index.js.map +1 -0
  187. package/dist/gs/runtime/trace/index.d.ts +19 -0
  188. package/dist/gs/runtime/trace/index.js +64 -0
  189. package/dist/gs/runtime/trace/index.js.map +1 -0
  190. package/dist/gs/slices/slices.d.ts +24 -9
  191. package/dist/gs/slices/slices.js +229 -24
  192. package/dist/gs/slices/slices.js.map +1 -1
  193. package/dist/gs/sort/slice.gs.d.ts +5 -3
  194. package/dist/gs/sort/slice.gs.js +55 -17
  195. package/dist/gs/sort/slice.gs.js.map +1 -1
  196. package/dist/gs/strings/builder.js +26 -17
  197. package/dist/gs/strings/builder.js.map +1 -1
  198. package/dist/gs/strings/iter.js +140 -75
  199. package/dist/gs/strings/iter.js.map +1 -1
  200. package/dist/gs/strings/replace.js +2 -2
  201. package/dist/gs/strings/replace.js.map +1 -1
  202. package/dist/gs/strings/strings.js +52 -6
  203. package/dist/gs/strings/strings.js.map +1 -1
  204. package/dist/gs/sync/sync.d.ts +6 -3
  205. package/dist/gs/sync/sync.js +39 -11
  206. package/dist/gs/sync/sync.js.map +1 -1
  207. package/dist/gs/syscall/errors.d.ts +116 -112
  208. package/dist/gs/syscall/errors.js +38 -1
  209. package/dist/gs/syscall/errors.js.map +1 -1
  210. package/dist/gs/syscall/fs.d.ts +2 -8
  211. package/dist/gs/syscall/fs.js.map +1 -1
  212. package/dist/gs/syscall/js/index.js +20 -12
  213. package/dist/gs/syscall/js/index.js.map +1 -1
  214. package/dist/gs/syscall/types.d.ts +4 -1
  215. package/dist/gs/syscall/types.js.map +1 -1
  216. package/dist/gs/testing/testing.d.ts +4 -3
  217. package/dist/gs/testing/testing.js +21 -4
  218. package/dist/gs/testing/testing.js.map +1 -1
  219. package/dist/gs/time/time.js +22 -0
  220. package/dist/gs/time/time.js.map +1 -1
  221. package/dist/gs/unicode/unicode.js.map +1 -1
  222. package/dist/gs/unique/index.js +7 -2
  223. package/dist/gs/unique/index.js.map +1 -1
  224. package/go.mod +8 -8
  225. package/go.sum +14 -23
  226. package/gs/builtin/builtin.ts +364 -37
  227. package/gs/builtin/channel.ts +208 -38
  228. package/gs/builtin/defer.ts +13 -2
  229. package/gs/builtin/hostio.test.ts +1 -0
  230. package/gs/builtin/hostio.ts +38 -0
  231. package/gs/builtin/map.ts +46 -6
  232. package/gs/builtin/print.ts +12 -3
  233. package/gs/builtin/runtime-contract.test.ts +290 -10
  234. package/gs/builtin/slice.test.ts +70 -0
  235. package/gs/builtin/slice.ts +566 -255
  236. package/gs/builtin/type.ts +63 -10
  237. package/gs/builtin/varRef.ts +2 -0
  238. package/gs/bytes/buffer.gs.ts +28 -28
  239. package/gs/bytes/bytes.gs.ts +19 -10
  240. package/gs/bytes/bytes.test.ts +17 -0
  241. package/gs/bytes/iter.gs.ts +13 -14
  242. package/gs/compress/zlib/index.test.ts +28 -0
  243. package/gs/compress/zlib/index.ts +200 -0
  244. package/gs/compress/zlib/meta.json +3 -0
  245. package/gs/context/context.test.ts +36 -2
  246. package/gs/context/context.ts +9 -4
  247. package/gs/crypto/ecdh/index.test.ts +43 -0
  248. package/gs/crypto/ecdh/index.ts +274 -0
  249. package/gs/crypto/ed25519/index.test.ts +41 -0
  250. package/gs/crypto/ed25519/index.ts +238 -0
  251. package/gs/crypto/ed25519/meta.json +13 -0
  252. package/gs/crypto/internal/constanttime/index.test.ts +25 -0
  253. package/gs/crypto/internal/constanttime/index.ts +22 -0
  254. package/gs/crypto/rand/index.test.ts +89 -1
  255. package/gs/crypto/rand/index.ts +103 -1
  256. package/gs/crypto/rand/meta.json +4 -1
  257. package/gs/crypto/sha1/index.test.ts +28 -0
  258. package/gs/crypto/sha1/index.ts +130 -0
  259. package/gs/crypto/sha1/meta.json +8 -0
  260. package/gs/crypto/sha256/index.test.ts +78 -0
  261. package/gs/crypto/sha256/index.ts +150 -0
  262. package/gs/crypto/sha256/meta.json +9 -0
  263. package/gs/crypto/sha512/index.test.ts +31 -0
  264. package/gs/crypto/sha512/index.ts +161 -0
  265. package/gs/crypto/sha512/meta.json +11 -0
  266. package/gs/encoding/json/index.test.ts +25 -3
  267. package/gs/encoding/json/index.ts +21 -3
  268. package/gs/errors/errors.test.ts +4 -1
  269. package/gs/errors/errors.ts +32 -8
  270. package/gs/fmt/fmt.test.ts +23 -1
  271. package/gs/fmt/fmt.ts +76 -10
  272. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.test.ts +62 -7
  273. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.ts +78 -36
  274. package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.test.ts +32 -11
  275. package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.ts +122 -43
  276. package/gs/github.com/aperturerobotics/starpc/srpc/index.test.ts +31 -0
  277. package/gs/github.com/aperturerobotics/starpc/srpc/index.ts +518 -4
  278. package/gs/github.com/aperturerobotics/starpc/srpc/meta.json +6 -0
  279. package/gs/github.com/aperturerobotics/util/conc/index.test.ts +30 -0
  280. package/gs/github.com/aperturerobotics/util/conc/index.ts +172 -0
  281. package/gs/github.com/aperturerobotics/util/conc/meta.json +9 -0
  282. package/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/browser.ts +1 -4
  283. package/gs/github.com/hack-pad/safejs/internal/catch/index.test.ts +35 -0
  284. package/gs/github.com/hack-pad/safejs/internal/catch/index.ts +65 -0
  285. package/gs/github.com/hack-pad/safejs/internal/catch/meta.json +9 -0
  286. package/gs/github.com/klauspost/compress/internal/le/index.test.ts +2 -1
  287. package/gs/github.com/klauspost/compress/internal/le/index.ts +6 -5
  288. package/gs/github.com/mr-tron/base58/base58/index.test.ts +70 -0
  289. package/gs/github.com/mr-tron/base58/base58/index.ts +231 -0
  290. package/gs/github.com/mr-tron/base58/base58/meta.json +3 -0
  291. package/gs/github.com/zeebo/blake3/internal/consts/index.test.ts +46 -0
  292. package/gs/github.com/zeebo/blake3/internal/consts/index.ts +26 -0
  293. package/gs/go/token/index.ts +17 -4
  294. package/gs/hash/fnv/index.test.ts +67 -0
  295. package/gs/hash/fnv/index.ts +351 -0
  296. package/gs/hash/fnv/meta.json +3 -0
  297. package/gs/hash/index.test.ts +37 -0
  298. package/gs/hash/index.ts +118 -0
  299. package/gs/hash/meta.json +5 -0
  300. package/gs/internal/byteorder/index.test.ts +6 -6
  301. package/gs/io/fs/readlink.ts +40 -48
  302. package/gs/io/fs/walk.ts +10 -2
  303. package/gs/io/io.test.ts +64 -0
  304. package/gs/io/io.ts +34 -13
  305. package/gs/iter/iter.ts +8 -2
  306. package/gs/maps/iter.ts +69 -26
  307. package/gs/maps/maps.test.ts +23 -0
  308. package/gs/maps/maps.ts +6 -6
  309. package/gs/math/bits/index.test.ts +20 -0
  310. package/gs/math/bits/index.ts +15 -28
  311. package/gs/mime/index.ts +8 -2
  312. package/gs/net/http/httptest/index.test.ts +85 -0
  313. package/gs/net/http/httptest/index.ts +113 -3
  314. package/gs/net/http/index.test.ts +159 -1
  315. package/gs/net/http/index.ts +515 -15
  316. package/gs/net/http/meta.json +6 -0
  317. package/gs/net/http/pprof/index.test.ts +47 -0
  318. package/gs/net/http/pprof/index.ts +65 -0
  319. package/gs/os/error.gs.ts +9 -10
  320. package/gs/os/error.test.ts +41 -0
  321. package/gs/os/file_unix_js.test.ts +55 -0
  322. package/gs/os/tempfile.gs.test.ts +37 -10
  323. package/gs/os/types_js.gs.ts +94 -15
  324. package/gs/os/zero_copy_posix.gs.ts +1 -2
  325. package/gs/path/filepath/match.ts +4 -1
  326. package/gs/path/filepath/meta.json +6 -0
  327. package/gs/path/filepath/path.test.ts +57 -2
  328. package/gs/path/filepath/path.ts +91 -12
  329. package/gs/reflect/field.test.ts +63 -0
  330. package/gs/reflect/index.ts +4 -1
  331. package/gs/reflect/iter.ts +2 -2
  332. package/gs/reflect/map.test.ts +24 -2
  333. package/gs/reflect/map.ts +35 -0
  334. package/gs/reflect/type.ts +543 -60
  335. package/gs/reflect/typefor.test.ts +100 -0
  336. package/gs/reflect/types.ts +3 -1
  337. package/gs/reflect/value.ts +50 -1
  338. package/gs/reflect/visiblefields.ts +1 -1
  339. package/gs/runtime/debug/index.test.ts +22 -1
  340. package/gs/runtime/debug/index.ts +88 -0
  341. package/gs/runtime/pprof/index.test.ts +36 -0
  342. package/gs/runtime/pprof/index.ts +104 -0
  343. package/gs/runtime/pprof/meta.json +6 -0
  344. package/gs/runtime/trace/index.test.ts +45 -0
  345. package/gs/runtime/trace/index.ts +97 -0
  346. package/gs/runtime/trace/meta.json +7 -0
  347. package/gs/slices/meta.json +2 -1
  348. package/gs/slices/slices.test.ts +86 -0
  349. package/gs/slices/slices.ts +284 -37
  350. package/gs/sort/slice.gs.ts +73 -23
  351. package/gs/sort/slice.test.ts +40 -0
  352. package/gs/strings/builder.test.ts +8 -0
  353. package/gs/strings/builder.ts +29 -17
  354. package/gs/strings/iter.test.ts +5 -7
  355. package/gs/strings/iter.ts +146 -71
  356. package/gs/strings/replace.test.ts +1 -4
  357. package/gs/strings/replace.ts +6 -6
  358. package/gs/strings/strings.test.ts +4 -0
  359. package/gs/strings/strings.ts +54 -6
  360. package/gs/sync/meta.json +1 -0
  361. package/gs/sync/sync.test.ts +57 -1
  362. package/gs/sync/sync.ts +45 -13
  363. package/gs/syscall/errors.ts +158 -115
  364. package/gs/syscall/fs.ts +8 -8
  365. package/gs/syscall/js/index.ts +49 -22
  366. package/gs/syscall/net.test.ts +26 -0
  367. package/gs/syscall/types.ts +7 -2
  368. package/gs/testing/testing.test.ts +56 -0
  369. package/gs/testing/testing.ts +27 -10
  370. package/gs/time/meta.json +2 -2
  371. package/gs/time/time.test.ts +4 -0
  372. package/gs/time/time.ts +33 -2
  373. package/gs/unicode/unicode.test.ts +14 -3
  374. package/gs/unicode/unicode.ts +1 -5
  375. package/gs/unique/index.ts +9 -2
  376. package/package.json +3 -3
package/gs/syscall/fs.ts CHANGED
@@ -242,16 +242,16 @@ export function SetsockoptInt(
242
242
  return null
243
243
  }
244
244
 
245
- export function readv(_fd: number, _iovecs: $.Slice<Iovec> | null): [
246
- number,
247
- $.GoError,
248
- ] {
245
+ export function readv(
246
+ _fd: number,
247
+ _iovecs: $.Slice<Iovec> | null,
248
+ ): [number, $.GoError] {
249
249
  return [0, ENOSYS]
250
250
  }
251
251
 
252
- export function writev(_fd: number, _iovecs: $.Slice<Iovec> | null): [
253
- number,
254
- $.GoError,
255
- ] {
252
+ export function writev(
253
+ _fd: number,
254
+ _iovecs: $.Slice<Iovec> | null,
255
+ ): [number, $.GoError] {
256
256
  return [0, ENOSYS]
257
257
  }
@@ -105,14 +105,21 @@ export class Value {
105
105
  `syscall/js: Value.Call: property ${m} is not a function, got ${Type_String(ValueOf(fn).Type())}`,
106
106
  )
107
107
  }
108
- return new Value({ raw: fn.apply(this._raw, args.map((arg) => ValueOf(arg)._raw)) })
108
+ return new Value({
109
+ raw: fn.apply(
110
+ this._raw,
111
+ args.map((arg) => ValueOf(arg)._raw),
112
+ ),
113
+ })
109
114
  }
110
115
 
111
116
  public Invoke(...args: unknown[]): Value {
112
117
  if (typeof this._raw !== 'function') {
113
118
  $.panic(new ValueError({ Method: 'Value.Invoke', Type: this.Type() }))
114
119
  }
115
- return new Value({ raw: this._raw(...args.map((arg) => ValueOf(arg)._raw)) })
120
+ return new Value({
121
+ raw: this._raw(...args.map((arg) => ValueOf(arg)._raw)),
122
+ })
116
123
  }
117
124
 
118
125
  public New(...args: unknown[]): Value {
@@ -120,7 +127,10 @@ export class Value {
120
127
  $.panic(new ValueError({ Method: 'Value.Invoke', Type: this.Type() }))
121
128
  }
122
129
  return new Value({
123
- raw: Reflect.construct(this._raw, args.map((arg) => ValueOf(arg)._raw)),
130
+ raw: Reflect.construct(
131
+ this._raw,
132
+ args.map((arg) => ValueOf(arg)._raw),
133
+ ),
124
134
  })
125
135
  }
126
136
 
@@ -224,21 +234,27 @@ export class Func {
224
234
  public Value: Value
225
235
  private _released = false
226
236
 
227
- constructor(init?: Partial<Func> & { fn?: (this$: Value, args: $.Slice<Value>) => unknown }) {
237
+ constructor(
238
+ init?: Partial<Func> & {
239
+ fn?: (this$: Value, args: $.Slice<Value>) => unknown
240
+ },
241
+ ) {
228
242
  const fn = init?.fn
229
- this.Value = init?.Value?.clone() ?? new Value({
230
- raw: function (this: unknown, ...args: unknown[]) {
231
- if (fn === undefined) {
232
- return undefined
233
- }
234
- return ValueOf(
235
- fn(
236
- new Value({ raw: this }),
237
- args.map((arg) => new Value({ raw: arg })) as $.Slice<Value>,
238
- ),
239
- )._raw
240
- },
241
- })
243
+ this.Value =
244
+ init?.Value?.clone() ??
245
+ new Value({
246
+ raw: function (this: unknown, ...args: unknown[]) {
247
+ if (fn === undefined) {
248
+ return undefined
249
+ }
250
+ return ValueOf(
251
+ fn(
252
+ new Value({ raw: this }),
253
+ args.map((arg) => new Value({ raw: arg })) as $.Slice<Value>,
254
+ ),
255
+ )._raw
256
+ },
257
+ })
242
258
  }
243
259
 
244
260
  public clone(): Func {
@@ -352,7 +368,11 @@ export function ValueOf(x: unknown): Value {
352
368
  if (x === null || x === undefined) {
353
369
  return Null()
354
370
  }
355
- if (typeof x === 'boolean' || typeof x === 'number' || typeof x === 'string') {
371
+ if (
372
+ typeof x === 'boolean' ||
373
+ typeof x === 'number' ||
374
+ typeof x === 'string'
375
+ ) {
356
376
  return new Value({ raw: x })
357
377
  }
358
378
  if (typeof x === 'bigint') {
@@ -423,7 +443,8 @@ export function CopyBytesToGo(dst: $.Bytes | null, src: Value): number {
423
443
 
424
444
  export function CopyBytesToJS(dst: Value, src: $.Bytes | null): number {
425
445
  const target = dstRawBytes(dst)
426
- const bytes = src instanceof Uint8Array ? src : Uint8Array.from($.asArray(src))
446
+ const bytes =
447
+ src instanceof Uint8Array ? src : Uint8Array.from($.asArray(src))
427
448
  const n = Math.min(target.length, bytes.length)
428
449
  target.set(bytes.subarray(0, n), 0)
429
450
  return n
@@ -432,9 +453,13 @@ export function CopyBytesToJS(dst: Value, src: $.Bytes | null): number {
432
453
  function sourceBytes(src: Value): Uint8Array {
433
454
  const raw = srcRaw(src)
434
455
  if (raw instanceof Uint8Array || raw instanceof Uint8ClampedArray) {
435
- return raw instanceof Uint8Array ? raw : new Uint8Array(raw.buffer, raw.byteOffset, raw.byteLength)
456
+ return raw instanceof Uint8Array ? raw : (
457
+ new Uint8Array(raw.buffer, raw.byteOffset, raw.byteLength)
458
+ )
436
459
  }
437
- $.panic('syscall/js: CopyBytesToGo: expected src to be a Uint8Array or Uint8ClampedArray')
460
+ $.panic(
461
+ 'syscall/js: CopyBytesToGo: expected src to be a Uint8Array or Uint8ClampedArray',
462
+ )
438
463
  }
439
464
 
440
465
  function dstRawBytes(dst: Value): Uint8Array | Uint8ClampedArray {
@@ -442,7 +467,9 @@ function dstRawBytes(dst: Value): Uint8Array | Uint8ClampedArray {
442
467
  if (raw instanceof Uint8Array || raw instanceof Uint8ClampedArray) {
443
468
  return raw
444
469
  }
445
- $.panic('syscall/js: CopyBytesToJS: expected dst to be a Uint8Array or Uint8ClampedArray')
470
+ $.panic(
471
+ 'syscall/js: CopyBytesToJS: expected dst to be a Uint8Array or Uint8ClampedArray',
472
+ )
446
473
  }
447
474
 
448
475
  function srcRaw(value: Value): unknown {
@@ -1,13 +1,25 @@
1
1
  import { describe, expect, test } from 'vitest'
2
2
 
3
+ import * as $ from '@goscript/builtin/index.js'
4
+
3
5
  import {
4
6
  Bind,
5
7
  Close,
6
8
  CloseOnExec,
7
9
  Connect,
8
10
  Dup,
11
+ EADDRNOTAVAIL,
12
+ EAGAIN,
13
+ EINTR,
14
+ EMFILE,
9
15
  ENOSYS,
16
+ ENFILE,
10
17
  ENOTSUP,
18
+ ETIMEDOUT,
19
+ Errno_Error,
20
+ Errno_Is,
21
+ Errno_Temporary,
22
+ Errno_Timeout,
11
23
  GetsockoptInt,
12
24
  Iovec,
13
25
  IPPROTO_IPV6,
@@ -36,6 +48,7 @@ import {
36
48
  readv,
37
49
  writev,
38
50
  } from './index.js'
51
+ import type { Errno } from './index.js'
39
52
 
40
53
  describe('syscall network stubs', () => {
41
54
  test('exports network constants used by generated net', () => {
@@ -47,6 +60,19 @@ describe('syscall network stubs', () => {
47
60
  expect(ENOTSUP.Error()).toBe('operation not supported')
48
61
  })
49
62
 
63
+ test('models Errno numeric zero values and named primitive methods', () => {
64
+ const errno: $.VarRef<Errno> = $.varRef(0)
65
+
66
+ expect(Errno_Error(errno.value)).toBe('errno 0')
67
+ expect(Errno_Is(EADDRNOTAVAIL, EADDRNOTAVAIL)).toBe(true)
68
+ expect(Errno_Temporary(EINTR)).toBe(true)
69
+ expect(Errno_Temporary(EMFILE)).toBe(true)
70
+ expect(Errno_Temporary(ENFILE)).toBe(true)
71
+ expect(Errno_Timeout(EAGAIN)).toBe(true)
72
+ expect(Errno_Timeout(ETIMEDOUT)).toBe(true)
73
+ expect(Errno_Timeout(EADDRNOTAVAIL)).toBe(false)
74
+ })
75
+
50
76
  test('reports unsupported socket operations as syscall errors', () => {
51
77
  expect(Socket(0, 0, 0)).toEqual([-1, ENOSYS])
52
78
  expect(Connect(-1, null)).toBe(ENOSYS)
@@ -3,10 +3,15 @@ import * as $ from '@goscript/builtin/index.js'
3
3
  // Essential type aliases
4
4
  export type uintptr = number
5
5
 
6
- // Errno type for syscall errors
7
- export interface Errno {
6
+ // Errno is a named numeric Go type. Constants use object values so they can
7
+ // satisfy error interfaces, while generated zero values may still be numbers.
8
+ export type Errno = number | ErrnoObject
9
+
10
+ export interface ErrnoObject {
8
11
  Error(): string
9
12
  Is(target: $.GoError): boolean
13
+ Temporary?(): boolean
14
+ Timeout?(): boolean
10
15
  Errno(): number
11
16
  }
12
17
 
@@ -87,4 +87,60 @@ describe('testing.T', () => {
87
87
  expect(observed).toBe(true)
88
88
  expect(Short()).toBe(false)
89
89
  })
90
+
91
+ it('accepts parallel tests in the sequential runner', () => {
92
+ const t = new T('root')
93
+
94
+ t.Parallel()
95
+
96
+ expect(t.Failed()).toBe(false)
97
+ })
98
+
99
+ it('accepts nil cleanup values and fails when cleanup runs', async () => {
100
+ const t = new T('root')
101
+
102
+ t.Cleanup(null)
103
+
104
+ await expect(t.runCleanups()).rejects.toThrow('testing: nil cleanup function')
105
+ })
106
+
107
+ it('returns a non-nil context', () => {
108
+ const t = new T('root')
109
+
110
+ expect(t.Context()).not.toBeNull()
111
+ })
112
+
113
+ it('formats common testing printf verbs', () => {
114
+ const t = new T('root')
115
+ const messages: string[] = []
116
+ const originalLog = console.log
117
+ console.log = (message?: unknown) => {
118
+ messages.push(String(message))
119
+ }
120
+ try {
121
+ t.Logf('quoted=%q value=%#v plus=%+v number=%d string=%s plain=%v', 'key', 7, { ok: true }, 3, 'ok', true)
122
+ t.flushLogs()
123
+ } finally {
124
+ console.log = originalLog
125
+ }
126
+
127
+ expect(messages).toEqual([' quoted="key" value=7 plus=[object Object] number=3 string=ok plain=true'])
128
+ })
129
+
130
+ it('formats Go-style error objects with Error methods', () => {
131
+ const t = new T('root')
132
+ const messages: string[] = []
133
+ const originalLog = console.log
134
+ console.log = (message?: unknown) => {
135
+ messages.push(String(message))
136
+ }
137
+ try {
138
+ t.Logf('err=%v', { Error: () => 'host path missing' })
139
+ t.flushLogs()
140
+ } finally {
141
+ console.log = originalLog
142
+ }
143
+
144
+ expect(messages).toEqual([' err=host path missing'])
145
+ })
90
146
  })
@@ -2,6 +2,8 @@ import { mkdirSync } from 'node:fs'
2
2
  import { tmpdir } from 'node:os'
3
3
  import { join } from 'node:path'
4
4
 
5
+ import * as context from '@goscript/context/index.js'
6
+
5
7
  export type TestFunc = (t: T) => void | Promise<void>
6
8
  export type TB = T | B | F
7
9
 
@@ -111,8 +113,13 @@ export class T {
111
113
 
112
114
  public Helper(): void {}
113
115
 
114
- public Cleanup(fn: () => void | Promise<void>): void {
115
- this.cleanups.push(fn)
116
+ public Cleanup(fn: (() => void | Promise<void>) | null): void {
117
+ this.cleanups.push(() => {
118
+ if (fn == null) {
119
+ throw new Error('testing: nil cleanup function')
120
+ }
121
+ return fn()
122
+ })
116
123
  }
117
124
 
118
125
  public async Run(name: string, fn: TestFunc): Promise<boolean> {
@@ -158,11 +165,7 @@ export class T {
158
165
  return path
159
166
  }
160
167
 
161
- public Parallel(): never {
162
- throw new TestControl(
163
- 'fatal',
164
- 'testing.T.Parallel is not supported by GoScript test',
165
- )
168
+ public Parallel(): void {
166
169
  }
167
170
 
168
171
  public Setenv(key: string, value: string): void {
@@ -204,8 +207,8 @@ export class T {
204
207
 
205
208
  public Attr(_key: string, _value: string): void {}
206
209
 
207
- public Context(): null {
208
- return null
210
+ public Context(): context.Context {
211
+ return context.Background()
209
212
  }
210
213
 
211
214
  public Output(): null {
@@ -368,13 +371,27 @@ export async function runTests(
368
371
 
369
372
  function formatMessage(format: string, args: unknown[]): string {
370
373
  let index = 0
371
- return format.replace(/%[vds]/g, () => formatValue(args[index++]))
374
+ return format.replace(/%#v|%\+v|%q|%[vds]/g, (verb) => {
375
+ const value = args[index++]
376
+ if (verb === '%q') {
377
+ return JSON.stringify(String(value))
378
+ }
379
+ return formatValue(value)
380
+ })
372
381
  }
373
382
 
374
383
  function formatValue(value: unknown): string {
375
384
  if (value instanceof Error) {
376
385
  return value.message
377
386
  }
387
+ if (
388
+ value !== null &&
389
+ typeof value === 'object' &&
390
+ 'Error' in value &&
391
+ typeof value.Error === 'function'
392
+ ) {
393
+ return String(value.Error())
394
+ }
378
395
  if (value === null) {
379
396
  return '<nil>'
380
397
  }
package/gs/time/meta.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "dependencies": [],
3
- "asyncMethods": {
3
+ "asyncFunctions": {
4
4
  "Sleep": true
5
5
  }
6
- }
6
+ }
@@ -35,6 +35,10 @@ describe('time.Duration_String', () => {
35
35
  expect(Duration_String(1500 * Millisecond)).toBe('1.5s')
36
36
  expect(Duration_String(-1500 * Millisecond)).toBe('-1.5s')
37
37
  expect(Duration_String(2 * Second)).toBe('2s')
38
+ expect(Duration_String(9 * Millisecond)).toBe('9ms')
39
+ expect(Duration_String(1500 * Microsecond)).toBe('1.5ms')
40
+ expect(Duration_String(1500)).toBe('1.5\u00b5s')
41
+ expect(Duration_String(12)).toBe('12ns')
38
42
  })
39
43
  })
40
44
 
package/gs/time/time.ts CHANGED
@@ -703,7 +703,10 @@ export function Duration_Nanoseconds(receiver: Duration): number {
703
703
  return durationNumber(receiver)
704
704
  }
705
705
 
706
- export function Duration_Round(receiver: Duration, multiple: Duration): Duration {
706
+ export function Duration_Round(
707
+ receiver: Duration,
708
+ multiple: Duration,
709
+ ): Duration {
707
710
  const value = durationNumber(receiver)
708
711
  const unit = durationNumber(multiple)
709
712
  if (unit <= 0) {
@@ -740,6 +743,9 @@ export function Duration_String(receiver: Duration): string {
740
743
  }
741
744
  const sign = value < 0 ? '-' : ''
742
745
  let remaining = Math.abs(value)
746
+ if (remaining < Second) {
747
+ return sign + formatSubsecond(remaining)
748
+ }
743
749
  const hours = Math.floor(remaining / Hour)
744
750
  remaining -= hours * Hour
745
751
  const minutes = Math.floor(remaining / Minute)
@@ -767,7 +773,11 @@ export function Duration_format(
767
773
  const text = Duration_String(receiver)
768
774
  const bytes = Array.from(new TextEncoder().encode(text))
769
775
  const start = Math.max(0, buf.value.length - bytes.length)
770
- for (let idx = 0; idx < bytes.length && start + idx < buf.value.length; idx++) {
776
+ for (
777
+ let idx = 0;
778
+ idx < bytes.length && start + idx < buf.value.length;
779
+ idx++
780
+ ) {
771
781
  buf.value[start + idx] = bytes[idx]!
772
782
  }
773
783
  return start
@@ -781,6 +791,27 @@ function formatSeconds(seconds: number, nanos: number): string {
781
791
  return `${seconds}.${fraction}s`
782
792
  }
783
793
 
794
+ function formatSubsecond(nanos: number): string {
795
+ if (nanos >= Millisecond) {
796
+ return formatUnit(nanos, Millisecond, 'ms')
797
+ }
798
+ if (nanos >= Microsecond) {
799
+ return formatUnit(nanos, Microsecond, '\u00b5s')
800
+ }
801
+ return `${nanos}ns`
802
+ }
803
+
804
+ function formatUnit(nanos: number, unit: number, suffix: string): string {
805
+ const whole = Math.floor(nanos / unit)
806
+ const rem = nanos % unit
807
+ if (rem === 0) {
808
+ return `${whole}${suffix}`
809
+ }
810
+ const scale = Math.log10(unit)
811
+ const fraction = String(rem).padStart(scale, '0').replace(/0+$/, '')
812
+ return `${whole}.${fraction}${suffix}`
813
+ }
814
+
784
815
  // Location represents a time zone
785
816
  export class Location {
786
817
  private _name: string
@@ -2,13 +2,24 @@ import { describe, expect, it } from 'vitest'
2
2
 
3
3
  import * as $ from '@goscript/builtin/index.js'
4
4
 
5
- import { CategoryAliases, Cn, Is, Range16, Range32, RangeTable } from './unicode.js'
5
+ import {
6
+ CategoryAliases,
7
+ Cn,
8
+ Is,
9
+ Range16,
10
+ Range32,
11
+ RangeTable,
12
+ } from './unicode.js'
6
13
 
7
14
  describe('unicode overrides', () => {
8
15
  it('accepts generated struct-literal constructor shapes', () => {
9
16
  const table = new RangeTable({
10
- R16: $.arrayToSlice<Range16>([new Range16({ Lo: 0x41, Hi: 0x5a, Stride: 1 })]),
11
- R32: $.arrayToSlice<Range32>([new Range32({ Lo: 0x10000, Hi: 0x10002, Stride: 1 })]),
17
+ R16: $.arrayToSlice<Range16>([
18
+ new Range16({ Lo: 0x41, Hi: 0x5a, Stride: 1 }),
19
+ ]),
20
+ R32: $.arrayToSlice<Range32>([
21
+ new Range32({ Lo: 0x10000, Hi: 0x10002, Stride: 1 }),
22
+ ]),
12
23
  LatinOffset: 1,
13
24
  })
14
25
 
@@ -92,11 +92,7 @@ export class RangeTable {
92
92
  public LatinOffset: number
93
93
 
94
94
  constructor(init?: RangeTableInit)
95
- constructor(
96
- r16?: Slice<Range16>,
97
- r32?: Slice<Range32>,
98
- latinOffset?: number,
99
- )
95
+ constructor(r16?: Slice<Range16>, r32?: Slice<Range32>, latinOffset?: number)
100
96
  constructor(
101
97
  r16OrInit: Slice<Range16> | RangeTableInit = [],
102
98
  r32: Slice<Range32> = [],
@@ -73,11 +73,18 @@ function normalize(
73
73
  if (value instanceof Map) {
74
74
  return {
75
75
  $map: [...value.entries()]
76
- .map(([key, entry]) => [normalize(key, seen, nextID), normalize(entry, seen, nextID)])
76
+ .map(([key, entry]) => [
77
+ normalize(key, seen, nextID),
78
+ normalize(entry, seen, nextID),
79
+ ])
77
80
  .sort(([a], [b]) => JSON.stringify(a).localeCompare(JSON.stringify(b))),
78
81
  }
79
82
  }
80
- if ('_fields' in value && value._fields && typeof value._fields === 'object') {
83
+ if (
84
+ '_fields' in value &&
85
+ value._fields &&
86
+ typeof value._fields === 'object'
87
+ ) {
81
88
  return {
82
89
  $type: value.constructor.name,
83
90
  $fields: normalize(value._fields, seen, nextID),
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "goscript",
3
3
  "description": "Go to TypeScript transpiler",
4
- "version": "0.1.1",
4
+ "version": "0.1.3",
5
5
  "author": {
6
6
  "name": "Aperture Robotics LLC.",
7
7
  "email": "support@aperture.us",
@@ -104,9 +104,9 @@
104
104
  "eslint": "^10.2.0",
105
105
  "eslint-config-prettier": "^10.0.2",
106
106
  "husky": "^9.1.7",
107
- "lint-staged": "^16.4.0",
107
+ "lint-staged": "^17.0.0",
108
108
  "prettier": "^3.8.1",
109
- "starpc": "0.49.9",
109
+ "starpc": "0.49.15",
110
110
  "typescript": "^6.0.0",
111
111
  "typescript-eslint": "^8.58.0",
112
112
  "vitest": "^4.1.2"