goscript 0.1.0 → 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 (495) hide show
  1. package/README.md +267 -255
  2. package/cmd/goscript/cmd-test.go +286 -0
  3. package/cmd/goscript/cmd-test_test.go +76 -0
  4. package/cmd/goscript/cmd_compile.go +9 -0
  5. package/cmd/goscript/main.go +1 -0
  6. package/compiler/build-flags.go +38 -0
  7. package/compiler/compile-request.go +33 -0
  8. package/compiler/compiler.go +1 -1
  9. package/compiler/compliance_test.go +0 -10
  10. package/compiler/config.go +2 -0
  11. package/compiler/gotest/owner.go +24 -0
  12. package/compiler/gotest/package-result.go +69 -0
  13. package/compiler/gotest/request.go +210 -0
  14. package/compiler/gotest/result.go +28 -0
  15. package/compiler/gotest/runner.go +1225 -0
  16. package/compiler/gotest/runner_test.go +1271 -0
  17. package/compiler/gotest/test.go +9 -0
  18. package/compiler/index.test.ts +1 -1
  19. package/compiler/lowered-program.go +80 -21
  20. package/compiler/lowering.go +6754 -602
  21. package/compiler/override-facts.go +357 -0
  22. package/compiler/override-registry.go +52 -190
  23. package/compiler/override-registry_test.go +182 -0
  24. package/compiler/package-graph.go +50 -27
  25. package/compiler/package-graph_test.go +99 -9
  26. package/compiler/package-test-function.go +9 -0
  27. package/compiler/package-test-graph-package.go +40 -0
  28. package/compiler/package-test-graph-variant.go +129 -0
  29. package/compiler/package-test-graph.go +112 -0
  30. package/compiler/package-test-graph_test.go +202 -0
  31. package/compiler/runtime-contract.go +229 -29
  32. package/compiler/runtime-contract_test.go +44 -30
  33. package/compiler/semantic-model-types.go +25 -6
  34. package/compiler/semantic-model.go +819 -74
  35. package/compiler/semantic-model_test.go +104 -0
  36. package/compiler/service.go +10 -4
  37. package/compiler/skeleton_test.go +2777 -524
  38. package/compiler/tsworkspace/owner-process-unix_test.go +72 -0
  39. package/compiler/tsworkspace/owner.go +342 -0
  40. package/compiler/tsworkspace/owner_test.go +93 -0
  41. package/compiler/tsworkspace/result.go +17 -0
  42. package/compiler/tsworkspace/tool-process-other.go +14 -0
  43. package/compiler/tsworkspace/tool-process-unix.go +19 -0
  44. package/compiler/typescript-emitter.go +576 -86
  45. package/compiler/wasm/compile.go +1 -1
  46. package/compiler/wasm/compile_test.go +61 -11
  47. package/compiler/wasm_api.go +172 -7
  48. package/dist/gs/builtin/builtin.d.ts +40 -3
  49. package/dist/gs/builtin/builtin.js +430 -22
  50. package/dist/gs/builtin/builtin.js.map +1 -1
  51. package/dist/gs/builtin/channel.d.ts +32 -10
  52. package/dist/gs/builtin/channel.js +119 -25
  53. package/dist/gs/builtin/channel.js.map +1 -1
  54. package/dist/gs/builtin/defer.d.ts +1 -0
  55. package/dist/gs/builtin/defer.js +12 -2
  56. package/dist/gs/builtin/defer.js.map +1 -1
  57. package/dist/gs/builtin/hostio.d.ts +9 -0
  58. package/dist/gs/builtin/hostio.js +25 -0
  59. package/dist/gs/builtin/hostio.js.map +1 -1
  60. package/dist/gs/builtin/map.js +40 -6
  61. package/dist/gs/builtin/map.js.map +1 -1
  62. package/dist/gs/builtin/print.js.map +1 -1
  63. package/dist/gs/builtin/slice.d.ts +64 -10
  64. package/dist/gs/builtin/slice.js +619 -244
  65. package/dist/gs/builtin/slice.js.map +1 -1
  66. package/dist/gs/builtin/type.d.ts +7 -2
  67. package/dist/gs/builtin/type.js +128 -29
  68. package/dist/gs/builtin/type.js.map +1 -1
  69. package/dist/gs/builtin/varRef.d.ts +7 -0
  70. package/dist/gs/builtin/varRef.js +23 -0
  71. package/dist/gs/builtin/varRef.js.map +1 -1
  72. package/dist/gs/bytes/buffer.gs.js +74 -70
  73. package/dist/gs/bytes/buffer.gs.js.map +1 -1
  74. package/dist/gs/bytes/iter.gs.js +13 -13
  75. package/dist/gs/bytes/iter.gs.js.map +1 -1
  76. package/dist/gs/bytes/reader.gs.js +20 -18
  77. package/dist/gs/bytes/reader.gs.js.map +1 -1
  78. package/dist/gs/compress/zlib/index.d.ts +26 -0
  79. package/dist/gs/compress/zlib/index.js +168 -0
  80. package/dist/gs/compress/zlib/index.js.map +1 -0
  81. package/dist/gs/context/context.d.ts +6 -5
  82. package/dist/gs/context/context.js +17 -12
  83. package/dist/gs/context/context.js.map +1 -1
  84. package/dist/gs/crypto/ecdh/index.d.ts +52 -0
  85. package/dist/gs/crypto/ecdh/index.js +226 -0
  86. package/dist/gs/crypto/ecdh/index.js.map +1 -0
  87. package/dist/gs/crypto/ed25519/index.d.ts +34 -0
  88. package/dist/gs/crypto/ed25519/index.js +160 -0
  89. package/dist/gs/crypto/ed25519/index.js.map +1 -0
  90. package/dist/gs/crypto/internal/constanttime/index.d.ts +4 -0
  91. package/dist/gs/crypto/internal/constanttime/index.js +18 -0
  92. package/dist/gs/crypto/internal/constanttime/index.js.map +1 -0
  93. package/dist/gs/crypto/internal/fips140deps/byteorder/index.d.ts +1 -0
  94. package/dist/gs/crypto/internal/fips140deps/byteorder/index.js +2 -0
  95. package/dist/gs/crypto/internal/fips140deps/byteorder/index.js.map +1 -0
  96. package/dist/gs/crypto/internal/fips140deps/godebug/index.d.ts +1 -0
  97. package/dist/gs/crypto/internal/fips140deps/godebug/index.js +2 -0
  98. package/dist/gs/crypto/internal/fips140deps/godebug/index.js.map +1 -0
  99. package/dist/gs/crypto/rand/index.d.ts +2 -0
  100. package/dist/gs/crypto/rand/index.js +85 -0
  101. package/dist/gs/crypto/rand/index.js.map +1 -1
  102. package/dist/gs/crypto/sha256/index.d.ts +8 -0
  103. package/dist/gs/crypto/sha256/index.js +118 -0
  104. package/dist/gs/crypto/sha256/index.js.map +1 -0
  105. package/dist/gs/crypto/sha512/index.d.ts +14 -0
  106. package/dist/gs/crypto/sha512/index.js +129 -0
  107. package/dist/gs/crypto/sha512/index.js.map +1 -0
  108. package/dist/gs/embed/index.d.ts +7 -0
  109. package/dist/gs/embed/index.js +16 -0
  110. package/dist/gs/embed/index.js.map +1 -0
  111. package/dist/gs/encoding/json/index.d.ts +4 -0
  112. package/dist/gs/encoding/json/index.js +33 -0
  113. package/dist/gs/encoding/json/index.js.map +1 -1
  114. package/dist/gs/errors/errors.d.ts +4 -0
  115. package/dist/gs/errors/errors.js +108 -4
  116. package/dist/gs/errors/errors.js.map +1 -1
  117. package/dist/gs/fmt/fmt.d.ts +4 -4
  118. package/dist/gs/fmt/fmt.js +42 -11
  119. package/dist/gs/fmt/fmt.js.map +1 -1
  120. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.d.ts +37 -2
  121. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js +245 -1
  122. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js.map +1 -1
  123. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.d.ts +189 -0
  124. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js +861 -0
  125. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js.map +1 -0
  126. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.d.ts +217 -0
  127. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js +814 -0
  128. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js.map +1 -0
  129. package/dist/gs/github.com/aperturerobotics/util/conc/index.d.ts +20 -0
  130. package/dist/gs/github.com/aperturerobotics/util/conc/index.js +134 -0
  131. package/dist/gs/github.com/aperturerobotics/util/conc/index.js.map +1 -0
  132. package/dist/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/browser.js.map +1 -1
  133. package/dist/gs/github.com/hack-pad/safejs/internal/catch/index.d.ts +3 -0
  134. package/dist/gs/github.com/hack-pad/safejs/internal/catch/index.js +50 -0
  135. package/dist/gs/github.com/hack-pad/safejs/internal/catch/index.js.map +1 -0
  136. package/dist/gs/github.com/klauspost/compress/internal/le/index.d.ts +9 -0
  137. package/dist/gs/github.com/klauspost/compress/internal/le/index.js +72 -0
  138. package/dist/gs/github.com/klauspost/compress/internal/le/index.js.map +1 -0
  139. package/dist/gs/github.com/mr-tron/base58/base58/index.d.ts +27 -0
  140. package/dist/gs/github.com/mr-tron/base58/base58/index.js +172 -0
  141. package/dist/gs/github.com/mr-tron/base58/base58/index.js.map +1 -0
  142. package/dist/gs/github.com/zeebo/blake3/internal/consts/index.d.ts +21 -0
  143. package/dist/gs/github.com/zeebo/blake3/internal/consts/index.js +22 -0
  144. package/dist/gs/github.com/zeebo/blake3/internal/consts/index.js.map +1 -0
  145. package/dist/gs/go/internal/scannerhooks/index.d.ts +3 -0
  146. package/dist/gs/go/internal/scannerhooks/index.js +5 -0
  147. package/dist/gs/go/internal/scannerhooks/index.js.map +1 -0
  148. package/dist/gs/go/scanner/index.d.ts +13 -0
  149. package/dist/gs/go/scanner/index.js +35 -0
  150. package/dist/gs/go/scanner/index.js.map +1 -1
  151. package/dist/gs/go/token/index.d.ts +156 -0
  152. package/dist/gs/go/token/index.js +507 -4
  153. package/dist/gs/go/token/index.js.map +1 -1
  154. package/dist/gs/hash/fnv/index.d.ts +57 -0
  155. package/dist/gs/hash/fnv/index.js +299 -0
  156. package/dist/gs/hash/fnv/index.js.map +1 -0
  157. package/dist/gs/hash/index.d.ts +17 -0
  158. package/dist/gs/hash/index.js +94 -0
  159. package/dist/gs/hash/index.js.map +1 -0
  160. package/dist/gs/internal/abi/index.d.ts +4 -0
  161. package/dist/gs/internal/abi/index.js +10 -0
  162. package/dist/gs/internal/abi/index.js.map +1 -1
  163. package/dist/gs/internal/bytealg/index.d.ts +2 -0
  164. package/dist/gs/internal/bytealg/index.js +14 -0
  165. package/dist/gs/internal/bytealg/index.js.map +1 -1
  166. package/dist/gs/internal/byteorder/index.d.ts +8 -2
  167. package/dist/gs/internal/byteorder/index.js +56 -25
  168. package/dist/gs/internal/byteorder/index.js.map +1 -1
  169. package/dist/gs/internal/godebug/index.d.ts +12 -0
  170. package/dist/gs/internal/godebug/index.js +30 -0
  171. package/dist/gs/internal/godebug/index.js.map +1 -0
  172. package/dist/gs/io/fs/index.d.ts +1 -0
  173. package/dist/gs/io/fs/index.js +1 -0
  174. package/dist/gs/io/fs/index.js.map +1 -1
  175. package/dist/gs/io/fs/readlink.d.ts +8 -0
  176. package/dist/gs/io/fs/readlink.js +60 -0
  177. package/dist/gs/io/fs/readlink.js.map +1 -0
  178. package/dist/gs/io/fs/walk.d.ts +3 -3
  179. package/dist/gs/io/fs/walk.js +7 -7
  180. package/dist/gs/io/fs/walk.js.map +1 -1
  181. package/dist/gs/io/io.d.ts +40 -6
  182. package/dist/gs/io/io.js +151 -26
  183. package/dist/gs/io/io.js.map +1 -1
  184. package/dist/gs/iter/iter.d.ts +3 -2
  185. package/dist/gs/iter/iter.js.map +1 -1
  186. package/dist/gs/maps/iter.d.ts +5 -5
  187. package/dist/gs/maps/iter.js +48 -21
  188. package/dist/gs/maps/iter.js.map +1 -1
  189. package/dist/gs/maps/maps.d.ts +6 -6
  190. package/dist/gs/maps/maps.js +1 -1
  191. package/dist/gs/maps/maps.js.map +1 -1
  192. package/dist/gs/math/bits/index.d.ts +13 -4
  193. package/dist/gs/math/bits/index.js +70 -48
  194. package/dist/gs/math/bits/index.js.map +1 -1
  195. package/dist/gs/math/const.gs.d.ts +5 -5
  196. package/dist/gs/math/const.gs.js +4 -4
  197. package/dist/gs/math/const.gs.js.map +1 -1
  198. package/dist/gs/mime/index.d.ts +1 -0
  199. package/dist/gs/mime/index.js +52 -0
  200. package/dist/gs/mime/index.js.map +1 -0
  201. package/dist/gs/net/http/httptest/index.d.ts +30 -0
  202. package/dist/gs/net/http/httptest/index.js +101 -0
  203. package/dist/gs/net/http/httptest/index.js.map +1 -0
  204. package/dist/gs/net/http/index.d.ts +131 -0
  205. package/dist/gs/net/http/index.js +307 -0
  206. package/dist/gs/net/http/index.js.map +1 -0
  207. package/dist/gs/net/http/pprof/index.d.ts +8 -0
  208. package/dist/gs/net/http/pprof/index.js +59 -0
  209. package/dist/gs/net/http/pprof/index.js.map +1 -0
  210. package/dist/gs/os/dir_unix.gs.js +2 -2
  211. package/dist/gs/os/dir_unix.gs.js.map +1 -1
  212. package/dist/gs/os/error.gs.js +9 -7
  213. package/dist/gs/os/error.gs.js.map +1 -1
  214. package/dist/gs/os/types_js.gs.js +95 -15
  215. package/dist/gs/os/types_js.gs.js.map +1 -1
  216. package/dist/gs/path/filepath/match.js +165 -3
  217. package/dist/gs/path/filepath/match.js.map +1 -1
  218. package/dist/gs/path/filepath/path.d.ts +8 -4
  219. package/dist/gs/path/filepath/path.js +192 -8
  220. package/dist/gs/path/filepath/path.js.map +1 -1
  221. package/dist/gs/path/path.d.ts +4 -1
  222. package/dist/gs/path/path.js +16 -4
  223. package/dist/gs/path/path.js.map +1 -1
  224. package/dist/gs/reflect/index.d.ts +4 -3
  225. package/dist/gs/reflect/index.js +3 -2
  226. package/dist/gs/reflect/index.js.map +1 -1
  227. package/dist/gs/reflect/iter.js +2 -2
  228. package/dist/gs/reflect/iter.js.map +1 -1
  229. package/dist/gs/reflect/map.js +29 -0
  230. package/dist/gs/reflect/map.js.map +1 -1
  231. package/dist/gs/reflect/type.d.ts +31 -9
  232. package/dist/gs/reflect/type.js +536 -43
  233. package/dist/gs/reflect/type.js.map +1 -1
  234. package/dist/gs/reflect/types.d.ts +1 -0
  235. package/dist/gs/reflect/types.js +3 -1
  236. package/dist/gs/reflect/types.js.map +1 -1
  237. package/dist/gs/reflect/value.d.ts +4 -1
  238. package/dist/gs/reflect/value.js +39 -1
  239. package/dist/gs/reflect/value.js.map +1 -1
  240. package/dist/gs/reflect/visiblefields.js +1 -1
  241. package/dist/gs/reflect/visiblefields.js.map +1 -1
  242. package/dist/gs/runtime/debug/index.d.ts +41 -0
  243. package/dist/gs/runtime/debug/index.js +66 -0
  244. package/dist/gs/runtime/debug/index.js.map +1 -0
  245. package/dist/gs/runtime/pprof/index.d.ts +20 -0
  246. package/dist/gs/runtime/pprof/index.js +85 -0
  247. package/dist/gs/runtime/pprof/index.js.map +1 -0
  248. package/dist/gs/runtime/runtime.d.ts +35 -3
  249. package/dist/gs/runtime/runtime.js +72 -0
  250. package/dist/gs/runtime/runtime.js.map +1 -1
  251. package/dist/gs/runtime/trace/index.d.ts +19 -0
  252. package/dist/gs/runtime/trace/index.js +64 -0
  253. package/dist/gs/runtime/trace/index.js.map +1 -0
  254. package/dist/gs/slices/slices.d.ts +42 -8
  255. package/dist/gs/slices/slices.js +425 -11
  256. package/dist/gs/slices/slices.js.map +1 -1
  257. package/dist/gs/sort/slice.gs.d.ts +5 -3
  258. package/dist/gs/sort/slice.gs.js +60 -22
  259. package/dist/gs/sort/slice.gs.js.map +1 -1
  260. package/dist/gs/sort/sort.gs.d.ts +4 -4
  261. package/dist/gs/sort/sort.gs.js +11 -8
  262. package/dist/gs/sort/sort.gs.js.map +1 -1
  263. package/dist/gs/strings/builder.d.ts +1 -1
  264. package/dist/gs/strings/builder.js +29 -19
  265. package/dist/gs/strings/builder.js.map +1 -1
  266. package/dist/gs/strings/iter.js +140 -75
  267. package/dist/gs/strings/iter.js.map +1 -1
  268. package/dist/gs/strings/replace.js +2 -2
  269. package/dist/gs/strings/replace.js.map +1 -1
  270. package/dist/gs/strings/strings.js +52 -6
  271. package/dist/gs/strings/strings.js.map +1 -1
  272. package/dist/gs/sync/atomic/type.gs.d.ts +9 -8
  273. package/dist/gs/sync/atomic/type.gs.js +0 -2
  274. package/dist/gs/sync/atomic/type.gs.js.map +1 -1
  275. package/dist/gs/sync/sync.d.ts +8 -3
  276. package/dist/gs/sync/sync.js +66 -11
  277. package/dist/gs/sync/sync.js.map +1 -1
  278. package/dist/gs/syscall/constants.d.ts +36 -24
  279. package/dist/gs/syscall/constants.js +12 -0
  280. package/dist/gs/syscall/constants.js.map +1 -1
  281. package/dist/gs/syscall/errors.d.ts +117 -111
  282. package/dist/gs/syscall/errors.js +45 -0
  283. package/dist/gs/syscall/errors.js.map +1 -1
  284. package/dist/gs/syscall/fs.d.ts +37 -0
  285. package/dist/gs/syscall/fs.js +102 -0
  286. package/dist/gs/syscall/fs.js.map +1 -1
  287. package/dist/gs/syscall/js/index.d.ts +90 -0
  288. package/dist/gs/syscall/js/index.js +383 -0
  289. package/dist/gs/syscall/js/index.js.map +1 -0
  290. package/dist/gs/syscall/types.d.ts +26 -1
  291. package/dist/gs/syscall/types.js +45 -1
  292. package/dist/gs/syscall/types.js.map +1 -1
  293. package/dist/gs/testing/index.d.ts +1 -0
  294. package/dist/gs/testing/index.js +2 -0
  295. package/dist/gs/testing/index.js.map +1 -0
  296. package/dist/gs/testing/testing.d.ts +78 -0
  297. package/dist/gs/testing/testing.js +318 -0
  298. package/dist/gs/testing/testing.js.map +1 -0
  299. package/dist/gs/time/time.d.ts +41 -4
  300. package/dist/gs/time/time.js +227 -36
  301. package/dist/gs/time/time.js.map +1 -1
  302. package/dist/gs/unicode/unicode.d.ts +23 -1
  303. package/dist/gs/unicode/unicode.js +79 -10
  304. package/dist/gs/unicode/unicode.js.map +1 -1
  305. package/dist/gs/unicode/utf8/utf8.d.ts +4 -4
  306. package/dist/gs/unicode/utf8/utf8.js +24 -11
  307. package/dist/gs/unicode/utf8/utf8.js.map +1 -1
  308. package/dist/gs/unique/index.d.ts +11 -0
  309. package/dist/gs/unique/index.js +76 -0
  310. package/dist/gs/unique/index.js.map +1 -0
  311. package/go.mod +8 -8
  312. package/go.sum +14 -14
  313. package/gs/builtin/builtin.ts +585 -27
  314. package/gs/builtin/channel.ts +183 -29
  315. package/gs/builtin/defer.ts +13 -2
  316. package/gs/builtin/hostio.test.ts +1 -0
  317. package/gs/builtin/hostio.ts +38 -0
  318. package/gs/builtin/map.ts +46 -6
  319. package/gs/builtin/print.ts +12 -3
  320. package/gs/builtin/runtime-contract.test.ts +383 -10
  321. package/gs/builtin/slice.test.ts +70 -0
  322. package/gs/builtin/slice.ts +785 -265
  323. package/gs/builtin/type.ts +160 -41
  324. package/gs/builtin/varRef.ts +40 -1
  325. package/gs/bytes/buffer.gs.ts +74 -70
  326. package/gs/bytes/iter.gs.ts +13 -14
  327. package/gs/bytes/meta.json +8 -3
  328. package/gs/bytes/reader.gs.ts +20 -19
  329. package/gs/compress/zlib/index.test.ts +28 -0
  330. package/gs/compress/zlib/index.ts +200 -0
  331. package/gs/compress/zlib/meta.json +3 -0
  332. package/gs/context/context.test.ts +71 -0
  333. package/gs/context/context.ts +30 -29
  334. package/gs/crypto/ecdh/index.test.ts +43 -0
  335. package/gs/crypto/ecdh/index.ts +274 -0
  336. package/gs/crypto/ed25519/index.test.ts +41 -0
  337. package/gs/crypto/ed25519/index.ts +238 -0
  338. package/gs/crypto/ed25519/meta.json +13 -0
  339. package/gs/crypto/internal/constanttime/index.test.ts +25 -0
  340. package/gs/crypto/internal/constanttime/index.ts +22 -0
  341. package/gs/crypto/internal/fips140deps/byteorder/index.ts +1 -0
  342. package/gs/crypto/internal/fips140deps/godebug/index.ts +1 -0
  343. package/gs/crypto/rand/index.test.ts +89 -1
  344. package/gs/crypto/rand/index.ts +103 -1
  345. package/gs/crypto/rand/meta.json +4 -1
  346. package/gs/crypto/sha256/index.test.ts +78 -0
  347. package/gs/crypto/sha256/index.ts +150 -0
  348. package/gs/crypto/sha256/meta.json +9 -0
  349. package/gs/crypto/sha512/index.test.ts +31 -0
  350. package/gs/crypto/sha512/index.ts +161 -0
  351. package/gs/crypto/sha512/meta.json +11 -0
  352. package/gs/embed/index.ts +20 -0
  353. package/gs/embed/meta.json +5 -0
  354. package/gs/encoding/json/index.test.ts +39 -3
  355. package/gs/encoding/json/index.ts +45 -3
  356. package/gs/errors/errors.test.ts +85 -0
  357. package/gs/errors/errors.ts +132 -4
  358. package/gs/fmt/fmt.test.ts +3 -1
  359. package/gs/fmt/fmt.ts +55 -19
  360. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.test.ts +128 -1
  361. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.ts +342 -4
  362. package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.test.ts +180 -0
  363. package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.ts +1084 -0
  364. package/gs/github.com/aperturerobotics/starpc/srpc/index.test.ts +31 -0
  365. package/gs/github.com/aperturerobotics/starpc/srpc/index.ts +1233 -0
  366. package/gs/github.com/aperturerobotics/starpc/srpc/meta.json +46 -0
  367. package/gs/github.com/aperturerobotics/util/conc/index.test.ts +30 -0
  368. package/gs/github.com/aperturerobotics/util/conc/index.ts +172 -0
  369. package/gs/github.com/aperturerobotics/util/conc/meta.json +9 -0
  370. package/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/browser.ts +1 -4
  371. package/gs/github.com/hack-pad/safejs/internal/catch/index.test.ts +35 -0
  372. package/gs/github.com/hack-pad/safejs/internal/catch/index.ts +65 -0
  373. package/gs/github.com/hack-pad/safejs/internal/catch/meta.json +9 -0
  374. package/gs/github.com/klauspost/compress/internal/le/index.test.ts +37 -0
  375. package/gs/github.com/klauspost/compress/internal/le/index.ts +115 -0
  376. package/gs/github.com/mr-tron/base58/base58/index.test.ts +70 -0
  377. package/gs/github.com/mr-tron/base58/base58/index.ts +231 -0
  378. package/gs/github.com/mr-tron/base58/base58/meta.json +3 -0
  379. package/gs/github.com/zeebo/blake3/internal/consts/index.test.ts +46 -0
  380. package/gs/github.com/zeebo/blake3/internal/consts/index.ts +26 -0
  381. package/gs/go/internal/scannerhooks/index.test.ts +14 -0
  382. package/gs/go/internal/scannerhooks/index.ts +9 -0
  383. package/gs/go/scanner/index.test.ts +22 -0
  384. package/gs/go/scanner/index.ts +47 -0
  385. package/gs/go/token/index.test.ts +47 -1
  386. package/gs/go/token/index.ts +583 -4
  387. package/gs/hash/fnv/index.test.ts +67 -0
  388. package/gs/hash/fnv/index.ts +351 -0
  389. package/gs/hash/fnv/meta.json +3 -0
  390. package/gs/hash/index.test.ts +37 -0
  391. package/gs/hash/index.ts +118 -0
  392. package/gs/hash/meta.json +5 -0
  393. package/gs/internal/abi/index.test.ts +18 -0
  394. package/gs/internal/abi/index.ts +14 -0
  395. package/gs/internal/bytealg/index.test.ts +18 -0
  396. package/gs/internal/bytealg/index.ts +16 -0
  397. package/gs/internal/byteorder/index.test.ts +39 -0
  398. package/gs/internal/byteorder/index.ts +100 -27
  399. package/gs/internal/godebug/index.test.ts +16 -0
  400. package/gs/internal/godebug/index.ts +35 -0
  401. package/gs/io/fs/index.ts +1 -0
  402. package/gs/io/fs/meta.json +5 -0
  403. package/gs/io/fs/readlink.test.ts +43 -0
  404. package/gs/io/fs/readlink.ts +69 -0
  405. package/gs/io/fs/walk.test.ts +61 -0
  406. package/gs/io/fs/walk.ts +17 -9
  407. package/gs/io/io.ts +177 -31
  408. package/gs/io/meta.json +10 -2
  409. package/gs/iter/iter.ts +8 -2
  410. package/gs/maps/iter.ts +75 -26
  411. package/gs/maps/maps.test.ts +23 -0
  412. package/gs/maps/maps.ts +13 -11
  413. package/gs/math/bits/index.test.ts +20 -0
  414. package/gs/math/bits/index.ts +107 -64
  415. package/gs/math/const.gs.test.ts +11 -5
  416. package/gs/math/const.gs.ts +5 -6
  417. package/gs/mime/index.ts +60 -0
  418. package/gs/net/http/httptest/index.test.ts +53 -0
  419. package/gs/net/http/httptest/index.ts +120 -0
  420. package/gs/net/http/index.test.ts +148 -0
  421. package/gs/net/http/index.ts +432 -0
  422. package/gs/net/http/meta.json +6 -0
  423. package/gs/net/http/pprof/index.test.ts +47 -0
  424. package/gs/net/http/pprof/index.ts +65 -0
  425. package/gs/os/dir_unix.gs.ts +2 -3
  426. package/gs/os/error.gs.ts +9 -10
  427. package/gs/os/error.test.ts +41 -0
  428. package/gs/os/file_unix_js.test.ts +55 -0
  429. package/gs/os/tempfile.gs.test.ts +37 -10
  430. package/gs/os/types_js.gs.ts +96 -17
  431. package/gs/path/filepath/match.test.ts +31 -12
  432. package/gs/path/filepath/match.ts +181 -3
  433. package/gs/path/filepath/meta.json +6 -0
  434. package/gs/path/filepath/path.test.ts +80 -0
  435. package/gs/path/filepath/path.ts +244 -11
  436. package/gs/path/path.ts +20 -5
  437. package/gs/reflect/field.test.ts +63 -0
  438. package/gs/reflect/index.ts +5 -1
  439. package/gs/reflect/iter.ts +2 -2
  440. package/gs/reflect/map.test.ts +42 -1
  441. package/gs/reflect/map.ts +39 -0
  442. package/gs/reflect/type.ts +728 -65
  443. package/gs/reflect/typefor.test.ts +100 -0
  444. package/gs/reflect/types.ts +3 -1
  445. package/gs/reflect/value.ts +50 -1
  446. package/gs/reflect/visiblefields.ts +1 -1
  447. package/gs/runtime/debug/index.test.ts +45 -0
  448. package/gs/runtime/debug/index.ts +96 -0
  449. package/gs/runtime/pprof/index.test.ts +36 -0
  450. package/gs/runtime/pprof/index.ts +104 -0
  451. package/gs/runtime/pprof/meta.json +6 -0
  452. package/gs/runtime/runtime.test.ts +19 -0
  453. package/gs/runtime/runtime.ts +98 -3
  454. package/gs/runtime/trace/index.test.ts +45 -0
  455. package/gs/runtime/trace/index.ts +97 -0
  456. package/gs/runtime/trace/meta.json +7 -0
  457. package/gs/slices/meta.json +2 -1
  458. package/gs/slices/slices.test.ts +180 -0
  459. package/gs/slices/slices.ts +502 -15
  460. package/gs/sort/meta.json +7 -0
  461. package/gs/sort/slice.gs.ts +85 -26
  462. package/gs/sort/slice.test.ts +40 -0
  463. package/gs/sort/sort.gs.ts +16 -13
  464. package/gs/strings/builder.test.ts +8 -0
  465. package/gs/strings/builder.ts +33 -20
  466. package/gs/strings/iter.test.ts +5 -7
  467. package/gs/strings/iter.ts +146 -71
  468. package/gs/strings/replace.test.ts +1 -4
  469. package/gs/strings/replace.ts +6 -6
  470. package/gs/strings/strings.test.ts +4 -0
  471. package/gs/strings/strings.ts +54 -6
  472. package/gs/sync/atomic/type.gs.ts +13 -14
  473. package/gs/sync/meta.json +3 -1
  474. package/gs/sync/sync.test.ts +69 -1
  475. package/gs/sync/sync.ts +72 -13
  476. package/gs/syscall/constants.ts +39 -24
  477. package/gs/syscall/errors.ts +165 -112
  478. package/gs/syscall/fs.ts +195 -0
  479. package/gs/syscall/js/index.ts +485 -0
  480. package/gs/syscall/js/meta.json +4 -0
  481. package/gs/syscall/net.test.ts +111 -0
  482. package/gs/syscall/types.ts +63 -2
  483. package/gs/testing/index.ts +1 -0
  484. package/gs/testing/meta.json +5 -0
  485. package/gs/testing/testing.test.ts +146 -0
  486. package/gs/testing/testing.ts +399 -0
  487. package/gs/time/meta.json +2 -2
  488. package/gs/time/time.test.ts +110 -0
  489. package/gs/time/time.ts +309 -57
  490. package/gs/unicode/unicode.test.ts +36 -0
  491. package/gs/unicode/unicode.ts +115 -9
  492. package/gs/unicode/utf8/utf8.test.ts +13 -0
  493. package/gs/unicode/utf8/utf8.ts +28 -16
  494. package/gs/unique/index.ts +98 -0
  495. package/package.json +3 -2
@@ -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
+ }
@@ -0,0 +1,342 @@
1
+ package tsworkspace
2
+
3
+ import (
4
+ "bytes"
5
+ "context"
6
+ "os"
7
+ "os/exec"
8
+ "path/filepath"
9
+ "runtime"
10
+ "slices"
11
+ "strings"
12
+ "time"
13
+
14
+ jsoniter "github.com/aperturerobotics/json-iterator-lite"
15
+ "github.com/pkg/errors"
16
+ )
17
+
18
+ // Phase names a TypeScript workspace execution phase.
19
+ type Phase string
20
+
21
+ const (
22
+ // PhaseWorkspace covers workspace file preparation and tool discovery.
23
+ PhaseWorkspace Phase = "workspace"
24
+ // PhaseTypeCheck covers TypeScript type checking.
25
+ PhaseTypeCheck Phase = "typecheck"
26
+ // PhaseRuntime covers TypeScript runtime execution.
27
+ PhaseRuntime Phase = "runtime"
28
+
29
+ // NodeAmbientTypesFile names the GoScript runtime ambient declarations.
30
+ NodeAmbientTypesFile = "goscript-node.d.ts"
31
+ )
32
+
33
+ // Owner owns TypeScript test workspace files, tool discovery, and execution.
34
+ type Owner struct {
35
+ workDir string
36
+ toolDir string
37
+ }
38
+
39
+ // NewOwner creates a TypeScript workspace owner.
40
+ func NewOwner(workDir, toolDir string) *Owner {
41
+ return &Owner{
42
+ workDir: workDir,
43
+ toolDir: toolDir,
44
+ }
45
+ }
46
+
47
+ // WorkDir returns the workspace directory.
48
+ func (o *Owner) WorkDir() string {
49
+ if o == nil {
50
+ return ""
51
+ }
52
+ return o.workDir
53
+ }
54
+
55
+ // EnsurePackageJSON writes the module package metadata used by Bun.
56
+ func (o *Owner) EnsurePackageJSON() Result {
57
+ return o.WriteFile(PhaseWorkspace, "package.json", "{\"type\":\"module\"}\n")
58
+ }
59
+
60
+ // EnsureNodeAmbientTypes writes host runtime declarations needed by emitted tests.
61
+ func (o *Owner) EnsureNodeAmbientTypes() Result {
62
+ if NodeTypesPresent(o.workDir, o.toolDir) {
63
+ return o.WriteFile(PhaseWorkspace, NodeAmbientTypesFile, "")
64
+ }
65
+ return o.WriteFile(PhaseWorkspace, NodeAmbientTypesFile, nodeAmbientTypes)
66
+ }
67
+
68
+ // WriteFile writes a workspace-relative file.
69
+ func (o *Owner) WriteFile(phase Phase, name string, data string) Result {
70
+ if o == nil || o.workDir == "" {
71
+ return Result{Phase: phase, Error: "TypeScript workspace directory is empty"}
72
+ }
73
+ if err := os.MkdirAll(o.workDir, 0o755); err != nil {
74
+ return Result{Phase: phase, Error: errors.Wrap(err, "create TypeScript workspace").Error()}
75
+ }
76
+ path, err := o.workspacePath(name)
77
+ if err != nil {
78
+ return Result{Phase: phase, Error: err.Error()}
79
+ }
80
+ if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil {
81
+ return Result{Phase: phase, Error: errors.Wrap(err, "create TypeScript workspace file parent").Error()}
82
+ }
83
+ if err := os.WriteFile(path, []byte(data), 0o644); err != nil {
84
+ return Result{Phase: phase, Error: errors.Wrap(err, "write TypeScript workspace file").Error()}
85
+ }
86
+ return Result{Phase: phase}
87
+ }
88
+
89
+ // WriteJSON writes an indented JSON workspace file.
90
+ func (o *Owner) WriteJSON(phase Phase, name string, value any) Result {
91
+ data, err := renderJSON(value)
92
+ if err != nil {
93
+ return Result{Phase: phase, Error: err.Error()}
94
+ }
95
+ return o.WriteFile(phase, name, data)
96
+ }
97
+
98
+ // RunTool finds and executes a TypeScript workspace tool.
99
+ func (o *Owner) RunTool(ctx context.Context, phase Phase, dir string, name string, args ...string) Result {
100
+ tool, err := o.FindTool(name)
101
+ if err != nil {
102
+ return Result{Phase: phase, Error: err.Error()}
103
+ }
104
+ if dir == "" {
105
+ dir = o.workDir
106
+ }
107
+ start := time.Now()
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
115
+ cmd.Dir = dir
116
+ var output bytes.Buffer
117
+ cmd.Stdout = &output
118
+ cmd.Stderr = &output
119
+ err = cmd.Run()
120
+ result := Result{
121
+ Phase: phase,
122
+ Command: append([]string{tool}, args...),
123
+ Output: output.String(),
124
+ Elapsed: time.Since(start),
125
+ }
126
+ if err != nil {
127
+ result.Error = err.Error()
128
+ }
129
+ return result
130
+ }
131
+
132
+ // FindTool locates a TypeScript workspace tool.
133
+ func (o *Owner) FindTool(name string) (string, error) {
134
+ if filepath.IsAbs(name) {
135
+ return name, nil
136
+ }
137
+ starts := []string{o.toolDir, o.workDir, sourceDirectory(), currentWorkingDirectory()}
138
+ for _, start := range starts {
139
+ if start == "" {
140
+ continue
141
+ }
142
+ for current := start; current != ""; current = filepath.Dir(current) {
143
+ candidate := filepath.Join(current, "node_modules", ".bin", name)
144
+ info, err := os.Stat(candidate)
145
+ if err == nil && !info.IsDir() {
146
+ return candidate, nil
147
+ }
148
+ if parent := filepath.Dir(current); parent == current {
149
+ break
150
+ }
151
+ }
152
+ }
153
+ if path, err := exec.LookPath(name); err == nil {
154
+ return path, nil
155
+ }
156
+ return "", errors.New(name + " not found in PATH or ancestor node_modules/.bin")
157
+ }
158
+
159
+ func (o *Owner) workspacePath(name string) (string, error) {
160
+ if filepath.IsAbs(name) {
161
+ return "", errors.Errorf("TypeScript workspace path must be relative: %s", name)
162
+ }
163
+ clean := filepath.Clean(name)
164
+ if clean == "." || clean == ".." || strings.HasPrefix(clean, ".."+string(filepath.Separator)) {
165
+ return "", errors.Errorf("TypeScript workspace path escapes workspace: %s", name)
166
+ }
167
+ return filepath.Join(o.workDir, clean), nil
168
+ }
169
+
170
+ // NodeTypeRoots returns existing @types roots visible from the provided dirs.
171
+ func NodeTypeRoots(dirs ...string) []string {
172
+ seen := make(map[string]bool)
173
+ var roots []string
174
+ for _, start := range append(dirs, currentWorkingDirectory()) {
175
+ if start == "" {
176
+ continue
177
+ }
178
+ for current := start; current != ""; current = filepath.Dir(current) {
179
+ candidate := filepath.Join(current, "node_modules", "@types")
180
+ info, err := os.Stat(candidate)
181
+ if err == nil && info.IsDir() && !seen[candidate] {
182
+ seen[candidate] = true
183
+ roots = append(roots, candidate)
184
+ break
185
+ }
186
+ if parent := filepath.Dir(current); parent == current {
187
+ break
188
+ }
189
+ }
190
+ }
191
+ slices.Sort(roots)
192
+ return roots
193
+ }
194
+
195
+ // NodeTypesPresent reports whether @types/node is visible from any provided directory.
196
+ func NodeTypesPresent(dirs ...string) bool {
197
+ seen := make(map[string]bool)
198
+ for _, start := range dirs {
199
+ if start == "" {
200
+ continue
201
+ }
202
+ for current := start; current != ""; current = filepath.Dir(current) {
203
+ if seen[current] {
204
+ if parent := filepath.Dir(current); parent == current {
205
+ break
206
+ }
207
+ continue
208
+ }
209
+ seen[current] = true
210
+ candidate := filepath.Join(current, "node_modules", "@types", "node")
211
+ info, err := os.Stat(candidate)
212
+ if err == nil && info.IsDir() {
213
+ return true
214
+ }
215
+ if parent := filepath.Dir(current); parent == current {
216
+ break
217
+ }
218
+ }
219
+ }
220
+ return false
221
+ }
222
+
223
+ func currentWorkingDirectory() string {
224
+ wd, err := os.Getwd()
225
+ if err != nil {
226
+ return ""
227
+ }
228
+ return wd
229
+ }
230
+
231
+ func sourceDirectory() string {
232
+ _, file, _, ok := runtime.Caller(0)
233
+ if !ok {
234
+ return ""
235
+ }
236
+ return filepath.Dir(file)
237
+ }
238
+
239
+ const nodeAmbientTypes = `declare const process: {
240
+ env?: Record<string, string | undefined>
241
+ chdir?: (directory: string) => void
242
+ cwd?: () => string
243
+ exit?: (code?: number) => never
244
+ }
245
+
246
+ declare var gc: (() => void) | undefined
247
+
248
+ declare namespace NodeJS {
249
+ type Timeout = ReturnType<typeof setTimeout>
250
+ }
251
+
252
+ declare module 'node:fs' {
253
+ export function mkdirSync(...args: unknown[]): unknown
254
+ }
255
+
256
+ declare module 'node:os' {
257
+ export function tmpdir(): string
258
+ }
259
+
260
+ declare module 'node:path' {
261
+ export function join(...parts: string[]): string
262
+ }
263
+ `
264
+
265
+ func renderJSON(value any) (string, error) {
266
+ stream := jsoniter.NewStream(nil, 512, 2)
267
+ if err := writeJSONValue(stream, value); err != nil {
268
+ return "", errors.Wrap(err, "marshal TypeScript workspace JSON")
269
+ }
270
+ stream.WriteRaw("\n")
271
+ if stream.Error != nil {
272
+ return "", errors.Wrap(stream.Error, "marshal TypeScript workspace JSON")
273
+ }
274
+ return string(stream.Buffer()), nil
275
+ }
276
+
277
+ func writeJSONValue(stream *jsoniter.Stream, value any) error {
278
+ switch typed := value.(type) {
279
+ case nil:
280
+ stream.WriteNil()
281
+ case bool:
282
+ stream.WriteBool(typed)
283
+ case string:
284
+ stream.WriteString(typed)
285
+ case []string:
286
+ stream.WriteArrayStart()
287
+ for idx, item := range typed {
288
+ if idx != 0 {
289
+ stream.WriteMore()
290
+ }
291
+ stream.WriteString(item)
292
+ }
293
+ stream.WriteArrayEnd()
294
+ case []any:
295
+ stream.WriteArrayStart()
296
+ for idx, item := range typed {
297
+ if idx != 0 {
298
+ stream.WriteMore()
299
+ }
300
+ if err := writeJSONValue(stream, item); err != nil {
301
+ return err
302
+ }
303
+ }
304
+ stream.WriteArrayEnd()
305
+ case map[string]string:
306
+ return writeJSONObject(stream, typed, func(value string) error {
307
+ stream.WriteString(value)
308
+ return nil
309
+ })
310
+ case map[string][]string:
311
+ return writeJSONObject(stream, typed, func(value []string) error {
312
+ return writeJSONValue(stream, value)
313
+ })
314
+ case map[string]any:
315
+ return writeJSONObject(stream, typed, func(value any) error {
316
+ return writeJSONValue(stream, value)
317
+ })
318
+ default:
319
+ return errors.Errorf("unsupported TypeScript workspace JSON value %T", value)
320
+ }
321
+ return nil
322
+ }
323
+
324
+ func writeJSONObject[T any](stream *jsoniter.Stream, fields map[string]T, writeValue func(T) error) error {
325
+ stream.WriteObjectStart()
326
+ keys := make([]string, 0, len(fields))
327
+ for key := range fields {
328
+ keys = append(keys, key)
329
+ }
330
+ slices.Sort(keys)
331
+ for idx, key := range keys {
332
+ if idx != 0 {
333
+ stream.WriteMore()
334
+ }
335
+ stream.WriteObjectField(key)
336
+ if err := writeValue(fields[key]); err != nil {
337
+ return err
338
+ }
339
+ }
340
+ stream.WriteObjectEnd()
341
+ return nil
342
+ }
@@ -0,0 +1,93 @@
1
+ package tsworkspace
2
+
3
+ import (
4
+ "context"
5
+ "os"
6
+ "path/filepath"
7
+ "strings"
8
+ "testing"
9
+ )
10
+
11
+ func TestOwnerWritesWorkspaceFiles(t *testing.T) {
12
+ dir := t.TempDir()
13
+ owner := NewOwner(dir, dir)
14
+
15
+ if result := owner.EnsurePackageJSON(); result.Failed() {
16
+ t.Fatalf("write package json: %s", result.Error)
17
+ }
18
+ if result := owner.WriteJSON(PhaseWorkspace, "tsconfig.json", map[string]any{
19
+ "compilerOptions": map[string]any{
20
+ "strict": true,
21
+ },
22
+ }); result.Failed() {
23
+ t.Fatalf("write tsconfig: %s", result.Error)
24
+ }
25
+
26
+ for _, name := range []string{"package.json", "tsconfig.json"} {
27
+ if _, err := os.Stat(filepath.Join(dir, name)); err != nil {
28
+ t.Fatalf("expected %s: %v", name, err)
29
+ }
30
+ }
31
+ }
32
+
33
+ func TestOwnerRejectsWorkspacePathEscapes(t *testing.T) {
34
+ dir := t.TempDir()
35
+ owner := NewOwner(dir, dir)
36
+
37
+ for _, name := range []string{"../escape.ts", filepath.Join("nested", "..", "..", "escape.ts"), filepath.Join(dir, "escape.ts")} {
38
+ if result := owner.WriteFile(PhaseWorkspace, name, "escape"); !result.Failed() {
39
+ t.Fatalf("expected %s to fail", name)
40
+ }
41
+ }
42
+ }
43
+
44
+ func TestOwnerRunsToolsWithCapturedOutput(t *testing.T) {
45
+ dir := t.TempDir()
46
+ owner := NewOwner(dir, dir)
47
+
48
+ result := owner.RunTool(context.Background(), PhaseRuntime, dir, "go", "env", "GOVERSION")
49
+ if result.Failed() {
50
+ t.Fatalf("run tool: %s\n%s", result.Error, result.Output)
51
+ }
52
+ if result.Output == "" {
53
+ t.Fatalf("expected captured output")
54
+ }
55
+ if len(result.Command) == 0 {
56
+ t.Fatalf("expected command capture")
57
+ }
58
+ }
59
+
60
+ func TestOwnerWritesNodeAmbientTypes(t *testing.T) {
61
+ dir := t.TempDir()
62
+ owner := NewOwner(dir, dir)
63
+
64
+ if result := owner.EnsureNodeAmbientTypes(); result.Failed() {
65
+ t.Fatalf("write node ambient types: %s", result.Error)
66
+ }
67
+ data, err := os.ReadFile(filepath.Join(dir, NodeAmbientTypesFile))
68
+ if err != nil {
69
+ t.Fatalf("read node ambient types: %v", err)
70
+ }
71
+ if !strings.Contains(string(data), "declare module 'node:fs'") {
72
+ t.Fatalf("node ambient types missing node:fs declaration: %s", data)
73
+ }
74
+ }
75
+
76
+ func TestOwnerSkipsNodeAmbientTypesWhenNodeTypesExist(t *testing.T) {
77
+ dir := t.TempDir()
78
+ if err := os.MkdirAll(filepath.Join(dir, "node_modules", "@types", "node"), 0o755); err != nil {
79
+ t.Fatal(err.Error())
80
+ }
81
+ owner := NewOwner(filepath.Join(dir, "work"), dir)
82
+
83
+ if result := owner.EnsureNodeAmbientTypes(); result.Failed() {
84
+ t.Fatalf("write node ambient types: %s", result.Error)
85
+ }
86
+ data, err := os.ReadFile(filepath.Join(dir, "work", NodeAmbientTypesFile))
87
+ if err != nil {
88
+ t.Fatalf("read node ambient types: %v", err)
89
+ }
90
+ if strings.TrimSpace(string(data)) != "" {
91
+ t.Fatalf("node ambient types should be empty when @types/node is already visible: %s", data)
92
+ }
93
+ }
@@ -0,0 +1,17 @@
1
+ package tsworkspace
2
+
3
+ import "time"
4
+
5
+ // Result describes one workspace file or process operation.
6
+ type Result struct {
7
+ Phase Phase
8
+ Command []string
9
+ Output string
10
+ Error string
11
+ Elapsed time.Duration
12
+ }
13
+
14
+ // Failed returns true when the operation failed.
15
+ func (r Result) Failed() bool {
16
+ return r.Error != ""
17
+ }
@@ -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
+ }