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
@@ -35,6 +35,53 @@ func TestOverrideRegistryPlansRuntimeAndOverrideDependencies(t *testing.T) {
35
35
  }
36
36
  }
37
37
 
38
+ func TestOverrideRegistryFactsAreImmutable(t *testing.T) {
39
+ owner := NewOverrideRegistryOwner()
40
+ facts, diagnostics := owner.Facts(context.Background())
41
+ if diagnosticsHaveErrors(diagnostics) {
42
+ t.Fatalf("override facts failed: %#v", diagnostics)
43
+ }
44
+
45
+ metadata := facts.Metadata("sync")
46
+ if !metadata.AsyncMethods["Map.Load"] {
47
+ t.Fatalf("expected sync Map.Load async metadata")
48
+ }
49
+ metadata.AsyncMethods["Map.Load"] = false
50
+ metadata.Dependencies = append(metadata.Dependencies, "mutated")
51
+
52
+ metadata = facts.Metadata("sync")
53
+ if !metadata.AsyncMethods["Map.Load"] {
54
+ t.Fatalf("override metadata mutation leaked back into facts")
55
+ }
56
+ if slices.Contains(metadata.Dependencies, "mutated") {
57
+ t.Fatalf("override dependency mutation leaked back into facts: %v", metadata.Dependencies)
58
+ }
59
+
60
+ pkg, dependencies, ok := facts.copyPackage("fmt")
61
+ if !ok {
62
+ t.Fatalf("missing fmt copy package facts")
63
+ }
64
+ if !slices.Contains(dependencies, "errors") {
65
+ t.Fatalf("expected fmt dependency on errors, got %v", dependencies)
66
+ }
67
+ dependencies = append(dependencies, "mutated")
68
+ if len(pkg.files) == 0 {
69
+ t.Fatalf("expected fmt copy files")
70
+ }
71
+ pkg.files[0].data[0] = '!'
72
+
73
+ pkg, dependencies, ok = facts.copyPackage("fmt")
74
+ if !ok {
75
+ t.Fatalf("missing fmt copy package facts after mutation")
76
+ }
77
+ if slices.Contains(dependencies, "mutated") {
78
+ t.Fatalf("copy dependency mutation leaked back into facts: %v", dependencies)
79
+ }
80
+ if len(pkg.files) == 0 || pkg.files[0].data[0] == '!' {
81
+ t.Fatalf("copy file mutation leaked back into facts")
82
+ }
83
+ }
84
+
38
85
  func TestOverrideRegistryCopiesRuntimeAndOverrides(t *testing.T) {
39
86
  owner := NewOverrideRegistryOwner()
40
87
  req := &CompileRequest{
@@ -71,6 +118,47 @@ func TestOverrideRegistryCopiesRuntimeAndOverrides(t *testing.T) {
71
118
  }
72
119
  }
73
120
 
121
+ func TestOverrideRegistryCopiesExternalOverride(t *testing.T) {
122
+ overrideDir := filepath.Join(t.TempDir(), "gs")
123
+ writeFixtureFile(t, overrideDir, "example.test/lib/index.ts", strings.Join([]string{
124
+ "import * as helper from '@goscript/example.test/helper/index.js'",
125
+ "export function Run(): void { helper.Run() }",
126
+ "",
127
+ }, "\n"))
128
+ writeFixtureFile(t, overrideDir, "example.test/lib/meta.json", `{"dependencies":["example.test/helper"]}`)
129
+ writeFixtureFile(t, overrideDir, "example.test/helper/index.ts", "export function Run(): void {}\n")
130
+
131
+ owner := NewOverrideRegistryOwner(overrideDir)
132
+ req := &CompileRequest{
133
+ OutputPath: filepath.Join(t.TempDir(), "out"),
134
+ RuntimeEmissionMode: RuntimeEmissionModeEmit,
135
+ }
136
+ plan, diagnostics := owner.CopyPlan(context.Background(), req, &PackageGraph{Nodes: []*PackageGraphNode{{
137
+ PkgPath: "example.test/lib",
138
+ OverrideCandidate: true,
139
+ }}})
140
+ if diagnosticsHaveErrors(diagnostics) {
141
+ t.Fatalf("copy plan failed: %#v", diagnostics)
142
+ }
143
+ copied, diagnostics := owner.CopyPackages(context.Background(), req, plan)
144
+ if diagnosticsHaveErrors(diagnostics) {
145
+ t.Fatalf("copy failed: %#v", diagnostics)
146
+ }
147
+ for _, pkg := range []string{"builtin", "example.test/helper", "example.test/lib"} {
148
+ if !slices.Contains(copied, pkg) {
149
+ t.Fatalf("missing copied package %s in %v", pkg, copied)
150
+ }
151
+ }
152
+ for _, path := range []string{
153
+ "@goscript/example.test/helper/index.ts",
154
+ "@goscript/example.test/lib/index.ts",
155
+ } {
156
+ if _, err := os.Stat(filepath.Join(req.OutputPath, filepath.FromSlash(path))); err != nil {
157
+ t.Fatalf("expected copied file %s: %v", path, err)
158
+ }
159
+ }
160
+ }
161
+
74
162
  func TestOverrideRegistryReportsMissingOverridePackage(t *testing.T) {
75
163
  _, diagnostics := NewOverrideRegistryOwner().CopyPlan(context.Background(), &CompileRequest{
76
164
  RuntimeEmissionMode: RuntimeEmissionModeEmit,
@@ -205,3 +293,97 @@ func TestCompilePackagesAwaitsOverrideAsyncMethods(t *testing.T) {
205
293
  t.Fatalf("override async method call was not awaited:\n%s", string(content))
206
294
  }
207
295
  }
296
+
297
+ func TestCompilePackagesPropagatesOverrideAsyncInterfaceMethods(t *testing.T) {
298
+ moduleDir := writePackageGraphFixture(t, map[string]string{
299
+ "go.mod": "module example.test/overrideasynciface\n\ngo 1.25.3\n",
300
+ "main.go": strings.Join([]string{
301
+ "package main",
302
+ "import \"net/http\"",
303
+ "type client struct { rt http.RoundTripper }",
304
+ "func (c *client) Do(req *http.Request) (*http.Response, error) {",
305
+ " return c.rt.RoundTrip(req)",
306
+ "}",
307
+ "func Use(c *client, req *http.Request) (*http.Response, error) {",
308
+ " return c.Do(req)",
309
+ "}",
310
+ "func main() {}",
311
+ "",
312
+ }, "\n"),
313
+ })
314
+ out := filepath.Join(t.TempDir(), "out")
315
+ comp, err := NewCompiler(&Config{
316
+ Dir: moduleDir,
317
+ OutputPath: out,
318
+ AllDependencies: true,
319
+ }, nil, nil)
320
+ if err != nil {
321
+ t.Fatal(err.Error())
322
+ }
323
+
324
+ if _, err := comp.CompilePackages(context.Background(), "."); err != nil {
325
+ t.Fatal(err.Error())
326
+ }
327
+ content, err := os.ReadFile(filepath.Join(out, "@goscript", "example.test", "overrideasynciface", "main.gs.ts"))
328
+ if err != nil {
329
+ t.Fatal(err.Error())
330
+ }
331
+ text := string(content)
332
+ for _, want := range []string{
333
+ "public async Do(req: http.Request | $.VarRef<http.Request> | null): globalThis.Promise<[http.Response | $.VarRef<http.Response> | null, $.GoError]>",
334
+ "return await $.pointerValue<Exclude<http.RoundTripper, null>>($.pointerValue<client>(c).rt).RoundTrip(req)",
335
+ "export async function Use(c: client | $.VarRef<client> | null, req: http.Request | $.VarRef<http.Request> | null): globalThis.Promise<[http.Response | $.VarRef<http.Response> | null, $.GoError]>",
336
+ "return await client.prototype.Do.call(c, req)",
337
+ } {
338
+ if !strings.Contains(text, want) {
339
+ t.Fatalf("missing %q in generated output:\n%s", want, text)
340
+ }
341
+ }
342
+ }
343
+
344
+ func TestCompilePackagesAwaitsOverrideAsyncFunctions(t *testing.T) {
345
+ moduleDir := writePackageGraphFixture(t, map[string]string{
346
+ "go.mod": "module example.test/overrideasyncfunc\n\ngo 1.25.3\n",
347
+ "main.go": strings.Join([]string{
348
+ "package main",
349
+ "import (",
350
+ " \"io/fs\"",
351
+ " \"path/filepath\"",
352
+ " \"sync\"",
353
+ ")",
354
+ "func main() {",
355
+ " var m sync.Map",
356
+ " _ = filepath.WalkDir(\".\", func(path string, d fs.DirEntry, err error) error {",
357
+ " if _, ok := m.Load(path); ok {",
358
+ " return nil",
359
+ " }",
360
+ " return nil",
361
+ " })",
362
+ "}",
363
+ "",
364
+ }, "\n"),
365
+ })
366
+ out := filepath.Join(t.TempDir(), "out")
367
+ comp, err := NewCompiler(&Config{
368
+ Dir: moduleDir,
369
+ OutputPath: out,
370
+ AllDependencies: true,
371
+ }, nil, nil)
372
+ if err != nil {
373
+ t.Fatal(err.Error())
374
+ }
375
+
376
+ if _, err := comp.CompilePackages(context.Background(), "."); err != nil {
377
+ t.Fatal(err.Error())
378
+ }
379
+ content, err := os.ReadFile(filepath.Join(out, "@goscript", "example.test", "overrideasyncfunc", "main.gs.ts"))
380
+ if err != nil {
381
+ t.Fatal(err.Error())
382
+ }
383
+ if !strings.Contains(string(content), "await filepath.WalkDir") {
384
+ t.Fatalf("override async function call was not awaited:\n%s", string(content))
385
+ }
386
+ if !strings.Contains(string(content), "$.functionValue(async") {
387
+ t.Fatalf("walk callback was not lowered as async:\n%s", string(content))
388
+ }
389
+ }
@@ -3,9 +3,9 @@ package compiler
3
3
  import (
4
4
  "context"
5
5
  "os"
6
- "sort"
6
+ "slices"
7
+ "strings"
7
8
 
8
- gs "github.com/aperturerobotics/goscript"
9
9
  "golang.org/x/tools/go/packages"
10
10
  )
11
11
 
@@ -35,6 +35,8 @@ type PackageGraphNode struct {
35
35
  ModulePath string
36
36
  // ModuleDir is the owning module directory when known.
37
37
  ModuleDir string
38
+ // ForTest is the package path under test for Go test variants.
39
+ ForTest string
38
40
  // GoFiles are the package source files.
39
41
  GoFiles []string
40
42
  // CompiledGoFiles are files selected by build constraints.
@@ -48,11 +50,17 @@ type PackageGraphNode struct {
48
50
  }
49
51
 
50
52
  // PackageGraphOwner owns Go package loading and graph identity.
51
- type PackageGraphOwner struct{}
53
+ type PackageGraphOwner struct {
54
+ overrideOwner *OverrideRegistryOwner
55
+ }
52
56
 
53
57
  // NewPackageGraphOwner creates the package graph owner.
54
- func NewPackageGraphOwner() *PackageGraphOwner {
55
- return &PackageGraphOwner{}
58
+ func NewPackageGraphOwner(overrideOwners ...*OverrideRegistryOwner) *PackageGraphOwner {
59
+ overrideOwner := NewOverrideRegistryOwner()
60
+ if len(overrideOwners) != 0 && overrideOwners[0] != nil {
61
+ overrideOwner = overrideOwners[0]
62
+ }
63
+ return &PackageGraphOwner{overrideOwner: overrideOwner}
56
64
  }
57
65
 
58
66
  // Load builds the package graph for a validated request.
@@ -69,8 +77,8 @@ func (o *PackageGraphOwner) Load(ctx context.Context, req *CompileRequest) (*Pac
69
77
  Context: ctx,
70
78
  Dir: req.Dir,
71
79
  Env: append(os.Environ(), "GOOS=js", "GOARCH=wasm"),
72
- BuildFlags: append([]string(nil), req.BuildFlags...),
73
- Tests: false,
80
+ BuildFlags: goScriptBuildFlags(req.BuildFlags),
81
+ Tests: req.Tests,
74
82
  Mode: packages.NeedName |
75
83
  packages.NeedFiles |
76
84
  packages.NeedCompiledGoFiles |
@@ -81,6 +89,7 @@ func (o *PackageGraphOwner) Load(ctx context.Context, req *CompileRequest) (*Pac
81
89
  packages.NeedSyntax |
82
90
  packages.NeedTypesInfo |
83
91
  packages.NeedTypesSizes |
92
+ packages.NeedForTest |
84
93
  packages.NeedModule,
85
94
  }
86
95
  pkgs, err := packages.Load(cfg, req.Patterns...)
@@ -99,6 +108,10 @@ func (o *PackageGraphOwner) Load(ctx context.Context, req *CompileRequest) (*Pac
99
108
  Message: "package patterns did not match any packages",
100
109
  }}
101
110
  }
111
+ overrideFacts, overrideDiagnostics := o.overrideOwner.Facts(ctx)
112
+ if diagnosticsHaveErrors(overrideDiagnostics) {
113
+ return nil, overrideDiagnostics
114
+ }
102
115
 
103
116
  graph := &PackageGraph{
104
117
  RequestedPatterns: append([]string(nil), req.Patterns...),
@@ -109,23 +122,29 @@ func (o *PackageGraphOwner) Load(ctx context.Context, req *CompileRequest) (*Pac
109
122
 
110
123
  requested := make(map[string]bool)
111
124
  for _, pkg := range pkgs {
125
+ if isTestMainPackage(pkg) {
126
+ continue
127
+ }
112
128
  path := packagePath(pkg)
113
129
  requested[path] = true
114
130
  graph.RequestedPackagePaths = append(graph.RequestedPackagePaths, path)
115
131
  }
116
- sort.Strings(graph.RequestedPackagePaths)
132
+ slices.Sort(graph.RequestedPackagePaths)
117
133
 
118
134
  var diagnostics []Diagnostic
119
135
  seen := make(map[string]bool)
120
136
  for _, pkg := range pkgs {
121
- o.collect(graph, pkg, req.DependencyMode, requested, seen)
137
+ if isTestMainPackage(pkg) {
138
+ continue
139
+ }
140
+ o.collect(graph, pkg, req.DependencyMode, requested, overrideFacts, seen)
122
141
  diagnostics = append(diagnostics, packageDiagnostics(pkg)...)
123
142
  }
124
- sort.Slice(graph.Nodes, func(i, j int) bool {
125
- if graph.Nodes[i].PkgPath == graph.Nodes[j].PkgPath {
126
- return graph.Nodes[i].ID < graph.Nodes[j].ID
143
+ slices.SortFunc(graph.Nodes, func(a, b *PackageGraphNode) int {
144
+ if a.PkgPath == b.PkgPath {
145
+ return strings.Compare(a.ID, b.ID)
127
146
  }
128
- return graph.Nodes[i].PkgPath < graph.Nodes[j].PkgPath
147
+ return strings.Compare(a.PkgPath, b.PkgPath)
129
148
  })
130
149
  if len(graph.Nodes) == 0 {
131
150
  diagnostics = append(diagnostics, Diagnostic{
@@ -142,15 +161,22 @@ func (o *PackageGraphOwner) collect(
142
161
  pkg *packages.Package,
143
162
  mode DependencyMode,
144
163
  requested map[string]bool,
164
+ overrideFacts *OverrideFacts,
145
165
  seen map[string]bool,
146
166
  ) {
147
167
  if pkg == nil || seen[pkg.ID] {
148
168
  return
149
169
  }
170
+ if pkg.ForTest != "" && !requested[pkg.ForTest] {
171
+ if prod := pkg.Imports[pkg.ForTest]; prod != nil {
172
+ o.collect(graph, prod, mode, requested, overrideFacts, seen)
173
+ }
174
+ return
175
+ }
150
176
  seen[pkg.ID] = true
151
177
 
152
178
  path := packagePath(pkg)
153
- node := newPackageGraphNode(pkg, requested[path])
179
+ node := newPackageGraphNode(pkg, requested[path], overrideFacts)
154
180
  graph.Nodes = append(graph.Nodes, node)
155
181
  graph.NodesByPackagePath[path] = node
156
182
  graph.packagesByPath[path] = pkg
@@ -162,18 +188,18 @@ func (o *PackageGraphOwner) collect(
162
188
  for importPath := range pkg.Imports {
163
189
  imports = append(imports, importPath)
164
190
  }
165
- sort.Strings(imports)
191
+ slices.Sort(imports)
166
192
  for _, importPath := range imports {
167
- o.collect(graph, pkg.Imports[importPath], mode, requested, seen)
193
+ o.collect(graph, pkg.Imports[importPath], mode, requested, overrideFacts, seen)
168
194
  }
169
195
  }
170
196
 
171
- func newPackageGraphNode(pkg *packages.Package, requested bool) *PackageGraphNode {
197
+ func newPackageGraphNode(pkg *packages.Package, requested bool, overrideFacts *OverrideFacts) *PackageGraphNode {
172
198
  imports := make([]string, 0, len(pkg.Imports))
173
199
  for importPath := range pkg.Imports {
174
200
  imports = append(imports, importPath)
175
201
  }
176
- sort.Strings(imports)
202
+ slices.Sort(imports)
177
203
 
178
204
  var modulePath string
179
205
  var moduleDir string
@@ -188,14 +214,19 @@ func newPackageGraphNode(pkg *packages.Package, requested bool) *PackageGraphNod
188
214
  Name: pkg.Name,
189
215
  ModulePath: modulePath,
190
216
  ModuleDir: moduleDir,
217
+ ForTest: pkg.ForTest,
191
218
  GoFiles: append([]string(nil), pkg.GoFiles...),
192
219
  CompiledGoFiles: append([]string(nil), pkg.CompiledGoFiles...),
193
220
  Imports: imports,
194
221
  Requested: requested,
195
- OverrideCandidate: hasOverrideCandidate(packagePath(pkg)),
222
+ OverrideCandidate: overrideFacts.HasPackage(packagePath(pkg)),
196
223
  }
197
224
  }
198
225
 
226
+ func isTestMainPackage(pkg *packages.Package) bool {
227
+ return pkg != nil && pkg.ForTest == "" && pkg.Name == "main" && strings.HasSuffix(packagePath(pkg), ".test")
228
+ }
229
+
199
230
  func packagePath(pkg *packages.Package) string {
200
231
  if pkg == nil {
201
232
  return ""
@@ -221,11 +252,3 @@ func packageDiagnostics(pkg *packages.Package) []Diagnostic {
221
252
  }
222
253
  return diagnostics
223
254
  }
224
-
225
- func hasOverrideCandidate(pkgPath string) bool {
226
- if pkgPath == "" {
227
- return false
228
- }
229
- _, err := gs.GsOverrides.ReadFile("gs/" + pkgPath + "/index.ts")
230
- return err == nil
231
- }
@@ -176,6 +176,37 @@ func TestPackageGraphHonorsBuildFlags(t *testing.T) {
176
176
  }
177
177
  }
178
178
 
179
+ func TestPackageGraphAddsGoScriptBuildTag(t *testing.T) {
180
+ moduleDir := writePackageGraphFixture(t, map[string]string{
181
+ "go.mod": "module example.test/goscripttag\n\ngo 1.25.3\n",
182
+ "default.go": "package goscripttag\nconst Selected = \"default\"\n",
183
+ "goscript.go": "//go:build goscript\n\npackage goscripttag\nconst GoScript = true\n",
184
+ "excluded.go": "//go:build !goscript\n\npackage goscripttag\nconst Excluded = true\n",
185
+ "customtag.go": "//go:build customtag\n\npackage goscripttag\nconst Custom = true\n",
186
+ })
187
+ graph := loadPackageGraph(t, &CompileRequest{
188
+ Patterns: []string{"."},
189
+ Dir: moduleDir,
190
+ OutputPath: filepath.Join(t.TempDir(), "out"),
191
+ BuildFlags: []string{"-tags=customtag"},
192
+ DependencyMode: DependencyModeRequested,
193
+ RuntimeEmissionMode: RuntimeEmissionModeEmit,
194
+ })
195
+
196
+ var compiled []string
197
+ for _, file := range graph.Nodes[0].CompiledGoFiles {
198
+ compiled = append(compiled, filepath.Base(file))
199
+ }
200
+ for _, expected := range []string{"default.go", "goscript.go", "customtag.go"} {
201
+ if !slices.Contains(compiled, expected) {
202
+ t.Fatalf("expected %s in compiled files: %v", expected, compiled)
203
+ }
204
+ }
205
+ if slices.Contains(compiled, "excluded.go") {
206
+ t.Fatalf("did not expect excluded.go in compiled files: %v", compiled)
207
+ }
208
+ }
209
+
179
210
  func TestPackageGraphLoadsLocalReplacement(t *testing.T) {
180
211
  moduleDir := writePackageGraphFixture(t, map[string]string{
181
212
  "go.mod": strings.Join([]string{
@@ -227,14 +258,67 @@ func TestPackageGraphDetectsOverrideCandidates(t *testing.T) {
227
258
  }
228
259
  }
229
260
 
261
+ func TestPackageGraphDetectsExternalOverrideCandidates(t *testing.T) {
262
+ moduleDir := writePackageGraphFixture(t, map[string]string{
263
+ "go.mod": strings.Join([]string{
264
+ "module example.test/externaloverride",
265
+ "",
266
+ "go 1.25.3",
267
+ "",
268
+ "require example.test/lib v0.0.0",
269
+ "replace example.test/lib => ./lib",
270
+ "",
271
+ }, "\n"),
272
+ "main.go": "package main\nimport \"example.test/lib\"\nfunc main() { lib.Run() }\n",
273
+ "lib/go.mod": strings.Join([]string{
274
+ "module example.test/lib",
275
+ "",
276
+ "go 1.25.3",
277
+ "",
278
+ "require example.test/heavy v0.0.0",
279
+ "replace example.test/heavy => ../heavy",
280
+ "",
281
+ }, "\n"),
282
+ "lib/lib.go": "package lib\nimport \"example.test/heavy\"\nfunc Run() { heavy.Run() }\n",
283
+ "heavy/go.mod": "module example.test/heavy\n\ngo 1.25.3\n",
284
+ "heavy/heavy.go": "package heavy\nfunc Run() {}\n",
285
+ })
286
+ overrideDir := filepath.Join(t.TempDir(), "gs")
287
+ writeFixtureFile(t, overrideDir, "example.test/lib/index.ts", "export function Run(): void {}\n")
288
+
289
+ overrideOwner := NewOverrideRegistryOwner(overrideDir)
290
+ req := &CompileRequest{
291
+ Patterns: []string{"."},
292
+ Dir: moduleDir,
293
+ OutputPath: filepath.Join(t.TempDir(), "out"),
294
+ DependencyMode: DependencyModeAll,
295
+ RuntimeEmissionMode: RuntimeEmissionModeEmit,
296
+ }
297
+ graph, diagnostics := NewPackageGraphOwner(overrideOwner).Load(context.Background(), req)
298
+ if diagnosticsHaveErrors(diagnostics) {
299
+ t.Fatalf("package graph failed: %#v", diagnostics)
300
+ }
301
+ lib := graph.NodesByPackagePath["example.test/lib"]
302
+ if lib == nil || !lib.OverrideCandidate {
303
+ t.Fatalf("expected external override candidate for lib")
304
+ }
305
+ if graph.NodesByPackagePath["example.test/heavy"] != nil {
306
+ t.Fatalf("external override dependency should not be collected")
307
+ }
308
+ }
309
+
230
310
  func TestPackageGraphOverrideCandidatesRequirePackageIndex(t *testing.T) {
231
311
  parent := "github.com/aperturerobotics/wasivm/wazero/kernel"
232
312
  child := parent + "/runtime"
313
+ facts, diagnostics := NewOverrideRegistryOwner().Facts(context.Background())
314
+ if diagnosticsHaveErrors(diagnostics) {
315
+ t.Fatalf("override facts failed: %#v", diagnostics)
316
+ }
233
317
 
234
- if hasOverrideCandidate(parent) {
318
+ if facts.HasPackage(parent) {
235
319
  t.Fatalf("parent directory without an override index was detected as an override candidate")
236
320
  }
237
- if !hasOverrideCandidate(child) {
321
+ if !facts.HasPackage(child) {
238
322
  t.Fatalf("nested package with an override index was not detected as an override candidate")
239
323
  }
240
324
  }
@@ -258,17 +342,23 @@ func writePackageGraphFixture(t *testing.T, files map[string]string) string {
258
342
 
259
343
  dir := t.TempDir()
260
344
  for name, contents := range files {
261
- path := filepath.Join(dir, name)
262
- if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil {
263
- t.Fatal(err.Error())
264
- }
265
- if err := os.WriteFile(path, []byte(contents), 0o644); err != nil {
266
- t.Fatal(err.Error())
267
- }
345
+ writeFixtureFile(t, dir, name, contents)
268
346
  }
269
347
  return dir
270
348
  }
271
349
 
350
+ func writeFixtureFile(t *testing.T, root, name, contents string) {
351
+ t.Helper()
352
+
353
+ path := filepath.Join(root, filepath.FromSlash(name))
354
+ if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil {
355
+ t.Fatal(err.Error())
356
+ }
357
+ if err := os.WriteFile(path, []byte(contents), 0o644); err != nil {
358
+ t.Fatal(err.Error())
359
+ }
360
+ }
361
+
272
362
  func requireDiagnosticCode(t *testing.T, diagnostics []Diagnostic, code string) {
273
363
  t.Helper()
274
364
 
@@ -0,0 +1,9 @@
1
+ package compiler
2
+
3
+ // PackageTestFunction describes one discovered ordinary Go test function.
4
+ type PackageTestFunction struct {
5
+ // Name is the Go TestXxx function name.
6
+ Name string
7
+ // PackagePath is the package variant that exports the function.
8
+ PackagePath string
9
+ }
@@ -0,0 +1,40 @@
1
+ package compiler
2
+
3
+ import "golang.org/x/tools/go/packages"
4
+
5
+ // PackageTestGraphPackage describes one requested package under test.
6
+ type PackageTestGraphPackage struct {
7
+ // PackagePath is the package under test.
8
+ PackagePath string
9
+ // PackageName is the base package name.
10
+ PackageName string
11
+ // PackageID is the go/packages package identity for the package under test.
12
+ PackageID string
13
+ // GoFiles are the package source files.
14
+ GoFiles []string
15
+ // CompiledGoFiles are files selected by build constraints.
16
+ CompiledGoFiles []string
17
+ // SamePackageTests is the same-package test variant when present.
18
+ SamePackageTests *PackageTestGraphVariant
19
+ // ExternalPackageTests is the external-package test variant when present.
20
+ ExternalPackageTests *PackageTestGraphVariant
21
+ // Diagnostics are package or variant load diagnostics attached to this package.
22
+ Diagnostics []Diagnostic
23
+ }
24
+
25
+ // HasTests returns true when the package has any loaded test variant.
26
+ func (p *PackageTestGraphPackage) HasTests() bool {
27
+ return p != nil && (p.SamePackageTests != nil || p.ExternalPackageTests != nil)
28
+ }
29
+
30
+ func (p *PackageTestGraphPackage) appendDiagnostics(diagnostics []Diagnostic) {
31
+ p.Diagnostics = append(p.Diagnostics, diagnostics...)
32
+ }
33
+
34
+ func (p *PackageTestGraphPackage) setPackage(pkg *packages.Package) {
35
+ p.PackagePath = packagePath(pkg)
36
+ p.PackageName = pkg.Name
37
+ p.PackageID = pkg.ID
38
+ p.GoFiles = append([]string(nil), pkg.GoFiles...)
39
+ p.CompiledGoFiles = append([]string(nil), pkg.CompiledGoFiles...)
40
+ }