goscript 0.0.84 → 0.1.1

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 (428) hide show
  1. package/README.md +267 -243
  2. package/cmd/goscript/cmd-test.go +193 -0
  3. package/cmd/goscript/cmd-test_test.go +76 -0
  4. package/cmd/goscript/cmd_compile.go +70 -69
  5. package/cmd/goscript/cmd_compile_test.go +79 -0
  6. package/cmd/goscript/main.go +11 -5
  7. package/compiler/build-flags.go +38 -0
  8. package/compiler/compile-request.go +220 -0
  9. package/compiler/compiler.go +16 -1336
  10. package/compiler/compliance_test.go +188 -0
  11. package/compiler/config.go +6 -13
  12. package/compiler/diagnostic.go +70 -0
  13. package/compiler/gotest/owner.go +24 -0
  14. package/compiler/gotest/package-result.go +67 -0
  15. package/compiler/gotest/request.go +145 -0
  16. package/compiler/gotest/result.go +28 -0
  17. package/compiler/gotest/runner.go +588 -0
  18. package/compiler/gotest/runner_test.go +627 -0
  19. package/compiler/gotest/test.go +9 -0
  20. package/compiler/index.test.ts +28 -28
  21. package/compiler/index.ts +40 -72
  22. package/compiler/lowered-program.go +184 -0
  23. package/compiler/lowering.go +8072 -0
  24. package/compiler/override-facts.go +307 -0
  25. package/compiler/override-registry.go +283 -0
  26. package/compiler/override-registry_test.go +254 -0
  27. package/compiler/package-graph.go +254 -0
  28. package/compiler/package-graph_test.go +316 -0
  29. package/compiler/package-test-function.go +9 -0
  30. package/compiler/package-test-graph-package.go +40 -0
  31. package/compiler/package-test-graph-variant.go +105 -0
  32. package/compiler/package-test-graph.go +117 -0
  33. package/compiler/package-test-graph_test.go +144 -0
  34. package/compiler/result.go +13 -0
  35. package/compiler/runtime-contract.go +439 -0
  36. package/compiler/runtime-contract_test.go +104 -0
  37. package/compiler/semantic-model-types.go +113 -0
  38. package/compiler/semantic-model.go +1422 -0
  39. package/compiler/semantic-model_test.go +471 -0
  40. package/compiler/service.go +133 -0
  41. package/compiler/skeleton_test.go +1775 -0
  42. package/compiler/tsworkspace/owner.go +334 -0
  43. package/compiler/tsworkspace/owner_test.go +93 -0
  44. package/compiler/tsworkspace/result.go +17 -0
  45. package/compiler/typescript-emitter.go +1040 -0
  46. package/compiler/wasm/compile.go +2 -3
  47. package/compiler/wasm/compile_test.go +79 -0
  48. package/compiler/wasm_api.go +140 -124
  49. package/dist/compiler/index.d.ts +1 -3
  50. package/dist/compiler/index.js +31 -55
  51. package/dist/compiler/index.js.map +1 -1
  52. package/dist/gs/builtin/builtin.d.ts +33 -2
  53. package/dist/gs/builtin/builtin.js +217 -6
  54. package/dist/gs/builtin/builtin.js.map +1 -1
  55. package/dist/gs/builtin/channel.d.ts +11 -3
  56. package/dist/gs/builtin/channel.js +12 -0
  57. package/dist/gs/builtin/channel.js.map +1 -1
  58. package/dist/gs/builtin/hostio.d.ts +15 -1
  59. package/dist/gs/builtin/hostio.js +134 -49
  60. package/dist/gs/builtin/hostio.js.map +1 -1
  61. package/dist/gs/builtin/index.d.ts +1 -0
  62. package/dist/gs/builtin/index.js +1 -0
  63. package/dist/gs/builtin/index.js.map +1 -1
  64. package/dist/gs/builtin/slice.d.ts +23 -3
  65. package/dist/gs/builtin/slice.js +216 -44
  66. package/dist/gs/builtin/slice.js.map +1 -1
  67. package/dist/gs/builtin/type.d.ts +16 -2
  68. package/dist/gs/builtin/type.js +134 -21
  69. package/dist/gs/builtin/type.js.map +1 -1
  70. package/dist/gs/builtin/varRef.d.ts +5 -0
  71. package/dist/gs/builtin/varRef.js +23 -0
  72. package/dist/gs/builtin/varRef.js.map +1 -1
  73. package/dist/gs/bytes/buffer.gs.js +48 -44
  74. package/dist/gs/bytes/buffer.gs.js.map +1 -1
  75. package/dist/gs/bytes/bytes.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/context/context.d.ts +5 -4
  79. package/dist/gs/context/context.js +10 -10
  80. package/dist/gs/context/context.js.map +1 -1
  81. package/dist/gs/crypto/internal/fips140deps/byteorder/index.d.ts +1 -0
  82. package/dist/gs/crypto/internal/fips140deps/byteorder/index.js +2 -0
  83. package/dist/gs/crypto/internal/fips140deps/byteorder/index.js.map +1 -0
  84. package/dist/gs/crypto/internal/fips140deps/godebug/index.d.ts +1 -0
  85. package/dist/gs/crypto/internal/fips140deps/godebug/index.js +2 -0
  86. package/dist/gs/crypto/internal/fips140deps/godebug/index.js.map +1 -0
  87. package/dist/gs/crypto/rand/index.d.ts +5 -0
  88. package/dist/gs/crypto/rand/index.js +77 -0
  89. package/dist/gs/crypto/rand/index.js.map +1 -0
  90. package/dist/gs/embed/index.d.ts +7 -0
  91. package/dist/gs/embed/index.js +16 -0
  92. package/dist/gs/embed/index.js.map +1 -0
  93. package/dist/gs/encoding/json/index.d.ts +4 -0
  94. package/dist/gs/encoding/json/index.js +178 -0
  95. package/dist/gs/encoding/json/index.js.map +1 -0
  96. package/dist/gs/errors/errors.d.ts +4 -0
  97. package/dist/gs/errors/errors.js +81 -0
  98. package/dist/gs/errors/errors.js.map +1 -1
  99. package/dist/gs/fmt/fmt.d.ts +4 -4
  100. package/dist/gs/fmt/fmt.js +42 -11
  101. package/dist/gs/fmt/fmt.js.map +1 -1
  102. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.d.ts +36 -1
  103. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js +212 -2
  104. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js.map +1 -1
  105. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.d.ts +189 -0
  106. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js +825 -0
  107. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js.map +1 -0
  108. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.d.ts +163 -0
  109. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js +449 -0
  110. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js.map +1 -0
  111. package/dist/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/browser.js.map +1 -1
  112. package/dist/gs/github.com/klauspost/compress/internal/le/index.d.ts +9 -0
  113. package/dist/gs/github.com/klauspost/compress/internal/le/index.js +71 -0
  114. package/dist/gs/github.com/klauspost/compress/internal/le/index.js.map +1 -0
  115. package/dist/gs/github.com/pkg/errors/errors.js.map +1 -1
  116. package/dist/gs/github.com/pkg/errors/stack.js.map +1 -1
  117. package/dist/gs/go/internal/scannerhooks/index.d.ts +3 -0
  118. package/dist/gs/go/internal/scannerhooks/index.js +5 -0
  119. package/dist/gs/go/internal/scannerhooks/index.js.map +1 -0
  120. package/dist/gs/go/scanner/index.d.ts +42 -0
  121. package/dist/gs/go/scanner/index.js +155 -0
  122. package/dist/gs/go/scanner/index.js.map +1 -0
  123. package/dist/gs/go/token/index.d.ts +187 -0
  124. package/dist/gs/go/token/index.js +578 -0
  125. package/dist/gs/go/token/index.js.map +1 -0
  126. package/dist/gs/internal/abi/index.d.ts +4 -0
  127. package/dist/gs/internal/abi/index.js +10 -0
  128. package/dist/gs/internal/abi/index.js.map +1 -1
  129. package/dist/gs/internal/bytealg/index.d.ts +2 -0
  130. package/dist/gs/internal/bytealg/index.js +14 -0
  131. package/dist/gs/internal/bytealg/index.js.map +1 -1
  132. package/dist/gs/internal/byteorder/index.d.ts +8 -2
  133. package/dist/gs/internal/byteorder/index.js +56 -25
  134. package/dist/gs/internal/byteorder/index.js.map +1 -1
  135. package/dist/gs/internal/godebug/index.d.ts +12 -0
  136. package/dist/gs/internal/godebug/index.js +30 -0
  137. package/dist/gs/internal/godebug/index.js.map +1 -0
  138. package/dist/gs/io/fs/fs.js.map +1 -1
  139. package/dist/gs/io/fs/index.d.ts +1 -0
  140. package/dist/gs/io/fs/index.js +1 -0
  141. package/dist/gs/io/fs/index.js.map +1 -1
  142. package/dist/gs/io/fs/readdir.js.map +1 -1
  143. package/dist/gs/io/fs/readfile.js.map +1 -1
  144. package/dist/gs/io/fs/readlink.d.ts +8 -0
  145. package/dist/gs/io/fs/readlink.js +64 -0
  146. package/dist/gs/io/fs/readlink.js.map +1 -0
  147. package/dist/gs/io/fs/stat.js.map +1 -1
  148. package/dist/gs/io/fs/sub.js.map +1 -1
  149. package/dist/gs/io/fs/walk.d.ts +3 -3
  150. package/dist/gs/io/fs/walk.js +7 -7
  151. package/dist/gs/io/fs/walk.js.map +1 -1
  152. package/dist/gs/io/io.d.ts +40 -6
  153. package/dist/gs/io/io.js +151 -26
  154. package/dist/gs/io/io.js.map +1 -1
  155. package/dist/gs/maps/iter.d.ts +3 -3
  156. package/dist/gs/maps/iter.js +3 -3
  157. package/dist/gs/maps/iter.js.map +1 -1
  158. package/dist/gs/maps/maps.d.ts +2 -2
  159. package/dist/gs/maps/maps.js +1 -1
  160. package/dist/gs/maps/maps.js.map +1 -1
  161. package/dist/gs/math/bits/index.d.ts +13 -4
  162. package/dist/gs/math/bits/index.js +66 -34
  163. package/dist/gs/math/bits/index.js.map +1 -1
  164. package/dist/gs/math/const.gs.d.ts +5 -5
  165. package/dist/gs/math/const.gs.js +4 -4
  166. package/dist/gs/math/const.gs.js.map +1 -1
  167. package/dist/gs/mime/index.d.ts +1 -0
  168. package/dist/gs/mime/index.js +50 -0
  169. package/dist/gs/mime/index.js.map +1 -0
  170. package/dist/gs/net/http/httptest/index.d.ts +11 -0
  171. package/dist/gs/net/http/httptest/index.js +21 -0
  172. package/dist/gs/net/http/httptest/index.js.map +1 -0
  173. package/dist/gs/net/http/index.d.ts +27 -0
  174. package/dist/gs/net/http/index.js +61 -0
  175. package/dist/gs/net/http/index.js.map +1 -0
  176. package/dist/gs/os/dir_unix.gs.js +2 -2
  177. package/dist/gs/os/dir_unix.gs.js.map +1 -1
  178. package/dist/gs/os/error.gs.js +2 -4
  179. package/dist/gs/os/error.gs.js.map +1 -1
  180. package/dist/gs/os/exec.gs.js.map +1 -1
  181. package/dist/gs/os/exec_posix.gs.js.map +1 -1
  182. package/dist/gs/os/rawconn_js.gs.js.map +1 -1
  183. package/dist/gs/os/root_js.gs.js.map +1 -1
  184. package/dist/gs/os/tempfile.gs.js +66 -9
  185. package/dist/gs/os/tempfile.gs.js.map +1 -1
  186. package/dist/gs/os/types.gs.js.map +1 -1
  187. package/dist/gs/os/types_js.gs.js +9 -9
  188. package/dist/gs/os/types_js.gs.js.map +1 -1
  189. package/dist/gs/os/types_unix.gs.js.map +1 -1
  190. package/dist/gs/path/filepath/match.js +165 -3
  191. package/dist/gs/path/filepath/match.js.map +1 -1
  192. package/dist/gs/path/filepath/path.d.ts +3 -1
  193. package/dist/gs/path/filepath/path.js +133 -4
  194. package/dist/gs/path/filepath/path.js.map +1 -1
  195. package/dist/gs/path/match.js.map +1 -1
  196. package/dist/gs/path/path.d.ts +4 -1
  197. package/dist/gs/path/path.js +16 -4
  198. package/dist/gs/path/path.js.map +1 -1
  199. package/dist/gs/reflect/index.d.ts +3 -3
  200. package/dist/gs/reflect/index.js +2 -2
  201. package/dist/gs/reflect/index.js.map +1 -1
  202. package/dist/gs/reflect/map.js +3 -0
  203. package/dist/gs/reflect/map.js.map +1 -1
  204. package/dist/gs/reflect/type.d.ts +9 -5
  205. package/dist/gs/reflect/type.js +233 -21
  206. package/dist/gs/reflect/type.js.map +1 -1
  207. package/dist/gs/reflect/types.js.map +1 -1
  208. package/dist/gs/reflect/visiblefields.js.map +1 -1
  209. package/dist/gs/runtime/debug/index.d.ts +2 -0
  210. package/dist/gs/runtime/debug/index.js +8 -0
  211. package/dist/gs/runtime/debug/index.js.map +1 -0
  212. package/dist/gs/runtime/runtime.d.ts +35 -3
  213. package/dist/gs/runtime/runtime.js +72 -0
  214. package/dist/gs/runtime/runtime.js.map +1 -1
  215. package/dist/gs/slices/slices.d.ts +24 -5
  216. package/dist/gs/slices/slices.js +214 -5
  217. package/dist/gs/slices/slices.js.map +1 -1
  218. package/dist/gs/sort/slice.gs.d.ts +3 -3
  219. package/dist/gs/sort/slice.gs.js +6 -6
  220. package/dist/gs/sort/slice.gs.js.map +1 -1
  221. package/dist/gs/sort/sort.gs.d.ts +4 -4
  222. package/dist/gs/sort/sort.gs.js +11 -8
  223. package/dist/gs/sort/sort.gs.js.map +1 -1
  224. package/dist/gs/strconv/atoi.gs.js.map +1 -1
  225. package/dist/gs/strconv/quote.gs.js.map +1 -1
  226. package/dist/gs/strings/builder.d.ts +1 -1
  227. package/dist/gs/strings/builder.js +3 -2
  228. package/dist/gs/strings/builder.js.map +1 -1
  229. package/dist/gs/strings/reader.js.map +1 -1
  230. package/dist/gs/strings/replace.js.map +1 -1
  231. package/dist/gs/sync/atomic/type.gs.d.ts +9 -8
  232. package/dist/gs/sync/atomic/type.gs.js +0 -2
  233. package/dist/gs/sync/atomic/type.gs.js.map +1 -1
  234. package/dist/gs/sync/atomic/value.gs.js.map +1 -1
  235. package/dist/gs/sync/sync.d.ts +3 -0
  236. package/dist/gs/sync/sync.js +39 -0
  237. package/dist/gs/sync/sync.js.map +1 -1
  238. package/dist/gs/syscall/constants.d.ts +36 -24
  239. package/dist/gs/syscall/constants.js +12 -0
  240. package/dist/gs/syscall/constants.js.map +1 -1
  241. package/dist/gs/syscall/errors.d.ts +2 -0
  242. package/dist/gs/syscall/errors.js +8 -0
  243. package/dist/gs/syscall/errors.js.map +1 -1
  244. package/dist/gs/syscall/fs.d.ts +43 -0
  245. package/dist/gs/syscall/fs.js +102 -0
  246. package/dist/gs/syscall/fs.js.map +1 -1
  247. package/dist/gs/syscall/js/index.d.ts +90 -0
  248. package/dist/gs/syscall/js/index.js +375 -0
  249. package/dist/gs/syscall/js/index.js.map +1 -0
  250. package/dist/gs/syscall/types.d.ts +22 -0
  251. package/dist/gs/syscall/types.js +45 -1
  252. package/dist/gs/syscall/types.js.map +1 -1
  253. package/dist/gs/testing/index.d.ts +1 -0
  254. package/dist/gs/testing/index.js +2 -0
  255. package/dist/gs/testing/index.js.map +1 -0
  256. package/dist/gs/testing/testing.d.ts +77 -0
  257. package/dist/gs/testing/testing.js +301 -0
  258. package/dist/gs/testing/testing.js.map +1 -0
  259. package/dist/gs/time/time.d.ts +41 -4
  260. package/dist/gs/time/time.js +205 -36
  261. package/dist/gs/time/time.js.map +1 -1
  262. package/dist/gs/unicode/unicode.d.ts +23 -1
  263. package/dist/gs/unicode/unicode.js +79 -10
  264. package/dist/gs/unicode/unicode.js.map +1 -1
  265. package/dist/gs/unicode/utf8/utf8.d.ts +4 -4
  266. package/dist/gs/unicode/utf8/utf8.js +24 -11
  267. package/dist/gs/unicode/utf8/utf8.js.map +1 -1
  268. package/dist/gs/unique/index.d.ts +11 -0
  269. package/dist/gs/unique/index.js +71 -0
  270. package/dist/gs/unique/index.js.map +1 -0
  271. package/go.mod +2 -2
  272. package/go.sum +9 -0
  273. package/gs/builtin/builtin.ts +266 -8
  274. package/gs/builtin/channel.ts +22 -0
  275. package/gs/builtin/hostio.test.ts +177 -0
  276. package/gs/builtin/hostio.ts +171 -56
  277. package/gs/builtin/index.ts +1 -0
  278. package/gs/builtin/runtime-contract.test.ts +356 -0
  279. package/gs/builtin/slice.ts +259 -50
  280. package/gs/builtin/type.ts +188 -30
  281. package/gs/builtin/varRef.ts +38 -1
  282. package/gs/bytes/buffer.gs.ts +48 -44
  283. package/gs/bytes/meta.json +8 -3
  284. package/gs/bytes/reader.gs.ts +20 -19
  285. package/gs/context/context.test.ts +41 -0
  286. package/gs/context/context.ts +22 -26
  287. package/gs/crypto/internal/fips140deps/byteorder/index.ts +1 -0
  288. package/gs/crypto/internal/fips140deps/godebug/index.ts +1 -0
  289. package/gs/crypto/rand/index.test.ts +32 -0
  290. package/gs/crypto/rand/index.ts +90 -0
  291. package/gs/crypto/rand/meta.json +5 -0
  292. package/gs/embed/index.ts +20 -0
  293. package/gs/embed/meta.json +5 -0
  294. package/gs/encoding/json/index.test.ts +79 -0
  295. package/gs/encoding/json/index.ts +210 -0
  296. package/gs/errors/errors.test.ts +82 -0
  297. package/gs/errors/errors.ts +104 -0
  298. package/gs/fmt/fmt.ts +56 -16
  299. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.test.ts +95 -0
  300. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.ts +300 -2
  301. package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.test.ts +159 -0
  302. package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.ts +1005 -0
  303. package/gs/github.com/aperturerobotics/starpc/srpc/index.ts +719 -0
  304. package/gs/github.com/aperturerobotics/starpc/srpc/meta.json +40 -0
  305. package/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/meta.json +3 -1
  306. package/gs/github.com/klauspost/compress/internal/le/index.test.ts +36 -0
  307. package/gs/github.com/klauspost/compress/internal/le/index.ts +114 -0
  308. package/gs/go/internal/scannerhooks/index.test.ts +14 -0
  309. package/gs/go/internal/scannerhooks/index.ts +9 -0
  310. package/gs/go/scanner/index.test.ts +72 -0
  311. package/gs/go/scanner/index.ts +204 -0
  312. package/gs/go/token/index.test.ts +67 -0
  313. package/gs/go/token/index.ts +686 -0
  314. package/gs/internal/abi/index.test.ts +18 -0
  315. package/gs/internal/abi/index.ts +14 -0
  316. package/gs/internal/bytealg/index.test.ts +18 -0
  317. package/gs/internal/bytealg/index.ts +16 -0
  318. package/gs/internal/byteorder/index.test.ts +39 -0
  319. package/gs/internal/byteorder/index.ts +100 -27
  320. package/gs/internal/godebug/index.test.ts +16 -0
  321. package/gs/internal/godebug/index.ts +35 -0
  322. package/gs/io/fs/index.ts +1 -0
  323. package/gs/io/fs/meta.json +5 -0
  324. package/gs/io/fs/readlink.test.ts +43 -0
  325. package/gs/io/fs/readlink.ts +77 -0
  326. package/gs/io/fs/walk.test.ts +61 -0
  327. package/gs/io/fs/walk.ts +9 -9
  328. package/gs/io/io.ts +174 -31
  329. package/gs/io/meta.json +10 -2
  330. package/gs/maps/iter.ts +12 -6
  331. package/gs/maps/maps.ts +8 -6
  332. package/gs/math/bits/index.ts +103 -47
  333. package/gs/math/const.gs.test.ts +11 -5
  334. package/gs/math/const.gs.ts +5 -6
  335. package/gs/mime/index.ts +54 -0
  336. package/gs/net/http/httptest/index.ts +25 -0
  337. package/gs/net/http/index.test.ts +20 -0
  338. package/gs/net/http/index.ts +81 -0
  339. package/gs/os/dir_unix.gs.ts +2 -3
  340. package/gs/os/file_unix_js.test.ts +50 -0
  341. package/gs/os/meta.json +1 -2
  342. package/gs/os/tempfile.gs.test.ts +85 -0
  343. package/gs/os/tempfile.gs.ts +71 -11
  344. package/gs/os/types_js.gs.ts +11 -11
  345. package/gs/path/filepath/match.test.ts +31 -12
  346. package/gs/path/filepath/match.ts +178 -3
  347. package/gs/path/filepath/path.test.ts +25 -0
  348. package/gs/path/filepath/path.ts +159 -5
  349. package/gs/path/path.ts +20 -5
  350. package/gs/reflect/index.ts +2 -1
  351. package/gs/reflect/map.test.ts +19 -0
  352. package/gs/reflect/map.ts +4 -0
  353. package/gs/reflect/type.ts +298 -29
  354. package/gs/reflect/typefor.test.ts +75 -0
  355. package/gs/runtime/debug/index.test.ts +24 -0
  356. package/gs/runtime/debug/index.ts +8 -0
  357. package/gs/runtime/runtime.test.ts +19 -0
  358. package/gs/runtime/runtime.ts +98 -3
  359. package/gs/slices/slices.test.ts +94 -0
  360. package/gs/slices/slices.ts +245 -5
  361. package/gs/sort/meta.json +7 -0
  362. package/gs/sort/slice.gs.ts +16 -7
  363. package/gs/sort/sort.gs.ts +16 -13
  364. package/gs/strings/builder.ts +4 -3
  365. package/gs/sync/atomic/type.gs.ts +13 -14
  366. package/gs/sync/meta.json +3 -1
  367. package/gs/sync/sync.test.ts +36 -0
  368. package/gs/sync/sync.ts +39 -0
  369. package/gs/syscall/constants.ts +39 -24
  370. package/gs/syscall/errors.ts +10 -0
  371. package/gs/syscall/fs.ts +195 -0
  372. package/gs/syscall/js/index.ts +458 -0
  373. package/gs/syscall/js/meta.json +4 -0
  374. package/gs/syscall/net.test.ts +85 -0
  375. package/gs/syscall/types.ts +56 -0
  376. package/gs/testing/index.ts +1 -0
  377. package/gs/testing/meta.json +5 -0
  378. package/gs/testing/testing.test.ts +90 -0
  379. package/gs/testing/testing.ts +382 -0
  380. package/gs/time/time.test.ts +106 -0
  381. package/gs/time/time.ts +278 -57
  382. package/gs/unicode/unicode.test.ts +25 -0
  383. package/gs/unicode/unicode.ts +119 -9
  384. package/gs/unicode/utf8/utf8.test.ts +13 -0
  385. package/gs/unicode/utf8/utf8.ts +28 -16
  386. package/gs/unique/index.ts +91 -0
  387. package/package.json +14 -13
  388. package/compiler/analysis.go +0 -3475
  389. package/compiler/analysis_test.go +0 -338
  390. package/compiler/assignment.go +0 -580
  391. package/compiler/builtin_test.go +0 -92
  392. package/compiler/code-writer.go +0 -115
  393. package/compiler/compiler_test.go +0 -149
  394. package/compiler/composite-lit.go +0 -779
  395. package/compiler/config_test.go +0 -62
  396. package/compiler/constraint.go +0 -86
  397. package/compiler/decl.go +0 -801
  398. package/compiler/expr-call-async.go +0 -188
  399. package/compiler/expr-call-builtins.go +0 -208
  400. package/compiler/expr-call-helpers.go +0 -382
  401. package/compiler/expr-call-make.go +0 -318
  402. package/compiler/expr-call-type-conversion.go +0 -520
  403. package/compiler/expr-call.go +0 -413
  404. package/compiler/expr-selector.go +0 -343
  405. package/compiler/expr-star.go +0 -82
  406. package/compiler/expr-type.go +0 -442
  407. package/compiler/expr-value.go +0 -89
  408. package/compiler/expr.go +0 -773
  409. package/compiler/field.go +0 -183
  410. package/compiler/gs_dependencies_test.go +0 -298
  411. package/compiler/lit.go +0 -322
  412. package/compiler/output.go +0 -72
  413. package/compiler/primitive.go +0 -149
  414. package/compiler/protobuf.go +0 -697
  415. package/compiler/sanitize.go +0 -100
  416. package/compiler/spec-struct.go +0 -995
  417. package/compiler/spec-value.go +0 -540
  418. package/compiler/spec.go +0 -725
  419. package/compiler/stmt-assign.go +0 -664
  420. package/compiler/stmt-for.go +0 -266
  421. package/compiler/stmt-range.go +0 -475
  422. package/compiler/stmt-select.go +0 -262
  423. package/compiler/stmt-type-switch.go +0 -147
  424. package/compiler/stmt.go +0 -1308
  425. package/compiler/type-assert.go +0 -386
  426. package/compiler/type-info.go +0 -156
  427. package/compiler/type-utils.go +0 -207
  428. package/compiler/type.go +0 -892
@@ -0,0 +1,316 @@
1
+ package compiler
2
+
3
+ import (
4
+ "context"
5
+ "os"
6
+ "path/filepath"
7
+ "slices"
8
+ "strings"
9
+ "testing"
10
+ )
11
+
12
+ func TestCompileRequestValidation(t *testing.T) {
13
+ moduleDir := writePackageGraphFixture(t, map[string]string{
14
+ "go.mod": "module example.test/request\n\ngo 1.25.3\n",
15
+ "main.go": "package main\nfunc main() {}\n",
16
+ })
17
+ owner := NewCompileRequestOwner()
18
+
19
+ tests := []struct {
20
+ name string
21
+ req *CompileRequest
22
+ code string
23
+ }{
24
+ {
25
+ name: "empty package",
26
+ req: &CompileRequest{
27
+ Patterns: []string{""},
28
+ Dir: moduleDir,
29
+ OutputPath: filepath.Join(t.TempDir(), "out"),
30
+ DependencyMode: DependencyModeRequested,
31
+ RuntimeEmissionMode: RuntimeEmissionModeEmit,
32
+ },
33
+ code: "goscript/request:empty-package",
34
+ },
35
+ {
36
+ name: "single file",
37
+ req: &CompileRequest{
38
+ Patterns: []string{"main.go"},
39
+ Dir: moduleDir,
40
+ OutputPath: filepath.Join(t.TempDir(), "out"),
41
+ DependencyMode: DependencyModeRequested,
42
+ RuntimeEmissionMode: RuntimeEmissionModeEmit,
43
+ },
44
+ code: "goscript/request:single-file-unsupported",
45
+ },
46
+ {
47
+ name: "no output",
48
+ req: &CompileRequest{
49
+ Patterns: []string{"."},
50
+ Dir: moduleDir,
51
+ DependencyMode: DependencyModeRequested,
52
+ RuntimeEmissionMode: RuntimeEmissionModeEmit,
53
+ },
54
+ code: "goscript/request:no-output",
55
+ },
56
+ {
57
+ name: "no module",
58
+ req: &CompileRequest{
59
+ Patterns: []string{"."},
60
+ Dir: t.TempDir(),
61
+ OutputPath: filepath.Join(t.TempDir(), "out"),
62
+ DependencyMode: DependencyModeRequested,
63
+ RuntimeEmissionMode: RuntimeEmissionModeEmit,
64
+ },
65
+ code: "goscript/request:no-module",
66
+ },
67
+ {
68
+ name: "empty build flag",
69
+ req: &CompileRequest{
70
+ Patterns: []string{"."},
71
+ Dir: moduleDir,
72
+ OutputPath: filepath.Join(t.TempDir(), "out"),
73
+ BuildFlags: []string{" "},
74
+ DependencyMode: DependencyModeRequested,
75
+ RuntimeEmissionMode: RuntimeEmissionModeEmit,
76
+ },
77
+ code: "goscript/request:empty-build-flag",
78
+ },
79
+ {
80
+ name: "dependency mode",
81
+ req: &CompileRequest{
82
+ Patterns: []string{"."},
83
+ Dir: moduleDir,
84
+ OutputPath: filepath.Join(t.TempDir(), "out"),
85
+ DependencyMode: DependencyMode("invalid"),
86
+ RuntimeEmissionMode: RuntimeEmissionModeEmit,
87
+ },
88
+ code: "goscript/request:dependency-mode",
89
+ },
90
+ {
91
+ name: "runtime emission mode",
92
+ req: &CompileRequest{
93
+ Patterns: []string{"."},
94
+ Dir: moduleDir,
95
+ OutputPath: filepath.Join(t.TempDir(), "out"),
96
+ DependencyMode: DependencyModeRequested,
97
+ RuntimeEmissionMode: RuntimeEmissionMode("invalid"),
98
+ },
99
+ code: "goscript/request:runtime-emission-mode",
100
+ },
101
+ }
102
+
103
+ for _, tt := range tests {
104
+ t.Run(tt.name, func(t *testing.T) {
105
+ diagnostics := owner.Validate(tt.req)
106
+ requireDiagnosticCode(t, diagnostics, tt.code)
107
+ })
108
+ }
109
+ }
110
+
111
+ func TestPackageGraphLoadsRequestedPackage(t *testing.T) {
112
+ moduleDir := writePackageGraphFixture(t, map[string]string{
113
+ "go.mod": "module example.test/graph\n\ngo 1.25.3\n",
114
+ "main.go": "package main\nfunc main() {}\n",
115
+ })
116
+ graph := loadPackageGraph(t, &CompileRequest{
117
+ Patterns: []string{"."},
118
+ Dir: moduleDir,
119
+ OutputPath: filepath.Join(t.TempDir(), "out"),
120
+ DependencyMode: DependencyModeRequested,
121
+ RuntimeEmissionMode: RuntimeEmissionModeEmit,
122
+ })
123
+
124
+ if len(graph.Nodes) != 1 {
125
+ t.Fatalf("expected one requested node, got %d", len(graph.Nodes))
126
+ }
127
+ node := graph.Nodes[0]
128
+ if node.PkgPath != "example.test/graph" || !node.Requested {
129
+ t.Fatalf("unexpected node: %#v", node)
130
+ }
131
+ if node.ModulePath != "example.test/graph" {
132
+ t.Fatalf("unexpected module path: %q", node.ModulePath)
133
+ }
134
+ }
135
+
136
+ func TestPackageGraphReportsLoadErrors(t *testing.T) {
137
+ moduleDir := writePackageGraphFixture(t, map[string]string{
138
+ "go.mod": "module example.test/loaderr\n\ngo 1.25.3\n",
139
+ "main.go": "package main\nimport \"missing.invalid/pkg\"\nfunc main() { _ = pkg.Value }\n",
140
+ })
141
+ _, diagnostics := NewPackageGraphOwner().Load(context.Background(), &CompileRequest{
142
+ Patterns: []string{"."},
143
+ Dir: moduleDir,
144
+ OutputPath: filepath.Join(t.TempDir(), "out"),
145
+ DependencyMode: DependencyModeRequested,
146
+ RuntimeEmissionMode: RuntimeEmissionModeEmit,
147
+ })
148
+ requireDiagnosticCode(t, diagnostics, "goscript/package-graph:load-error")
149
+ }
150
+
151
+ func TestPackageGraphHonorsBuildFlags(t *testing.T) {
152
+ moduleDir := writePackageGraphFixture(t, map[string]string{
153
+ "go.mod": "module example.test/tags\n\ngo 1.25.3\n",
154
+ "default.go": "package tags\nconst Selected = \"default\"\n",
155
+ "tagged.go": "//go:build customtag\n\npackage tags\nconst Tagged = true\n",
156
+ "excluded.go": "//go:build !customtag\n\npackage tags\nconst Excluded = true\n",
157
+ })
158
+ graph := loadPackageGraph(t, &CompileRequest{
159
+ Patterns: []string{"."},
160
+ Dir: moduleDir,
161
+ OutputPath: filepath.Join(t.TempDir(), "out"),
162
+ BuildFlags: []string{"-tags=customtag"},
163
+ DependencyMode: DependencyModeRequested,
164
+ RuntimeEmissionMode: RuntimeEmissionModeEmit,
165
+ })
166
+
167
+ var compiled []string
168
+ for _, file := range graph.Nodes[0].CompiledGoFiles {
169
+ compiled = append(compiled, filepath.Base(file))
170
+ }
171
+ if !slices.Contains(compiled, "tagged.go") {
172
+ t.Fatalf("expected tagged.go in compiled files: %v", compiled)
173
+ }
174
+ if slices.Contains(compiled, "excluded.go") {
175
+ t.Fatalf("did not expect excluded.go in compiled files: %v", compiled)
176
+ }
177
+ }
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
+
210
+ func TestPackageGraphLoadsLocalReplacement(t *testing.T) {
211
+ moduleDir := writePackageGraphFixture(t, map[string]string{
212
+ "go.mod": strings.Join([]string{
213
+ "module example.test/app",
214
+ "",
215
+ "go 1.25.3",
216
+ "",
217
+ "require example.test/lib v0.0.0",
218
+ "replace example.test/lib => ./lib",
219
+ "",
220
+ }, "\n"),
221
+ "main.go": "package main\nimport \"example.test/lib\"\nfunc main() { lib.Value() }\n",
222
+ "lib/go.mod": "module example.test/lib\n\ngo 1.25.3\n",
223
+ "lib/value.go": "package lib\nfunc Value() int { return 1 }\n",
224
+ "lib/unused.go": "package lib\n",
225
+ })
226
+ graph := loadPackageGraph(t, &CompileRequest{
227
+ Patterns: []string{"."},
228
+ Dir: moduleDir,
229
+ OutputPath: filepath.Join(t.TempDir(), "out"),
230
+ DependencyMode: DependencyModeAll,
231
+ RuntimeEmissionMode: RuntimeEmissionModeEmit,
232
+ })
233
+
234
+ if graph.NodesByPackagePath["example.test/lib"] == nil {
235
+ t.Fatalf("expected local replacement dependency in graph")
236
+ }
237
+ }
238
+
239
+ func TestPackageGraphDetectsOverrideCandidates(t *testing.T) {
240
+ moduleDir := writePackageGraphFixture(t, map[string]string{
241
+ "go.mod": "module example.test/override\n\ngo 1.25.3\n",
242
+ "main.go": "package main\nimport \"fmt\"\nfunc main() { fmt.Println(\"ok\") }\n",
243
+ })
244
+ graph := loadPackageGraph(t, &CompileRequest{
245
+ Patterns: []string{"."},
246
+ Dir: moduleDir,
247
+ OutputPath: filepath.Join(t.TempDir(), "out"),
248
+ DependencyMode: DependencyModeAll,
249
+ RuntimeEmissionMode: RuntimeEmissionModeEmit,
250
+ })
251
+
252
+ node := graph.NodesByPackagePath["fmt"]
253
+ if node == nil {
254
+ t.Fatalf("expected fmt node in graph")
255
+ }
256
+ if !node.OverrideCandidate {
257
+ t.Fatalf("expected fmt to be detected as an override candidate")
258
+ }
259
+ }
260
+
261
+ func TestPackageGraphOverrideCandidatesRequirePackageIndex(t *testing.T) {
262
+ parent := "github.com/aperturerobotics/wasivm/wazero/kernel"
263
+ child := parent + "/runtime"
264
+ facts, diagnostics := NewOverrideRegistryOwner().Facts(context.Background())
265
+ if diagnosticsHaveErrors(diagnostics) {
266
+ t.Fatalf("override facts failed: %#v", diagnostics)
267
+ }
268
+
269
+ if facts.HasPackage(parent) {
270
+ t.Fatalf("parent directory without an override index was detected as an override candidate")
271
+ }
272
+ if !facts.HasPackage(child) {
273
+ t.Fatalf("nested package with an override index was not detected as an override candidate")
274
+ }
275
+ }
276
+
277
+ func loadPackageGraph(t *testing.T, req *CompileRequest) *PackageGraph {
278
+ t.Helper()
279
+
280
+ diagnostics := NewCompileRequestOwner().Validate(req)
281
+ if diagnosticsHaveErrors(diagnostics) {
282
+ t.Fatalf("request validation failed: %#v", diagnostics)
283
+ }
284
+ graph, diagnostics := NewPackageGraphOwner().Load(context.Background(), req)
285
+ if diagnosticsHaveErrors(diagnostics) {
286
+ t.Fatalf("package graph load failed: %#v", diagnostics)
287
+ }
288
+ return graph
289
+ }
290
+
291
+ func writePackageGraphFixture(t *testing.T, files map[string]string) string {
292
+ t.Helper()
293
+
294
+ dir := t.TempDir()
295
+ for name, contents := range files {
296
+ path := filepath.Join(dir, name)
297
+ if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil {
298
+ t.Fatal(err.Error())
299
+ }
300
+ if err := os.WriteFile(path, []byte(contents), 0o644); err != nil {
301
+ t.Fatal(err.Error())
302
+ }
303
+ }
304
+ return dir
305
+ }
306
+
307
+ func requireDiagnosticCode(t *testing.T, diagnostics []Diagnostic, code string) {
308
+ t.Helper()
309
+
310
+ for _, diagnostic := range diagnostics {
311
+ if diagnostic.Code == code {
312
+ return
313
+ }
314
+ }
315
+ t.Fatalf("missing diagnostic %q in %#v", code, diagnostics)
316
+ }
@@ -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
+ }
@@ -0,0 +1,105 @@
1
+ package compiler
2
+
3
+ import (
4
+ "go/ast"
5
+ "go/types"
6
+ "slices"
7
+ "strings"
8
+ "unicode"
9
+
10
+ "golang.org/x/tools/go/packages"
11
+ )
12
+
13
+ // PackageTestGraphVariant describes one Go test package variant.
14
+ type PackageTestGraphVariant struct {
15
+ // ID is the go/packages package identity.
16
+ ID string
17
+ // PkgPath is the stable Go package path for this variant.
18
+ PkgPath string
19
+ // Name is the Go package name for this variant.
20
+ Name string
21
+ // ForTest is the package path this variant tests.
22
+ ForTest string
23
+ // GoFiles are the package source files.
24
+ GoFiles []string
25
+ // CompiledGoFiles are files selected by build constraints.
26
+ CompiledGoFiles []string
27
+ // Imports are packages imported directly by this test variant.
28
+ Imports []string
29
+ // Diagnostics are load diagnostics attached to this variant.
30
+ Diagnostics []Diagnostic
31
+ // Tests are ordinary TestXxx functions discovered in this variant.
32
+ Tests []PackageTestFunction
33
+ }
34
+
35
+ func newPackageTestGraphVariant(pkg *packages.Package, diagnostics []Diagnostic) *PackageTestGraphVariant {
36
+ imports := make([]string, 0, len(pkg.Imports))
37
+ for importPath := range pkg.Imports {
38
+ imports = append(imports, importPath)
39
+ }
40
+ slices.Sort(imports)
41
+ return &PackageTestGraphVariant{
42
+ ID: pkg.ID,
43
+ PkgPath: packagePath(pkg),
44
+ Name: pkg.Name,
45
+ ForTest: pkg.ForTest,
46
+ GoFiles: append([]string(nil), pkg.GoFiles...),
47
+ CompiledGoFiles: append([]string(nil), pkg.CompiledGoFiles...),
48
+ Imports: imports,
49
+ Diagnostics: append([]Diagnostic(nil), diagnostics...),
50
+ Tests: discoverPackageTestFunctions(pkg),
51
+ }
52
+ }
53
+
54
+ func discoverPackageTestFunctions(pkg *packages.Package) []PackageTestFunction {
55
+ if pkg == nil {
56
+ return nil
57
+ }
58
+ var tests []PackageTestFunction
59
+ for _, file := range pkg.Syntax {
60
+ for _, decl := range file.Decls {
61
+ fn, ok := decl.(*ast.FuncDecl)
62
+ if !ok || fn.Recv != nil || !isTestName(fn.Name.Name) {
63
+ continue
64
+ }
65
+ obj, _ := pkg.TypesInfo.Defs[fn.Name].(*types.Func)
66
+ if !isOrdinaryTestFunc(obj) {
67
+ continue
68
+ }
69
+ tests = append(tests, PackageTestFunction{
70
+ Name: fn.Name.Name,
71
+ PackagePath: packagePath(pkg),
72
+ })
73
+ }
74
+ }
75
+ return tests
76
+ }
77
+
78
+ func isOrdinaryTestFunc(fn *types.Func) bool {
79
+ if fn == nil {
80
+ return false
81
+ }
82
+ sig, _ := fn.Type().(*types.Signature)
83
+ if sig == nil || sig.Params().Len() != 1 || sig.Results().Len() != 0 {
84
+ return false
85
+ }
86
+ ptr, _ := sig.Params().At(0).Type().(*types.Pointer)
87
+ if ptr == nil {
88
+ return false
89
+ }
90
+ named, _ := ptr.Elem().(*types.Named)
91
+ if named == nil || named.Obj() == nil || named.Obj().Pkg() == nil {
92
+ return false
93
+ }
94
+ return named.Obj().Name() == "T" && named.Obj().Pkg().Path() == "testing"
95
+ }
96
+
97
+ func isTestName(name string) bool {
98
+ if !strings.HasPrefix(name, "Test") || name == "Test" {
99
+ return false
100
+ }
101
+ for _, r := range strings.TrimPrefix(name, "Test") {
102
+ return !unicode.IsLower(r)
103
+ }
104
+ return false
105
+ }
@@ -0,0 +1,117 @@
1
+ package compiler
2
+
3
+ import (
4
+ "context"
5
+ "os"
6
+ "slices"
7
+ "strings"
8
+
9
+ "golang.org/x/tools/go/packages"
10
+ )
11
+
12
+ // PackageTestGraph is the package-scoped graph used by GoScript test runners.
13
+ type PackageTestGraph struct {
14
+ // RequestedPatterns are the package patterns from the compile request.
15
+ RequestedPatterns []string
16
+ // Packages are deterministic package-test facts keyed by package under test.
17
+ Packages []*PackageTestGraphPackage
18
+
19
+ packagesByPath map[string]*PackageTestGraphPackage
20
+ }
21
+
22
+ // PackageByPath returns the package facts for a package under test.
23
+ func (g *PackageTestGraph) PackageByPath(path string) *PackageTestGraphPackage {
24
+ if g == nil {
25
+ return nil
26
+ }
27
+ return g.packagesByPath[path]
28
+ }
29
+
30
+ // LoadTestGraph builds package-scoped test graph facts for a validated request.
31
+ func (o *PackageGraphOwner) LoadTestGraph(ctx context.Context, req *CompileRequest) (*PackageTestGraph, []Diagnostic) {
32
+ if err := ctx.Err(); err != nil {
33
+ return nil, []Diagnostic{{
34
+ Severity: DiagnosticSeverityError,
35
+ Code: "goscript/context:canceled",
36
+ Message: err.Error(),
37
+ }}
38
+ }
39
+
40
+ cfg := &packages.Config{
41
+ Context: ctx,
42
+ Dir: req.Dir,
43
+ Env: append(os.Environ(), "GOOS=js", "GOARCH=wasm"),
44
+ BuildFlags: goScriptBuildFlags(req.BuildFlags),
45
+ Tests: true,
46
+ Mode: packages.NeedName |
47
+ packages.NeedFiles |
48
+ packages.NeedCompiledGoFiles |
49
+ packages.NeedImports |
50
+ packages.NeedDeps |
51
+ packages.NeedExportFile |
52
+ packages.NeedTypes |
53
+ packages.NeedSyntax |
54
+ packages.NeedTypesInfo |
55
+ packages.NeedTypesSizes |
56
+ packages.NeedForTest |
57
+ packages.NeedModule,
58
+ }
59
+ pkgs, err := packages.Load(cfg, req.Patterns...)
60
+ if err != nil {
61
+ return nil, []Diagnostic{{
62
+ Severity: DiagnosticSeverityError,
63
+ Code: "goscript/package-graph:load",
64
+ Message: "failed to load Go test packages",
65
+ Detail: err.Error(),
66
+ }}
67
+ }
68
+
69
+ graph := &PackageTestGraph{
70
+ RequestedPatterns: append([]string(nil), req.Patterns...),
71
+ packagesByPath: make(map[string]*PackageTestGraphPackage),
72
+ }
73
+ var diagnostics []Diagnostic
74
+ for _, pkg := range pkgs {
75
+ if pkg == nil || isTestMainPackage(pkg) {
76
+ continue
77
+ }
78
+ pkgDiagnostics := packageDiagnostics(pkg)
79
+ diagnostics = append(diagnostics, pkgDiagnostics...)
80
+ if pkg.ForTest == "" {
81
+ facts := graph.packageFacts(packagePath(pkg))
82
+ facts.setPackage(pkg)
83
+ facts.appendDiagnostics(pkgDiagnostics)
84
+ continue
85
+ }
86
+ facts := graph.packageFacts(pkg.ForTest)
87
+ variant := newPackageTestGraphVariant(pkg, pkgDiagnostics)
88
+ if strings.HasSuffix(pkg.Name, "_test") {
89
+ facts.ExternalPackageTests = variant
90
+ } else {
91
+ facts.SamePackageTests = variant
92
+ }
93
+ facts.appendDiagnostics(pkgDiagnostics)
94
+ }
95
+ if len(graph.Packages) == 0 {
96
+ diagnostics = append(diagnostics, Diagnostic{
97
+ Severity: DiagnosticSeverityError,
98
+ Code: "goscript/package-graph:no-test-packages",
99
+ Message: "package patterns did not match any test packages",
100
+ })
101
+ }
102
+ slices.SortFunc(graph.Packages, func(a, b *PackageTestGraphPackage) int {
103
+ return strings.Compare(a.PackagePath, b.PackagePath)
104
+ })
105
+ return graph, diagnostics
106
+ }
107
+
108
+ func (g *PackageTestGraph) packageFacts(path string) *PackageTestGraphPackage {
109
+ facts := g.packagesByPath[path]
110
+ if facts != nil {
111
+ return facts
112
+ }
113
+ facts = &PackageTestGraphPackage{PackagePath: path}
114
+ g.packagesByPath[path] = facts
115
+ g.Packages = append(g.Packages, facts)
116
+ return facts
117
+ }