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
@@ -0,0 +1,72 @@
1
+ //go:build unix
2
+
3
+ package tsworkspace
4
+
5
+ import (
6
+ "context"
7
+ "errors"
8
+ "os"
9
+ "path/filepath"
10
+ "strconv"
11
+ "strings"
12
+ "syscall"
13
+ "testing"
14
+ "time"
15
+ )
16
+
17
+ func TestOwnerRunToolCancelsProcessGroup(t *testing.T) {
18
+ dir := t.TempDir()
19
+ pidFile := filepath.Join(dir, "child.pid")
20
+ tool := filepath.Join(dir, "spawn-child.sh")
21
+ script := "#!/bin/sh\n" +
22
+ "sleep 30 &\n" +
23
+ "echo $! > " + strconv.Quote(pidFile) + "\n" +
24
+ "wait\n"
25
+ if err := os.WriteFile(tool, []byte(script), 0o755); err != nil {
26
+ t.Fatal(err.Error())
27
+ }
28
+
29
+ ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
30
+ defer cancel()
31
+ result := NewOwner(dir, dir).RunTool(ctx, PhaseRuntime, dir, tool)
32
+ if !result.Failed() {
33
+ t.Fatalf("expected canceled tool to fail")
34
+ }
35
+
36
+ pid := readChildPID(t, pidFile)
37
+ deadline := time.Now().Add(2 * time.Second)
38
+ for processExists(pid) && time.Now().Before(deadline) {
39
+ time.Sleep(25 * time.Millisecond)
40
+ }
41
+ if processExists(pid) {
42
+ _ = syscall.Kill(pid, syscall.SIGKILL)
43
+ t.Fatalf("child process %d survived canceled tool", pid)
44
+ }
45
+ }
46
+
47
+ func readChildPID(t *testing.T, path string) int {
48
+ t.Helper()
49
+ deadline := time.Now().Add(2 * time.Second)
50
+ var data []byte
51
+ var err error
52
+ for time.Now().Before(deadline) {
53
+ data, err = os.ReadFile(path)
54
+ if err == nil {
55
+ break
56
+ }
57
+ time.Sleep(25 * time.Millisecond)
58
+ }
59
+ if err != nil {
60
+ t.Fatalf("read child pid: %v", err)
61
+ }
62
+ pid, err := strconv.Atoi(strings.TrimSpace(string(data)))
63
+ if err != nil {
64
+ t.Fatalf("parse child pid %q: %v", data, err)
65
+ }
66
+ return pid
67
+ }
68
+
69
+ func processExists(pid int) bool {
70
+ err := syscall.Kill(pid, 0)
71
+ return err == nil || errors.Is(err, syscall.EPERM)
72
+ }
@@ -106,6 +106,12 @@ func (o *Owner) RunTool(ctx context.Context, phase Phase, dir string, name strin
106
106
  }
107
107
  start := time.Now()
108
108
  cmd := exec.CommandContext(ctx, tool, args...)
109
+ configureToolCommand(cmd)
110
+ cmd.Cancel = func() error {
111
+ killToolCommand(cmd)
112
+ return nil
113
+ }
114
+ cmd.WaitDelay = 5 * time.Second
109
115
  cmd.Dir = dir
110
116
  var output bytes.Buffer
111
117
  cmd.Stdout = &output
@@ -232,6 +238,8 @@ func sourceDirectory() string {
232
238
 
233
239
  const nodeAmbientTypes = `declare const process: {
234
240
  env?: Record<string, string | undefined>
241
+ chdir?: (directory: string) => void
242
+ cwd?: () => string
235
243
  exit?: (code?: number) => never
236
244
  }
237
245
 
@@ -0,0 +1,14 @@
1
+ //go:build !unix
2
+
3
+ package tsworkspace
4
+
5
+ import "os/exec"
6
+
7
+ func configureToolCommand(cmd *exec.Cmd) {}
8
+
9
+ func killToolCommand(cmd *exec.Cmd) {
10
+ if cmd == nil || cmd.Process == nil {
11
+ return
12
+ }
13
+ _ = cmd.Process.Kill()
14
+ }
@@ -0,0 +1,19 @@
1
+ //go:build unix
2
+
3
+ package tsworkspace
4
+
5
+ import (
6
+ "os/exec"
7
+ "syscall"
8
+ )
9
+
10
+ func configureToolCommand(cmd *exec.Cmd) {
11
+ cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
12
+ }
13
+
14
+ func killToolCommand(cmd *exec.Cmd) {
15
+ if cmd == nil || cmd.Process == nil {
16
+ return
17
+ }
18
+ _ = syscall.Kill(-cmd.Process.Pid, syscall.SIGKILL)
19
+ }
@@ -126,12 +126,26 @@ func (o *TypeScriptEmitOwner) renderLoweredFile(pkg *loweredPackage, file *lower
126
126
  if idx != 0 {
127
127
  b.WriteString("\n")
128
128
  }
129
- b.WriteString("import * as ")
129
+ b.WriteString("import ")
130
+ if imp.typeOnly {
131
+ b.WriteString("type ")
132
+ }
133
+ b.WriteString("* as ")
130
134
  b.WriteString(imp.alias)
131
135
  b.WriteString(" from \"")
132
136
  b.WriteString(imp.source)
133
137
  b.WriteString("\"\n")
134
138
  }
139
+ sideEffectImports := make(map[string]bool)
140
+ for _, imp := range file.imports {
141
+ if imp.typeOnly || !imp.sideEffect || sideEffectImports[imp.source] {
142
+ continue
143
+ }
144
+ sideEffectImports[imp.source] = true
145
+ b.WriteString("import \"")
146
+ b.WriteString(imp.source)
147
+ b.WriteString("\"\n")
148
+ }
135
149
  if len(file.imports) != 0 {
136
150
  b.WriteString("\n")
137
151
  }
@@ -251,6 +265,8 @@ func structZeroValueDeps(structType *loweredStruct, names map[string]bool) []str
251
265
  func renderStruct(b *strings.Builder, structType *loweredStruct, runtimeOwner *RuntimeContractOwner) {
252
266
  varRef := runtimeOwner.QualifiedHelper(RuntimeHelperVarRef)
253
267
  markStructValue := runtimeOwner.QualifiedHelper(RuntimeHelperMarkAsStructValue)
268
+ cloneStructValue := runtimeOwner.QualifiedHelper(RuntimeHelperCloneStructValue)
269
+ cloneArrayValue := runtimeOwner.QualifiedHelper(RuntimeHelperCloneArrayValue)
254
270
  registerStructType := runtimeOwner.QualifiedHelper(RuntimeHelperRegisterStructType)
255
271
  if structType.exported {
256
272
  b.WriteString("export ")
@@ -305,9 +321,20 @@ func renderStruct(b *strings.Builder, structType *loweredStruct, runtimeOwner *R
305
321
  b.WriteString(field.name)
306
322
  b.WriteString(" ? ")
307
323
  b.WriteString(markStructValue)
324
+ b.WriteString("(")
325
+ b.WriteString(cloneStructValue)
308
326
  b.WriteString("(init.")
309
327
  b.WriteString(field.name)
310
- b.WriteString(".clone()) : ")
328
+ b.WriteString(")) : ")
329
+ b.WriteString(field.zero)
330
+ } else if field.arrayValue {
331
+ b.WriteString("init?.")
332
+ b.WriteString(field.name)
333
+ b.WriteString(" !== undefined ? ")
334
+ b.WriteString(cloneArrayValue)
335
+ b.WriteString("(init.")
336
+ b.WriteString(field.name)
337
+ b.WriteString(") : ")
311
338
  b.WriteString(field.zero)
312
339
  } else {
313
340
  b.WriteString("init?.")
@@ -337,9 +364,16 @@ func renderStruct(b *strings.Builder, structType *loweredStruct, runtimeOwner *R
337
364
  b.WriteString("(")
338
365
  if field.structValue {
339
366
  b.WriteString(markStructValue)
367
+ b.WriteString("(")
368
+ b.WriteString(cloneStructValue)
340
369
  b.WriteString("(this._fields.")
341
370
  b.WriteString(field.name)
342
- b.WriteString(".value.clone())")
371
+ b.WriteString(".value))")
372
+ } else if field.arrayValue {
373
+ b.WriteString(cloneArrayValue)
374
+ b.WriteString("(this._fields.")
375
+ b.WriteString(field.name)
376
+ b.WriteString(".value)")
343
377
  } else {
344
378
  b.WriteString("this._fields.")
345
379
  b.WriteString(field.name)
@@ -421,6 +455,7 @@ func renderFunction(b *strings.Builder, fn *loweredFunction) {
421
455
  }
422
456
  b.WriteString("function ")
423
457
  b.WriteString(fn.name)
458
+ renderFunctionTypeParams(b, fn)
424
459
  b.WriteString("(")
425
460
  for idx, param := range fn.params {
426
461
  if idx != 0 {
@@ -453,6 +488,7 @@ func renderFunction(b *strings.Builder, fn *loweredFunction) {
453
488
  renderNamedResults(b, fn.namedResults, 1)
454
489
  renderDeferStack(b, fn.deferState, 1)
455
490
  renderStmts(b, fn.body, 1)
491
+ renderUnreachableReturn(b, fn, 1)
456
492
  b.WriteString("}\n")
457
493
  }
458
494
 
@@ -463,6 +499,7 @@ func renderMethod(b *strings.Builder, fn *loweredFunction) {
463
499
  b.WriteString("async ")
464
500
  }
465
501
  b.WriteString(fn.name)
502
+ renderFunctionTypeParams(b, fn)
466
503
  b.WriteString("(")
467
504
  for idx, param := range fn.params {
468
505
  if idx != 0 {
@@ -495,10 +532,45 @@ func renderMethod(b *strings.Builder, fn *loweredFunction) {
495
532
  renderNamedResults(b, fn.namedResults, 2)
496
533
  renderDeferStack(b, fn.deferState, 2)
497
534
  renderStmts(b, fn.body, 2)
535
+ renderUnreachableReturn(b, fn, 2)
498
536
  writeIndent(b, 1)
499
537
  b.WriteString("}\n")
500
538
  }
501
539
 
540
+ func renderUnreachableReturn(b *strings.Builder, fn *loweredFunction, indent int) {
541
+ if fn.result == "void" || fn.result == "globalThis.Promise<void>" {
542
+ return
543
+ }
544
+ if loweredStmtsEndWithTerminal(fn.body) {
545
+ return
546
+ }
547
+ writeIndent(b, indent)
548
+ b.WriteString("throw new globalThis.Error(\"goscript: unreachable return\")\n")
549
+ }
550
+
551
+ func loweredStmtsEndWithTerminal(stmts []loweredStmt) bool {
552
+ if len(stmts) == 0 {
553
+ return false
554
+ }
555
+ last := stmts[len(stmts)-1]
556
+ text := strings.TrimSpace(last.text)
557
+ return strings.HasPrefix(text, "return") || strings.HasPrefix(text, "throw ")
558
+ }
559
+
560
+ func renderFunctionTypeParams(b *strings.Builder, fn *loweredFunction) {
561
+ if len(fn.typeParams) == 0 {
562
+ return
563
+ }
564
+ b.WriteString("<")
565
+ for idx, typeParam := range fn.typeParams {
566
+ if idx != 0 {
567
+ b.WriteString(", ")
568
+ }
569
+ b.WriteString(typeParam)
570
+ }
571
+ b.WriteString(">")
572
+ }
573
+
502
574
  func receiverValue(fn *loweredFunction) string {
503
575
  if fn.receiverValue != "" {
504
576
  return fn.receiverValue
@@ -774,7 +846,7 @@ func renderSelect(b *strings.Builder, stmt *loweredSelect, indent int) {
774
846
  }
775
847
  b.WriteString(">([\n")
776
848
  for idx, switchCase := range stmt.cases {
777
- renderSelectCase(b, switchCase, stmt.external, indent+1)
849
+ renderSelectCase(b, switchCase, stmt.external, stmt.result, indent+1)
778
850
  if idx != len(stmt.cases)-1 {
779
851
  b.WriteString(",")
780
852
  }
@@ -821,7 +893,9 @@ func renderSelectExternalBodies(b *strings.Builder, stmt *loweredSelect, indent
821
893
  writeIndent(b, indent+2)
822
894
  b.WriteString("{\n")
823
895
  writeIndent(b, indent+3)
824
- b.WriteString("const result = ")
896
+ b.WriteString("const ")
897
+ b.WriteString(stmt.result)
898
+ b.WriteString(" = ")
825
899
  b.WriteString(stmt.value)
826
900
  b.WriteString("\n")
827
901
  renderStmts(b, switchCase.prelude, indent+3)
@@ -839,7 +913,7 @@ func renderSelectExternalBodies(b *strings.Builder, stmt *loweredSelect, indent
839
913
  }
840
914
  }
841
915
 
842
- func renderSelectCase(b *strings.Builder, switchCase loweredSelectCase, external bool, indent int) {
916
+ func renderSelectCase(b *strings.Builder, switchCase loweredSelectCase, external bool, resultName string, indent int) {
843
917
  writeIndent(b, indent)
844
918
  b.WriteString("{\n")
845
919
  writeIndent(b, indent+1)
@@ -865,10 +939,14 @@ func renderSelectCase(b *strings.Builder, switchCase loweredSelectCase, external
865
939
  b.WriteString(",\n")
866
940
  }
867
941
  writeIndent(b, indent+1)
868
- b.WriteString("onSelected: async (result) => {\n")
942
+ b.WriteString("onSelected: async (")
943
+ b.WriteString(resultName)
944
+ b.WriteString(") => {\n")
869
945
  if external {
870
946
  writeIndent(b, indent+2)
871
- b.WriteString("return result\n")
947
+ b.WriteString("return ")
948
+ b.WriteString(resultName)
949
+ b.WriteString("\n")
872
950
  writeIndent(b, indent+1)
873
951
  b.WriteString("}\n")
874
952
  writeIndent(b, indent)
@@ -876,13 +954,67 @@ func renderSelectCase(b *strings.Builder, switchCase loweredSelectCase, external
876
954
  return
877
955
  }
878
956
  renderStmts(b, switchCase.prelude, indent+2)
879
- renderStmts(b, switchCase.body, indent+2)
957
+ renderSelectCaseStmts(b, switchCase.body, indent+2)
880
958
  writeIndent(b, indent+1)
881
959
  b.WriteString("}\n")
882
960
  writeIndent(b, indent)
883
961
  b.WriteString("}")
884
962
  }
885
963
 
964
+ func renderSelectCaseStmts(b *strings.Builder, stmts []loweredStmt, indent int) {
965
+ for idx, stmt := range stmts {
966
+ renderLeadingLines(b, stmt.leading, indent)
967
+ if stmt.rangeFunc != nil {
968
+ renderRangeFunc(b, stmt.rangeFunc, indent)
969
+ continue
970
+ }
971
+ if stmt.switchStmt != nil {
972
+ renderSwitch(b, stmt.switchStmt, indent)
973
+ continue
974
+ }
975
+ if stmt.selectStmt != nil {
976
+ renderSelect(b, stmt.selectStmt, indent)
977
+ continue
978
+ }
979
+ if stmt.typeSwitch != nil {
980
+ renderTypeSwitch(b, stmt.typeSwitch, indent)
981
+ continue
982
+ }
983
+ writeIndent(b, indent)
984
+ if stmt.text == "" && (stmt.hasBlock || len(stmt.children) != 0) {
985
+ b.WriteString("{\n")
986
+ renderSelectCaseStmts(b, stmt.children, indent+1)
987
+ writeIndent(b, indent)
988
+ b.WriteString("}\n")
989
+ continue
990
+ }
991
+ if strings.TrimSpace(stmt.text) == "return" {
992
+ b.WriteString("return $.selectVoidReturn()\n")
993
+ continue
994
+ }
995
+ writeIndentedText(b, stmt.text, indent)
996
+ if !stmt.hasBlock && len(stmt.children) == 0 {
997
+ if idx+1 < len(stmts) && needsASIBarrier(stmt, stmts[idx+1]) {
998
+ b.WriteString(";")
999
+ }
1000
+ b.WriteString("\n")
1001
+ continue
1002
+ }
1003
+ b.WriteString(" {\n")
1004
+ renderSelectCaseStmts(b, stmt.children, indent+1)
1005
+ writeIndent(b, indent)
1006
+ b.WriteString("}")
1007
+ if len(stmt.elseBody) == 0 {
1008
+ b.WriteString("\n")
1009
+ continue
1010
+ }
1011
+ b.WriteString(" else {\n")
1012
+ renderSelectCaseStmts(b, stmt.elseBody, indent+1)
1013
+ writeIndent(b, indent)
1014
+ b.WriteString("}\n")
1015
+ }
1016
+ }
1017
+
886
1018
  func renderTypeSwitch(b *strings.Builder, stmt *loweredTypeSwitch, indent int) {
887
1019
  writeIndent(b, indent)
888
1020
  b.WriteString("{\n")
@@ -965,7 +1097,11 @@ func renderTypeSwitchInlineBody(
965
1097
  indent int,
966
1098
  ) {
967
1099
  if varName == "" {
968
- renderStmts(b, body, indent)
1100
+ writeIndent(b, indent)
1101
+ b.WriteString("{\n")
1102
+ renderStmts(b, body, indent+1)
1103
+ writeIndent(b, indent)
1104
+ b.WriteString("}\n")
969
1105
  return
970
1106
  }
971
1107
  writeIndent(b, indent)
@@ -1002,6 +1138,9 @@ func renderTypeSwitchInlineBody(
1002
1138
  func renderIndex(pkg *loweredPackage) string {
1003
1139
  var lines []string
1004
1140
  for _, file := range pkg.files {
1141
+ if file.sideEffect {
1142
+ lines = append(lines, "import \"./"+file.outputName+"\"")
1143
+ }
1005
1144
  exports := slices.Clone(file.exports)
1006
1145
  slices.Sort(exports)
1007
1146
  if len(exports) != 0 {
@@ -10,11 +10,16 @@ export declare function print(...args: any[]): void;
10
10
  * @param args Arguments to print
11
11
  */
12
12
  export declare function println(...args: any[]): void;
13
+ export declare class GoPanic extends Error {
14
+ readonly value: unknown;
15
+ constructor(value: unknown);
16
+ }
13
17
  /**
14
18
  * Implementation of Go's built-in panic function
15
19
  * @param args Arguments passed to panic
16
20
  */
17
- export declare function panic(...args: any[]): never;
21
+ export declare function panic(...args: unknown[]): never;
22
+ export declare function panicValue(value: unknown): unknown;
18
23
  /**
19
24
  * Implementation of Go's built-in clear function.
20
25
  * For slices, it sets all elements to their zero value.
@@ -35,7 +40,9 @@ export declare function assignStruct<T>(target: T, source: T): void;
35
40
  * variable's address.
36
41
  */
37
42
  export declare function pointerValue<T>(value: T | VarRef<T> | null | undefined): T;
43
+ export declare function pointerValueOrNil<T>(value: T | VarRef<T> | null | undefined): T | null;
38
44
  export declare function arrayEqual(a: unknown, b: unknown): boolean;
45
+ export declare function comparableEqual(a: unknown, b: unknown): boolean;
39
46
  export interface Complex {
40
47
  real: number;
41
48
  imag: number;
@@ -48,13 +55,25 @@ export declare function int(value: number | bigint, bits?: number): number;
48
55
  export declare function uint(value: number | bigint, bits?: number): number;
49
56
  export declare function uint64Shl(value: number | bigint, shift: number | bigint): number;
50
57
  export declare function uint64Shr(value: number | bigint, shift: number | bigint): number;
58
+ export declare function int64Shl(value: number | bigint, shift: number | bigint): number;
59
+ export declare function int64Shr(value: number | bigint, shift: number | bigint): number;
51
60
  export declare function uintShr(value: number | bigint, shift: number | bigint, bits?: number): number;
52
61
  export declare function uint64Mul(left: number | bigint, right: number | bigint): number;
62
+ export declare function int64Mul(left: number | bigint, right: number | bigint): number;
63
+ export declare function uint64Div(left: number | bigint, right: number | bigint): number;
64
+ export declare function int64Div(left: number | bigint, right: number | bigint): number;
65
+ export declare function uint64Mod(left: number | bigint, right: number | bigint): number;
66
+ export declare function int64Mod(left: number | bigint, right: number | bigint): number;
53
67
  export declare function uint64Add(left: number | bigint, right: number | bigint): number;
68
+ export declare function int64Add(left: number | bigint, right: number | bigint): number;
54
69
  export declare function uint64Sub(left: number | bigint, right: number | bigint): number;
70
+ export declare function int64Sub(left: number | bigint, right: number | bigint): number;
55
71
  export declare function uint64And(left: number | bigint, right: number | bigint): number;
72
+ export declare function int64And(left: number | bigint, right: number | bigint): number;
56
73
  export declare function uint64Or(left: number | bigint, right: number | bigint): number;
74
+ export declare function int64Or(left: number | bigint, right: number | bigint): number;
57
75
  export declare function uint64Xor(left: number | bigint, right: number | bigint): number;
76
+ export declare function int64Xor(left: number | bigint, right: number | bigint): number;
58
77
  /**
59
78
  * Normalizes various byte representations into a `Uint8Array` for protobuf compatibility.
60
79
  *