goscript 0.1.1 → 0.1.2

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 (356) 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 +9 -2
  13. package/compiler/lowering.go +2001 -345
  14. package/compiler/override-facts.go +77 -27
  15. package/compiler/override-registry.go +5 -4
  16. package/compiler/override-registry_test.go +135 -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 +1921 -298
  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 +122 -9
  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 +107 -25
  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 +47 -7
  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/iter.gs.js +13 -13
  58. package/dist/gs/bytes/iter.gs.js.map +1 -1
  59. package/dist/gs/compress/zlib/index.d.ts +26 -0
  60. package/dist/gs/compress/zlib/index.js +168 -0
  61. package/dist/gs/compress/zlib/index.js.map +1 -0
  62. package/dist/gs/context/context.d.ts +1 -1
  63. package/dist/gs/context/context.js +8 -3
  64. package/dist/gs/context/context.js.map +1 -1
  65. package/dist/gs/crypto/ecdh/index.d.ts +52 -0
  66. package/dist/gs/crypto/ecdh/index.js +226 -0
  67. package/dist/gs/crypto/ecdh/index.js.map +1 -0
  68. package/dist/gs/crypto/ed25519/index.d.ts +34 -0
  69. package/dist/gs/crypto/ed25519/index.js +160 -0
  70. package/dist/gs/crypto/ed25519/index.js.map +1 -0
  71. package/dist/gs/crypto/internal/constanttime/index.d.ts +4 -0
  72. package/dist/gs/crypto/internal/constanttime/index.js +18 -0
  73. package/dist/gs/crypto/internal/constanttime/index.js.map +1 -0
  74. package/dist/gs/crypto/rand/index.d.ts +2 -0
  75. package/dist/gs/crypto/rand/index.js +85 -0
  76. package/dist/gs/crypto/rand/index.js.map +1 -1
  77. package/dist/gs/crypto/sha256/index.d.ts +8 -0
  78. package/dist/gs/crypto/sha256/index.js +118 -0
  79. package/dist/gs/crypto/sha256/index.js.map +1 -0
  80. package/dist/gs/crypto/sha512/index.d.ts +14 -0
  81. package/dist/gs/crypto/sha512/index.js +129 -0
  82. package/dist/gs/crypto/sha512/index.js.map +1 -0
  83. package/dist/gs/encoding/json/index.d.ts +3 -0
  84. package/dist/gs/encoding/json/index.js +15 -0
  85. package/dist/gs/encoding/json/index.js.map +1 -1
  86. package/dist/gs/errors/errors.js +29 -6
  87. package/dist/gs/errors/errors.js.map +1 -1
  88. package/dist/gs/fmt/fmt.js.map +1 -1
  89. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.d.ts +7 -7
  90. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js +52 -18
  91. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js.map +1 -1
  92. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js +56 -20
  93. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js.map +1 -1
  94. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.d.ts +57 -3
  95. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js +366 -1
  96. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js.map +1 -1
  97. package/dist/gs/github.com/aperturerobotics/util/conc/index.d.ts +20 -0
  98. package/dist/gs/github.com/aperturerobotics/util/conc/index.js +134 -0
  99. package/dist/gs/github.com/aperturerobotics/util/conc/index.js.map +1 -0
  100. package/dist/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/browser.js.map +1 -1
  101. package/dist/gs/github.com/hack-pad/safejs/internal/catch/index.d.ts +3 -0
  102. package/dist/gs/github.com/hack-pad/safejs/internal/catch/index.js +50 -0
  103. package/dist/gs/github.com/hack-pad/safejs/internal/catch/index.js.map +1 -0
  104. package/dist/gs/github.com/klauspost/compress/internal/le/index.js +3 -2
  105. package/dist/gs/github.com/klauspost/compress/internal/le/index.js.map +1 -1
  106. package/dist/gs/github.com/mr-tron/base58/base58/index.d.ts +27 -0
  107. package/dist/gs/github.com/mr-tron/base58/base58/index.js +172 -0
  108. package/dist/gs/github.com/mr-tron/base58/base58/index.js.map +1 -0
  109. package/dist/gs/github.com/zeebo/blake3/internal/consts/index.d.ts +21 -0
  110. package/dist/gs/github.com/zeebo/blake3/internal/consts/index.js +22 -0
  111. package/dist/gs/github.com/zeebo/blake3/internal/consts/index.js.map +1 -0
  112. package/dist/gs/go/token/index.js +11 -4
  113. package/dist/gs/go/token/index.js.map +1 -1
  114. package/dist/gs/hash/fnv/index.d.ts +57 -0
  115. package/dist/gs/hash/fnv/index.js +299 -0
  116. package/dist/gs/hash/fnv/index.js.map +1 -0
  117. package/dist/gs/hash/index.d.ts +17 -0
  118. package/dist/gs/hash/index.js +94 -0
  119. package/dist/gs/hash/index.js.map +1 -0
  120. package/dist/gs/io/fs/readlink.js +2 -6
  121. package/dist/gs/io/fs/readlink.js.map +1 -1
  122. package/dist/gs/io/fs/walk.js.map +1 -1
  123. package/dist/gs/io/io.js.map +1 -1
  124. package/dist/gs/iter/iter.d.ts +3 -2
  125. package/dist/gs/iter/iter.js.map +1 -1
  126. package/dist/gs/maps/iter.d.ts +5 -5
  127. package/dist/gs/maps/iter.js +48 -21
  128. package/dist/gs/maps/iter.js.map +1 -1
  129. package/dist/gs/maps/maps.d.ts +6 -6
  130. package/dist/gs/math/bits/index.js +14 -24
  131. package/dist/gs/math/bits/index.js.map +1 -1
  132. package/dist/gs/mime/index.js +3 -1
  133. package/dist/gs/mime/index.js.map +1 -1
  134. package/dist/gs/net/http/httptest/index.d.ts +20 -1
  135. package/dist/gs/net/http/httptest/index.js +83 -3
  136. package/dist/gs/net/http/httptest/index.js.map +1 -1
  137. package/dist/gs/net/http/index.d.ts +110 -6
  138. package/dist/gs/net/http/index.js +262 -16
  139. package/dist/gs/net/http/index.js.map +1 -1
  140. package/dist/gs/net/http/pprof/index.d.ts +8 -0
  141. package/dist/gs/net/http/pprof/index.js +59 -0
  142. package/dist/gs/net/http/pprof/index.js.map +1 -0
  143. package/dist/gs/os/error.gs.js +9 -7
  144. package/dist/gs/os/error.gs.js.map +1 -1
  145. package/dist/gs/os/types_js.gs.js +95 -15
  146. package/dist/gs/os/types_js.gs.js.map +1 -1
  147. package/dist/gs/path/filepath/match.js.map +1 -1
  148. package/dist/gs/path/filepath/path.d.ts +5 -3
  149. package/dist/gs/path/filepath/path.js +65 -10
  150. package/dist/gs/path/filepath/path.js.map +1 -1
  151. package/dist/gs/reflect/index.d.ts +3 -2
  152. package/dist/gs/reflect/index.js +2 -1
  153. package/dist/gs/reflect/index.js.map +1 -1
  154. package/dist/gs/reflect/iter.js +2 -2
  155. package/dist/gs/reflect/iter.js.map +1 -1
  156. package/dist/gs/reflect/map.js +26 -0
  157. package/dist/gs/reflect/map.js.map +1 -1
  158. package/dist/gs/reflect/type.d.ts +24 -5
  159. package/dist/gs/reflect/type.js +390 -38
  160. package/dist/gs/reflect/type.js.map +1 -1
  161. package/dist/gs/reflect/types.d.ts +1 -0
  162. package/dist/gs/reflect/types.js +3 -1
  163. package/dist/gs/reflect/types.js.map +1 -1
  164. package/dist/gs/reflect/value.d.ts +4 -1
  165. package/dist/gs/reflect/value.js +39 -1
  166. package/dist/gs/reflect/value.js.map +1 -1
  167. package/dist/gs/reflect/visiblefields.js +1 -1
  168. package/dist/gs/reflect/visiblefields.js.map +1 -1
  169. package/dist/gs/runtime/debug/index.d.ts +39 -0
  170. package/dist/gs/runtime/debug/index.js +58 -0
  171. package/dist/gs/runtime/debug/index.js.map +1 -1
  172. package/dist/gs/runtime/pprof/index.d.ts +20 -0
  173. package/dist/gs/runtime/pprof/index.js +85 -0
  174. package/dist/gs/runtime/pprof/index.js.map +1 -0
  175. package/dist/gs/runtime/trace/index.d.ts +19 -0
  176. package/dist/gs/runtime/trace/index.js +64 -0
  177. package/dist/gs/runtime/trace/index.js.map +1 -0
  178. package/dist/gs/slices/slices.d.ts +24 -9
  179. package/dist/gs/slices/slices.js +229 -24
  180. package/dist/gs/slices/slices.js.map +1 -1
  181. package/dist/gs/sort/slice.gs.d.ts +5 -3
  182. package/dist/gs/sort/slice.gs.js +55 -17
  183. package/dist/gs/sort/slice.gs.js.map +1 -1
  184. package/dist/gs/strings/builder.js +26 -17
  185. package/dist/gs/strings/builder.js.map +1 -1
  186. package/dist/gs/strings/iter.js +140 -75
  187. package/dist/gs/strings/iter.js.map +1 -1
  188. package/dist/gs/strings/replace.js +2 -2
  189. package/dist/gs/strings/replace.js.map +1 -1
  190. package/dist/gs/strings/strings.js +52 -6
  191. package/dist/gs/strings/strings.js.map +1 -1
  192. package/dist/gs/sync/sync.d.ts +6 -3
  193. package/dist/gs/sync/sync.js +39 -11
  194. package/dist/gs/sync/sync.js.map +1 -1
  195. package/dist/gs/syscall/errors.d.ts +116 -112
  196. package/dist/gs/syscall/errors.js +38 -1
  197. package/dist/gs/syscall/errors.js.map +1 -1
  198. package/dist/gs/syscall/fs.d.ts +2 -8
  199. package/dist/gs/syscall/fs.js.map +1 -1
  200. package/dist/gs/syscall/js/index.js +20 -12
  201. package/dist/gs/syscall/js/index.js.map +1 -1
  202. package/dist/gs/syscall/types.d.ts +4 -1
  203. package/dist/gs/syscall/types.js.map +1 -1
  204. package/dist/gs/testing/testing.d.ts +4 -3
  205. package/dist/gs/testing/testing.js +21 -4
  206. package/dist/gs/testing/testing.js.map +1 -1
  207. package/dist/gs/time/time.js +22 -0
  208. package/dist/gs/time/time.js.map +1 -1
  209. package/dist/gs/unicode/unicode.js.map +1 -1
  210. package/dist/gs/unique/index.js +7 -2
  211. package/dist/gs/unique/index.js.map +1 -1
  212. package/go.mod +8 -8
  213. package/go.sum +14 -23
  214. package/gs/builtin/builtin.ts +364 -37
  215. package/gs/builtin/channel.ts +161 -29
  216. package/gs/builtin/defer.ts +13 -2
  217. package/gs/builtin/hostio.test.ts +1 -0
  218. package/gs/builtin/hostio.ts +38 -0
  219. package/gs/builtin/map.ts +46 -6
  220. package/gs/builtin/print.ts +12 -3
  221. package/gs/builtin/runtime-contract.test.ts +257 -10
  222. package/gs/builtin/slice.test.ts +70 -0
  223. package/gs/builtin/slice.ts +566 -255
  224. package/gs/builtin/type.ts +53 -9
  225. package/gs/builtin/varRef.ts +2 -0
  226. package/gs/bytes/buffer.gs.ts +28 -28
  227. package/gs/bytes/iter.gs.ts +13 -14
  228. package/gs/compress/zlib/index.test.ts +28 -0
  229. package/gs/compress/zlib/index.ts +200 -0
  230. package/gs/compress/zlib/meta.json +3 -0
  231. package/gs/context/context.test.ts +31 -1
  232. package/gs/context/context.ts +9 -4
  233. package/gs/crypto/ecdh/index.test.ts +43 -0
  234. package/gs/crypto/ecdh/index.ts +274 -0
  235. package/gs/crypto/ed25519/index.test.ts +41 -0
  236. package/gs/crypto/ed25519/index.ts +238 -0
  237. package/gs/crypto/ed25519/meta.json +13 -0
  238. package/gs/crypto/internal/constanttime/index.test.ts +25 -0
  239. package/gs/crypto/internal/constanttime/index.ts +22 -0
  240. package/gs/crypto/rand/index.test.ts +89 -1
  241. package/gs/crypto/rand/index.ts +103 -1
  242. package/gs/crypto/rand/meta.json +4 -1
  243. package/gs/crypto/sha256/index.test.ts +78 -0
  244. package/gs/crypto/sha256/index.ts +150 -0
  245. package/gs/crypto/sha256/meta.json +9 -0
  246. package/gs/crypto/sha512/index.test.ts +31 -0
  247. package/gs/crypto/sha512/index.ts +161 -0
  248. package/gs/crypto/sha512/meta.json +11 -0
  249. package/gs/encoding/json/index.test.ts +25 -3
  250. package/gs/encoding/json/index.ts +21 -3
  251. package/gs/errors/errors.test.ts +4 -1
  252. package/gs/errors/errors.ts +32 -8
  253. package/gs/fmt/fmt.test.ts +3 -1
  254. package/gs/fmt/fmt.ts +1 -5
  255. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.test.ts +62 -7
  256. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.ts +78 -36
  257. package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.test.ts +32 -11
  258. package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.ts +122 -43
  259. package/gs/github.com/aperturerobotics/starpc/srpc/index.test.ts +31 -0
  260. package/gs/github.com/aperturerobotics/starpc/srpc/index.ts +518 -4
  261. package/gs/github.com/aperturerobotics/starpc/srpc/meta.json +6 -0
  262. package/gs/github.com/aperturerobotics/util/conc/index.test.ts +30 -0
  263. package/gs/github.com/aperturerobotics/util/conc/index.ts +172 -0
  264. package/gs/github.com/aperturerobotics/util/conc/meta.json +9 -0
  265. package/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/browser.ts +1 -4
  266. package/gs/github.com/hack-pad/safejs/internal/catch/index.test.ts +35 -0
  267. package/gs/github.com/hack-pad/safejs/internal/catch/index.ts +65 -0
  268. package/gs/github.com/hack-pad/safejs/internal/catch/meta.json +9 -0
  269. package/gs/github.com/klauspost/compress/internal/le/index.test.ts +2 -1
  270. package/gs/github.com/klauspost/compress/internal/le/index.ts +6 -5
  271. package/gs/github.com/mr-tron/base58/base58/index.test.ts +70 -0
  272. package/gs/github.com/mr-tron/base58/base58/index.ts +231 -0
  273. package/gs/github.com/mr-tron/base58/base58/meta.json +3 -0
  274. package/gs/github.com/zeebo/blake3/internal/consts/index.test.ts +46 -0
  275. package/gs/github.com/zeebo/blake3/internal/consts/index.ts +26 -0
  276. package/gs/go/token/index.ts +17 -4
  277. package/gs/hash/fnv/index.test.ts +67 -0
  278. package/gs/hash/fnv/index.ts +351 -0
  279. package/gs/hash/fnv/meta.json +3 -0
  280. package/gs/hash/index.test.ts +37 -0
  281. package/gs/hash/index.ts +118 -0
  282. package/gs/hash/meta.json +5 -0
  283. package/gs/internal/byteorder/index.test.ts +6 -6
  284. package/gs/io/fs/readlink.ts +40 -48
  285. package/gs/io/fs/walk.ts +10 -2
  286. package/gs/io/io.ts +4 -1
  287. package/gs/iter/iter.ts +8 -2
  288. package/gs/maps/iter.ts +69 -26
  289. package/gs/maps/maps.test.ts +23 -0
  290. package/gs/maps/maps.ts +6 -6
  291. package/gs/math/bits/index.test.ts +20 -0
  292. package/gs/math/bits/index.ts +15 -28
  293. package/gs/mime/index.ts +8 -2
  294. package/gs/net/http/httptest/index.test.ts +53 -0
  295. package/gs/net/http/httptest/index.ts +98 -3
  296. package/gs/net/http/index.test.ts +129 -1
  297. package/gs/net/http/index.ts +370 -19
  298. package/gs/net/http/meta.json +6 -0
  299. package/gs/net/http/pprof/index.test.ts +47 -0
  300. package/gs/net/http/pprof/index.ts +65 -0
  301. package/gs/os/error.gs.ts +9 -10
  302. package/gs/os/error.test.ts +41 -0
  303. package/gs/os/file_unix_js.test.ts +55 -0
  304. package/gs/os/tempfile.gs.test.ts +37 -10
  305. package/gs/os/types_js.gs.ts +94 -15
  306. package/gs/path/filepath/match.ts +4 -1
  307. package/gs/path/filepath/meta.json +6 -0
  308. package/gs/path/filepath/path.test.ts +57 -2
  309. package/gs/path/filepath/path.ts +91 -12
  310. package/gs/reflect/field.test.ts +63 -0
  311. package/gs/reflect/index.ts +4 -1
  312. package/gs/reflect/iter.ts +2 -2
  313. package/gs/reflect/map.test.ts +24 -2
  314. package/gs/reflect/map.ts +35 -0
  315. package/gs/reflect/type.ts +543 -60
  316. package/gs/reflect/typefor.test.ts +100 -0
  317. package/gs/reflect/types.ts +3 -1
  318. package/gs/reflect/value.ts +50 -1
  319. package/gs/reflect/visiblefields.ts +1 -1
  320. package/gs/runtime/debug/index.test.ts +22 -1
  321. package/gs/runtime/debug/index.ts +88 -0
  322. package/gs/runtime/pprof/index.test.ts +36 -0
  323. package/gs/runtime/pprof/index.ts +104 -0
  324. package/gs/runtime/pprof/meta.json +6 -0
  325. package/gs/runtime/trace/index.test.ts +45 -0
  326. package/gs/runtime/trace/index.ts +97 -0
  327. package/gs/runtime/trace/meta.json +7 -0
  328. package/gs/slices/meta.json +2 -1
  329. package/gs/slices/slices.test.ts +86 -0
  330. package/gs/slices/slices.ts +284 -37
  331. package/gs/sort/slice.gs.ts +73 -23
  332. package/gs/sort/slice.test.ts +40 -0
  333. package/gs/strings/builder.test.ts +8 -0
  334. package/gs/strings/builder.ts +29 -17
  335. package/gs/strings/iter.test.ts +5 -7
  336. package/gs/strings/iter.ts +146 -71
  337. package/gs/strings/replace.test.ts +1 -4
  338. package/gs/strings/replace.ts +6 -6
  339. package/gs/strings/strings.test.ts +4 -0
  340. package/gs/strings/strings.ts +54 -6
  341. package/gs/sync/sync.test.ts +57 -1
  342. package/gs/sync/sync.ts +45 -13
  343. package/gs/syscall/errors.ts +158 -115
  344. package/gs/syscall/fs.ts +8 -8
  345. package/gs/syscall/js/index.ts +49 -22
  346. package/gs/syscall/net.test.ts +26 -0
  347. package/gs/syscall/types.ts +7 -2
  348. package/gs/testing/testing.test.ts +56 -0
  349. package/gs/testing/testing.ts +27 -10
  350. package/gs/time/meta.json +2 -2
  351. package/gs/time/time.test.ts +4 -0
  352. package/gs/time/time.ts +33 -2
  353. package/gs/unicode/unicode.test.ts +14 -3
  354. package/gs/unicode/unicode.ts +1 -5
  355. package/gs/unique/index.ts +9 -2
  356. 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
+ }
@@ -132,6 +132,16 @@ func (o *TypeScriptEmitOwner) renderLoweredFile(pkg *loweredPackage, file *lower
132
132
  b.WriteString(imp.source)
133
133
  b.WriteString("\"\n")
134
134
  }
135
+ sideEffectImports := make(map[string]bool)
136
+ for _, imp := range file.imports {
137
+ if !imp.sideEffect || sideEffectImports[imp.source] {
138
+ continue
139
+ }
140
+ sideEffectImports[imp.source] = true
141
+ b.WriteString("import \"")
142
+ b.WriteString(imp.source)
143
+ b.WriteString("\"\n")
144
+ }
135
145
  if len(file.imports) != 0 {
136
146
  b.WriteString("\n")
137
147
  }
@@ -251,6 +261,8 @@ func structZeroValueDeps(structType *loweredStruct, names map[string]bool) []str
251
261
  func renderStruct(b *strings.Builder, structType *loweredStruct, runtimeOwner *RuntimeContractOwner) {
252
262
  varRef := runtimeOwner.QualifiedHelper(RuntimeHelperVarRef)
253
263
  markStructValue := runtimeOwner.QualifiedHelper(RuntimeHelperMarkAsStructValue)
264
+ cloneStructValue := runtimeOwner.QualifiedHelper(RuntimeHelperCloneStructValue)
265
+ cloneArrayValue := runtimeOwner.QualifiedHelper(RuntimeHelperCloneArrayValue)
254
266
  registerStructType := runtimeOwner.QualifiedHelper(RuntimeHelperRegisterStructType)
255
267
  if structType.exported {
256
268
  b.WriteString("export ")
@@ -305,9 +317,20 @@ func renderStruct(b *strings.Builder, structType *loweredStruct, runtimeOwner *R
305
317
  b.WriteString(field.name)
306
318
  b.WriteString(" ? ")
307
319
  b.WriteString(markStructValue)
320
+ b.WriteString("(")
321
+ b.WriteString(cloneStructValue)
322
+ b.WriteString("(init.")
323
+ b.WriteString(field.name)
324
+ b.WriteString(")) : ")
325
+ b.WriteString(field.zero)
326
+ } else if field.arrayValue {
327
+ b.WriteString("init?.")
328
+ b.WriteString(field.name)
329
+ b.WriteString(" !== undefined ? ")
330
+ b.WriteString(cloneArrayValue)
308
331
  b.WriteString("(init.")
309
332
  b.WriteString(field.name)
310
- b.WriteString(".clone()) : ")
333
+ b.WriteString(") : ")
311
334
  b.WriteString(field.zero)
312
335
  } else {
313
336
  b.WriteString("init?.")
@@ -337,9 +360,16 @@ func renderStruct(b *strings.Builder, structType *loweredStruct, runtimeOwner *R
337
360
  b.WriteString("(")
338
361
  if field.structValue {
339
362
  b.WriteString(markStructValue)
363
+ b.WriteString("(")
364
+ b.WriteString(cloneStructValue)
340
365
  b.WriteString("(this._fields.")
341
366
  b.WriteString(field.name)
342
- b.WriteString(".value.clone())")
367
+ b.WriteString(".value))")
368
+ } else if field.arrayValue {
369
+ b.WriteString(cloneArrayValue)
370
+ b.WriteString("(this._fields.")
371
+ b.WriteString(field.name)
372
+ b.WriteString(".value)")
343
373
  } else {
344
374
  b.WriteString("this._fields.")
345
375
  b.WriteString(field.name)
@@ -421,6 +451,7 @@ func renderFunction(b *strings.Builder, fn *loweredFunction) {
421
451
  }
422
452
  b.WriteString("function ")
423
453
  b.WriteString(fn.name)
454
+ renderFunctionTypeParams(b, fn)
424
455
  b.WriteString("(")
425
456
  for idx, param := range fn.params {
426
457
  if idx != 0 {
@@ -463,6 +494,7 @@ func renderMethod(b *strings.Builder, fn *loweredFunction) {
463
494
  b.WriteString("async ")
464
495
  }
465
496
  b.WriteString(fn.name)
497
+ renderFunctionTypeParams(b, fn)
466
498
  b.WriteString("(")
467
499
  for idx, param := range fn.params {
468
500
  if idx != 0 {
@@ -499,6 +531,20 @@ func renderMethod(b *strings.Builder, fn *loweredFunction) {
499
531
  b.WriteString("}\n")
500
532
  }
501
533
 
534
+ func renderFunctionTypeParams(b *strings.Builder, fn *loweredFunction) {
535
+ if len(fn.typeParams) == 0 {
536
+ return
537
+ }
538
+ b.WriteString("<")
539
+ for idx, typeParam := range fn.typeParams {
540
+ if idx != 0 {
541
+ b.WriteString(", ")
542
+ }
543
+ b.WriteString(typeParam)
544
+ }
545
+ b.WriteString(">")
546
+ }
547
+
502
548
  func receiverValue(fn *loweredFunction) string {
503
549
  if fn.receiverValue != "" {
504
550
  return fn.receiverValue
@@ -774,7 +820,7 @@ func renderSelect(b *strings.Builder, stmt *loweredSelect, indent int) {
774
820
  }
775
821
  b.WriteString(">([\n")
776
822
  for idx, switchCase := range stmt.cases {
777
- renderSelectCase(b, switchCase, stmt.external, indent+1)
823
+ renderSelectCase(b, switchCase, stmt.external, stmt.result, indent+1)
778
824
  if idx != len(stmt.cases)-1 {
779
825
  b.WriteString(",")
780
826
  }
@@ -821,7 +867,9 @@ func renderSelectExternalBodies(b *strings.Builder, stmt *loweredSelect, indent
821
867
  writeIndent(b, indent+2)
822
868
  b.WriteString("{\n")
823
869
  writeIndent(b, indent+3)
824
- b.WriteString("const result = ")
870
+ b.WriteString("const ")
871
+ b.WriteString(stmt.result)
872
+ b.WriteString(" = ")
825
873
  b.WriteString(stmt.value)
826
874
  b.WriteString("\n")
827
875
  renderStmts(b, switchCase.prelude, indent+3)
@@ -839,7 +887,7 @@ func renderSelectExternalBodies(b *strings.Builder, stmt *loweredSelect, indent
839
887
  }
840
888
  }
841
889
 
842
- func renderSelectCase(b *strings.Builder, switchCase loweredSelectCase, external bool, indent int) {
890
+ func renderSelectCase(b *strings.Builder, switchCase loweredSelectCase, external bool, resultName string, indent int) {
843
891
  writeIndent(b, indent)
844
892
  b.WriteString("{\n")
845
893
  writeIndent(b, indent+1)
@@ -865,10 +913,14 @@ func renderSelectCase(b *strings.Builder, switchCase loweredSelectCase, external
865
913
  b.WriteString(",\n")
866
914
  }
867
915
  writeIndent(b, indent+1)
868
- b.WriteString("onSelected: async (result) => {\n")
916
+ b.WriteString("onSelected: async (")
917
+ b.WriteString(resultName)
918
+ b.WriteString(") => {\n")
869
919
  if external {
870
920
  writeIndent(b, indent+2)
871
- b.WriteString("return result\n")
921
+ b.WriteString("return ")
922
+ b.WriteString(resultName)
923
+ b.WriteString("\n")
872
924
  writeIndent(b, indent+1)
873
925
  b.WriteString("}\n")
874
926
  writeIndent(b, indent)
@@ -876,13 +928,67 @@ func renderSelectCase(b *strings.Builder, switchCase loweredSelectCase, external
876
928
  return
877
929
  }
878
930
  renderStmts(b, switchCase.prelude, indent+2)
879
- renderStmts(b, switchCase.body, indent+2)
931
+ renderSelectCaseStmts(b, switchCase.body, indent+2)
880
932
  writeIndent(b, indent+1)
881
933
  b.WriteString("}\n")
882
934
  writeIndent(b, indent)
883
935
  b.WriteString("}")
884
936
  }
885
937
 
938
+ func renderSelectCaseStmts(b *strings.Builder, stmts []loweredStmt, indent int) {
939
+ for idx, stmt := range stmts {
940
+ renderLeadingLines(b, stmt.leading, indent)
941
+ if stmt.rangeFunc != nil {
942
+ renderRangeFunc(b, stmt.rangeFunc, indent)
943
+ continue
944
+ }
945
+ if stmt.switchStmt != nil {
946
+ renderSwitch(b, stmt.switchStmt, indent)
947
+ continue
948
+ }
949
+ if stmt.selectStmt != nil {
950
+ renderSelect(b, stmt.selectStmt, indent)
951
+ continue
952
+ }
953
+ if stmt.typeSwitch != nil {
954
+ renderTypeSwitch(b, stmt.typeSwitch, indent)
955
+ continue
956
+ }
957
+ writeIndent(b, indent)
958
+ if stmt.text == "" && (stmt.hasBlock || len(stmt.children) != 0) {
959
+ b.WriteString("{\n")
960
+ renderSelectCaseStmts(b, stmt.children, indent+1)
961
+ writeIndent(b, indent)
962
+ b.WriteString("}\n")
963
+ continue
964
+ }
965
+ if strings.TrimSpace(stmt.text) == "return" {
966
+ b.WriteString("return $.selectVoidReturn()\n")
967
+ continue
968
+ }
969
+ writeIndentedText(b, stmt.text, indent)
970
+ if !stmt.hasBlock && len(stmt.children) == 0 {
971
+ if idx+1 < len(stmts) && needsASIBarrier(stmt, stmts[idx+1]) {
972
+ b.WriteString(";")
973
+ }
974
+ b.WriteString("\n")
975
+ continue
976
+ }
977
+ b.WriteString(" {\n")
978
+ renderSelectCaseStmts(b, stmt.children, indent+1)
979
+ writeIndent(b, indent)
980
+ b.WriteString("}")
981
+ if len(stmt.elseBody) == 0 {
982
+ b.WriteString("\n")
983
+ continue
984
+ }
985
+ b.WriteString(" else {\n")
986
+ renderSelectCaseStmts(b, stmt.elseBody, indent+1)
987
+ writeIndent(b, indent)
988
+ b.WriteString("}\n")
989
+ }
990
+ }
991
+
886
992
  func renderTypeSwitch(b *strings.Builder, stmt *loweredTypeSwitch, indent int) {
887
993
  writeIndent(b, indent)
888
994
  b.WriteString("{\n")
@@ -965,7 +1071,11 @@ func renderTypeSwitchInlineBody(
965
1071
  indent int,
966
1072
  ) {
967
1073
  if varName == "" {
968
- renderStmts(b, body, indent)
1074
+ writeIndent(b, indent)
1075
+ b.WriteString("{\n")
1076
+ renderStmts(b, body, indent+1)
1077
+ writeIndent(b, indent)
1078
+ b.WriteString("}\n")
969
1079
  return
970
1080
  }
971
1081
  writeIndent(b, indent)
@@ -1002,6 +1112,9 @@ func renderTypeSwitchInlineBody(
1002
1112
  func renderIndex(pkg *loweredPackage) string {
1003
1113
  var lines []string
1004
1114
  for _, file := range pkg.files {
1115
+ if file.sideEffect {
1116
+ lines = append(lines, "import \"./"+file.outputName+"\"")
1117
+ }
1005
1118
  exports := slices.Clone(file.exports)
1006
1119
  slices.Sort(exports)
1007
1120
  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
  *